84 lines
2.1 KiB
C
84 lines
2.1 KiB
C
|
|
#include <stdint.h>
|
|
#include <unistd.h>
|
|
|
|
#include "lvgl.h"
|
|
|
|
#include "st7302_impl.h"
|
|
#include "st7302_lvgl_impl.h"
|
|
|
|
#include "user_tasks.h"
|
|
|
|
extern uint8_t g_running;
|
|
|
|
pthread_mutex_t g_lvgl_mutex = PTHREAD_MUTEX_INITIALIZER;
|
|
|
|
st7302_t g_lcd = {
|
|
.user_data = NULL,
|
|
.cb = {
|
|
.write_cmd_cb = _st7302_impl_write_cmd,
|
|
.write_data_cb = _st7302_impl_write_data,
|
|
.reset_cb = _st7302_impl_reset,
|
|
.delay_cb = _st7302_impl_delay
|
|
}
|
|
};
|
|
|
|
#define LCD_BUF_SIZE (250 * 24)
|
|
|
|
lv_disp_buf_t g_lcd_disp_buf;
|
|
lv_color_t g_lcd_buf[LCD_BUF_SIZE];
|
|
|
|
int lvgl_task_init(void) {
|
|
int ret;
|
|
|
|
g_lcd.user_data = _st7302_impl_init();
|
|
if(g_lcd.user_data == NULL) return -1;
|
|
|
|
st7302_init(&g_lcd);
|
|
|
|
lv_init();
|
|
|
|
lv_disp_buf_init(&g_lcd_disp_buf, g_lcd_buf, NULL, LCD_BUF_SIZE);
|
|
|
|
lv_disp_drv_t disp_drv;
|
|
lv_disp_drv_init(&disp_drv);
|
|
disp_drv.buffer = &g_lcd_disp_buf;
|
|
disp_drv.set_px_cb = _st7302_lv_impl_set_px;
|
|
disp_drv.flush_cb = _st7302_lv_impl_flush;
|
|
disp_drv.rounder_cb = _st7302_lv_impl_rounder;
|
|
disp_drv.user_data = &g_lcd;
|
|
|
|
lv_disp_drv_register(&disp_drv);
|
|
|
|
ret = pthread_create(&lvgl_tick_thread_handle, NULL, lvgl_tick_thread, NULL);
|
|
if(ret) return ret;
|
|
ret = pthread_create(&lvgl_task_thread_handle, NULL, lvgl_task_thread, NULL);
|
|
if(ret) return ret;
|
|
ret = pthread_setname_np(lvgl_task_thread_handle, "LV_TASK");
|
|
ret = pthread_setname_np(lvgl_tick_thread_handle, "LV_TICK");
|
|
}
|
|
|
|
int lvgl_task_deinit(void) {
|
|
pthread_join(lvgl_task_thread_handle, NULL);
|
|
pthread_join(lvgl_tick_thread_handle, NULL);
|
|
}
|
|
|
|
pthread_t lvgl_tick_thread_handle;
|
|
void *lvgl_tick_thread(void *arguments) {
|
|
while(g_running) {
|
|
usleep(29 * 1000);
|
|
pthread_mutex_lock(&g_lvgl_mutex);
|
|
lv_tick_inc(30);
|
|
pthread_mutex_unlock(&g_lvgl_mutex);
|
|
}
|
|
}
|
|
|
|
pthread_t lvgl_task_thread_handle;
|
|
void *lvgl_task_thread(void *arguments) {
|
|
while(g_running) {
|
|
usleep(17 * 1000);
|
|
pthread_mutex_lock(&g_lvgl_mutex);
|
|
lv_task_handler();
|
|
pthread_mutex_unlock(&g_lvgl_mutex);
|
|
}
|
|
} |