Files
ESP32_COMM/.zcode/plans/plan-sess_2a2d2d21-42f5-42bc-a2db-8dcc73396c9f.md
T
小龙虾 c0ca4e2a9f feat(can): 优化CAN反馈任务错误日志记录机制
- 添加s_lastLoggedError数组跟踪各通道最后记录的错误计数
- 实现错误计数变化时才触发告警,避免重复打印
- 扩展错误日志信息,包含TEC、REC和总线状态详细信息
- 修复P0/P1页面携带相同统计数据时的重复打印问题

perf(ota): 移除冗余的OTA协调器状态检查方法

- 删除isGd32BusyState、isEsp32BusyState等未使用的状态判断方法
- 移除esp32FinalizeErrCategory错误分类函数
- 清理相关的头文件声明,减少代码冗余

refactor(relay): 移除未使用的中继状态获取方法

- 删除getRelaySeq、getRelayTotalPackets状态查询接口
- 移除getGd32Version版本获取方法
- 清理StateLockGuard中的isLocked方法
2026-07-11 17:51:42 +08:00

6.9 KiB
Raw Blame History

死函数清理与兼容标记计划

目标

逐函数扫描 main/(C++)、tools/(JS)及根目录 Python 脚本,识别:

  1. 死函数:已定义但无调用、未注册、未绑定,直接清理。
  2. 旧版本兼容函数:仍被调用但无实际作用,或注释/命名表明为兼容保留,进行明确标记(保留并加注释,或连同调用点一起移除)。

扫描已完成,共覆盖约 349 个 C++ 定义、~130 个 JS 函数、2 个 Python 脚本。


一、C++ 死函数(建议删除)

# 函数/方法 文件 行 说明
1 esp_err_t ota_prepare_handler(httpd_req_t *req) main/server/http_handlers.cpp 202 完整实现,但 wifi_ota.cpp 的 kHttpRoutes 未注册 /ota/prepare,无任何调用。
2 bool WifiOta::getGd32StorageDone() const main/server/wifi_ota.h 73 内联 getter;setGd32StorageDone() 在用,getter 无调用。
3 bool OtaRelay::StateLockGuard::isLocked() const main/relay/ota_relay.h 241 公共嵌套类方法,无调用。
4 int canFdSendNoReply(...) main/transport/canfd_bridge.cpp/h 93/61 无调用者。
5 int canFdPullIdSnapshot(...) main/transport/canfd_bridge.cpp/h 183/158 无调用者。
6 bool getLatestIdSnapshot(...) main/monitor/can_feedback_task.cpp/h 156/44 无调用者;getLatestCanFeedback() 已覆盖同一需求。
7 const char* OtaCoordinator::getSystemStateString() const main/ota/ota_coordinator.cpp/h 711/438 注释已写明“保持向后兼容”,但无任何调用。
8 int OtaCoordinator::esp32FinalizeErrCategory(esp_err_t err) main/ota/ota_coordinator.cpp/h 563/466 声明、定义齐全,无调用。
9 bool OtaCoordinator::isGd32Busy() const main/ota/ota_coordinator.cpp/h 680/424 无调用;isGd32BusyState() 仍保留供内部使用。
10 bool OtaCoordinator::isEsp32Busy() const main/ota/ota_coordinator.cpp/h 686/431 无调用;isEsp32BusyState() 仍保留。
11 bool OtaCoordinator::isGd32StorageDone() const main/ota/ota_coordinator.cpp/h 723/? 无调用;getSnapshot() 直接读取 m_gd32StorageDone。
12 static void OtaRelay::getGd32Version(gd32_version_t *out) main/relay/ota_relay.cpp/h 144/156 无调用;getSnapshot() 已包含 version。
13 static uint32_t OtaRelay::getRelaySeq() main/relay/ota_relay.cpp/h 126/141 无调用;getSnapshot() 已包含 seq。
14 static uint32_t OtaRelay::getRelayTotalPackets() main/relay/ota_relay.cpp/h 132/146 无调用;getSnapshot() 已包含 total_packets。

