Files
STM32F4-Base/Drivers/BSP/UI/ui_menu_tab.h
T
wandering1 2575177e81 refactor(gate): bsp-err 四项检查改用自描述标签,废掉 R1~R4 这组撞车代号
纯改名,检查行为一个字没动:规则逻辑、阈值、豁免形状全部原样。

改名原因(用户一句「R4 到底是什么」问出来的):R1~R4 是我在 check_bsp_err.py 注释里
自造的序号,而这个裸形在本仓另有含义——R1~R8 已在 scripts/id_registry.json 登记为
"专项风险"的文档内编号(保护规划与看门狗的风险表都在用),带连字符的那一族又是审查
报告的可靠性 / 内存优化项编号(编号规范 §1 的"连字符承载语义"一行正是这么写的)。
**同一个裸形四种意思**。最刺人的一点:编号门禁**不会报**这种撞法,因为编号规范 §4.3
已把这些裸形声明为"同号不同义"、走 collides_with 白名单,校验 4 不计事故——同一天里
我起的另一组自造号被当场拦下、这组代号却一路绿灯,差别不在我做对了什么,而在白名单
挡的是"事故"、不是"可读性"。

新名同时是基线键的第二字段(格式 文件|标签|名字):
· err-type        错误通道不外泄(对外接口不拿 HAL_StatusTypeDef / bool 当成败)
· timeout-name    超时宏不取负值
· return-doc      公开函数必须写「返回值:」
· consume-result  返回值不得裸丢弃(须接住或显式 (void))
老名对照:R1=err-type、R2=timeout-name、R3=return-doc、R4=consume-result。

同步面:脚本里的规则码与 38 条基线键的字段**一起换**(中途不跑 --prune,否则改名会被
读成"38 条全还清 + 38 条新账"),换完 --emit-baseline 复核仍是 38/38/0、RC=0。现状类
文本全部换新名:AGENTS.md、pre-commit使用说明.md §2.27(新增"检查项叫什么"一行含老新
对照与撞号说明)、bsp_err.h 边界纪律、报告 §0.4 / §9 / 附录 A,以及代码注释里的 5 处
(gd5f2gq5ue.c/.h、nand_ftl.h、ui_menu_tab.h)。已提交的变更记录行里的老名按"冻结历史
不回改"处理,以 §2.27 对照行为准。ui_menu_tab.h 带 BOM,Edit 又剥掉、已按原样补回。

写说明文字时又被编号门禁拦了一次:我为了举例"老名撞车",在那段话里写了两个编号字面,
被判"未紧邻文档名 / 未登记前缀"共 3 类新账——连批评自造编号的段落本身都在自造编号。
改法是不写号、只描述形态并指向权威条目。

验证:@build **0 错 0 警告**,Program Size 与上一笔**逐字段相同**(Code 213,676、RO
18,860、RW 1,188、ZI 131,500)→ 证明确为注释与文案,故不跑 @test(无指令变化);
pre-commit run 全绿 **17 项 Passed**;check_doc_links --all --sections-strict 147
  篇 0
问题(中途我自己写的 §4.3 没紧邻文档名,被判成本文自引用,已补全路径);9 个文件字节
卫生 0 异常(UI 头 BOM 仍在、无 CR、无 U+FFFD、均有尾换行)。
2026-10-23 09:36:01 +08:00

