diff --git a/lib/blue/io_protocol/io_readVoicePackageFinalResult.dart b/lib/blue/io_protocol/io_readVoicePackageFinalResult.dart index ac89d688..bf472d89 100644 --- a/lib/blue/io_protocol/io_readVoicePackageFinalResult.dart +++ b/lib/blue/io_protocol/io_readVoicePackageFinalResult.dart @@ -48,7 +48,7 @@ class ReadLockCurrentVoicePacketReply extends Reply { CommandType commandType, List dataDetail) : super.parseData(commandType, dataDetail) { data = dataDetail; - status = data[6]; + status = data[2]; errorWithStstus(status); } } diff --git a/lib/blue/io_protocol/io_setVoicePackageFinalResult.dart b/lib/blue/io_protocol/io_setVoicePackageFinalResult.dart index 962a9fa3..d88ae046 100644 --- a/lib/blue/io_protocol/io_setVoicePackageFinalResult.dart +++ b/lib/blue/io_protocol/io_setVoicePackageFinalResult.dart @@ -55,7 +55,7 @@ class SetVoicePackageFinalResultReply extends Reply { CommandType commandType, List dataDetail) : super.parseData(commandType, dataDetail) { data = dataDetail; - status = data[6]; + status = data[2]; errorWithStstus(status); } } diff --git a/lib/blue/reciver_data.dart b/lib/blue/reciver_data.dart index 1a2006e0..a74804ea 100755 --- a/lib/blue/reciver_data.dart +++ b/lib/blue/reciver_data.dart @@ -18,9 +18,11 @@ import 'package:star_lock/blue/io_protocol/io_processOtaUpgrade.dart'; import 'package:star_lock/blue/io_protocol/io_readAdminPassword.dart'; import 'package:star_lock/blue/io_protocol/io_readSupportFunctionsNoParameters.dart'; import 'package:star_lock/blue/io_protocol/io_readSupportFunctionsWithParameters.dart'; +import 'package:star_lock/blue/io_protocol/io_readVoicePackageFinalResult.dart'; import 'package:star_lock/blue/io_protocol/io_referEventRecordTime.dart'; import 'package:star_lock/blue/io_protocol/io_setSupportFunctionsNoParameters.dart'; import 'package:star_lock/blue/io_protocol/io_setSupportFunctionsWithParameters.dart'; +import 'package:star_lock/blue/io_protocol/io_setVoicePackageFinalResult.dart'; import 'package:star_lock/blue/io_protocol/io_timing.dart'; import 'package:star_lock/blue/io_protocol/io_voicePackageConfigure.dart'; import 'package:star_lock/blue/io_protocol/io_voicePackageConfigureProcess.dart'; @@ -317,6 +319,18 @@ class CommandReciverManager { commandType, data); } break; + case CommandType.readLockCurrentVoicePacket: + { + reply = + ReadLockCurrentVoicePacketReply.parseData(commandType, data); + } + break; + case CommandType.setLockCurrentVoicePacket: + { + reply = + SetVoicePackageFinalResultReply.parseData(commandType, data); + } + break; case CommandType.generalExtendedCommond: { // 子命令类型 diff --git a/lib/main/lockDetail/lockSet/speechLanguageSettings/speech_language_settings_logic.dart b/lib/main/lockDetail/lockSet/speechLanguageSettings/speech_language_settings_logic.dart index 1fc47899..953fb79f 100644 --- a/lib/main/lockDetail/lockSet/speechLanguageSettings/speech_language_settings_logic.dart +++ b/lib/main/lockDetail/lockSet/speechLanguageSettings/speech_language_settings_logic.dart @@ -12,6 +12,7 @@ import 'package:star_lock/blue/blue_manage.dart'; import 'package:star_lock/blue/io_protocol/io_getDeviceModel.dart'; import 'package:star_lock/blue/io_protocol/io_otaUpgrade.dart'; import 'package:star_lock/blue/io_protocol/io_processOtaUpgrade.dart'; +import 'package:star_lock/blue/io_protocol/io_readVoicePackageFinalResult.dart'; import 'package:star_lock/blue/io_protocol/io_setVoicePackageFinalResult.dart'; import 'package:star_lock/blue/io_protocol/io_voicePackageConfigure.dart'; import 'package:star_lock/blue/io_protocol/io_voicePackageConfigureProcess.dart'; @@ -55,9 +56,12 @@ class SpeechLanguageSettingsLogic extends BaseGetXController { handleVoiceConfigureThrottled(reply); } else if (reply is SetVoicePackageFinalResultReply) { handleSetResult(reply); + } else if (reply is ReadLockCurrentVoicePacketReply) { + handleLockCurrentVoicePacketResult(reply); } }); await initList(); + readLockLanguage(); } /// 获取列表 @@ -438,42 +442,22 @@ class SpeechLanguageSettingsLogic extends BaseGetXController { final int status = reply.data[2]; switch (status) { case 0x00: - // await BlueManage().blueSendData(BlueManage().connectDeviceName, - // (BluetoothConnectionState deviceConnectionState) async { - // if (deviceConnectionState == BluetoothConnectionState.connected) { - // await BlueManage().writeCharacteristicWithResponse( - // SetVoicePackageFinalResult( - // lockID: BlueManage().connectDeviceName, - // languageCode: state.tempLangStr.value, - // ).packageData(), - // ); - // } else if (deviceConnectionState == - // BluetoothConnectionState.disconnected) { - // dismissEasyLoading(); - // cancelBlueConnetctToastTimer(); - // showBlueConnetctToast(); - // } - // }); - cancelBlueConnetctToastTimer(); - final LoginEntity entity = - await ApiRepository.to.settingCurrentVoiceTimbre( - data: { - 'lang': state.tempLangStr.value, - 'timbre': state.tempTimbreStr.value, - }, - lockId: state.lockSetInfoData.value.lockId!, - ); - if (entity.errorCode!.codeIsSuccessful) { - showSuccess('设置成功'.tr, something: () { - state.lockSetInfoData.value.lockSettingInfo?.currentVoiceTimbre - ?.lang = state.tempLangStr.value; - state.lockSetInfoData.value.lockSettingInfo?.currentVoiceTimbre - ?.timbre = state.tempTimbreStr.value; - eventBus.fire( - PassCurrentLockInformationEvent(state.lockSetInfoData.value)); - }); - } - dismissEasyLoading(); + await BlueManage().blueSendData(BlueManage().connectDeviceName, + (BluetoothConnectionState deviceConnectionState) async { + if (deviceConnectionState == BluetoothConnectionState.connected) { + await BlueManage().writeCharacteristicWithResponse( + SetVoicePackageFinalResult( + lockID: BlueManage().connectDeviceName, + languageCode: state.tempLangStr.value, + ).packageData(), + ); + } else if (deviceConnectionState == + BluetoothConnectionState.disconnected) { + dismissEasyLoading(); + cancelBlueConnetctToastTimer(); + showBlueConnetctToast(); + } + }); break; default: showToast('设置'.tr + '失败'.tr); @@ -511,4 +495,75 @@ class SpeechLanguageSettingsLogic extends BaseGetXController { break; } } + + void handleLockCurrentVoicePacketResult( + ReadLockCurrentVoicePacketReply reply) { + final int status = reply.data[2]; + switch (status) { + case 0x00: + //成功 + cancelBlueConnetctToastTimer(); + + const int languageCodeStartIndex = 3; + const int languageCodeLength = 20; + const int languageCodeEndIndex = + languageCodeStartIndex + languageCodeLength; // 23 + + if (reply.data.length < languageCodeEndIndex) { + throw Exception( + 'Reply data is too short to contain LanguageCode. Expected at least $languageCodeEndIndex bytes, got ${reply.data.length}'); + } + List languageCodeBytes = + reply.data.sublist(languageCodeStartIndex, languageCodeEndIndex); + + String languageCode = String.fromCharCodes(languageCodeBytes); + + languageCode = languageCode.trim(); // 移除首尾空格 + languageCode = + languageCode.replaceAll('\u0000', ''); // 移除空字符 (null bytes) + + + if (languageCode != null && languageCode != '') { + final indexWhere = state.languages + .indexWhere((element) => element.lang == languageCode); + if (indexWhere != -1) { + print('锁板上的语言是:$languageCode,下标是:$indexWhere'); + state.selectPassthroughListIndex.value = indexWhere; + } + } + dismissEasyLoading(); + break; + case 0x06: + //无权限 + final List token = reply.data.sublist(2, 6); + if (state.data != null) { + sendFileToDevice(state.data!, token); + } + break; + default: + break; + } + } + + void readLockLanguage() async { + showEasyLoading(); + showBlueConnetctToastTimer(action: () { + dismissEasyLoading(); + }); + await BlueManage().blueSendData(BlueManage().connectDeviceName, + (BluetoothConnectionState deviceConnectionState) async { + if (deviceConnectionState == BluetoothConnectionState.connected) { + await BlueManage().writeCharacteristicWithResponse( + ReadLockCurrentVoicePacket( + lockID: BlueManage().connectDeviceName, + ).packageData(), + ); + } else if (deviceConnectionState == + BluetoothConnectionState.disconnected) { + dismissEasyLoading(); + cancelBlueConnetctToastTimer(); + showBlueConnetctToast(); + } + }); + } } diff --git a/lib/main/lockDetail/lockSet/speechLanguageSettings/speech_language_settings_page.dart b/lib/main/lockDetail/lockSet/speechLanguageSettings/speech_language_settings_page.dart index d368546c..59b45004 100644 --- a/lib/main/lockDetail/lockSet/speechLanguageSettings/speech_language_settings_page.dart +++ b/lib/main/lockDetail/lockSet/speechLanguageSettings/speech_language_settings_page.dart @@ -63,6 +63,12 @@ class _SpeechLanguageSettingsPageState final soundType = state.soundTypeList.value[index]; return CommonItem( leftTitel: soundType, + leftTitleStyle: TextStyle( + fontSize: 22.sp, + fontWeight: state.selectSoundTypeIndex.value == index + ? FontWeight.bold + : null, + ), rightTitle: '', isHaveLine: !isLastItem, isHaveDirection: false, @@ -94,35 +100,44 @@ class _SpeechLanguageSettingsPageState height: 8.h, ), // 语言包列表区 - Container( - color: Colors.transparent, - child: Column( - children: List.generate( - state.languages.length, - (index) { - final item = state.languages[index]; - return CommonItem( - leftTitel: item.langText, - rightTitle: '', - isHaveLine: true, - isHaveDirection: false, - isHaveRightWidget: true, - leftTitleMaxWidth: 0.9.sw, // 设置左侧标题最大宽度 - rightWidget: - state.selectPassthroughListIndex.value == index - ? Image( - image: const AssetImage( - 'images/icon_item_checked.png'), - width: 30.w, - height: 30.w, - fit: BoxFit.contain, - ) - : Container(), - action: () { - state.selectPassthroughListIndex.value = index; - }, - ); - }, + Obx( + () => Container( + color: Colors.transparent, + child: Column( + children: List.generate( + state.languages.length, + (index) { + final item = state.languages[index]; + return CommonItem( + leftTitel: item.langText, + leftTitleStyle: TextStyle( + fontSize: 22.sp, + fontWeight: state.selectPassthroughListIndex.value == index + ? FontWeight.bold + : null, + ), + rightTitle: '', + isHaveLine: true, + isHaveDirection: false, + isHaveRightWidget: true, + leftTitleMaxWidth: 0.9.sw, + // 设置左侧标题最大宽度 + rightWidget: + state.selectPassthroughListIndex.value == index + ? Image( + image: const AssetImage( + 'images/icon_item_checked.png'), + width: 30.w, + height: 30.w, + fit: BoxFit.contain, + ) + : Container(), + action: () { + state.selectPassthroughListIndex.value = index; + }, + ); + }, + ), ), ), ), @@ -133,16 +148,6 @@ class _SpeechLanguageSettingsPageState } - List _buildList() { - final appLocalLanguages = state.languages; - return List.generate( - appLocalLanguages.length, - (index) => _buildItem( - appLocalLanguages[index], - index, - ), - ); - } @override void dispose() { @@ -152,24 +157,4 @@ class _SpeechLanguageSettingsPageState } } - _buildItem(PassthroughItem item, index) { - return CommonItem( - leftTitel: item.langText, - rightTitle: '', - isHaveLine: true, - isHaveDirection: false, - isHaveRightWidget: true, - rightWidget: state.selectPassthroughListIndex.value == index - ? Image( - image: const AssetImage('images/icon_item_checked.png'), - width: 30.w, - height: 30.w, - fit: BoxFit.contain, - ) - : Container(), - action: () { - state.selectPassthroughListIndex.value = index; - }, - ); - } } diff --git a/lib/mine/addLock/lock_voice_setting/lock_voice_setting_logic.dart b/lib/mine/addLock/lock_voice_setting/lock_voice_setting_logic.dart index 4d265f54..1fc00183 100644 --- a/lib/mine/addLock/lock_voice_setting/lock_voice_setting_logic.dart +++ b/lib/mine/addLock/lock_voice_setting/lock_voice_setting_logic.dart @@ -12,6 +12,7 @@ import 'package:star_lock/app_settings/app_colors.dart'; import 'package:star_lock/blue/blue_manage.dart'; import 'package:star_lock/blue/io_protocol/io_getDeviceModel.dart'; import 'package:star_lock/blue/io_protocol/io_readVoicePackageFinalResult.dart'; +import 'package:star_lock/blue/io_protocol/io_setVoicePackageFinalResult.dart'; import 'package:star_lock/blue/io_protocol/io_voicePackageConfigure.dart'; import 'package:star_lock/blue/io_protocol/io_voicePackageConfigureProcess.dart'; import 'package:star_lock/blue/io_reply.dart'; @@ -53,6 +54,8 @@ class LockVoiceSettingLogic extends BaseGetXController { handleVoiceConfigureThrottled(reply); } else if (reply is ReadLockCurrentVoicePacketReply) { handleLockCurrentVoicePacketResult(reply); + } else if (reply is SetVoicePackageFinalResultReply) { + handleSetResult(reply); } }); initList(); @@ -77,26 +80,59 @@ class LockVoiceSettingLogic extends BaseGetXController { Future _executeLogic( VoicePackageConfigureConfirmationReply reply) async { - final LoginEntity entity = await ApiRepository.to.settingCurrentVoiceTimbre( - data: { - 'lang': state.tempLangStr.value, - 'timbre': state.tempTimbreStr.value, - }, - lockId: state.lockSetInfoData.value.lockId!, - ); - if (entity.errorCode!.codeIsSuccessful) { - showSuccess('设置成功'.tr, something: () { - state.lockSetInfoData.value.lockSettingInfo?.currentVoiceTimbre?.lang = - state.tempLangStr.value; - state.lockSetInfoData.value.lockSettingInfo?.currentVoiceTimbre - ?.timbre = state.tempTimbreStr.value; + showEasyLoading(); + showBlueConnetctToastTimer(action: () { + dismissEasyLoading(); + }); + await BlueManage().blueSendData(BlueManage().connectDeviceName, + (BluetoothConnectionState deviceConnectionState) async { + if (deviceConnectionState == BluetoothConnectionState.connected) { + await BlueManage().writeCharacteristicWithResponse( + SetVoicePackageFinalResult( + lockID: BlueManage().connectDeviceName, + languageCode: state.tempLangStr.value, + ).packageData(), + ); + } else if (deviceConnectionState == + BluetoothConnectionState.disconnected) { + dismissEasyLoading(); + cancelBlueConnetctToastTimer(); + showBlueConnetctToast(); + } + }); + } - eventBus - .fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); - Get.offAllNamed(Routers.starLockMain); - }); + void handleSetResult(SetVoicePackageFinalResultReply reply) async { + final int status = reply.data[2]; + switch (status) { + case 0x00: + cancelBlueConnetctToastTimer(); + final LoginEntity entity = + await ApiRepository.to.settingCurrentVoiceTimbre( + data: { + 'lang': state.tempLangStr.value, + 'timbre': state.tempTimbreStr.value, + }, + lockId: state.lockSetInfoData.value.lockId!, + ); + if (entity.errorCode!.codeIsSuccessful) { + showSuccess('设置成功'.tr, something: () { + state.lockSetInfoData.value.lockSettingInfo?.currentVoiceTimbre + ?.lang = state.tempLangStr.value; + state.lockSetInfoData.value.lockSettingInfo?.currentVoiceTimbre + ?.timbre = state.tempTimbreStr.value; + + eventBus.fire( + PassCurrentLockInformationEvent(state.lockSetInfoData.value)); + Get.offAllNamed(Routers.starLockMain); + }); + } + dismissEasyLoading(); + break; + default: + showToast('设置'.tr + '失败'.tr); + break; } - dismissEasyLoading(); } void saveSpeechLanguageSettings() async { @@ -201,14 +237,12 @@ class LockVoiceSettingLogic extends BaseGetXController { // 开始配置语音包 void _handlerStartVoicePackageConfigure( VoicePackageConfigureReply reply) async { - final int status = reply.data[3]; + final int status = reply.data[6]; switch (status) { case 0x00: //成功 cancelBlueConnetctToastTimer(); - _startSendLanguageFile(); - break; case 0x06: //无权限 @@ -218,7 +252,8 @@ class LockVoiceSettingLogic extends BaseGetXController { } break; default: - showToast('获取设备型号失败'.tr); + dismissEasyLoading(); + cancelBlueConnetctToastTimer(); break; } } @@ -409,6 +444,10 @@ class LockVoiceSettingLogic extends BaseGetXController { } void readLockLanguage() async { + showEasyLoading(); + showBlueConnetctToastTimer(action: () { + dismissEasyLoading(); + }); await BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState deviceConnectionState) async { if (deviceConnectionState == BluetoothConnectionState.connected) { @@ -428,7 +467,7 @@ class LockVoiceSettingLogic extends BaseGetXController { void handleLockCurrentVoicePacketResult( ReadLockCurrentVoicePacketReply reply) { - final int status = reply.data[6]; + final int status = reply.data[2]; switch (status) { case 0x00: //成功 @@ -462,6 +501,16 @@ class LockVoiceSettingLogic extends BaseGetXController { // 6. 使用提取到的 languageCode print('LanguageCode: $languageCode'); // 例如: zh_CN, en_US + + if (languageCode != null && languageCode != '') { + final indexWhere = state.languages + .indexWhere((element) => element.lang == languageCode); + if (indexWhere != -1) { + print('锁板上的语言是:$languageCode,下标是:$indexWhere'); + state.selectPassthroughListIndex.value = indexWhere; + } + } + dismissEasyLoading(); break; case 0x06: //无权限