1 /*
2  * Copyright (c) 2025 Abderrahmane JARMOUNI
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 <lv_demos.h>
12 #include <stdio.h>
13 #include <lvgl_zephyr.h>
14 
15 #define LOG_LEVEL CONFIG_LOG_DEFAULT_LEVEL
16 #include <zephyr/logging/log.h>
17 LOG_MODULE_REGISTER(app);
18 
19 #if !DT_HAS_COMPAT_STATUS_OKAY(zephyr_displays)
20 #error Could not find "zephyr,displays" compatible node in DT
21 #endif
22 
23 #define ENUMERATE_DISPLAY_DEVS(n) display_dev[n] = DEVICE_DT_GET(DT_ZEPHYR_DISPLAY(n));
24 
main(void)25 int main(void)
26 {
27 	const struct device *display_dev[DT_ZEPHYR_DISPLAYS_COUNT];
28 	lv_display_t *lv_displays[DT_ZEPHYR_DISPLAYS_COUNT];
29 	lv_display_t *d = NULL;
30 
31 	/* clang-format off */
32 	FOR_EACH(ENUMERATE_DISPLAY_DEVS, (), LV_DISPLAYS_IDX_LIST);
33 	/* clang-format on */
34 
35 	for (int i = 0; i < DT_ZEPHYR_DISPLAYS_COUNT; i++) {
36 		if (!device_is_ready(display_dev[i])) {
37 			LOG_ERR("Display device %d is not ready", i);
38 			return 0;
39 		}
40 	}
41 
42 	for (int i = 0; i < DT_ZEPHYR_DISPLAYS_COUNT; i++) {
43 		d = lv_display_get_next(d);
44 		if (d == NULL) {
45 			LOG_ERR("Invalid LV display %d object", i);
46 			return 0;
47 		}
48 		lv_displays[i] = d;
49 	}
50 
51 	lv_display_set_default(lv_displays[0]);
52 #ifdef CONFIG_LV_Z_DEMO_MUSIC_FIRST_DISP
53 	lv_demo_music();
54 #elif defined(CONFIG_LV_Z_DEMO_BENCHMARK_FIRST_DISP)
55 	lv_demo_benchmark();
56 #elif defined(CONFIG_LV_Z_DEMO_STRESS_FIRST_DISP)
57 	lv_demo_stress();
58 #elif defined(CONFIG_LV_Z_DEMO_WIDGETS_FIRST_DISP)
59 	lv_demo_widgets();
60 #endif
61 
62 #if DT_ZEPHYR_DISPLAYS_COUNT > 1
63 	for (int i = 1; i < DT_ZEPHYR_DISPLAYS_COUNT; i++) {
64 		lv_display_set_default(lv_displays[i]);
65 #ifdef CONFIG_LV_Z_DEMO_MUSIC_OTHER_DISPS
66 		lv_demo_music();
67 #elif defined(CONFIG_LV_Z_DEMO_BENCHMARK_OTHER_DISPS)
68 		lv_demo_benchmark();
69 #elif defined(CONFIG_LV_Z_DEMO_STRESS_OTHER_DISPS)
70 		lv_demo_stress();
71 #elif defined(CONFIG_LV_Z_DEMO_WIDGETS_OTHER_DISPS)
72 		lv_demo_widgets();
73 #endif
74 	}
75 #endif
76 
77 	lv_timer_handler();
78 	for (int i = 0; i < DT_ZEPHYR_DISPLAYS_COUNT; i++) {
79 		display_blanking_off(display_dev[i]);
80 	}
81 
82 #ifdef CONFIG_LV_Z_MEM_POOL_SYS_HEAP
83 	lvgl_print_heap_info(false);
84 #else
85 	printf("lvgl in malloc mode\n");
86 #endif
87 	while (1) {
88 		uint32_t sleep_ms = lv_timer_handler();
89 
90 		k_msleep(MIN(sleep_ms, INT32_MAX));
91 	}
92 
93 	return 0;
94 }
95