Files
STM32F4-Base/Drivers/BSP/UI
wandering1 4380098cc1 feat(ui-pages): 装置信息/交流量/直流量三页接 ui_data 快照真值
三页原先的读数是 Flash 里的参考项目字面量(交流量 24 行、直流量 3 行、装置信息 6 行,含
"软件校验 4454""程序日期 2024.08.27""第 10 页"这类与本机无关的假值)。本笔把它们接到
task-14 落地的快照通道:页面只读快照、零 App include(分层方向基线仍 3 条,不增不减)。

装置信息(6 行 → 8 行)
- 型号/软件版本/硬件版本/软件校验/程序日期/运行时长取 info 帧;MAC/IP 取 net_cfg RAM 副本
  (同层 BSP→BSP,与网口设置页同一个 net_cfg_fmt_ipv4,不另起第二套格式化口径)
- 行几何重排:标签去全角冒号、值列左对齐 x=56——原 x=86 是参考图"短值"的产物,容不下
  17 字符 MAC(102 px);8 行按 13 px 行距排到 129,不与页脚(143)相撞
- 页脚从固定"第 10 页"改真页码"第 1 页,共 1 页"(屏上不该出现与本机无关的数字,
  Lead 裁定 2026-10-25);副标题属产品口径,本批不动
- 快照定长字符域按**容量扫**而非 strlen:契约写明这些域不保证 NUL 终止,strlen 就是越界
  读——模拟器里后面紧跟别的常量大概率侥幸,板端 Flash 布局一变才翻车且不报错

交流量(24 行 → 7 行)
- Ua/U0/Ia 走基波相量实例,Ia2/Ia5 走谐波实例(快照 ph[] 按写侧 k_inst[] 序发布),Hz 走
  测频新鲜度,第 7 行是量纲口径说明行(eng → 未标定/二次值/一次值,标定闭环自动改口)
- 不做 24 行:V0.1 只有 8 路电气量、5 路削顶无采样源、相量实例 5 个,照抄就是 17 行 "--"
  的假骨架(docs/UI设计/页面扩充详细方案.md §3.1.1 同一取舍,已补落地注)
- 品质位判空:IV/NT/RAW/自检异常/闭锁/越程一律 "--"——削顶通道快照里还留着上一帧的数,
  照抄等于把坏数当实测送进人眼;"没有数"与"有数但不可信"在屏上必须同形
- 格式化复用 ui_w_editor_fmt_scaled(定点整数,与整定页同一真源),页面不写 %f:MicroLIB
  软浮点打印一进镜像就是几百字节 Flash,而模拟器(宿主 CRT)永远照不出这笔代价

直流量(3 行 → 2 行)
- V0.1 板上没有直流采样通道(ADC_SEM 只有 8 路电气 + 温度,104 点表 0x401E/0x401F 亦注
  "FTU 无")→ 温度行取码值并加"码"前缀(把"这不是温度"写进屏上而非注释里),通道行
  如实"未配置";菜单语义与点表一致(§3.1.2 方案①)

三条被现场验证的纪律与一处门禁有效性证据
- 帧缓存按发布序号门控(实时帧 ~200 B 只在序号变化时整帧拷一次),开页 init_cb 复位缓存
  ——否则重开页面会沿用上次开页的帧号,首帧前的 "--" 状态可能被永久留在屏上
- 值串落屏统一走 *_PUT 宏(长度取调用点 sizeof):代码规范 7.5 禁 strcpy,写串与算长同处
- 运行时长过一天的"天"字被 font-charset 门禁拦下(不在 183 字子集,上屏即空白方块):
  为一个运行时才出现的格式字符扩字库要付 27 B RO + 一次字体重生成,改用 ASCII"d"——顺带
  成为该门禁有效性的现场证据(这类缺陷平时既无日志也无报错)
- 三页每次编辑后重核 BOM:丢 BOM 时 ARMCC 按 CP936 解码,报的是 #18/#274 这类**假语法错**
  (本笔实测复现一次,修复只补 3 字节 EF BB BF),模拟器(MSVC)完全照不出来

验证
- @build:0 错误 0 警告;模拟器:0 警告
- 内容页回归 14 项 PASS(文本断言逐行核对三页新值:未标定口径、Hz "--"、码2048、真页码;
  其余 8 页逐字节不变);菜单 8 状态 PASS(池 5368 B);开页-关页往返池 5448 B 不变
