Files
STM32F4-Base/docs/UI设计/页面补齐规划.md
T
wandering1 d64bbdc57f feat(wave): 故障录波数据面、接线与单通道回放页(软件闭环交付)
数据面(App/algo,纯逻辑,双端编译)
- wave_ring:8 路 × 320 点列优先环(1 kHz,预触发 160 + 后触发 160),adcTask
  唯一写者;触发/冻结/封存/冷却四态,冻结持续到落盘回执才解冻,滞留 2 s 自弃
  兜底——下一次真故障无波可录比丢一段更贵
- wave_store:段头编解码 + 拉模式打包游标 + 自带无表位运算 CRC-16/MODBUS(带
  锚点自检)+ 段名与整段长度等式;格式不依赖平台类型宽度
- 段头只存原始码值与封存瞬间生效系数,工程量只当单位标签、不进任何算式
- 三套主机单测(环 113 / 编解码 170 / 触发状态机 110),全部无桩、生产源原样
  纳入;新文件补 stddef 是 ARMCC 与主机差异,主机侧照不出这条分叉
- test/host/wave_read.py 是按 §6.2 的独立第二实现(dump/fft/shape/plot),92 条
  自洽断言;三份合成段互读双校验全过、哈希钉死,格式面双向闭合
- 三套新单测不加专属钩子,由覆盖率总闸全量真跑(沿用既有裁定)

接线(任务层)
- adc_cal:新增生效系数的 32 位定点原值入口(与既有浮点入口共用生效视图),
  段头按最低有效位精确记账,不经浮点回算
- adcTask:每拍压 8 路语义原始码值并推进状态机,封存那一拍同拍交棒封存瞬间事实;
  台架定周期自抓走双层编译门,产品镜像里零存在;串口新增一条 wave: 周期行
- defaultTask:卷空闲后一次心跳整段搬完(try 锁 + 256 字节分片 + 一次完整开档到
  关档),成败都回执;失败先删半成品再计错,段号只在成功时推进;持锁超 50 ms
  补一条告警并记历史峰值(喂狗余量可核)
- Lead 复核补第四道并发陷阱:采集任务优先级高于落盘道,搬段中途它可能正好把滞留
  超时的本段自弃、甚至封出下一段——数据区校验和是对「实际读到的字节」算的,
  半新半旧的段照样自洽,故关档后复检环侧身份判废:删文件、不补账、段号不推进
- Lead 复核抓到触发挂号不是原子操作(旧实现分三个字节写,消费者可在窗口里读到
  上一段的触发源与元件号):已把载荷压进一个字节,越界当场拒且不记任何计数;
  段文件字节布局零改动,三份合成段哈希逐字节不变
- protectTask:保护启动上升沿同点请求录波,一拍一次、元件号取最低位;判据本体
  零改动

人机(160×160 单色屏)
- 菜单树节点 26「手动录波」绑页面 + 记录查询组末新增「录波回放」叶,重跑生成器
  得 43 节点 / 34 叶 / 30 已绑,页面映射 28 → 30
- 回放页一屏一路、触发点前后各一周波共 40 点、每点 3 像素阶梯线(只用水平与
  垂直两种线段——单色屏斜线会被阈值裁掉);零点虚线、触发光标、窗口峰值、
  单位徽标与形状受限徽标;空态与坏段各一句显式文案,绝不用半截波形冒充数据
- ui_data 新增录波注入通道(六件操作表、三态返回);执行侧胶水带段头缓存、
  手动请求后连缓存一起作废、逐点走全仓唯一的码值换算入口
- 模拟器接真实环与编解码合成两段(含坏段与空态旗标),6 张新黄金参考,既有
  60 张逐字节零漂移未用更新模式;字库 218 → 224 字 / 319 字形
- 两份图形配置里图表组件仍为关;零堆分配;页面池水位不变
- 回放读路径的 uiTask 阻塞上界按实码写清:一次渲染 = 段表刷新 + 未缓存段头最坏
  22 次小读;已验段只剩一次开窗读 + 40 点解码;无实测数不编,实测归台架、
  仪器用已在跑的单轮工作耗时探针,不新加埋点

