feat(UI/采集/104): 通讯设置页 + 开机账本 + adc_cal 可诊断化——三车道同树一次构建入库

三条道在同一棵树上交付,故合并成**一次权威构建**(@build 0 错 0 警,Code=235236 RO=26308 RW=1572
ZI=136924)后同笔入库;台账已按该构建回填(`ram_baseline.py --update` + `--write`、`chec
k_mem_numbers.py
 --write`),凭证与实际 .map 同源。归属如下:

· **通讯设置页**(道G task-9):新增 `Drivers/BSP/UI/ui_page_comm.{c,h}`(通道六注入,与死
区页同骨架同纪
  律),`#page=comm` 绑定使 bound **21 → 22**、内容页黄金 **47 → 53**(旧 47 页字节零变化,
新增六态含
  WAIT/OK 两张);`iec104_comm` 脏位 + store_save(**无事件位**)挂 defaultTask 同点位
轮询;`port_104` 由
  宏改走 getter、`IEC104_SERV_PORT` 删除;字体 +听/监(185 字全覆)。**实机链已闭环**:FTP 外改
[comm]
  的 ca/port → 复位 → 串口出现 `section 'comm' (2 keys)` 与 `i104: listening o
n 9004` → 还原 2404,全程无
  FAIL ⇒「重启即生效 + 端口真值」不是推断是实测。上限核对 6/8 段、2/16 键,超限现象由 TC-CONFIG-056/057
  钉死(注册 -1 + `comm init: FAIL` 锚 + getter 回 ROM),**不抬宏**。
· **开机账本**(道F task-12):新增 `App/util/boot_stats.{c,h}`——上电次数落 SD2506 用户
 SRAM(magic +
  小端计数 + 版本 + 异或校验),一次上电 = 1 读 + ≤1 写,**零 NAND、零卷锁、零配置段**;四态互斥
  UNKNOWN / FRESH / CONTINUED / RESTARTED(BLF=1 才算电池域掉过电),**读失败绝不回写**;
文案口径「自 RTC
  电池周期起」,**禁写终身次数**。复位原因优先级链从 `app_main.c` 的 if-else 收进一份真源(串口与屏幕同
  源);104 四个只增不清计数 + `iec104_serv_get_stats()` 留在 serv、未塞进 link(会被 open
/close 洗掉)。
  运行时长按用户裁定 = **只报本次开机以来**,零新增代码。新套件 `test/host/boot_stats` 21/21,五处注入
  **全部有牙**(含「漂一字节被校验和挡下而不是报 256 倍错账」)。
· **adc_cal 可诊断化**(道E task-43):三个 volatile 计数 + `adc_cal_get_stats()`
/ `adc_cal_note_persisted()`
  (水位**盖写非自增**,因为一次 save 覆盖整档,数 save 会留假未落盘);「差额 × 脏位」三态语义唯一落在
  `adc_cal.h`,其中「差额 > 0 且脏位恒 0」= 绕过语义 setter 的静默丢失;TC-ADCCAL-019~023。

三条**必须留档的自纠**(都是执行道自己报的,我不替他们润色):
① stdint 那条断链是**宿主套件抓到、通讯道先修**,采集道承认自己是重复添加者并删掉自己那份;
② 「exit 2 不是证据,断言变红才是」——采集道第一版反证注入了未声明标识符导致编译错,差点当成功;
③ 套件汇总行原写 `s_total/s_total`,失败时会打印「21/21 PASSED (failed=1)」这种自相矛盾的行,已改。

另修:`check_registration.py` 的 `SIM_EXEMPT` 加一行豁免 `App/util/boot_stats.c
`(依赖 I2C 与 RCC 位掩码,
MCU 专属;核过 `sys_clock.c`/`sha256.c` 同形态先例),注册反向校验 exit 1 → 0。发号 TC-IEC1
04-034、
TC-UIDATA-029 已实抬游标(`TC-IEC104-033→034`、`TC-UIDATA-026→029`)。

