UI 菜单初步完成
This commit is contained in:
@@ -68,6 +68,8 @@ set(SIM_SOURCES
|
||||
# UI 源文件(与 MCU 端共用,直接编译)
|
||||
set(UI_SOURCES
|
||||
${UI_DIR}/ui_menu.c
|
||||
${UI_DIR}/ui_menu_view.c
|
||||
${UI_DIR}/ui_menu_tab.c
|
||||
${UI_DIR}/ui_font_cn_12.c
|
||||
)
|
||||
|
||||
|
||||
+40
-4
@@ -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]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user