Files
STM32F4-Base/Drivers/BSP/UI/ui_tokens.h
T
wandering1 dafc18f5ed feat(UI): W6 第一波——设计令牌层、页面注册表生成器与 UI 门禁补强
启动 docs/任务规划/README.md 的 W6 UI 扩展簇(用户裁定,覆盖 2026-10-11
的"本轮不排期")。四个工作包,全部验证通过。

## U1 设计令牌层(零行为变化)
新建 Drivers/BSP/UI/ui_tokens.h(20 个宏),框架 + 7 个页面 + App/task/
ui_task.c 全部接入。屏幕几何**复用 ui_port.h 既有 UI_SCREEN_W/H**,不重复
定义;令牌头自身只 include ui_port.h,不把 LVGL 拖进全部消费者。
补收了报告没列但代码里真重复的量:UI_TEXT_BAND_H 15(7 次)、列表左右边界
与每页行数(各 4 个页面逐字复制)、推流协议几何与显示几何同源(此前硬编码
3200 且注释写着"须与 UI_FB_SIZE 一致"——典型漂移隐患)、UI_TASK_TICK_MS
(ui_port_step 与 osDelay 必须同值,原先靠注释维系)。
故意不收页面私有几何与"同形不同义"的值(device_info 的 pitch=15 与列表
UI_ROW_PITCH=14 合并即改像素)。

