1
0
mirror of https://github.com/lvgl/lvgl.git synced 2025-01-28 07:03:00 +08:00

chore(nuttx): support LV_EVENT_DELETE for display/lcd/touchscreen (#4801)

Signed-off-by: YanXiaowei <yanxiaowei@xiaomi.com>
Co-authored-by: YanXiaowei <yanxiaowei@xiaomi.com>
This commit is contained in:
bjsylvia 2023-11-14 15:29:37 +08:00 committed by GitHub
parent 69d65257bb
commit bc9139e97b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 95 additions and 15 deletions

View File

@ -29,7 +29,9 @@
**********************/
static uint32_t millis(void);
static void syslog_print(lv_log_level_t level, const char * buf);
#if LV_USE_LOG
static void syslog_print(lv_log_level_t level, const char * buf);
#endif
/**********************
* STATIC VARIABLES
@ -81,7 +83,9 @@ void lv_nuttx_dsc_init(lv_nuttx_dsc_t * dsc)
void lv_nuttx_init(const lv_nuttx_dsc_t * dsc, lv_nuttx_result_t * result)
{
#if LV_USE_LOG
lv_log_register_print_cb(syslog_print);
#endif
lv_tick_set_cb(millis);
#if !LV_USE_NUTTX_CUSTOM_INIT
@ -132,6 +136,7 @@ static uint32_t millis(void)
return tick;
}
#if LV_USE_LOG
static void syslog_print(lv_log_level_t level, const char * buf)
{
static const int priority[_LV_LOG_LEVEL_NUM] = {
@ -140,5 +145,6 @@ static void syslog_print(lv_log_level_t level, const char * buf)
syslog(priority[level], "[LVGL] %s", buf);
}
#endif
#endif /*LV_USE_NUTTX*/

View File

@ -48,7 +48,8 @@ typedef struct {
static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * color_p);
static int fbdev_get_pinfo(int fd, struct fb_planeinfo_s * pinfo);
static int fbdev_init_mem2(lv_nuttx_fb_t * dsc);
static void _display_refr_timer_cb(lv_timer_t * tmr);
static void display_refr_timer_cb(lv_timer_t * tmr);
static void display_release_cb(lv_event_t * e);
/**********************
* STATIC VARIABLES
@ -75,6 +76,7 @@ lv_display_t * lv_nuttx_fbdev_create(void)
}
dsc->fd = -1;
lv_display_set_driver_data(disp, dsc);
lv_display_add_event(disp, display_release_cb, LV_EVENT_DELETE, disp);
lv_display_set_flush_cb(disp, flush_cb);
return disp;
}
@ -132,7 +134,7 @@ int lv_nuttx_fbdev_set_file(lv_display_t * disp, const char * file)
(dsc->pinfo.stride * dsc->vinfo.yres), LV_DISP_RENDER_MODE_DIRECT);
lv_display_set_user_data(disp, (void *)(uintptr_t)(dsc->fd));
lv_display_set_resolution(disp, dsc->vinfo.xres, dsc->vinfo.yres);
lv_timer_set_cb(disp->refr_timer, _display_refr_timer_cb);
lv_timer_set_cb(disp->refr_timer, display_refr_timer_cb);
LV_LOG_INFO("Resolution is set to %dx%d at %ddpi", dsc->vinfo.xres, dsc->vinfo.yres, lv_display_get_dpi(disp));
return 0;
@ -147,7 +149,7 @@ errout:
* STATIC FUNCTIONS
**********************/
static void _display_refr_timer_cb(lv_timer_t * tmr)
static void display_refr_timer_cb(lv_timer_t * tmr)
{
lv_display_t * disp = lv_timer_get_user_data(tmr);
lv_nuttx_fb_t * dsc = lv_display_get_driver_data(disp);
@ -297,4 +299,21 @@ static int fbdev_init_mem2(lv_nuttx_fb_t * dsc)
return 0;
}
static void display_release_cb(lv_event_t * e)
{
lv_display_t * disp = (lv_display_t *) lv_event_get_user_data(e);
lv_nuttx_fb_t * dsc = lv_display_get_driver_data(disp);
if(dsc) {
lv_display_set_driver_data(disp, NULL);
lv_display_set_flush_cb(disp, NULL);
if(dsc->fd >= 0) {
close(dsc->fd);
dsc->fd = -1;
}
lv_free(dsc);
}
LV_LOG_INFO("Done");
}
#endif /*LV_USE_NUTTX*/

View File

@ -49,6 +49,7 @@ static void rounder_cb(lv_event_t * e);
static void flush_cb(lv_display_t * disp, const lv_area_t * area_p,
uint8_t * color_p);
static lv_display_t * lcd_init(int fd, int hor_res, int ver_res);
static void display_release_cb(lv_event_t * e);
/**********************
* STATIC VARIABLES
@ -197,13 +198,41 @@ static lv_display_t * lcd_init(int fd, int hor_res, int ver_res)
lcd->disp = disp;
lv_display_set_draw_buffers(lcd->disp, draw_buf, draw_buf_2, buf_size, render_mode);
lv_display_set_flush_cb(lcd->disp, flush_cb);
lv_event_add(&lcd->disp->event_list, rounder_cb, LV_EVENT_INVALIDATE_AREA, lcd);
lcd->disp->driver_data = lcd;
lcd->disp->user_data = (void *)(uintptr_t)fd;
lv_display_add_event(lcd->disp, rounder_cb, LV_EVENT_INVALIDATE_AREA, lcd);
lv_display_add_event(lcd->disp, display_release_cb, LV_EVENT_DELETE, lcd->disp);
lv_display_set_driver_data(lcd->disp, lcd);
lv_display_set_user_data(lcd->disp, (void *)(uintptr_t)fd);
return lcd->disp;
}
static void display_release_cb(lv_event_t * e)
{
lv_display_t * disp = (lv_display_t *) lv_event_get_user_data(e);
lv_nuttx_lcd_t * dsc = lv_display_get_driver_data(disp);
if(dsc) {
lv_display_set_driver_data(disp, NULL);
lv_display_set_flush_cb(disp, NULL);
/* clear display buffer */
if(disp->buf_1) {
lv_free(disp->buf_1);
disp->buf_1 = NULL;
}
if(disp->buf_2) {
lv_free(disp->buf_2);
disp->buf_2 = NULL;
}
/* close device fb */
if(dsc->fd >= 0) {
close(dsc->fd);
dsc->fd = -1;
}
lv_free(dsc);
LV_LOG_INFO("Done");
}
}
#endif /*LV_USE_NUTTX_LCD*/
#endif /* LV_USE_NUTTX*/

