- 实现BLE OTA数据路径分离:添加ble_ota_data.cpp处理重排序/工作线程/DATA_IN, 和ble_ota_host.cpp处理GATT/GAP/广播/主机功能 - 将滑动ACK窗口从32增大到64,实测Windows WebBT环境下固件传输速度提升约10% (从40KB/s提升到44KB/s),内存消耗约30KB重排序缓冲区 - 优化调试日志级别,将OTA相关信息从INFO调整为DBG以减少日志冗余 refactor(can): 改进CAN反馈监听机制 - 将CAN反馈任务从1Hz主动轮询模式改为被动事件监听模式, 使用SpiMaster::takeEvent()替代主动发送0xC1轮询请求 - 更新相关头文件注释说明架构变更,将"周期性轮询"改为"被动接收推送" - 修改调试日志级别,将暂停/恢复状态日志从INFO调整为DBG
3.8 KiB
3.8 KiB
优化 toast.js + polling.js(不改用户可见行为,不破坏时序)
A. tools/js/common/toast.js
- 空值保护:
showToast开头加var toast = document.getElementById('toast'); if (!toast) return;,避免 toast 元素未挂载时调用方崩。其余toastIco/toastMsg用var ico = ...; var msg = ...;取出后判空再用。 info类型语义化:保持视觉与现状一致,但修正注释。文件头注释从「支持 info / success / warning / error」改为如实描述「支持 success / error / warning(info 等同 warning)」,避免注释误导。不新增 CSS(无 caller 用 info,引入新色只会造成不一致)。
B. tools/js/common/polling.js
pollLogs改递归setTimeout+ 在途保护(修复 socket 抢占):- 新增模块级
logsInFlight标志和logsTimerId(已有)。 - 抽出
scheduleLogsPoll(delayMs)(仿scheduleStatusPoll)。 pollLogs体内首行if (logsInFlight) return;;finally内logsInFlight=false+scheduleLogsPoll(statusPollIntervalMs)。startPolling/resumePollingAfterUpload/visibilitychange改为scheduleLogsPoll(0)或保留pollLogs()直接触发(in-flight 守卫会跳过重叠)。- 注意:
stages.js、upload-gd32.js的手动window.pollLogs()调用保持不变,in-flight 守卫下若正飞则跳过、由下一轮定时补上,行为安全。
- 新增模块级
C. tools/js/app.js
- 新增
applyDeviceBusyRuntimeState(text)helper(放在applyUploadingRuntimeState之后,第 148 行后):- 仿现有三兄弟的 DOM 模式:
#pillConn/#pillConnTxt/#connStatus/#connStatusTxt/#bConn。 - 第 225 行后追加
window.applyDeviceBusyRuntimeState = applyDeviceBusyRuntimeState;。
- 仿现有三兄弟的 DOM 模式:
D. 改动后行为一致性自检(写进 commit message,不写测试)
- 暂停上传:
pollStatus.finally不再重挂轮询 → 修正竞态,符合既有注释意图。 pollLogs重叠:被 in-flight 守卫挡掉 → 减少与/ota/upload抢 socket,符合既有pollStatus的设计意图。- 重启恢复:两处统一走
markEsp32RebootComplete,重复 toast/log 由isEsp32Rebooting幂等守卫消除。 - 设备忙 UI:从 polling.js 内联 DOM 改为调 helper,视觉完全一致(同样的 class、同样的文案)。
- toast
info:视觉不变(仍为 warn 色),仅注释修正。
不做的事
- 不改后端协议、不改
/system/status、/logsURL 或请求字段。 - 不改
pollStatus的成功分支业务逻辑(重启恢复仅抽出函数,条件不变)。 - 不新增 toast CSS / 不引入
info专属配色。 - 不动
connection.js、log.js、ota/*、stages.js、upload-gd32.js(仅 app.js 加一个 helper)。 - 不改
scheduleStatusPoll公共签名、不改导出列表。
验证
git diff人工核对 polling.js 重构后两处重启恢复分支与原逻辑逐行等价。- 浏览器加载
tools/index.html,走一遍 ESP32 OTA(上传→中继→重启→恢复),确认:- 上传期间无
/system/status请求(DevTools Network)。 /logs不出现重叠并发请求。- 重启恢复只弹一次「ESP32 已恢复在线」。
- 设备忙时连接胶囊显示「设备忙」,与改前一致。
- 上传期间无
- 跑一次 GD32 OTA(中继期 400ms 轮询),确认
setStatusPollIntervalMs路径未受影响。 - 无单元测试框架,不新增测试。
影响面
- 修改文件:
tools/js/common/toast.js、tools/js/common/polling.js、tools/js/app.js(仅 +1 helper + 1 window 挂载)。 - 风险点:
pollLogs改递归 setTimeout 后,若某轮抛出未走 finally 会停转——pollLogs全程try/catch/finally,与pollStatus同模式,风险等价。