2575177e81
纯改名,检查行为一个字没动:规则逻辑、阈值、豁免形状全部原样。 改名原因(用户一句「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、均有尾换行)。
89 lines
4.2 KiB
C
89 lines
4.2 KiB
C
/*
|
||
* 模块名称: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
|