|
|
|
@ -16,20 +16,16 @@ enum ConnectionStatus { |
|
|
|
|
|
|
|
/// 主页控制器,管理设备连接状态和信息展示 |
|
|
|
class HomeController extends GetxController { |
|
|
|
static const String _tag = 'HomeCtrl'; |
|
|
|
static HomeController get to => Get.find(); |
|
|
|
|
|
|
|
// 连接状态相关 |
|
|
|
final _connectionStatus = ConnectionStatus.disconnected.obs; |
|
|
|
final _connectionErrorMsg = ''.obs; |
|
|
|
final _bluetoothState = 'unknown'.obs; |
|
|
|
|
|
|
|
final _isFullyConnected = false.obs; |
|
|
|
|
|
|
|
// Getter方法 |
|
|
|
ConnectionStatus get connectionStatus => _connectionStatus.value; |
|
|
|
String get connectionErrorMsg => _connectionErrorMsg.value; |
|
|
|
String get bluetoothState => _bluetoothState.value; |
|
|
|
bool get isFullyConnected => _isFullyConnected.value; |
|
|
|
BluetoothDevice? get currentDevice => _bluetoothManager.currentDevice; |
|
|
|
Rx<DeviceInfo?> get deviceInfo => _bleManager.deviceInfo; |
|
|
|
bool get isConnected => currentDevice != null; |
|
|
|
|
|
|
|
// 设备详细信息的getter,从deviceInfo获取数据 |
|
|
|
final leftEarBattery = 0.obs; |
|
|
|
@ -60,8 +56,8 @@ class HomeController extends GetxController { |
|
|
|
|
|
|
|
// 监听和订阅 |
|
|
|
Worker? _deviceInfoWorker; |
|
|
|
Worker? _bluetoothStateWorker; |
|
|
|
Worker? _deviceWorker; |
|
|
|
Worker? _classicBluetoothWorker; |
|
|
|
Worker? _bleConnectionWorker; |
|
|
|
|
|
|
|
// 蓝牙服务 |
|
|
|
final _bluetoothManager = Get.find<BluetoothManager>(); |
|
|
|
@ -75,112 +71,49 @@ class HomeController extends GetxController { |
|
|
|
@override |
|
|
|
void onClose() { |
|
|
|
_deviceInfoWorker?.dispose(); |
|
|
|
_bluetoothStateWorker?.dispose(); |
|
|
|
_deviceWorker?.dispose(); |
|
|
|
_classicBluetoothWorker?.dispose(); |
|
|
|
_bleConnectionWorker?.dispose(); |
|
|
|
super.onClose(); |
|
|
|
} |
|
|
|
|
|
|
|
/// 使用缓存的蓝牙设备信息初始化 |
|
|
|
/// 初始化 |
|
|
|
void _initWithCachedInfo() { |
|
|
|
// 使用蓝牙服务中的当前状态 |
|
|
|
_bluetoothState.value = _bluetoothManager.bluetoothState; |
|
|
|
|
|
|
|
// 根据当前设备状态设置连接状态 |
|
|
|
if (currentDevice != null) { |
|
|
|
_connectionStatus.value = ConnectionStatus.connected; |
|
|
|
_connectionErrorMsg.value = ''; |
|
|
|
updateDeviceInfo(_bleManager.deviceInfo.value); |
|
|
|
Logger.info('主页加载缓存设备信息: ${currentDevice!.name}'); |
|
|
|
} else { |
|
|
|
_connectionStatus.value = ConnectionStatus.disconnected; |
|
|
|
if (_bluetoothState.value == 'off') { |
|
|
|
_connectionErrorMsg.value = '蓝牙未开启'; |
|
|
|
} else { |
|
|
|
_connectionErrorMsg.value = '未连接到设备'; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 设置监听器监听蓝牙服务状态变化 |
|
|
|
// 设置监听器 |
|
|
|
_setupStateListeners(); |
|
|
|
|
|
|
|
// 在初始化时自动触发一次刷新设备连接状态 |
|
|
|
refreshDeviceConnection(); |
|
|
|
|
|
|
|
// 延迟检查初始连接状态,确保监听器已经设置 |
|
|
|
Future.delayed(const Duration(milliseconds: 100), () { |
|
|
|
_checkConnectionStatus(); |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
/// 设置状态监听器 |
|
|
|
void _setupStateListeners() { |
|
|
|
// 设备信息监听 - 设备信息更新时自动触发UI更新 |
|
|
|
// 设备信息监听 |
|
|
|
_deviceInfoWorker = ever(_bleManager.deviceInfo, (DeviceInfo? info) { |
|
|
|
Logger.info('设备信息监听'); |
|
|
|
if (info != null) { |
|
|
|
Logger.info('主页更新设备信息: ${info.toString()}'); |
|
|
|
Logger.d(_tag, '更新设备信息: ${info.toString()}'); |
|
|
|
updateDeviceInfo(info); |
|
|
|
} else { |
|
|
|
Logger.info('主页清空设备信息'); |
|
|
|
} |
|
|
|
|
|
|
|
update(); |
|
|
|
}); |
|
|
|
|
|
|
|
// 蓝牙状态监听 |
|
|
|
_bluetoothStateWorker = |
|
|
|
ever(_bluetoothManager.bluetoothState.obs, (String state) { |
|
|
|
_bluetoothState.value = state; |
|
|
|
|
|
|
|
// 如果蓝牙关闭,更新错误信息 |
|
|
|
if (state == 'off') { |
|
|
|
_connectionErrorMsg.value = '蓝牙未开启'; |
|
|
|
_connectionStatus.value = ConnectionStatus.disconnected; |
|
|
|
} |
|
|
|
|
|
|
|
update(); |
|
|
|
// 经典蓝牙连接监听 |
|
|
|
_classicBluetoothWorker = ever(_bluetoothManager.currentDeviceRx, (BluetoothDevice? device) { |
|
|
|
Logger.d(_tag, '经典蓝牙: ${device != null ? "已连接" : "已断开"}'); |
|
|
|
_checkConnectionStatus(); |
|
|
|
}); |
|
|
|
|
|
|
|
// 设备连接状态监听 - 直接监听设备变化 |
|
|
|
_deviceWorker = |
|
|
|
ever(_bluetoothManager.currentDeviceRx, (BluetoothDevice? device) { |
|
|
|
if (device != null) { |
|
|
|
// 设备已连接 |
|
|
|
if (_connectionStatus.value != ConnectionStatus.connected) { |
|
|
|
_connectionStatus.value = ConnectionStatus.connected; |
|
|
|
_connectionErrorMsg.value = ''; |
|
|
|
Logger.info('主页检测到设备已连接: ${device.name}'); |
|
|
|
} |
|
|
|
} else if (_connectionStatus.value == ConnectionStatus.connected) { |
|
|
|
// 设备已断开 |
|
|
|
_connectionStatus.value = ConnectionStatus.disconnected; |
|
|
|
_connectionErrorMsg.value = '设备已断开连接'; |
|
|
|
|
|
|
|
Logger.info('主页检测到设备已断开连接'); |
|
|
|
} |
|
|
|
|
|
|
|
update(); |
|
|
|
|
|
|
|
// BLE连接监听 |
|
|
|
_bleConnectionWorker = ever(_bleManager.connectionStateRx, (int state) { |
|
|
|
Logger.d(_tag, 'BLE状态变化: $state (${state == 2 ? "已连接" : "未连接"})'); |
|
|
|
_checkConnectionStatus(); |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
/// 刷新设备连接状态 |
|
|
|
/// 注意:此方法不会主动刷新设备,只更新UI状态 |
|
|
|
Future<void> refreshDeviceConnection() async { |
|
|
|
// 更新当前状态以反映UI变化 |
|
|
|
bool hasDevice = currentDevice != null; |
|
|
|
|
|
|
|
if (hasDevice) { |
|
|
|
_connectionStatus.value = ConnectionStatus.connected; |
|
|
|
_connectionErrorMsg.value = ''; |
|
|
|
await _bleManager.fetchDeviceInfo(); |
|
|
|
|
|
|
|
Logger.info('使用缓存设备信息: ${currentDevice!.name}'); |
|
|
|
} else { |
|
|
|
if (_bluetoothState.value == 'off') { |
|
|
|
_connectionErrorMsg.value = '蓝牙未开启'; |
|
|
|
} else { |
|
|
|
_connectionErrorMsg.value = '未连接到设备'; |
|
|
|
} |
|
|
|
_connectionStatus.value = ConnectionStatus.disconnected; |
|
|
|
} |
|
|
|
|
|
|
|
// 刷新UI |
|
|
|
update(); |
|
|
|
_checkConnectionStatus(); |
|
|
|
} |
|
|
|
|
|
|
|
// 导航和功能方法 |
|
|
|
@ -201,41 +134,56 @@ class HomeController extends GetxController { |
|
|
|
} |
|
|
|
|
|
|
|
// UI辅助方法 |
|
|
|
|
|
|
|
/// 检查连接状态 |
|
|
|
void _checkConnectionStatus() { |
|
|
|
// 直接检查,不使用延迟 |
|
|
|
bool hasClassicBluetooth = currentDevice != null; |
|
|
|
bool hasBleConnection = _bleManager.connectionState == 2; // 直接检查状态值,2 = connected |
|
|
|
|
|
|
|
Logger.d(_tag, '连接状态检查: 经典蓝牙=$hasClassicBluetooth, BLE=$hasBleConnection (状态值=${_bleManager.connectionState})'); |
|
|
|
|
|
|
|
bool wasConnected = _isFullyConnected.value; |
|
|
|
bool isNowConnected = hasClassicBluetooth && hasBleConnection; |
|
|
|
|
|
|
|
// 只有状态真正改变时才更新 |
|
|
|
if (_isFullyConnected.value != isNowConnected) { |
|
|
|
// 先更新状态 |
|
|
|
_isFullyConnected.value = isNowConnected; |
|
|
|
Logger.d(_tag, '连接状态变更: ${wasConnected ? "已连接" : "未连接"} -> ${isNowConnected ? "已连接" : "未连接"}'); |
|
|
|
|
|
|
|
// 强制触发响应式更新 |
|
|
|
_isFullyConnected.refresh(); |
|
|
|
|
|
|
|
// 如果从未连接变为连接,主动获取耳机信息 |
|
|
|
if (!wasConnected && isNowConnected) { |
|
|
|
Logger.d(_tag, '设备连接成功,获取耳机信息'); |
|
|
|
_bleManager.fetchDeviceInfo(); |
|
|
|
} |
|
|
|
|
|
|
|
// 延迟一帧后再次刷新,确保UI更新 |
|
|
|
Future.delayed(Duration.zero, () { |
|
|
|
update(); |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
// 总是调用update确保UI刷新 |
|
|
|
update(); |
|
|
|
} |
|
|
|
|
|
|
|
/// 获取连接状态对应的颜色 |
|
|
|
Color getConnectionStatusColor() { |
|
|
|
switch (_connectionStatus.value) { |
|
|
|
case ConnectionStatus.connected: |
|
|
|
return Colors.green; |
|
|
|
case ConnectionStatus.connecting: |
|
|
|
return Colors.amber; |
|
|
|
case ConnectionStatus.failed: |
|
|
|
return Colors.red; |
|
|
|
case ConnectionStatus.disconnected: |
|
|
|
default: |
|
|
|
return Colors.grey; |
|
|
|
} |
|
|
|
return _isFullyConnected.value ? Colors.green : Colors.grey; |
|
|
|
} |
|
|
|
|
|
|
|
/// 获取连接状态对应的文本 |
|
|
|
String getConnectionStatusText() { |
|
|
|
if (bluetoothState == 'off') { |
|
|
|
return 'bluetoothOff'.tr; |
|
|
|
} |
|
|
|
|
|
|
|
switch (_connectionStatus.value) { |
|
|
|
case ConnectionStatus.connected: |
|
|
|
return 'connected'.tr; |
|
|
|
case ConnectionStatus.connecting: |
|
|
|
return 'connecting'.tr; |
|
|
|
case ConnectionStatus.failed: |
|
|
|
return 'connectionFailure'.tr; |
|
|
|
case ConnectionStatus.disconnected: |
|
|
|
default: |
|
|
|
return 'unconnected'.tr; |
|
|
|
} |
|
|
|
return _isFullyConnected.value ? 'connected'.tr : 'unconnected'.tr; |
|
|
|
} |
|
|
|
|
|
|
|
/// 判断是否应该显示设备信息(即使未完全连接) |
|
|
|
bool get shouldShowDeviceInfo => currentDevice != null; |
|
|
|
|
|
|
|
/// 获取设备名称 |
|
|
|
String getDeviceName() { |
|
|
|
return currentDevice?.name ?? 'unknownEquipment'.tr; |
|
|
|
@ -243,7 +191,7 @@ class HomeController extends GetxController { |
|
|
|
|
|
|
|
/// 获取信号强度(模拟数据) |
|
|
|
String getSignalStrength() { |
|
|
|
if (!isConnected) { |
|
|
|
if (!_isFullyConnected.value) { |
|
|
|
return 'zeroSignal'.tr; |
|
|
|
} |
|
|
|
|
|
|
|
|