View File

@ -112,6 +112,7 @@ void lv_nuttx_uv_deinit(void ** data)
lv_free(uv_ctx);
*data = NULL;
LV_LOG_INFO("Done");
}
/**********************
@ -162,7 +163,9 @@ static int lv_nuttx_uv_timer_init(lv_nuttx_uv_t * uv_info, lv_nuttx_uv_ctx_t * u
static void lv_nuttx_uv_timer_deinit(lv_nuttx_uv_ctx_t * uv_ctx)
{
lv_timer_handler_set_resume_cb(NULL, NULL);
uv_close((uv_handle_t *)&uv_ctx->uv_timer, NULL);
LV_LOG_INFO("Done");
}
static void lv_nuttx_uv_disp_poll_cb(uv_poll_t * handle, int status, int events)
@ -228,9 +231,12 @@ static int lv_nuttx_uv_fb_init(lv_nuttx_uv_t * uv_info, lv_nuttx_uv_fb_ctx_t * f
static void lv_nuttx_uv_fb_deinit(lv_nuttx_uv_fb_ctx_t * fb_ctx)
{
/* should remove event */
if(fb_ctx->fd > 0) {
uv_close((uv_handle_t *)&fb_ctx->fb_poll, NULL);
}
LV_LOG_INFO("Done");
}
static void lv_nuttx_uv_input_poll_cb(uv_poll_t * handle, int status, int events)
@ -289,6 +295,7 @@ static void lv_nuttx_uv_input_deinit(lv_nuttx_uv_input_ctx_t * input_ctx)
if(input_ctx->fd > 0) {
uv_close((uv_handle_t *)&input_ctx->input_poll, NULL);
}
LV_LOG_INFO("Done");
}
#endif /*LV_USE_NUTTX_LIBUV*/

View File

@ -41,6 +41,7 @@ typedef struct {
* STATIC PROTOTYPES
**********************/
static void touchscreen_read(lv_indev_t * drv, lv_indev_data_t * data);
static void touchscreen_delete_cb(lv_event_t * e);
static lv_indev_t * touchscreen_init(int fd);
/**********************
@ -119,11 +120,29 @@ static void touchscreen_read(lv_indev_t * drv, lv_indev_data_t * data)
data->state = touchscreen->last_state;
}
static void touchscreen_delete_cb(lv_event_t * e)
{
lv_indev_t * indev = (lv_indev_t *) lv_event_get_user_data(e);
lv_nuttx_touchscreen_t * touchscreen = lv_indev_get_driver_data(indev);
if(touchscreen) {
lv_indev_set_driver_data(indev, NULL);
lv_indev_set_read_cb(indev, NULL);
if(touchscreen->fd >= 0) {
close(touchscreen->fd);
touchscreen->fd = -1;
}
lv_free(touchscreen);
LV_LOG_INFO("done");
}
}
static lv_indev_t * touchscreen_init(int fd)
{
lv_nuttx_touchscreen_t * touchscreen;
touchscreen = malloc(sizeof(lv_nuttx_touchscreen_t));
lv_indev_t * indev = NULL;
touchscreen = lv_malloc_zeroed(sizeof(lv_nuttx_touchscreen_t));
if(touchscreen == NULL) {
LV_LOG_ERROR("touchscreen_s malloc failed");
return NULL;
@ -131,14 +150,14 @@ static lv_indev_t * touchscreen_init(int fd)
touchscreen->fd = fd;
touchscreen->last_state = LV_INDEV_STATE_RELEASED;
touchscreen->indev_drv = indev = lv_indev_create();
touchscreen->indev_drv = lv_indev_create();
touchscreen->indev_drv->type = LV_INDEV_TYPE_POINTER;
touchscreen->indev_drv->read_cb = touchscreen_read;
touchscreen->indev_drv->driver_data = touchscreen;
touchscreen->indev_drv->user_data = (void *)(uintptr_t)fd;
return touchscreen->indev_drv;
lv_indev_set_type(indev, LV_INDEV_TYPE_POINTER);
lv_indev_set_read_cb(indev, touchscreen_read);
lv_indev_set_driver_data(indev, touchscreen);
lv_indev_set_user_data(indev, (void *)(uintptr_t)fd);
lv_indev_add_event(indev, touchscreen_delete_cb, LV_EVENT_DELETE, indev);
return indev;
}
#endif /*LV_USE_NUTTX_TOUCHSCREEN*/