门禁:id-check --strict 与 plain 均 rc=0、doc-links --all rc=0、注册校验 0、cppche
ck / coding-standard /
bom-drift 0;iec104 179/179、ui_data 295/295、boot_stats 21/21、adc_cal 11
7/117、run_par 67/67;菜单 8 状态
池 5368 不变、内容页 53/53。**已知遗留**:内容页数 47 → 53 的全仓文本同步尚未做(另卡跟踪),本笔只保
证代码与黄金一致;面板注键真机那一腿缺 CLI,交台架道补。
This commit is contained in:
2026-10-27 11:29:23 +08:00
parent 0ae9c10f24
commit 728d60675f
47 changed files with 2364 additions and 123 deletions
+54
View File
@@ -121,6 +121,16 @@ PAGES = [
# 拍在首屏的图目检后改出来的键序);不按保存是因为按键会重新评估、ERR 会被
# 新一轮 WAIT/OK 覆盖——ERR 的像素证据只有这条窗口是真的
("calib_reject", "ddd e de uruuruuue e ddd l ddddd l d e dddddddd"),
# ── 道G task-9:通讯设置页(comm,#P 叶;[comm] 工厂默认 CA=1 / 端口 2404)──
# 导航:ddddd 落到"通讯参数"(主界面第 6 个节点)→ e 进(首叶通讯设置被选中)
# → e 进密码页;123 = "uruuruuue" 可编辑,000(直接 e)只读。共 3 行不分页,
# 保存行恒在第 3 槽(y 带 52..66)。
("comm", "ddddd ee uruuruuue"), # 首屏:1 / 2404 / 保存行 ENTER
("comm_ro", "ddddd ee e"), # 000 只读:无保存行
("comm_edit", "ddddd ee uruuruuue e"), # CA 行进编辑(个位光标反显)
("comm_reject", "ddddd ee uruuruuue e d e"), # CA 编到 0(< min=1)→ ENTER 拒退
("comm_wait", "ddddd ee uruuruuue e u e dd e"), # CA 1→2 提交 → 下移到保存行 ENTER:WAIT(+--comm-nopump)
("comm_ok", "ddddd ee uruuruuue e u e dd e"), # 同键序、pump 正常 → OK(脏位真被清)
]
# 文本级断言表:页名 -> [(名称, 期望串, y 带, 是否反显)]
@@ -538,6 +548,48 @@ TEXTS = {
("r3名", "MAC地址", (66, 80), False),
("r4名", "保存", (80, 95), True), ("r4值", "OK", (80, 95), True),
],
# ── 道G task-9:通讯设置页文本级断言(值 = [comm] 工厂默认的执行侧镜像)──
# 编辑/保存行的反显标记跟"选中在哪一行"走:初始与只读选中 r0,按保存后选中
# 停在保存行——inv 口径与 ui_w_setlist 视觉一致,别照抄 netcfg 的行号
"comm": [
("标题", "通讯设置", (0, 24), False),
("r0名", "公共地址", (24, 38), True), ("r0值", "1", (24, 38), True),
("r1名", "监听端口", (38, 52), False), ("r1值", "2404", (38, 52), False),
("r2名", "保存", (52, 66), False), ("r2值", "ENTER", (52, 66), False),
("页脚", "第 1 页,共 1 页", (140, 160), False),
],
"comm_ro": [
("标题", "通讯设置", (0, 24), False),
("r0名", "公共地址", (24, 38), True), ("r0值", "1", (24, 38), True),
("r1名", "监听端口", (38, 52), False), ("r1值", "2404", (38, 52), False),
("页脚", "第 1 页,共 1 页", (140, 160), False),
],
"comm_edit": [
("标题", "通讯设置", (0, 24), False),
("r0名", "公共地址", (24, 38), True), # 编辑中值列 = 裸数字串(本页无单位可挂)
("r2名", "保存", (52, 66), False),
],
"comm_reject": [
# 实测帧(2026-10-27 目检 shot_comm_reject):拒退**留在编辑态**、
# r0 值挂"越界"提示并反显(sparam_oob 同款),保存行仍是 ENTER——
# 本行没按过保存,粘滞 ERR 不可达(comm 合法带编辑器=执行侧同带,
# 执行侧拒只有宿主 034 那条腿能进,屏幕不假拍,calib_reject 同理)
("标题", "通讯设置", (0, 24), False),
("r0名", "公共地址", (24, 38), True),
("越界提示", "越界", (24, 38), True),
("r2名", "保存", (52, 66), False), ("r2值", "ENTER", (52, 66), False),
("页脚", "第 1 页,共 1 页", (140, 160), False),
],
"comm_wait": [
("标题", "通讯设置", (0, 24), False),
("r0名", "公共地址", (24, 38), False), ("r0值", "2", (24, 38), False), # CA 副本已 1→2(已受理;选中不在 r0,反显=False)
("保存名", "保存", (52, 66), True), ("保存值", "WAIT", (52, 66), True),
],
"comm_ok": [
("标题", "通讯设置", (0, 24), False),
("r0名", "公共地址", (24, 38), False), ("r0值", "2", (24, 38), False),
("保存名", "保存", (52, 66), True), ("保存值", "OK", (52, 66), True), # 脏位被 pump 清 = 已落盘
],
}
# 反向文本断言表:页名 -> [(名称, 期望**不出现**的串, y 带, 是否反显态)]
@@ -638,6 +690,8 @@ EXTRA = {
# OK 态同键序不加旗标,两图唯一差别就是"脏有没有被清"——对照即凭证
"deadband_wait": ["--yt-nopump"],
"calib_wait": ["--yt-nopump"],
# 道G task-9:通讯页 WAIT 态 = 落盘 pump 停转(同款裁定,独立开关)
"comm_wait": ["--comm-nopump"],
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.