/* * 模块名称:UI Page calib (遥测系数内容页) * 模块功能:三遥设置 → 遥测系数 叶子(#P 受密码保护)的内容页——8 行数值表, * 每页 8 行自动分页;本文件零 App include:行表现状(值/粗守域/量纲/ * 小数位)逐行来自 ui_data.h 通道五注入表,写与落盘确认全经 * ui_w_ytview 视图模型(状态机/反显/徽标在那一侧,两页共用一份)—— * 本文件只是标准骨架几何令牌接进框架的薄跳板,改一次口径两页一致 * 两态一页:123 修改权限 → 可编辑(编辑器 + 保存行 = 落盘确认);000 查看权限 * → 只读(attach 内不绑 commit → 无保存行、key_cb 整页交回框架, * 行为与"没有 key_cb"逐字等价,整定四页同一条分派纪律) * 徽标说明:只读/可编辑两态都画"未标定"(cal_blocked 经注入表现读)——徽标说的 * 是数据可信度,与本次权限无关;它**不**禁任何编辑(与定值 LOCK 分工: * LOCK 才写不进去,未标定只是"改了也不会动作",ui_w_setlist.h 三词三源) * 适用平台:STM32F407ZGTx / PC 模拟器(共用源码) * 作者:DTU 项目组 * 创建日期:2026-10-27 * 修改记录: * v1.0 2026-10-27 DTU 项目组 创建(道F task-7;判据 docs/任务规划/UI补齐.md * §2 第 4 行「改死区能改变 104 上送门限 / 改 k 后 * 页面值按比例变化 / 只走既有落盘链不加第二真源」) */ /* 头文件包含区 */ #include "ui_page_calib.h" #include "ui_tokens.h" #include "ui_w_setlist.h" #include "ui_w_ytview.h" /* 静态变量定义区 */ /* 本页定值表实例(组件状态独占一份,勿跨页共用——ui_w_setlist 实例化约定) */ static ui_w_setlist_t s_sl; /* 函数定义区 */ /* * 函数功能:开页绑视图(行表现状逐行现取 + 两态分派都在视图模型内;接 init_cb) * 入口参数:无 * 返回值:无 * 限定条件:框架开页链内(本次进入权限已装载,时序依据见 ui_page_view_param.c * 同位置注释:框架先装权限再调 init_cb) */ static void pg_init(void) { ui_w_ytview_attach_cal(&s_sl); } /* * 函数功能:总行数(数据行现给 + 可编辑态才有保存行;接 count_cb) * 入口参数:无 * 返回值:总行数 uint16_t * 限定条件:框架绘制/翻页链内 */ static uint16_t pg_count(void) { return ui_w_setlist_count(&s_sl); } /* * 函数功能:逐行取数(接 refresh;行现状在视图模型里现取,本层无缓存) * 入口参数:a_row / a_name / a_value - 契约见 ui_content_page.h * 返回值:无 * 限定条件:框架绘制链内 */ static void pg_refresh(uint16_t a_row, char *a_name, char *a_value) { ui_w_setlist_refresh(&s_sl, a_row, a_name, a_value); } /* * 函数功能:自绘层(编辑光标反显 + 写被拒行反显 + 未标定徽标) * 入口参数:a_layer / a_clip - 契约见 ui_content_page.h * 返回值:无 * 限定条件:框架绘制链内,内置区块画完之后 */ static void pg_draw(lv_layer_t *a_layer, const lv_area_t *a_clip) { ui_w_setlist_draw(&s_sl, a_layer, a_clip); ui_w_ytview_draw_cal_badge(a_layer, a_clip); } /* * 函数功能:按键转发(接 key_cb) * 入口参数:a_key - LVGL 键值 lv_key_t * 返回值:true - 本页已消费;false - 交回框架(↑↓ 移选、← 关页) * 限定条件:描述符 edit_capable=1 + key_intercept=1(编辑中 ←→ 是移数字光标, * 必须先给页面,否则框架把 ← 当关页——整定四页同款实证) * 函数说明:第一条门 = 只读进入(未绑 commit)整页交回框架,与"本页没有 * key_cb"逐字等价(黄金参考只读态为证);其余分发规则全在组件 */ static bool pg_key(lv_key_t a_key) { if (s_sl.commit == NULL) { return false; } return (ui_w_setlist_key(&s_sl, a_key) != 0u); } /* * 页面描述符(外部链接:生成物 ui_page_registry.c 按菜单树 #page=calib 绑定引用) * 列表页骨架 + 可编辑 + ← 拦截;band_h 必须 >0(选中行黑字白底反显,同四整定页); * row_count 给静态上限(8 数据行 + 保存行),行数运行时以注入表现报为准 */ const content_page_def_t ui_page_calib_desc = { .id = "calib", .title = "遥测系数", .selectable = 1u, .edit_capable = 1u, .key_intercept = 1u, .top_y = UI_LIST_TOP, .pitch = UI_ROW_PITCH, .band_h = UI_ROW_BAND_H, .text_dy = 0, .left_x = UI_LIST_LEFT_X, .right_x = UI_LIST_RIGHT_X, .rows_per_page = UI_LIST_ROWS, .row_count = 9u, .init_cb = pg_init, .count_cb = pg_count, .refresh = pg_refresh, .draw_cb = pg_draw, .key_cb = pg_key, };