- 添加s_lastLoggedError数组跟踪各通道最后记录的错误计数 - 实现错误计数变化时才触发告警,避免重复打印 - 扩展错误日志信息,包含TEC、REC和总线状态详细信息 - 修复P0/P1页面携带相同统计数据时的重复打印问题 perf(ota): 移除冗余的OTA协调器状态检查方法 - 删除isGd32BusyState、isEsp32BusyState等未使用的状态判断方法 - 移除esp32FinalizeErrCategory错误分类函数 - 清理相关的头文件声明,减少代码冗余 refactor(relay): 移除未使用的中继状态获取方法 - 删除getRelaySeq、getRelayTotalPackets状态查询接口 - 移除getGd32Version版本获取方法 - 清理StateLockGuard中的isLocked方法
6.9 KiB
6.9 KiB
死函数清理与兼容标记计划
目标
逐函数扫描 main/(C++)、tools/(JS)及根目录 Python 脚本,识别:
- 死函数:已定义但无调用、未注册、未绑定,直接清理。
- 旧版本兼容函数:仍被调用但无实际作用,或注释/命名表明为兼容保留,进行明确标记(保留并加注释,或连同调用点一起移除)。
扫描已完成,共覆盖约 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均为纯顺序脚本,无函数定义,无需改动。
五、验证步骤
- 修改后执行
idf.py build(或等价的idf.py fullclean+build)验证 C++ 无编译/链接错误。 - 浏览器打开
tools/index.html、tools/can.html,验证控制台无xxx is not defined报错。 - 检查 C++ 中是否产生新的
-Wunused-function/-Wunused-variable警告。 - 对存疑项做二次 grep 确认无调用。
六、风险与保留项
canFdSendNoReply/canFdPullIdSnapshot是公共 API,当前无调用。若你计划后续通过 HTTP/SPI 暴露它们,可以改为加[[maybe_unused]]或保留注释;否则按死函数删除。ota_prepare_handler实现完整,若你打算未来启用/ota/prepare端点,应改为注册而非删除。本次计划按“当前死代码”删除处理。renderSelectedMessage()仍被调用,保留作为明确的旧版兼容 shim。
七、交付物
- 修改后的 C++ 源文件与头文件(死函数已删除,兼容项已标记/保留)。
- 修改后的 JS 文件(死函数已删除,空壳 shim 已清理)。
- 一份简短变更摘要,列出删除的函数及保留的兼容 shim。
idf.py build成功输出。