ui_net_sink 拆分为协议层与平台后端,新增 RemoDispBus 设计文档

This commit is contained in:
2026-09-11 21:25:02 +08:00
parent 2429955d1a
commit d150810587
20 changed files with 1600 additions and 408 deletions
+75
View File
@@ -0,0 +1,75 @@
/*
* 模块名称: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);
}
}