diff --git a/lib/data/models/appconfig_model.dart b/lib/data/models/appconfig_model.dart index 7baecff06..b4b6a4f90 100644 --- a/lib/data/models/appconfig_model.dart +++ b/lib/data/models/appconfig_model.dart @@ -95,3 +95,42 @@ class DBProduct { _$DBProductFromJson(json); Map toJson() => _$DBProductToJson(this); } + +//设备类型 +enum DeviceType { + /// 未知设备 + /// @Description 未知设备 + /// @example + unknown(0), //未知设备 + + /// 经典蓝牙耳机 + /// @Description 经典蓝牙耳机 + /// @example + classicBluetoothHeadset(1), //经典蓝牙耳机 + + /// Ble蓝牙耳机 双端 + /// @Description Ble蓝牙耳机 + /// @example + bleBluetoothDoubleHeadset(2), //Ble蓝牙耳机 双端 + + /// Ble蓝牙耳机 单端 + /// @Description Ble蓝牙耳机 + /// @example + bleBluetoothSingleHeadset(3), //Ble蓝牙耳机 单端 + + /// 智能录音笔 + /// @Description 智能录音笔 + /// @example + smartVoiceRecorder(4), //智能录音笔 + + /// 智能眼镜 + /// @Description 智能眼镜 + /// @example + smartEye(5); //智能眼镜 + + /// 构造函数 + const DeviceType(this.value); + + /// 设备类型对应的整数值 + final int value; +} diff --git a/lib/modules/home/controllers/home_controller.dart b/lib/modules/home/controllers/home_controller.dart index 378dfc6ea..518726b18 100644 --- a/lib/modules/home/controllers/home_controller.dart +++ b/lib/modules/home/controllers/home_controller.dart @@ -8,6 +8,8 @@ import 'package:flutter/material.dart'; import '../../../data/services/bluetooth_manager.dart'; import '../../../data/services/ble_manager.dart'; import '../../../data/services/ota_check_service.dart'; +import '../../../data/models/appconfig.dart'; +import '../../../data/models/appconfig_model.dart'; /// 连接状态枚举 enum ConnectionStatus { @@ -328,6 +330,47 @@ class HomeController extends GetxController { return isCharging ? 'charging'.tr : 'notCharging'.tr; } + /// 获取当前设备类型 + /// 返回设备类型,如果无法获取则返回未知类型 + DeviceType getCurrentDeviceType() { + try { + final deviceName = getDeviceName(); + if (deviceName == 'unknownEquipment'.tr) { + return DeviceType.unknown; + } + + // 通过AppConfig获取产品信息 + final product = AppConfig.getproduct(deviceName); + if (product != null) { + // 根据产品的devicetype字段返回对应的DeviceType + switch (product.devicetype) { + case 1: + return DeviceType.classicBluetoothHeadset; + case 2: + return DeviceType.bleBluetoothDoubleHeadset; + case 3: + return DeviceType.bleBluetoothSingleHeadset; + case 4: + return DeviceType.smartVoiceRecorder; + case 5: + return DeviceType.smartEye; + default: + return DeviceType.unknown; + } + } + + return DeviceType.unknown; + } catch (e) { + Logger.e(_tag, '获取设备类型失败: $e'); + return DeviceType.unknown; + } + } + + /// 判断当前设备是否为单端耳机 + bool isSingleHeadset() { + return getCurrentDeviceType() == DeviceType.bleBluetoothSingleHeadset; + } + String getVersionText() { return deviceInfo.value?.firmwareVersion.isNotEmpty == true ? deviceInfo.value!.firmwareVersion diff --git a/lib/modules/home/views/home_view.dart b/lib/modules/home/views/home_view.dart index b66b7989d..440db691a 100644 --- a/lib/modules/home/views/home_view.dart +++ b/lib/modules/home/views/home_view.dart @@ -462,6 +462,9 @@ class HomeView extends GetView { final shouldShowCase = caseBattery.value > 0 && controller.isFullyConnectedRx.value; + // 判断是否为单端耳机 + final isSingleHeadset = controller.isSingleHeadset(); + // 使用更紧凑的布局 return Container( padding: EdgeInsets.symmetric(vertical: 8.h, horizontal: 4.w), @@ -472,28 +475,43 @@ class HomeView extends GetView { child: Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ - // 左耳机 - _buildCompactBatteryItem( - label: 'left'.tr, // 左 - batteryLevel: leftBattery.value, - isCharging: leftEarCharging.value, - isDarkMode: isDarkMode, - ), + // 单端耳机只显示一个电池信息(优先显示左耳,如果左耳电量为0则显示右耳) + if (isSingleHeadset) ...[ + _buildCompactBatteryItem( + label: 'deviceTypeBleBluetoothHeadset'.tr, + batteryLevel: (leftBattery.value > 0 || rightBattery.value == 0) + ? leftBattery.value + : rightBattery.value, + isCharging: (leftBattery.value > 0 || rightBattery.value == 0) + ? leftEarCharging.value + : rightEarCharging.value, + isDarkMode: isDarkMode, + ), + ] else ...[ + // 双端耳机显示左右两个电池信息 + // 左耳机 + _buildCompactBatteryItem( + label: 'left'.tr, // 左 + batteryLevel: leftBattery.value, + isCharging: leftEarCharging.value, + isDarkMode: isDarkMode, + ), - // 分隔线 - Container( - height: 30.h, - width: 1, - color: isDarkMode ? Colors.grey[800] : Colors.grey[300], - ), + // 分隔线 + Container( + height: 30.h, + width: 1, + color: isDarkMode ? Colors.grey[800] : Colors.grey[300], + ), - // 右耳机 - _buildCompactBatteryItem( - label: 'right'.tr, // 右 - batteryLevel: rightBattery.value, - isCharging: rightEarCharging.value, - isDarkMode: isDarkMode, - ), + // 右耳机 + _buildCompactBatteryItem( + label: 'right'.tr, // 右 + batteryLevel: rightBattery.value, + isCharging: rightEarCharging.value, + isDarkMode: isDarkMode, + ), + ], // 只有在充电盒电量大于0且设备已连接时才显示充电盒 if (shouldShowCase) ...[ diff --git a/lib/modules/ota_upgrade/controllers/ota_core_contropller.dart b/lib/modules/ota_upgrade/controllers/ota_core_contropller.dart index 5692515e2..be75315b0 100644 --- a/lib/modules/ota_upgrade/controllers/ota_core_contropller.dart +++ b/lib/modules/ota_upgrade/controllers/ota_core_contropller.dart @@ -288,19 +288,51 @@ class OtaCoreService { throw "获取设备信息失败,请检查连接"; } - // 验证固件版本格式 - final firmwareParts = deviceInfo.firmwareVersion.split('.'); - final firstPart = firmwareParts.sublist(0, 3).join('.'); - final secondPart = firmwareParts.sublist(3).join('.'); + // 获取产品信息以确定设备类型 + DBProduct? product = AppConfig.getproduct("DeapSound"); + if (product == null) { + throw "无法获取产品信息"; + } - Logger().d("firstPart: $firstPart, secondPart: $secondPart"); + // 根据设备类型进行不同的版本校验 + String currentVersion; + if (product.devicetype == DeviceType.bleBluetoothSingleHeadset.value) { + // 单端耳机:固件版本只有三位数(如:1.2.3) + final firmwareParts = deviceInfo.firmwareVersion.split('.'); + if (firmwareParts.length < 3) { + throw "单端耳机固件版本格式错误:${deviceInfo.firmwareVersion},应为三位数格式(如:1.2.3)"; + } + currentVersion = firmwareParts.sublist(0, 3).join('.'); + Logger().d("单端耳机版本: $currentVersion"); + } else if (product.devicetype == + DeviceType.bleBluetoothDoubleHeadset.value) { + // 双端耳机:固件版本有六位数(如:1.2.3.1.2.3) + final firmwareParts = deviceInfo.firmwareVersion.split('.'); + if (firmwareParts.length < 6) { + throw "双端耳机固件版本格式错误:${deviceInfo.firmwareVersion},应为六位数格式(如:1.2.3.1.2.3)"; + } + final firstPart = firmwareParts.sublist(0, 3).join('.'); + final secondPart = firmwareParts.sublist(3, 6).join('.'); + + Logger().d("双端耳机版本 - firstPart: $firstPart, secondPart: $secondPart"); - if (firstPart != secondPart) { - throw "固件版本格式错误:${deviceInfo.firmwareVersion}"; + if (firstPart != secondPart) { + throw "双端耳机固件版本格式错误:${deviceInfo.firmwareVersion},前三位和后三位应该相同"; + } + currentVersion = firstPart; + } else { + // 其他设备类型,使用原有逻辑 + final firmwareParts = deviceInfo.firmwareVersion.split('.'); + if (firmwareParts.length >= 3) { + currentVersion = firmwareParts.sublist(0, 3).join('.'); + } else { + currentVersion = deviceInfo.firmwareVersion; + } + Logger().d("其他设备类型版本: $currentVersion"); } return { - 'currentVersion': firstPart, + 'currentVersion': currentVersion, 'productId': deviceInfo.firmwareProductId, 'deviceInfo': deviceInfo, }; diff --git a/lib/modules/translation/controllers/translation_audiohistory_controller.dart b/lib/modules/translation/controllers/translation_audiohistory_controller.dart index f1d157c72..f37d2a39e 100644 --- a/lib/modules/translation/controllers/translation_audiohistory_controller.dart +++ b/lib/modules/translation/controllers/translation_audiohistory_controller.dart @@ -6,6 +6,7 @@ import 'dart:async'; import '../models/translation_models.dart'; // 添加异步支持 +//音频历史管理 class TranslationAudioHistoryController extends GetxController { // 引用主翻译控制器,以访问历史记录数据 final TranslationController translationController = diff --git a/lib/modules/translation/controllers/translation_controller.dart b/lib/modules/translation/controllers/translation_controller.dart index f20d097ac..9b54119e4 100644 --- a/lib/modules/translation/controllers/translation_controller.dart +++ b/lib/modules/translation/controllers/translation_controller.dart @@ -1,9 +1,8 @@ import 'dart:io'; +import 'dart:async'; -import '../../../core/utils/permission_util.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import 'dart:async'; import 'package:get_storage/get_storage.dart'; import 'package:intl/intl.dart'; import 'package:path_provider/path_provider.dart'; @@ -16,6 +15,7 @@ import '../../../data/services/volcano_translation_service.dart'; import '../../../data/services/tts_service.dart'; import '../../../data/services/language_manager.dart'; import '../../../core/utils/logger.dart'; +import '../../../core/utils/permission_util.dart'; import '../../../data/services/asr_service.dart'; import '../../../data/services/translation_usage_service.dart'; @@ -31,7 +31,7 @@ enum AudioOutputDevice { speaker, // 强制扬声器 } -/// 翻译控制器 - 负责管理语音识别、翻译和TTS功能 +/// 翻译控制器 - 负责管理语音识别、翻译和TTS功能(主控制器) class TranslationController extends GetxController with WidgetsBindingObserver { static const String TAG = 'TranslationController'; diff --git a/lib/modules/translation/controllers/translation_detail_controller.dart b/lib/modules/translation/controllers/translation_detail_controller.dart index ee283b514..fd3239f0d 100644 --- a/lib/modules/translation/controllers/translation_detail_controller.dart +++ b/lib/modules/translation/controllers/translation_detail_controller.dart @@ -9,6 +9,7 @@ import 'dart:async'; import '../../../core/utils/logger.dart'; import '../../../data/services/translation_usage_service.dart'; +//详情页管理 class TranslationDetailController extends GetxController { // 依赖注入 final VolcanoAIService _aiService = Get.find(); diff --git a/lib/modules/translation/controllers/translation_list_controller.dart b/lib/modules/translation/controllers/translation_list_controller.dart index 45a50f8d8..45181b869 100644 --- a/lib/modules/translation/controllers/translation_list_controller.dart +++ b/lib/modules/translation/controllers/translation_list_controller.dart @@ -10,6 +10,7 @@ import '../../../core/utils/permission_util.dart'; import 'package:share_plus/share_plus.dart'; +//列表页管理 class TranslationListController extends GetxController { // 是否还有更多数据 bool isGetMore = true; diff --git a/lib/modules/translation/views/translation_history_view.dart b/lib/modules/translation/views/translation_history_view.dart index 54300a92d..70a0c67fe 100644 --- a/lib/modules/translation/views/translation_history_view.dart +++ b/lib/modules/translation/views/translation_history_view.dart @@ -10,6 +10,7 @@ import 'translation_detail_view.dart'; import '../../../core/theme/app_colors.dart'; import '../../../data/services/language_manager.dart'; +//历史记录页面 class TranslationHistoryView extends GetView { const TranslationHistoryView({Key? key}) : super(key: key); diff --git a/lib/modules/translation/views/translation_view.dart b/lib/modules/translation/views/translation_view.dart index a27210718..3c1176909 100644 --- a/lib/modules/translation/views/translation_view.dart +++ b/lib/modules/translation/views/translation_view.dart @@ -12,6 +12,7 @@ import '../../../core/theme/app_colors.dart'; import '../../../routes/app_routes.dart'; // import 'package:intl/intl.dart'; +//主页面 class TranslationView extends GetView { const TranslationView({Key? key}) : super(key: key);