4332142680
批 4 主体(票 task-15;规格 docs/UI设计/页面扩充详细方案.md §3.1.3 方案 A)。V0.1 只有 6 点有 硬件来源,其余 27 点在屏上就是 "--"——这是真实状态,不是页面没做完。 页面与数据 - 33 行固定名表(Flash const)+ 动态分页(8 行/页 = 5 页)。两处命名不照抄文档简写:idx0~3 屏上写「位置1~4」而非「YK1~4 位置」(遥信页出现 YK 前缀会被读成遥控对象,对应关系留在注释); idx30 写「保护闭锁」(写侧位号注释的语义即此,用编号反而丢信息)。idx4~13、idx31~32 点表未 定义功能名,如实写点号占位(YX5…、YX32),不编造功能名。 - 值映射次序:先判无效 → 再判单/双点 → 最后看位值。无效位上的位值不代表任何事实,次序颠倒就会 把垃圾位画成「复归」。 - 快照新增 yx_dp 双点位图(+8 B)。不教页面"前 4 点是双点":单双点是 104 点表事实(YX_DP_N / iec104_pts_yx_is_dp),抄进表现层就是第二真相——点表把双点段挪位或改起始下标,屏上不报错, 只会用错词形容同一个点。写侧逐点问 is_dp() 拼位图。 - UI_DATA_YX_N(33) 与 iec104_pts_yx_count() 编译期比不了(那个 #define 在协议层 .c 内),故写侧 留一条一次性 DBG_ERROR(约 90 B Flash,只在真漂移时打一次)。名表行数 = UI_DATA_YX_N 由数组 宽度法编译期守卫钉住(ARMCC C99 无 _Static_assert,本仓惯用写法)。 - 补 include 一条实测坑:DBG_ERROR 是宏,漏 include "dbg_log.h" 时 ARMCC 把它当隐式声明函数放过 编译期,错落在链接期(L6218E Undefined symbol DBG_ERROR)——报错点离根因隔了一整个链接步骤, 已在 include 处写明「DBG_TAG 必须在 include 之前」。 一个只有像素文本断言能抓到的截断 bug - 照抄批 1 的 *_PUT(dst, 源) 宏(长度取 sizeof(源)),但本表源是 const char *const 数组的 **元素(指针)**,sizeof 得 4 → 「故障总」被截成「故」,而 "YX9" 恰好 4 字节看起来完全正常。 编译器 / cppcheck / 编码钩子全不响。定位来自断言:第 2 页「过流Ⅰ段」匹配不到,同一行值列 「复归」却在原位 = 名字被截、值没错位。修法:长度取目标缓冲容量 UI_BUF_STRLEN。同名宏、不同 参数类别(数组 vs 指针),批 1 那处本身是对的,照抄才中招——教训写在宏定义上方。 模拟器与覆盖诚实性 - 固定帧发布 yx_dp = 0x0F,但刻意不把这几位置进 yx_valid:V0.1 无开入硬件,屏上就是 "--"。不用 「让它显示合位/分位」的假数据填满画面,那等于让黄金参考声称本机有开关位置遥信。 - 代价如实登记:合位/分位这条词映射当前**没有任何自动化证据**(像素恒 IV;页面依赖 LVGL 进不了 主机单测)。已写进方案 §3.1.3 落地注与契约落地进度·四,作为开入落地后的台架判据,不假装测过。 测试 - 主机单测 +2 条(TC-UIDATA-009c 双点位图原样透传、不被 valid 掩;009d 点数 33 的独立见证,注明 绊红时要同步改哪四处)→ 85/85。 - 文本断言 +33 条(yx / yxp2 两态,含页码钉住 33/8 = 5 页的分页数学);两页像素基线单独一笔。 - font-charset 本批零新增字:名表用字全部命中既有 183 字子集——「置/故/障/总/外/部」正属批 1 成组并入 KEEP_EXTRA 的那批字,第二次兑现(当时若按 extract 输出重写字符集,这些字早被洗掉, 上屏是空白,而门禁只会说「字不在清单里」)。 体积(同一棵树、构建前后的实测增量) - Code 224272→224688(+416);RO 24040→24640(+600);RW 1324→1328(+4); ZI 134844→135088(+244)→ Flash 约 +1020 B、RAM +248 B。 - RO 增量主要是 33 行名表与名称串,是"把 33 个真点名上屏"的代价,不是可省开销。 跳过的门禁(三条同族,同一根因):mem-numbers / mem-budget / size-gate(L0c)——台账与体积凭证 回填是 Lead 单写者,本分支不做静默处理,数值见上。
61 lines
2.5 KiB
Plaintext
61 lines
2.5 KiB
Plaintext
# 主菜单层级定义(声明式源)
|
|
# 规则:缩进即层级,每级 2 空格;`#` 开头为注释;空行忽略。
|
|
# 行尾可选 ` #P` = 该叶子需密码(密码页按所输密码授权:查看密码→只读 / 修改密码→可修改);无尾注 = 不需密码页(直接进,只读)。
|
|
# 密码值:Drivers/BSP/UI/ui_pwd_def.h 编译期配置(查看/修改各一个,改值 = 重新编译)。
|
|
# 行尾可选 ` #page=<模块名>` = 该叶子绑定一个内容页实例(U3 页面注册表):
|
|
# 模块名 = Drivers/BSP/UI/ui_page_<模块名>.c,其描述符符号须为 ui_page_<模块名>_desc。
|
|
# 声明了 #page 但实例文件缺失/符号不符 → 生成器报错(不产出半成品表)。
|
|
# 未被任何叶子 #page 引用的 ui_page_*.c 同样报错(写了却从不生效的死代码)。
|
|
# 注:密码页**不是**节点绑定的(任何 #P 叶子都进同一页),故由下方 @password 指令单独声明。
|
|
# 指令(整份文件级,写在注释行里):
|
|
# # @password=<模块名> = 需密码叶子统一进的内容页模块名(省略 = 无密码页)。
|
|
# 改菜单/改页面绑定只需编辑本文件,然后重跑:
|
|
# python tools/menu_gen/gen_menu.py
|
|
# 产物:Drivers/BSP/UI/ui_menu_tab.c / ui_menu_tab.h
|
|
# Drivers/BSP/UI/ui_page_registry.c / ui_page_registry.h(节点→页面注册表,自动生成)
|
|
# 生成器并自动把新增的 ui_page_*.c 写进 MDK-ARM/STM32F407-Demo.uvprojx 与
|
|
# simulator/CMakeLists.txt 两处显式列表(双端注册),无需手工编辑注册文件。
|
|
# @password=password
|
|
主界面
|
|
装置信息 #page=device_info
|
|
实时数据
|
|
交流量 #page=ac
|
|
直流量 #page=dc
|
|
遥信量 #page=yx
|
|
参数定值
|
|
整定
|
|
参数 #P
|
|
定值 #P
|
|
控制字 #P
|
|
软压板 #P
|
|
查看
|
|
参数 #page=view_param
|
|
定值 #page=view_set
|
|
控制字 #page=view_word
|
|
软压板 #page=view_plate
|
|
三遥设置
|
|
遥测死区 #P
|
|
遥测系数 #P
|
|
遥信类型 #P
|
|
遥信防抖 #P
|
|
双点遥信 #P
|
|
装置维护
|
|
时钟设置 #P
|
|
强制复归 #P
|
|
手动录波 #P
|
|
清除记录 #P
|
|
通讯参数
|
|
通讯设置 #P
|
|
网口设置 #P #page=net_cfg
|
|
SNTP设置 #P
|
|
记录查询
|
|
SOE记录 #page=soe
|
|
事故记录
|
|
操作记录
|
|
保护告警
|
|
保护启动
|
|
遥控记录
|
|
自检记录 #page=selftest
|
|
运行记录 #page=runlog
|
|
运行报告
|