C++ 清理动作

  • 删除上述函数的实现与对应头文件声明。
  • 删除 ota_prepare_handler 后,检查并清理其专用的 clear_esp32_prepare / clear_gd32_prepare 静态状态变量是否仍被其他 handler 使用;若仅由 ota_prepare_handler 使用则一并移除。
  • 删除 getLatestIdSnapshot 后,若 id_snapshot_cache_t 类型不再被使用,保留在头文件中(作为公共类型)或同步删除。

二、C++ 旧版本兼容标记(建议保留并强化注释)

函数/成员 文件 说明
ble_ota_start_advertising(void) main/server/ble_ota.cpp 注释已写“kept as free function for BLE callback compatibility”,确实被注册使用,保留并维持注释。
volatile bool m_wifiConnected main/monitor/health_monitor.h 注释已写“保留为历史兼容”,保留。
CANFD/SPI/Flash 迁移注释 protocol.cpp、spi_master.h/.cpp、ota_relay.h 已是历史迁移说明,无需改动。
NVS 兼容 fallback gd32_flash_store.cpp 注释“视为空元数据,保持兼容”,保留。

三、JS 死函数(建议删除)

tools/app.js

函数 行 说明
sendCanFrame() 925 引用已移除的 #canChannel/#canId/#canDlc/#canData。
clearCanFields() 968 同上。
updateCanHint() 376 同上;事件绑定也指向已移除 DOM。
setHelper(id, text, type) 370 仅被 updateCanHint() 调用。
retryEsp32Upload() 1629 无按钮/调用者。
cancelEsp32Ota() 1643 无按钮/调用者。
applyEsp32Firmware() 1655 当前流程由 verifyEsp32Firmware() 直接 /ota/update 应用。
triggerRelay() 1759 仅转发 triggerGd32Relay(),注释写“旧页面兜底”。

tools/app.js 兼容/空壳处理

函数 行 建议
showVerifyActions(type) 179 空壳,被 verifyEsp32Firmware() 等调用。删除函数体及所有调用点(因为 UI 按钮已移除)。
setOtaProgressBadge() 782 空壳局部函数,被多处调用。删除函数及所有调用点。

tools/ble_ota.js

函数 行 说明
restartEsp32() 837 IIFE 内部定义,无绑定/调用;全局 restartEsp32() 来自 app.js 已绑定按钮。

tools/can.js

函数 行 说明
metaCard(label, value) 747 从未调用。
renderSignalGrid(/* message */) 751 空壳,无调用者。
renderSelectedMessage() 742 空壳但仍被 selectMessage 等多个调用点调用,是兼容 shim。保留并强化注释“旧版信号编辑面板兼容 shim”。

tools/index.html

函数 行 说明
window.attachSharedFirmwareDropBridge 639 定义但从未调用;app.js 的 setupDropZone() 已处理 drop。

四、Python 脚本

  • ota_upload_test.py、serial_monitor.py 均为纯顺序脚本,无函数定义,无需改动。

五、验证步骤

  1. 修改后执行 idf.py build(或等价的 idf.py fullclean + build)验证 C++ 无编译/链接错误。
  2. 浏览器打开 tools/index.html、tools/can.html,验证控制台无 xxx is not defined 报错。
  3. 检查 C++ 中是否产生新的 -Wunused-function / -Wunused-variable 警告。
  4. 对存疑项做二次 grep 确认无调用。

六、风险与保留项

  • canFdSendNoReply / canFdPullIdSnapshot 是公共 API,当前无调用。若你计划后续通过 HTTP/SPI 暴露它们,可以改为加 [[maybe_unused]] 或保留注释;否则按死函数删除。
  • ota_prepare_handler 实现完整,若你打算未来启用 /ota/prepare 端点,应改为注册而非删除。本次计划按“当前死代码”删除处理。
  • renderSelectedMessage() 仍被调用,保留作为明确的旧版兼容 shim。

七、交付物

  1. 修改后的 C++ 源文件与头文件(死函数已删除,兼容项已标记/保留)。
  2. 修改后的 JS 文件(死函数已删除,空壳 shim 已清理)。
  3. 一份简短变更摘要,列出删除的函数及保留的兼容 shim。
  4. idf.py build 成功输出。