89 lines
4.2 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 菜单节点表头文件(自动生成)
* 模块功能:菜单节点结构、表规模护栏与表查询 API 声明
* 适用平台:STM32F407ZGTx / PC 模拟器(共用源码)
* 作者:王建锋
* 创建日期:2026-09-07
* 修改记录:
* 2026-09-13 王建锋 工程约定规范化(文件头),内容由生成器自动更新
* 自动生成:本文件由 tools/menu_gen/gen_menu.py 从 ui_menu_tree.txt 自动生成,请勿手改。
* 修改菜单:编辑 ui_menu_tree.txt 后重跑 `python tools/menu_gen/gen_menu.py`。
*/
#ifndef UI_MENU_TAB_H
#define UI_MENU_TAB_H
#include <stdint.h>
#include <stdbool.h>
#define MENU_ROOT 0xFFu /* 根哨兵:仅根节点(主界面)的 parent 取此值;8 位,上限 255 项 */
/* 菜单节点:子项 = parent 等于本下标的所有行(按表序);有子项=菜单,无=叶子 */
/* 字段序 parent/pwd 在前:32 位下两项 8 位合并 + 4 位指针 = 8 B/项 */
typedef struct {
uint8_t parent; /* 父节点下标(0..254);根为 MENU_ROOT(0xFF) */
uint8_t pwd; /* 1 = 需密码(密码页按所输密码授权);0 = 直接进(只读) */
const char *name; /* 显示文本(字面量,存 Flash) */
} ui_menu_node_t;
#define UI_MENU_TAB_COUNT 42
/* 护栏:8 位索引上限 255 项(哨兵 0xFF 占用 255);超界则编译失败(C99 写法,兼容 ARMCC v5) */
typedef char menu_tab_count_check[(UI_MENU_TAB_COUNT <= 255) ? 1 : -1];
extern const ui_menu_node_t g_menu_tab[];
/*
* 表查询 API(导航逻辑层 ui_menu.c 与显示层 ui_menu_view.c 共用):
* 实现随表生成,改菜单(ui_menu_tree.txt)调用方零代码改动。
*/
/*
* 函数功能:取某节点的直接子项(按表序)
* 入口参数:node - 节点下标 uint8_t 0 - 表长-1
* out - 子项下标输出 uint8_t[] 长度 >= max,可为 NULL(只数个数时)
* max - 最多写出个数 uint8_t >= 1
* 返回值:实际写出的子项个数 uint8_t 0 - max(0 = 叶子节点)
* 限定条件:node 越界时返回 0,不写 out(与"叶子"同形,调用方需要区分就先用 has_children)
* 函数说明:不分配内存、不递归,只查一层。
*/
uint8_t ui_menu_tab_children(uint8_t node, uint8_t out[], uint8_t max);
/*
* 函数功能:判断节点是否为菜单节点(有子项)
* 入口参数:node - 节点下标 uint8_t 0 - 表长-1
* 返回值:true - 有子项(显示为菜单,带 ▶);false - 无子项(叶子,可进内容页)
* 限定条件:纯查询,无副作用;node 越界返回 false
* 函数说明:这是**谓词**(bool 合法),不是成败码——S-5 的 err-type 检查里白名单放行的形态。
*/
bool ui_menu_tab_has_children(uint8_t node);
/*
* 函数功能:取节点的显示名
* 入口参数:node - 节点下标 uint8_t 0 - 表长-1
* 返回值:显示名字符串指针 const char* 指向表内静态存储,**不为 NULL**(越界返回空串)
* 限定条件:返回的是静态存储地址,调用方不得写、不得 free
* 函数说明:编码随表来源(ui_menu_tree.txt),显示层直接喂 LVGL。
*/
const char *ui_menu_tab_name(uint8_t node);
/*
* 函数功能:判断该叶子是否需要密码
* 入口参数:node - 节点下标 uint8_t 0 - 表长-1
* 返回值:true - 需密码(先进密码页,按所输密码授权);false - 直接进(只读)
* 限定条件:纯查询;node 越界返回 false(保守取"只读",不放开写权限)
* 函数说明:授权强度由密码页所输密码决定,本函数只回答"要不要过这一关"。
*/
bool ui_menu_tab_has_pwd(uint8_t node);
/*
* 函数功能:菜单表启动自检(表与生成器是否自洽)
* 入口参数:无
* 返回值:true - 表自洽(非根节点的 parent 下标均有效、pwd 只取 0/1);
* false - 表被手工改坏,调用方应拒绝进入菜单而不是继续用
* 限定条件:ui_menu_init() 阶段调用一次
* 函数说明:宁可拒绝显示,也不要按一张错表导航——错表可能把只读叶子指到写页面上。
*/
bool ui_menu_tab_valid(void);
#endif