UI 内容页框架加实时页自动刷新机制(交流量页启用,300ms)
- ui_content_page:描述符尾部追加 auto_ms/auto_seq 可选字段(缺省=0/NULL= 旧行为逐位不变);页打开期间框架持一只 lv_timer,仅当发布序号变过才整页 失效(零空转失效),关页即销;新 API ui_content_page_auto_poll - ui_page_ac.c:.auto_ms=300(≥200ms 发布节拍、避 400=2×200 锁相、300= 15×20ms LVGL 整刷周期;最坏屏上滞后 500ms;完整取值账目在代码注释) - simulator:rt 帧装配收口 sim_fill_rt_frame(n=0 冻结帧保 74 张黄金逐字节 一致,n≥1 确定性斜坡);新增 --rtlive 两态自检 + 窗口模式 200ms 节拍发布; check_content_pages.py 增 [rtlive] 零按键 A≠B 落屏断言 - docs/UI设计:供给说明新增 §5.5 自动刷新口径;内容页架构 §3.1/§四/§九 同步 (并修正 s_open 判定旧描述) - 台账:Keil 构建后按固定顺序回填(Code=256,588 / RW_IRAM1 +8B / UI +8B) 验证:模拟器 0错0警;菜单 8 状态 + 内容页 74 张 + rtlive(A≠B 30 字节)PASS (lead 独立复跑 RC=0);Keil 0错0警;mem-budget --gate / mem-numbers --scan 绿。
This commit is contained in:
@@ -36,6 +36,9 @@
|
||||
* id=%u 更可定位);绘制/按键/几何一律未动
|
||||
* 2026-11-02 DTU 项目组 新增 ui_content_page_current_desc(#69 板端导航身份查询:
|
||||
* 页 id 从"只有串口开/关沿可见"升级为可按帧查询)
|
||||
* 2026-11-13 DTU 项目组 实时页自动刷新:描述符 auto_ms>0 的页在打开期间由框架
|
||||
* 持一只 lv_timer 轮询发布序号(默认通道一 ui_data_rt_seq),
|
||||
* 序号变过才整页失效;新 API ui_content_page_auto_poll
|
||||
*/
|
||||
|
||||
/* 头文件包含区 */
|
||||
@@ -55,6 +58,8 @@
|
||||
|
||||
#include "ui_tokens.h"
|
||||
|
||||
#include "ui_data.h"
|
||||
|
||||
#include "lvgl.h"
|
||||
|
||||
#define DBG_TAG "[UI_CONTENT_PAGE]"
|
||||
@@ -85,6 +90,8 @@ static uint16_t s_sel; /* 列表页选中行(
|
||||
static uint8_t s_perm; /* 本次授予权限(ui_perm_t;开页时装载,关页重置) */
|
||||
static lv_obj_t *s_scr; /* 页面屏幕(进入时建、返回时毁) */
|
||||
static lv_obj_t *s_cont; /* 页面全屏容器(焦点/键入口 + 自绘载体) */
|
||||
static lv_timer_t *s_auto_timer; /* 自动失效轮询定时器(仅 auto_ms>0 的页打开期间存在;关页即销) */
|
||||
static uint32_t s_auto_seq; /* 上一拍见到的发布序号(开页时装基准,开页本身不多刷一帧) */
|
||||
|
||||
/* 容器样式:flat(透明 + 无边框/圆角/内边距)取自共享样式表 ui_style.c——
|
||||
* 与 ui_menu_view / ui_standby 共用同一 const 对象(原先三处各定义一份逐字相同
|
||||
@@ -469,6 +476,42 @@ static void cp_key_cb(lv_event_t *e) {
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:自动刷新轮询一拍(契约见 ui_content_page.h;判定与序号基准只在这里一份)
|
||||
* 入口参数:无
|
||||
* 返回值:无
|
||||
* 限定条件:uiTask 上下文;无页打开 / 本页未订阅(auto_ms=0)时空操作
|
||||
* 函数说明:不在此拷帧——失效后由框架重绘走页面 refresh 的 seq 门控取新帧(§5.4
|
||||
* 页面私有缓存纪律不变),框架对数据内容零感知,只认序号
|
||||
*/
|
||||
void ui_content_page_auto_poll(void) {
|
||||
const content_page_def_t *d = s_open;
|
||||
uint32_t now;
|
||||
|
||||
if (d == NULL || d->auto_ms == 0u) {
|
||||
return;
|
||||
}
|
||||
now = (d->auto_seq != NULL) ? d->auto_seq() : ui_data_rt_seq();
|
||||
if (now == s_auto_seq) {
|
||||
return; /* 数据没变:零失效(省电屏带宽纪律) */
|
||||
}
|
||||
s_auto_seq = now;
|
||||
ui_content_page_invalidate(); /* 序号变过才整页失效 */
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:自动失效轮询定时器回调(薄封装;一切判定在 ui_content_page_auto_poll)
|
||||
* 入口参数:t - 定时器对象(未用) lv_timer_t *
|
||||
* 返回值:无
|
||||
* 限定条件:lv_timer_handler 内(uiTask 上下文)——与其他 LVGL 调用同线程同串行点
|
||||
* 函数说明:standby 期间内容页对象仍在(待机盖屏不关页),此时失效后台容器只是
|
||||
* 多一次脏区合并,待机屏自身重绘节律不受影响(实测待机像素回归绿)
|
||||
*/
|
||||
static void cp_auto_timer_cb(lv_timer_t *t) {
|
||||
(void)t;
|
||||
ui_content_page_auto_poll();
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:打开指定内容页(建屏 + 切屏 + 焦点置页面容器)
|
||||
* 入口参数:desc - 页面描述符(取自 ui_page_registry_for / ui_page_registry_password)
|
||||
@@ -517,6 +560,19 @@ bool ui_content_page_open(const content_page_def_t *desc, uint8_t perm) {
|
||||
desc->init_cb(); /* 页面模块重置运行态(编辑模式/光标/保存标志等) */
|
||||
}
|
||||
|
||||
/* 自动失效轮询(实时页自动刷新):定时器随页建销,页面模块零定时器。基准取
|
||||
* "开页瞬间"的序号——开页首帧绘制本就已取过数,不该再为基线多补一次重绘;
|
||||
* 之后每拍只在序号变过时失效。创建失败(LVGL 池耗尽)只降级回"按键才重绘"
|
||||
* 旧行为并留痕,不挡开页(同 ui_w_setview 轮询定时器的降级口径)。 */
|
||||
s_auto_timer = NULL;
|
||||
if (desc->auto_ms != 0u) {
|
||||
s_auto_seq = (desc->auto_seq != NULL) ? desc->auto_seq() : ui_data_rt_seq();
|
||||
s_auto_timer = lv_timer_create(cp_auto_timer_cb, (uint32_t)desc->auto_ms, NULL);
|
||||
if (s_auto_timer == NULL) {
|
||||
DBG_ERROR("auto timer create failed (id=%s): key-only refresh fallback", desc->id);
|
||||
}
|
||||
}
|
||||
|
||||
/* 焦点/键入口:入默认输入组并获焦(先于切屏,保证按键立即由本模块接管) */
|
||||
lv_group_t *g = lv_group_get_default();
|
||||
if (g != NULL) {
|
||||
@@ -550,6 +606,13 @@ void ui_content_page_close(void) {
|
||||
|
||||
DBG_INFO("page close: id=%s", s_open->id);
|
||||
|
||||
/* 自动失效定时器随页销毁:留着它,下一拍就会去失效即将释放的 s_cont
|
||||
* (回调与关页同在 uiTask 串行点,此处删表即绝后患) */
|
||||
if (s_auto_timer != NULL) {
|
||||
lv_timer_delete(s_auto_timer);
|
||||
s_auto_timer = NULL;
|
||||
}
|
||||
|
||||
lv_obj_delete(s_cont); /* 先删容器 */
|
||||
lv_obj_delete(s_scr); /* 再删屏 */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user