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)19 int 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