台账与文档
- 内存台账:录波环与落盘/回放静态逐条入册,三档对照 81,536 → 88,296 → 89,936
  字节(62.2% → 68.6%),累计 +8,400;预估 5.9 KB 与实测 +6,760 的差额点名;
  散列文件头注释同步;任务栈表核对后无需抬栈;体积趋势行与同码凭证由权威构建
  重打(0 错误 0 警告,四项体积与上一轮相同——本轮改动只有注释与声明位置)
- 设计说明:§5 补第四条并发陷阱;§6.3 定字段口径(两份独立实现的共同依据);
  §7 回填实测;§9 周期行写实;§10 台架判据改两段式且不比绝对相位;§12 补读路径
  风险行;抬头状态改成「代码面已交付、未做完的只有板级那一轮」
- 卡片:软件闭环一栏列证据;台架三条按用户裁定保持未完成,不做虚假销项
- 口径同步:数据可信、UI 补齐、页面补齐规划、产品需求、采集短板评测、任务规划
  索引与两份 README;陈旧现状句清扫 16 处(带日期戳的历史取数行一律不动)
- 门禁说明:nested-comment 记仓库根探测必须兼容 linked worktree 的 gitdir 文件
  形态(修前该钩子在任务树里恒报环境错、静默不可用);coding-standard 记
  「函数头注释超过 24 行就把函数功能挤出回看窗口」这条机制与本次现场
- 覆盖率基线登记两个新覆盖模块(套件 41 → 44 套);环单测重打后该文件有效行
  227 → 226、覆盖行 226 → 225,比率仍 99.6%,是分母变小不是覆盖率回退

为什么是单一提交:文档链接、双端注册、生成器幂等(菜单与字库)、内存数字与
体积事实源、编号门禁这五道整仓门禁要求代码、页面、菜单树、字库、文档与台账
同处一个提交才自洽,按数据面/接线/人机/台账拆成四笔必然红其中至少四道

编号门禁新增行 14 处命中已按语义改写:魔数常量按字符命名、段名样例改由格式串
生成、频谱表头改 f / 2x / 5x 并加一行图例;改写后自洽断言 92 条仍全过
2026-10-29 19:23:15 +08:00

