Browse Source

feat(设备管理): 添加设备类型枚举并实现单双端耳机差异化处理

添加DeviceType枚举定义设备类型
在HomeController中添加设备类型判断方法
根据设备类型在OTA升级和电池显示中实现差异化处理
newdev_shunjiawei
lxm 1 year ago
parent
commit
5cb728e525
  1. 39
      lib/data/models/appconfig_model.dart
  2. 43
      lib/modules/home/controllers/home_controller.dart
  3. 58
      lib/modules/home/views/home_view.dart
  4. 48
      lib/modules/ota_upgrade/controllers/ota_core_contropller.dart
  5. 1
      lib/modules/translation/controllers/translation_audiohistory_controller.dart
  6. 6
      lib/modules/translation/controllers/translation_controller.dart
  7. 1
      lib/modules/translation/controllers/translation_detail_controller.dart
  8. 1
      lib/modules/translation/controllers/translation_list_controller.dart
  9. 1
      lib/modules/translation/views/translation_history_view.dart
  10. 1
      lib/modules/translation/views/translation_view.dart

39
lib/data/models/appconfig_model.dart

@ -95,3 +95,42 @@ class DBProduct {
_$DBProductFromJson(json); _$DBProductFromJson(json);
Map<String, dynamic> toJson() => _$DBProductToJson(this); Map<String, dynamic> 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;
}

