LVGL 是现在非常火爆的嵌入式界面库,可以创建各种美观的界面和动画,这里使用昉·星光2开发板运行 LVGL 界面库
使用 git 工具克隆 lvgl 官方给出的 sdl 适配好的仓库,链接为 https://github.com/Ryzee119/lvgl-sdl.git
进入仓库的 example 目录,这时直接编译的话会报错找不到 SDL.h 文件,需要修改一下 CMakeLists.txt 文件,添加一个包含目录
include_directories(/usr/local/include/SDL2)
因为我准备运行一下 widgets 的demo,所以需要链接到 lvgl 的 demos 的静态库,所以最后一行代码需要修改为如下
target_link_libraries(lvgl_example ${SDL2_LIBRARIES} lvglsdl lvgl::lvgl lvgl::demos SDL2)
运行 demo 的话还需要修改 lv_conf.h 文件来使能 demo,修改 LV_USE_DEMO_WIDGETS 宏定义为 1
修改 main 函数,增加包含的头文件 #include "demos/lv_demos.h" ,然后在 main 函数中添加 lv_demo_widgets(); 来调用 widgets 的 demo。
运行 `cmake -Bbuild .` 命令,生成编译需要用到的文件
得到如下输出
```sh
root@starfive:~/lvgl_test/lvgl-sdl/example# cmake -Bbuild .
开始编译,运行命令 cmake --build . -j4 来编译,-j4 是为了使用多核编译来加速,因为昉星光是有四个核心的,等待许久后编译得到 lvgl_example 可执行文件,然后执行,可以看到已经显示出了,lv_didgets 的这个 demo 界面。
这个时候发现,鼠标居然不能操作??
读 lv_port_indev.c 文件发现读取鼠标的函数实现如下,这个猜测这个 pad 是 NULL 导致的,因为这个 pad 定义是 static SDL_GameController *pad = NULL; 也不知道是个什么鬼玩意,跟鼠标也没啥关系还要判断是不是 NULL,直接注释掉其中的 return; ,然后再次编译。
static void mouse_read(lv_indev_drv_t *indev_drv_gamepad, lv_indev_data_t *data)
{
if (pad == NULL)
{
}
data->state = (mouse_pressed) ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED;
if (mouse_event)
{
uint32_t buttons = SDL_GetMouseState(&mouse_x, &mouse_y);
data->point.x = mouse_x;
data->point.y = mouse_y;
data->state |= (buttons & SDL_BUTTON_LMASK) ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED;
mouse_event = false;
}
else
{
int x = SDL_GameControllerGetAxis(pad, SDL_CONTROLLER_AXIS_LEFTX);
int y = SDL_GameControllerGetAxis(pad, SDL_CONTROLLER_AXIS_LEFTY);
if (SDL_abs(x) > (MOUSE_DEADZONE * 32768) / 100)
{
mouse_x += (x * MOUSE_SENSITIVITY) / 32768;
if (mouse_x < 0)
mouse_x = 0;
if (mouse_x > 640)
mouse_x = 640;
}
if (SDL_abs(y) > (MOUSE_DEADZONE * 32768) / 100)
{
mouse_y += (y * MOUSE_SENSITIVITY) / 32768;
if (mouse_y < 0)
mouse_y = 0;
if (mouse_y > 640)
mouse_y = 640;
}
data->point.x = (int16_t)mouse_x;
data->point.y = (int16_t)mouse_y;
}
}
完美解决,现在可以读取到鼠标位置并且操作界面了
再用 SquareLine Studio 软件生成 lvgl 的码表样例到工程目录,用 git checkout 版本到 v8.3.7 然后修改 CMakeLists.txt 包含 SquareLine Studio 生成的 CMakeLists.txt,编译运行
|