wandering1
|
52e28885cb
|
feat(UI): 装置维护 3 页落地(时钟 / 强制复归 / 清除记录),内容页黄金 27→40
三个薄页面模块 ui_page_clock / ui_page_reset / ui_page_clear,页面注册由生成器
自动写双端(裁定 A-1:「三叶各绑一页」与「零新增 .c」不可兼得,选薄页面加生成器,
不写手写 node switch——那种分发在增删叶子时会静默换功能,且没有任何门禁照得到)。
数据侧是注入式函数表:UI 不 include App 层的头。两条硬理由都实测过——分层方向
(layer-deps)之外,模拟器根本不链 sys_clock,ALLOW 豁免挡得住 layer-deps,
挡不住模拟器链接期。面板对时的唯一真判据是回读 RTC:sys_clock_set() 恒返 0
(RTC 写失败只打日志),所以真机侧写 1 后回读 1,最坏约 200 ms 落在一次「保存」
按键上,IWDG 800 ms 窗有余;上界与依据都写进注释。
「无时钟」徽标位置有两个像素级实测坑:放标题带右侧会被 4 字标题连成「时钟设置
无时钟」一句话;放页脚带左侧 x=7 会压住页脚——页脚从 x=6 起排,不是居中。
最终落在清单末行与页脚之间的空带 y=124。clear_done 那张顺带给出像素证据:
清 run.log 之后「操作记录」那一行从 2 变 3,页面上没缓存、没撒谎。
ui_w_records 的 UI_W_REC_LOG_* 顺序必须等于 syslog_id_t 顺序(7 类,只准尾追加),
已加编译期顺序守卫;执行侧 7 条映射表同样带编译期守卫。
测试与真值:内容页黄金 27 → 40 页(+13),文本断言 +68、反向断言 ABSENT +19;
27 张旧参考 git diff 为空 = 逐字节未变。往返池 5448 B 与菜单常驻堆 5368 B 均未变;
字库未扩(源码在用 171 并 KEEP_EXTRA 39 = 清单 183),font-charset 与 cn-chars、
cn-font 字节一致。@build 0 错误 0 警告;uiTask 静态最坏链 1,336 B / 16,384
(余 91%)与基线相同,页面钩子没进最坏链。
一条测试学结论单独留痕:反向断言不能当「位置不重叠」的证据——本脚本的字形匹配
把 y 带判得比字面宽(徽标在 125..136、页脚在 144..155,仍被 (140,160) 判命中)。
该防线改由正向断言「页脚未被徽标压住」承担(压字那一版实测过不了它)。
两条自我更正一并记档(作者自报,按真值而非原口径):
① 先前报「文案零新增汉字」是错的——观测行拟用「动作元件」,「元」不在子集,
cn-chars 与 font-charset 如实红;最终改「保护动作 N」才让「零新增」成为事实。
顺序是:先按机器红,再按真值写结论。
② 先前报「6 个文件 BOM 逐个核过」被 bom-guard 证伪:丢 BOM 发生在上一次编译之后,
正是 AGENTS 那句「历史 0 警告不代表安全」的活例;此后一律以退出码为准。
未覆盖项不假装:台架「N>0 → N=0」在产品构建的未标定闭锁期拿不到(闭锁期 N 恒 0),
判据显式退化为「页面受理 + 落一条操作记录」,写在 rs_watch 注释里。
生成物入库例外照用:uvprojx 只加 3 个 ui_page_ 的 FilePath(真增删源文件),
CMakeLists 同批;两处都由 gen_menu.py 自己写,没手写。
本笔先走了一次真钩子:20 条钩子实跑通过(ui-golden 菜单 8 状态加内容页 40 页、
generated-fresh、registration-check、font-charset、ui-data 单测、cppcheck、
coding-standard、bom、mojibake、id-check、doc-links 等),只有 mem-numbers 与
mem-budget 两条红——磁盘上的 .map 出自 20:39 那次构建、含三条在飞道的代码,
与 HEAD 台账必然不同码。按仓库既有约定(这两条等台账回填时允许 --no-verify 并
正文留证)落这一笔;回填由我统一在收尾一笔做。
三条在飞道(task-26 崩溃证据路径、task-16 与 task-17 谓词收敛和卷锁观测、
task-36 台架工具)的未暂存改动被 autostash 暂时收走,钩子看到的是 HEAD 加本笔;
过程中曾把 comm 道未跟踪的 iec104_comm.c 临时移出(它不在 stash 覆盖面内),
那次移出反而让 ui-golden 撞见 CMake 缓存里的悬空引用而红——已改用「先落 comm
那笔、再落本笔」的顺序消掉这个中间态。ui_data_maint_ready() 待删(只有测试在读
的自检口),排在本笔之后单独一笔。
|
2026-10-26 22:43:54 +08:00 |
|
wandering1
|
77779d49d6
|
feat(ui+记录): 整定写路径与四类页落地,五类记录写入方补齐
UI 面:ui_data 增加深度 4 参数写队列(请求 168 B、队列 .bss 672 B)与状态机
OK/ERR_RANGE/ERR_LOCKED/ERR_BUSY,ui_data_feed 出队后按注入 ops 走「闭锁 → 整批
预检 → 逐项 prot_set_set_sealed」,只提交改动位图;par 帧尾追加 cal_block
(口径 = UA/UN/IA 三路 ADC_CAL_F_VALID,与 protect_task 判据同构,不用 rt.eng
反推,V0.1 下 eng 恒 0)、UI_DATA_VER 升到 2。参数/定值/控制字/软压板四叶绑定
内容页(UI_PAGE_MAP_COUNT 12→16,复用四个查看模块,零新增 .c),编辑态按
is_editable 分派,LOCK(写不进去)与「未标定」(仍可改值)两源两通道两词。
记录面:syslog_request_clear/state/apply 三段式删除 API(UI 只发请求,落地在
defaultTask 的 drain 尾部且必须后置,卷锁一律 try,幂等只认 FR_NO_FILE);
事故/告警/启动/操作/遥控五类各有一个真实写入点,记录类型 = 日志 ID 本身
(一类一个 /log 严格 8.3 文件;64B 定长体没有类型字段位,塞字段会砸掉既有读者)。
为守 protectTask 872 B 静态最坏链另拆 syslog_post_quiet()(无 DBG 的投递核,
丢弃留痕挪到 drain 侧差值补发),syslog_post 对外语义逐字不变。
为什么两道合成一笔而不是各一笔(实测,不是省事):simulator/main.c 同时消费
两道新增 API(整定 pump 与 logtest 清除用例),按道切文件会让中间提交编不过;
RAM 受管快照与体积同码凭证描述的是合并后的 .map,拆开必落在「台账与 .map 不同
码」这条红线上。pre-commit 跑钩子前会 stash 未 staged 部分,这类耦合没法绕。
实测:@build 0 错误 0 警告;Code 228,260 / RO 24,960 / RW 1,440 / ZI 135,976 B;
RW_IRAM1 79,992 B = 61.0%、RW_CCM 87.9%(阈值 92%);九个任务静态最坏链全 PASS,
protectTask 872 B / 57% 改前后逐字节不变(记录投递没垫栈)。主机单测 ui_data 82→
164、sys_log_mcu 106→137、prot_elm 47→60、iec104 141→154、iec104_serv 28→34,
既有断言零删改;48 个钩子 --all-files 全绿;编号门禁可判定 86.34%(基线 86.0%)、
不可判定 1,153 处低于上限 1,166;doc-links 无法判定 0;UI 黄金 18 页扩到 27 页
连跑两次逐字节一致;字库 diff 空。
顺手修掉三处既有缺陷(都是本轮第一个消费者才暴露):sim_syslog.c 的 s_paths 行宽
16 而 "sim_selftest.log" 正好 16 字符没有 NUL 位(stat/remove 读越过数组尾,此前
靠后面 .rodata 碰巧为 0);ui_w_setlist 二态行 ENTER 不回绕(控制字与软压板出厂值
全在最后一项,按了像没反应而叠层里已是越界值);生成物 ui_menu_tab.h 与 gen_menu.py
模板漂移(上一笔改了模板没重跑生成器),现随生成器输出对齐。
未收口(不算完成):保存后重启值保持与主站 C_RD 读回两条只能上板,台架窗口执行;
LOCK 屏显与越界反显的页面侧在模拟器造不出来(模拟器不跑定值自检、无 NAND),
已由生成侧单测与代码注释点名差距;同类页数与钩子数陈述残留另立待办。
|
2026-10-26 15:51:12 +08:00 |
|
wandering1
|
345e12ebd7
|
test(ui-golden): 新增遥信量第 1、2 页像素参考
上一笔的两态基线单独提交(基线变化与代码变化分笔,回归时能一眼看出是图变了还是代码变了)。
- shot_yx.bin:第 1 页 8 行**全是 "--"**——位置1~4 是无硬件的双点、YX5~8 点表未定义。这一页的
作用是把「V0.1 只有 6 点有来源」钉成图像证据:以后谁把无效位画成「复归」,或反过来把有效位
画成横杠,都会在这里响。
- shot_yxp2.bin:第 2 页出现两个有来源的行(故障总 / 过流Ⅰ段 = 复归),同时选中行落在第 2 页
首行(YX9)——一张图同时钉住分页数学(33 行 / 8 = 5 页)与"翻页后取值不串行"。
- 先证语义再钉像素:33 条文本断言全过之后才 --update 建基线(顺序反过来就是把错画面合法化);
其余 19 页参考逐字节不变。
|
2026-10-25 15:33:43 +08:00 |
|
wandering1
|
9bd7ff96d3
|
test(ui-golden): 新增四个定值查看页像素参考
随上一笔(参数/定值/控制字/软压板四个查看页)落第 13~16 页黄金参考;本笔只有判据文件,
页面键序列与逐行文本断言已在上一笔同批改入 check_content_pages.py。
数据源与可复现性
- 值全部来自 simulator/main.c 发布的 par 帧:prot_set 出厂默认(App/algo/prot_set.c 是纯算法,
双端可编),不是手抄的 40 个数字——手抄一次就多一份会漂移的第二真相
- 因此这四张基线同时也是换算口径的判据:10.00A / 500ms / 0.95 / 100A 这些串由 ui_w_setview
的 Q10 拆分换算产出,换算改了没改对,像素这一步就会响
刷新纪律(黄金参考是判据不是快照:版面错了就等于把错误钉死)
- 先让 39 条文本断言过(名/值两列逐行断),拦住缺字与错标签,再回退比对像素
- 四页出图逐张肉眼确认:值列右缘不越屏(最宽 10000V)、名值两列不重叠、行槽不与页脚相撞、
分页正确(定值 18 行 = 3 页并显示「第 1 页,共 3 页」;软压板 10 行 = 2 页)
- 一处肉眼读错被匹配器纠正:CT 一次额定我读成 1000A,值列实际只有 4 个字符位(100A)。
断言按匹配器能证明的写,不按我觉得像什么写
- 控制字页断言刻意含「Ⅰ/Ⅱ 段跳闸、Ⅲ/过负荷段告警」这种两两一组:行表与枚举序若整体错位,
就不可能复现这个组合——像素侧因此兼作 id 对齐的机械证据
回归面
- 其余 12 页(密码 4 态 / 网口设置 4 态 / 装置信息 / 交流量 / 直流量 / SOE)逐字节不变:
这四页与它们共用同一套框架绘制与同一份 ui_w_setlist 骨架令牌,没连带漂移正好反证改动局部
- 内容页回归 19 项全 Passed;菜单 8 状态 Passed(池 5368 B,本批只多 4 条 #page 注记)
- ui-golden 钩子在含本笔的整树上 Passed;全量钩子(--all-files)红项只有同族三条
mem-numbers / mem-budget / size-gate(台账与同码凭证回填归单写者)→ --no-verify
体积:本笔不参与固件构建,与上一笔一致(Code 221856 / RO 23508 / RW 1300 / ZI 134660)。
gate: only mem-budget/mem-numbers/size-gate pending lead ledger backfill
(同族三条,root cause 一条:台账与同码凭证回填归单写者)
|
2026-10-25 14:44:47 +08:00 |
|
wandering1
|
8ee3be4c97
|
test(ui-golden): 新增 SOE 记录页像素参考 shot_soe.bin
随上一笔(SOE 记录页 + soe_store 只读遍历)落第 12 页黄金参考;本笔只有判据文件,无任何
代码或断言改动(页面键序列与逐行文本断言已在上一笔同批改入 check_content_pages.py)。
刷新纪律(黄金参考是判据,不是快照:版面错了就等于把错误钉死)
- 先让**文本断言**过:缺字、串标签、时标串错会在那一步先拦,拦住了根本不给回退比对像素
- 再出图肉眼确认:6 行两两成对(时标 / 元件名+动作-返回)、19 字符时标在 94 px 名列内
不越屏、非元件行"未标定闭锁"落在名列且值列为空、页脚"第 1 页,共 1 页"
- 数据源是 simulator/main.c 的固定 3 条假记录(时标固定串)——跑一次一个样,否则基线无意义
覆盖与回归
- 内容页回归:15 项全 Passed(soe 页 9 条文本断言 + 12 页像素);其余 11 页逐字节不变,
正好反证本批改动是局部的:三页回炉与 SOE 页共用同一套框架绘制,共享代码若被碰坏,
密码页与网口设置页必然一起漂
- 菜单 8 状态 Passed(池 5368 B;本批菜单树只多一个 #page 注记,节点数未变)
- ui-golden 钩子在含本笔的整树上 Passed;全量钩子(--all-files)41 项 Passed,红项只有
mem-numbers / mem-budget(Flash/RAM 台账待回填)→ --no-verify;脚本层 size-gate 同族同因
体积:本笔不参与固件构建,体积与上一笔一致(Code 219712 / RO 21388 / RW 1288 / ZI 134272)。
gate: only mem-budget/mem-numbers/size-gate pending lead ledger backfill
(同族三条,root cause 一条:台账与同码凭证回填归单写者)
|
2026-10-25 14:44:46 +08:00 |
|
wandering1
|
a6d6588257
|
test(ui-golden): 刷新装置信息/交流量/直流量三页像素参考
随 44921cb(三页接快照真值)刷新黄金参考,本笔不含任何代码或断言改动——文本侧期望(PAGES/
TEXTS)已在上一笔同批改过,这一笔只把"代码新效果"登记成新的判据。
差异量(与旧参考逐像素比对,刷新前的实测)
- shot_info.bin 3669 px(6 行 → 8 行、标签去冒号、值列左对齐 x=56、页码改真值)
- shot_ac.bin 964 px(24 行 → 7 行;页脚从"共 3 页"变"共 1 页")
- shot_dc.bin 800 px(3 行 → 2 行;温度值列改"码2048"、通道行"未配置")
- 其余 8 页(密码 4 态 + 网口设置 4 态)逐字节不变:这三页与它们共用同一套框架
绘制,没连带漂移正好反证改动是局部的——不是把共享代码碰坏了而没被发现
刷新前的人眼确认(黄金参考是判据,不是快照:版面真错了就等于把错误钉死)
- 装置信息:8 行行槽 38..129 不与页脚(143)相撞;MAC 17 字符右缘 158 在屏内;软件校验
显示 "--"(不再抄参考项目的 4454);IP 走 net_cfg_fmt_ipv4 的三段补零口径,与网口设置页
同一真源;页脚"第 1 页,共 1 页"
- 交流量:Ua 0.812 / U0 0.005 / Ia 0.046 / Ia2 0.002 / Ia5 0.001 五行读数在位;
Hz "--"(eng=0 期间幅值门恒不成立)、标定行 "未标定"(量纲口径写在屏上而不是注释里);
选中行 Ua 有白带(band_h >0 才可见,同记录页约定)
- 直流量:温度 "码2048"、直流通道 "未配置"
验证
- check_content_pages.py:rc=0,14 项全 Passed(含开页-关页往返池水位 5448 B 不涨)
- check_menu_rows.py:rc=0(菜单 8 状态与池 5368 B 不变,本批没动菜单树)
- ui-golden 钩子在含本笔的整树上 Passed;全量钩子(--all-files)41 项 Passed,红项只有
mem-numbers / mem-budget(Flash/RAM 台账待回填,单写者禁区归 Lead)→ --no-verify
- 体积与上一笔一致(本笔只换 3 个 3200 B 的二进制参考,不参与固件构建)
gate: only mem-budget/mem-numbers pending lead ledger backfill
|
2026-10-25 14:44:45 +08:00 |
|
wandering1
|
a38f862fb9
|
chore(ui-golden): 像素黄金参考 ref/*.bin 入库(把门禁改成可移植)
问题:ui-golden 是逐字节比对(check_content_pages.py 里 data == refdata),
而基准 simulator/tests/ref/ 整目录被 .gitignore 忽略、从未入库。后果不是
"少几个文件",而是这条门禁在任何新克隆 / 新并行工作树里必然报「缺黄金
参考」——只在有老副本的机器上它才是真的回归门禁。本会话已两次实测踩到
(并行工作树里只能现场 --update 造基准,而现场造出来的基准恰好失去意义)。
入库前先证明基线可复现,否则等于把一条天天误报的门禁写进仓库:
- 主树 ref/ 生成于 2026-10-11,其间合入 B6~B9 与 UI 令牌化等多次改动;
今天用刚重建的 lvgl_sim 重跑 → 11 页 + 开页-关页往返池水位逐字节全过
- 主树与新工作树两份**独立构建**的 lvgl_sim(不同构建目录、不同绝对路径)
各自生成基准 → 11 个 .bin 的 SHA-256 全部一致
即渲染是 CPU 侧确定性输出,可以当仓库内容。
改动:
- .gitignore:整目录忽略 → 只忽略派生的目检 PNG。另加一条
!simulator/tests/ref/*.bin 反选——第 115 行的全仓 *.bin 兜底(挡
sim_netcfg.bin 之类运行产物)会把基线一起挡掉,且反选必须排在它之后
才生效
- 不引入 LFS:11 x 3200 B = 34.4 KB(160x160 单色打包)。走 LFS 反而新增
失效面——没拉 LFS 的克隆会拿 pointer 文本去比像素,把"缺基准"换成
"比不中"。.gitattributes 已有 *.bin binary,check-attr 确认 text unset,
不会被行尾转换改写
- 基线不会被改写型钩子毁掉:trailing-whitespace / end-of-file-fixer 声明
types: [text],位图含 NUL 被判二进制 → 实测 Skipped;索引 blob、磁盘、
主树参照三方哈希 11/11 一致
- 新增 11 个基线;同步 5 份文档与 3 处脚本口径:缺基准的提示从"首次/换机
请加 --update"改为"检出不完整 → git checkout -- simulator/tests/ref/ 取回,
不要用 --update 就地造基准"(旧提示正是自我实现型基准的来源)
- 顺带修掉 simulator/tests/README.md 两处与实现不符的描述:基准写成 PNG
(实为 .bin)、regen_ref_png.py 写成"重建黄金参考"(它只出目检图,基准
由 check_content_pages.py --update 刷)
- .pre-commit-config.yaml 只改注释(原文明确断言 ref/ "永远不会进 git
索引",已被本改动推翻);ui-golden 的 files 面覆盖 simulator/tests/,
基线被改即触发回归,刷参考从此在 git diff 里显形
历史口径按纪律冻结:UI_自动化测试流程 2026-09-10 的"整目录不入库"等 6 处
变更记录行不改写,以新行登记反转。
实测:@build 0 错 0 警(Code=213520,与内存台账一致);ui-golden Passed;
pre-commit run --all-files = 36 Passed / 0 Failed(RC=0)。
|
2026-10-22 06:17:00 +08:00 |
|