diff --git a/lib/main.dart b/lib/main.dart index acdb013d..b1785d2e 100755 --- a/lib/main.dart +++ b/lib/main.dart @@ -55,11 +55,11 @@ FutureOr main() async { } }); - //ToDo: 增加对讲调试、正式可删除 - runApp(MultiProvider(providers: [ - ChangeNotifierProvider(create: (_) => DebugInfoModel()), - ], child: MyApp(isLogin: isLogin))); - // runApp(MyApp(isLogin: isLogin)); + // //ToDo: 增加对讲调试、正式可删除 + // runApp(MultiProvider(providers: [ + // ChangeNotifierProvider(create: (_) => DebugInfoModel()), + // ], child: MyApp(isLogin: isLogin))); + runApp(MyApp(isLogin: isLogin)); }, onException: (FlutterErrorDetails details) async { debugPrint("FlutterErrorDetails $details"); }); diff --git a/lib/talk/starChart/star_chart_manage.dart b/lib/talk/starChart/star_chart_manage.dart index a658cedd..1a3d2a85 100644 --- a/lib/talk/starChart/star_chart_manage.dart +++ b/lib/talk/starChart/star_chart_manage.dart @@ -225,19 +225,19 @@ class StartChartManage { /// 设置数据接收回调 _onReceiveData(_udpSocket!, Get.context!); - //ToDo: 增加对讲调试、正式可删除 - // 每秒重置数据速率 - Timer.periodic(Duration(seconds: 1), (Timer t) { - UdpTalkDataHandler().resetDataRates(); - // 更新调试信息 - Provider.of(Get.context!, listen: false) - .updateDebugInfo( - UdpTalkDataHandler().getLastRecvDataRate() ~/ 1024, // 转换为KB - UdpTalkDataHandler().getLastRecvPacketCount(), - UdpTalkDataHandler().getLastSendDataRate() ~/ 1024, // 转换为KB - UdpTalkDataHandler().getLastSendPacketCount(), - ); - }); + // //ToDo: 增加对讲调试、正式可删除 + // // 每秒重置数据速率 + // Timer.periodic(Duration(seconds: 1), (Timer t) { + // UdpTalkDataHandler().resetDataRates(); + // // 更新调试信息 + // Provider.of(Get.context!, listen: false) + // .updateDebugInfo( + // UdpTalkDataHandler().getLastRecvDataRate() ~/ 1024, // 转换为KB + // UdpTalkDataHandler().getLastRecvPacketCount(), + // UdpTalkDataHandler().getLastSendDataRate() ~/ 1024, // 转换为KB + // UdpTalkDataHandler().getLastSendPacketCount(), + // ); + // }); }).catchError((error) { _log(text: 'Failed to bind UDP socket: $error'); }); @@ -983,16 +983,16 @@ class StartChartManage { if (dg?.data != null) { final deserialize = ScpMessage.deserialize(dg!.data); - //ToDo: 增加对讲调试、正式可删除 - UdpTalkDataHandler().updateRecvDataRate(dg.data.length); + // //ToDo: 增加对讲调试、正式可删除 + // UdpTalkDataHandler().updateRecvDataRate(dg.data.length); - // 更新调试信息 - Provider.of(context, listen: false).updateDebugInfo( - UdpTalkDataHandler().getLastRecvDataRate() ~/ 1024, // 转换为KB - UdpTalkDataHandler().getLastRecvPacketCount(), - UdpTalkDataHandler().getLastSendDataRate() ~/ 1024, // 转换为KB - UdpTalkDataHandler().getLastSendPacketCount(), - ); + // // 更新调试信息 + // Provider.of(context, listen: false).updateDebugInfo( + // UdpTalkDataHandler().getLastRecvDataRate() ~/ 1024, // 转换为KB + // UdpTalkDataHandler().getLastRecvPacketCount(), + // UdpTalkDataHandler().getLastSendDataRate() ~/ 1024, // 转换为KB + // UdpTalkDataHandler().getLastSendPacketCount(), + // ); if (deserialize != null) { // 处理返回数据 diff --git a/lib/talk/starChart/views/talkView/talk_view_logic.dart b/lib/talk/starChart/views/talkView/talk_view_logic.dart index 77619e21..f947d584 100644 --- a/lib/talk/starChart/views/talkView/talk_view_logic.dart +++ b/lib/talk/starChart/views/talkView/talk_view_logic.dart @@ -1,46 +1,33 @@ import 'dart:async'; -import 'dart:ffi'; import 'dart:io'; -import 'dart:math'; -import 'dart:typed_data'; import 'dart:ui' as ui; +import 'dart:math'; // Import the math package to use sqrt import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; -import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_pcm_sound/flutter_pcm_sound.dart'; import 'package:flutter_screen_recording/flutter_screen_recording.dart'; import 'package:flutter_voice_processor/flutter_voice_processor.dart'; import 'package:gallery_saver/gallery_saver.dart'; import 'package:get/get.dart'; -import 'package:get_storage/get_storage.dart'; import 'package:image_gallery_saver/image_gallery_saver.dart'; import 'package:path_provider/path_provider.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:star_lock/app_settings/app_settings.dart'; -import 'package:star_lock/blue/blue_manage.dart'; -import 'package:star_lock/blue/io_protocol/io_openLock.dart'; -import 'package:star_lock/blue/io_tool/io_tool.dart'; import 'package:star_lock/login/login/entity/LoginEntity.dart'; import 'package:star_lock/main/lockDetail/lockDetail/lockDetail_logic.dart'; import 'package:star_lock/main/lockDetail/lockDetail/lockDetail_state.dart'; import 'package:star_lock/main/lockDetail/lockDetail/lockNetToken_entity.dart'; import 'package:star_lock/main/lockDetail/lockSet/lockSet/lockSetInfo_entity.dart'; -import 'package:star_lock/main/lockDetail/lockSet/lockSet/lockSet_logic.dart'; -import 'package:star_lock/main/lockDetail/lockSet/lockSet/lockSet_state.dart'; import 'package:star_lock/main/lockMian/entity/lockListInfo_entity.dart'; -import 'package:star_lock/main/lockMian/lockList/lockList_logic.dart'; import 'package:star_lock/network/api_repository.dart'; import 'package:star_lock/talk/call/g711.dart'; import 'package:star_lock/talk/starChart/constant/talk_status.dart'; import 'package:star_lock/talk/starChart/proto/talk_data.pb.dart'; -import 'package:star_lock/talk/starChart/proto/talk_data.pbenum.dart'; import 'package:star_lock/talk/starChart/proto/talk_expect.pb.dart'; import 'package:star_lock/talk/starChart/star_chart_manage.dart'; import 'package:star_lock/talk/starChart/views/talkView/talk_view_state.dart'; import 'package:star_lock/tools/bugly/bugly_tool.dart'; -import 'package:star_lock/tools/commonDataManage.dart'; -import 'package:star_lock/tools/storage.dart'; import '../../../../tools/baseGetXController.dart'; @@ -68,7 +55,7 @@ class TalkViewLogic extends BaseGetXController { if (Platform.isAndroid) { FlutterPcmSound.setFeedThreshold(1024); // Android 平台的特殊处理 } else { - FlutterPcmSound.setFeedThreshold(sampleRate ~/ 32); // 非 Android 平台的处理 + FlutterPcmSound.setFeedThreshold(2000); // 非 Android 平台的处理 } } @@ -621,6 +608,54 @@ class TalkViewLogic extends BaseGetXController { } return processedList; } + //test测试降噪算法 + // List preprocessAudio(List pcmList) { + // final List processedList = []; + // final int windowSize = 5; + // final int thresholdFactor = 2; // 动态阈值的倍数 + + // for (int i = 0; i < pcmList.length; i++) { + // int pcmVal = pcmList[i]; + + // // 计算当前窗口内的标准差 + // int sum = 0; + // int count = 0; + // for (int j = i; j < i + windowSize && j < pcmList.length; j++) { + // sum += pcmList[j]; + // count++; + // } + // int mean = sum ~/ count; + + // // 计算标准差 + // int varianceSum = 0; + // for (int j = i; j < i + windowSize && j < pcmList.length; j++) { + // varianceSum += (pcmList[j] - mean) * (pcmList[j] - mean); + // } + // double standardDeviation = + // sqrt(varianceSum / count); // Use sqrt from dart:math + + // // 动态阈值 + // int dynamicThreshold = (standardDeviation * thresholdFactor).toInt(); + + // // 动态降噪:如果信号小于动态阈值,则设为0 + // if (pcmVal.abs() < dynamicThreshold) { + // pcmVal = 0; + // } + + // // 移动平均滤波器 + // int sumFilter = 0; + // int countFilter = 0; + // for (int j = i; j < i + windowSize && j < pcmList.length; j++) { + // sumFilter += pcmList[j]; + // countFilter++; + // } + // int average = sumFilter ~/ countFilter; + + // processedList.add(average); + // } + + // return processedList; + // } List listLinearToALaw(List pcmList) { final List aLawList = []; diff --git a/lib/tools/showCupertinoAlertView.dart b/lib/tools/showCupertinoAlertView.dart index 607dc414..d973cc78 100755 --- a/lib/tools/showCupertinoAlertView.dart +++ b/lib/tools/showCupertinoAlertView.dart @@ -2,6 +2,7 @@ import 'dart:typed_data'; import 'dart:ui'; import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; @@ -54,7 +55,7 @@ class ShowCupertinoAlertView { child: Text( '${"开启微信接收报警消息需要先关注".tr}$qrCodeText${"微信公众号,请保存二维码并使用微信扫一扫设置".tr}', style: - TextStyle(fontSize: 24.sp, color: Colors.black), + TextStyle(fontSize: 24.sp, color: Colors.black), )), SizedBox( height: 60.h, @@ -159,8 +160,8 @@ class ShowCupertinoAlertView { //发送需要实名认证的电子钥匙时身份信息确认框 void realNameIDCardInfoComfirmAlert( {required String getNameStr, - required String getIDCardStr, - required VoidCallback onConfirm}) { + required String getIDCardStr, + required VoidCallback onConfirm}) { showCupertinoDialog( context: Get.context!, builder: (context) { @@ -340,7 +341,7 @@ class ShowCupertinoAlertView { ), CupertinoDialogAction( child: - Text('购买'.tr, style: TextStyle(color: AppColors.mainColor)), + Text('购买'.tr, style: TextStyle(color: AppColors.mainColor)), onPressed: () { Get.back(); sureClick(); @@ -391,7 +392,7 @@ class ShowCupertinoAlertView { ), CupertinoDialogAction( child: - Text('删除'.tr, style: TextStyle(color: AppColors.mainColor)), + Text('删除'.tr, style: TextStyle(color: AppColors.mainColor)), onPressed: () { Get.back(); clearClick(); @@ -406,8 +407,8 @@ class ShowCupertinoAlertView { //可视门铃二维码弹窗 void showVisualDoorbellCodeAlert( {required BuildContext widgetContext, - required String qrCodeUrl, - required String qrCodeText}) { + required String qrCodeUrl, + required String qrCodeText}) { showCupertinoModalPopup( context: widgetContext, builder: (BuildContext context) { @@ -447,7 +448,7 @@ class ShowCupertinoAlertView { child: Text( qrCodeText, style: - TextStyle(fontSize: 24.sp, color: Colors.black), + TextStyle(fontSize: 24.sp, color: Colors.black), )), Container( margin: EdgeInsets.only(left: 60.w, right: 60.w), @@ -456,21 +457,33 @@ class ShowCupertinoAlertView { onClick: () async { // 截图并保存到相册 try { - final RenderRepaintBoundary boundary = - _repaintBoundaryKey.currentContext! - .findRenderObject()! - as RenderRepaintBoundary; - final image = await boundary.toImage(); - final ByteData? byteData = await image - .toByteData(format: ImageByteFormat.png); + final Color qrcodeStyleColor = + defaultTargetPlatform == TargetPlatform.iOS + ? const Color(0xFF000000) + : Colors.white; + final QrPainter painter = QrPainter( + data: qrCodeUrl, + version: QrVersions.auto, + gapless: false, + errorCorrectionLevel: QrErrorCorrectLevel.L, + eyeStyle: QrEyeStyle( + eyeShape: QrEyeShape.square, + color: qrcodeStyleColor, + ), + dataModuleStyle: QrDataModuleStyle( + dataModuleShape: QrDataModuleShape.square, + color: qrcodeStyleColor, + )); + final ByteData? byteData = + await painter.toImageData(600.0, + format: ImageByteFormat.png); final Uint8List pngBytes = - byteData!.buffer.asUint8List(); - + byteData!.buffer.asUint8List(); final result = - await ImageGallerySaver.saveImage( - Uint8List.fromList(pngBytes), - quality: 100, - name: 'qr_code'); + await ImageGallerySaver.saveImage( + Uint8List.fromList(pngBytes), + quality: 100, + name: 'qr_code'); if (result['isSuccess']) { EasyLoading.showToast('保存成功'.tr); } else { @@ -498,113 +511,113 @@ class ShowCupertinoAlertView { ); } - // //邮件通知类型选择弹窗 - // void emailNotifyTypeSlectAlert() { - // showCupertinoDialog( - // context: Get.context!, - // builder: (BuildContext context) { - // return CupertinoAlertDialog( - // title: const Text('类型选择'), - // content: Column( - // children: [ - // Padding( - // padding: EdgeInsets.only( - // left: 10.w, top: 8.h, bottom: 16.h, right: 10.w), - // child: Align( - // alignment: Alignment.centerLeft, - // child: Text('请选择要使用哪种类型', style: TextStyle(fontSize: 20.sp)), - // ), - // ), - // GestureDetector( - // onTap: () { - // setState(() { - // isSystemEmailSelected = true; - // }); - // }, - // child: Row( - // mainAxisAlignment: MainAxisAlignment.start, - // crossAxisAlignment: CrossAxisAlignment.center, - // children: [ - // Image.asset( - // isSystemEmailSelected - // ? 'images/icon_round_select.png' - // : 'images/icon_round_unSelect.png', - // width: 30.w, - // height: 30.w, - // ), - // Padding( - // padding: EdgeInsets.only(left: 10.w), - // child: Text( - // '系统邮件(推荐)', - // style: TextStyle( - // fontSize: 22.sp, fontWeight: FontWeight.bold), - // ), - // ), - // ], - // ), - // ), - // Padding( - // padding: EdgeInsets.only(top: 6.h, left: 10.w, bottom: 10.h), - // child: Align( - // alignment: Alignment.centerLeft, - // child: Text( - // '邮件将从软件平台直接发给用户,请根据需要在软件那里购买邮件数量', - // style: TextStyle(fontSize: 18.sp), - // textAlign: TextAlign.left, - // ), - // ), - // ), - // GestureDetector( - // onTap: () { - // setState(() { - // isSystemEmailSelected = false; - // }); - // }, - // child: Row( - // mainAxisAlignment: MainAxisAlignment.start, - // crossAxisAlignment: CrossAxisAlignment.center, - // children: [ - // Image.asset( - // !isSystemEmailSelected - // ? 'images/icon_round_select.png' - // : 'images/icon_round_unSelect.png', - // width: 30.w, - // height: 30.w, - // ), - // Padding( - // padding: EdgeInsets.only(left: 10.w), - // child: Text( - // '个人邮件', - // style: TextStyle( - // fontSize: 22.sp, fontWeight: FontWeight.bold), - // ), - // ), - // ], - // ), - // ), - // Padding( - // padding: EdgeInsets.only(top: 6.h, left: 10.w), - // child: Align( - // alignment: Alignment.centerLeft, - // child: Text( - // '邮件将从你的个人邮箱发给用户', - // style: TextStyle(fontSize: 18.sp), - // ), - // ), - // ), - // ], - // ), - // actions: [ - // CupertinoDialogAction( - // onPressed: Get.back, - // child: Text( - // '确定'.tr, - // style: TextStyle(color: AppColors.mainColor), - // ), - // ), - // ], - // ); - // }, - // ); - // } +// //邮件通知类型选择弹窗 +// void emailNotifyTypeSlectAlert() { +// showCupertinoDialog( +// context: Get.context!, +// builder: (BuildContext context) { +// return CupertinoAlertDialog( +// title: const Text('类型选择'), +// content: Column( +// children: [ +// Padding( +// padding: EdgeInsets.only( +// left: 10.w, top: 8.h, bottom: 16.h, right: 10.w), +// child: Align( +// alignment: Alignment.centerLeft, +// child: Text('请选择要使用哪种类型', style: TextStyle(fontSize: 20.sp)), +// ), +// ), +// GestureDetector( +// onTap: () { +// setState(() { +// isSystemEmailSelected = true; +// }); +// }, +// child: Row( +// mainAxisAlignment: MainAxisAlignment.start, +// crossAxisAlignment: CrossAxisAlignment.center, +// children: [ +// Image.asset( +// isSystemEmailSelected +// ? 'images/icon_round_select.png' +// : 'images/icon_round_unSelect.png', +// width: 30.w, +// height: 30.w, +// ), +// Padding( +// padding: EdgeInsets.only(left: 10.w), +// child: Text( +// '系统邮件(推荐)', +// style: TextStyle( +// fontSize: 22.sp, fontWeight: FontWeight.bold), +// ), +// ), +// ], +// ), +// ), +// Padding( +// padding: EdgeInsets.only(top: 6.h, left: 10.w, bottom: 10.h), +// child: Align( +// alignment: Alignment.centerLeft, +// child: Text( +// '邮件将从软件平台直接发给用户,请根据需要在软件那里购买邮件数量', +// style: TextStyle(fontSize: 18.sp), +// textAlign: TextAlign.left, +// ), +// ), +// ), +// GestureDetector( +// onTap: () { +// setState(() { +// isSystemEmailSelected = false; +// }); +// }, +// child: Row( +// mainAxisAlignment: MainAxisAlignment.start, +// crossAxisAlignment: CrossAxisAlignment.center, +// children: [ +// Image.asset( +// !isSystemEmailSelected +// ? 'images/icon_round_select.png' +// : 'images/icon_round_unSelect.png', +// width: 30.w, +// height: 30.w, +// ), +// Padding( +// padding: EdgeInsets.only(left: 10.w), +// child: Text( +// '个人邮件', +// style: TextStyle( +// fontSize: 22.sp, fontWeight: FontWeight.bold), +// ), +// ), +// ], +// ), +// ), +// Padding( +// padding: EdgeInsets.only(top: 6.h, left: 10.w), +// child: Align( +// alignment: Alignment.centerLeft, +// child: Text( +// '邮件将从你的个人邮箱发给用户', +// style: TextStyle(fontSize: 18.sp), +// ), +// ), +// ), +// ], +// ), +// actions: [ +// CupertinoDialogAction( +// onPressed: Get.back, +// child: Text( +// '确定'.tr, +// style: TextStyle(color: AppColors.mainColor), +// ), +// ), +// ], +// ); +// }, +// ); +// } }