/* * 模块名称: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); } }