f711130b4c
域5 新增 3 对文件(双端注册 uvprojx + CMakeLists),只做渲染与输入抽象、 不接真实数据源(数据绑定 = 批 2 道E ui_data/prot_set 经回调注入): - ui_w_editor:定点整数(10^decimals)逐位编辑——上下步进(0..9 环绕无进位)、 左右移数字光标(首末环绕)、ENTER 提交经 min/max 范围校验,越界拒绝并 显示"越界"提示留在编辑态;光标反显盒与 ui_page_net_cfg 字节光标同画法 (含"只画单字符防折行"实测坑注释);共享格式化 ui_w_editor_fmt_scaled() 单一规则源(值列显示与编辑光标恒同串) - ui_w_setlist:定值四视图(参数/定值/控制字/软压板)共用列表渲染 + 整定输入——行表(名称<=7字/id/类型/小数位/范围/二态串表) + 回调注入 (get/set/commit/state/bad);查看视图(commit=NULL)与整定视图只差绑定: 整定视图末行固定"保存"行,值随交接态 ENTER/WAIT/OK/ERR(net_cfg 先例), 整表一次提交(一次封存一次校验和,页面补齐规划 §3.2);二态行 ENTER 循环切换;保存失败越界行经 bad 回调反显(页面扩充详细方案 §3.2.7) - ui_page_action:可复用操作确认链——一次确认 -> 二次确认 -> ok_cb 只投递不阻塞 -> done_text 回报(或成功即关页),拒收显示 ERR 可重试; ESC/LEFT 关页取消(实测取消后菜单与基线逐字节一致);单例描述符由 开页装载(内容页框架全局单页前提),不定义 ui_page_action_desc (registration-check 页面模块判据不误拦,批 2 跳板各自出口) 组件文案用字全部落在上一分支预置字集内(font-charset WARN 60->52 印证 确/取/消/越/二/次/返/回 已转源码在用),无需再动字库。 BSP 公开 API 约定合规(首提被 cppcheck/coding-standard/bsp-err 三钩拦下, 按门禁口径修净后复验全绿): - 键分发返回值取 uint8_t 1/0 不用 bool(bsp-err/err-type:bool 只许 is_/has_ 谓词);ui_w_editor_value 直返 int32_t(出参形状无错误通道) - ui_page_action_open 返回 bsp_err_t:BSP_ERR_PARAM 参数无效 / BSP_ERR_STATE 已有页打开 / BSP_ERR_NO_SPACE 框架开页失败(可判分支) - get/state/bad 回调 typedef 各补"返回值:"注释块(bsp-err/return-doc) - cppcheck variableScope 变量收scope 7 处;CODE-RULE-18 Yoda 1 处 (sel+1u==total -> sel==count);提交内已不含 --wdemo/--wact harness 验证: - 模拟器零警告;组件行为经临时 sim-only harness(--wdemo/--wact) 截图 目检 7 态:基线视图/bad 反显/进编辑步进/越界拒绝/二态切换/保存整表 提交 OK/确认链三段/取消回菜单;harness(main.c 4 处 + CMake 1 行 + ui_w_demo.c)已完整还原删除,提交内不含(最终树 main.c 无改动, CMakeLists diff 仅 3 行注册) - 回归:菜单 8 状态 + 内容页 11 页黄金参考逐字节 PASS(ref 无变化, 无基线更新提交);池基线 5368/往返 5448 不变 - 门禁:coding-standard PASS / font-charset PASS / layer-deps PASS (新文件零 App include,基线 6 不变——减基线归 task-6) - @build 0 Error 0 Warning;Code +324 B、RO/RW/ZI 0(组件尚无引用方, ARM 链接器未剥离仅因新 TU;批 2 页面接线后实例 RAM 每页约 +40~60 B) gate: 全钩子正常执行通过,无 --no-verify - pre-commit run --all-files 全绿(含 mem-budget/mem-numbers:本分支基于 回填后台账 d9ab955,RAM 0 变化、RO 不变,仅 Code +324 B 不涉受管区) - 手工自查:6 新文件 BOM=EF BB BF 齐全、全 LF、U+FFFD=0、字面量仅 UTF-8 中文(UI 带 BOM 先例口径:保存/越界/二次确认/告警/跳闸等, 全部已在字体子集);ASCII 串仅 ENTER/WAIT/OK/ERR 状态字
152 lines
7.9 KiB
C
152 lines
7.9 KiB
C
/*
|
||
* 模块名称:UI 数值编辑共享组件(ui_w_editor)
|
||
* 模块功能:把"定点整数值(单位 = 10^decimals)的逐位编辑"收成一份可复用实现——
|
||
* 进/退编辑、按光标位 ±1 步进(上加下减)、左右移数字光标(首末环绕)、
|
||
* ENTER 提交(范围校验:越界拒绝并显示"越界"提示、留在编辑态);
|
||
* ESC 不处理(内容页框架恒拦截关页,未提交调整随之丢弃 = 取消);
|
||
* 编辑光标反显绘制与 ui_page_net_cfg 的字节光标同一画法;
|
||
* 只持渲染与输入抽象,不碰任何数据源——工作值经 ui_w_editor_value()
|
||
* 交回调用方(ui_w_setlist)统一写 RAM 副本
|
||
* 适用范围:Drivers/BSP/UI(列表页骨架几何由调用方传入,组件不自带)
|
||
* 说明:实例化使用(一个实例同一时刻只编一个值),调用方持有 ui_w_editor_t
|
||
* 实例——多个整定页各自独立实例,不跨页串态(同 ui_w_records 的
|
||
* 按实例存态教训);值一律非负(min >= 0 为使用前提,本工程定值全非负)
|
||
* 作者:王建锋
|
||
* 创建日期:2026-10-25
|
||
* 修改记录:
|
||
* v1.0 2026-10-25 王建锋 创建(并行分道方案 §5.2 道B task-5:定值整定的
|
||
* 数值编辑前置能力,规格 = 页面扩充详细方案.md §3.2.7
|
||
* 编辑交互表 + 页面补齐规划.md §3.2 能力表)
|
||
*/
|
||
#ifndef UI_W_EDITOR_H
|
||
#define UI_W_EDITOR_H
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
#include <stdbool.h>
|
||
#include <stdint.h>
|
||
|
||
#include "lvgl.h"
|
||
|
||
/* 数值编辑器实例(值用定点整数表达:单位 = 10^decimals,
|
||
* 如 10.24 A / decimals=2 -> 1024)
|
||
* 用法:调用方(页面 / ui_w_setlist)持有实例,进编辑前 begin() 载值与范围,
|
||
* 其余字段清零 = 非编辑态 */
|
||
typedef struct {
|
||
int32_t min; /* 下限(含;单位 10^decimals) */
|
||
int32_t max; /* 上限(含) */
|
||
int32_t cur; /* 工作值(编辑中实时变;未提交不回写数据源) */
|
||
uint8_t decimals; /* 小数位数 0..3 */
|
||
uint8_t editing; /* 1 = 编辑中 */
|
||
uint8_t bad; /* 1 = 上次 ENTER 越界被拒("越界"提示亮,下一次编辑键清除) */
|
||
uint8_t digit; /* 数字光标:第几个十进制数字字符(0 = 最高位) */
|
||
uint8_t ndigits; /* 当前值串的数字字符数(begin/步进时重算) */
|
||
} ui_w_editor_t;
|
||
|
||
/*
|
||
* 函数功能:进入编辑(载入初始值与范围,光标落在个位)
|
||
* 入口参数:inst - 编辑器实例 ui_w_editor_t *
|
||
* value - 初始值(单位 10^decimals) int32_t
|
||
* min_v - 下限(含;>= 0) int32_t
|
||
* max_v - 上限(含) int32_t
|
||
* decimals - 小数位数 0..3 uint8_t
|
||
* 返回值:无
|
||
* 限定条件:非编辑态调用;编辑中重复调用 = 先复位再进新值的编辑
|
||
*/
|
||
void ui_w_editor_begin(ui_w_editor_t *a_inst, int32_t a_value,
|
||
int32_t a_min_v, int32_t a_max_v, uint8_t a_decimals);
|
||
|
||
/*
|
||
* 函数功能:复位实例(清除编辑态与提示;页面 init_cb 开页时调用)
|
||
* 入口参数:inst - 编辑器实例 ui_w_editor_t *
|
||
* 返回值:无
|
||
* 限定条件:无
|
||
*/
|
||
void ui_w_editor_reset(ui_w_editor_t *a_inst);
|
||
|
||
/*
|
||
* 函数功能:查询是否处于编辑态
|
||
* 入口参数:inst - 编辑器实例 const ui_w_editor_t *
|
||
* 返回值:true = 编辑中 bool
|
||
* 限定条件:inst 非空(空按非编辑态处理)
|
||
*/
|
||
bool ui_w_editor_is_editing(const ui_w_editor_t *a_inst);
|
||
|
||
/*
|
||
* 函数功能:编辑态按键处理
|
||
* 入口参数:inst - 编辑器实例 ui_w_editor_t *
|
||
* key - LVGL 键值 lv_key_t
|
||
* 返回值:1 = 已消费(上下步进 / 左右移光标 / ENTER 提交或拒绝);
|
||
* 0 = 未消费(非编辑态调用,或方向键与 ENTER 之外的键)
|
||
* (键分发标志非错误通道,取 uint8_t 不用 bool——BSP 公开
|
||
* API 约定,见 bsp-err/err-type)
|
||
* 限定条件:非编辑态调用本函数恒返回 false(编辑态把守由调用方负责)
|
||
* 函数说明:1. 上下:当前光标位数字 +1/-1(0 与 9 环绕、无进位——越界由 ENTER 把关)
|
||
* 2. 左右:数字光标首末环绕
|
||
* 3. ENTER:范围校验通过 -> 退出编辑(提交值经 ui_w_editor_value 取回,
|
||
* 写回 RAM 副本由调用方负责);越界 -> 拒绝退出、置"越界"提示,
|
||
* 下一次任意编辑键先清提示
|
||
* 4. ESC 不到达本函数(内容页框架恒拦截关页 = 取消本次编辑,
|
||
* 工作值随 begin 丢弃,不落任何数据源)
|
||
*/
|
||
uint8_t ui_w_editor_key(ui_w_editor_t *a_inst, lv_key_t a_key);
|
||
|
||
/*
|
||
* 函数功能:取工作值
|
||
* 入口参数:inst - 编辑器实例 const ui_w_editor_t *
|
||
* 返回值:当前工作值(单位 10^decimals;inst 为空返回 0——直返数值形态,
|
||
* 无错误通道) int32_t
|
||
* 限定条件:编辑中与提交后均可取(提交判定 = 调用方观察 is_editing 变 false)
|
||
*/
|
||
int32_t ui_w_editor_value(const ui_w_editor_t *a_inst);
|
||
|
||
/*
|
||
* 函数功能:把当前工作值格式化为显示串("10.24" / "500")
|
||
* 入口参数:inst - 编辑器实例 const ui_w_editor_t *
|
||
* buf - 输出缓冲(建议 >= UI_BUF_STRLEN) char *
|
||
* len - 缓冲长度(含 NUL) uint32_t
|
||
* 返回值:无
|
||
* 限定条件:buf 非空;decimals <= 3
|
||
* 函数说明:与内部绘制共用同一格式化口径(刷新值列与光标定位同串一致)
|
||
*/
|
||
void ui_w_editor_format(const ui_w_editor_t *a_inst, char *a_buf, uint32_t a_len);
|
||
|
||
/*
|
||
* 函数功能:把任意定点整数值格式化为显示串(共享格式化单一规则源:
|
||
* 组件内部 ed_format 与本函数同一实现,值列显示与编辑光标天然同串)
|
||
* 入口参数:value - 定点值(单位 10^decimals;非负) int32_t
|
||
* decimals - 小数位数 0..3 uint8_t
|
||
* buf - 输出缓冲 char *
|
||
* len - 缓冲长度(含 NUL) uint32_t
|
||
* 返回值:无
|
||
* 限定条件:buf 非空
|
||
*/
|
||
void ui_w_editor_fmt_scaled(int32_t a_value, uint8_t a_decimals, char *a_buf, uint32_t a_len);
|
||
|
||
/*
|
||
* 函数功能:编辑态自绘(数字光标反显盒 + "越界"提示),在框架内置区块之后调用
|
||
* 入口参数:inst - 编辑器实例 ui_w_editor_t *
|
||
* layer - 绘制层 lv_layer_t *
|
||
* clip - 重绘区 const lv_area_t *
|
||
* row_top - 被编辑行行槽顶 y(调用方按列表骨架 + 当前页窗口换算) int32_t
|
||
* text_dy - 行文本垂直偏移(= 描述符 text_dy,通常 0) int32_t
|
||
* band_h - 选中白带高(反显盒高沿用,= 描述符 band_h) int32_t
|
||
* value_x - 值列 x(= 描述符 right_x) int32_t
|
||
* 返回值:无
|
||
* 限定条件:编辑中才绘制(非编辑态空操作);被编辑行在当前页窗口内由调用方保证
|
||
* 函数说明:1bpp 极性:反显 = 白底(UI_COL_SEL_BG)盒 + 黑字(UI_COL_SEL_FG)
|
||
* 重画光标位单字符(与 ui_page_net_cfg 编辑光标同法,含 culling;
|
||
* 只画单字符:整串传入会被 LVGL 按盒宽折行溢出到邻行——net_cfg 实测坑)
|
||
*/
|
||
void ui_w_editor_draw(ui_w_editor_t *a_inst, lv_layer_t *a_layer,
|
||
const lv_area_t *a_clip, int32_t a_row_top,
|
||
int32_t a_text_dy, int32_t a_band_h, int32_t a_value_x);
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
#endif /* UI_W_EDITOR_H */
|