Files
ESP32_COMM/.trae/specs/split-tools-into-modules/tasks.md
T
小龙虾 a47a027178 feat(ota):实现ESP32和GD32的OTA上传流程
- 添加了upload-esp32.js用于处理ESP32的OTA上传,包括文件上传、SHA-256验证和设备重启。
- 引入了upload-gd32.js,用于触发GD32 OTA中继并跟踪中继进度。
- 针对OTA流程,增强了会话管理和错误处理能力。
- 通过在上传过程中显示吐司通知和进度更新,改进了用户反馈。
2026-07-15 12:12:19 +08:00

102 lines
9.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Tasks
## Phase 1: CSS 拆分(无依赖,可独立完成)
- [x] Task 1: 拆分 `style.css` 为 5 个职责文件
- [ ] SubTask 1.1: 创建 `css/base.css`(:root 变量、reset、container、背景纹理,对应原 1~53 行)
- [ ] SubTask 1.2: 创建 `css/layout.css`(header、main-layout、cards、forms、buttons、conn-indicator,对应原 55~210 行)
- [ ] SubTask 1.3: 创建 `css/components.css`(upload-zone、file-info、progress、stage-flow、badges、metrics、heap、log-panel、toast,对应原 211~1401 行中非 CAN 部分)
- [ ] SubTask 1.4: 创建 `css/can.css`(CAN panel、CAN workspace page、CAN 1Hz feedback、ID snapshot table、报文列表布局,对应原 778~1384 + 1726~2146 末尾的 CAN 段)
- [ ] SubTask 1.5: 创建 `css/responsive.css`(@media 响应式 + @keyframes 动画 + enhanced animations,对应原 1476~1725 + 散落的 keyframes)
- [ ] SubTask 1.6: 更新 `index.html`、`can.html`、`can_monitor.html` 的 `<link>` 为 5 个 `css/*.css` 引用,删除原 `style.css` 引用
## Phase 2: 公共模块抽取(app.js / can.js / can_monitor.js 共同依赖)
- [x] Task 2: 创建 `js/common/` 公共工具模块
- [ ] SubTask 2.1: 创建 `js/common/utils.js` — 导出 `formatBytes`、`formatTime`、`formatUptime`、`escapeHtml`、`sanitizeHtml`(从 app.js 426~516 行 + can.js 重复实现提取)
- [ ] SubTask 2.2: 创建 `js/common/toast.js` — 导出 `showToast`(从 app.js 484~516 行提取)
- [ ] SubTask 2.3: 创建 `js/common/log.js` — 导出 `addLog`、`clearLogs`、`setLogFilter`、`toggleAutoScroll` 及日志环形缓冲状态(从 app.js 517~635 行提取)
- [ ] SubTask 2.4: 创建 `js/common/connection.js` — 导出 `testConnection`、`setConnectionState`、连接指示器更新逻辑(从 app.js 636~823 行 + 1076~1138 行提取)
- [ ] SubTask 2.5: 创建 `js/common/polling.js` — 导出 `schedulePolling`、`pollStatus`、`pollLogs`、`pausePollingForUpload`、Page Visibility 补偿(从 app.js 2051~2371 行提取)
## Phase 3: app.js 拆分(依赖 Phase 2)
- [x] Task 3: 拆分 `app.js` OTA 相关模块到 `js/ota/`
- [ ] SubTask 3.1: 创建 `js/ota/session.js` — OTA 会话状态机(`OtaSessionState`、`otaSessionTransition`、`otaSessionReset`、`clearOtaSessionResiduals`、`otaSessionActive`、`otaSessionTerminated`),对应原 69~237 行
- [ ] SubTask 3.2: 创建 `js/ota/progress.js` — 进度条与阶段 UI(`toggleCollapse`、`switchStageFlow`、`setProgress`、`setActivePhase`、`markStageDone`、`resetProgress`、`clearOtaResultWaiter`),对应原 239~425 行
- [ ] SubTask 3.3: 创建 `js/ota/stages.js` — ESP32/GD32 阶段驱动(`updateEsp32StagesFromPhase`、GD32 阶段更新、`esp32OtaPhase`、`esp32PhaseLabels`),对应原 824~1138 行
- [ ] SubTask 3.4: 创建 `js/ota/file-handle.js` — 文件选择 / FSAPI / SHA-256 / Intel HEX→BIN 转换 / 文件信息 UI(`handleFileSelect`、`clearFile`、`pickFileViaFSAPI`、`notifyFileChange`、`finalizeFileInfo`、`updateFileInfo`),合并原 1228~1466 行两个"文件处理"段
- [ ] SubTask 3.5: 创建 `js/ota/upload-esp32.js` — ESP32 上传流程(`startUpload('esp32')`、`uploadFirmware`、`startUploadWaitHeartbeat`、`stopUploadWaitHeartbeat`、`verifyEsp32Sha256`、ESP32 完成升级),对应原 1467~1859 行
- [ ] SubTask 3.6: 创建 `js/ota/upload-gd32.js` — GD32 中继 OTA 触发(`startUpload('gd32')`、`triggerGd32Ota`、relay 态跟踪、`hasObservedRealRelayState`),对应原 1860~2050 行
- [ ] SubTask 3.7: 创建 `js/ota/spi.js` — SPI 帧构建与发送(`sendSpiFrame`、`clearSpiFields`),对应原 1139~1227 行
- [x] Task 4: 抽取 `index.html` 内联脚本到 `js/ota/console-mode.js`
- 将原 431~684 行的内联 `<script>` 迁移为 ES Module
- 包含 `setConsoleMode`、`selectFlashTarget`、`handleSharedFileSelect`、`pickSharedFirmware`、`clearSharedFirmware`、`setBleFirmwareInputFile`、`syncBleFileFromSelectedTarget`、`applySharedModeUi`、`switchStageFlow` 覆盖逻辑
- 导出需要挂载到 `window` 的函数供 HTML onclick 使用
## Phase 4: ble_ota.js 拆分(与 Phase 3 无依赖,可并行)
- [x] Task 5: 拆分 `ble_ota.js` 为 `js/ble/` 模块
- [ ] SubTask 5.1: 创建 `js/ble/constants.js` — 导出 `UUIDS`、`BLE_OTA_*` 协议常量、`TARGETS` 配置、`UI_BUILD`(原 5~55 行)
- [ ] SubTask 5.2: 创建 `js/ble/state.js` — 导出 `state` 对象、`$` 元素查询辅助、`els` 元素缓存、`currentTarget`、`currentPayloadSize`、`flowTarget`、`refreshTargetUi`、`setConnectionState`、`resetUiAfterDisconnect`(原 57~430 行)
- [ ] SubTask 5.3: 创建 `js/ble/stages.js` — 导出 `updateBleStageLabels`、`resetBleStages`、`setBleStage`、`setBleStageText`、`setBleStageError`、`bleStageIds`(原 141~206 行)
- [ ] SubTask 5.4: 创建 `js/ble/gatt.js` — 导出 `connectBle`、`disconnect`、`onDisconnected`、服务发现、通知使能(原 431~560 行附近 connect/disconnect 段)
- [ ] SubTask 5.5: 创建 `js/ble/file.js` — 导出 `notifyFileChange`、`clearFile`、文件准备、分包计算、`setReadyHint`(原文件准备相关段)
- [ ] SubTask 5.6: 创建 `js/ble/transfer.js` — 导出数据写入循环、ACK 窗口节流、`updateProgressFromAck`、重传逻辑(原数据写入段)
- [ ] SubTask 5.7: 创建 `js/ble/verify.js` — 导出 `showBleVerifyInfo`、`hideBleVerifyInfo`、SHA-256 校验比对逻辑(原 276~302 行)
- [ ] SubTask 5.8: 创建 `js/ble/session.js` — 导出 `waitForOtaResult`、`resolveOtaResult`、`rejectOtaResult`、`abortCurrent`、`nextOtaSessionId`、`finishBelongsToWaiter`(原 207~261 + 1568~1657 行)
## Phase 5: can.js 拆分(与 Phase 3/4 无依赖,可并行)
- [x] Task 6: 拆分 `can.js` 为 `js/can/` 模块
- [ ] SubTask 6.1: 创建 `js/can/dbc.js` — 导出 `parseDbc`、`findSignal`、`parseMultiplexToken`、`buildSummary`、`normalizeWhitespace`(原 182~335 行)
- [ ] SubTask 6.2: 创建 `js/can/messages.js` — 导出 `filterMessages`、`renderMessageList`、`collectTransmitters`、`renderNodeFilterList`、`bindNodeFilterEvents`、`updateDbcFileInfo`(原 357~700 行附近)
- [ ] SubTask 6.3: 创建 `js/can/signals.js` — 导出信号值编辑器、编解码、`renderSignalEditor`、批量添加逻辑、旧版 shim(原 700~1100 行附近)
- [ ] SubTask 6.4: 创建 `js/can/send.js` — 导出 `buildSendResponseText`、`CAN_SEND_ERR_DESC`、`GD32_ERR_DESC`、帧构建与发送(原发送相关段)
- [ ] SubTask 6.5: 创建 `js/can/feedback.js` — 导出 1Hz 反馈轮询、ID 快照表渲染(原反馈轮询段)
## Phase 6: can_monitor.js ESM 化(依赖 Phase 2)
- [x] Task 7: 将 `can_monitor.js` 转为 ES Module
- 创建 `js/can_monitor.js` 入口,引用 `js/common/utils.js`、`js/common/connection.js` 等公共模块替换内部重复实现
- 原文件仅 244 行,内部逻辑保持不变,仅替换工具函数为 import
## Phase 7: 入口组装与 HTML 更新
- [x] Task 8: 创建薄入口文件并更新 HTML 引用
- [ ] SubTask 8.1: 创建 `js/app.js` 入口 — import 所有 `js/ota/*` + `js/common/*` 模块,将 HTML onclick 引用的函数挂载到 `window`(`setConsoleMode`、`selectFlashTarget`、`handleSharedFileSelect`、`pickSharedFirmware`、`clearSharedFirmware`、`startUpload`、`restartEsp32`、`sendSpiFrame`、`clearSpiFields`、`testConnection`、`refreshSystemStatusNow`、`setLogFilter`、`toggleAutoScroll`、`clearLogs`、`toggleCollapse` 等)
- [ ] SubTask 8.2: 创建 `js/ble_ota.js` 入口 — import 所有 `js/ble/*` 模块,组装并导出 `window.bleOta` API 对象(`init`、`isUploading`、`notifyFileChange`、`clearFile`、`refreshButtons`、`refreshTargetUi` 等),调用 `init()`
- [ ] SubTask 8.3: 创建 `js/can.js` 入口 — import 所有 `js/can/*` 模块,执行初始化
- [ ] SubTask 8.4: 更新 `index.html` — `<script>` 改为 `type="module" src="js/app.js"` + `type="module" src="js/ble_ota.js"`,删除内联 `<script>` 块
- [ ] SubTask 8.5: 更新 `can.html` — `<script>` 改为 `type="module" src="js/can.js"`
- [ ] SubTask 8.6: 更新 `can_monitor.html` — `<script>` 改为 `type="module" src="js/can_monitor.js"`
## Phase 8: 清理与验证
- [x] Task 9: 删除原始大文件
- 删除 `tools/app.js`(原 2371 行,已被 `js/app.js` + `js/ota/*` 替代)
- 删除 `tools/ble_ota.js`(原 1658 行,已被 `js/ble_ota.js` + `js/ble/*` 替代)
- 删除 `tools/can.js`(原 1526 行,已被 `js/can.js` + `js/can/*` 替代)
- 删除 `tools/style.css`(原 2146 行,已被 `css/*` 替代)
- 删除原 `tools/can_monitor.js`(已迁移到 `js/can_monitor.js`)
- [x] Task 10: 全功能验证
- 启动 `serve.bat`,浏览器打开三个页面验证无控制台错误
- 验证 index.html:WiFi 模式切换、ESP32/GD32 目标切换、文件选择、上传按钮状态、进度条、阶段流、日志面板、SPI 发送、系统状态轮询
- 验证 BLE 模式:连接/断开、文件选择、一键刷写、中止、阶段流、校验面板
- 验证 can.html:DBC 导入、报文列表、节点过滤、信号编辑、帧发送、1Hz 反馈
- 验证 can_monitor.html:连接、报文接收监控
# Task Dependencies
- [Task 2] 依赖 [Task 1] 完成(CSS 拆分先行,避免干扰)
- [Task 3] 依赖 [Task 2] 完成(ota 模块引用 common 公共函数)
- [Task 4] 依赖 [Task 3] 完成(console-mode 引用 ota 模块导出)
- [Task 5] 依赖 [Task 2] 完成(ble 模块可能引用 common 工具)
- [Task 6] 依赖 [Task 2] 完成(can 模块引用 common 工具)
- [Task 7] 依赖 [Task 2] 完成(can_monitor 引用 common)
- [Task 5]、[Task 6] 与 [Task 3] 无依赖,可并行执行
- [Task 8] 依赖 [Task 3]、[Task 4]、[Task 5]、[Task 6]、[Task 7] 全部完成
- [Task 9] 依赖 [Task 8] 完成
- [Task 10] 依赖 [Task 9] 完成