PROGRESS / HANDOFF:补 rack 推固件页、固件目录清理、界面改版、底板温度曲线

- PROGRESS 顶部新增 rack 这一轮的汇总;C2 条目里「重启不断电待讨论」「rack 没 OTA 按钮」划掉
- HANDOFF:新增「rack 侧」一节;--reboot 的说明改为「≥c3 且目标认接管不断电」;下一步补手机窄屏检查

Co-Authored-By: Claude Opus 5.5 <[email protected]>
这个提交包含在:
zhou yang
2026-09-27 15:10:38 +08:00
共同撰写人 Claude Opus 5.5
父节点 9858b6c98e
当前提交 82d10ffefc
共修改 2 个文件,包含 23 行新增和 4 行删除
+11 -2
查看文件
@@ -1,5 +1,14 @@
# 进度与交接 # 进度与交接
## ⭐ 2026-09-27 深夜:rack 界面改版 + 底板温度曲线 + 推固件页 + 固件目录自动清理
- **推固件页**(顶栏「固件」):上传 .bin → 选板推送 OTA,实时看下载进度 / 待验证 / 回滚;上传时核镜像头,标出「重启不断电」支不支持。
- **固件下载目录自动清理**:库里登记的不删,命令行直传的 7 天删,半截上传 1 小时删。
- **界面改版**:仪器前面板风格 + 暗色模式;总览每个槽带两分钟电流小曲线(平线 = 疑似卡死),顶上一句话列出需要看的路。
- **底板温度曲线**:单板页新增两路 NTC + 风扇曲线(10 分钟 ~ 7 天,分钟聚合留 90 天);每路电流 / 电压去掉双 Y 轴。
线上板 B 实测 24.4 / 26.0 °C(空载室温)。rack 后端 42 例本机 + 服务器全绿。**还欠**:手机上看一眼窄屏排版。
- 详见 `rack/README.md`「界面」「推固件」两节。
## ⭐ 2026-09-27 夜:固件 0.1.1-c3 —— I²C 不应答不再被报成「没初始化 / 忙」 ## ⭐ 2026-09-27 夜:固件 0.1.1-c3 —— I²C 不应答不再被报成「没初始化 / 忙」
- IDF 5.4 的 NACK 返回 `ESP_ERR_INVALID_STATE`,HAL 照翻成 STATE ⇒ 关电在 PCA9555 不应答时回 `busy`(其实已经关了)。 - IDF 5.4 的 NACK 返回 `ESP_ERR_INVALID_STATE`,HAL 照翻成 STATE ⇒ 关电在 PCA9555 不应答时回 `busy`(其实已经关了)。
@@ -16,8 +25,8 @@
- `ota` 命令给 URL + sha256 + size,板子经 HTTP(服务器 nginx 7765,不过门户)下载,哈希对上才切分区;新固件 120 s 内连不上 broker 就回滚。 - `ota` 命令给 URL + sha256 + size,板子经 HTTP(服务器 nginx 7765,不过门户)下载,哈希对上才切分区;新固件 120 s 内连不上 broker 就回滚。
- 板 B 实测三条路径都对:正常推送 19 s、错哈希不切、断掉 broker 账号后 120 s 回滚。现跑 **0.1.0-c2**(经 OTA 推上去的)。全工程 442 例全绿。 - 板 B 实测三条路径都对:正常推送 19 s、错哈希不切、断掉 broker 账号后 120 s 回滚。现跑 **0.1.0-c2**(经 OTA 推上去的)。全工程 442 例全绿。
- ⚠️ OTA 重启 / 回滚 = **五台手机硬断电一次**(ESP 复位 EN 下拉),所以 `reboot` 默认 false。「重启不断电」要动安全链,待讨论。 - ⚠️ OTA 重启 / 回滚 = **五台手机硬断电一次**(ESP 复位 EN 下拉),所以 `reboot` 默认 false。~~「重启不断电」待讨论~~ ✅ c3 已做(见上)。
- 推固件:`python firmware/tools/ota_push.py <id> [--reboot]`;rack 界面还没 OTA 按钮。详见 `firmware/HANDOFF.md`。 - 推固件:`python firmware/tools/ota_push.py <id> [--reboot]`;~~rack 界面还没 OTA 按钮~~ ✅ 已有「固件」页。详见 `firmware/HANDOFF.md`。
## ⭐ 2026-09-27 夜:固件 A16(风扇闭环 + NTC/TACH 真实采样)完成 ⇒ A1~A16 齐了 ## ⭐ 2026-09-27 夜:固件 A16(风扇闭环 + NTC/TACH 真实采样)完成 ⇒ A1~A16 齐了
+12 -2
查看文件
@@ -1,5 +1,5 @@
# 交接 # 交接
更新:2026-09-27 **0.1.1-c3**:修了 I²C 不应答被报成 STATE / 关电回 busy(下面「0.1.1」);**0.1.0-c3:重启不断电** 更新:2026-09-27 深夜 固件 **0.1.1-c3**(I²C 不应答不再报成 STATE;重启不断电)+ rack 界面改版 / 推固件页 / 底板温度曲线
## 一句话现状 ## 一句话现状
OTA 换固件 / 超时回滚现在走 `warm_restart()`(`main/warm_esp.c`):目标固件认接管 ⇒ 手机不断电; OTA 换固件 / 超时回滚现在走 `warm_restart()`(`main/warm_esp.c`):目标固件认接管 ⇒ 手机不断电;
@@ -27,6 +27,16 @@ OTA 换固件 / 超时回滚现在走 `warm_restart()`(`main/warm_esp.c`):
## 下一步(没人定,候选) ## 下一步(没人定,候选)
- 示波器验证:插一片刀片,CH 开着,OTA 带重启,抓 EN / 输出电压(`scope_*` 工具)。 - 示波器验证:插一片刀片,CH 开着,OTA 带重启,抓 EN / 输出电压(`scope_*` 工具)。
- 在手机上看一眼 rack 新界面(390 px 左右):无头 Chrome 最窄只到 ~500 px,窄屏只验到那里。
- 下面「其它挂着的事」里 A15 / A16 留下的几条(I²C 总线挂死恢复、PD 降载、风扇阈值实测)照旧。
## rack 侧(服务器前后端,详见 `rack/README.md`)
- **固件页**(顶栏「固件」):上传 `build/phonerail.bin` → 选板推送;上传时核镜像头(非本工程 / 非 app 镜像 / >3 MB 直接拒),
显示每个镜像「重启不断电:支持 / 不支持」,勾「立刻重启」时按它给不同提示。通用 `/cmd` 不放行 `ota`(URL / 哈希只能由固件库生成)。
- **下载目录自动清理**(每小时):库里登记的不删;`ota_push.py` 直传的放满 7 天删;半截 `.tmp` 1 小时删。
- **界面改版**:仪器前面板风格 + 暗色模式(跟随系统);总览每个槽带最近两分钟电流小曲线(平线 = 疑似卡死)。
- **底板温度曲线**(单板页):两路 NTC + 风扇占空比,10 分钟 ~ 7 天;后端 `board_tele_min` 分钟聚合留 90 天,
接口 `GET /api/boards/{id}/history`。NTC1 贴 Hub 稳压 U31,NTC2 贴输入降压 U37。
## 踩到的坑(c3) ## 踩到的坑(c3)
- `.rodata_custom_desc` 没人引用会被 `--gc-sections` 丢掉 ⇒ `main/CMakeLists.txt` 加 `-u g_phonerail_caps`。 - `.rodata_custom_desc` 没人引用会被 `--gc-sections` 丢掉 ⇒ `main/CMakeLists.txt` 加 `-u g_phonerail_caps`。
@@ -37,7 +47,7 @@ OTA 换固件 / 超时回滚现在走 `warm_restart()`(`main/warm_esp.c`):
## 怎么推固件 ## 怎么推固件
``` ```
python tools/ota_push.py b81f3fc9c8bc # 推 build/phonerail.bin:只下载 + 校验 + 切分区,下次复位生效 python tools/ota_push.py b81f3fc9c8bc # 推 build/phonerail.bin:只下载 + 校验 + 切分区,下次复位生效
python tools/ota_push.py b81f3fc9c8bc --reboot # 校验过就立刻重启 —— ⚠️ 五台手机硬断电一次 python tools/ota_push.py b81f3fc9c8bc --reboot # 校验过就立刻重启(板上 ≥c3 且目标镜像认接管 ⇒ 手机不断电,否则五路全断一次)
python tools/ota_push.py b81f3fc9c8bc --status python tools/ota_push.py b81f3fc9c8bc --status
``` ```
它把镜像传到服务器 `/root/phonerail/fw/<sha 前 16 位>.bin`(nginx 7765,只放行这种文件名,不过门户; 它把镜像传到服务器 `/root/phonerail/fw/<sha 前 16 位>.bin`(nginx 7765,只放行这种文件名,不过门户;