## U3 页面注册表与生成器(删手工分发)
ui_page_registry.{c,h} 由生成器产出,**手工 menu_content_page_for() 已删
除**(仓库内仅存 2 处历史说明注释)。密码页按代码实况**单独出口**
(ui_page_registry_password())——它非节点绑定,任何 #P 叶子进同一页。
顺带落地此前判定"U1 阶段做不了"的共享 flat 样式 ui_style.{c,h}。
生成器除产注册表外**自动把新 .c 写进 uvprojx 与 CMakeLists.txt**,且
**双向对账**:加页打印 registered、删页打印 pruned,不留死条目;并双向
校验(#page 找不到实例报错、实例未被任何 #page 引用也报错)。

## U4 门禁补强(35 个钩子)
新增 font-charset 钩子(scripts/check_font_charset.py):复用
tools/font_gen 的同一套提取与 cmap 解析规则(importlib 直载,零第二套
规则),A 段查源码在用 vs 字符集、B 段查字符集 vs 字体 cmap。
registration-check 补第 ④ 类:实测原规则对"进了两端构建但没接描述符表"
的页面**全绿**——desc 被链接器剥离、编译链接全过、菜单永远打不开的死代码。
仍照不出的两项已如实写进文档(枚举漏加归 @build、菜单树漏挂归 golden)。

## 字体子集瘦身(D 案,4 留 3 删)
ui_cn_chars.txt 122→119 字(恰删 上/电/重,零新增)。异/常/片/芯 进
KEEP_EXTRA 带理由白名单:它们曾在 9eb1bd63 被写进中文自检描述落盘
/log/selftest.log(定长 64B 记录跨固件持久),删字形会使历史故障记录
渲染空白且不可逆。保留字按**必需**处理,反向有牙——谁只跑 extract_cn
把它们静默洗掉,钩子直接 FAIL 并逐字打印理由。
--strict 口径为"未知冗余 = 0"而非"冗余 = 0"。

## 验证
@build 0 错 0 警;ER_IROM1 232,052 B(较 HEAD −228 B)、RW_IRAM1
75,232 B **零增量**、RW_CCM 87.9% 未变。golden:菜单 8 状态全像素一致 +
内容页 11 页逐字节一致,**参考图 sha256 差异 0 条**(未用 --update 刷
基线);池水位菜单基线 5368 B、开页-关页往返 5448 B 与 U1 时相同。
38 个在途修改文件逐个核对 BOM/CRLF/U+FFFD 全部与 HEAD 一致。
L0 33 钩子 + L0.5 16 runner / 1104 断言全绿;check_doc_links --all
142 篇、无法判定 0;mem-budget / mem-numbers 已回填。

## 单位成本实测(U5 排期依据)
临时页 zzprobe 绑到"遥信量"叶子 → 只跑生成器 → 带页 @build 0/0 →
注册表出现 {5u, &ui_page_zzprobe_desc} → 回滚后 6 个产出文件 zzprobe
残留计数均 0、重编回基线。
**结论:新增一页 = 3 处人工(新 .c + 新 .h + 菜单树那一行加
 #page=<名>)+ 1 条生成器命令,手工编辑注册文件 0 处。**
据此修正报告原口径"8 处降到 1 处"——那个 1 只在"1 处对既有文件的修改"
意义下成立,页面自身 2 个文件本就要写,真实处数是 3。

## 文档同步与两处自我修正
§0.1 UI 行 B → B+;§6.1「内容页」「设计令牌」两行按实况回填;§6.5 U1/U3
状态更新;§6 顶部加"建议栏不可照抄"总警示(本轮四次证伪:ui_port.h 已有
同名宏、LV_COLOR_BLACK/WHITE 不存在且极性反了、27 页实为目标页数现存 7
个、生成器草图漏密码页非节点绑定)。
两处改口:① §6.5 U4 从我上一版**误写的 3/3 改回 2/3**——"golden 脚本早已
存在"不等于"已进自动门禁",两个 golden 脚本至今未挂 pre-commit,该缺口
单列为待办;② 原计划"分三笔提交"**作废**,U1 与 U3 改同一批文件、文件内
交叠,硬切会产生不可编译的中间态,故整波一笔。
2026-10-20 21:14:14 +08:00

69 lines
4.5 KiB
C
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 Design Tokens (UI 设计令牌层 L0)
* 模块功能:UI 视觉骨架的唯一取值来源——屏幕几何、内容页骨架(标题/页脚/文本
* 条带/选中带内缩)、列表页原型(首行顶/行距/带高/两列 x/每页行数)、
* 滚动条宽、文本缓冲长度、1bpp 语义色、UI 任务节拍与待机阈值;
* 各页面/框架文件只引用本头令牌,不再自带同值字面量
* (治理背景见 docs/问题记录/项目审查与优化建议报告.md §6.3 L0);
* 纯取值定义,不含任何逻辑;改一处即全局生效,改前必须跑 ui-verify 像素回归
* 适用平台:STM32F407ZGTx / PC 模拟器(两端共用)
* 作者:王建锋
* 创建日期:2026-10-15
* 修改记录:
* v1.0 2026-10-15 王建锋 创建初始版本(U1:收编散落各 UI 文件的布局/颜色/缓冲魔数,
* 纯替换、零行为变化;像素与替换前逐位一致)
*/
#ifndef UI_TOKENS_H
#define UI_TOKENS_H
/*
* 依赖说明:
* 1. 屏幕几何(UI_SCREEN_W / UI_SCREEN_H / UI_FB_SIZE)的**权威定义在 ui_port.h**
* (显示端口,MCU 与模拟器两端共用),本头复用而不重复定义——避免同名宏二次定义。
* 2. 语义色宏展开为 LVGL 取色函数调用,故引用方须已包含 "lvgl.h"
* (UI 各 .c 均经 ui_content_page.h / ui_menu_view.h 等间接包含)。
*/
#include "ui_port.h"
/* ── 内容页骨架(框架 ui_content_page.c 与各自绘页共用)────────────────────── */
#define UI_TITLE_Y 2 /* 标题放置 y(居中;CJK 字形顶距 +1 → 墨迹自 y=3 起) */
#define UI_PAGE_LINE_Y 143 /* 页脚"第 X 页,共 Y 页"放置 y */
#define UI_TEXT_BAND_H 15 /* 单行文本条带下延量(字体行高 13 + 余量):y2 = y + 本值 */
#define UI_BUF_STRLEN 32 /* 动态行 / 页脚文本缓冲长度(含 NUL;超出行带即被裁切) */
#define UI_SEL_BAND_INSET_L 2 /* 选中白带左内缩(x1 = 本值) */
#define UI_SEL_BAND_INSET_R 3 /* 选中白带右内缩(x2 = 屏宽 - 本值,即止于 x=156) */
#define UI_FOOTER_X 6 /* 页脚文本左起 x(左对齐留白,与实机一致) */
/* ── 列表页原型(交流量/直流量/运行记录/自检记录/网口设置共用一套骨架)──────── */
#define UI_LIST_TOP 24 /* 首行槽顶 y */
#define UI_ROW_PITCH 14 /* 行距(相邻行槽顶间距) */
#define UI_ROW_BAND_H 13 /* 选中白带高(= 字体行高;selectable 页须 >0 否则选中行不可见) */
#define UI_LIST_LEFT_X 7 /* 左列 x(名) */
#define UI_LIST_RIGHT_X 101 /* 右列 x(值) */
#define UI_LIST_ROWS 8u /* 每页可见行数 */
/* ── 菜单显示层 ───────────────────────────────────────────────────────────── */
#define UI_SCROLLBAR_W 4 /* 自动滚动条宽(px;行超框高时出现) */
/* ── 1bpp 语义色(LV_COLOR_FORMAT_I1)─────────────────────────────────────── */
/*
* 本屏只有黑白两值,但保留语义名:换色深时只改本段即可平移,不必回改各绘制点。
* 极性(实测,勿凭直觉改):文本/分隔线/边框一律取 white(1bpp 下即"暗墨"),
* black 是底;选中行反显 = 白底黑字,故 SEL 前景取 black、SEL 背景取 white。
*/
#define UI_COL_FG lv_color_white() /* 墨:文本 / 分隔线 / 边框 / 滚动条 */
#define UI_COL_BG lv_color_black() /* 底:黑 */
#define UI_COL_SEL_FG lv_color_black() /* 选中行字色(反显后为黑字) */
#define UI_COL_SEL_BG lv_color_white() /* 选中行带底色(反显后为白带) */
/* ── UI 任务与待机策略 ────────────────────────────────────────────────────── */
#define UI_TASK_TICK_MS 10 /* uiTask 主循环周期:LVGL 推进步长 = osDelay 时长 */
#define UI_STANDBY_IDLE_MS 60000u /* 无操作进入待机屏的阈值(ms) */
#endif /* UI_TOKENS_H */