#include "lvgl.h" #include "demos/lv_demos.h" #include "display/fbdev.h" #include "indev/evdev.h" #include "Log.h" #include #include #include #include #define DISP_BUF_SIZE (240 * 360) static bool LvglRuning = false; int lvgl_board_main(const unsigned int width, const unsigned int height, void (*appInit)()) { static lv_color_t *DispBuf = NULL; /*A small buffer for LittlevGL to draw the screen's content*/ int dispBufSize = width * height; if (NULL == DispBuf) { DispBuf = (lv_color_t *)malloc(sizeof(lv_color_t) * dispBufSize); if (NULL == DispBuf) { LogError("malloc failed.\n"); return -1; } } /*LittlevGL init*/ lv_init(); /*Linux frame buffer device init*/ fbdev_init(); /*Initialize a descriptor for the buffer*/ static lv_disp_draw_buf_t disp_buf; lv_disp_draw_buf_init(&disp_buf, DispBuf, NULL, dispBufSize); /*Initialize and register a display driver*/ static lv_disp_drv_t disp_drv; lv_disp_drv_init(&disp_drv); disp_drv.draw_buf = &disp_buf; disp_drv.flush_cb = fbdev_flush; disp_drv.hor_res = width; disp_drv.ver_res = height; lv_disp_drv_register(&disp_drv); // mouse start // evdev_init(); // static lv_indev_drv_t indev_drv_1; // lv_indev_drv_init(&indev_drv_1); /*Basic initialization*/ // indev_drv_1.type = LV_INDEV_TYPE_POINTER; // /*This function will be called periodically (by the library) to get the mouse position and state*/ // indev_drv_1.read_cb = evdev_read; // lv_indev_t *mouse_indev = lv_indev_drv_register(&indev_drv_1); // /*Set a cursor for the mouse*/ // LV_IMG_DECLARE(mouse_cursor_icon) // lv_obj_t * cursor_obj = lv_img_create(lv_scr_act()); /*Create an image object for the cursor */ // lv_img_set_src(cursor_obj, &mouse_cursor_icon); /*Set the image source*/ // lv_indev_set_cursor(mouse_indev, cursor_obj); /*Connect the image object to the driver*/ // mouse end /*Create a Demo*/ // lv_demo_widgets(); if (appInit) { appInit(); } /*Handle LitlevGL tasks (tickless mode)*/ LvglRuning = true; while (LvglRuning) { lv_timer_handler(); usleep(5000); } // lv_deinit(); fbdev_exit(); if (DispBuf) { free(DispBuf); DispBuf = NULL; } return 0; } int lvgl_board_exit(void) { LogInfo("lvgl_board_exit.\n"); LvglRuning = false; return 0; } /*Set in lv_conf.h as `LV_TICK_CUSTOM_SYS_TIME_EXPR`*/ uint32_t custom_tick_get(void) { static uint64_t start_ms = 0; if (start_ms == 0) { struct timeval tv_start; gettimeofday(&tv_start, NULL); start_ms = (tv_start.tv_sec * 1000000 + tv_start.tv_usec) / 1000; } struct timeval tv_now; gettimeofday(&tv_now, NULL); uint64_t now_ms; now_ms = (tv_now.tv_sec * 1000000 + tv_now.tv_usec) / 1000; uint32_t time_ms = now_ms - start_ms; return time_ms; }