Files
STM32F4-Base/Drivers/BSP/UI/ui_page_registry.c
T
wandering1 728d60675f 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,交台架道补。
2026-10-27 11:29:23 +08:00

83 lines
3.5 KiB
C

/*
* 模块名称:UI 页面注册表(自动生成)
* 模块功能:叶子节点 → 内容页描述符映射表 + 2 个查询 API(导航逻辑层消费)
* 适用平台:STM32F407ZGTx / PC 模拟器(共用源码)
* 作者:王建锋
* 创建日期:2026-10-15
* 自动生成:本文件由 tools/menu_gen/gen_menu.py 从 ui_menu_tree.txt 的 #page= 注记生成,请勿手改。
* 新增一页:菜单树给叶子加 " #page=<模块名>" + 写 ui_page_<模块名>.c,重跑生成器
*/
#include "ui_page_registry.h"
#include "ui_page_ac.h"
#include "ui_page_calib.h"
#include "ui_page_clear.h"
#include "ui_page_clock.h"
#include "ui_page_comm.h"
#include "ui_page_dc.h"
#include "ui_page_deadband.h"
#include "ui_page_device_info.h"
#include "ui_page_net_cfg.h"
#include "ui_page_password.h"
#include "ui_page_reset.h"
#include "ui_page_runlog.h"
#include "ui_page_selftest.h"
#include "ui_page_soe.h"
#include "ui_page_view_param.h"
#include "ui_page_view_plate.h"
#include "ui_page_view_set.h"
#include "ui_page_view_word.h"
#include "ui_page_yx.h"
const ui_page_entry_t g_ui_page_map[UI_PAGE_MAP_COUNT] = {
{ 1u, &ui_page_device_info_desc }, /* node 1 装置信息 */
{ 3u, &ui_page_ac_desc }, /* node 3 交流量 */
{ 4u, &ui_page_dc_desc }, /* node 4 直流量 */
{ 5u, &ui_page_yx_desc }, /* node 5 遥信量 */
{ 8u, &ui_page_view_param_desc }, /* node 8 参数 */
{ 9u, &ui_page_view_set_desc }, /* node 9 定值 */
{ 10u, &ui_page_view_word_desc }, /* node 10 控制字 */
{ 11u, &ui_page_view_plate_desc }, /* node 11 软压板 */
{ 13u, &ui_page_view_param_desc }, /* node 13 参数 */
{ 14u, &ui_page_view_set_desc }, /* node 14 定值 */
{ 15u, &ui_page_view_word_desc }, /* node 15 控制字 */
{ 16u, &ui_page_view_plate_desc }, /* node 16 软压板 */
{ 18u, &ui_page_deadband_desc }, /* node 18 遥测死区 */
{ 19u, &ui_page_calib_desc }, /* node 19 遥测系数 */
{ 24u, &ui_page_clock_desc }, /* node 24 时钟设置 */
{ 25u, &ui_page_reset_desc }, /* node 25 强制复归 */
{ 27u, &ui_page_clear_desc }, /* node 27 清除记录 */
{ 29u, &ui_page_comm_desc }, /* node 29 通讯设置 */
{ 30u, &ui_page_net_cfg_desc }, /* node 30 网口设置 */
{ 33u, &ui_page_soe_desc }, /* node 33 SOE记录 */
{ 39u, &ui_page_selftest_desc }, /* node 39 自检记录 */
{ 40u, &ui_page_runlog_desc }, /* node 40 运行记录 */
};
/*
* 函数功能:查叶子节点绑定的内容页描述符
* 入口参数:node - 菜单叶子节点下标 uint8_t
* 返回值:页面描述符;未绑定返回 NULL const content_page_def_t *
* 限定条件:无(越界 node 不会命中任何条目,直接 NULL)
* 函数说明:线性扫描绑定表(条目 = 有内容页的叶子,个位数量级)
*/
const content_page_def_t *ui_page_registry_for(uint8_t node) {
for (uint8_t i = 0u; i < UI_PAGE_MAP_COUNT; i++) {
if (g_ui_page_map[i].node == node) {
return g_ui_page_map[i].desc;
}
}
return NULL;
}
/*
* 函数功能:取密码页描述符(需密码叶子统一进这一页,非节点绑定)
* 入口参数:无
* 返回值:密码页描述符 const content_page_def_t *
* 限定条件:无
* 函数说明:取值来自 ui_menu_tree.txt 的 @password 指令(生成期解析,运行期零开销)
*/
const content_page_def_t *ui_page_registry_password(void) {
return &ui_page_password_desc;
}