#include "lvgl.h" #include "sdl_drivers/sdl_driver.h" /********************** * STATIC FUNCTIONS **********************/ static int tick_thread(void *data); /** * Initialize the Hardware Abstraction Layer (HAL) for the LVGL graphics * library */ void hal_init(void) { /* Use the 'monitor' driver which creates window on PC's monitor to simulate a display*/ sdl_init(); /* Tick init. * You have to call 'lv_tick_inc()' in periodically to inform LittelvGL about * how much time were elapsed Create an SDL thread to do this*/ SDL_CreateThread(tick_thread, "tick", NULL); /*Create a display buffer*/ static lv_disp_draw_buf_t disp_buf1; static lv_color_t buf1_1[SDL_HOR_RES * 100]; static lv_color_t buf1_2[SDL_HOR_RES * 100]; lv_disp_draw_buf_init(&disp_buf1, buf1_1, buf1_2, SDL_HOR_RES * 100); /*Create a display*/ static lv_disp_drv_t disp_drv; lv_disp_drv_init(&disp_drv); /*Basic initialization*/ disp_drv.draw_buf = &disp_buf1; disp_drv.flush_cb = monitor_flush; disp_drv.hor_res = SDL_HOR_RES; disp_drv.ver_res = SDL_VER_RES; disp_drv.antialiasing = 1; lv_disp_t *disp = lv_disp_drv_register(&disp_drv); lv_theme_t *th = lv_theme_default_init(disp, lv_palette_main(LV_PALETTE_BLUE), lv_palette_main(LV_PALETTE_RED), LV_THEME_DEFAULT_DARK, LV_FONT_DEFAULT); lv_disp_set_theme(disp, th); lv_group_t *g = lv_group_create(); lv_group_set_default(g); /* Add the mouse as input device * Use the 'mouse' driver which reads the PC's mouse*/ 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 = sdl_mouse_read; lv_indev_t *mouse_indev = lv_indev_drv_register(&indev_drv_1); static lv_indev_drv_t indev_drv_2; lv_indev_drv_init(&indev_drv_2); /*Basic initialization*/ indev_drv_2.type = LV_INDEV_TYPE_KEYPAD; indev_drv_2.read_cb = sdl_keyboard_read; lv_indev_t *kb_indev = lv_indev_drv_register(&indev_drv_2); lv_indev_set_group(kb_indev, g); static lv_indev_drv_t indev_drv_3; lv_indev_drv_init(&indev_drv_3); /*Basic initialization*/ indev_drv_3.type = LV_INDEV_TYPE_ENCODER; indev_drv_3.read_cb = sdl_mousewheel_read; lv_indev_t *enc_indev = lv_indev_drv_register(&indev_drv_3); lv_indev_set_group(enc_indev, g); /*Set a cursor for the mouse*/ LV_IMG_DECLARE(mouse_cursor_icon); /*Declare the image file.*/ 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*/ } /** * A task to measure the elapsed time for LVGL * @param data unused * @return never return */ static int tick_thread(void *data) { (void)data; while (1) { SDL_Delay(5); lv_tick_inc(5); /*Tell LittelvGL that 5 milliseconds were elapsed*/ } return 0; }