fix(ui/wave): 回放页段表枚举恒空根因修复(seg_path 返回值判错 + 键处理缺重绘) #67

Merged
wandering1 merged 5 commits from fix-replay-enum-0e52b1963afa into master 2026-11-02 19:52:21 +08:00
Collaborator

This is by an automated agent, not a human.

修 #38 §5 阻塞缺陷「回放页段表枚举恒空」:真机开回放页恒显「无录波段」,而同一时刻
FTP LIST /wave 段文件全在、RETR/DELE 正常。

根因(10-31 的定性被板级 FR 埋点推翻)

埋点构建上板后串口实录(2026-11-02 17:49):

[UI_TASK] ui wave scan #1 done cnt=7 np=0 tt=0 ac=407
[ERR][UI_TASK] ui wave head #1 path fail idx=6

cnt=7 np=0 tt=0 说明目录枚举与卷锁一直正常(10-31 判的「uiTask 拿不到目录条目」
不成立)。真正坏的是取段:wave_store_seg_path() 的契约是「>=0 = 写入字符数(本形态恒
16),失败才是负码」(App/algo/wave_store.h),而读侧 ui_task_wave_load_head() 与
ui_task_wave_seg_win() 从功能建成起写成 != 0 判失败——每次成功都被判死,
f_open 永远走不到,盘上有段也恒显「无录波段」。写侧 default_task.c 用同一函数但写
<= 0,一直正确;模拟器走假 s_wave_ops 桩、不编译读路径,所以黄金参考图与三组主机
单测从未覆盖到这条链。

修复过程中另暴露同页第二缺陷:ui_page_wave_play.c 的 pg_key() 接管控件键后从未调
ui_content_page_invalidate(),框架只在 key_cb 返回 false 时替页失效——真机按键送达、
s_idx/s_ch 已变、帧字节完全不变(同帧 SHA-256),切道切段屏上纹丝不动。被枚举缺陷
完全遮住(整页恒空、没有可切的画面),随本次修复首次上板才暴露。

改动(5 个提交)

