/** * @file main * */ /********************* * INCLUDES *********************/ #define _DEFAULT_SOURCE /* needed for usleep() */ #include #include #define SDL_MAIN_HANDLED /*To fix SDL's "undefined reference to WinMain" issue*/ #include #include "lvgl/lvgl.h" #include "lvgl/examples/lv_examples.h" #include "lvgl/demos/lv_demos.h" #include "lv_drivers/sdl/sdl.h" // #include "lv_drivers/display/monitor.h" // #include "lv_drivers/indev/mouse.h" // #include "lv_drivers/indev/keyboard.h" // #include "lv_drivers/indev/mousewheel.h" /********************* * DEFINES *********************/ /********************** * TYPEDEFS **********************/ /********************** * STATIC PROTOTYPES **********************/ static void hal_init(void); static int tick_thread(void *data); /********************** * STATIC VARIABLES **********************/ /********************** * MACROS **********************/ /********************** * GLOBAL FUNCTIONS **********************/ /********************* * DEFINES *********************/ /********************** * TYPEDEFS **********************/ /********************** * VARIABLES **********************/ /********************** * STATIC PROTOTYPES **********************/ /********************** * GLOBAL FUNCTIONS **********************/ #if 0 static void user_image_demo() { lv_obj_t * img = lv_gif_create(lv_scr_act()); lv_gif_set_src(img, "A:lvgl/examples/libs/gif/bulb.gif"); lv_obj_align(img, LV_ALIGN_BOTTOM_RIGHT, -20, -20); lv_color_t bg_color = lv_palette_lighten(LV_PALETTE_LIGHT_BLUE, 5); lv_color_t fg_color = lv_palette_darken(LV_PALETTE_BLUE, 4); lv_obj_t * qr = lv_qrcode_create(lv_scr_act(), 150, fg_color, bg_color); /*Set data*/ const char * data = "https://lvgl.io"; lv_qrcode_update(qr, data, strlen(data)); lv_obj_center(qr); /*Add a border with bg_color*/ lv_obj_set_style_border_color(qr, bg_color, 0); lv_obj_set_style_border_width(qr, 5, 0); /*Create a font*/ static lv_ft_info_t info; /*FreeType uses C standard file system, so no driver letter is required.*/ info.name = "./lvgl/examples/libs/freetype/Lato-Regular.ttf"; info.weight = 24; info.style = FT_FONT_STYLE_NORMAL; info.mem = NULL; if(!lv_ft_font_init(&info)) { LV_LOG_ERROR("create failed."); } /*Create style with the new font*/ static lv_style_t style; lv_style_init(&style); lv_style_set_text_font(&style, info.font); lv_style_set_text_align(&style, LV_TEXT_ALIGN_CENTER); /*Create a label with the new style*/ lv_obj_t * label = lv_label_create(lv_scr_act()); lv_obj_add_style(label, &style, 0); lv_label_set_text(label, "Hello world\nI'm a font created with FreeType"); lv_obj_set_pos(label, 10, 10); lv_obj_t * img1 = lv_img_create(lv_scr_act()); /* Assuming a File system is attached to letter 'A' * E.g. set LV_USE_FS_STDIO 'A' in lv_conf.h */ lv_img_set_src(img1, "A:lvgl/examples/libs/png/wink.png"); lv_obj_align(img1, LV_ALIGN_LEFT_MID, 20, 0); lv_obj_t * wp; wp = lv_img_create(lv_scr_act()); /* Assuming a File system is attached to letter 'A' * E.g. set LV_USE_FS_STDIO 'A' in lv_conf.h */ lv_img_set_src(wp, "A:lvgl/examples/libs/sjpg/small_image.sjpg"); lv_obj_align(wp, LV_ALIGN_RIGHT_MID, -20, 0); lv_obj_t * img2 = lv_img_create(lv_scr_act()); /* Assuming a File system is attached to letter 'A' * E.g. set LV_USE_FS_STDIO 'A' in lv_conf.h */ lv_img_set_src(img2, "A:lvgl/examples/libs/sjpg/lv_example_jpg.jpg"); //lv_obj_center(img); lv_obj_align(img2, LV_ALIGN_TOP_RIGHT, -20, 20); lv_obj_t * img3 = lv_img_create(lv_scr_act()); /* Assuming a File system is attached to letter 'A' * E.g. set LV_USE_FS_STDIO 'A' in lv_conf.h */ #if LV_COLOR_DEPTH == 32 lv_img_set_src(img3, "A:lvgl/examples/libs/bmp/example_32bit.bmp"); #elif LV_COLOR_DEPTH == 16 lv_img_set_src(img, "A:lvgl/examples/libs/bmp/example_16bit.bmp"); #endif lv_obj_align(img3, LV_ALIGN_BOTTOM_MID, 0, -20); lv_obj_t * img4 = lv_img_create(lv_scr_act()); lv_img_set_src(img4, "A:lvgl/examples/libs/ffmpeg/ffmpeg.png"); lv_obj_align(img4, LV_ALIGN_BOTTOM_LEFT, 20, -20); lv_obj_t * player = lv_ffmpeg_player_create(lv_scr_act()); lv_ffmpeg_player_set_src(player, "./lvgl/examples/libs/ffmpeg/birds.mp4"); lv_ffmpeg_player_set_auto_restart(player, true); lv_ffmpeg_player_set_cmd(player, LV_FFMPEG_PLAYER_CMD_START); lv_obj_align(player, LV_ALIGN_TOP_MID, 0, 20); } #endif int main(int argc, char **argv) { (void)argc; /*Unused*/ (void)argv; /*Unused*/ /*Initialize LVGL*/ lv_init(); /*Initialize the HAL (display, input devices, tick) for LVGL*/ hal_init(); // lv_example_switch_1(); // lv_example_calendar_1(); // lv_example_btnmatrix_2(); // lv_example_checkbox_1(); // lv_example_colorwheel_1(); // lv_example_chart_6(); // lv_example_table_2(); // lv_example_scroll_2(); // lv_example_textarea_1(); // lv_example_msgbox_1(); // lv_example_dropdown_2(); // lv_example_btn_1(); // lv_example_scroll_1(); // lv_example_tabview_1(); // lv_example_tabview_1(); // lv_example_flex_3(); // lv_example_label_1(); lv_demo_widgets(); // lv_demo_keypad_encoder(); // lv_demo_benchmark(); // lv_demo_stress(); // lv_demo_music(); // user_image_demo(); while(1) { /* Periodically call the lv_task handler. * It could be done in a timer interrupt or an OS task too.*/ lv_timer_handler(); usleep(5 * 1000); } return 0; } /********************** * STATIC FUNCTIONS **********************/ /** * Initialize the Hardware Abstraction Layer (HAL) for the LVGL graphics * library */ static 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[MONITOR_HOR_RES * 100]; static lv_color_t buf1_2[MONITOR_HOR_RES * 100]; lv_disp_draw_buf_init(&disp_buf1, buf1_1, buf1_2, MONITOR_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 = sdl_display_flush; disp_drv.hor_res = MONITOR_HOR_RES; disp_drv.ver_res = MONITOR_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*/ // mouse_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 = sdl_mouse_read; lv_indev_t *mouse_indev = lv_indev_drv_register(&indev_drv_1); // keyboard_init(); 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); // mousewheel_init(); 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; }