1 /*
2  * Copyright (c) 2006-2021, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: MIT
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2021-10-18     Meco Man     the first version
9  * 2022-05-10     Meco Man     improve rt-thread initialization process
10  */
11 
12 #ifdef __RTTHREAD__
13 
14 #include <lvgl.h>
15 #include <rtthread.h>
16 #ifdef PKG_USING_CPU_USAGE
17 #include "cpu_usage.h"
18 #endif /* PKG_USING_CPU_USAGE */
19 
20 #define DBG_TAG    "LVGL"
21 #define DBG_LVL    DBG_INFO
22 #include <rtdbg.h>
23 
24 #ifndef PKG_LVGL_THREAD_STACK_SIZE
25     #define PKG_LVGL_THREAD_STACK_SIZE 4096
26 #endif /* PKG_LVGL_THREAD_STACK_SIZE */
27 
28 #ifndef PKG_LVGL_THREAD_PRIO
29     #define PKG_LVGL_THREAD_PRIO (RT_THREAD_PRIORITY_MAX*2/3)
30 #endif /* PKG_LVGL_THREAD_PRIO */
31 
32 #ifndef PKG_LVGL_DISP_REFR_PERIOD
33     #define PKG_LVGL_DISP_REFR_PERIOD 33
34 #endif /* PKG_LVGL_DISP_REFR_PERIOD */
35 
36 extern void lv_port_disp_init(void);
37 extern void lv_port_indev_init(void);
38 extern void lv_user_gui_init(void);
39 
40 static struct rt_thread lvgl_thread;
41 
42 #ifdef rt_align
rt_align(RT_ALIGN_SIZE)43     rt_align(RT_ALIGN_SIZE)
44 #else
45     ALIGN(RT_ALIGN_SIZE)
46 #endif
47 static rt_uint8_t lvgl_thread_stack[PKG_LVGL_THREAD_STACK_SIZE];
48 
49 #if LV_USE_LOG
50 static void lv_rt_log(lv_log_level_t level, const char * buf)
51 {
52     (void) level;
53     LOG_I(buf);
54 }
55 #endif /* LV_USE_LOG */
56 
57 #ifdef PKG_USING_CPU_USAGE
lv_timer_os_get_idle(void)58 uint32_t lv_timer_os_get_idle(void)
59 {
60     return (100 - (uint32_t)cpu_load_average());
61 }
62 #endif /* PKG_USING_CPU_USAGE */
63 
lvgl_thread_entry(void * parameter)64 static void lvgl_thread_entry(void *parameter)
65 {
66 #if LV_USE_LOG
67     lv_log_register_print_cb(lv_rt_log);
68 #endif /* LV_USE_LOG */
69     lv_init();
70     lv_tick_set_cb(&rt_tick_get_millisecond);
71     lv_port_disp_init();
72     lv_port_indev_init();
73     lv_user_gui_init();
74 
75 
76 #ifdef PKG_USING_CPU_USAGE
77     cpu_usage_init();
78 #endif /* PKG_USING_CPU_USAGE */
79 
80     /* handle the tasks of LVGL */
81     while(1)
82     {
83         lv_timer_handler();
84         rt_thread_mdelay(PKG_LVGL_DISP_REFR_PERIOD);
85     }
86 }
87 
lvgl_thread_init(void)88 static int lvgl_thread_init(void)
89 {
90     rt_err_t err;
91 
92     err = rt_thread_init(&lvgl_thread, "LVGL", lvgl_thread_entry, RT_NULL,
93            &lvgl_thread_stack[0], sizeof(lvgl_thread_stack), PKG_LVGL_THREAD_PRIO, 10);
94     if(err != RT_EOK)
95     {
96         LOG_E("Failed to create LVGL thread");
97         return -1;
98     }
99     rt_thread_startup(&lvgl_thread);
100 
101     return 0;
102 }
103 INIT_ENV_EXPORT(lvgl_thread_init);
104 
105 #endif /*__RTTHREAD__*/
106