1 /* 2 * Copyright (c) 2023 Fabian Blatz <fabianblatz@gmail.com> 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 */ 6 7 #include <zephyr/kernel.h> 8 #include <zephyr/drivers/display.h> 9 #include <lvgl.h> 10 #include <lvgl_mem.h> 11 #include <lvgl_zephyr.h> 12 #include <lv_demos.h> 13 #include <stdio.h> 14 15 #define LOG_LEVEL CONFIG_LOG_DEFAULT_LEVEL 16 #include <zephyr/logging/log.h> 17 LOG_MODULE_REGISTER(app); 18 main(void)19int main(void) 20 { 21 const struct device *display_dev; 22 #ifdef CONFIG_LV_Z_DEMO_RENDER_SCENE_DYNAMIC 23 k_timepoint_t next_scene_switch; 24 lv_demo_render_scene_t cur_scene = LV_DEMO_RENDER_SCENE_FILL; 25 #endif /* CONFIG_LV_Z_DEMO_RENDER_SCENE_DYNAMIC */ 26 int ret; 27 28 display_dev = DEVICE_DT_GET(DT_CHOSEN(zephyr_display)); 29 if (!device_is_ready(display_dev)) { 30 LOG_ERR("Device not ready, aborting test"); 31 return 0; 32 } 33 34 lvgl_lock(); 35 36 #if defined(CONFIG_LV_Z_DEMO_MUSIC) 37 lv_demo_music(); 38 #elif defined(CONFIG_LV_Z_DEMO_BENCHMARK) 39 lv_demo_benchmark(); 40 #elif defined(CONFIG_LV_Z_DEMO_STRESS) 41 lv_demo_stress(); 42 #elif defined(CONFIG_LV_Z_DEMO_WIDGETS) 43 lv_demo_widgets(); 44 #elif defined(CONFIG_LV_Z_DEMO_KEYPAD_AND_ENCODER) 45 lv_demo_keypad_encoder(); 46 #elif defined(CONFIG_LV_Z_DEMO_RENDER) 47 48 #ifdef CONFIG_LV_Z_DEMO_RENDER_SCENE_DYNAMIC 49 lv_demo_render(cur_scene, 255); 50 next_scene_switch = 51 sys_timepoint_calc(K_SECONDS(CONFIG_LV_Z_DEMO_RENDER_DYNAMIC_SCENE_TIMEOUT)); 52 #else 53 lv_demo_render(CONFIG_LV_Z_DEMO_RENDER_SCENE_INDEX, 255); 54 #endif /* CONFIG_LV_Z_DEMO_RENDER_SCENE_DYNAMIC */ 55 56 #else 57 #error Enable one of the demos CONFIG_LV_Z_DEMO_* 58 #endif 59 60 #ifndef CONFIG_LV_Z_RUN_LVGL_ON_WORKQUEUE 61 lv_timer_handler(); 62 #endif 63 lvgl_unlock(); 64 65 ret = display_blanking_off(display_dev); 66 if (ret < 0 && ret != -ENOSYS) { 67 LOG_ERR("Failed to turn blanking off (error %d)", ret); 68 return 0; 69 } 70 71 #ifdef CONFIG_LV_Z_MEM_POOL_SYS_HEAP 72 lvgl_print_heap_info(false); 73 #else 74 printf("lvgl in malloc mode\n"); 75 #endif 76 while (1) { 77 #ifndef CONFIG_LV_Z_RUN_LVGL_ON_WORKQUEUE 78 uint32_t sleep_ms; 79 80 lvgl_lock(); 81 sleep_ms = lv_timer_handler(); 82 lvgl_unlock(); 83 84 k_msleep(MIN(sleep_ms, INT32_MAX)); 85 #else 86 /* LVGL managed by dedicated workqueue, just put an application side delay */ 87 k_msleep(10); 88 #endif 89 #ifdef CONFIG_LV_Z_DEMO_RENDER_SCENE_DYNAMIC 90 if (sys_timepoint_expired(next_scene_switch)) { 91 cur_scene = (cur_scene + 1) % LV_DEMO_RENDER_SCENE_NUM; 92 lvgl_lock(); 93 lv_demo_render(cur_scene, 255); 94 lvgl_unlock(); 95 next_scene_switch = sys_timepoint_calc( 96 K_SECONDS(CONFIG_LV_Z_DEMO_RENDER_DYNAMIC_SCENE_TIMEOUT)); 97 } 98 #endif /* CONFIG_LV_Z_DEMO_RENDER_SCENE_DYNAMIC */ 99 } 100 101 return 0; 102 } 103