继续优化菜单RAM降低

This commit is contained in:
2026-09-08 22:24:45 +08:00
parent 6662f3a455
commit 9ead5679a1
7 changed files with 195 additions and 172 deletions
+18 -22
View File
@@ -10,6 +10,8 @@
* 2026-09-04 王建锋 重构为"横向级联框"模型(菜单页面设计.md):拆出显示层
* ui_menu_view 与数据层 ui_menu_tab;本层只留导航状态机
* 2026-09-08 王建锋 按代码规范 V1.0 补全分区注释与关键行注释;函数定义括号改 K&R 风格(同行)
* 2026-09-08 王建锋 4 层容器→单一持久容器(焦点/键唯一入口;键回调深度改取
* s_depth,去掉 user_data=depth;container/focus 调用去参)
*/
/* 头文件包含区 */
@@ -69,7 +71,7 @@ static void menu_open(uint8_t child) {
ui_menu_view_frame_build(d + 1u, child, s_sel[d + 1u],
(uint16_t)(same ? s_scroll[d + 1u] : 0u));
ui_menu_view_focus(d + 1u);
ui_menu_view_focus();
}
/*
@@ -77,13 +79,13 @@ static void menu_open(uint8_t child) {
* 入口参数:无
* 返回值:无
* 限定条件:s_depth > 0
* 函数说明: 1. 销毁最右框行对象(既有屏上框不动、无需重建)
* 函数说明: 1. 销毁最右框(框体+行数据;既有屏上框不动、无需重建)
* 2. 焦点回父框;父层选中/滚动原样保留(选中不跳)
*/
static void menu_back(void) {
ui_menu_view_frame_destroy(s_depth);
s_depth--;
ui_menu_view_focus(s_depth);
ui_menu_view_focus();
}
/*
@@ -135,18 +137,15 @@ static void menu_key_handle(uint8_t depth, lv_key_t key) {
}
/*
* 函数功能:页面容器按键事件入口(每层容器各挂一个,user_data=层深度)
* 入口参数:e - 事件指针 lv_event_t *
* 函数功能:页面容器按键事件入口(唯一入口;深度取 s_depth)
* 输入参数:e - 事件指针 lv_event_t *
* 返回值:无
* 限定条件:容器已加入默认输入组并获焦
* 函数说明:键值经默认输入组送达焦点容器;统一分发到 menu_key_handle
* (焦点恒为持久容器,焦点框深度即 s_depth,无需 user_data 传层)
*/
static void menu_key_cb(lv_event_t *e) {
uint8_t depth = (uint8_t)(uintptr_t)lv_event_get_user_data(e);
if (depth < MENU_PAGE_MAX) {
menu_key_handle(depth, (lv_key_t)lv_event_get_key(e));
}
menu_key_handle(s_depth, (lv_key_t)lv_event_get_key(e));
}
/*
@@ -156,7 +155,7 @@ static void menu_key_cb(lv_event_t *e) {
* 限定条件:ui_port_init()/sim_port_init() 已成功调用,活动屏幕存在
* 函数说明: 1. 数据表自检(parent 下标均有效,捕获表内笔误)
* 2. 重置导航状态 → 初始化显示层
* 3. 各层容器加入默认输入组并挂键回调(按键由逻辑层统一处理)
* 3. 持久容器加入默认输入组并挂键回调(唯一入口;深度取 s_depth)
* 4. 建根框(主界面 node 0 子项)并置焦点
* 5. 构建前后监控 LVGL 池内存并打印
*/
@@ -182,25 +181,22 @@ int ui_menu_init(void) {
(unsigned)mon.total_size,
(unsigned)mon.free_size, (unsigned)mon.free_biggest_size);
/* 初始化显示层:样式 + 4 层持久容器 + 根框框体/装饰(失败 = 对象创建失败、池耗尽) */
/* 初始化显示层:样式 + 持久容器 + 根框框体(失败 = 对象创建失败、池耗尽) */
if (ui_menu_view_init() != 0) {
return -1;
}
/* 键接线:各层容器加入默认输入组;按键一律由逻辑层处理(显示层纯渲染) */
for (uint8_t d = 0u; d < MENU_PAGE_MAX; d++) {
lv_obj_t *cont = ui_menu_view_container(d);
if (cont == NULL) {
return -1;
}
lv_group_add_obj(lv_group_get_default(), cont); /* 容器入组:焦点可轮到它、能收键事件 */
/* 容器挂键回调;层深度 d 装入 user_data 指针(menu_key_cb 内拆回) */
lv_obj_add_event_cb(cont, menu_key_cb, LV_EVENT_KEY, (void *)(uintptr_t)d);
/* 键接线:持久容器入默认输入组;按键一律由逻辑层处理(显示层纯渲染) */
lv_obj_t *cont = ui_menu_view_container();
if (cont == NULL) {
return -1;
}
lv_group_add_obj(lv_group_get_default(), cont); /* 容器入组:焦点可轮到它、能收键事件 */
lv_obj_add_event_cb(cont, menu_key_cb, LV_EVENT_KEY, NULL);
/* 根框:主界面(node 0)子项;建一次、持久 */
ui_menu_view_frame_build(0u, 0u, 0u, 0u); /* depth=0、node=0(主界面)、sel=0、scroll=0 */
ui_menu_view_focus(0u); /* 焦点置根框:按键首先进根框 */
ui_menu_view_focus(); /* 焦点置持久容器:按键进入菜单 */
/* 读构建后内存、打印增量(对照上方基线) */
lv_mem_monitor(&mon);