# 软硬件全链路测试计划(设备到场后执行) > 目的:验证三线逆向结论在真机上的正确性,完成 G3/G4 的实机门禁。 > 前置:设备充电开机;本机蓝牙可用;`tools/check_env.py` 通过。 > 执行方式:`.venv/bin/python tools/field_test.py [--mac AA:BB:..]`(引导式,自动+目视确认)。 > 危险操作仅 `--ota` 分支,默认跳过。 ## 阶段 0 · 预检(自动) | # | 检查 | 通过标准 | |---|------|----------| | 0.1 | check_env.py | 全 OK | | 0.2 | 蓝牙适配器 | `ppclock scan` 返回 ≥0 设备不报错 | | 0.3 | 固件样本 | `ppclock ota app/firmware-PP_da14585_4.2_CH.img` 预检 ok(**不烧录**) | ## 阶段 1 · 发现与识别(自动) | # | 检查 | 通过标准 | |---|------|----------| | 1.1 | `scan` | 发现 `NRF-XXXXXX` 设备,记录 MAC | | 1.2 | `activate --show-id` | 收到 14 hex 设备 ID;本地反解 MAC 与 1.1 的 MAC 对比(字节序验证 → 回填 DECISIONS.md) | | 1.3 | 断线重连 | CLI 连续两次命令均成功 | ## 阶段 2 · 激活(自动+目视) | # | 检查 | 通过标准 | |---|------|----------| | 2.1 | `activate --auto` | ok=true,code 与 keygen 一致;屏上激活提示(若有)消失 | | 2.2 | 错误码激活 | 发 6 字节全 0 码:无惩罚、后续命令仍可用(验证固件不门禁结论 §4.3) | ## 阶段 3 · 时钟/模式族(目视) | # | 命令 | 屏显预期 | |---|------|----------| | 3.1 | `time` | 屏显时间与手机/电脑一致 | | 3.2 | `mode clock1/2/3` | 三种时钟版式切换 | | 3.3 | `mode calendar1/2/3` | 三种日历版式切换 | | 3.4 | `toggle hour_format` | 12/24h 切换 | | 3.5 | `toggle clock_color` | 时钟颜色变化 | | 3.6 | `toggle invert` | 反色 | | 3.7 | `toggle font` | 字体变化 | | 3.8 | `toggle rotate180` | 旋转 180°(恢复再按一次) | | 3.9 | `mode tricolor` / `mode mono` | 三色/黑白切换 | | 3.10 | `clear` | 全屏刷新 | ## 阶段 4 · 图像(目视) | # | 命令 | 屏显预期 | |---|------|----------| | 4.1 | `image <棋盘+红块测试图> --slot 0` → `mode image0` | 棋盘清晰、红块为红 | | 4.2 | 六算法各传一张 | 抖动风格差异可见(Floyd/Atkinson/Bayer/Stucki/Jarvis/none) | | 4.3 | `image --mono` | 无红色通道 | | 4.4 | `image --size 400x180`(小图 cod=04 路径) | 小图正常 | | 4.5 | 亮度/对比度/饱和度/旋转参数 | 效果可见 | | 4.6 | `image --slot 1..3` + `mode image1..3` | 多槽位(注意:固件 EA0x 为 no-op 风险 → 记录实际行为) | ## 阶段 5 · 模板(目视) 6 模板(schedule/businesscard/memo/course/qrcode/custom)各传一次:版式正确、中文无方块、`【…】` 字段为红。 ## 阶段 6 · 倒计时(目视) | # | 命令 | 预期 | |---|------|------| | 6.1 | `countdown 2026-12-31 --prefix 目标` | 时钟界面显示前缀+天数 | | 6.2 | `countdown --mode calendar 2026-12-31 --prefix 中考` | 日历界面 | | 6.3 | `countdown --show-calendar --prefix test` | upload_rili 序列 | | 6.4 | `countdown --off` | 倒计时关闭 | ## 阶段 7 · 其他命令(含固件 no-op 验证) | # | 命令 | 预期 | |---|------|------| | 7.1 | `sleep --on --start 23 --end 7` | 时段内不刷新(次晨验证);`sleep --off` 恢复 | | 7.2 | `parking 13800138000` | 停车牌显示 | | 7.3 | `lut 0x05` / `lut 0x15` | 红/黑深度变化 | | 7.4 | `rotation --count 4`、`rotation --interval 5` | **验证固件 no-op 结论**:预期无效果(firmware-analysis §3.3) | | 7.5 | `wifi SSID PASS` | **验证 no-op**:预期无效果 | | 7.6 | `raw e2` / `raw 01 --channel epd` | 提交/刷新 | ## 阶段 8 · 异常与契约(自动) | # | 检查 | 通过标准 | |---|------|----------| | 8.1 | 错误参数 | `--json` 输出 `{"ok":false,...}`,退出码 1 | | 8.2 | 设备关机中途执行 | 退出码 2,error 含连接失败 | | 8.3 | `batch examples/field_test.jsonl` | 单连接全序执行,results 逐行 ok | ## 阶段 9 · 固件可控(高危,默认跳过,`--ota` 才执行) | # | 步骤 | 预案 | |---|------|------| | 9.1 | field_test.py 自动制作仅改版本串镜像(`V:PP_da14585_4.2`→`V:PP_da14585_TST`,等长),fw_pack 重打包,CRC 验证 | 本地完成,不触机 | | 9.2 | `ppclock --mac X ota /tmp/fw_tst.img --yes` | 观察块进度 302 块全 ok | | 9.3 | 设备重启后 `scan` + `time` | 设备复活且可用 | | 9.4 | 回滚 | `ota 原镜像 --yes` 刷回 | | 9.5 | 若 9.2 失败/变砖 | 记录 SERV_STATUS 错误码;设备有备 bank(0x38000 产品头机制,firmware-analysis §5),断电重连试刷原镜像 | ## 结果回填 - 每步实际结果记于本文件"实测"列(执行时生成 field-test-result.md) - 与协议不符处 → 改 docs/protocol.md + 测试向量 + DECISIONS.md - 全过 → PROGRESS.md 将 G3/G4 从"协议级/工具级"升级为"实机验证",Plan Task 9 勾掉