be16669564
台架实机会话 2026-11-02(bench 档 fw 22:25:12 / 产品档 22:29:56,均经 /serial-boot-test 闭环:身份戳匹配 + 回读 no-difference): - 复核② 收列键语义:菜单态按 s 与按 l 同走 menu_back、均收 一级且父列选中留在原地(depth 1→0、sel 不变)——旧断言 「菜单态按 s 不收列」是把待机态 s 无效(task-24 实证)误 读成菜单行为。to_root() 据此在 STATUS depth>0 时按 s 逐级 收(弹框被屏裁时像素 n_cols 漏计、固件 depth 不漏),老固 件像素路径保留 l 兜底仪式。§7.2 纪律与 board-ui-nav skill 恢复配方同步改写。 - 复核① 被裁弹框两叶:菜单步进依旧吃不到(枚举落同胞页, 落点由 STATUS 如实报出、不再谎称到达);GOTO 直开两叶到 达且完整渲染(自检记录 ink 4073 / 运行记录 ink 3559)→ KNOWN_UNREACHABLE 对 --to 保留,绕行路径 --goto。§7.4 改写。 - 产品档(未加宏)实测:STATUS 照常应答(不设闸)、GOTO 回 status=4——生产/bench 行为差异真机钉死;§7.6 增实机验证记 录段。回归:--selftest-quick 66/66+闸 7/7;--selftest 闭环 失败集与 master 基线逐项一致(6 存量像素 + 2 执行类拒绝)。
74 lines
5.1 KiB
Markdown
74 lines
5.1 KiB
Markdown
---
|
||
name: board-ui-nav
|
||
description: 板端 UI 交互的唯一正确入口:先问固件"我在哪"(STATUS 身份查询),再决定按键;到页用闭环 --to 或 bench 直开 --goto。附 #69 实证的四类走错页根因与恢复配方。
|
||
whenToUse: 需要上真机/台架进某页面看图(如故障录波、回放、定值)、在板端做 UI 取证、或从错误页面/待机态/未知屏恢复时。**写任何注键/取帧代码之前先读本技能**。
|
||
---
|
||
|
||
# 板端 UI 导航(唯一入口 = scripts/board_ui_nav.py)
|
||
|
||
一句话纪律:**一切"进页面看图"都走 `scripts/board_ui_nav.py`,禁止另写一次性注键脚本。**
|
||
2026-11-02 #38 调试里"总是进错误页面浪费大量时间"的直接原因,就是临时手搓
|
||
`board_walk*.py` 盲按 `d*9`——而闭环导航器 2026-10-25 起就已存在(10-25 盲走事故
|
||
9 个目标只有 3 个落对,`docs/UI设计/UI_自动化测试流程.md` §7.1)。
|
||
|
||
## 为什么不能自己搓(#69 复盘四类根因,全部有实证)
|
||
|
||
1. **协议旧版零身份反馈**:KEY 的 ACK 是空帧,"发了 5 个键"≠"到了第 5 层"。(已修:
|
||
7003 新增 STATUS 命令,固件直读 `s_depth/s_path/s_sel` + 当前内容页 id,见下)
|
||
2. **N−1 屏坑**:KEY ACK 与 LCDMEM 推流共用同一条 TCP,`sleep(0.30)` 就抓帧拿到的是
|
||
上一屏(规则①:排空到帧流静默 ≥900 ms;现在 `key()` 代码已真正执行排空+双帧比对)。
|
||
3. **物理陷阱**:待机态按 `e` 是**重开最近页**不是进菜单;级联列光标记忆上次行不归零;
|
||
根列最后两行的子列弹框被 160×160 屏裁掉(selftest/runlog 因此"读不到选带")。
|
||
4. **认屏误判**:菜单子列标签与页标题同字(记录查询子列里的 事故记录/操作记录…),
|
||
像素分类器会把级联菜单判成 PAGE——**有 STATUS 时以 STATUS 为准**,trace 留痕不一致。
|
||
|
||
## 命令(python 一律 .venv;真机动作必须已持 bench 锁并加 --i-hold-bench-lock)
|
||
|
||
```powershell
|
||
# 我在哪?(固件身份 + 像素双口径,不一致会留痕打印)
|
||
.venv\Scripts\python.exe scripts\board_ui_nav.py --where --i-hold-bench-lock
|
||
|
||
# 到页:闭环步行(像素态设备/老固件也能用;每键重认屏,绝不猜步数)
|
||
.venv\Scripts\python.exe scripts\board_ui_nav.py --board --to wave_play --grab C:\temp\wx --i-hold-bench-lock
|
||
|
||
# 到页:bench 固件直开页(一次往返直达,不注键;见下"直开页的边界")
|
||
.venv\Scripts\python.exe scripts\board_ui_nav.py --goto wave_play --grab C:\temp\wx --i-hold-bench-lock
|
||
|
||
# 提交门禁快检(无台架、无模拟器产物也要绿)
|
||
.venv\Scripts\python.exe scripts\board_ui_nav.py --selftest-quick
|
||
```
|
||
|
||
`--list` 列出全部合法页 id 与菜单路径;`--trace 路径` 落步迹 jsonl(排错先看它)。
|
||
退出码:0 成功 / 1 分类或导航失败 / 2 环境错误 / 3 拒动(未持锁确认位等)。
|
||
|
||
## 身份回读与直开页(#69 新增,两端共享 ui_net_sink.h 契约)
|
||
|
||
- **STATUS(命令 4)**:应答 `[ver][kind][depth][n][id_len][path][sel][page id]`;
|
||
kind = MENU/PAGE/STANDBY(待机优先判)。老固件不应答 → 主机打印一次后自动退回纯像素。
|
||
生产固件也支持 STATUS(只读、零画面副作用)。
|
||
- **GOTO(命令 5)**:**编译期双闸** `DTU_BENCH`(临时 bench 固件)或模拟器宏
|
||
`UI_REMO_ALLOW_GOTO`;生产固件恒拒 `status=4`。拒绝码:1 无此页 id / 2 执行类页 /
|
||
3 开页失败 / 5 待机态(先按键唤醒再来)。直开按查看权限 `UI_PERM_VIEW` 进入,
|
||
**不弹密码**——所以它只用于调试取证,不能当作"过密码"的旁路写路径。
|
||
- 执行类页面 `clear`/`reset`(第二次 ENTER 即真执行)主机与固件**双侧**默认拒绝,
|
||
`--allow-exec-pages` 才放行,放行 = 接受后果。
|
||
|
||
## 走错页 / 未知屏恢复配方(按序,不跳步)
|
||
|
||
1. `--where` 先看 STATUS:`PAGE` → 按 `s` 关页(导航器 `--to` 自动做);
|
||
`STANDBY` → 按 `e` 唤醒(注意规则②:home 上 `e` 可能重开最近页);
|
||
`MENU depth>0` → 按 `s` 或 `l` 都收一级(台架复核 2026-11-02:菜单态 `s` 与 `l` 同走
|
||
`menu_back`,父列选中留在原地;旧说法"`s` 不收列"系把待机态 `s` 无效误读成菜单行为)。
|
||
2. STATUS 无应答(老固件)才吃退避键序(默认 `esl`,`--backoff-keys sl` 可去 ENTER);
|
||
ENTER 上限 1 次是硬闸(BACKOFF_MAX_E),报停机就 dump 帧人眼看,不许连按。
|
||
3. 反复落错页且 trace 里出现"像素与 STATUS 不一致" → 分类器或固件有账要记,
|
||
把留痕帧 `--dump-fail` 存下交 Lead,**不要**改判据迁就现状。
|
||
|
||
## 边界
|
||
|
||
- 本脚本不申请锁、不碰串口与烧录;锁的取还见 task-worktree 技能
|
||
(`lock acquire bench --task <ID>`)。
|
||
- 台架证据只进 `ci-artifacts/`(`--walk` 默认 `ci-artifacts/uinav/walk/`,与 BOARD_TRUTH
|
||
读取目录已并一),不进工作树。
|
||
- UI 源码改动的前后回归是 ui-verify 技能(5 门禁),本技能只管"人到板上去看"。
|