279 lines
22 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# UI 页面补齐规划(2026-10-23)
> **定位**:盘清 42 节点菜单里**还没有内容页的 27 个叶子**,按"数据是否就绪 + 页面形态"归并成可施工的包,给出分批顺序与每页规格。
> **前置阅读**:`docs/UI设计/内容页架构.md`(框架机制与新增页面六步)、`docs/UI设计/菜单页面设计.md`(菜单树与几何)、`docs/UI设计/UI_自动化测试流程.md`(像素回归门禁)。
> **不重复登记**:页面级待办落地时按语义标识进 `docs/任务规划/登记簿.md`;本文只出规划与规格。
> **逐页细化**:每页显示哪些行、数据从哪来、要改哪些代码,见 `docs/UI设计/页面扩充详细方案.md`(本文的落地细化版)。
---
## 1. 一页结论
**"27 个空页面"不是 27 份工作,是 7 个页面模块 + 1 个共享组件 + 2 项框架能力 + 1 个数据供应层。**
真正卡住进度的不是"画页面",是两件事:
| 卡点 | 实质 | 后果 |
|---|---|---|
| **UI 拿不到实时数据** | 分层门禁禁止 `Drivers/BSP/**` include `App/**` 头(`scripts/check_layer_deps.py`),而相量/定值/遥信全在 `App/` | 已建的 3 个数据页(装置信息/交流量/直流量)**整页都是 Flash 字面量**(`"3.01"` 这类),新建页也只能照抄假数据 |
| **没有数值编辑器** | 现有编辑能力只有"逐字节改 IP"(`ui_page_net_cfg.c`),定值要改浮点/整数并校验范围 | 4 个"整定"页无法开工 |
**建议先做数据供应层与数值编辑这两项前置能力,再按"数据就绪度"分四批铺页**——顺序按数据走,不按菜单走。
---
## 2. 现状
### 2.1 规模
> ⚠ **本表是 2026-10-23 立项当天快照**(节点 42 / 有内容页叶子 6 / 空叶子 27 / 黄金参考 11 份均为当日实数,按"完成即冻结"不回改)。
> 页面扩充落地后现值已变——黄金参考现为 66 份(`simulator/tests/ref/` 入库的 `shot_*.bin` 实数,2026-10-28 记录 5 页与运行报告页落地 +7 张;2026-10-29 录波 UI 道 +6 张),现状口径见
> `docs/UI设计/页面扩充详细方案.md` 与 `docs/UI设计/UI_数据供给设计说明.md`。
| 项 | 数 |
|---|---|
| 菜单节点总数 | **42**(9 菜单 + 33 叶子) |
| 有内容页的叶子 | **6**(装置信息 / 交流量 / 直流量 / 网口设置 / 自检记录 / 运行记录) |
| 无内容页的叶子 | **27** |
| 独立内容页(非节点绑定) | 1(用户密钥/密码页) |
| 已入库像素黄金参考 | 11 份(`simulator/tests/ref/shot_*.bin`) |
### 2.2 已有 7 页的真实完成度
| 页 | 节点 | 数据来源 | 真实度 |
|---|---|---|---|
| 装置信息 | 1 | Flash 静态表 | ⚠ **6 行全是字面量**(含参考项目遗留的校验码 `4454`、日期 `2024.08.27`),不随构建变化 |
| 交流量 | 3 | Flash 静态表 | ❌ **24 行全是 Flash 字面量,不会变**(第 1 页数值取自参考图实测,看着像真值);且 24 行是参考机全套(含 P/Q/S/PF 与两段母线),**本机 V0.1 只有 8 路电气量 + 温度**,行表需按实际通道裁剪 |
| 直流量 | 4 | Flash 静态表 | ❌ **3 行全是占位**(`3.01/3.15/3.288`);**且 V0.1 硬件没有直流采样通道**(`ADC_SEM` 只有 8 路电气量 + 温度)→ 这页当前**无数据源** |
| 网口设置 | 30 | `net_cfg` RAM 副本 | ✅ 真(可编辑 + 保存交接) |
| 自检记录 | 39 | `sys_log`(`/log/selftest.log`) | ✅ 真(经 `ui_w_records`) |
| 运行记录 | 40 | `sys_log`(`/log/run.log`) | ✅ 真(同上) |
| 用户密钥 | — | 编译期密码 | ✅ 真 |
**结论**:7 页里有 **3 页是静态字面量**(装置信息、交流量、直流量),其余 4 页为真。这 3 页**必须回炉**,它们是"有页但不可信",比空叶子更容易误判为已完成。
> 逐页的行表、数据源与代码改动量见 `docs/UI设计/页面扩充详细方案.md`。
### 2.3 27 个空叶子逐项清单
> 形态:**信息页**(静态行)/ **列表页**(静态或动态行)/ **表单页**(自绘 + 自有键)/ **操作页**(确认 → 执行 → 回报)。
> 就绪度:✅ 数据现成 / 🔶 需新数据层 / ❌ 数据源不存在。
| 节点 | 叶子 | 建议形态 | 数据源 | 就绪度 |
|---|---|---|---|---|
| 5 | 遥信量 | 动态列表(33 行 / 5 页) | `iec104_pts` 遥信位图 + 有效位图 | ✅(需快照层) |
| 8 | 参数(整定) | 可编辑列表(8 项) | `prot_set` 参数类 | ✅(需编辑器) |
| 9 | 定值(整定) | 可编辑列表(18 项 / 3 页) | `prot_set` 数值类 | ✅(需编辑器) |
| 10 | 控制字(整定) | 可编辑列表(4 项) | `prot_set` 跳闸投退类 | ✅(需编辑器) |
| 11 | 软压板(整定) | 可编辑列表(10 项) | `prot_set` 投退类 + 全局 | ✅(需编辑器) |
| 13 | 参数(查看) | 列表(8 项 1 页) | 同 8 | ✅(需快照层) |
| 14 | 定值(查看) | 列表(18 项 / 3 页) | 同 9 | ✅(需快照层) |
| 15 | 控制字(查看) | 列表(4 项) | 同 10 | ✅(需快照层) |
| 16 | 软压板(查看) | 列表(10 项 / 2 页) | 同 11 | ✅(需快照层) |
| 18 | 遥测死区 | 可编辑列表(4 项) | `[run_par]` 9 键死区 | ✅ 已落地(ui_page_deadband.c,2026-10-27) |
| 19 | 遥测系数 | 可编辑列表(9 项) | `[adc_cal]` 的 k / b | ✅ 已落地(ui_page_calib.c,2026-10-27) |
| 20 | 遥信类型 | 可编辑列表 | 开入量 | ❌ 开入未实现 |
| 21 | 遥信防抖 | 可编辑列表(1 项) | 运行参数 0x8030 | ❌ 同上 |
| 22 | 双点遥信 | 可编辑列表 | 开入量 | ❌ 同上 |
| 24 | 时钟设置 | 表单(6 字段) | `sys_clock_get_time/set` | ✅ |
| 25 | 强制复归 | 操作页(确认) | `prot_elm_request_reset()` | ✅ |
| 26 | 手动录波 | 操作页(确认) | `wave_ring_request` 手动触发经 `ui_data_wave_ops_t` 注入 | ✅ 已落地(`ui_page_wave_manual.c`,2026-10-29 录波 UI 道;配套新增「录波回放」叶 node 43 = `ui_page_wave_play.c`,不在本表 27 叶之列) |
| 27 | 清除记录 | 操作页(选类型 + 确认) | `sys_log`(**缺删除 API**) | 🔶 需补 API |
| 29 | 通讯设置 | 可编辑列表(4~6 项) | 104 公共地址/端口/主站(当前固定) | 🔶 需 `comm_cfg` |
| 31 | SNTP设置 | 可编辑列表(3 项) | SNTP 客户端 | ❌ 未实现(产品口径亦未定) |
| 33 | SOE记录 | 动态列表(每记录 2 行) | `/log/soe.log` 二进制 64B | ✅ 已落地(`ui_page_soe.c`) |
| 34 | 事故记录 | 动态列表 | /log/accid.log(SYSLOG_ACCIDENT,写入点 protect_task.c) | ✅ 已落地(ui_page_accident.c,2026-10-28) |
| 35 | 操作记录 | 动态列表 | /log/oper.log(SYSLOG_OPER,写入点 4 处:定值保存 / 复归 / 对时 / 清除记录) | ✅ 已落地(ui_page_oper.c,2026-10-28) |
| 36 | 保护告警 | 动态列表 | /log/alarm.log(SYSLOG_ALARM,asserted 且跳闸投退=0) | ✅ 已落地(ui_page_alarm.c,2026-10-28) |
| 37 | 保护启动 | 动态列表 | /log/start.log(SYSLOG_START,picked 上升沿) | ✅ 已落地(ui_page_start.c,2026-10-28) |
| 38 | 遥控记录 | 动态列表 | /log/yk.log(SYSLOG_YK,写入点 iec104_pts.c 遥控段) | ✅ 已落地(ui_page_yk.c,2026-10-28) |
| 41 | 运行报告 | 列表页(12 行 / 2 页,四数逐个挂范围标签) | boot_stats(上电次数 + 复位原因)+ 四个 104 观测计数 + uptime_s,经 ui_data info 帧下发 | ✅ 已落地(ui_page_runreport.c,2026-10-28;跨开机累计按裁定不做) |
**统计(2026-10-25 复核)**:本表 27 叶中 **6 叶已落地**(遥信量 / 查看 4 页 / SOE),剩 21 叶 = 数据现成 **8** 项(整定 4 + 时钟 + 复归 + 死区 + 系数)· 需新数据层 **2** 项(清除记录 / 通讯设置)· 数据源不存在 **11** 项(遥信 3 + 手动录波 + SNTP + 记录 5 + 运行报告)。**分批与 DoD 见 `docs/任务规划/UI补齐.md`**——本表只讲逐页形态与数据源,不重复排期。
**2026-10-28 复核**:本表 27 叶中 **22 叶已落地**(本批 +6:记录 5 页与运行报告,见 docs/任务规划/UI补齐.md §2 与 docs/任务规划/登记簿.md §7);未落地的 5 叶 = 遥信类型 / 遥信防抖 / 双点遥信(无开入硬件)+ 手动录波(无录波模块)+ SNTP设置(产品口径未定),取舍与重开条件见 docs/任务规划/UI补齐.md §5。口径闭合:本表 22 叶 + 立项前就已绑定、不在本表内的 6 叶(装置信息 / 交流量 / 直流量 / 网口设置 / 自检记录 / 运行记录)= 现值已绑 28 叶(= UI_PAGE_MAP_COUNT);本表未落地 5 叶 = 菜单树未绑 5 叶(33 − 28)。复核方法:按缩进判叶子(有更深缩进后继者即非叶子),再按行内 #page= 数已绑。**2026-10-29 补充**:「手动录波」已随故障录波独立立项(docs/任务规划/故障录波.md 与 docs/子系统设计/故障录波设计说明.md),上面那行数字仍是 2026-10-28 当日复核值,未随立项改动。
**2026-10-29 二补(录波 UI 道落地)**:本表「手动录波」转已落地(23 叶);菜单树另新增「录波回放」叶(node 43,不在本表立项快照内)——现值 43 节点 / 34 叶 / 已绑 30 / 未绑 4(= 遥信 3 + SNTP 1,UI_PAGE_MAP_COUNT = 30),口径复核方法与上一段相同
---
## 3. 三个前置能力(不先做,页面只能显示假数据)
### 3.1 UI 数据快照层(最关键)
**问题**:分层门禁规定 `Drivers/BSP/**` 不得 include `App/**` 头(`scripts/check_layer_deps.py`),现有 6 条基线只减不增。相量、定值、遥信全在 `App/`,所以页面**无法合法地直接取数**——这正是交流量/直流量只能写死占位值的根因。
**方案**:沿用门禁注释里已经写明的意图——"记录读取应由上层递进来"。即 **App 推、BSP 存、页面只读**:
```
App/app/ui_data_feed.c(App 层,可同时 include 两侧)
每 N ms 组装一帧 → ui_data_publish_rt(&frame) / ui_data_publish_par(&frame)
│
▼
Drivers/BSP/UI/ui_data.c(BSP 层,持有最新一帧)
│ ui_data_rt(&snap) / ui_data_par(&snap) —— 页面钩子只读
▼
ui_page_ac / ui_page_yx / ui_page_setlist ...
```
> 契约、并发模型、写路径、记录 reader 注入与测试策略见 `docs/UI设计/UI_数据供给设计说明.md`,本节只保留规划粒度。
- 快照内容:9 路遥测值 + 品质、33 位遥信 + 有效位、40 项定值(Q10)+ 封存态、频率、时钟。
- 发布节奏:遥测/遥信 **200 ms**(与遥测链同源);定值**仅变化时**发布(`prot_set_checksum()` 变化触发,避免每拍 160 B 拷贝)。
- 方向正确:App → BSP 是"上层依赖下层",门禁允许;BSP 侧不认识 `App/` 任何符号。
- **并发:单写者同上下文,不需要锁**——`ui_data_feed_tick()` 与页面钩子都跑在 uiTask;序号只用于页面侧缓存失效判断(`ui_data_rt_seq()`),不是同步原语。
- 规模:**M**(`ui_data` + `ui_data_feed` 约 150 行 + 单测 + `ui_task.c` 接线)。
> ⚠ 没有这一层,后面 11 个"数据现成"的页面全部是假的。**它是本规划的第一优先项**,优先于任何单页。
### 3.2 数值编辑能力
**问题**:现有编辑只有 `ui_page_net_cfg.c` 的"逐字节改 IP"(↑↓ 调字节、←→ 移光标)。定值要改的是**浮点工程量**(10.0 A、120.0 V、500 ms),需要:位数移动、步进(含 0.01/0.1/1/10 分级)、范围校验、越界提示、保存失败提示。
**方案**:把编辑逻辑从 `ui_page_net_cfg.c` 抽成共享组件 `ui_w_editor`(或扩展 `ui_w_*` 家族),提供:
| 能力 | 说明 |
|---|---|
| 进入/退出编辑 | ENTER 进入(需 `edit_capable` 且 `UI_PERM_MODIFY`)、ESC 取消并回滚 |
| 数值步进 | ↑↓ 按当前光标位加减;光标位决定步长(个位/十分位/百分位) |
| 范围校验 | 取 `prot_set_meta_t` 的 `min/max`,越界拒绝并提示 |
| 提交 | 行内 ENTER 暂存 → 末行"保存"统一提交(一次封存、一次校验和) |
**关键设计**:定值保存必须**整表提交**而不是逐项写盘——`prot_set_set()` 批量写后必须 `prot_set_seal()`(见 `docs/算法/采集与算法层设计说明.md` §8)。逐项写会把校验和打成中间态,被自检判为损坏。
- 规模:**M**(组件 + 与 `prot_set` 的写回交接)。
### 3.3 记录类型表(记录页共用)
已有 `ui_w_records` 组件把"读日志 → 行渲染"收成一份代码,`ui_page_selftest` / `ui_page_runlog` 只是薄跳板。**新增文本类记录页 = 一行实例 + 一个 `syslog_id_t`**。
但 `sys_log` 目前只有 2 个 ID(运行、自检),且 **`/log/soe.log` 是二进制 64 B 结构**,不是文本 64 B——不能直接复用 `ui_w_records`。两条路:
| 记录 | 方案 | 成本 |
|---|---|---|
| 文本类(事故/操作/告警/启动/遥控) | 扩 `syslog_id_t` + 各记录写入方 | 页面 S,**写入方 M~L** |
| SOE(二进制) | 新 `ui_w_soe`:按 `soe_rec_parse()` 解码成"时间 + 类型 + 元件 + 值"两行 | **M** |
数据怎么进页面已定:**注入 reader**(`ui_rec_reader_t`),页面不再 include `sys_log.h`——顺带退掉 3 条分层基线(6 → 3)。契约见 `docs/UI设计/UI_数据供给设计说明.md` §7。
---
## 4. 页面归并:27 页 → 7 模块
| 包 | 模块 | 覆盖叶子 | 复用 |
|---|---|---|---|
| **A 实时数据** | `ui_page_yx` | 5 | 动态列表 + 快照层 |
| **B 定值查看** | `ui_w_setlist` + `ui_page_set_ro` ×4 描述符 | 13/14/15/16 | 一份组件,4 张视图表 |
| **C 定值整定** | 同 B + `ui_w_editor` | 8/9/10/11 | 同上 + 编辑 |
| **D 三遥设置** | `ui_page_three_remote`(5 描述符) | 18/19/20/21/22 | 同 B 组件 |
| **E 装置维护** | `ui_page_clock`(表单)+ `ui_page_action`(操作页) | 24/25/26/27 | 操作页可复用(复归/录波/清除三处) |
| **F 通讯参数** | `ui_page_comm`(2 描述符) | 29/31 | 同 B 组件 |
| **G 记录查询** | `ui_page_soe` + `ui_w_records` 扩 ID | 33/34/35/36/37/38 | 记录组件 |
| (H 厂家设置) | 见 §7 | 0(菜单树需扩) | — |
**定值 40 项的视图划分**(`prot_set` 现有 40 项,按语义分四组,不改校验和覆盖序):
| 视图 | 项数 | 内容 |
|---|---|---|
| 参数 | 8 | PT/CT 一次二次额定、四个返回系数 |
| 定值 | 18 | 三段过流、过负荷、过压/欠压、零序过压、过频/低频的定值与延时 |
| 控制字 | 4 | OC1~OC3、OL 的"跳闸/告警"选择(`*_TRIP`) |
| 软压板 | 10 | 全局软压板 + 9 个元件投退(`*_EN`) |
> 现状 `prot_set_meta_t` **没有名称字段、没有分类字段**。需要补:① 40 条中文名(受字体子集约束,见 §6);② 一个 `cat` 字段(ROM 表,不参与校验和,加字段安全)。
---
## 5. 分批实施
> 排序原则:**前置能力 > 数据现成 > 需补数据层 > 数据源不存在**。不按菜单顺序铺页。
### 批 1:打通数据 + 清掉"假页面"(9 个叶子 + 2 个回炉)
1. **`ui_data` 快照层**(§3.1)——所有后续页面的地基。
2. **交流量 / 直流量回炉**:接快照层,删掉占位值;直流量改成真实 3 路(直流通道 2 路 + 温度 1 路,或按 V0.1 实际可用量重定行)。
3. **遥信量**(node 5):33 行,无效位显示 `--` 并置灰语义(单色屏用前缀 `*` 或后缀 `?` 表示无效)。
4. **定值查看 4 页**(13/14/15/16):一份组件 + 4 张视图表 + 名称表。
5. **时钟设置**(24):6 字段表单,写 `sys_clock_set` 后回读校验。
6. **强制复归**(25):确认 → `prot_elm_request_reset()` → 回报(操作页首个实例)。
7. **清除记录**(27):需先给 `sys_log` 补删除 API(按 ID 删文件 + 重建 + 计数归零)。
8. **SOE 记录**(33):`ui_w_soe` 二进制解码列表。
**退出判据**:主站改一条定值 → 就地页面 200 ms 内显示新值;SOE 记录页能翻到最近 20 条。
### 批 2:整定与通讯(6 个叶子)
9. **`ui_w_editor`**(§3.2)→ **定值整定 4 页**(8/9/10/11)。
10. **通讯设置**(29):需先建 `comm_cfg`(`[comm]` 段:104 公共地址/端口/主站地址),照 `net_cfg` 的"RAM 副本 + 保存请求交接"范式。
11. **SNTP设置**(31):**建议只做页面不接线**,或直接推迟到 SNTP 立项——当前对时走 8888 端口私有协议,SNTP 是另一条链。
**退出判据**:就地改一条定值 → 保存 → 掉电重启 → 值保持且校验和自检通过;主站 C_RD 读到同一值。
### 批 3:等数据层(12 个叶子)
12. **三遥设置 5 页**(18~22)——等运行参数段与开入量。
13. **事故/操作/告警/启动/遥控 5 页**(34~38)——等记录写入方(每类记录 = 一个写入点 + 一个 `syslog_id_t`)。
14. **手动录波**(26):操作页(`ui_page_action` 确认链,受理后回「已请求录波」)——已落地(2026-10-29);同批新增「录波回放」单页(上下键切通道、左右键切段、阶梯线 3px/点、0 线虚线、峰值 mV 经 `wave_store_code_to_milli` 唯一口径、削徽标、空态/坏段显式文案,规格见 docs/子系统设计/故障录波设计说明.md §8.1)。
15. **运行报告**(41)——等计数器(上电次数/运行时长/复位原因/104 统计)。
### 批 4(可选):厂家设置
见 §7。
---
## 6. 每页成本与门禁
**标准动作**(已由生成器收敛,实测 3 处人工 + 1 条命令):
| # | 动作 | 落点 |
|---|---|---|
| 1 | 写 `ui_page_xxx.c/.h`(描述符 + 行表/回调) | `Drivers/BSP/UI/` |
| 2 | 菜单树叶子加 ` #page=xxx` | `ui_menu_tree.txt` |
| 3 | 跑 `python tools/menu_gen/gen_menu.py` | 自动改注册表 + 双端工程 |
| 4 | 登记黄金用例(键序 + 文本断言)并生成参考 | `simulator/tests/check_content_pages.py` + `ref/*.bin` |
**三条硬约束**:
1. **汉字子集**:任何新文案的汉字必须先过 `tools/font_gen/extract_cn.py` → `make_font.py`,否则显示空白方块(`font-charset` 门禁会拦)。40 条定值名 + 33 条遥信名会显著扩字库——**建议定值名沿用 2~4 字缩写**(如"过流Ⅰ段定值"→"Ⅰ段定值"),控制新增字数。
2. **像素黄金**:新页入 `ui-golden`,此后任何几何/字体改动都会触发全量比对;参考图一旦入库就只能"改代码对齐",禁止刷参考掩盖。
3. **RAM**:描述符 + 行表是 Flash const,**不占 LVGL 池**;开页峰值 +776 B(池 16 KB,实测峰值占 40%)→ 页数增加不影响池水位,但 `ui-golden` 的池基线常量要按新页复核。
---
## 7. 厂家设置:菜单树缺的一整支
参考项目的菜单有 **厂家设置**(`CN_COP_PWD` 厂家密码)一支,本项目菜单树**完全没有**:
| 参考项 | 本项目 | 价值判断 |
|---|---|---|
| 版本信息(板件版本) | 无 | **建议合并进"装置信息"**——单板设备,装置信息已有型号/软硬件版本/校验和/日期,再开一页是重复 |
| 恢复默认(全部/参数/定值/软压板) | 无 | **建议做**:生产返修与现场救急必备;依赖定值/参数模型(批 2 之后) |
| 元件配置 | 无 | 不做:本项目元件表是编译期数据驱动,运行期改元件等于改点表,超出 V0.1 范围 |
| 交流显示(一次/二次值切换) | 无 | 建议做(1 项配置):依赖标定,随批 3 |
| 装置调试:虚拟遥信/交流虚遥测/动作虚事件/动作出口 | 无 | **建议做"虚拟注入"**:无标准源也能验证 UI/104/记录全链,正好补 B10 的前置条件(详见下) |
> **虚拟注入的价值**:当前送检等标准源(B10),而虚拟注入能让"改一个假值 → 看 UI 是否变 → 看 104 是否上送 → 看 SOE 是否记录"这条链在没有硬件激励的情况下闭环。它是**测试基础设施**,不是产品功能,建议放在厂家菜单并加明显标识(标题后缀"调试")。
>
> **代价**:菜单树从 42 节点扩到约 48~50 节点,`ui_menu_tree.txt` 改动会触发菜单 8 状态像素回归与 `task-table` 式索引文档同步。**这是需要拍板的项**——见 §8。
---
## 8. 需要拍板的 5 个问题
| # | 问题 | 影响 |
|---|---|---|
| 1 | 菜单是否扩到 48~50 节点(加厂家设置支)? | 42 是产品需求里的硬数字;扩了要改 `产品需求设计文档.md` §8.2 与菜单像素回归 |
| 2 | **直流量页怎么办?**(V0.1 没有直流采样通道)三选一:改成"温度 + 备用"页 / 从菜单删掉 / 保留空页显示 `--` | 决定行表与菜单节点数 |
| 3 | 定值名用全称还是缩写?(字体子集大小 vs 可读性) | 40 条名 × 平均字数,直接影响字库与 `font-charset` |
| 4 | 事故/操作/告警/启动/遥控 5 类记录,是否本轮就要? | 每类 = 一个写入方 + 一个 `syslog_id_t` + 一个页面,是本规划里最大的一块后端工作 |
| 5 | 虚拟注入是否要做?做在哪一层(旁路真实采样 vs 覆盖快照)? | 决定它是否会影响保护判据路径(**必须旁路,绝不能进保护链**) |
| 6 | 交流量行表裁到几行?(24 行参考全套 vs 本机 9 路实有) | 决定页数与黄金参考数量 |
---
## 9. 与既有规划的关系
- 本文替代"剩余页面尚未规划"的状态(原 `docs/任务规划/README.md` §2.0 中「UI 扩展」的剩余 21 叶页面落地项按"暂缓、未规划"记载)。
- 页面工作**不应独立于数据层推进**:批 1 的第 1 项(快照层)与采集/遥测链共享同一批数据,建议与"测量子系统"同波次排期。
- 与 `docs/问题记录/采集与数据处理短板评测.md` 的对应:该文的标定(`docs/问题记录/采集与数据处理短板评测.md` §4.1)与遥测链(同文 §4.2)落地后,交流量/直流量/遥测系数三页才有真实数据可显示。