refactor(main): 移除ota_mutex.h全局变量并重构ESP32 OTA互斥锁管理

- 将全局变量g_esp32OtaMutex和g_esp32OtaOccupied内聚到Esp32OtaCore类中
- 通过Esp32OtaCore::initMutex()方法初始化互斥锁替代原main.cpp中的全局初始化
- 重构HealthMonitor中WiFi连接状态管理,推送连接状态到本地成员而非直接查询
- 优化OtaCoordinator中const方法的线程安全实现,移除不必要的const_cast转换
- 封装OtaRelay的队列访问器,提供getDispatchQueue()和getResultQueue()方法
- 解决BLE与WiFi之间的横向耦合问题,通过OtaCoordinator进行射频共存管理
- 移除transport/spi_master.cpp中的CANFD接口实现到独立的canfd_bridge模块
- 优化BLE OTA中ESP32会话的幂等性和新会话处理逻辑

BREAKING CHANGE: 移除了ota_mutex.h全局头文件,相关功能迁移至Esp32OtaCore类中管理
This commit is contained in:
小龙虾
2026-06-22 01:53:16 +08:00
parent 00ce8dbbb5
commit 1491e9a3de
23 changed files with 598 additions and 290 deletions
+23
View File
@@ -1444,6 +1444,23 @@
bleLog('OTA', `写入失败: ${err.message}`, 'E');
setProgress(0, `写入失败: ${err.message}`);
setBleStageError(err.message);
// ★ BLE OTA 失败/中止后强制断开 BLE 连接,并等待实际断连完成:
// 触发 ESP32 后端的 GAP disconnect 处理器 → ble_esp32_ota_abort(),
// 清理 OTA 会话(Esp32OtaCore::abort + reorder buffer 释放 + 协调器状态复位)。
// 等待 gattserverdisconnected 事件确保断连真正生效,避免用户快速重试时
// 旧会话尚未清理导致 seq=0 被误判为重传。
if (state.server && state.device && state.device.gatt && state.device.gatt.connected) {
bleLog('OTA', '刷写失败,断开 BLE 以清理 ESP32 OTA 会话...', 'W');
try {
await new Promise((resolve) => {
let done = false;
const finish = () => { if (!done) { done = true; resolve(); } };
state.device.addEventListener('gattserverdisconnected', finish, { once: true });
setTimeout(finish, 1000); // 1 秒兜底超时
state.device.gatt.disconnect();
});
} catch (_) {}
}
return false;
} finally {
if (state.ackWaiter) {
@@ -1495,6 +1512,12 @@
const ok = await uploadFirmware();
if (!ok || state.abortRequested) {
bleLog('AUTO', '一键刷写中止', 'W');
// ★ 确保 BLE 已断开(触发 ESP32 OTA 会话清理)
// uploadFirmware catch 块已尝试断开,这里做安全网兜底
if (state.device && state.device.gatt && state.device.gatt.connected) {
bleLog('AUTO', '断开 BLE 以清理 ESP32 OTA 会话...', 'W');
try { state.device.gatt.disconnect(); } catch (_) {}
}
return;
}
if (cfg.label === 'ESP32') {