Merge remote-tracking branch 'origin/develop_liyi' into develop_liyi

This commit is contained in:
liyi 2025-02-20 09:49:35 +08:00
commit e1943d26d9
4 changed files with 220 additions and 172 deletions

View File

@ -55,11 +55,11 @@ FutureOr<void> main() async {
} }
}); });
//ToDo: // //ToDo:
runApp(MultiProvider(providers: [ // runApp(MultiProvider(providers: [
ChangeNotifierProvider(create: (_) => DebugInfoModel()), // ChangeNotifierProvider(create: (_) => DebugInfoModel()),
], child: MyApp(isLogin: isLogin))); // ], child: MyApp(isLogin: isLogin)));
// runApp(MyApp(isLogin: isLogin)); runApp(MyApp(isLogin: isLogin));
}, onException: (FlutterErrorDetails details) async { }, onException: (FlutterErrorDetails details) async {
debugPrint("FlutterErrorDetails $details"); debugPrint("FlutterErrorDetails $details");
}); });

View File

@ -225,19 +225,19 @@ class StartChartManage {
/// ///
_onReceiveData(_udpSocket!, Get.context!); _onReceiveData(_udpSocket!, Get.context!);
//ToDo: // //ToDo:
// // //
Timer.periodic(Duration(seconds: 1), (Timer t) { // Timer.periodic(Duration(seconds: 1), (Timer t) {
UdpTalkDataHandler().resetDataRates(); // UdpTalkDataHandler().resetDataRates();
// // //
Provider.of<DebugInfoModel>(Get.context!, listen: false) // Provider.of<DebugInfoModel>(Get.context!, listen: false)
.updateDebugInfo( // .updateDebugInfo(
UdpTalkDataHandler().getLastRecvDataRate() ~/ 1024, // KB // UdpTalkDataHandler().getLastRecvDataRate() ~/ 1024, // KB
UdpTalkDataHandler().getLastRecvPacketCount(), // UdpTalkDataHandler().getLastRecvPacketCount(),
UdpTalkDataHandler().getLastSendDataRate() ~/ 1024, // KB // UdpTalkDataHandler().getLastSendDataRate() ~/ 1024, // KB
UdpTalkDataHandler().getLastSendPacketCount(), // UdpTalkDataHandler().getLastSendPacketCount(),
); // );
}); // });
}).catchError((error) { }).catchError((error) {
_log(text: 'Failed to bind UDP socket: $error'); _log(text: 'Failed to bind UDP socket: $error');
}); });
@ -983,16 +983,16 @@ class StartChartManage {
if (dg?.data != null) { if (dg?.data != null) {
final deserialize = ScpMessage.deserialize(dg!.data); final deserialize = ScpMessage.deserialize(dg!.data);
//ToDo: // //ToDo:
UdpTalkDataHandler().updateRecvDataRate(dg.data.length); // UdpTalkDataHandler().updateRecvDataRate(dg.data.length);
// // //
Provider.of<DebugInfoModel>(context, listen: false).updateDebugInfo( // Provider.of<DebugInfoModel>(context, listen: false).updateDebugInfo(
UdpTalkDataHandler().getLastRecvDataRate() ~/ 1024, // KB // UdpTalkDataHandler().getLastRecvDataRate() ~/ 1024, // KB
UdpTalkDataHandler().getLastRecvPacketCount(), // UdpTalkDataHandler().getLastRecvPacketCount(),
UdpTalkDataHandler().getLastSendDataRate() ~/ 1024, // KB // UdpTalkDataHandler().getLastSendDataRate() ~/ 1024, // KB
UdpTalkDataHandler().getLastSendPacketCount(), // UdpTalkDataHandler().getLastSendPacketCount(),
); // );
if (deserialize != null) { if (deserialize != null) {
// //

View File

@ -1,46 +1,33 @@
import 'dart:async'; import 'dart:async';
import 'dart:ffi';
import 'dart:io'; import 'dart:io';
import 'dart:math';
import 'dart:typed_data';
import 'dart:ui' as ui; import 'dart:ui' as ui;
import 'dart:math'; // Import the math package to use sqrt
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import 'package:flutter/services.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_pcm_sound/flutter_pcm_sound.dart';
import 'package:flutter_screen_recording/flutter_screen_recording.dart'; import 'package:flutter_screen_recording/flutter_screen_recording.dart';
import 'package:flutter_voice_processor/flutter_voice_processor.dart'; import 'package:flutter_voice_processor/flutter_voice_processor.dart';
import 'package:gallery_saver/gallery_saver.dart'; import 'package:gallery_saver/gallery_saver.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import 'package:image_gallery_saver/image_gallery_saver.dart'; import 'package:image_gallery_saver/image_gallery_saver.dart';
import 'package:path_provider/path_provider.dart'; import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
import 'package:star_lock/app_settings/app_settings.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/login/login/entity/LoginEntity.dart';
import 'package:star_lock/main/lockDetail/lockDetail/lockDetail_logic.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/lockDetail_state.dart';
import 'package:star_lock/main/lockDetail/lockDetail/lockNetToken_entity.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/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/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/network/api_repository.dart';
import 'package:star_lock/talk/call/g711.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/constant/talk_status.dart';
import 'package:star_lock/talk/starChart/proto/talk_data.pb.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/proto/talk_expect.pb.dart';
import 'package:star_lock/talk/starChart/star_chart_manage.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/talk/starChart/views/talkView/talk_view_state.dart';
import 'package:star_lock/tools/bugly/bugly_tool.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'; import '../../../../tools/baseGetXController.dart';
@ -68,7 +55,7 @@ class TalkViewLogic extends BaseGetXController {
if (Platform.isAndroid) { if (Platform.isAndroid) {
FlutterPcmSound.setFeedThreshold(1024); // Android FlutterPcmSound.setFeedThreshold(1024); // Android
} else { } else {
FlutterPcmSound.setFeedThreshold(sampleRate ~/ 32); // Android FlutterPcmSound.setFeedThreshold(2000); // Android
} }
} }
@ -621,6 +608,54 @@ class TalkViewLogic extends BaseGetXController {
} }
return processedList; return processedList;
} }
//test测试降噪算法
// List<int> preprocessAudio(List<int> pcmList) {
// final List<int> 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<int> listLinearToALaw(List<int> pcmList) { List<int> listLinearToALaw(List<int> pcmList) {
final List<int> aLawList = []; final List<int> aLawList = [];

View File

@ -2,6 +2,7 @@ import 'dart:typed_data';
import 'dart:ui'; import 'dart:ui';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart';
@ -54,7 +55,7 @@ class ShowCupertinoAlertView {
child: Text( child: Text(
'${"开启微信接收报警消息需要先关注".tr}$qrCodeText${"微信公众号,请保存二维码并使用微信扫一扫设置".tr}', '${"开启微信接收报警消息需要先关注".tr}$qrCodeText${"微信公众号,请保存二维码并使用微信扫一扫设置".tr}',
style: style:
TextStyle(fontSize: 24.sp, color: Colors.black), TextStyle(fontSize: 24.sp, color: Colors.black),
)), )),
SizedBox( SizedBox(
height: 60.h, height: 60.h,
@ -159,8 +160,8 @@ class ShowCupertinoAlertView {
// //
void realNameIDCardInfoComfirmAlert( void realNameIDCardInfoComfirmAlert(
{required String getNameStr, {required String getNameStr,
required String getIDCardStr, required String getIDCardStr,
required VoidCallback onConfirm}) { required VoidCallback onConfirm}) {
showCupertinoDialog( showCupertinoDialog(
context: Get.context!, context: Get.context!,
builder: (context) { builder: (context) {
@ -340,7 +341,7 @@ class ShowCupertinoAlertView {
), ),
CupertinoDialogAction( CupertinoDialogAction(
child: child:
Text('购买'.tr, style: TextStyle(color: AppColors.mainColor)), Text('购买'.tr, style: TextStyle(color: AppColors.mainColor)),
onPressed: () { onPressed: () {
Get.back(); Get.back();
sureClick(); sureClick();
@ -391,7 +392,7 @@ class ShowCupertinoAlertView {
), ),
CupertinoDialogAction( CupertinoDialogAction(
child: child:
Text('删除'.tr, style: TextStyle(color: AppColors.mainColor)), Text('删除'.tr, style: TextStyle(color: AppColors.mainColor)),
onPressed: () { onPressed: () {
Get.back(); Get.back();
clearClick(); clearClick();
@ -406,8 +407,8 @@ class ShowCupertinoAlertView {
// //
void showVisualDoorbellCodeAlert( void showVisualDoorbellCodeAlert(
{required BuildContext widgetContext, {required BuildContext widgetContext,
required String qrCodeUrl, required String qrCodeUrl,
required String qrCodeText}) { required String qrCodeText}) {
showCupertinoModalPopup( showCupertinoModalPopup(
context: widgetContext, context: widgetContext,
builder: (BuildContext context) { builder: (BuildContext context) {
@ -447,7 +448,7 @@ class ShowCupertinoAlertView {
child: Text( child: Text(
qrCodeText, qrCodeText,
style: style:
TextStyle(fontSize: 24.sp, color: Colors.black), TextStyle(fontSize: 24.sp, color: Colors.black),
)), )),
Container( Container(
margin: EdgeInsets.only(left: 60.w, right: 60.w), margin: EdgeInsets.only(left: 60.w, right: 60.w),
@ -456,21 +457,33 @@ class ShowCupertinoAlertView {
onClick: () async { onClick: () async {
// //
try { try {
final RenderRepaintBoundary boundary = final Color qrcodeStyleColor =
_repaintBoundaryKey.currentContext! defaultTargetPlatform == TargetPlatform.iOS
.findRenderObject()! ? const Color(0xFF000000)
as RenderRepaintBoundary; : Colors.white;
final image = await boundary.toImage(); final QrPainter painter = QrPainter(
final ByteData? byteData = await image data: qrCodeUrl,
.toByteData(format: ImageByteFormat.png); 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 = final Uint8List pngBytes =
byteData!.buffer.asUint8List(); byteData!.buffer.asUint8List();
final result = final result =
await ImageGallerySaver.saveImage( await ImageGallerySaver.saveImage(
Uint8List.fromList(pngBytes), Uint8List.fromList(pngBytes),
quality: 100, quality: 100,
name: 'qr_code'); name: 'qr_code');
if (result['isSuccess']) { if (result['isSuccess']) {
EasyLoading.showToast('保存成功'.tr); EasyLoading.showToast('保存成功'.tr);
} else { } else {
@ -498,113 +511,113 @@ class ShowCupertinoAlertView {
); );
} }
// // // //
// void emailNotifyTypeSlectAlert() { // void emailNotifyTypeSlectAlert() {
// showCupertinoDialog( // showCupertinoDialog(
// context: Get.context!, // context: Get.context!,
// builder: (BuildContext context) { // builder: (BuildContext context) {
// return CupertinoAlertDialog( // return CupertinoAlertDialog(
// title: const Text('类型选择'), // title: const Text('类型选择'),
// content: Column( // content: Column(
// children: <Widget>[ // children: <Widget>[
// Padding( // Padding(
// padding: EdgeInsets.only( // padding: EdgeInsets.only(
// left: 10.w, top: 8.h, bottom: 16.h, right: 10.w), // left: 10.w, top: 8.h, bottom: 16.h, right: 10.w),
// child: Align( // child: Align(
// alignment: Alignment.centerLeft, // alignment: Alignment.centerLeft,
// child: Text('请选择要使用哪种类型', style: TextStyle(fontSize: 20.sp)), // child: Text('请选择要使用哪种类型', style: TextStyle(fontSize: 20.sp)),
// ), // ),
// ), // ),
// GestureDetector( // GestureDetector(
// onTap: () { // onTap: () {
// setState(() { // setState(() {
// isSystemEmailSelected = true; // isSystemEmailSelected = true;
// }); // });
// }, // },
// child: Row( // child: Row(
// mainAxisAlignment: MainAxisAlignment.start, // mainAxisAlignment: MainAxisAlignment.start,
// crossAxisAlignment: CrossAxisAlignment.center, // crossAxisAlignment: CrossAxisAlignment.center,
// children: <Widget>[ // children: <Widget>[
// Image.asset( // Image.asset(
// isSystemEmailSelected // isSystemEmailSelected
// ? 'images/icon_round_select.png' // ? 'images/icon_round_select.png'
// : 'images/icon_round_unSelect.png', // : 'images/icon_round_unSelect.png',
// width: 30.w, // width: 30.w,
// height: 30.w, // height: 30.w,
// ), // ),
// Padding( // Padding(
// padding: EdgeInsets.only(left: 10.w), // padding: EdgeInsets.only(left: 10.w),
// child: Text( // child: Text(
// '系统邮件(推荐)', // '系统邮件(推荐)',
// style: TextStyle( // style: TextStyle(
// fontSize: 22.sp, fontWeight: FontWeight.bold), // fontSize: 22.sp, fontWeight: FontWeight.bold),
// ), // ),
// ), // ),
// ], // ],
// ), // ),
// ), // ),
// Padding( // Padding(
// padding: EdgeInsets.only(top: 6.h, left: 10.w, bottom: 10.h), // padding: EdgeInsets.only(top: 6.h, left: 10.w, bottom: 10.h),
// child: Align( // child: Align(
// alignment: Alignment.centerLeft, // alignment: Alignment.centerLeft,
// child: Text( // child: Text(
// '邮件将从软件平台直接发给用户,请根据需要在软件那里购买邮件数量', // '邮件将从软件平台直接发给用户,请根据需要在软件那里购买邮件数量',
// style: TextStyle(fontSize: 18.sp), // style: TextStyle(fontSize: 18.sp),
// textAlign: TextAlign.left, // textAlign: TextAlign.left,
// ), // ),
// ), // ),
// ), // ),
// GestureDetector( // GestureDetector(
// onTap: () { // onTap: () {
// setState(() { // setState(() {
// isSystemEmailSelected = false; // isSystemEmailSelected = false;
// }); // });
// }, // },
// child: Row( // child: Row(
// mainAxisAlignment: MainAxisAlignment.start, // mainAxisAlignment: MainAxisAlignment.start,
// crossAxisAlignment: CrossAxisAlignment.center, // crossAxisAlignment: CrossAxisAlignment.center,
// children: <Widget>[ // children: <Widget>[
// Image.asset( // Image.asset(
// !isSystemEmailSelected // !isSystemEmailSelected
// ? 'images/icon_round_select.png' // ? 'images/icon_round_select.png'
// : 'images/icon_round_unSelect.png', // : 'images/icon_round_unSelect.png',
// width: 30.w, // width: 30.w,
// height: 30.w, // height: 30.w,
// ), // ),
// Padding( // Padding(
// padding: EdgeInsets.only(left: 10.w), // padding: EdgeInsets.only(left: 10.w),
// child: Text( // child: Text(
// '个人邮件', // '个人邮件',
// style: TextStyle( // style: TextStyle(
// fontSize: 22.sp, fontWeight: FontWeight.bold), // fontSize: 22.sp, fontWeight: FontWeight.bold),
// ), // ),
// ), // ),
// ], // ],
// ), // ),
// ), // ),
// Padding( // Padding(
// padding: EdgeInsets.only(top: 6.h, left: 10.w), // padding: EdgeInsets.only(top: 6.h, left: 10.w),
// child: Align( // child: Align(
// alignment: Alignment.centerLeft, // alignment: Alignment.centerLeft,
// child: Text( // child: Text(
// '邮件将从你的个人邮箱发给用户', // '邮件将从你的个人邮箱发给用户',
// style: TextStyle(fontSize: 18.sp), // style: TextStyle(fontSize: 18.sp),
// ), // ),
// ), // ),
// ), // ),
// ], // ],
// ), // ),
// actions: <Widget>[ // actions: <Widget>[
// CupertinoDialogAction( // CupertinoDialogAction(
// onPressed: Get.back, // onPressed: Get.back,
// child: Text( // child: Text(
// '确定'.tr, // '确定'.tr,
// style: TextStyle(color: AppColors.mainColor), // style: TextStyle(color: AppColors.mainColor),
// ), // ),
// ), // ),
// ], // ],
// ); // );
// }, // },
// ); // );
// } // }
} }