继续优化菜单RAM降低
This commit is contained in:
+18
-22
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user