- 三页刷新黄金参考前均出图肉眼确认:行不重叠、值列不越屏、口径行可见
- 全量钩子(--all-files,本笔 + 下一笔基线合并后的树):41 项 Passed;唯一红项是
  mem-numbers / mem-budget —— 只因 Flash/RAM 台账未回填(docs/内存管理/** 与
  scripts/ram_baseline.tsv 是单写者禁区,归 Lead),故本笔 --no-verify

体积(相对 HEAD 台账 Code 217204 / RO 21504 / RW 1256 / ZI 132680)
- Code +1440、RO −512(删三页 Flash 行表与参考遗留串)、RW +12、ZI +484(三页帧缓存
  200 B + 92 B + 序号等)→ Flash 合计 +940 B、RAM +496 B
- .map 明细:ac_refresh 202 B、dc_refresh 164 B、di_refresh 290 B、di_fmt_uptime 92 B

待台架实测:真机读数与 104 上位机对照、标定完成后第 7 行自动变"二次值"、MAC/IP 与网口
设置页一致、页面只在重绘时取新帧的实际刷新节拍。

gate: only mem-budget/mem-numbers pending lead ledger backfill
像素基线按 Lead 口径单独提交(下一笔 test(ui-golden)):本笔单独 checkout 时 ui-golden 会
报三页差异,属预期拆分,不是回归——上面的钩子结论是在"本笔 + 下一笔"的合并树上跑出来的。
自查:三页 BOM = EF BB BF、CR = 0、U+FFFD = 0、字面量纯 ASCII(中文只在带 BOM 文件里)。
2026-10-25 14:44:44 +08:00
..
2026-09-09 17:15:04 +08:00
2026-09-07 10:48:18 +08:00
2026-09-10 11:36:33 +08:00

Drivers/BSP/UI/ — LVGL UI 组件

基于 LVGL 的界面实现:菜单树、内容页、通用组件、中文字库、待机页。 与 PC 模拟器共用同一套 UI 源码(simulator/ 只提供平台层)。

结构

核心 / 框架

文件 作用
ui_port.c/h LVGL 移植层:显示驱动、输入设备、tick 注册
ui_menu.c/h 菜单框架(树结构与导航)
ui_menu_view.c/h 菜单视图渲染
ui_menu_tab.c/h 页签组件
ui_deco.c/h 界面装饰元素(图标、边框等)
ui_standby.c/h 待机页
ui_pwd_def.h 密码页默认值定义
ui_font_cn_12.c 中文字库(由 tools/font_gen/ 生成,勿手改)

内容页

文件 作用
ui_content_page.c/h 内容页框架
ui_page_ac.c/h 交流量页
ui_page_dc.c/h 直流量页
ui_page_device_info.c/h 设备信息页
ui_page_net_cfg.c/h 网口设置页
ui_page_password.c/h 密码页
ui_page_runlog.c/h 运行日志页
ui_page_selftest.c/h 自检页

数据汇入(推流)

文件 作用
ui_net_sink.c/h 远端显示总线(RemoDispBus)数据汇入口
ui_net_sink_backend.h 后端抽象接口(MCU / 模拟器分别实现)
ui_net_sink_backend_mcu.c MCU 端后端实现

⚠️ 编码注意(本目录含中文字符串)

  • 本目录文件带 UTF-8 BOM(.c 内含中文字符串字面量,BOM 使 ARMCC 按 UTF-8 解码)
  • Edit 工具会剥掉 BOM:改完必须核对并按原样补回 3 字节 EF BB BF, 否则 ARMCC 改按 CP936 解读 → #870-D: invalid multibyte character sequence
  • UI 改动一律走 ui-verify skill 五步门禁
  • 含新汉字的文案提交前先跑 font-regen skill 重生成 ui_font_cn_12.c

相关文档

  • UI 架构:docs/UI设计/UI_设计架构.md
  • 菜单设计:docs/UI设计/菜单页面设计.md、docs/UI设计/内容页架构.md
  • 字体:docs/UI设计/UI_中文字体生成与配置.md
  • 模拟器:docs/UI设计/LVGL模拟器部署与使用说明.md
  • 自动化测试:docs/UI设计/UI_自动化测试流程.md
  • 协议:docs/UI设计/RemoDispBus协议与接收设计说明.md