提交 内容
ee002d7e ui_task_wave_scan() 失败不再无条件钉 s_wave_scanned=1(卷忙/失败不再钉成假「0 段」空态),失败分支带 FR 码留痕
3e01e9d9 临时诊断加强(#N 序号、try 闸计数、完成行无条件打印、head/win 失败带 FR 码)——已随根因修复收敛删除
d6253aa9 根因修复:两处 wave_store_seg_path() 判据改 <= 0(与写侧同口径);「表列着、开档失败」补永久 FR 留痕;临时诊断收敛
04609791 回放页键处理三处成功路径补 ui_content_page_invalidate()(与已接管键的页面同纪律);切段失败仍「按了没动」不重绘
364b1636 文档闭环:设计说明 §10 修复记录、到场轮手册第一幕标完成、登记簿销项、证据帧入库

Before / After(同台架、同 APP、同 4× 放大取帧,仅固件不同)

回放页开屏
修复前 7efa58d9 构建(身份戳 Nov 2 2026 14:21:24) 修复前回放页
修复后 本分支构建(Code=247,288 B) 修复后回放页

修复后补充两帧证明段表与键处理都活了(同分支固件):

切上一段(l) 切下一通道(d)
切段 切道

开屏 = UA SEC6 M、Pk=−1423 mV;切段 = UA SEC5 M、Pk=1744 mV;切道 = UB SEC5 M、
右上「削」徽标、Pk=843 mV。至此回放页「真段 / 坏段 / 空态」三态都有测试面,第二幕
到场轮的坏段画面判据可跑。

验证

  • /keil-build:0 错误 0 警告(Code 247,284 → 247,288 B,RAM 不变);台账 / 同码凭证 /
    数字回填同批刷新。
  • 板级:三次烧录(埋点 / 诊断 / 根因修复)均 READBACK: OK (no difference found) +
    启动门禁 VERDICT: PASS;回放页真段显示、切段、切道全部实测(上面四帧)。
  • pre-commit:全量门禁(UI 像素回归 8+66 张、BOM 漂移、双端注册、嵌套注释、mem-budget
    92%、doc-links 等)在最终提交上通过;check_doc_links.py --all 通过。
  • 远端 CI:本仓库静态门禁 job 在 master 上即为红(最近十余次 push/PR run 均失败,与本
    PR 无关);本 PR 未新增失败面,详见构建日志。

说明

  • 10-31 那条「uiTask 拿不到目录条目」的定性已就地标注为被推翻(保留为推理起点留痕),
    登记簿条目按「完成即销项」删除,完整证据链落进设计说明 §10。
  • 坏段/空态画面的真机拍摄、注量对表仍需到场轮(第二幕),本 PR 只打开测试面,不替它
    们背书。
This is by an automated agent, not a human. 修 #38 §5 阻塞缺陷「回放页段表枚举恒空」:真机开回放页恒显「无录波段」,而同一时刻 FTP `LIST /wave` 段文件全在、`RETR`/`DELE` 正常。 ## 根因(10-31 的定性被板级 FR 埋点推翻) 埋点构建上板后串口实录(2026-11-02 17:49): [UI_TASK] ui wave scan #1 done cnt=7 np=0 tt=0 ac=407 [ERR][UI_TASK] ui wave head #1 path fail idx=6 `cnt=7 np=0 tt=0` 说明**目录枚举与卷锁一直正常**(10-31 判的「uiTask 拿不到目录条目」 不成立)。真正坏的是取段:`wave_store_seg_path()` 的契约是「>=0 = 写入字符数(本形态恒 16),失败才是负码」(`App/algo/wave_store.h`),而读侧 `ui_task_wave_load_head()` 与 `ui_task_wave_seg_win()` 从功能建成起写成 `!= 0` 判失败——**每次成功都被判死**, `f_open` 永远走不到,盘上有段也恒显「无录波段」。写侧 `default_task.c` 用同一函数但写 `<= 0`,一直正确;模拟器走假 `s_wave_ops` 桩、不编译读路径,所以黄金参考图与三组主机 单测从未覆盖到这条链。 修复过程中另暴露同页第二缺陷:`ui_page_wave_play.c` 的 `pg_key()` 接管控件键后从未调 `ui_content_page_invalidate()`,框架只在 key_cb 返回 false 时替页失效——真机按键送达、 `s_idx/s_ch` 已变、帧字节完全不变(同帧 SHA-256),切道切段屏上纹丝不动。被枚举缺陷 完全遮住(整页恒空、没有可切的画面),随本次修复首次上板才暴露。 ## 改动(5 个提交) | 提交 | 内容 | |---|---| | `ee002d7e` | `ui_task_wave_scan()` 失败不再无条件钉 `s_wave_scanned=1`(卷忙/失败不再钉成假「0 段」空态),失败分支带 FR 码留痕 | | `3e01e9d9` | 临时诊断加强(`#N` 序号、try 闸计数、完成行无条件打印、head/win 失败带 FR 码)——**已随根因修复收敛删除** | | `d6253aa9` | 根因修复:两处 `wave_store_seg_path()` 判据改 `<= 0`(与写侧同口径);「表列着、开档失败」补永久 FR 留痕;临时诊断收敛 | | `04609791` | 回放页键处理三处成功路径补 `ui_content_page_invalidate()`(与已接管键的页面同纪律);切段失败仍「按了没动」不重绘 | | `364b1636` | 文档闭环:设计说明 §10 修复记录、到场轮手册第一幕标完成、登记簿销项、证据帧入库 | ## Before / After(同台架、同 APP、同 4× 放大取帧,仅固件不同) | | 回放页开屏 | |---|---| | **修复前** `7efa58d9` 构建(身份戳 `Nov 2 2026 14:21:24`) | ![修复前回放页](http://100.123.83.113:3001/wandering1/STM32F4-Base/raw/branch/fix-replay-enum-0e52b1963afa/docs/%E6%B5%8B%E8%AF%95%E8%AF%B4%E6%98%8E/%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE/wave_enum_20261102/before_replay_page.png) | | **修复后** 本分支构建(Code=247,288 B) | ![修复后回放页](http://100.123.83.113:3001/wandering1/STM32F4-Base/raw/branch/fix-replay-enum-0e52b1963afa/docs/%E6%B5%8B%E8%AF%95%E8%AF%B4%E6%98%8E/%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE/wave_enum_20261102/after_replay_page.png) | 修复后补充两帧证明段表与键处理都活了(同分支固件): | 切上一段(`l`) | 切下一通道(`d`) | |---|---| | ![切段](http://100.123.83.113:3001/wandering1/STM32F4-Base/raw/branch/fix-replay-enum-0e52b1963afa/docs/%E6%B5%8B%E8%AF%95%E8%AF%B4%E6%98%8E/%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE/wave_enum_20261102/after_segment_switch.png) | ![切道](http://100.123.83.113:3001/wandering1/STM32F4-Base/raw/branch/fix-replay-enum-0e52b1963afa/docs/%E6%B5%8B%E8%AF%95%E8%AF%B4%E6%98%8E/%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE/wave_enum_20261102/after_channel_switch.png) | 开屏 = `UA SEC6 M`、Pk=−1423 mV;切段 = `UA SEC5 M`、Pk=1744 mV;切道 = `UB SEC5 M`、 右上「削」徽标、Pk=843 mV。**至此回放页「真段 / 坏段 / 空态」三态都有测试面**,第二幕 到场轮的坏段画面判据可跑。 ## 验证 - `/keil-build`:0 错误 0 警告(Code 247,284 → 247,288 B,RAM 不变);台账 / 同码凭证 / 数字回填同批刷新。 - 板级:三次烧录(埋点 / 诊断 / 根因修复)均 `READBACK: OK (no difference found)` + 启动门禁 `VERDICT: PASS`;回放页真段显示、切段、切道全部实测(上面四帧)。 - pre-commit:全量门禁(UI 像素回归 8+66 张、BOM 漂移、双端注册、嵌套注释、mem-budget 92%、doc-links 等)在最终提交上通过;`check_doc_links.py --all` 通过。 - 远端 CI:本仓库静态门禁 job 在 master 上即为红(最近十余次 push/PR run 均失败,与本 PR 无关);本 PR 未新增失败面,详见构建日志。 ## 说明 - 10-31 那条「uiTask 拿不到目录条目」的定性已就地标注为被推翻(保留为推理起点留痕), 登记簿条目按「完成即销项」删除,完整证据链落进设计说明 §10。 - 坏段/空态画面的真机拍摄、注量对表仍需到场轮(第二幕),本 PR 只打开测试面,不替它 们背书。
super_agent_bot added 5 commits 2026-11-02 18:33:42 +08:00
真机回放页恒显「无录波段」而 FTP 六段全在盘上(登记簿同名条目,
见 #38 §5)。本提交按执行手册 §3 步骤 1 落两件事:

- ui_task_wave_scan:f_opendir/f_readdir 失败本轮返 -1(「本轮无完整
  事实」语义),不再无条件钉 s_wave_scanned——原实现把卷忙/FR_DENIED
  一类失败钉成「0 段」假空态,直到下一次 manual_req 才重试;失败不
  钉表后下一次进页/按键自然重试,与 soe_store 读者同纪律。
- FR_NO_PATH(从未录过波)仍归「0 段」并钉表,设计原口径不动。
- 失败分支补带 FR 码的留痕(opendir/readdir 各一条 DBG_ERROR),
  「FR_OK 但零条目」加一条 DBG_INFO(留痕行正文以
  「ui wave scan」前缀区分,tag 用本文件既有的 [UI_TASK])
  ——根因判读表见执行手册 §3,
  板级远程开一次回放页即可定性,不必猜。
- DBG_TAG 定义 + dbg_log.h 包含上收到包含区(原在 s_wave_ops 之后的
  文件中部;同标签同宏,不构成行为改动,本文件既有留痕照常)。
- 体积/RAM 同码凭证随 /keil-build(0 错误 0 警告)同批刷新:
  Code +8 B,RAM 不变;台账受管区水位按门禁要求随本次 .map 同步
  (台账此前落后 master 既有 flash 漂移 +320 B,--write 一并拉齐)。

Refs #38
第一组埋点烧后开回放页串口零留痕(既无 FR 失败也无零条目
行),剩余唯一静默分支 = try 闸取锁失败直接返回/扫描成功但有条目
不打印/段头与窗口读取失败不打印。本组补齐:

- scan:每次尝试编号 #N;try 闸失败行带 vol_lock_get_stats 计数(消费方
  观测,不取锁,符合看门狗设计说明 §4.3 口径);完成行改为无条件打印
  cnt/np/tt/ac(排除「成功但页面仍空」歧义)
- load_head / seg_win:try 闸、路径构造、开档 FR 码与读失败出口全部留痕

临时诊断构建,判性后随根因修复收敛到最小永久集。
/keil-build 0 错误 0 警告(Code +604 B,RAM 不变)。

Refs #38
FR 埋点构建上板判读(本 boot 串口实录,临时诊断构建 = 上一提交):

    [UI_TASK] ui wave scan #1 done cnt=7 np=0 tt=0 ac=407
    [ERR][UI_TASK] ui wave head #1 path fail idx=6

- 目录枚举一直是好的(cnt=7 = 盘上七段全数入表,锁也拿到,tt=0):
  10-31「唯独 ui_task_wave_scan 拿不到目录条目」的定性被推翻。
- 真正坏的在 load_head / seg_win 的拼路径判错:契约
  (App/algo/wave_store.h:458)是「成功 = 写入字符数(本形态恒 16),
  失败才是负码」,读侧自建成功能起写成 != 0 判失败——每次成功都被
  判死,f_open 永远走不到,盘上有段也恒显「无录波段」。写侧
  default_task.c 同函数用 <= 0,一直是对的,所以「FTP 六段全见、
  写侧枚举正常、唯独回放恒空」的怪象全线得解。
- 模拟器走桩、不编译本文件读侧,黄金参考图与主机单测因此从未覆盖
  这条链,此病从建成存活至今(板端首张真机波形图见 PR #67)。
- 两处口径改 <= 0(与写侧一致);表列着的段 f_open 失败补带 FR 码
  的永久留痕——该失败态页面无视觉面,10-31 误定性的教训就是静默。
- 临时诊断(#N 序号 / try 闸日志 / 无条件 done 行)收敛删除,留
  最小永久集:scan opendir/readdir FR、零条目 INFO、head/win 开档
  失败 FR。try 闸恢复静默(看门狗设计说明 §4.3 口径)。
- /keil-build 0 错误 0 警告:Code 247,284 B(较临时诊断构建
  −368 B,较修复前 +236 B),RAM 不变;台账 / 同码凭证 / 数字回填
  同批刷新。

Refs #38
回放页 v1.0 建的键处理返回 true(接管全部键),但从未调
ui_content_page_invalidate():框架只在 key_cb 返回 false 时才替页面
失效,于是「键送达、状态已切、屏上纹丝不动」。该病被枚举缺陷完全
遮住(整页恒空、没有可切的画面),随本波枚举修复首次上板才暴露:
真机按 ←/→/↑/↓ 帧字节完全不变(同帧哈希),布局与状态机无问题。

- 上/下切通道、左/右切段成功路径、空态再探路径,各补一次
  ui_content_page_invalidate()(与 ui_page_clock / ui_page_password
  等已接管键的页面同纪律);
- 切段失败仍保持「按了没动」的诚实语义(不重绘、不把忙态清成空);
- 修改记录 v1.1。

/keil-build 0 错误 0 警告(Code 247,288 B,+4 B),RAM 不变;
台账 / 同码凭证同批刷新。

Refs #38
docs(wave): 回放页枚举恒空修复闭环入档并销项
CI / 静态门禁 (pre-commit) (push) Failing after 44s
CI / 主机侧单测 (MSVC) (push) Failing after 45s
CI / 静态门禁 (pre-commit) (pull_request) Failing after 40s
CI / 主机侧单测 (MSVC) (pull_request) Failing after 42s
364b163663
- 故障录波设计说明 §10 新增「回放页枚举恒空缺陷修复记录」:四步证据链
  (失败不钉表+FR 埋点 → 诊断加强 → 根因 = 读侧用反 seg_path 返回契约 →
  同页键处理缺失效)、串口实录 `scan done cnt=7` / `head path fail idx=6`、
  修复前后板级对拍图与复现口令;10-31 那段「拿不到目录条目」的定性就地
  标注被推翻(保留为推理起点留痕);§10 表「板级·回放页」行与文首状态行
  同步为「测试面已开、坏段/空态画面仍待到场地拍」。
- 到场轮执行手册 §3 第一幕标注「已完成(2026-11-02)」,表 §1 与幕间
  依赖同步;历史三步保留但注明到场时不用再跑。
- 登记簿 §2 按「完成即销项」删除该行;任务规划 README 独立行同步。
- 证据入库 `docs/测试说明/测试数据/wave_enum_20261102/`:修复前/后回放页、
  切段、切道四帧 + README(含串口实录与复现口令)。Before = `7efa58d9`
  构建(身份戳 Nov 2 2026 14:21:24),After = 本分支构建(Code=247,288 B)。

Refs #38
super_agent_bot force-pushed fix-replay-enum-0e52b1963afa from 77606ebffc to 364b163663 2026-11-02 18:33:42 +08:00 Compare
super_agent_bot changed title from fix(ui/wave): 回放页枚举扫描失败不再钉「无段」缓存并补 FR 码留痕 to fix(ui/wave): 回放页段表枚举恒空根因修复(seg_path 返回值判错 + 键处理缺重绘) 2026-11-02 18:34:19 +08:00
Owner

@super_agent_bot 坏段/空态画面的真机拍摄、注量对表仍需到场轮(第二幕),本 PR 只打开测试面,不替它
们背书,创建新的工单,放到待办中

@super_agent_bot 坏段/空态画面的真机拍摄、注量对表仍需到场轮(第二幕),本 PR 只打开测试面,不替它 们背书,创建新的工单,放到待办中
Author
Collaborator

好的:将创建「第二幕:真机拍摄坏段/空态画面 + 注量对表」的到场轮工单,并放到待办中。

好的:将创建「第二幕:真机拍摄坏段/空态画面 + 注量对表」的到场轮工单,并放到待办中。 <!-- dsh-superagent:af8769aa80c6b977d03ebf391c76dbeb -->
Author
Collaborator

This is by an automated agent, not a human.

工单已创建并放到待办:#68 故障录波到场轮第二幕:注量对表 + 坏段/空态画面真机拍摄(看板无「待办」列,按仓库口径用「排队」列 = 待办;标签已打,card-sync 摘要:created 1 / moved 0 / kept 0 → 排队列)。判据与完成条件按手册第二幕 §4 写明,关联 #38;到场时对本仓库 agent 会话说「按故障录波到场轮手册,先做第二幕」即可开跑。

This is by an automated agent, not a human. 工单已创建并放到待办:[#68 故障录波到场轮第二幕:注量对表 + 坏段/空态画面真机拍摄](http://100.123.83.113:3001/wandering1/STM32F4-Base/issues/68)(看板无「待办」列,按仓库口径用「排队」列 = 待办;标签已打,card-sync 摘要:created 1 / moved 0 / kept 0 → 排队列)。判据与完成条件按手册第二幕 §4 写明,关联 #38;到场时对本仓库 agent 会话说「按故障录波到场轮手册,先做第二幕」即可开跑。
Author
Collaborator

新工单已建好:#68 故障录波到场轮第二幕:注量对表 + 坏段/空态画面真机拍摄,已放入「排队」(看板没有「待办」列,「排队」对应待办口径),判据与到场条件按故障录波执行手册第二幕写明。

新工单已建好:[#68 故障录波到场轮第二幕:注量对表 + 坏段/空态画面真机拍摄](http://100.123.83.113:3001/wandering1/STM32F4-Base/issues/68),已放入「排队」(看板没有「待办」列,「排队」对应待办口径),判据与到场条件按故障录波执行手册第二幕写明。 <!-- dsh-superagent:a35663d189a4ab150d2af1c713320c71 -->
wandering1 merged commit b8e1de5f2e into master 2026-11-02 19:52:21 +08:00
wandering1 deleted branch fix-replay-enum-0e52b1963afa 2026-11-02 19:52:34 +08:00
Sign in to join this conversation.
No Reviewers
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: wandering1/STM32F4-Base#67