SystemAgent/src/tasks/user_lvgl_task.c

119 lines
3.0 KiB
C
Raw Normal View History

#include "user_common.h"
2021-07-05 16:03:09 +00:00
#include "tasks/user_task_lvgl_common.h"
2021-03-21 16:01:12 +00:00
#include "impl/user_lvgl_impl.h"
2021-03-14 07:00:33 +00:00
2021-07-05 16:03:09 +00:00
#define PIXBUF_SIZE 320 * 20
2021-03-14 07:00:33 +00:00
uint8_t g_lvgl_ready = 0;
2021-07-05 16:03:09 +00:00
pthread_mutex_t g_lvgl_mutex = PTHREAD_MUTEX_INITIALIZER;
2021-03-14 07:00:33 +00:00
pthread_t user_lv_task_thread;
pthread_t user_lv_tick_thread;
2021-06-22 15:04:41 +00:00
static lv_disp_draw_buf_t s_disp_buf;
static lv_color_t s_pix_buf[2][PIXBUF_SIZE];
2021-06-22 15:04:41 +00:00
static lv_disp_drv_t s_disp_drv;
2021-06-22 16:44:06 +00:00
static lv_fs_drv_t s_fs_drv;
2021-06-29 18:28:58 +00:00
static lv_indev_drv_t s_indev_drv;
2021-03-14 07:00:33 +00:00
void *user_lv_task(void *arguments);
void *user_lv_tick(void *arguments);
int user_lvgl_task_init(void) {
int ret;
2021-03-21 16:01:12 +00:00
user_lvgl_impl_init();
2021-03-14 15:47:28 +00:00
USER_LOG(USER_LOG_INFO, "lv_init() called.");
2021-07-05 16:03:09 +00:00
pthread_mutex_lock(&g_lvgl_mutex);
2021-03-14 07:00:33 +00:00
lv_init();
2021-06-29 18:28:58 +00:00
lv_log_register_print_cb(user_lvgl_impl_log_cb);
2021-06-22 15:04:41 +00:00
lv_disp_draw_buf_init(&s_disp_buf, s_pix_buf[0], s_pix_buf[1], PIXBUF_SIZE);
2021-06-22 15:04:41 +00:00
lv_disp_drv_init(&s_disp_drv);
s_disp_drv.draw_buf = &s_disp_buf;
s_disp_drv.hor_res = 320;
s_disp_drv.ver_res = 240;
s_disp_drv.flush_cb = user_lvgl_impl_flush_cb;
lv_disp_t *disp = lv_disp_drv_register(&s_disp_drv);
2021-07-27 13:47:38 +00:00
if(disp == NULL) return -2;
2021-06-29 18:28:58 +00:00
lv_indev_drv_init(&s_indev_drv);
s_indev_drv.type = LV_INDEV_TYPE_KEYPAD;
s_indev_drv.read_cb = user_lvgl_impl_indev_read_cb;
lv_indev_t *indev = lv_indev_drv_register(&s_indev_drv);
lv_group_t *indev_group = lv_group_create();
2021-07-05 16:03:09 +00:00
lv_group_set_default(indev_group);
lv_indev_set_group(indev, indev_group);
2021-06-29 18:28:58 +00:00
2021-06-22 16:44:06 +00:00
lv_fs_drv_init(&s_fs_drv);
s_fs_drv.letter = 'A';
s_fs_drv.open_cb = user_lvgl_impl_fs_open_cb;
s_fs_drv.close_cb = user_lvgl_impl_fs_close_cb;
s_fs_drv.read_cb = user_lvgl_impl_fs_read_cb;
s_fs_drv.write_cb = user_lvgl_impl_fs_write_cb;
s_fs_drv.seek_cb = user_lvgl_impl_fs_seek_cb;
s_fs_drv.tell_cb = user_lvgl_impl_fs_tell_cb;
lv_fs_drv_register(&s_fs_drv);
2021-07-05 16:03:09 +00:00
pthread_mutex_unlock(&g_lvgl_mutex);
2021-03-14 07:00:33 +00:00
ret = pthread_create(&user_lv_task_thread, NULL, user_lv_task, NULL);
if(ret) return ret;
ret = pthread_create(&user_lv_tick_thread, NULL, user_lv_tick, NULL);
if(ret) return ret;
2021-03-14 15:47:28 +00:00
USER_LOG(USER_LOG_INFO, "LVGL threads created.");
pthread_setname_np(user_lv_task_thread, "LV_TASK");
pthread_setname_np(user_lv_tick_thread, "LV_TICK");
g_lvgl_ready = 1;
2021-07-25 15:22:04 +00:00
return 0;
2021-03-14 07:00:33 +00:00
}
int user_lvgl_task_deinit(void) {
2021-03-14 15:47:28 +00:00
USER_LOG(USER_LOG_INFO, "LVGL task_deinit() called.");
pthread_join(user_lv_task_thread, NULL);
pthread_join(user_lv_tick_thread, NULL);
USER_LOG(USER_LOG_INFO, "LVGL threads joined.");
2021-03-21 16:01:12 +00:00
user_lvgl_impl_deinit();
2021-03-14 07:00:33 +00:00
return 0;
}
void *user_lv_task(void *arguments) {
UNUSED(arguments);
2021-03-14 15:47:28 +00:00
2021-03-14 07:00:33 +00:00
while(g_running) {
usleep(30 * 1000);
2021-07-05 16:03:09 +00:00
pthread_mutex_lock(&g_lvgl_mutex);
2021-06-22 15:04:41 +00:00
lv_timer_handler();
2021-07-05 16:03:09 +00:00
pthread_mutex_unlock(&g_lvgl_mutex);
2021-03-14 07:00:33 +00:00
}
return NULL;
}
void *user_lv_tick(void *arguments) {
UNUSED(arguments);
2021-03-14 07:00:33 +00:00
while(g_running) {
usleep(30 * 1000);
2021-07-05 16:03:09 +00:00
pthread_mutex_lock(&g_lvgl_mutex);
2021-03-14 07:00:33 +00:00
lv_tick_inc(30);
2021-07-05 16:03:09 +00:00
pthread_mutex_unlock(&g_lvgl_mutex);
2021-03-14 07:00:33 +00:00
}
return NULL;
}