docs: 新增 .qoder Repowiki 知识库文档

This commit is contained in:
cbb
2026-09-07 12:19:26 +08:00
parent 43d42ad891
commit ef9472334a
105 changed files with 1313322 additions and 263 deletions
@@ -0,0 +1,26 @@
schema_version: 1
module_path: js_frontend/ble
title: BLE 通道 OTA 客户端(Web Bluetooth GATT)
scope:
- js/ble/
source_files: []
depends_on: []
related_to: []
kk_module_id: e695976e-f72c-4d3a-867b-fb80827337d8
kk_ordinal: 2
kk_cards:
architecture_design:
id: e5ac84aa-1a14-4238-840f-63cc430d2c4c
title: BLE 通道 OTA 客户端(Web Bluetooth GATT)
coding_conventions:
id: a5fa8c1f-0636-432f-a5f4-9b973378b212
title: BLE 通道 OTA 客户端(Web Bluetooth GATT)
overview:
id: 4a0792d4-88cf-45fa-86ab-ddce531e07e2
title: BLE 通道 OTA 客户端(Web Bluetooth GATT)
tech_stack:
id: b1c611b2-296d-4545-adf6-acf77eeaa116
title: BLE 通道 OTA 客户端(Web Bluetooth GATT)
unique_setup_and_commands:
id: 5d391cf3-8e98-4ea3-90bb-b48da99b4259
title: BLE 通道 OTA 客户端(Web Bluetooth GATT)
@@ -0,0 +1 @@
Web Bluetooth API(navigator.bluetooth.requestDevice / GATT Server + Characteristic + notify),配合 File System Access API(showOpenFilePicker)支持热重载;通过 0xA1 ACK + 64 窗口 ACK_WINDOW 实现流控。
@@ -0,0 +1 @@
模块按职责划分为八个 ES 模块文件,依赖方向单向:`constants.js` 集中定义 GATT UUID、OTA 协议码(ACK/FINISH/SHA256/CTRL)及 `TARGETS.{esp32,gd32}` 配置,作为所有其他文件的常量来源;`state.js` 维护全局状态(device/server/characteristic 引用、上传标志、ackWaiter、会话标识等)并提供 DOM 元素缓存与通用工具(bleLog/toHex/sleep 等);`gatt.js` 实现 BLE 生命周期(connectBle/disconnectBle/readVersion/onDisconnected)以及 GATT notify 分发 `handleNotify`,将协议事件路由至 transfer/session/verify;`transfer.js` 实现数据面:buildPacket 打包 seq+totalSize+payload+CRC、ACK 等待 Promise 封装 waitForAck、进度刷新 updateProgressFromAck;`session.js` 管理多轮 OTA 结果等待(waitForOtaResult/nextOtaSessionId/finishBelongsToWaiter)与 abort 流程;`stages.js` 提供 1~6 阶段状态栏的 UI 操作(setBleStage/setBleStageError/updateBleStageLabels),被 gatt/transfer/file 共同消费驱动动画;`file.js` 统一文件入口,处理 HEX→BIN 转换、GD32 包身份检测、SHA-256 缓存,并在 upload 中屏蔽重复选择;`verify.js` 仅暴露 show/hide 校验信息面板的方法。跨通道(BLE/WiFi)通过 `connectionMode` 变量与共享 DOM id(progressFill/logScroll 等)协作,确保界面一致性。
@@ -0,0 +1 @@
基于 Web Bluetooth API 实现 ESP32/GD32 双目标设备的 BLE 固件在线升级,负责 GATT 连接、分包传输、ACK 窗口与 SHA-256 校验。
@@ -0,0 +1 @@
BLE 连接必须在用户手势内触发(click handler 中使用 `e.preventDefault()` 保证 navigator.bluetooth.requestDevice 合法);需浏览器启用 `web-bluetooth` 权限并过滤 namePrefix 为 'ESP32-OTA'。
@@ -0,0 +1,6 @@
- 协议常量集中声明于 constants.js,并以命名空间式导出(如 BLE_OTA_NOTIFY_ACK、BLE_OTA_FINISH_ERR_*、TARGETS.*),所有业务模块通过 import 使用而非魔法数字硬编码。
- DOM 节点在 state.js 启动时一次性缓存到 els 对象,高频路径直接读取属性,避免重复 getElementById;stages.js 对共用状态栏也采用首读缓存 + isConnected 失效回退模式。
- 阶段 UI 通过 stages.js 的 setBleStage(stageNum, detail, barState) 统一推进,错误路径使用 setBleStageError(detail) 将当前 active 节点标记 err,禁止各模块自行修改 className。
- 异步长耗时操作采用“waiter”模式:用 state.ackWaiter / state.otaResultWaiter 存储 resolve/reject + timer,超时或中止时主动清除并 reject,防止悬挂 Promise。
- 日志输出统一经 state.bleLog(tag, message, level) 封装后注入 common/log.js 的 addLog,标签前缀固定为 'BLE-*',便于侧边栏筛选。
- 跨通道状态判断使用 isBleUploading()(state.uploading || state.autoFlashing)与 window.isUploading 组合判定,避免单个通道上传时另一通道 UI 被意外重置。
@@ -0,0 +1,27 @@
schema_version: 1
module_path: js_frontend/can
title: CAN 控制台前端:DBC 解析、报文发送与接收监控
scope:
- js/can/
- js/can_monitor.js
source_files: []
depends_on: []
related_to: []
kk_module_id: b5c93572-2980-4d8b-abcb-49299366edc6
kk_ordinal: 4
kk_cards:
architecture_design:
id: 8c1ea8cb-f95b-48ee-856a-50f8336e3eea
title: CAN 控制台前端:DBC 解析、报文发送与接收监控
coding_conventions:
id: cee80565-5287-44a1-881b-e9087ff9c0ed
title: CAN 控制台前端:DBC 解析、报文发送与接收监控
overview:
id: ee9c08d3-0aed-4e95-8a7f-f446a2debab4
title: CAN 控制台前端:DBC 解析、报文发送与接收监控
tech_stack:
id: 7d94fd27-c122-4f4b-a175-b9c7ac60a3ad
title: CAN 控制台前端:DBC 解析、报文发送与接收监控
unique_setup_and_commands:
id: 7b2bd04a-c5d6-4bce-954b-193adc49892a
title: CAN 控制台前端:DBC 解析、报文发送与接收监控
@@ -0,0 +1 @@
纯浏览器端 JavaScript(ES Module),使用 TextDecoder('utf-8' | 'gb18030') 解析 DBC 文件、localStorage 会话存储、AbortController+setTimeout 双超时控制 fetch、Clipboard API 降级 execCommand 回退。
@@ -0,0 +1,8 @@
模块按职责拆分为五个 ES Module,依赖方向单向收敛于 `dbc.js`:
- `dbc.js` 为基础设施层,导出共享 state/el、IP 工具、字节格式化工具,以及 DBC 文本读取(UTF-8 / GB18030/BOM 自动回退)和 DBC 解析器(BO_/SG_/CM_/VAL_ 行 → { messages, nodeNames, messageMap }),不依赖其他 can 子模块。
- `messages.js` 负责报文列表渲染、关键字与发送节点筛选、节点过滤面板 UI 及批量选择。
- `signals.js` 基于 DBC 信号定义生成内联信号表格,维护 signalValues bag,处理 Motorola/Intel 位序、有符号/无符号、枚举、因子/偏移编解码,并维护当前选中报文的编码预览。
- `send.js` 作为 HTTP 出口,统一通过 `fetch(getBaseUrl() + '/can/send_batch')` 发原始帧或构造后的批量帧,封装错误码映射(CAN_SEND_ERR_DESC / GD32_ERR_DESC),维护发送历史与剪贴板复制。
- `persist.js` 将多 DBC 原文、signalValues、checkedKeys/expandedKeys、transmitterFilter、history、表单状态序列化到 localStorage(键 `dcu_can_session_v1`),并以防抖 `scheduleCanPersist()` + 失败时逐步砍历史/信号值的方式保证写入安全;恢复时逆向重建 DBC。
- `can_monitor.js` 是独立的 1Hz 轮询入口,调用 `/can/feedback` 获取 3 路 CAN 通道 RX/TX/Drop/Err/TEC/REC/bus_state/entries,渲染三卡片及 ID snap 表,可被 `can.html` 右侧抽屉复用。
模块间通过 ES Module live binding 共享 `state` 与 `el`,避免重复缓存 DOM 与状态副本。
@@ -0,0 +1 @@
实现浏览器端 CAN 调试工具的 DBC 文件解析、报文过滤/信号编辑、批量帧发送与会话持久化,并提供独立页的 CAN 通道反馈轮询监控。
@@ -0,0 +1 @@
无需构建步骤;直接由网页加载 ES Module。`readDbcText` 支持 UTF-8 优先、GB18030 回退并去除 BOM,用于本地拖入的 .dbc 文件;`parseDbc` 自行解析 BO_/SG_/CM_/VAL_ 标准 DBC 片段。
@@ -0,0 +1,6 @@
- 跨子模块共享可变状态与 DOM 引用集中放在 `dbc.js` 导出的 `state`/`el` 对象上,各子模块通过 import 获取同一引用,利用 ES Module live binding 保证同步。
- 对外部不可信文本一律使用 `escapeHtml`/`sanitizeHtml` 后再插入 innerHTML,所有数据属性赋值前先经 `escapeHtml`,禁止拼接 HTML 字符串直接使用用户输入。
- 网络请求统一使用 `new AbortController()` + `setTimeout` 双保险取消,防止在连接 reset 等边缘场景下 await 永久挂起。
- 高频本地持久化采用「收集事件 → scheduleCanPersist → 防抖定时器 → saveCanSessionNow」模式,并在 writePayload 失败时逐级减少 payload(压缩历史→清 signalValues)以容忍 localStorage 配额不足。
- DLC/字节数组输出统一走 `padHex(value, width)` 与 `bytesToHex(bytes)`,确保十六进制展示宽度一致、全大写。
- 错误信息分层展示:完整描述走 buildSendResponseText,简短文案走 buildSendResponseShort 去掉冗余前缀,使历史记录空间有限时仍保留核心原因。
@@ -0,0 +1,23 @@
schema_version: 1
module_path: js_frontend
title: ESP32 DCU 前端 Web 控制台集合
scope:
- js/
source_files: []
depends_on: []
related_to: []
kk_module_id: 34c369aa-9944-449c-bc32-3fb459da6f08
kk_ordinal: 2
kk_cards:
architecture_design:
id: 0226951f-1a73-43f5-adb5-ded1b74dbe63
title: ESP32 DCU 前端 Web 控制台集合
coding_conventions:
id: 66764ffe-f832-4992-a6b4-064aab166812
title: ESP32 DCU 前端 Web 控制台集合
overview:
id: 8298ce61-963b-4a66-b17b-8293a4472e54
title: ESP32 DCU 前端 Web 控制台集合
tech_stack:
id: 22e24b2a-6f8d-4d54-b181-e2ec9ff24243
title: ESP32 DCU 前端 Web 控制台集合
@@ -0,0 +1,28 @@
schema_version: 1
module_path: js_frontend/ota
title: 前端 OTA 刷写会话与进度管理
scope:
- js/ota/
source_files: []
depends_on: []
related_to:
- path: js_frontend/ble
reason: 两者均为浏览器端固件升级方案:js/ota 走 WiFi ESP32 HTTP(分块上传+SHA-256),js/ble 走 Web Bluetooth GATT(分包 ACK+窗口+SHA-256),同一业务目标的不同实现。
kk_module_id: 697d6afd-9c08-42a6-900d-2b51dd09c507
kk_ordinal: 1
kk_cards:
architecture_design:
id: 7e17f40a-f0ea-4d4d-bba0-99559868e617
title: 前端 OTA 刷写会话与进度管理
coding_conventions:
id: 79bc6166-c07c-4910-b704-f898340b0b69
title: 前端 OTA 刷写会话与进度管理
overview:
id: 95c1a351-1033-42a9-a77b-086cd3d5186c
title: 前端 OTA 刷写会话与进度管理
tech_stack:
id: b16589eb-b0da-4e30-960e-4a0d3b051ed3
title: 前端 OTA 刷写会话与进度管理
unique_setup_and_commands:
id: 93240d0d-1e8c-4a7d-9f5f-9e26a332988e
title: 前端 OTA 刷写会话与进度管理
@@ -0,0 +1 @@
纯浏览器端 JavaScript (ES Module),使用 IndexedDB 持久化 FileSystemFileHandle 实现刷新后热重载恢复;XHR+fetch 混合进行文件分块上传;通过 ES import 引入 ../common/*(log、toast、utils、connection)。
@@ -0,0 +1,5 @@
模块以**集中式会话状态机**(session.js)为核心,定义 IDLE→UPLOADING/VERIFYING/RELAYING/REBOOTING→DONE/FAILED 的状态流转,所有 UI、上传、轮询通过 window.* 全局总线共享 otaSessionState / otaSessionTarget / activeUploadChip 等标志,避免分散布尔位导致的“网络错误后轮询覆盖”问题。
- 入口编排:console-mode.js 接管 switchStageFlow,提供 WiFi/BLE/ESP32/GD32 多通道目标切换与共享固件文件同步;upload-esp32.js 作为统一入口 startUpload(chip) 处理互斥探测、热重载重读、XHR 分块上传、SHA-256 校验与设备重启。
- 后端协议:upload-gd32.js 仅负责 POST /ota/relay 触发 GD32 中继,并通过 emitRelayProgress/markGd32OtaUiComplete/startRelayProgressWatch 与 stages.js 中的 status 轮询路径协同;ECT 负载显示由独立的 ecat_load.js 基于 /ecat/api/app/load 退避轮询。
- UI 层:progress.js 维护折叠面板、阶段节点 es1..es6/s1..s6 与进度条;stages.js 把 relay_state/sys_state_code 映射到 GD32 阶段节点并调用 progress 更新仪表盘;file-handle.js 封装 HEX→BIN、IndexedDB FSAPI handle 持久化、localStorage 偏好(flashTarget、文件元信息)。
- 依赖方向单向:console-mode → upload-* → session + progress + file-handle,stages/ecat_load 消费 session/progress,无任何反向引用。
@@ -0,0 +1 @@
为 ESP32/GD32/DPU 提供浏览器侧的固件选择、分块上传、校验、中继触发与会话状态机,并渲染阶段节点与进度条。
@@ -0,0 +1 @@
无构建脚本——模块由 HTML 页面直接按模块加载;EtherCAT 负载显示需主站 esp32_server 打开 ECAT native 循环并提供 /api/app/load,本模块仅做 100ms 退避轮询(失败→5s→30s),不强制拉起后端。
@@ -0,0 +1,6 @@
- 跨模块共享可变状态统一挂载在 window.* 上(如 isUploading、activeXhr、otaSessionState、activeUploadChip),各模块通过导入函数访问,而非显式传参。
- 所有会话生命周期变更必须经由 session.js 的 otaSessionTransition() 驱动,禁止直接修改窗口标志,保证是Uploading/Verify/Reboot/Done/Fail 等终态时自动清理按钮、阶段与定时器。
- 失败路径统一调用 progress.cleanupAfterOtaFailure(reason) 进入 FAILED 态并清除残留 DOM/定时器/进程句柄,使后续 status 轮询不会覆盖失败 UI。
- DOM 写入采用「先比较后写入」模式(setNodeText/setNodeClass/setTitle)或缓存 lastDisplayedRelayState,避免每秒轮询时无条件赋值导致样式失效重排。
- 长耗时用户操作(选文件、热重载、请求)均包裹 try/catch 并以 addLog('W'/'E','OTA'/'文件',...) 记录,同时用 showToast 给出用户可见反馈,区分日志与提示。
- 轮询器以幂等的 start*/stop* 成对暴露(stopRelayProgressWatch、startUploadWaitHeartbeat、startEcatLoadPoller),内部持 timerId 并在页面无对应元素或已运行时直接 return,避免重复调度。
@@ -0,0 +1,22 @@
schema_version: 1
module_path: js_frontend/common
title: 前端公共工具库(连接/轮询/日志/Toast/IndexedDB)
scope:
- js/common/
source_files: []
depends_on: []
related_to: []
kk_module_id: 83fe5acc-8cc9-4cca-8aa5-93ffb96585bf
kk_cards:
architecture_design:
id: 985b41f4-d6f1-4ff0-b9c0-e6ccc216fdf4
title: 前端公共工具库(连接/轮询/日志/Toast/IndexedDB)
coding_conventions:
id: 3d9852ce-9b31-4829-af73-d79d122dc321
title: 前端公共工具库(连接/轮询/日志/Toast/IndexedDB)
overview:
id: f6c3b043-050f-4761-8bb6-2fac2945de55
title: 前端公共工具库(连接/轮询/日志/Toast/IndexedDB)
tech_stack:
id: 5488e585-4aad-4812-ae92-aafb6c8ac269
title: 前端公共工具库(连接/轮询/日志/Toast/IndexedDB)
@@ -0,0 +1 @@
ES Module (`export/import`);HTTP 轮询使用原生 `fetch` + `AbortController` 实现超时取消;WebSocket 长连接由 `app-lease.js` 自持;设备事件持久化走 IndexedDB (`IDBFactory.open('esp_dream_heap_low')`,版本 1);DOM 高频更新采用 `requestAnimationFrame` 合并写入与字符串对比去变更。
@@ -0,0 +1,9 @@
模块按职责拆分为独立 ES 模块,各文件通过 `import` 组合,不相互强耦合:
- `connection.js`:封装 DOM 渲染缓存(`elCache`、`set*IfChanged` 写前比较)和 `/system/status` UI 更新(连接胶囊、健康态、启动自检面板),是上层业务页渲染的核心。
- `polling.js`:基于递归 `setTimeout` 的轮询调度器,维护 `/system/status` 与 `/logs` 双通道 in-flight 锁、5s `AbortController` 超时、上传期暂停、Page Visibility 感知,并协调 OTA 状态机;导出 `startPolling / scheduleStatusPoll / pausePollingForUpload` 等生命周期 API。
- `log.js`:带去重 + 自动滚动 + 环形缓冲(`MAX_LOGS=1000`)+ rAF 批量滚动的控制台。
- `toast.js`:支持 success/error/warning 三类弹窗,含 5s 去重防抖 + 3s 自动隐藏。
- `heap-low-history.js`:基于 IndexedDB (`esp_dream_heap_low`) 持久化“最低空闲内存”创新低记录,含去重 key `(ts_ms|min_free_heap|free_heap|alloc_count)`、上限裁剪与离线可用保证。
- `app-lease.js`:自执行 IIFE 建立到 `/ws/app-lease` 的 WebSocket 长连接并 3~30s 递增退避重连,作为服务端停 EtherCAT 循环的窗口凭证。
- `base-url.js` / `utils.js`:纯函数辅助层(IP/URL 拼串、字节/时间/运行时间格式化、HTML 转义、hex 转换),被其他子模块复用,无浏览器副作用。
依赖方向:业务页 → connection/polling/log/toast → base-url/utils;只有 polling→connection 反向引用用于失败诊断,避免连接态被业务直接操作。
@@ -0,0 +1 @@
为 ESP32 DCU Web 管理端提供跨页面共享的连接状态、系统轮询、日志缓冲、提示框、IndexedDB 历史与基础 URL/格式化等通用能力。
@@ -0,0 +1,6 @@
- 对频繁读取的 DOM 节点在模块级以 `var elCache[id] = document.getElementById(id)` 方式缓存,并通过 `getEl()` 统一访问,避免每帧重复 `getElementById`。
- 文本/类名/宽度等 DOM 属性写入前先比较旧值(`textContent !== v`、`className !== cls`、元素上 `_lastW` 缓存宽度),仅在变化时才触碰样式,避免强制布局重排。
- 轮询器统一用递归 `setTimeout` 而非 `setInterval` 调度,并在每次回调末尾按 `max(0, interval - elapsed)` 重新挂载下一次任务,保证周期稳定且不会因慢响应重叠。
- 所有通过 `innerHTML` 渲染的用户可控文本均先经 `escapeHtml` 转义,防止注入。
- 需要幂等的 UI 绑定(如健康启动面板切换按钮)通过 HTML 自定义属性(如 `dataset.bootToggleBound === '1'`)标记是否已处理,避免重复 `addEventListener`。
- 可选 API(如 Toast、IndexedDB、autoScroll 按钮)在执行前做存在性判断,不存在时静吞错误,保证核心轮询逻辑在无 DOM/无痕模式环境下仍可工作。
@@ -0,0 +1,30 @@
schema_version: 1
module_path: js_frontend/app_entries
title: 前端应用入口聚合层(ESP32 OTA / BLE OTA / CAN 诊断)
scope:
- js/app.js
- js/ble_ota.js
- js/can.js
source_files: []
depends_on: []
related_to:
- path: python_server
reason: OTA、BLE、CAN 控制台页面均由 python_server 的静态文件服务提供,并通过 base-url.js 中 localStorage 存储的 dcu_esp_ip 以同源请求访问设备 API。
kk_module_id: d15c38ec-fd6c-4494-8521-a48360031a6b
kk_ordinal: 5
kk_cards:
architecture_design:
id: 441b093f-3154-4236-87c1-714b50c314c2
title: 前端应用入口聚合层(ESP32 OTA / BLE OTA / CAN 诊断)
coding_conventions:
id: b6fef608-2072-43c3-8b54-488a03451825
title: 前端应用入口聚合层(ESP32 OTA / BLE OTA / CAN 诊断)
overview:
id: 41949d5a-6e02-4b39-a0d9-23dcc19a84ee
title: 前端应用入口聚合层(ESP32 OTA / BLE OTA / CAN 诊断)
tech_stack:
id: 3d5e73da-051c-455f-a5d9-9d897c816023
title: 前端应用入口聚合层(ESP32 OTA / BLE OTA / CAN 诊断)
unique_setup_and_commands:
id: b4aa8897-362a-45f5-9b97-fe13dbf1072a
title: 前端应用入口聚合层(ESP32 OTA / BLE OTA / CAN 诊断)
@@ -0,0 +1 @@
ES Module (type="module") + Fetch API + Web Bluetooth (GATT) + DBC/CAN 报文解析
@@ -0,0 +1,5 @@
本模块由三个互相独立的入口脚本组成,均为薄编排层:
- `js/app.js`:ESP32 WiFi OTA 控制台入口,import `ota/*`、`common/*` 等子模块后把所有交互函数显式挂载到 `window.*`,以兼容 HTML 内联 `onclick`;同时承担顶层副作用(拖拽区绑定、SPI 输入监听、状态轮询)。通过共享状态对象 `otaSessionState`、`OtaSessionState` 在 ota 子模块间传递会话信息。
- `js/ble_ota.js`:BLE OTA 控制台入口,导出单一 `window.bleOta` API 对象(含 `init/state/disconnect/isUploading` 等),调用 `ble/session.bindEvents()` 和 `state` 完成初始化。
- `js/can.js`:CAN 诊断页面入口,导入 `can/dbc.js`、`can/messages.js`、`can/signals.js`、`can/send.js`、`can/persist.js` 以及 `common/utils`、`common/toast`,通过共享的 `el`/`state` 单例在各子模块间保持最新 DOM 引用与选中状态;使用带版本戳的 `?v=` 查询参数字面量强制缓存失效(如 `send.js?v=20260801f`),同时避免在 import 路径上加版本戳导致浏览器重复实例化单例。
依赖方向:三个入口只向上暴露到 `window`,被上层 HTML 或测试脚本消费;向下仅依赖各自子目录模块与 `common/*`,无横向耦合。
@@ -0,0 +1 @@
汇总 ESP32 WiFi OTA、BLE OTA 与 CAN 诊断三个控制台页面的入口脚本,通过 ES Module import 组装子模块并将函数挂载到 window,提供统一的事件绑定与 UI 初始化。
@@ -0,0 +1 @@
模块内 import 路径禁止加 `?v=` 版本号,版本戳仅出现在 HTML `<script src>` 标签上,以避免同一模块因不同 querystring 产生双份实例(破坏 state/toast 单例);CAN 页面中向特定文件追加硬编码 `?v=...` 以强制重新加载已发布过的模块。
@@ -0,0 +1,4 @@
- 入口脚本采用「薄编排 + window 挂载」模式:import 子模块函数后集中赋值给 `window.xxx`,供 HTML 内联事件处理器或外部脚本调用。
- 各入口先构造本地工具函数(如 `getBaseUrl`、`setConnectionState`、`resetSelectionState`),再执行 DOM cache 与事件绑定,最后调用统一的 `init` 入口完成启动。
- 子模块间的共享状态与 DOM 引用通过 ESM 导出的单例对象(`state`、`el`)传递,而非全局散落的闭包。
- 对 `common/utils`、`common/toast` 等通用能力按需要局部重名导入并立即挂载到 `window`,形成稳定的跨模块 API 边界。
@@ -0,0 +1 @@
ES Module + Web Browser API(Web Bluetooth/GATT、Web Worker、IndexedDB),运行于 ESP32 内置 Web Server 托管的静态资源环境,通过 HTTP 长轮询与服务端协议通信。
@@ -0,0 +1 @@
顶层目录以功能划分为若干独立子系统:common 提供跨子模块复用的 connection/polling/log/toast/utils;app_entries(js/app.js、can_monitor.js、ble_ota.js)作为单页应用入口,通过 ES Module import 将各子系统(ota/ble/motor/can)组合到 window 命名空间并绑定 UI 事件;各子系统内部自包含业务逻辑,如 ota 定义固件升级会话阶段,ble 基于 GATT 通道驱动同一流程,motor 通过 transport-ecat/wifi 可插拔传输层抽象驱动状态机。各子系统之间不直接互相 import,而是由浏览器加载的脚本各自按需引入 common,形成“入口聚合 + 功能隔离”的多页式架构。
@@ -0,0 +1 @@
汇聚 OTA、BLE、电机控制与 CAN 诊断等多个浏览器端控制台页面,共享连接、轮询、日志等公共能力并通过 app 入口聚合装配。
@@ -0,0 +1,27 @@
schema_version: 1
module_path: js_frontend/motor
title: 电机控制台多传输模块
scope:
- js/motor/
source_files: []
depends_on: []
related_to:
- path: js_frontend/can
reason: CAN 控制台与电机控制台均通过 POST /can/send_batch 发送帧到 ESP32 设备,但 CAN 用于通用报文编辑而电机用于特定 CMD/CONFIG 控制流程。
- path: python_server
reason: 电机控制台通过 /ecat/api/* 反向代理访问本地 ecat_native.exe 的 /api/motor/*(transport-ecat.js 中拼接路径发送)。
kk_module_id: 71087b31-4c6d-4a07-8d58-1f3e348444bf
kk_ordinal: 3
kk_cards:
architecture_design:
id: 00c57461-8294-47bf-88b9-8c362ac14bfc
title: 电机控制台多传输模块
coding_conventions:
id: 13ef69f8-0bc9-4b61-bd64-c0fa7a39ef2c
title: 电机控制台多传输模块
overview:
id: df61a7ec-5adc-4d4f-b0e9-a2867d026ab5
title: 电机控制台多传输模块
tech_stack:
id: 1dea780b-05c9-4fe6-ad60-ffef2d6854ec
title: 电机控制台多传输模块
@@ -0,0 +1 @@
原生 JavaScript ES Module,使用 Web Worker 作为定时节拍源;WiFi 链路通过 Fetch + AbortSignal.timeout 访问设备 HTTP 端点;EtherCAT 链路经本地页面服务器的同域反向代理(绑定 127.0.0.1,无 CORS)访问后端 `ecat_native.exe` 守护进程;二进制状态协议用 DataView 解析(魔数 0x4D53,v0.70/v0.74 双版本兼容)。
@@ -0,0 +1,9 @@
模块以 `main.js` 为 ES Module 入口(由 motor.html 外提),集中维护全局 `state`(连接态、刷新间隔、解码缓存、命令序列、版本缓存等)并通过工具栏在 `wifi` / `ecat` 两条链路之间切换。
内部按职责分层:
- 传输选择层 `transport.js` 导出 `createTransport(id, ctx)` 工厂,根据 id 创建具体实现,并以 `ctx` 注入 `getBaseUrl`、`recordSlow`、`isTransient` 避免循环依赖。
- 两路传输独立实现同一契约(见 `transport-ecat.js` 头注释列出的接口表):`transport-wifi.js` 调用 ESP32 的 HTTP API(`/system/status`、`/motor/state?bin=1`、`/can/send_batch` 等);`transport-ecat.js` 经本地页面服务器 `/ecat/api/*` 反向代理到 `tools/ecat` 的 C 守护进程,完成全自动接入(自动拉起服务、打开网卡、进入 OP、起 PDO 循环)并将 EtherCAT 过程数据形状补齐为 WiFi 契约(config_data、version seq、nodeIdReport)。
- `refresh-rate.js` 抽离为纯函数库,按链路各自管理默认值/最小值/钳制/旧键迁移,使刷新策略可脱离 DOM 自测。
- `tick.worker.js` 是一个 Dedicated Worker,仅负责按指定 interval 持续投递 `tick` 消息,规避浏览器后台标签页对 setTimeout/setInterval ≥1s 节流。
依赖方向单向收敛于 `main.js` → `transport.*`;上层解码器、节点列表、STATUS 面板、波形、命令序列和全部流控策略(互斥/退避/冷却/latest-wins)完全不感知底层链路差异。
@@ -0,0 +1 @@
提供电机控制台的业务逻辑入口,通过可插拔的 WiFi/HTTP 与 EtherCAT 传输层抽象,驱动状态轮询、帧发送、命令序列与波形等共享逻辑。
@@ -0,0 +1,5 @@
- 两种传输实现统一通过工厂 `createTransport` 产出,并按相同方法签名(probe/fetchStatus/fetchMotorState/sendFrames/fetchVersionNode 等)对外暴露,主流程只调用抽象接口。
- 传输层错误对象统一附加 `.transient` 标记与可选 `.status`,由 main.js 的失败计数与断线逻辑识别,区分瞬时错误与硬失败。
- 慢请求通过注入的 `recordSlow(url, ms, errMsg?)` 回调上报,所有 fetch/POST 路径都包裹计时与记录。
- 用户偏好状态写入 localStorage 时采用「按链路分组」的 Map 结构(如 `refreshByTp`、历史 `dcu_motor_transport`),新链路扩展只需改默认表而无需改动持久化格式。
- Worker 通信仅使用 `{type, ...}` 消息体(start/update/stop 对应 tick 启停),不传递复杂对象,保持轻量心跳协议。
@@ -0,0 +1,3 @@
- 每个子系统保持自包含目录结构(会话/状态/阶段/传输分离),仅通过 common 提供的工具函数与外部解耦
- UI 交互由入口脚本统一注册到 window,子模块不直接操作 DOM 全局对象
- 设备通信均通过 common 的 polling/connection 封装进行周期性数据推送,而非自行实现定时器