From a98d4e06e8fa47dcd15ba5d1364651d1769e4b1b Mon Sep 17 00:00:00 2001 From: Wanderingss <1624155937@qq.com> Date: Fri, 13 Nov 2026 14:51:49 +0800 Subject: [PATCH] =?UTF-8?q?UI=20=E5=85=B6=E4=BD=99=E4=BA=94=E4=B8=AA?= =?UTF-8?q?=E5=AE=9E=E6=97=B6=E9=A1=B5=E6=8E=A5=E5=85=A5=E6=A1=86=E6=9E=B6?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=A4=B1=E6=95=88=EF=BC=88=E6=8C=89=E5=86=85?= =?UTF-8?q?=E5=AE=B9=E5=8F=98=E5=8C=96=E8=8A=82=E6=8B=8D=E5=88=86=E6=A1=A3?= =?UTF-8?q?=E5=8F=96=E5=80=BC=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 描述符各加一行(机制 task-2 已建,本轮零框架代码改动):dc 300ms(电气量与 ac 同账);yx 500ms(遥信变位按 1s 内上屏到位,比 300 档少 40% 稳态重绘); clock 1000ms(快变项只有墙钟秒尾);device_info / runreport 1000ms 并把新鲜度 源换到通道二 .auto_seq = ui_data_info_seq(info 与 rt 同拍 200ms 发布) ——各页取值账目在该页描述符注释 - docs/UI设计:供给说明 §5.5 改六页全接终态(用户裁定 2026-11-13);内容页架构 字段表/内存表/变更记录同步;自动化测试流程补 rtlive 覆盖行;页面扩充方案 追加 74 张现势注(带日期史实行冻结不动) - .dsh/skills/lvgl-simulator:开关表加 --rtlive 行、黄金参考计数 66→74 同步 验证:模拟器 0错0警;菜单 8 状态 + 内容页 74 张 + rtlive PASS(lead 独立复跑 RC=0,池水位 5368/5448B 均不漂移——timer 开页创建关页销毁、分配归还); Keil 0错0警且 Code/RO/RW/ZI 与 task-2 基线逐字节一致(只改常量值);BOM 全补回。 --- .dsh/skills/lvgl-simulator/SKILL.md | 5 +++-- Drivers/BSP/UI/ui_page_clock.c | 7 +++++++ Drivers/BSP/UI/ui_page_dc.c | 5 +++++ Drivers/BSP/UI/ui_page_device_info.c | 9 +++++++++ Drivers/BSP/UI/ui_page_runreport.c | 7 +++++++ Drivers/BSP/UI/ui_page_yx.c | 6 ++++++ docs/UI设计/UI_数据供给设计说明.md | 3 +-- docs/UI设计/UI_自动化测试流程.md | 2 +- docs/UI设计/内容页架构.md | 9 ++++++--- docs/UI设计/页面扩充详细方案.md | 2 +- scripts/size_attestation.json | 8 ++++---- 11 files changed, 50 insertions(+), 13 deletions(-) diff --git a/.dsh/skills/lvgl-simulator/SKILL.md b/.dsh/skills/lvgl-simulator/SKILL.md index c273151a..760fa5b1 100644 --- a/.dsh/skills/lvgl-simulator/SKILL.md +++ b/.dsh/skills/lvgl-simulator/SKILL.md @@ -1,6 +1,6 @@ --- name: lvgl-simulator -description: LVGL PC 模拟器构建/运行/自检入口:build_sim.bat 自动探测本机 VS、lvgl_sim.exe 无头截图与自检开关(--screenshot/--keys/--standby/--cfgtest/--logtest/--idle)、三套回归脚本、两份 lv_conf.h 同步门禁、构建报错速查(SDL2/lv_conf 找不到、全黑、键盘无响应)。 +description: LVGL PC 模拟器构建/运行/自检入口:build_sim.bat 自动探测本机 VS、lvgl_sim.exe 无头截图与自检开关(--screenshot/--keys/--standby/--cfgtest/--logtest/--idle/--rtlive)、三套回归脚本、两份 lv_conf.h 同步门禁、构建报错速查(SDL2/lv_conf 找不到、全黑、键盘无响应)。 whenToUse: 需要构建或运行模拟器、无头截图出图、跑模拟器自检或 UI 回归、修改 simulator/ 目录代码或 simulator/lv_conf.h、排查模拟器构建/运行异常时。UI 改动后的完整回归走 ui-verify skill。 --- @@ -28,12 +28,13 @@ PC 上编译运行与 MCU **同一份** UI 源码(CMake + MSVC + SDL2,x64, | `lvgl_sim.exe --standby shot.bin` | 待机页截图 | | `lvgl_sim.exe --cfgtest` | 配置引擎闭环:加载→轮询→外部改文件重载→外科式保存回验。临时用当前 CWD 的 `sim_config.ini`,**跑完无论成败一律删除**(旧行为连 PASS 路径也会留一份 4000 B 伪造档 → 之后每次运行都被加载 → 引擎按设计拒写超长文档 → 网口设置页保存行变 `ERR`,把像素回归带偏) | | `lvgl_sim.exe --logtest` | syslog 后端闭环(定长记录/时间戳/轮转) | +| `lvgl_sim.exe --rtlive "dee" a.bin b.bin` | 框架自动失效实证:开交流量页截 A → 发布 1 帧确定性斜坡值 → 直接调 `ui_content_page_auto_poll()` → 截 B;退出码 0 且 A≠B = PASS(零按键新帧落屏;无头黄金参考从不走此路径——无头不跑 `lv_timer_handler`) | ⚠ **模拟器按当前工作目录读写 `sim_config.ini`**:目录里残留一份配置就会改变页面内容。`simulator/tests/` 两套回归因此一律在**空临时目录**里跑(`cwd=tmp`);手工跑 `--keys`/`--screenshot` 做对比时,也要先确认当前目录没有 `sim_config.ini`,否则"复现不了别人的 FAIL"。 ## UI 改动回归 → 用 `ui-verify` skill(勿在此零散手跑) -5 步门禁 = 构建 → `check_menu_rows.py`(菜单 8 状态像素 + 池基线)→ `check_content_pages.py`(文本断言 + 66 张黄金参考 + 往返池)→ `/keil-build` → `coding-standard`。 +5 步门禁 = 构建 → `check_menu_rows.py`(菜单 8 状态像素 + 池基线)→ `check_content_pages.py`(文本断言 + 74 张黄金参考 + 往返池 + rtlive)→ `/keil-build` → `coding-standard`。 RemoDispBus 推流回归单独跑:`.venv\Scripts\python.exe simulator/tests/check_remo_sink.py`。 黄金参考 `tests/ref/*.bin` **随仓库入库**(`.gitignore` 在全仓 *.bin 兜底之后又显式反选,2026-10-22 起;缺基准 = 新克隆跑 `ui-golden` 必 FAIL):不入库的只是派生目检图 `ref/*.png`,换机后先 `check_content_pages.py --update` 生成,再 `regen_ref_png.py` 出目检 PNG。 diff --git a/Drivers/BSP/UI/ui_page_clock.c b/Drivers/BSP/UI/ui_page_clock.c index 80a43af4..c02ed998 100644 --- a/Drivers/BSP/UI/ui_page_clock.c +++ b/Drivers/BSP/UI/ui_page_clock.c @@ -385,4 +385,11 @@ const content_page_def_t ui_page_clock_desc = { .refresh = pg_refresh, .draw_cb = pg_draw, .key_cb = pg_key, + /* 自动失效轮询(机制见 ui_content_page.h 的 auto_ms 注;口径见供给说明 §5.5): + * 本页快变项只有墙钟秒尾——rt 帧 200ms 一发,但秒每 1s 才变,轮询快于 1s + * 只会把同一秒多画几遍(seq 随帧走,每拍都触发整页重绘)。取 1000ms: + * 1000 = 5 × 发布节拍 = 50 × LVGL 整刷周期 20ms;最坏屏上滞后 200 + 1000 = + * 1200ms,屏显是墙钟字符串(非自走计数),迟到的是展示不是时刻,不累积漂移。 + * 编辑态无碍:失效只按当前叠层状态重绘,不动编辑数据 */ + .auto_ms = 1000u, }; diff --git a/Drivers/BSP/UI/ui_page_dc.c b/Drivers/BSP/UI/ui_page_dc.c index 834fac41..e3b2c22e 100644 --- a/Drivers/BSP/UI/ui_page_dc.c +++ b/Drivers/BSP/UI/ui_page_dc.c @@ -149,4 +149,9 @@ const content_page_def_t ui_page_dc_desc = { .rows = NULL, .init_cb = dc_init, .refresh = dc_refresh, + /* 自动失效轮询(框架级机制见 ui_content_page.h 的 auto_ms 注;口径见供给说明 §5.5): + * 直流/站温/温度行随 rt 帧每 200ms 推进,可见内容与电气量同拍——周期账目与 + * ac 页同构(300 = 15 × LVGL 整刷周期 20ms,最坏屏上滞后 200 + 300 = 500ms), + * 四点账全文在 ui_page_ac.c 的 AC_AUTO_MS 注释,此处不复述 */ + .auto_ms = 300u, }; diff --git a/Drivers/BSP/UI/ui_page_device_info.c b/Drivers/BSP/UI/ui_page_device_info.c index 7bcbc755..b9cb0a2f 100644 --- a/Drivers/BSP/UI/ui_page_device_info.c +++ b/Drivers/BSP/UI/ui_page_device_info.c @@ -259,4 +259,13 @@ const content_page_def_t ui_page_device_info_desc = { .fixed_total_pages = 1u, .init_cb = di_init, .refresh = di_refresh, + /* 自动失效轮询——通道二(新鲜度源换 info_seq;机制见 ui_content_page.h 的 + * auto_ms/auto_seq 注,口径见供给说明 §5.5):info 与 rt 同拍发布(每 200ms + * 两帧连发,见 App/app/ui_data_feed.c 的 ui_data_feed_tick;App 侧节拍值, + * 本文件不 include App 头,口径引用文档);本页可见内容近静态(型号/版本/ + * 身份),只有 IP、端口等网络事件级变化——取 1000ms 大档:事件上屏最坏 + * 200 + 1000 = 1200ms,对配置生效核对足够;seq 恒随帧走,周期即稳态重绘频率, + * 近静态页没必要快 */ + .auto_ms = 1000u, + .auto_seq = ui_data_info_seq, }; diff --git a/Drivers/BSP/UI/ui_page_runreport.c b/Drivers/BSP/UI/ui_page_runreport.c index f46a8aea..bfb33270 100644 --- a/Drivers/BSP/UI/ui_page_runreport.c +++ b/Drivers/BSP/UI/ui_page_runreport.c @@ -276,4 +276,11 @@ const content_page_def_t ui_page_runreport_desc = { .count_cb = rr_count, .init_cb = rr_init, .refresh = rr_refresh, + /* 自动失效轮询——通道二(.auto_seq = ui_data_info_seq;机制见 ui_content_page.h + * 的 auto_ms/auto_seq 注,口径见供给说明 §5.5):本页是上电计数、复位原因、 + * 104 观测计数与记录条数的汇总,活跃链路(104 轮询、记录追加)下计数秒级 + * 走动,1000ms 档既让读数"看起来在活",又不在稳态多刷(seq 恒随 info 帧 + * 前进,周期即重绘频率;info 与 rt 同拍 200ms,见供给说明 §5.2) */ + .auto_ms = 1000u, + .auto_seq = ui_data_info_seq, }; diff --git a/Drivers/BSP/UI/ui_page_yx.c b/Drivers/BSP/UI/ui_page_yx.c index 9a09312d..d08e0463 100644 --- a/Drivers/BSP/UI/ui_page_yx.c +++ b/Drivers/BSP/UI/ui_page_yx.c @@ -202,4 +202,10 @@ const content_page_def_t ui_page_yx_desc = { .init_cb = pg_init, .count_cb = pg_count, .refresh = pg_refresh, + /* 自动失效轮询(机制见 ui_content_page.h 的 auto_ms 注;口径见供给说明 §5.5): + * 遥信变位是低频事件,屏上可见变化只在 rt 帧(200ms 拍)落地时发生;seq 恒 + * 随帧前进,所以轮询周期就是稳态整页重绘频率——取 500ms 的账:变位"1s 内 + * 上屏"够用(最坏 200 + 500 = 700ms 到位),比电气量档 300ms 少 40% 无内容 + * 变化的重绘;500 = 25 × LVGL 整刷周期 20ms,落整刷边界 */ + .auto_ms = 500u, }; diff --git a/docs/UI设计/UI_数据供给设计说明.md b/docs/UI设计/UI_数据供给设计说明.md index 247b44f4..99f48696 100644 --- a/docs/UI设计/UI_数据供给设计说明.md +++ b/docs/UI设计/UI_数据供给设计说明.md @@ -355,9 +355,8 @@ static void pg_refresh(uint16_t row, char *name, char *value) { 当前口径: -- **已启用**:`ac` 交流量页 `.auto_ms = AC_AUTO_MS`(300 ms;250~500 ms 允许区间的取值账目详述在 `ui_page_ac.c` 的 `AC_AUTO_MS` 注释——要点:轮询不得快于 200 ms 发布节拍、避开 400 ms 与其锁相、300 = 15 × LVGL 整刷周期 20 ms(两端 `LV_DEF_REFR_PERIOD` 同值),最坏屏上滞后 200 + 300 = 500 ms)。 +- **六个实时页全部接入(用户裁定 2026-11-13)**。seq 恒随帧前进,所以轮询周期 = 稳态整页重绘频率——可见内容变化越慢取档越大:`ac`/`dc` 300 ms(电气量随 rt 帧帧帧推进;取值账目:轮询不得快于 200 ms 发布节拍、避开 400 ms 与其锁相、300 = 15 × LVGL 整刷周期 20 ms(两端 `LV_DEF_REFR_PERIOD` 同值),最坏屏上滞后 200 + 300 = 500 ms;全文在 `ui_page_ac.c` 的 `AC_AUTO_MS` 注释);`yx` 500 ms(变位低频事件,按"1 s 内上屏"到位——最坏 700 ms,较 300 档少 40% 稳态重绘);`clock` 1000 ms(快变项只有墙钟秒尾,快于 1 s 的轮询只会把同一秒多画几遍);`device_info`/`runreport` 1000 ms 并显式 `.auto_seq = ui_data_info_seq`(通道二;`info` 与 `rt` 同拍——`ui_data_feed_tick` 每 200 ms 拍两帧连发,见 §5.2)。各页取值账目在该页描述符注释里,本文不复述。 - **不迁移**:待机屏 `ui_standby.c`(自持 1 s 整屏定时器 + seq 门控)、整定视图 `ui_w_setview.c`(`sv_poll` 定时器盯 `par` 通道)——两处各自已有节拍,纳入框架只会多一只定时器。 -- **未接入(待 lead/用户裁定)**:`dc`/`yx`/`clock`(读 `rt`)与 `device_info`/`runreport`(读 `info`)仍是"按键才取新数";接入只差描述符一行 `.auto_ms`(info 页另加 `.auto_seq`)。 **回归确定性**:无头模式(`--keys`/74 张黄金参考)从不跑 `lv_timer_handler`,定时器不可能在截屏前触发,且仿真仍是"一次发布冻结帧"——黄金参考逐字节不变(`check_content_pages.py` 实证)。自动失效路径的验证走新开关 `--rtlive <键序> `:开页截 A → 发布第 1 号确定性斜坡帧 → **直接调用** `ui_content_page_auto_poll()`(等价定时器到点)→ 截 B;A≠B 即证明"零按键、新帧落屏"。窗口模式(真机行为仿真)每 200 ms 发一帧斜坡值,屏上数值自己会走。 --- diff --git a/docs/UI设计/UI_自动化测试流程.md b/docs/UI设计/UI_自动化测试流程.md index 5aa393b0..4aa4e568 100644 --- a/docs/UI设计/UI_自动化测试流程.md +++ b/docs/UI设计/UI_自动化测试流程.md @@ -26,7 +26,7 @@ cmake --build simulator/build --config Debug # 0) 构建模拟器(须 0 警 | 步 | 脚本/命令 | 门禁内容 | 预期输出 | |---|---|---|---| | 1 | `simulator/tests/check_menu_rows.py` | 菜单 8 状态:选中行白带 / 非选行黑底白字 / 框体 1px 边框 / 往返像素一致(MENU-STATE-03==MENU-STATE-01、MENU-STATE-06==MENU-STATE-01、MENU-STATE-07==MENU-STATE-02)+ MENU-STATE-00 池基线 | `PASS: 8 状态全部断言通过(8 图,池基线 5368 B)` | -| 2 | `simulator/tests/check_content_pages.py` | ① 文本级断言(字形模板匹配,正向 484 条 + 反向 45 条,独立于 `ref/`)→ ② 74 张截图与 `ref/` 黄金参考**逐字节**比对 + 开页-关页往返池水位 | `PASS: 74 内容页 + 往返池水位全部通过`(文本断言先于像素比对,失败即中止) | +| 2 | `simulator/tests/check_content_pages.py` | ① 文本级断言(字形模板匹配,正向 484 条 + 反向 45 条,独立于 `ref/`)→ ② 74 张截图与 `ref/` 黄金参考**逐字节**比对 + 开页-关页往返池水位 → ③ `--rtlive` 框架自动失效实证(开交流量页截 A → 发布 1 帧确定性斜坡值 → 直调 `ui_content_page_auto_poll()` → 截 B,A≠B 即 PASS;机制见 `UI_数据供给设计说明.md` §5.5) | `PASS: 74 内容页 + 往返池水位 + rtlive 全部通过`(文本断言先于像素比对,失败即中止) | | 3 | `keil-build` skill(`keil_build.py`) | MCU 端编译(UI 源码双端共用,改一端必须过另一端) | 退出码 0 = BUILD_OK | | 4 | `scripts/check_coding_standard.py` | 代码规范 V1.0 机械检查 | PASS | diff --git a/docs/UI设计/内容页架构.md b/docs/UI设计/内容页架构.md index 9a1fe74b..06322b95 100644 --- a/docs/UI设计/内容页架构.md +++ b/docs/UI设计/内容页架构.md @@ -280,7 +280,9 @@ typedef struct { | `rows` | `const cp_row_t *` | 静态数据表(Flash) | 6 行 | 24 行 | 3 行 | NULL | | `fixed_cur_page` / `fixed_total_pages` | `uint8_t` | 信息页页脚固定值 | 10 / 1 | — | — | — | | `refresh` / `count_cb` / `draw_cb` / `key_cb` | 函数指针 | 扩展钩子 | 全 NULL | 全 NULL | 全 NULL | draw_cb + key_cb(余 NULL) | -| `auto_ms` / `auto_seq` | `uint16_t` / 函数指针 | 自动失效轮询周期 / 新鲜度源(`UI_数据供给设计说明.md` §5.5) | 0 / NULL | **300 / NULL** | 0 / NULL | 0 / NULL | +| `auto_ms` / `auto_seq` | `uint16_t` / 函数指针 | 自动失效轮询周期 / 新鲜度源(`UI_数据供给设计说明.md` §5.5) | 1000 / `ui_data_info_seq` | 300 / NULL | 300 / NULL | 0 / NULL | + +> 上表仅列这四页;未列出的实时页也已接入:`yx` 500 ms、`clock` 1000 ms、`runreport` 1000 ms(`ui_data_info_seq`)。六个实时页的取值账与"不迁移"清单见 `UI_数据供给设计说明.md` §5.5。 扩展钩子(机制已实现;密码页用 `draw_cb` + `key_cb`,其余 3 页未用): @@ -433,8 +435,8 @@ extern const content_page_def_t ui_page_device_info_desc; /* 描述符(Flash | 项 | 值 | 说明 | |---|---|---| -| 框架常驻 RAM | ~20 B | `s_open/s_sel/s_scr/s_cont` 4 变量 | -| 开页峰值 | +776 B | 屏 + 容器 + 事件列表 + 常量样式引用 | +| 框架常驻 RAM | ~28 B | `s_open/s_sel/s_perm/s_scr/s_cont/s_auto_timer/s_auto_seq` 7 变量(后 2 个为自动失效) | +| 开页峰值 | +776 B | 屏 + 容器 + 事件列表 + 常量样式引用;启用自动失效的页另占一只 lv_timer 对象(数十字节,关页归还池,2026-11-13 起) | | 关页回落 | 基线 +80 B 一次性残留 | screens 数组高水位 +8、`lv_screen_load` 菜单屏局部 X/Y 样式 +72(LVGL 核心行为,非泄漏;分解见 `菜单页面设计.md` §9.5) | | 池水位门禁 | 5368 B / 5448 B | 菜单基线 / 开页-关页往返(回归脚本常量,2026-10-11 随 LVGL 控件裁剪由 4784/4864 上移;**与池总大小无关**,16 KB 池下实测值不变) | | 描述符/行表/标题 | Flash const | 不进 LVGL 池;每页增量 = 描述符 ~40 B + 行表 + 代码 | @@ -502,5 +504,6 @@ extern const content_page_def_t ui_page_device_info_desc; /* 描述符(Flash | 2026-10-27 | 内容页黄金参考 **47 → 53 页**(通讯设置页落地并绑 `#page=comm`;判据 = `simulator/tests/ref/` 入库 `shot_*.bin` 实数 53 张,`git diff --name-status 31ca4a1f HEAD -- simulator/tests/ref` 实测只有 6 个 `A`、零 `M` ⇒ 存量 47 张逐字节零漂移);本文件的当前态计数已同步 | | 2026-10-26 | 验证与回归段的页数口径修正为 **27 页**黄金参考(`simulator/tests/ref/` 入库 27 个 `shot_*.bin`,含整定 9 态);上方变更记录里的「11 页」是当时事实不动 | | 2026-10-26 | 门禁常量修正为 5368 B / 5448 B(= 两个回归脚本头部现值);本文件正文表早已是 5368/5448,只这一处残留 2026-10-11 裁剪 LVGL 控件类之前的 4784/4864 | +| 2026-11-13 | 五个实时页接入框架自动失效(task-3,用户裁定全接):`dc` 300 / `yx` 500 / `clock` 1000(rt 通道)与 `device_info` / `runreport` 1000 + `.auto_seq = ui_data_info_seq`(info 通道,`info` 与 `rt` 同拍 200 ms)描述符加 `.auto_ms`,取值账在各页注释;§三 字段表与 §六 内存表同步;实测黄金参考 74 张、往返水位 5448 B、菜单基线 5368 B 均不动(无头从不跑 `lv_timer_handler`) | | 2026-10-26 | 验证与回归段的黄金参考页数 **27 → 40 页**(UI 三页落地后 `simulator/tests/ref/` 实数 40 张);上方变更记录里的 11 / 27 是各当时下限,保留 | | 2026-11-13 | 框架级自动失效(task-2):描述符尾部新增 `auto_ms`/`auto_seq`(当前仅 ac 页启用 300 ms),新增框架 API `ui_content_page_auto_poll()`(§3.1);§3.1 静态块与代码同步(补 `s_perm` 与自动失效 2 变量);回归脚本新增 `--rtlive` 零按键落屏检查(74 张黄金参考逐字节不变,实测 PASS);机制详述在 `UI_数据供给设计说明.md` §5.5 | diff --git a/docs/UI设计/页面扩充详细方案.md b/docs/UI设计/页面扩充详细方案.md index 627b0a63..10c832e6 100644 --- a/docs/UI设计/页面扩充详细方案.md +++ b/docs/UI设计/页面扩充详细方案.md @@ -626,7 +626,7 @@ SNTP 客户端 ──────→ 批4 SNTP设置 | 4 | 无源点显示 `--` | 遥信量无效点、直流量直流通道 | | 5 | 定值整定闭环 | 改 → 保存 → 重启 → 值保持 + 校验和自检通过 + 主站 C_RD 一致。**2026-10-26 半收口**:模拟器侧「改 → 保存 → `OK` → 回首屏新值已在帧里」与「越界被拒、值不落盘」已由像素 + 文本断言覆盖(`sparam_save` / `sparam_landed` / `sparam_oob`);**重启保持与 C_RD 一致只能上板**(模拟器无 NAND)。另注意 40 项里 **13 项 `comm_addr = 0`**(投退、返回系数、过频/低频段、全局软压板)主站不可寻址,不能拿 C_RD 当它们的判据 | | 6 | 分层门禁无新增 | `check_layer_deps.py` 退出码 0,基线 6 → 3。**现状:3**(记录 reader 已削 3 条;写路径走注入式 ops 函数表,未新增 include,见 `docs/UI设计/UI_数据供给设计说明.md` §6.2) | -| 7 | 像素回归稳定 | `ui-golden` 连续两次零差异。**已验(2026-10-26)**:27 页连跑两次逐字节一致——**该下限此后已扩至 66 张**(新增 clock / reset / clear 系列 13 张,其后 47→53→60→66,2026-10-29 录波 UI 道 +6 张),66 张上的双次逐字节一致**已验(2026-10-29:任务树重建模拟器后同一批 66 张连跑三次逐字节一致,页面池水位 5,448 B;菜单侧 `check_menu_rows.py` 8 状态连跑三次亦逐字节一致,5,368 B;三次之间未用更新模式写过任何参考图,故这是同口径的传递性证据)** | +| 7 | 像素回归稳定 | `ui-golden` 连续两次零差异。**已验(2026-10-26)**:27 页连跑两次逐字节一致——**该下限此后已扩至 66 张**(新增 clock / reset / clear 系列 13 张,其后 47→53→60→66,2026-10-29 录波 UI 道 +6 张),66 张上的双次逐字节一致**已验(2026-10-29:任务树重建模拟器后同一批 66 张连跑三次逐字节一致,页面池水位 5,448 B;菜单侧 `check_menu_rows.py` 8 状态连跑三次亦逐字节一致,5,368 B;三次之间未用更新模式写过任何参考图,故这是同口径的传递性证据)**。集合其后扩至 74 张——2026-11-13 按同口径跑过 74 张零差异(task-3 五页接自动刷新,无头不跑 `lv_timer_handler`,往返水位 5,448 B / 菜单 5,368 B 均不动) | | 8 | 每个新页有 golden 参考 | `simulator/tests/ref/` 新增对应 `.bin`。**整定 4 页已有 9 张**(含保存/越界/落定/回绕各态);参考图入库,改它 = 改判据,须逐页过目 | --- diff --git a/scripts/size_attestation.json b/scripts/size_attestation.json index 51d7b7c7..4699d8a9 100644 --- a/scripts/size_attestation.json +++ b/scripts/size_attestation.json @@ -1,15 +1,15 @@ { - "built_at": "2026-11-13T14:23:05+08:00", - "fingerprint": "f44730aca08c9f35b9eec8a83322b342ee21a2280a94ce2c277b5c62a26fb442", + "built_at": "2026-11-13T14:51:49+08:00", + "fingerprint": "7bca71501bd2582cd221f9cfea5d4db5d196d3d40a583ff119dfd26841355379", "fingerprint_files": 1479, "fingerprint_source": "git-index", "gated_regions": [ "RW_IRAM1", "RW_CCM" ], - "git_head": "5bab248deeac14b0d6235e0fe312bcd9388a5e0a", + "git_head": "a5142c6d9d11b751d5ff1390bd815f5202bcdabb", "map": "MDK-ARM/STM32F407-Demo/STM32F407-Demo.map", - "map_mtime": 1794549805, + "map_mtime": 1794551787, "pct": { "ER_IROM1": 27.53, "RW_CCM": 87.89,