diff --git a/lib/gui/lvgl/Kconfig.graphical b/lib/gui/lvgl/Kconfig.graphical index 72c32bf5426..fc5e352da8b 100644 --- a/lib/gui/lvgl/Kconfig.graphical +++ b/lib/gui/lvgl/Kconfig.graphical @@ -112,12 +112,6 @@ config LVGL_ANTIALIAS help Enable anti-aliasing -config LVGL_DISP_DEF_REFR_PERIOD - int "Screen refresh period" - default 30 - help - Screen refresh period in milliseconds - config LVGL_DPI int "DPI" default 130 diff --git a/lib/gui/lvgl/Kconfig.input b/lib/gui/lvgl/Kconfig.input index 6a1da9acb46..41ca02100a2 100644 --- a/lib/gui/lvgl/Kconfig.input +++ b/lib/gui/lvgl/Kconfig.input @@ -44,49 +44,4 @@ config LVGL_POINTER_KSCAN_INVERT_Y endif # LVGL_POINTER_KSCAN -config LVGL_INDEV_DEF_READ_PERIOD - int "Input device refresh period" - default 30 - help - Refresh period for input devices in milliseconds - -config LVGL_INDEV_DEF_DRAG_LIMIT - int "Drag Threshold" - default 10 - help - Threshold in pixels before entering drag mode - -config LVGL_INDEV_DEF_DRAG_THROW - int "Drag throw slow-down" - default 10 - range 0 100 - help - Percentage of slow down of a throw following a drag. - Greater percentage means faster slow-down. - -config LVGL_INDEV_DEF_LONG_PRESS_TIME - int "Long press time" - default 400 - help - Period in milliseconds before a press is seen as a long press - -config LVGL_INDEV_DEF_LONG_PRESS_REP_TIME - int "Long press repeat time" - default 100 - help - Period in milliseconds after which a new trigger is generated - for a long press - -config LVGL_INDEV_DEF_GESTURE_LIMIT - int "Gesture threshold" - default 50 - help - Gesture threshold in pixels - -config LVGL_INDEV_DEF_GESTURE_MIN_VELOCITY - int "Gesture minimum velocity" - default 3 - help - Gesture min velocity at release before swipe (pixels) - endmenu diff --git a/lib/gui/lvgl/Kconfig.objects b/lib/gui/lvgl/Kconfig.objects index 2e5c62d8192..097cb0dc5cc 100644 --- a/lib/gui/lvgl/Kconfig.objects +++ b/lib/gui/lvgl/Kconfig.objects @@ -138,23 +138,11 @@ config LVGL_USE_LABEL if LVGL_USE_LABEL -config LVGL_LABEL_DEF_SCROLL_SPEED - int "Label scroll speed" - default 25 - help - Scroll speed in pixels per second if scroll mode is enabled for a label - config LVGL_LABEL_TEXT_SEL bool "Enable label text selection" help Enable label text selection -config LVGL_LABEL_WAIT_CHAR_COUNT - int "Waiting period for label animation" - default 3 - help - Waiting period at beginning/end of the label animation cycle - config LVGL_LABEL_LONG_TXT_HINT bool "Enable long text hint for labels" help diff --git a/lib/gui/lvgl/lv_conf.h b/lib/gui/lvgl/lv_conf.h index 7631b08c951..9919c03c3d4 100644 --- a/lib/gui/lvgl/lv_conf.h +++ b/lib/gui/lvgl/lv_conf.h @@ -49,8 +49,6 @@ #define LV_ANTIALIAS IS_ENABLED(CONFIG_LVGL_ANTIALIAS) -#define LV_DISP_DEF_REFR_PERIOD CONFIG_LVGL_DISP_DEF_REFR_PERIOD - #define LV_DPI CONFIG_LVGL_DPI #define LV_DISP_SMALL_LIMIT CONFIG_LVGL_DISP_SMALL_LIMIT @@ -69,34 +67,20 @@ typedef short lv_coord_t; #define LV_MEM_CUSTOM_INCLUDE "stdlib.h" #define LV_MEM_CUSTOM_ALLOC malloc +#define LV_MEM_CUSTOM_REALLOC realloc #define LV_MEM_CUSTOM_FREE free #else #define LV_MEM_CUSTOM_INCLUDE "lvgl_mem.h" #define LV_MEM_CUSTOM_ALLOC lvgl_malloc +#define LV_MEM_CUSTOM_REALLOC lvgl_realloc #define LV_MEM_CUSTOM_FREE lvgl_free #endif #define LV_ENABLE_GC 0 -/* Input device settings */ - -#define LV_INDEV_DEF_READ_PERIOD CONFIG_LVGL_INDEV_DEF_READ_PERIOD - -#define LV_INDEV_DEF_DRAG_LIMIT CONFIG_LVGL_INDEV_DEF_DRAG_LIMIT - -#define LV_INDEV_DEF_DRAG_THROW CONFIG_LVGL_INDEV_DEF_DRAG_THROW - -#define LV_INDEV_DEF_LONG_PRESS_TIME CONFIG_LVGL_INDEV_DEF_LONG_PRESS_TIME - -#define LV_INDEV_DEF_LONG_PRESS_REP_TIME CONFIG_LVGL_INDEV_DEF_LONG_PRESS_REP_TIME - -#define LV_INDEV_DEF_GESTURE_LIMIT CONFIG_LVGL_INDEV_DEF_GESTURE_LIMIT - -#define LV_INDEV_DEF_GESTURE_MIN_VELOCITY CONFIG_LVGL_INDEV_DEF_GESTURE_MIN_VELOCITY - /* Feature usage */ #define LV_USE_ANIMATION IS_ENABLED(CONFIG_LVGL_USE_ANIMATION) @@ -695,11 +679,11 @@ typedef void *lv_font_user_data_t; #if LV_USE_BIDI #ifdef CONFIG_LVGL_BIDI_DIR_LTR -#define LV_BIDI_BASE_DIR_DEF LV_BIDI_DIR_LTR +#define LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_LTR #elif defined(CONFIG_LVGL_BIDI_DIR_RTL) -#define LV_BIDI_BASE_DIR_DEF LV_BIDI_DIR_RTL +#define LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_RTL #else -#define LV_BIDI_BASE_DIR_DEF LV_BIDI_DIR_AUTO +#define LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_AUTO #endif #endif @@ -776,9 +760,6 @@ typedef void *lv_obj_user_data_t; #define LV_USE_LABEL IS_ENABLED(CONFIG_LVGL_USE_LABEL) #if LV_USE_LABEL -#define LV_LABEL_DEF_SCROLL_SPEED CONFIG_LVGL_LABEL_DEF_SCROLL_SPEED -#define LV_LABEL_WAIT_CHAR_COUNT \ - CONFIG_LVGL_LABEL_WAIT_CHAR_COUNT #define LV_LABEL_TEXT_SEL IS_ENABLED(CONFIG_LVGL_LABEL_TEXT_SEL) #define LV_LABEL_LONG_TXT_HINT IS_ENABLED(CONFIG_LVGL_LABEL_LONG_TXT_HINT) #endif diff --git a/lib/gui/lvgl/lvgl.c b/lib/gui/lvgl/lvgl.c index 06bc45ccc35..2014e7ace93 100644 --- a/lib/gui/lvgl/lvgl.c +++ b/lib/gui/lvgl/lvgl.c @@ -20,9 +20,14 @@ #include LOG_MODULE_REGISTER(lvgl); +static lv_disp_drv_t disp_drv; +#ifdef CONFIG_LVGL_POINTER_KSCAN +static lv_indev_drv_t indev_drv; +#endif /* CONFIG_LVGL_POINTER_KSCAN */ + #ifdef CONFIG_LVGL_BUFFER_ALLOC_STATIC -static lv_disp_buf_t disp_buf; +static lv_disp_draw_buf_t disp_buf; #define BUFFER_SIZE (CONFIG_LVGL_BITS_PER_PIXEL * ((CONFIG_LVGL_VDB_SIZE * \ CONFIG_LVGL_HOR_RES_MAX * CONFIG_LVGL_VER_RES_MAX) / 100) / 8) @@ -41,43 +46,34 @@ static uint8_t buf1[BUFFER_SIZE] __aligned(4); #endif /* CONFIG_LVGL_BUFFER_ALLOC_STATIC */ #if CONFIG_LVGL_LOG_LEVEL != 0 -static void lvgl_log(lv_log_level_t level, const char *file, uint32_t line, - const char *func, const char *dsc) +/* + * In LVGLv8 the signature of the logging callback has changes and it no longer + * takes the log level as an integer argument. Instead, the log level is now + * already part of the buffer passed to the logging callback. It's not optimal + * but we need to live with it and parse the buffer manually to determine the + * level and then truncate the string we actually pass to the logging framework. + */ +static void lvgl_log(const char *buf) { - /* Convert LVGL log level to Zephyr log level + /* + * This is ugly and should be done in a loop or something but as it + * turned out, Z_LOG()'s first argument (that specifies the log level) + * cannot be an l-value... * - * LVGL log level mapping: - * * LV_LOG_LEVEL_TRACE 0 - * * LV_LOG_LEVEL_INFO 1 - * * LV_LOG_LEVEL_WARN 2 - * * LV_LOG_LEVEL_ERROR 3 - * * LV_LOG_LEVEL_NUM 4 - * - * Zephyr log level mapping: - * * LOG_LEVEL_NONE 0 - * * LOG_LEVEL_ERR 1 - * * LOG_LEVEL_WRN 2 - * * LOG_LEVEL_INF 3 - * * LOG_LEVEL_DBG 4 + * We also assume lvgl is sane and always supplies the level string. */ - char *dupdsc = log_strdup(dsc); - - ARG_UNUSED(file); - ARG_UNUSED(line); - ARG_UNUSED(func); - - switch (level) { - case LV_LOG_LEVEL_TRACE: - Z_LOG(LOG_LEVEL_DBG, "%s", dupdsc); + switch (buf[1]) { + case 'E': + LOG_ERR("%s", log_strdup(buf + strlen("[Error] "))); break; - case LV_LOG_LEVEL_INFO: - Z_LOG(LOG_LEVEL_INF, "%s", dupdsc); + case 'W': + LOG_WRN("%s", log_strdup(buf + strlen("Warn] "))); break; - case LV_LOG_LEVEL_WARN: - Z_LOG(LOG_LEVEL_WRN, "%s", dupdsc); + case 'I': + LOG_INF("%s", log_strdup(buf + strlen("[Info] "))); break; - case LV_LOG_LEVEL_ERROR: - Z_LOG(LOG_LEVEL_ERR, "%s", dupdsc); + case 'T': + LOG_DBG("%s", log_strdup(buf + strlen("[Trace] "))); break; } } @@ -107,11 +103,11 @@ static int lvgl_allocate_rendering_buffers(lv_disp_drv_t *disp_drv) err = -ENOTSUP; } - disp_drv->buffer = &disp_buf; + disp_drv->draw_buf = &disp_buf; #ifdef CONFIG_LVGL_DOUBLE_VDB - lv_disp_buf_init(disp_drv->buffer, &buf0, &buf1, NBR_PIXELS_IN_BUFFER); + lv_disp_draw_buf_init(disp_drv->draw_buf, &buf0, &buf1, NBR_PIXELS_IN_BUFFER); #else - lv_disp_buf_init(disp_drv->buffer, &buf0, NULL, NBR_PIXELS_IN_BUFFER); + lv_disp_draw_buf_init(disp_drv->draw_buf, &buf0, NULL, NBR_PIXELS_IN_BUFFER); #endif /* CONFIG_LVGL_DOUBLE_VDB */ return err; @@ -174,15 +170,15 @@ static int lvgl_allocate_rendering_buffers(lv_disp_drv_t *disp_drv) } #endif - disp_drv->buffer = LV_MEM_CUSTOM_ALLOC(sizeof(lv_disp_buf_t)); - if (disp_drv->buffer == NULL) { + disp_drv->draw_buf = LV_MEM_CUSTOM_ALLOC(sizeof(lv_disp_draw_buf_t)); + if (disp_drv->draw_buf == NULL) { LV_MEM_CUSTOM_FREE(buf0); LV_MEM_CUSTOM_FREE(buf1); LOG_ERR("Failed to allocate memory to store rendering buffers"); return -ENOMEM; } - lv_disp_buf_init(disp_drv->buffer, buf0, buf1, buf_nbr_pixels); + lv_disp_draw_buf_init(disp_drv->draw_buf, buf0, buf1, buf_nbr_pixels); return 0; } #endif /* CONFIG_LVGL_BUFFER_ALLOC_STATIC */ @@ -206,7 +202,7 @@ static void lvgl_pointer_kscan_callback(const struct device *dev, } } -static bool lvgl_pointer_kscan_read(lv_indev_drv_t *drv, lv_indev_data_t *data) +static void lvgl_pointer_kscan_read(lv_indev_drv_t *drv, lv_indev_data_t *data) { lv_disp_t *disp; const struct device *disp_dev; @@ -226,7 +222,7 @@ static bool lvgl_pointer_kscan_read(lv_indev_drv_t *drv, lv_indev_data_t *data) prev = curr; disp = lv_disp_get_default(); - disp_dev = disp->driver.user_data; + disp_dev = disp->driver->user_data; display_get_capabilities(disp_dev, &cap); @@ -278,7 +274,7 @@ static bool lvgl_pointer_kscan_read(lv_indev_drv_t *drv, lv_indev_data_t *data) set_and_release: *data = prev; - return k_msgq_num_used_get(&kscan_msgq) > 0; + k_msgq_num_used_get(&kscan_msgq); } static int lvgl_pointer_kscan_init(void) @@ -286,8 +282,6 @@ static int lvgl_pointer_kscan_init(void) const struct device *kscan_dev = device_get_binding(CONFIG_LVGL_POINTER_KSCAN_DEV_NAME); - lv_indev_drv_t indev_drv; - if (kscan_dev == NULL) { LOG_ERR("Keyboard scan device not found."); return -ENODEV; @@ -320,7 +314,6 @@ static int lvgl_init(const struct device *dev) const struct device *display_dev = device_get_binding(CONFIG_LVGL_DISPLAY_DEV_NAME); int err = 0; - lv_disp_drv_t disp_drv; if (display_dev == NULL) { LOG_ERR("Display device not found."); diff --git a/lib/gui/lvgl/lvgl_display.h b/lib/gui/lvgl/lvgl_display.h index cb5b267e0ef..d53c3c15964 100644 --- a/lib/gui/lvgl/lvgl_display.h +++ b/lib/gui/lvgl/lvgl_display.h @@ -14,29 +14,29 @@ extern "C" { #endif -void lvgl_flush_cb_mono(struct _disp_drv_t *disp_drv, +void lvgl_flush_cb_mono(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p); -void lvgl_flush_cb_16bit(struct _disp_drv_t *disp_drv, +void lvgl_flush_cb_16bit(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p); -void lvgl_flush_cb_24bit(struct _disp_drv_t *disp_drv, +void lvgl_flush_cb_24bit(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p); -void lvgl_flush_cb_32bit(struct _disp_drv_t *disp_drv, +void lvgl_flush_cb_32bit(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p); -void lvgl_set_px_cb_mono(struct _disp_drv_t *disp_drv, +void lvgl_set_px_cb_mono(lv_disp_drv_t *disp_drv, uint8_t *buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, lv_color_t color, lv_opa_t opa); -void lvgl_set_px_cb_16bit(struct _disp_drv_t *disp_drv, +void lvgl_set_px_cb_16bit(lv_disp_drv_t *disp_drv, uint8_t *buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, lv_color_t color, lv_opa_t opa); -void lvgl_set_px_cb_24bit(struct _disp_drv_t *disp_drv, +void lvgl_set_px_cb_24bit(lv_disp_drv_t *disp_drv, uint8_t *buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, lv_color_t color, lv_opa_t opa); -void lvgl_set_px_cb_32bit(struct _disp_drv_t *disp_drv, +void lvgl_set_px_cb_32bit(lv_disp_drv_t *disp_drv, uint8_t *buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, lv_color_t color, lv_opa_t opa); -void lvgl_rounder_cb_mono(struct _disp_drv_t *disp_drv, lv_area_t *area); +void lvgl_rounder_cb_mono(lv_disp_drv_t *disp_drv, lv_area_t *area); int set_lvgl_rendering_cb(lv_disp_drv_t *disp_drv); diff --git a/lib/gui/lvgl/lvgl_display_16bit.c b/lib/gui/lvgl/lvgl_display_16bit.c index b76b758eff9..e5f19e999d3 100644 --- a/lib/gui/lvgl/lvgl_display_16bit.c +++ b/lib/gui/lvgl/lvgl_display_16bit.c @@ -8,7 +8,7 @@ #include #include "lvgl_display.h" -void lvgl_flush_cb_16bit(struct _disp_drv_t *disp_drv, +void lvgl_flush_cb_16bit(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p) { const struct device *display_dev = (const struct device *)disp_drv->user_data; @@ -26,7 +26,7 @@ void lvgl_flush_cb_16bit(struct _disp_drv_t *disp_drv, } #ifndef CONFIG_LVGL_COLOR_DEPTH_16 -void lvgl_set_px_cb_16bit(struct _disp_drv_t *disp_drv, +void lvgl_set_px_cb_16bit(lv_disp_drv_t *disp_drv, uint8_t *buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, lv_color_t color, lv_opa_t opa) { diff --git a/lib/gui/lvgl/lvgl_display_24bit.c b/lib/gui/lvgl/lvgl_display_24bit.c index ca6c402be97..0d13c180ac2 100644 --- a/lib/gui/lvgl/lvgl_display_24bit.c +++ b/lib/gui/lvgl/lvgl_display_24bit.c @@ -8,7 +8,7 @@ #include #include "lvgl_display.h" -void lvgl_flush_cb_24bit(struct _disp_drv_t *disp_drv, +void lvgl_flush_cb_24bit(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p) { const struct device *display_dev = (const struct device *)disp_drv->user_data; @@ -25,7 +25,7 @@ void lvgl_flush_cb_24bit(struct _disp_drv_t *disp_drv, lv_disp_flush_ready(disp_drv); } -void lvgl_set_px_cb_24bit(struct _disp_drv_t *disp_drv, +void lvgl_set_px_cb_24bit(lv_disp_drv_t *disp_drv, uint8_t *buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, lv_color_t color, lv_opa_t opa) { diff --git a/lib/gui/lvgl/lvgl_display_32bit.c b/lib/gui/lvgl/lvgl_display_32bit.c index 43ec491d326..124a76f1211 100644 --- a/lib/gui/lvgl/lvgl_display_32bit.c +++ b/lib/gui/lvgl/lvgl_display_32bit.c @@ -8,7 +8,7 @@ #include #include "lvgl_display.h" -void lvgl_flush_cb_32bit(struct _disp_drv_t *disp_drv, +void lvgl_flush_cb_32bit(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p) { const struct device *display_dev = (const struct device *)disp_drv->user_data; @@ -26,7 +26,7 @@ void lvgl_flush_cb_32bit(struct _disp_drv_t *disp_drv, } #ifndef CONFIG_LVGL_COLOR_DEPTH_32 -void lvgl_set_px_cb_32bit(struct _disp_drv_t *disp_drv, +void lvgl_set_px_cb_32bit(lv_disp_drv_t *disp_drv, uint8_t *buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, lv_color_t color, lv_opa_t opa) { diff --git a/lib/gui/lvgl/lvgl_display_mono.c b/lib/gui/lvgl/lvgl_display_mono.c index cd395581c3a..ebdc6f7a8ae 100644 --- a/lib/gui/lvgl/lvgl_display_mono.c +++ b/lib/gui/lvgl/lvgl_display_mono.c @@ -8,7 +8,7 @@ #include #include "lvgl_display.h" -void lvgl_flush_cb_mono(struct _disp_drv_t *disp_drv, +void lvgl_flush_cb_mono(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p) { uint16_t w = area->x2 - area->x1 + 1; @@ -33,7 +33,7 @@ void lvgl_flush_cb_mono(struct _disp_drv_t *disp_drv, } -void lvgl_set_px_cb_mono(struct _disp_drv_t *disp_drv, +void lvgl_set_px_cb_mono(lv_disp_drv_t *disp_drv, uint8_t *buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, lv_color_t color, lv_opa_t opa) { @@ -77,7 +77,7 @@ void lvgl_set_px_cb_mono(struct _disp_drv_t *disp_drv, } } -void lvgl_rounder_cb_mono(struct _disp_drv_t *disp_drv, +void lvgl_rounder_cb_mono(lv_disp_drv_t *disp_drv, lv_area_t *area) { const struct device *display_dev = (const struct device *)disp_drv->user_data; diff --git a/lib/gui/lvgl/lvgl_fs.c b/lib/gui/lvgl/lvgl_fs.c index 22125c783f1..af405851874 100644 --- a/lib/gui/lvgl/lvgl_fs.c +++ b/lib/gui/lvgl/lvgl_fs.c @@ -7,6 +7,7 @@ #include #include #include +#include #include "lvgl_fs.h" static bool lvgl_fs_ready(struct _lv_fs_drv_t *drv) @@ -48,11 +49,12 @@ static lv_fs_res_t errno_to_lv_fs_res(int err) } } -static lv_fs_res_t lvgl_fs_open(struct _lv_fs_drv_t *drv, void *file, - const char *path, lv_fs_mode_t mode) +static void *lvgl_fs_open(struct _lv_fs_drv_t *drv, const char *path, + lv_fs_mode_t mode) { int err; int zmode = FS_O_CREATE; + void *file; /* LVGL is passing absolute paths without the root slash add it back * by decrementing the path pointer. @@ -62,8 +64,15 @@ static lv_fs_res_t lvgl_fs_open(struct _lv_fs_drv_t *drv, void *file, zmode |= (mode & LV_FS_MODE_WR) ? FS_O_WRITE : 0; zmode |= (mode & LV_FS_MODE_RD) ? FS_O_READ : 0; + file = malloc(sizeof(struct fs_file_t)); + if (!file) + return NULL; + err = fs_open((struct fs_file_t *)file, path, zmode); - return errno_to_lv_fs_res(err); + if (err) + return NULL; + + return file; } static lv_fs_res_t lvgl_fs_close(struct _lv_fs_drv_t *drv, void *file) @@ -74,19 +83,6 @@ static lv_fs_res_t lvgl_fs_close(struct _lv_fs_drv_t *drv, void *file) return errno_to_lv_fs_res(err); } -static lv_fs_res_t lvgl_fs_remove(struct _lv_fs_drv_t *drv, const char *path) -{ - int err; - - /* LVGL is passing absolute paths without the root slash add it back - * by decrementing the path pointer. - */ - path--; - - err = fs_unlink(path); - return errno_to_lv_fs_res(err); -} - static lv_fs_res_t lvgl_fs_read(struct _lv_fs_drv_t *drv, void *file, void *buf, uint32_t btr, uint32_t *br) { @@ -128,7 +124,8 @@ static lv_fs_res_t lvgl_fs_write(struct _lv_fs_drv_t *drv, void *file, return errno_to_lv_fs_res(err); } -static lv_fs_res_t lvgl_fs_seek(struct _lv_fs_drv_t *drv, void *file, uint32_t pos) +static lv_fs_res_t lvgl_fs_seek(struct _lv_fs_drv_t *drv, void *file, + uint32_t pos, lv_fs_whence_t whence) { int err; @@ -143,70 +140,9 @@ static lv_fs_res_t lvgl_fs_tell(struct _lv_fs_drv_t *drv, void *file, return LV_FS_RES_OK; } -static lv_fs_res_t lvgl_fs_trunc(struct _lv_fs_drv_t *drv, void *file) -{ - int err; - off_t length; - - length = fs_tell((struct fs_file_t *) file); - ++length; - err = fs_truncate((struct fs_file_t *)file, length); - return errno_to_lv_fs_res(err); -} - -static lv_fs_res_t lvgl_fs_size(struct _lv_fs_drv_t *drv, void *file, - uint32_t *fsize) -{ - int err; - off_t org_pos; - - /* LVGL does not provided path but pointer to file struct as such - * we can not use fs_stat, instead use a combination of fs_tell and - * fs_seek to get the files size. - */ - - org_pos = fs_tell((struct fs_file_t *) file); - - err = fs_seek((struct fs_file_t *) file, 0, FS_SEEK_END); - if (err != 0) { - *fsize = 0U; - return errno_to_lv_fs_res(err); - } - - *fsize = fs_tell((struct fs_file_t *) file) + 1; - - err = fs_seek((struct fs_file_t *) file, org_pos, FS_SEEK_SET); - - return errno_to_lv_fs_res(err); -} - -static lv_fs_res_t lvgl_fs_rename(struct _lv_fs_drv_t *drv, const char *from, - const char *to) -{ - int err; - - /* LVGL is passing absolute paths without the root slash add it back - * by decrementing the path pointer. - */ - from--; - to--; - - err = fs_rename(from, to); - return errno_to_lv_fs_res(err); -} - -static lv_fs_res_t lvgl_fs_free(struct _lv_fs_drv_t *drv, uint32_t *total_p, - uint32_t *free_p) -{ - /* We have no easy way of telling the total file system size. - * Zephyr can only return this information per mount point. - */ - return LV_FS_RES_NOT_IMP; -} - -static lv_fs_res_t lvgl_fs_dir_open(struct _lv_fs_drv_t *drv, void *dir, - const char *path) +static void *lvgl_fs_dir_open(struct _lv_fs_drv_t *drv, const char *path) { + void *dir; int err; /* LVGL is passing absolute paths without the root slash add it back @@ -214,9 +150,16 @@ static lv_fs_res_t lvgl_fs_dir_open(struct _lv_fs_drv_t *drv, void *dir, */ path--; + dir = malloc(sizeof(struct fs_dir_t)); + if (!dir) + return NULL; + fs_dir_t_init((struct fs_dir_t *)dir); err = fs_opendir((struct fs_dir_t *)dir, path); - return errno_to_lv_fs_res(err); + if (err) + return NULL; + + return dir; } static lv_fs_res_t lvgl_fs_dir_read(struct _lv_fs_drv_t *drv, void *dir, @@ -233,16 +176,16 @@ static lv_fs_res_t lvgl_fs_dir_close(struct _lv_fs_drv_t *drv, void *dir) int err; err = fs_closedir((struct fs_dir_t *)dir); + free(dir); return errno_to_lv_fs_res(err); } +static lv_fs_drv_t fs_drv; + void lvgl_fs_init(void) { - lv_fs_drv_t fs_drv; lv_fs_drv_init(&fs_drv); - fs_drv.file_size = sizeof(struct fs_file_t); - fs_drv.rddir_size = sizeof(struct fs_dir_t); /* LVGL uses letter based mount points, just pass the root slash as a * letter. Note that LVGL will remove the drive letter, or in this case * the root slash, from the path passed via the FS callbacks. @@ -254,15 +197,10 @@ void lvgl_fs_init(void) fs_drv.open_cb = lvgl_fs_open; fs_drv.close_cb = lvgl_fs_close; - fs_drv.remove_cb = lvgl_fs_remove; fs_drv.read_cb = lvgl_fs_read; fs_drv.write_cb = lvgl_fs_write; fs_drv.seek_cb = lvgl_fs_seek; fs_drv.tell_cb = lvgl_fs_tell; - fs_drv.trunc_cb = lvgl_fs_trunc; - fs_drv.size_cb = lvgl_fs_size; - fs_drv.rename_cb = lvgl_fs_rename; - fs_drv.free_space_cb = lvgl_fs_free; fs_drv.dir_open_cb = lvgl_fs_dir_open; fs_drv.dir_read_cb = lvgl_fs_dir_read; diff --git a/samples/subsys/display/lvgl/src/main.c b/samples/subsys/display/lvgl/src/main.c index 6ce5749bd51..0b50e3b62be 100644 --- a/samples/subsys/display/lvgl/src/main.c +++ b/samples/subsys/display/lvgl/src/main.c @@ -32,19 +32,18 @@ void main(void) if (IS_ENABLED(CONFIG_LVGL_POINTER_KSCAN)) { lv_obj_t *hello_world_button; - hello_world_button = lv_btn_create(lv_scr_act(), NULL); - lv_obj_align(hello_world_button, NULL, LV_ALIGN_CENTER, 0, 0); - lv_btn_set_fit(hello_world_button, LV_FIT_TIGHT); - hello_world_label = lv_label_create(hello_world_button, NULL); + hello_world_button = lv_btn_create(lv_scr_act()); + lv_obj_align(hello_world_button, LV_ALIGN_CENTER, 0, 0); + hello_world_label = lv_label_create(hello_world_button); } else { - hello_world_label = lv_label_create(lv_scr_act(), NULL); + hello_world_label = lv_label_create(lv_scr_act()); } lv_label_set_text(hello_world_label, "Hello world!"); - lv_obj_align(hello_world_label, NULL, LV_ALIGN_CENTER, 0, 0); + lv_obj_align(hello_world_label, LV_ALIGN_CENTER, 0, 0); - count_label = lv_label_create(lv_scr_act(), NULL); - lv_obj_align(count_label, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, 0); + count_label = lv_label_create(lv_scr_act()); + lv_obj_align(count_label, LV_ALIGN_BOTTOM_MID, 0, 0); lv_task_handler(); display_blanking_off(display_dev); diff --git a/tests/lib/gui/lvgl/prj.conf b/tests/lib/gui/lvgl/prj.conf index 63723a3f288..4d3eb12e5ec 100644 --- a/tests/lib/gui/lvgl/prj.conf +++ b/tests/lib/gui/lvgl/prj.conf @@ -14,7 +14,7 @@ CONFIG_FILE_SYSTEM_LITTLEFS=y CONFIG_LVGL=y # Make sure that the rendering task is always executed if we call # lv_task_handler by setting the refresh period to zero -CONFIG_LVGL_DISP_DEF_REFR_PERIOD=0 +CONFIG_LVGL_MEM_POOL_NUMBER_BLOCKS=8 CONFIG_LVGL_COLOR_SCREEN_TRANSP=y CONFIG_LVGL_ANTIALIAS=y CONFIG_LVGL_USE_ANIMATION=y diff --git a/tests/lib/gui/lvgl/src/main.c b/tests/lib/gui/lvgl/src/main.c index e176b836516..b4c9a9ed014 100644 --- a/tests/lib/gui/lvgl/src/main.c +++ b/tests/lib/gui/lvgl/src/main.c @@ -36,7 +36,7 @@ void test_add_delete_screen(void) zassert_not_null(default_screen, "No default screen"); - lv_obj_t *new_screen = lv_obj_create(NULL, NULL); + lv_obj_t *new_screen = lv_obj_create(NULL); zassert_not_null(new_screen, "Failed to create new screen"); @@ -61,12 +61,12 @@ void test_add_delete_screen(void) } void test_add_img(void) { - lv_obj_t *img = lv_img_create(lv_scr_act(), NULL); + lv_obj_t *img = lv_img_create(lv_scr_act()); zassert_not_null(img, "Failed to create image"); lv_img_set_src(img, IMG_FILE_PATH); - lv_obj_align(img, NULL, LV_ALIGN_CENTER, 0, 0); + lv_obj_align(img, LV_ALIGN_CENTER, 0, 0); lv_task_handler(); } diff --git a/west.yml b/west.yml index 9cb39a37741..449dd4f2c0b 100644 --- a/west.yml +++ b/west.yml @@ -162,7 +162,7 @@ manifest: revision: 12019623bbad9eb54fe51066847a7cbd4b4eac57 path: modules/lib/loramac-node - name: lvgl - revision: 783c1f78c8e39751fe89d0883c8bce7336f55e94 + revision: aae1c11102138cf596687e662c0d54b72f72bf9b path: modules/lib/gui/lvgl - name: lz4 revision: 8e303c264fc21c2116dc612658003a22e933124d