43
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/bluetooth_manager.dart';
import '../../../data/services/ble_manager.dart'; import '../../../data/services/ble_manager.dart';
import '../../../data/services/ota_check_service.dart'; import '../../../data/services/ota_check_service.dart';
import '../../../data/models/appconfig.dart';
import '../../../data/models/appconfig_model.dart';
/// 连接状态枚举 /// 连接状态枚举
enum ConnectionStatus { enum ConnectionStatus {
@ -328,6 +330,47 @@ class HomeController extends GetxController {
return isCharging ? 'charging'.tr : 'notCharging'.tr; 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() { String getVersionText() {
return deviceInfo.value?.firmwareVersion.isNotEmpty == true return deviceInfo.value?.firmwareVersion.isNotEmpty == true
? deviceInfo.value!.firmwareVersion ? deviceInfo.value!.firmwareVersion

58
lib/modules/home/views/home_view.dart

@ -462,6 +462,9 @@ class HomeView extends GetView<HomeController> {
final shouldShowCase = final shouldShowCase =
caseBattery.value > 0 && controller.isFullyConnectedRx.value; caseBattery.value > 0 && controller.isFullyConnectedRx.value;
// 判断是否为单端耳机
final isSingleHeadset = controller.isSingleHeadset();
// 使用更紧凑的布局 // 使用更紧凑的布局
return Container( return Container(
padding: EdgeInsets.symmetric(vertical: 8.h, horizontal: 4.w), padding: EdgeInsets.symmetric(vertical: 8.h, horizontal: 4.w),
@ -472,28 +475,43 @@ class HomeView extends GetView<HomeController> {
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly, mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [ children: [
// 左耳机 // 单端耳机只显示一个电池信息(优先显示左耳,如果左耳电量为0则显示右耳)
_buildCompactBatteryItem( if (isSingleHeadset) ...[
label: 'left'.tr, // 左 _buildCompactBatteryItem(
batteryLevel: leftBattery.value, label: 'deviceTypeBleBluetoothHeadset'.tr,
isCharging: leftEarCharging.value, batteryLevel: (leftBattery.value > 0 || rightBattery.value == 0)
isDarkMode: isDarkMode, ? 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( Container(
height: 30.h, height: 30.h,
width: 1, width: 1,
color: isDarkMode ? Colors.grey[800] : Colors.grey[300], color: isDarkMode ? Colors.grey[800] : Colors.grey[300],
), ),
// 右耳机 // 右耳机
_buildCompactBatteryItem( _buildCompactBatteryItem(
label: 'right'.tr, // 右 label: 'right'.tr, // 右
batteryLevel: rightBattery.value, batteryLevel: rightBattery.value,
isCharging: rightEarCharging.value, isCharging: rightEarCharging.value,
isDarkMode: isDarkMode, isDarkMode: isDarkMode,
), ),
],
// 只有在充电盒电量大于0且设备已连接时才显示充电盒 // 只有在充电盒电量大于0且设备已连接时才显示充电盒
if (shouldShowCase) ...[ if (shouldShowCase) ...[

48
lib/modules/ota_upgrade/controllers/ota_core_contropller.dart

@ -288,19 +288,51 @@ class OtaCoreService {
throw "获取设备信息失败,请检查连接"; throw "获取设备信息失败,请检查连接";
} }
// 验证固件版本格式 // 获取产品信息以确定设备类型
final firmwareParts = deviceInfo.firmwareVersion.split('.'); DBProduct? product = AppConfig.getproduct("DeapSound");
final firstPart = firmwareParts.sublist(0, 3).join('.'); if (product == null) {
final secondPart = firmwareParts.sublist(3).join('.'); 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) { if (firstPart != secondPart) {
throw "固件版本格式错误:${deviceInfo.firmwareVersion}"; 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 { return {
'currentVersion': firstPart, 'currentVersion': currentVersion,
'productId': deviceInfo.firmwareProductId, 'productId': deviceInfo.firmwareProductId,
'deviceInfo': deviceInfo, 'deviceInfo': deviceInfo,
}; };

1
lib/modules/translation/controllers/translation_audiohistory_controller.dart

@ -6,6 +6,7 @@ import 'dart:async';
import '../models/translation_models.dart'; // 添加异步支持 import '../models/translation_models.dart'; // 添加异步支持
//音频历史管理
class TranslationAudioHistoryController extends GetxController { class TranslationAudioHistoryController extends GetxController {
// 引用主翻译控制器,以访问历史记录数据 // 引用主翻译控制器,以访问历史记录数据
final TranslationController translationController = final TranslationController translationController =

6
lib/modules/translation/controllers/translation_controller.dart

@ -1,9 +1,8 @@
import 'dart:io'; import 'dart:io';
import 'dart:async';
import '../../../core/utils/permission_util.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'dart:async';
import 'package:get_storage/get_storage.dart'; import 'package:get_storage/get_storage.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:path_provider/path_provider.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/tts_service.dart';
import '../../../data/services/language_manager.dart'; import '../../../data/services/language_manager.dart';
import '../../../core/utils/logger.dart'; import '../../../core/utils/logger.dart';
import '../../../core/utils/permission_util.dart';
import '../../../data/services/asr_service.dart'; import '../../../data/services/asr_service.dart';
import '../../../data/services/translation_usage_service.dart'; import '../../../data/services/translation_usage_service.dart';
@ -31,7 +31,7 @@ enum AudioOutputDevice {
speaker, // 强制扬声器 speaker, // 强制扬声器
} }
/// 翻译控制器 - 负责管理语音识别、翻译和TTS功能 /// 翻译控制器 - 负责管理语音识别、翻译和TTS功能(主控制器)
class TranslationController extends GetxController with WidgetsBindingObserver { class TranslationController extends GetxController with WidgetsBindingObserver {
static const String TAG = 'TranslationController'; static const String TAG = 'TranslationController';

1
lib/modules/translation/controllers/translation_detail_controller.dart

@ -9,6 +9,7 @@ import 'dart:async';
import '../../../core/utils/logger.dart'; import '../../../core/utils/logger.dart';
import '../../../data/services/translation_usage_service.dart'; import '../../../data/services/translation_usage_service.dart';
//详情页管理
class TranslationDetailController extends GetxController { class TranslationDetailController extends GetxController {
// 依赖注入 // 依赖注入
final VolcanoAIService _aiService = Get.find<VolcanoAIService>(); final VolcanoAIService _aiService = Get.find<VolcanoAIService>();

1
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'; import 'package:share_plus/share_plus.dart';
//列表页管理
class TranslationListController extends GetxController { class TranslationListController extends GetxController {
// 是否还有更多数据 // 是否还有更多数据
bool isGetMore = true; bool isGetMore = true;

1
lib/modules/translation/views/translation_history_view.dart

@ -10,6 +10,7 @@ import 'translation_detail_view.dart';
import '../../../core/theme/app_colors.dart'; import '../../../core/theme/app_colors.dart';
import '../../../data/services/language_manager.dart'; import '../../../data/services/language_manager.dart';
//历史记录页面
class TranslationHistoryView class TranslationHistoryView
extends GetView<TranslationAudioHistoryController> { extends GetView<TranslationAudioHistoryController> {
const TranslationHistoryView({Key? key}) : super(key: key); const TranslationHistoryView({Key? key}) : super(key: key);

1
lib/modules/translation/views/translation_view.dart

@ -12,6 +12,7 @@ import '../../../core/theme/app_colors.dart';
import '../../../routes/app_routes.dart'; import '../../../routes/app_routes.dart';
// import 'package:intl/intl.dart'; // import 'package:intl/intl.dart';
//主页面
class TranslationView extends GetView<TranslationController> { class TranslationView extends GetView<TranslationController> {
const TranslationView({Key? key}) : super(key: key); const TranslationView({Key? key}) : super(key: key);

Loading…
Cancel
Save