UI 菜单初步完成

This commit is contained in:
2026-09-07 10:48:18 +08:00
parent 89462d8aa1
commit 2b41bdccb5
30 changed files with 2226 additions and 859 deletions
+40 -4
View File
@@ -12,6 +12,11 @@
* lvgl_sim.exe --screenshot shot.bin
* 走与 MCU 端一致的离屏软件渲染(ARGB8888 缓冲 + mono 主题),
* 渲染首帧后将 160x160 像素按 BGRA 顺序写入 shot.bin(102400 字节),随即退出。
*
* 键序截图模式(无窗口 + 注入按键序列后截图,用于级联菜单无头回归):
* lvgl_sim.exe --keys <seq> shot.bin
* seq 字符:u=↑ d=↓ l=← r=→ e=Enter s=Esc(其余字符忽略)
* 每键经 lv_group_send_data 注入(与 keypad 输入设备同路径),驱动 5 帧后取快照
*/
#include <stdlib.h>
@@ -59,11 +64,28 @@ static void shot_flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t *
}
/*
* @brief 无窗口离屏渲染并导出首帧像素
* @param path 输出文件(写入 160x160 BGRA 原始像素)
* 键序列字符 → LVGL 键值(非键字符返回 0 = 忽略)
*/
static uint32_t sim_map_key_char(char c)
{
switch (c) {
case 'u': return LV_KEY_UP;
case 'd': return LV_KEY_DOWN;
case 'l': return LV_KEY_LEFT;
case 'r': return LV_KEY_RIGHT;
case 'e': return LV_KEY_ENTER;
case 's': return LV_KEY_ESC;
default: return 0;
}
}
/*
* @brief 无窗口离屏渲染(可注入键序列)并导出末帧像素
* @param keys 键序列(u=上 d=下 l=左 r=右 e=确认 s=返回;空 = 不注键)
* @param path 输出文件(写入 160x160 I1 原始像素)
* @return 0 成功,非 0 失败
*/
static int run_screenshot(const char * path)
static int run_headless(const char * keys, const char * path)
{
setvbuf(stdout, NULL, _IONBF, 0);
lv_init();
@@ -96,6 +118,17 @@ static int run_screenshot(const char * path)
return 1;
}
/* 键注入:与 keypad 输入设备同路径(向焦点对象发 LV_EVENT_KEY)。
* 键处理是同步的(状态变更 + 场景更新当场完成),无需驱动帧;
* 无头模式严禁调 lv_timer_handler()/lv_refr_now()——I1+FULL 全屏刷新会进渲染死循环 */
for (const char *p = keys; *p != '\0'; p++) {
uint32_t key = sim_map_key_char(*p);
if (key == 0u) {
continue;
}
lv_group_send_data(g, key);
}
/* 用 snapshot 把整屏渲进独立 I1 draw_buf(避开 I1+FULL 的渲染死循环) */
lv_draw_buf_t *snap = lv_snapshot_take(lv_screen_active(), LV_COLOR_FORMAT_I1);
if (snap == NULL) {
@@ -130,7 +163,10 @@ int main(int argc, char **argv)
/* 截图模式:lvgl_sim.exe --screenshot <path> */
for (int i = 1; i < argc; i++) {
if (strcmp(argv[i], "--screenshot") == 0 && (i + 1) < argc) {
return run_screenshot(argv[i + 1]);
return run_headless("", argv[i + 1]);
}
if (strcmp(argv[i], "--keys") == 0 && (i + 2) < argc) {
return run_headless(argv[i + 1], argv[i + 2]);
}
}