You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
299 lines
8.8 KiB
299 lines
8.8 KiB
import 'package:classic_bluetooth/classic_bluetooth.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:get/get.dart';
|
|
import 'package:logger/web.dart';
|
|
import 'package:ota/ota.dart';
|
|
import '../../../data/services/ble_manager.dart';
|
|
import 'ota_core_contropller.dart';
|
|
import 'ota_download_contropller.dart';
|
|
import '../views/ota_upgrade_popup_view.dart';
|
|
|
|
/// OTA升级主控制器 - 重构后的简化版本
|
|
/// 负责协调各个服务,管理升级流程的整体状态
|
|
class OtaUpgradeController extends GetxController {
|
|
// 服务依赖 - 使用新的合并后的服务
|
|
final _coreService = OtaCoreService();
|
|
final _downloadService = OtaDownloadService();
|
|
final _uiService = OtaUpgradePopUp();
|
|
final _bleManager = Get.find<BleManager>();
|
|
final _jlota = Ota.instance;
|
|
|
|
// 状态管理
|
|
final RxString errorMessage = ''.obs;
|
|
final RxString latestVersion = ''.obs;
|
|
final RxString currentVersion = ''.obs;
|
|
final RxString detailedStatus = ''.obs;
|
|
final RxString updatedescription = ''.obs;
|
|
final RxDouble downloadProgress = 0.0.obs;
|
|
final RxDouble progress = 0.0.obs;
|
|
final RxInt type = OtaCoreService.NOT_STARTED.obs;
|
|
final RxBool isUpdateAvailable = false.obs;
|
|
final RxBool isDownloading = false.obs;
|
|
final RxBool isUpgrade = false.obs;
|
|
final RxBool isFetchingDeviceInfo = false.obs;
|
|
final RxBool showDetailedStatus = false.obs;
|
|
final RxBool isBleConnected = true.obs;
|
|
|
|
String _address = '';
|
|
String _updatePackageAddress = '';
|
|
|
|
@override
|
|
void onInit() {
|
|
super.onInit();
|
|
_initializeController();
|
|
}
|
|
|
|
@override
|
|
void onClose() {
|
|
_jlota.onOtaClose();
|
|
_bleManager.setEnterOta(false);
|
|
isUpgrade.value = false;
|
|
super.onClose();
|
|
}
|
|
|
|
/// 初始化控制器
|
|
/// 设置事件监听并加载版本信息
|
|
Future<void> _initializeController() async {
|
|
// 首先检查BLE设备连接状态
|
|
if (!_coreService.checkBleConnectionStatus()) {
|
|
//isFetchingDeviceInfo.value = false;
|
|
//errorMessage.value = 'unconnected'.tr;
|
|
isBleConnected.value = false;
|
|
|
|
return;
|
|
}
|
|
_listenToOtaEvents();
|
|
await _loadVersionInfo();
|
|
}
|
|
|
|
/// 加载版本信息
|
|
/// 获取当前设备版本和最新版本信息,检查是否有更新
|
|
Future<void> _loadVersionInfo() async {
|
|
try {
|
|
isFetchingDeviceInfo.value = true;
|
|
errorMessage.value = '';
|
|
|
|
// 获取当前版本信息
|
|
final currentInfo = await _coreService.getCurrentVersionInfo();
|
|
currentVersion.value = currentInfo['currentVersion'];
|
|
|
|
// 获取蓝牙地址
|
|
final connectedDevices = await ClassicBluetooth.getConnectedDevices();
|
|
if (connectedDevices.isNotEmpty) {
|
|
_address = connectedDevices.first.address;
|
|
}
|
|
|
|
// 获取最新版本信息
|
|
final latestInfo = await _coreService.getLatestVersionInfo();
|
|
latestVersion.value = latestInfo['latestVersion'];
|
|
_updatePackageAddress = latestInfo['updatePackageAddress'];
|
|
|
|
// 设置更新描述信息
|
|
updatedescription.value =
|
|
latestInfo['updateDescription'] ?? '本次更新包含性能优化和错误修复。';
|
|
|
|
// 检查是否有更新
|
|
isUpdateAvailable.value = _coreService.isNewVersionAvailable(
|
|
currentVersion.value,
|
|
latestVersion.value,
|
|
);
|
|
} catch (e) {
|
|
_handleError('获取版本信息失败', e.toString());
|
|
} finally {
|
|
isFetchingDeviceInfo.value = false;
|
|
}
|
|
}
|
|
|
|
/// 检查更新
|
|
/// 显示更新确认对话框或错误提示
|
|
Future<void> checkUpdate() async {
|
|
try {
|
|
if (latestVersion.value.isNotEmpty) {
|
|
_uiService.showUpdateDialog(latestVersion.value, _startUpdateProcess);
|
|
} else {
|
|
_uiService.showErrorSnackbar('错误', '获取最新版本信息失败',
|
|
backgroundColor: Colors.orange[800]);
|
|
}
|
|
} catch (e) {
|
|
_uiService.showErrorSnackbar('错误', '获取版本信息失败',
|
|
backgroundColor: Colors.orange[800]);
|
|
}
|
|
}
|
|
|
|
/// 开始更新流程的公共方法
|
|
/// 供视图调用的更新入口点
|
|
Future<void> startUpdate() async {
|
|
await _startUpdateProcess();
|
|
}
|
|
|
|
/// 检查设备状态后开始下载和升级
|
|
Future<void> _startUpdateProcess() async {
|
|
// 检查设备电量
|
|
if (!_coreService.checkBatteryLevel()) {
|
|
return;
|
|
}
|
|
|
|
await _startDownload();
|
|
}
|
|
|
|
/// 开始下载固件
|
|
/// 初始化OTA环境并下载固件包
|
|
Future<void> _startDownload() async {
|
|
try {
|
|
await _bleManager.setEnterOta(true);
|
|
await Future.delayed(const Duration(seconds: 2));
|
|
_jlota.init();
|
|
|
|
isDownloading.value = true;
|
|
showDetailedStatus.value = true;
|
|
type.value = OtaCoreService.DOWNLOADING_UP_FILES;
|
|
|
|
final filePath = await _downloadService.downloadFirmware(
|
|
downloadUrl: _updatePackageAddress,
|
|
onProgress: (progress) {
|
|
downloadProgress.value = progress;
|
|
},
|
|
onStatusUpdate: (status) {
|
|
detailedStatus.value = status;
|
|
},
|
|
);
|
|
|
|
isDownloading.value = false;
|
|
await _startUpgrading(filePath);
|
|
} catch (e) {
|
|
isDownloading.value = false;
|
|
detailedStatus.value = '下载失败,请检查网络连接';
|
|
showDetailedStatus.value = false;
|
|
_handleError('下载失败', e.toString());
|
|
Logger().d('下载失败: $e');
|
|
}
|
|
}
|
|
|
|
/// 开始升级
|
|
/// [filePath] 固件文件路径
|
|
/// 启动OTA升级过程
|
|
Future<void> _startUpgrading(String filePath) async {
|
|
detailedStatus.value = '准备设备连接...';
|
|
await Future.delayed(const Duration(milliseconds: 500));
|
|
detailedStatus.value = '正在连接设备...';
|
|
_jlota.startUpgrading(address: _address, filePath: filePath);
|
|
}
|
|
|
|
/// 停止升级
|
|
/// 关闭OTA连接
|
|
void stopUpgrading() {
|
|
_jlota.onOtaClose();
|
|
}
|
|
|
|
/// 重试连接
|
|
/// 清除错误信息并重新加载版本信息
|
|
void retryConnection() {
|
|
errorMessage.value = '';
|
|
_loadVersionInfo();
|
|
}
|
|
|
|
/// 获取状态描述
|
|
/// [type] 状态类型
|
|
/// 返回对应的状态描述文本
|
|
String getStatusMessage(int type) {
|
|
return OtaCoreService.getStatusMessage(type);
|
|
}
|
|
|
|
/// 监听OTA事件
|
|
/// 设置OTA事件流的监听器
|
|
void _listenToOtaEvents() {
|
|
_jlota.eventStream.listen((event) {
|
|
_handleOtaEvent(event);
|
|
});
|
|
}
|
|
|
|
/// 处理OTA事件
|
|
/// [event] OTA事件对象
|
|
/// 根据不同的事件类型执行相应的处理逻辑
|
|
void _handleOtaEvent(dynamic event) {
|
|
switch (event.event) {
|
|
case 'onProgress':
|
|
if (event.type != null && event.progress != null) {
|
|
progress.value = event.progress!;
|
|
type.value = event.type!;
|
|
isUpgrade.value = true;
|
|
detailedStatus.value =
|
|
'升级进度: ${(event.progress! * 100).toStringAsFixed(1)}%';
|
|
}
|
|
break;
|
|
case 'onStartOTA':
|
|
type.value = OtaCoreService.START_UPGRADING;
|
|
isUpgrade.value = true;
|
|
detailedStatus.value = 'OTA升级已开始...';
|
|
break;
|
|
case 'onStopOTA':
|
|
_handleUpgradeSuccess();
|
|
break;
|
|
case 'onError':
|
|
_handleUpgradeError(event.code);
|
|
break;
|
|
case 'NOCONNECTION':
|
|
_handleConnectionLost();
|
|
break;
|
|
case 'CONNECTION_SUCCESS':
|
|
_handleConnectionSuccess();
|
|
break;
|
|
}
|
|
}
|
|
|
|
/// 处理升级成功
|
|
/// 更新状态并显示成功对话框
|
|
void _handleUpgradeSuccess() {
|
|
type.value = OtaCoreService.UPGRADE_SUCCESS;
|
|
isUpgrade.value = false;
|
|
detailedStatus.value = '升级成功完成';
|
|
showDetailedStatus.value = false;
|
|
|
|
// 更新版本信息
|
|
currentVersion.value = latestVersion.value;
|
|
isUpdateAvailable.value = false;
|
|
|
|
// 显示成功对话框
|
|
_uiService.showUpgradeSuccessDialog();
|
|
}
|
|
|
|
/// 处理升级错误
|
|
/// [errorCode] 错误代码
|
|
/// 更新状态并显示错误提示
|
|
void _handleUpgradeError(dynamic errorCode) {
|
|
type.value = OtaCoreService.UPGRADE_FAILED;
|
|
isUpgrade.value = false;
|
|
detailedStatus.value = '升级失败,错误码:$errorCode';
|
|
showDetailedStatus.value = false;
|
|
_uiService.showErrorSnackbar(
|
|
'升级失败',
|
|
'请检查设备连接或升级包,错误码:$errorCode',
|
|
);
|
|
}
|
|
|
|
/// 处理连接断开
|
|
/// 更新连接状态
|
|
void _handleConnectionLost() {
|
|
type.value = OtaCoreService.CONNECTION_DISCONNECTION;
|
|
isUpgrade.value = false;
|
|
detailedStatus.value = '设备连接断开';
|
|
showDetailedStatus.value = false;
|
|
}
|
|
|
|
/// 处理连接成功
|
|
/// 更新连接状态
|
|
void _handleConnectionSuccess() {
|
|
type.value = OtaCoreService.CONNECTION_SUCCESS;
|
|
isUpgrade.value = true;
|
|
detailedStatus.value = '设备连接成功';
|
|
}
|
|
|
|
/// 统一错误处理
|
|
/// [title] 错误标题
|
|
/// [message] 错误信息
|
|
/// 设置错误状态并显示错误提示
|
|
void _handleError(String title, String message) {
|
|
errorMessage.value = message;
|
|
_uiService.showErrorSnackbar(title, message);
|
|
}
|
|
}
|
|
|