119 lines
3.0 KiB
C
119 lines
3.0 KiB
C
#include "user_common.h"
|
|
#include "tasks/user_task_lvgl_common.h"
|
|
#include "impl/user_lvgl_impl.h"
|
|
|
|
#define PIXBUF_SIZE 320 * 20
|
|
|
|
uint8_t g_lvgl_ready = 0;
|
|
pthread_mutex_t g_lvgl_mutex = PTHREAD_MUTEX_INITIALIZER;
|
|
|
|
pthread_t user_lv_task_thread;
|
|
pthread_t user_lv_tick_thread;
|
|
|
|
static lv_disp_draw_buf_t s_disp_buf;
|
|
static lv_color_t s_pix_buf[2][PIXBUF_SIZE];
|
|
static lv_disp_drv_t s_disp_drv;
|
|
static lv_fs_drv_t s_fs_drv;
|
|
static lv_indev_drv_t s_indev_drv;
|
|
|
|
void *user_lv_task(void *arguments);
|
|
void *user_lv_tick(void *arguments);
|
|
|
|
int user_lvgl_task_init(void) {
|
|
int ret;
|
|
|
|
user_lvgl_impl_init();
|
|
|
|
USER_LOG(USER_LOG_INFO, "lv_init() called.");
|
|
|
|
pthread_mutex_lock(&g_lvgl_mutex);
|
|
|
|
lv_init();
|
|
|
|
lv_log_register_print_cb(user_lvgl_impl_log_cb);
|
|
|
|
lv_disp_draw_buf_init(&s_disp_buf, s_pix_buf[0], s_pix_buf[1], PIXBUF_SIZE);
|
|
|
|
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);
|
|
if(disp == NULL) return -2;
|
|
|
|
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();
|
|
lv_group_set_default(indev_group);
|
|
lv_indev_set_group(indev, indev_group);
|
|
|
|
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);
|
|
|
|
pthread_mutex_unlock(&g_lvgl_mutex);
|
|
|
|
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;
|
|
|
|
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;
|
|
|
|
return 0;
|
|
}
|
|
|
|
int user_lvgl_task_deinit(void) {
|
|
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.");
|
|
|
|
user_lvgl_impl_deinit();
|
|
return 0;
|
|
}
|
|
|
|
void *user_lv_task(void *arguments) {
|
|
UNUSED(arguments);
|
|
|
|
while(g_running) {
|
|
usleep(30 * 1000);
|
|
pthread_mutex_lock(&g_lvgl_mutex);
|
|
lv_timer_handler();
|
|
pthread_mutex_unlock(&g_lvgl_mutex);
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
void *user_lv_tick(void *arguments) {
|
|
UNUSED(arguments);
|
|
|
|
while(g_running) {
|
|
usleep(30 * 1000);
|
|
pthread_mutex_lock(&g_lvgl_mutex);
|
|
lv_tick_inc(30);
|
|
pthread_mutex_unlock(&g_lvgl_mutex);
|
|
}
|
|
|
|
return NULL;
|
|
}
|