c936441c83
本轮把"自研代码落在门禁之外"的口子收掉,同时落地 LVGL 特性裁剪与 L3 保护定值/元件框架。 门禁(.pre-commit-config.yaml,26 个钩子) - 新增 scripts/check_lv_conf_sync.py + 钩子 lv-conf-sync:比对两份 lv_conf.h 的**生效值**(未定义则取 lv_conf_internal.h 兜底默认), 抓 MISMATCH / LVGL 不认的宏名 / 同文件重复定义 - 顶层 exclude 删掉 simulator/:其下 21 个 tracked 文件全是本项目自研 代码,生成物(build/、SDL2/、tests/ref/、shot*)已在 .gitignore; doc-links 的 exclude 同步删除 - lv-conf-sync 的 files: 覆盖两端配置 → 只改 simulator/lv_conf.h 也触发 (pre-commit 4.x 已移除 always: true,实测只告警并跳过,无兜底开关) - 新增 prot-set-unit-test / prot-elm-unit-test 两个主机侧单测钩子 - S11(2.3.5) 判定细化:禁的是"用路径找文件",尖括号系统头带子目录 (如 <sys/stat.h>)不再误报;全仓库复核仅 2 处项目代码判定变化 模拟器代码整改(纳入钩子后暴露,全部修代码而非豁免) - cppcheck 4 处:sim_syslog.c 判空分支内解引用 p_epoch(真实 bug)、 2 处 struct tm 未初始化、1 处指针可加 const - coding-standard 61 处:44 处函数左大括号并到右括号同行、8 处补函数 注释、3 处补文件头注释块、2 处 __ 前缀保护宏改 XXX_H、2 处 sprintf 改 snprintf(写入字节数与原来完全一致) LVGL 特性裁剪(F-1/F-2/F-3) - 两端 lv_conf.h 对齐同一特性子集:删 26 个 LVGL 9.3 不存在的选项名、 3 处重复定义,10 项靠默认值隐式生效的改为显式固化 - 实测对镜像体积中性;价值在防漂移,且模拟器 golden 回归跑的正是固件 实际编译的配置 L3 软件侧 - App/algo/prot_set.* Q10 定值模型(范围校验 / 整表 all-or-nothing / 校验和封存-自检-闭锁)+ prot_elm.* 通用"滞回+定时限"元件框架 7 实例 - test/host/prot_set、test/host/prot_elm 主机侧单测;uvprojx 挂载两处 文档同步 - pre-commit使用说明:§2.8 S11 口径、§2.15 lv-conf-sync 详解、新增 §5.5 复盘(教训:exclude 只写真正不该进钩子的路径) - AGENTS.md、UI_设计架构 §1.4 第 10 条、RAM 分析、审查报告刷新与销项 验证 - @build BUILD_OK 0/0(Code=194276 RO=15872 RW=876 ZI=139892) - 模拟器重建:菜单 8 状态像素逐字节一致(池 5368 B)、11 内容页黄金参考 全过(往返 5448 B)、remo sink 0/25600 位差异、--logtest/--cfgtest PASS - 全仓库 cppcheck / coding-standard / no-mojibake --all-files 全过 - check_doc_links --all 129/0;check_mem_numbers --check 内存数字一致 - 端到端:往 simulator/lv_conf.h 注入一行漂移 → 钩子 FAIL(exit 1)
73 lines
2.6 KiB
C
73 lines
2.6 KiB
C
/*
|
||
* 模块名称:UI Network Sink Backend (模拟器实现)
|
||
* 模块功能:RemoDispBus 服务端在 PC 模拟器端的平台相关操作——
|
||
* 读回 SDL 屏幕转 1bpp(LCDMEM 数据源)与经 LVGL 注入远端按键
|
||
* 适用平台:Windows / Linux / macOS (SDL2)
|
||
* 作者:王建锋
|
||
* 创建日期:2026-09-10
|
||
* 修改记录:
|
||
* 2026-09-10 王建锋 创建初始版本(双端共用 ui_net_sink 的平台后端)
|
||
*/
|
||
#include "ui_net_sink_backend.h"
|
||
|
||
#include "ui_port.h" /* 远端按键码 UI_KEY_* 常量 */
|
||
#include "sim_port.h" /* sim_port_get_screen_mono */
|
||
#include "lvgl.h" /* lv_group_send_data / LV_KEY_* */
|
||
|
||
/*
|
||
* 函数功能:将远端按键码映射为 LVGL 按键码
|
||
* 入口参数:remo_key - 远端按键码(UI_KEY_* 之一)
|
||
* 返回值:对应 LV_KEY_* 值;无法识别返回 0
|
||
* 限定条件:无
|
||
* 函数说明:远端按键码与 LVGL 按键码一一对应
|
||
*/
|
||
static uint32_t sim_map_key(uint8_t remo_key) {
|
||
switch (remo_key) {
|
||
case UI_KEY_UP: return LV_KEY_UP;
|
||
case UI_KEY_DOWN: return LV_KEY_DOWN;
|
||
case UI_KEY_LEFT: return LV_KEY_LEFT;
|
||
case UI_KEY_RIGHT: return LV_KEY_RIGHT;
|
||
case UI_KEY_ENTER: return LV_KEY_ENTER;
|
||
case UI_KEY_ESC: return LV_KEY_ESC;
|
||
default: return 0;
|
||
}
|
||
}
|
||
|
||
/*
|
||
* 函数功能:读回 SDL 屏幕实际呈现像素并转为 1bpp 位图(LCDMEM 数据源)
|
||
* 入口参数:out - 输出缓冲(≥ UI_NET_SINK_MONO_SIZE 字节)
|
||
* out_size - out 容量(字节)
|
||
* 返回值:0 - 成功,-1 - 失败
|
||
* 限定条件:sim_port_init() 已成功;须在 SDL 所属(主循环)线程调用
|
||
* 函数说明:窗口模式显示缓冲经 I1→ARGB8888 转换,不能直读,
|
||
* 故读回屏幕像素再按红通道阈值打包 1bpp(布局与 MCU 端一致)
|
||
*/
|
||
int ui_net_sink_get_lcdmem(uint8_t *out, uint32_t out_size) {
|
||
if (out == NULL || out_size < UI_NET_SINK_MONO_SIZE) {
|
||
return -1;
|
||
}
|
||
return sim_port_get_screen_mono(out, out_size);
|
||
}
|
||
|
||
/*
|
||
* 函数功能:经 LVGL 输入组注入一个远端按键
|
||
* 入口参数:remo_key - 远端按键码(UI_KEY_* 之一)
|
||
* 返回值:无
|
||
* 限定条件:默认输入组已建立
|
||
* 函数说明:映射为 LV_KEY_* 后经 lv_group_send_data 发向焦点对象
|
||
*/
|
||
void ui_net_sink_inject_key(uint8_t remo_key) {
|
||
lv_group_t *g;
|
||
uint32_t key;
|
||
|
||
key = sim_map_key(remo_key);
|
||
if (key == 0) {
|
||
return;
|
||
}
|
||
|
||
g = lv_group_get_default();
|
||
if (g != NULL) {
|
||
lv_group_send_data(g, key);
|
||
}
|
||
}
|