From f97beebcfa106c663f1d288467df3872e50c3e5d Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Thu, 1 Feb 2024 17:33:31 +0100 Subject: [PATCH 01/37] H7_video: wip: port to lvgl9 Rotation is not functional at the moment (a commented dummy implementation can be found in lvgl_displayFlushing) --- .../examples/LVGLDemo/LVGLDemo.ino | 4 +- .../examples/LVGLDemo/img_arduinologo.c | 6 +- .../Arduino_H7_Video/src/Arduino_H7_Video.cpp | 63 +- libraries/Arduino_H7_Video/src/dsi.cpp | 5 +- libraries/Arduino_H7_Video/src/dsi.h | 2 +- libraries/Arduino_H7_Video/src/lv_conf.h | 791 +++++++++++------- 6 files changed, 552 insertions(+), 319 deletions(-) diff --git a/libraries/Arduino_H7_Video/examples/LVGLDemo/LVGLDemo.ino b/libraries/Arduino_H7_Video/examples/LVGLDemo/LVGLDemo.ino index 44b453e6c..3267c7e74 100644 --- a/libraries/Arduino_H7_Video/examples/LVGLDemo/LVGLDemo.ino +++ b/libraries/Arduino_H7_Video/examples/LVGLDemo/LVGLDemo.ino @@ -17,7 +17,7 @@ Arduino_GigaDisplayTouch TouchDetector; /* Button click event callback */ static void btn_event_cb(lv_event_t * e) { static uint32_t cnt = 1; - lv_obj_t * btn = lv_event_get_target(e); + lv_obj_t * btn = (lv_obj_t *)lv_event_get_target(e); lv_obj_t * label = lv_obj_get_child(btn, 0); lv_label_set_text_fmt(label, "%"LV_PRIu32, cnt); cnt++; @@ -76,7 +76,7 @@ void setup() { lv_style_init(&style_radio); lv_style_set_radius(&style_radio, LV_RADIUS_CIRCLE); lv_style_init(&style_radio_chk); - lv_style_set_bg_img_src(&style_radio_chk, NULL); + lv_style_set_bg_image_src(&style_radio_chk, NULL); cb = lv_checkbox_create(obj); lv_checkbox_set_text(cb, "Lemon"); diff --git a/libraries/Arduino_H7_Video/examples/LVGLDemo/img_arduinologo.c b/libraries/Arduino_H7_Video/examples/LVGLDemo/img_arduinologo.c index 244e45576..7c5c72cdb 100644 --- a/libraries/Arduino_H7_Video/examples/LVGLDemo/img_arduinologo.c +++ b/libraries/Arduino_H7_Video/examples/LVGLDemo/img_arduinologo.c @@ -637,11 +637,9 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_IMG_ARDUI }; const lv_img_dsc_t img_arduinologo = { - .header.cf = LV_IMG_CF_TRUE_COLOR, - .header.always_zero = 0, - .header.reserved = 0, + .header.cf = LV_COLOR_FORMAT_RGB565, .header.w = 200, .header.h = 150, - .data_size = 30000 * LV_COLOR_SIZE / 8, + .data_size = 30000 * LV_COLOR_DEPTH / 8, .data = img_arduinologo_map, }; diff --git a/libraries/Arduino_H7_Video/src/Arduino_H7_Video.cpp b/libraries/Arduino_H7_Video/src/Arduino_H7_Video.cpp index 43ec72919..3526b749d 100644 --- a/libraries/Arduino_H7_Video/src/Arduino_H7_Video.cpp +++ b/libraries/Arduino_H7_Video/src/Arduino_H7_Video.cpp @@ -37,7 +37,15 @@ extern "C" { /* Private function prototypes -----------------------------------------------*/ #if __has_include ("lvgl.h") -void lvgl_displayFlushing(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p); +#include "mbed.h" +void lvgl_displayFlushing(lv_display_t * display, const lv_area_t * area, unsigned char * px_map); +static void inc_thd() { + while (1) { + lv_tick_inc(16); + delay(16); + } +} +static rtos::Thread lvgl_inc_thd; #endif /* Functions -----------------------------------------------------------------*/ @@ -85,30 +93,27 @@ int Arduino_H7_Video::begin() { lv_init(); /* Create a draw buffer */ - static lv_disp_draw_buf_t draw_buf; - static lv_color_t * buf1; - buf1 = (lv_color_t*)malloc((width() * height() / 10) * sizeof(lv_color_t)); /* Declare a buffer for 1/10 screen size */ + static lv_color_t * buf1 = (lv_color_t*)malloc((width() * height() / 10)); /* Declare a buffer for 1/10 screen size */ if (buf1 == NULL) { return 2; /* Insuff memory err */ } - lv_disp_draw_buf_init(&draw_buf, buf1, NULL, width() * height() / 10); /* Initialize the display buffer. */ + static lv_color_t * buf2 = (lv_color_t*)malloc((width() * height() / 10)); /* Declare a buffer for 1/10 screen size */ + if (buf2 == NULL) { + return 2; /* Insuff memory err */ + } - /* Initialize display features for LVGL library */ - static lv_disp_drv_t disp_drv; /* Descriptor of a display driver */ - lv_disp_drv_init(&disp_drv); /* Basic initialization */ - disp_drv.flush_cb = lvgl_displayFlushing; /* Set your driver function */ - disp_drv.draw_buf = &draw_buf; /* Assign the buffer to the display */ + lv_display_t *display; if(_rotated) { - disp_drv.hor_res = height(); /* Set the horizontal resolution of the display */ - disp_drv.ver_res = width(); /* Set the vertical resolution of the display */ - disp_drv.rotated = LV_DISP_ROT_270; + display = lv_display_create(height(), width()); + lv_display_set_rotation(display, LV_DISPLAY_ROTATION_270); + //display->sw_rotate = 1; } else { - disp_drv.hor_res = width(); /* Set the horizontal resolution of the display */ - disp_drv.ver_res = height(); /* Set the vertical resolution of the display */ - disp_drv.rotated = LV_DISP_ROT_NONE; + display = lv_display_create(width(), height()); } - disp_drv.sw_rotate = 1; - lv_disp_drv_register(&disp_drv); /* Finally register the driver */ + lv_display_set_buffers(display, buf1, NULL, width() * height() / 10, LV_DISPLAY_RENDER_MODE_PARTIAL); /*Initialize the display buffer.*/ + lv_display_set_flush_cb(display, lvgl_displayFlushing); + + lvgl_inc_thd.start(inc_thd); #endif /* Configure SDRAM */ @@ -189,13 +194,29 @@ void Arduino_H7_Video::set(int x, int y, uint8_t r, uint8_t g, uint8_t b) { #endif #if __has_include("lvgl.h") -void lvgl_displayFlushing(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p) { +static uint8_t* dst = nullptr; +void lvgl_displayFlushing(lv_display_t * disp, const lv_area_t * area, unsigned char * px_map) { uint32_t width = lv_area_get_width(area); uint32_t height = lv_area_get_height(area); uint32_t offsetPos = (area->x1 + (dsi_getDisplayXSize() * area->y1)) * sizeof(uint16_t); - dsi_lcdDrawImage((void *) color_p, (void *)(dsi_getActiveFrameBuffer() + offsetPos), width, height, DMA2D_INPUT_RGB565); - lv_disp_flush_ready(disp); /* Indicate you are ready with the flushing*/ + // TODO: find a smart way to tackle sw rotation +/* + if (lv_display_get_rotation(disp) != LV_DISPLAY_ROTATION_0) { + if (dst != nullptr) { + free(dst); + } + dst = (uint8_t*)malloc(width * height * 2); + lv_draw_sw_rotate(px_map, dst, height, width, + height * 2, + width * 2, + lv_display_get_rotation(disp), LV_COLOR_FORMAT_RGB565); + px_map = dst; + } +*/ + + dsi_lcdDrawImage((void *) px_map, (void *)(dsi_getActiveFrameBuffer() + offsetPos), width, height, DMA2D_INPUT_RGB565); + lv_display_flush_ready(disp); /* Indicate you are ready with the flushing*/ } #endif diff --git a/libraries/Arduino_H7_Video/src/dsi.cpp b/libraries/Arduino_H7_Video/src/dsi.cpp index 28379fd62..b79a0a9d8 100644 --- a/libraries/Arduino_H7_Video/src/dsi.cpp +++ b/libraries/Arduino_H7_Video/src/dsi.cpp @@ -323,7 +323,7 @@ uint32_t dsi_getFramebufferEnd(void) { return (FB_BASE_ADDRESS + 2 * (lcd_x_size * lcd_y_size * BYTES_PER_PIXEL)); } -void dsi_drawCurrentFrameBuffer(void) { +void dsi_drawCurrentFrameBuffer(bool reload) { int fb = pend_buffer++ % 2; /* Enable current LTDC layer */ @@ -331,6 +331,9 @@ void dsi_drawCurrentFrameBuffer(void) { /* Disable active LTDC layer */ __HAL_LTDC_LAYER_DISABLE(&(ltdc), !fb); + if (!reload) { + return; + } /* LTDC reload request within next vertical blanking */ reloadLTDC_status = 0; HAL_LTDC_Reload(<dc, LTDC_SRCR_VBR); diff --git a/libraries/Arduino_H7_Video/src/dsi.h b/libraries/Arduino_H7_Video/src/dsi.h index f2570c8e4..e3e5999bf 100644 --- a/libraries/Arduino_H7_Video/src/dsi.h +++ b/libraries/Arduino_H7_Video/src/dsi.h @@ -36,7 +36,7 @@ void dsi_lcdClear(uint32_t color); void dsi_lcdDrawImage(void *pSrc, void *pDst, uint32_t xSize, uint32_t ySize, uint32_t ColorMode); void dsi_lcdFillArea(void *pDst, uint32_t xSize, uint32_t ySize, uint32_t ColorMode); void dsi_configueCLUT(uint32_t* clut); -void dsi_drawCurrentFrameBuffer(void); +void dsi_drawCurrentFrameBuffer(bool reload = true); uint32_t dsi_getCurrentFrameBuffer(void); uint32_t dsi_getActiveFrameBuffer(void); uint32_t dsi_getFramebufferEnd(void); diff --git a/libraries/Arduino_H7_Video/src/lv_conf.h b/libraries/Arduino_H7_Video/src/lv_conf.h index 56acd738c..635a2816c 100644 --- a/libraries/Arduino_H7_Video/src/lv_conf.h +++ b/libraries/Arduino_H7_Video/src/lv_conf.h @@ -1,6 +1,6 @@ /** * @file lv_conf.h - * Configuration file for v8.3.5 + * Configuration file for v9.0.1-dev */ /* @@ -17,39 +17,35 @@ #ifndef LV_CONF_H #define LV_CONF_H -#include - /*==================== COLOR SETTINGS *====================*/ -/*Color depth: 1 (1 byte per pixel), 8 (RGB332), 16 (RGB565), 32 (ARGB8888)*/ +/*Color depth: 8 (A8), 16 (RGB565), 24 (RGB888), 32 (XRGB8888)*/ #define LV_COLOR_DEPTH 16 -/*Swap the 2 bytes of RGB565 color. Useful if the display has an 8-bit interface (e.g. SPI)*/ -#define LV_COLOR_16_SWAP 0 +/*========================= + STDLIB WRAPPER SETTINGS + *=========================*/ -/*Enable features to draw on transparent background. - *It's required if opa, and transform_* style properties are used. - *Can be also used if the UI is above another layer, e.g. an OSD menu or video player.*/ -#define LV_COLOR_SCREEN_TRANSP 0 +/* Possible values + * - LV_STDLIB_BUILTIN: LVGL's built in implementation + * - LV_STDLIB_CLIB: Standard C functions, like malloc, strlen, etc + * - LV_STDLIB_MICROPYTHON: MicroPython implementation + * - LV_STDLIB_RTTHREAD: RT-Thread implementation + * - LV_STDLIB_CUSTOM: Implement the functions externally + */ +#define LV_USE_STDLIB_MALLOC LV_STDLIB_BUILTIN +#define LV_USE_STDLIB_STRING LV_STDLIB_BUILTIN +#define LV_USE_STDLIB_SPRINTF LV_STDLIB_BUILTIN -/* Adjust color mix functions rounding. GPUs might calculate color mix (blending) differently. - * 0: round down, 64: round up from x.75, 128: round up from half, 192: round up from x.25, 254: round up */ -#define LV_COLOR_MIX_ROUND_OFS 0 -/*Images pixels with this color will not be drawn if they are chroma keyed)*/ -#define LV_COLOR_CHROMA_KEY lv_color_hex(0x00ff00) /*pure green*/ +#if LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN + /*Size of the memory available for `lv_malloc()` in bytes (>= 2kB)*/ + #define LV_MEM_SIZE (64 * 1024U) /*[bytes]*/ -/*========================= - MEMORY SETTINGS - *=========================*/ - -/*1: use custom malloc/free, 0: use the built-in `lv_mem_alloc()` and `lv_mem_free()`*/ -#define LV_MEM_CUSTOM 0 -#if LV_MEM_CUSTOM == 0 - /*Size of the memory available for `lv_mem_alloc()` in bytes (>= 2kB)*/ - #define LV_MEM_SIZE (48U * 1024U) /*[bytes]*/ + /*Size of the memory expand for `lv_malloc()` in bytes*/ + #define LV_MEM_POOL_EXPAND_SIZE 0 /*Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too.*/ #define LV_MEM_ADR 0 /*0: unused*/ @@ -58,165 +54,142 @@ #undef LV_MEM_POOL_INCLUDE #undef LV_MEM_POOL_ALLOC #endif - -#else /*LV_MEM_CUSTOM*/ - #define LV_MEM_CUSTOM_INCLUDE /*Header for the dynamic memory function*/ - #define LV_MEM_CUSTOM_ALLOC malloc - #define LV_MEM_CUSTOM_FREE free - #define LV_MEM_CUSTOM_REALLOC realloc -#endif /*LV_MEM_CUSTOM*/ - -/*Number of the intermediate memory buffer used during rendering and other internal processing mechanisms. - *You will see an error log message if there wasn't enough buffers. */ -#define LV_MEM_BUF_MAX_NUM 16 - -/*Use the standard `memcpy` and `memset` instead of LVGL's own functions. (Might or might not be faster).*/ -#define LV_MEMCPY_MEMSET_STD 0 +#endif /*LV_USE_MALLOC == LV_STDLIB_BUILTIN*/ /*==================== HAL SETTINGS *====================*/ -/*Default display refresh period. LVG will redraw changed areas with this period time*/ -#define LV_DISP_DEF_REFR_PERIOD 30 /*[ms]*/ - -/*Input device read period in milliseconds*/ -#define LV_INDEV_DEF_READ_PERIOD 30 /*[ms]*/ - -/*Use a custom tick source that tells the elapsed time in milliseconds. - *It removes the need to manually update the tick with `lv_tick_inc()`)*/ -#define LV_TICK_CUSTOM 1 -#if LV_TICK_CUSTOM - #define LV_TICK_CUSTOM_INCLUDE "Arduino.h" /*Header for the system time function*/ - #define LV_TICK_CUSTOM_SYS_TIME_EXPR (millis()) /*Expression evaluating to current system time in ms*/ - /*If using lvgl as ESP32 component*/ - // #define LV_TICK_CUSTOM_INCLUDE "esp_timer.h" - // #define LV_TICK_CUSTOM_SYS_TIME_EXPR ((esp_timer_get_time() / 1000LL)) -#endif /*LV_TICK_CUSTOM*/ +/*Default display refresh, input device read and animation step period.*/ +#define LV_DEF_REFR_PERIOD 33 /*[ms]*/ /*Default Dot Per Inch. Used to initialize default sizes such as widgets sized, style paddings. *(Not so important, you can adjust it to modify default sizes and spaces)*/ #define LV_DPI_DEF 130 /*[px/inch]*/ -/*======================= - * FEATURE CONFIGURATION - *=======================*/ +/*================= + * OPERATING SYSTEM + *=================*/ +/*Select an operating system to use. Possible options: + * - LV_OS_NONE + * - LV_OS_PTHREAD + * - LV_OS_FREERTOS + * - LV_OS_CMSIS_RTOS2 + * - LV_OS_RTTHREAD + * - LV_OS_WINDOWS + * - LV_OS_CUSTOM */ +#define LV_USE_OS LV_OS_NONE + +#if LV_USE_OS == LV_OS_CUSTOM + #define LV_OS_CUSTOM_INCLUDE +#endif -/*------------- - * Drawing - *-----------*/ +/*======================== + * RENDERING CONFIGURATION + *========================*/ + +/*Align the stride of all layers and images to this bytes*/ +#define LV_DRAW_BUF_STRIDE_ALIGN 1 + +/*Align the start address of draw_buf addresses to this bytes*/ +#define LV_DRAW_BUF_ALIGN 4 + +#define LV_USE_DRAW_SW 1 +#if LV_USE_DRAW_SW == 1 + /* Set the number of draw unit. + * > 1 requires an operating system enabled in `LV_USE_OS` + * > 1 means multiply threads will render the screen in parallel */ + #define LV_DRAW_SW_DRAW_UNIT_CNT 1 + + /* Use Arm-2D to accelerate the sw render */ + #define LV_USE_DRAW_ARM2D_SYNC 1 + + /* If a widget has `style_opa < 255` (not `bg_opa`, `text_opa` etc) or not NORMAL blend mode + * it is buffered into a "simple" layer before rendering. The widget can be buffered in smaller chunks. + * "Transformed layers" (if `transform_angle/zoom` are set) use larger buffers + * and can't be drawn in chunks. */ + + /*The target buffer size for simple layer chunks.*/ + #define LV_DRAW_SW_LAYER_SIMPLE_BUF_SIZE (24 * 1024) /*[bytes]*/ + + /* 0: use a simple renderer capable of drawing only simple rectangles with gradient, images, texts, and straight lines only + * 1: use a complex renderer capable of drawing rounded corners, shadow, skew lines, and arcs too */ + #define LV_DRAW_SW_COMPLEX 1 + + #if LV_DRAW_SW_COMPLEX == 1 + /*Allow buffering some shadow calculation. + *LV_DRAW_SW_SHADOW_CACHE_SIZE is the max. shadow size to buffer, where shadow size is `shadow_width + radius` + *Caching has LV_DRAW_SW_SHADOW_CACHE_SIZE^2 RAM cost*/ + #define LV_DRAW_SW_SHADOW_CACHE_SIZE 0 + + /* Set number of maximally cached circle data. + * The circumference of 1/4 circle are saved for anti-aliasing + * radius * 4 bytes are used per circle (the most often used radiuses are saved) + * 0: to disable caching */ + #define LV_DRAW_SW_CIRCLE_CACHE_SIZE 4 + #endif -/*Enable complex draw engine. - *Required to draw shadow, gradient, rounded corners, circles, arc, skew lines, image transformations or any masks*/ -#define LV_DRAW_COMPLEX 1 -#if LV_DRAW_COMPLEX != 0 + #define LV_USE_DRAW_SW_ASM LV_DRAW_SW_ASM_NONE - /*Allow buffering some shadow calculation. - *LV_SHADOW_CACHE_SIZE is the max. shadow size to buffer, where shadow size is `shadow_width + radius` - *Caching has LV_SHADOW_CACHE_SIZE^2 RAM cost*/ - #define LV_SHADOW_CACHE_SIZE 0 + #if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM + #define LV_DRAW_SW_ASM_CUSTOM_INCLUDE "" + #endif +#endif - /* Set number of maximally cached circle data. - * The circumference of 1/4 circle are saved for anti-aliasing - * radius * 4 bytes are used per circle (the most often used radiuses are saved) - * 0: to disable caching */ - #define LV_CIRCLE_CACHE_SIZE 4 -#endif /*LV_DRAW_COMPLEX*/ +/* Use NXP's VG-Lite GPU on iMX RTxxx platforms. */ +#define LV_USE_DRAW_VGLITE 0 -/** - * "Simple layers" are used when a widget has `style_opa < 255` to buffer the widget into a layer - * and blend it as an image with the given opacity. - * Note that `bg_opa`, `text_opa` etc don't require buffering into layer) - * The widget can be buffered in smaller chunks to avoid using large buffers. - * - * - LV_LAYER_SIMPLE_BUF_SIZE: [bytes] the optimal target buffer size. LVGL will try to allocate it - * - LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE: [bytes] used if `LV_LAYER_SIMPLE_BUF_SIZE` couldn't be allocated. - * - * Both buffer sizes are in bytes. - * "Transformed layers" (where transform_angle/zoom properties are used) use larger buffers - * and can't be drawn in chunks. So these settings affects only widgets with opacity. - */ -#define LV_LAYER_SIMPLE_BUF_SIZE (24 * 1024) -#define LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE (3 * 1024) +#if LV_USE_DRAW_VGLITE + /* Enable blit quality degradation workaround recommended for screen's dimension > 352 pixels. */ + #define LV_USE_VGLITE_BLIT_SPLIT 0 -/*Default image cache size. Image caching keeps the images opened. - *If only the built-in image formats are used there is no real advantage of caching. (I.e. if no new image decoder is added) - *With complex image decoders (e.g. PNG or JPG) caching can save the continuous open/decode of images. - *However the opened images might consume additional RAM. - *0: to disable caching*/ -#define LV_IMG_CACHE_DEF_SIZE 0 + #if LV_USE_OS + /* Enable VGLite draw async. Queue multiple tasks and flash them once to the GPU. */ + #define LV_USE_VGLITE_DRAW_ASYNC 1 + #endif -/*Number of stops allowed per gradient. Increase this to allow more stops. - *This adds (sizeof(lv_color_t) + 1) bytes per additional stop*/ -#define LV_GRADIENT_MAX_STOPS 2 - -/*Default gradient buffer size. - *When LVGL calculates the gradient "maps" it can save them into a cache to avoid calculating them again. - *LV_GRAD_CACHE_DEF_SIZE sets the size of this cache in bytes. - *If the cache is too small the map will be allocated only while it's required for the drawing. - *0 mean no caching.*/ -#define LV_GRAD_CACHE_DEF_SIZE 0 - -/*Allow dithering the gradients (to achieve visual smooth color gradients on limited color depth display) - *LV_DITHER_GRADIENT implies allocating one or two more lines of the object's rendering surface - *The increase in memory consumption is (32 bits * object width) plus 24 bits * object width if using error diffusion */ -#define LV_DITHER_GRADIENT 0 -#if LV_DITHER_GRADIENT - /*Add support for error diffusion dithering. - *Error diffusion dithering gets a much better visual result, but implies more CPU consumption and memory when drawing. - *The increase in memory consumption is (24 bits * object's width)*/ - #define LV_DITHER_ERROR_DIFFUSION 0 + /* Enable VGLite asserts. */ + #define LV_USE_VGLITE_ASSERT 0 #endif -/*Maximum buffer size to allocate for rotation. - *Only used if software rotation is enabled in the display driver.*/ -#define LV_DISP_ROT_MAX_BUF (10*1024) +/* Use NXP's PXP on iMX RTxxx platforms. */ +#define LV_USE_DRAW_PXP 0 -/*------------- - * GPU - *-----------*/ +#if LV_USE_DRAW_PXP + /* Enable PXP asserts. */ + #define LV_USE_PXP_ASSERT 0 +#endif -/*Use Arm's 2D acceleration library Arm-2D */ -#define LV_USE_GPU_ARM2D 0 +/* Use Renesas Dave2D on RA platforms. */ +#define LV_USE_DRAW_DAVE2D 0 -/*Use STM32's DMA2D (aka Chrom Art) GPU*/ -#define LV_USE_GPU_STM32_DMA2D 0 -#if LV_USE_GPU_STM32_DMA2D - /*Must be defined to include path of CMSIS header of target processor - e.g. "stm32f769xx.h" or "stm32f429xx.h"*/ - #define LV_GPU_DMA2D_CMSIS_INCLUDE -#endif +/* Draw using cached SDL textures*/ +#define LV_USE_DRAW_SDL 0 -/*Use SWM341's DMA2D GPU*/ -#define LV_USE_GPU_SWM341_DMA2D 0 -#if LV_USE_GPU_SWM341_DMA2D - #define LV_GPU_SWM341_DMA2D_INCLUDE "SWM341.h" -#endif +/* Use VG-Lite GPU. */ +#define LV_USE_DRAW_VG_LITE 0 -/*Use NXP's PXP GPU iMX RTxxx platforms*/ -#define LV_USE_GPU_NXP_PXP 0 -#if LV_USE_GPU_NXP_PXP - /*1: Add default bare metal and FreeRTOS interrupt handling routines for PXP (lv_gpu_nxp_pxp_osa.c) - * and call lv_gpu_nxp_pxp_init() automatically during lv_init(). Note that symbol SDK_OS_FREE_RTOS - * has to be defined in order to use FreeRTOS OSA, otherwise bare-metal implementation is selected. - *0: lv_gpu_nxp_pxp_init() has to be called manually before lv_init() - */ - #define LV_USE_GPU_NXP_PXP_AUTO_INIT 0 -#endif +#if LV_USE_DRAW_VG_LITE +/* Enable VG-Lite custom external 'gpu_init()' function */ +#define LV_VG_LITE_USE_GPU_INIT 0 + +/* Enable VG-Lite assert. */ +#define LV_VG_LITE_USE_ASSERT 0 + +/* VG-Lite flush commit trigger threshold. GPU will try to batch these many draw tasks. */ +#define LV_VG_LITE_FLUSH_MAX_COUNT 8 + +/* Enable border to simulate shadow + * NOTE: which usually improves performance, + * but does not guarantee the same rendering quality as the software. */ +#define LV_VG_LITE_USE_BOX_SHADOW 0 -/*Use NXP's VG-Lite GPU iMX RTxxx platforms*/ -#define LV_USE_GPU_NXP_VG_LITE 0 - -/*Use SDL renderer API*/ -#define LV_USE_GPU_SDL 0 -#if LV_USE_GPU_SDL - #define LV_GPU_SDL_INCLUDE_PATH - /*Texture cache size, 8MB by default*/ - #define LV_GPU_SDL_LRU_SIZE (1024 * 1024 * 8) - /*Custom blend mode for mask drawing, disable if you need to link with older SDL2 lib*/ - #define LV_GPU_SDL_CUSTOM_BLEND_MODE (SDL_VERSION_ATLEAST(2, 0, 6)) #endif +/*======================= + * FEATURE CONFIGURATION + *=======================*/ + /*------------- * Logging *-----------*/ @@ -238,6 +211,14 @@ *0: User need to register a callback with `lv_log_register_print_cb()`*/ #define LV_LOG_PRINTF 0 + /*1: Enable print timestamp; + *0: Disable print timestamp*/ + #define LV_LOG_USE_TIMESTAMP 1 + + /*1: Print file and line number of the log; + *0: Do not print file and line number of the log*/ + #define LV_LOG_USE_FILE_LINE 1 + /*Enable/disable LV_LOG_TRACE in modules that produces a huge number of logs*/ #define LV_LOG_TRACE_MEM 1 #define LV_LOG_TRACE_TIMER 1 @@ -247,6 +228,7 @@ #define LV_LOG_TRACE_OBJ_CREATE 1 #define LV_LOG_TRACE_LAYOUT 1 #define LV_LOG_TRACE_ANIM 1 + #define LV_LOG_TRACE_CACHE 1 #endif /*LV_USE_LOG*/ @@ -266,44 +248,80 @@ #define LV_ASSERT_HANDLER_INCLUDE #define LV_ASSERT_HANDLER while(1); /*Halt by default*/ +/*------------- + * Debug + *-----------*/ + +/*1: Draw random colored rectangles over the redrawn areas*/ +#define LV_USE_REFR_DEBUG 0 + +/*1: Draw a red overlay for ARGB layers and a green overlay for RGB layers*/ +#define LV_USE_LAYER_DEBUG 0 + +/*1: Draw overlays with different colors for each draw_unit's tasks. + *Also add the index number of the draw unit on white background. + *For layers add the index number of the draw unit on black background.*/ +#define LV_USE_PARALLEL_DRAW_DEBUG 0 + /*------------- * Others *-----------*/ -/*1: Show CPU usage and FPS count*/ -#define LV_USE_PERF_MONITOR 0 -#if LV_USE_PERF_MONITOR - #define LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT +#define LV_ENABLE_GLOBAL_CUSTOM 0 +#if LV_ENABLE_GLOBAL_CUSTOM + /*Header to include for the custom 'lv_global' function"*/ + #define LV_GLOBAL_CUSTOM_INCLUDE #endif -/*1: Show the used memory and the memory fragmentation - * Requires LV_MEM_CUSTOM = 0*/ -#define LV_USE_MEM_MONITOR 0 -#if LV_USE_MEM_MONITOR - #define LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_LEFT -#endif +/*Default cache size in bytes. + *Used by image decoders such as `lv_lodepng` to keep the decoded image in the memory. + *If size is not set to 0, the decoder will fail to decode when the cache is full. + *If size is 0, the cache function is not enabled and the decoded mem will be released immediately after use.*/ +#define LV_CACHE_DEF_SIZE 0 -/*1: Draw random colored rectangles over the redrawn areas*/ -#define LV_USE_REFR_DEBUG 0 +/*Default number of image header cache entries. The cache is used to store the headers of images + *The main logic is like `LV_CACHE_DEF_SIZE` but for image headers.*/ +#define LV_IMAGE_HEADER_CACHE_DEF_CNT 0 -/*Change the built in (v)snprintf functions*/ -#define LV_SPRINTF_CUSTOM 0 -#if LV_SPRINTF_CUSTOM - #define LV_SPRINTF_INCLUDE - #define lv_snprintf snprintf - #define lv_vsnprintf vsnprintf -#else /*LV_SPRINTF_CUSTOM*/ - #define LV_SPRINTF_USE_FLOAT 0 -#endif /*LV_SPRINTF_CUSTOM*/ - -#define LV_USE_USER_DATA 1 - -/*Garbage Collector settings - *Used if lvgl is bound to higher level language and the memory is managed by that language*/ -#define LV_ENABLE_GC 0 -#if LV_ENABLE_GC != 0 - #define LV_GC_INCLUDE "gc.h" /*Include Garbage Collector related things*/ -#endif /*LV_ENABLE_GC*/ +/*Number of stops allowed per gradient. Increase this to allow more stops. + *This adds (sizeof(lv_color_t) + 1) bytes per additional stop*/ +#define LV_GRADIENT_MAX_STOPS 2 + +/* Adjust color mix functions rounding. GPUs might calculate color mix (blending) differently. + * 0: round down, 64: round up from x.75, 128: round up from half, 192: round up from x.25, 254: round up */ +#define LV_COLOR_MIX_ROUND_OFS 0 + +/* Add 2 x 32 bit variables to each lv_obj_t to speed up getting style properties */ +#define LV_OBJ_STYLE_CACHE 0 + +/* Add `id` field to `lv_obj_t` */ +#define LV_USE_OBJ_ID 0 + +/* Use lvgl builtin method for obj ID */ +#define LV_USE_OBJ_ID_BUILTIN 0 + +/*Use obj property set/get API*/ +#define LV_USE_OBJ_PROPERTY 0 + +/* VG-Lite Simulator */ +/*Requires: LV_USE_THORVG_INTERNAL or LV_USE_THORVG_EXTERNAL */ +#define LV_USE_VG_LITE_THORVG 0 + +#if LV_USE_VG_LITE_THORVG + + /*Enable LVGL's blend mode support*/ + #define LV_VG_LITE_THORVG_LVGL_BLEND_SUPPORT 0 + + /*Enable YUV color format support*/ + #define LV_VG_LITE_THORVG_YUV_SUPPORT 0 + + /*Enable 16 pixels alignment*/ + #define LV_VG_LITE_THORVG_16PIXELS_ALIGN 1 + + /*Enable multi-thread render*/ + #define LV_VG_LITE_THORVG_THREAD_RENDER 0 + +#endif /*===================== * COMPILER SETTINGS @@ -318,7 +336,7 @@ /*Define a custom attribute to `lv_timer_handler` function*/ #define LV_ATTRIBUTE_TIMER_HANDLER -/*Define a custom attribute to `lv_disp_flush_ready` function*/ +/*Define a custom attribute to `lv_display_flush_ready` function*/ #define LV_ATTRIBUTE_FLUSH_READY /*Required alignment size for buffers*/ @@ -337,15 +355,15 @@ /*Place performance critical functions into a faster memory (e.g RAM)*/ #define LV_ATTRIBUTE_FAST_MEM -/*Prefix variables that are used in GPU accelerated operations, often these need to be placed in RAM sections that are DMA accessible*/ -#define LV_ATTRIBUTE_DMA - /*Export integer constant to binding. This macro is used with constants in the form of LV_ that *should also appear on LVGL binding API such as Micropython.*/ #define LV_EXPORT_CONST_INT(int_value) struct _silence_gcc_warning /*The default value just prevents GCC warning*/ -/*Extend the default -32k..32k coordinate range to -4M..4M by using int32_t for coordinates instead of int16_t*/ -#define LV_USE_LARGE_COORD 0 +/*Prefix all global extern data with this*/ +#define LV_ATTRIBUTE_EXTERN_DATA + +/* Use `float` as `lv_value_precise_t` */ +#define LV_USE_FLOAT 0 /*================== * FONT USAGE @@ -376,7 +394,6 @@ #define LV_FONT_MONTSERRAT_48 0 /*Demonstrate special features*/ -#define LV_FONT_MONTSERRAT_12_SUBPX 0 #define LV_FONT_MONTSERRAT_28_COMPRESSED 0 /*bpp = 3*/ #define LV_FONT_DEJAVU_16_PERSIAN_HEBREW 0 /*Hebrew, Arabic, Persian letters and all their forms*/ #define LV_FONT_SIMSUN_16_CJK 0 /*1000 most common CJK radicals*/ @@ -401,13 +418,6 @@ /*Enables/disables support for compressed fonts.*/ #define LV_USE_FONT_COMPRESSED 0 -/*Enable subpixel rendering*/ -#define LV_USE_FONT_SUBPX 0 -#if LV_USE_FONT_SUBPX - /*Set the pixel order of the display. Physical order of RGB channels. Doesn't matter with "normal" fonts.*/ - #define LV_FONT_SUBPX_BGR 0 /*0: RGB; 1:BGR order*/ -#endif - /*Enable drawing placeholders when glyph dsc is not found*/ #define LV_USE_FONT_PLACEHOLDER 1 @@ -424,7 +434,7 @@ #define LV_TXT_ENC LV_TXT_ENC_UTF8 /*Can break (wrap) texts on these chars*/ -#define LV_TXT_BREAK_CHARS " ,.;:-_" +#define LV_TXT_BREAK_CHARS " ,.;:-_)]}" /*If a word is at least this long, will break wherever "prettiest" *To disable, set to a value <= 0*/ @@ -438,9 +448,6 @@ *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/ #define LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN 3 -/*The control character to use for signalling text recoloring.*/ -#define LV_TXT_COLOR_CMD "#" - /*Support bidirectional texts. Allows mixing Left-to-Right and Right-to-Left texts. *The direction will be processed according to the Unicode Bidirectional Algorithm: *https://www.w3.org/International/articles/inline-bidi-markup/uba-basics*/ @@ -458,59 +465,22 @@ #define LV_USE_ARABIC_PERSIAN_CHARS 0 /*================== - * WIDGET USAGE + * WIDGETS *================*/ /*Documentation of the widgets: https://docs.lvgl.io/latest/en/html/widgets/index.html*/ -#define LV_USE_ARC 1 - -#define LV_USE_BAR 1 - -#define LV_USE_BTN 1 - -#define LV_USE_BTNMATRIX 1 - -#define LV_USE_CANVAS 1 - -#define LV_USE_CHECKBOX 1 - -#define LV_USE_DROPDOWN 1 /*Requires: lv_label*/ - -#define LV_USE_IMG 1 /*Requires: lv_label*/ - -#define LV_USE_LABEL 1 -#if LV_USE_LABEL - #define LV_LABEL_TEXT_SELECTION 1 /*Enable selecting text of the label*/ - #define LV_LABEL_LONG_TXT_HINT 1 /*Store some extra info in labels to speed up drawing of very long texts*/ -#endif - -#define LV_USE_LINE 1 - -#define LV_USE_ROLLER 1 /*Requires: lv_label*/ -#if LV_USE_ROLLER - #define LV_ROLLER_INF_PAGES 7 /*Number of extra "pages" when the roller is infinite*/ -#endif +#define LV_WIDGETS_HAS_DEFAULT_VALUE 1 -#define LV_USE_SLIDER 1 /*Requires: lv_bar*/ +#define LV_USE_ANIMIMG 1 -#define LV_USE_SWITCH 1 +#define LV_USE_ARC 1 -#define LV_USE_TEXTAREA 1 /*Requires: lv_label*/ -#if LV_USE_TEXTAREA != 0 - #define LV_TEXTAREA_DEF_PWD_SHOW_TIME 1500 /*ms*/ -#endif +#define LV_USE_BAR 1 -#define LV_USE_TABLE 1 +#define LV_USE_BUTTON 1 -/*================== - * EXTRA COMPONENTS - *==================*/ - -/*----------- - * Widgets - *----------*/ -#define LV_USE_ANIMIMG 1 +#define LV_USE_BUTTONMATRIX 1 #define LV_USE_CALENDAR 1 #if LV_USE_CALENDAR @@ -526,24 +496,43 @@ #define LV_USE_CALENDAR_HEADER_DROPDOWN 1 #endif /*LV_USE_CALENDAR*/ +#define LV_USE_CANVAS 1 + #define LV_USE_CHART 1 -#define LV_USE_COLORWHEEL 1 +#define LV_USE_CHECKBOX 1 + +#define LV_USE_DROPDOWN 1 /*Requires: lv_label*/ + +#define LV_USE_IMAGE 1 /*Requires: lv_label*/ -#define LV_USE_IMGBTN 1 +#define LV_USE_IMAGEBUTTON 1 #define LV_USE_KEYBOARD 1 +#define LV_USE_LABEL 1 +#if LV_USE_LABEL + #define LV_LABEL_TEXT_SELECTION 1 /*Enable selecting text of the label*/ + #define LV_LABEL_LONG_TXT_HINT 1 /*Store some extra info in labels to speed up drawing of very long texts*/ + #define LV_LABEL_WAIT_CHAR_COUNT 3 /*The count of wait chart*/ +#endif + #define LV_USE_LED 1 +#define LV_USE_LINE 1 + #define LV_USE_LIST 1 #define LV_USE_MENU 1 -#define LV_USE_METER 1 - #define LV_USE_MSGBOX 1 +#define LV_USE_ROLLER 1 /*Requires: lv_label*/ + +#define LV_USE_SCALE 1 + +#define LV_USE_SLIDER 1 /*Requires: lv_bar*/ + #define LV_USE_SPAN 1 #if LV_USE_SPAN /*A line text can contain maximum num of span descriptor */ @@ -554,15 +543,24 @@ #define LV_USE_SPINNER 1 +#define LV_USE_SWITCH 1 + +#define LV_USE_TEXTAREA 1 /*Requires: lv_label*/ +#if LV_USE_TEXTAREA != 0 + #define LV_TEXTAREA_DEF_PWD_SHOW_TIME 1500 /*ms*/ +#endif + +#define LV_USE_TABLE 1 + #define LV_USE_TABVIEW 1 #define LV_USE_TILEVIEW 1 #define LV_USE_WIN 1 -/*----------- - * Themes - *----------*/ +/*================== + * THEMES + *==================*/ /*A simple, impressive and very complete theme*/ #define LV_USE_THEME_DEFAULT 1 @@ -579,14 +577,14 @@ #endif /*LV_USE_THEME_DEFAULT*/ /*A very simple theme that is a good starting point for a custom theme*/ -#define LV_USE_THEME_BASIC 1 +#define LV_USE_THEME_SIMPLE 1 /*A theme designed for monochrome displays*/ #define LV_USE_THEME_MONO 1 -/*----------- - * Layouts - *----------*/ +/*================== + * LAYOUTS + *==================*/ /*A layout similar to Flexbox in CSS.*/ #define LV_USE_FLEX 1 @@ -594,9 +592,9 @@ /*A layout similar to Grid in CSS.*/ #define LV_USE_GRID 1 -/*--------------------- - * 3rd party libraries - *--------------------*/ +/*==================== + * 3RD PARTS LIBRARIES + *====================*/ /*File system interfaces for common APIs */ @@ -631,42 +629,93 @@ #define LV_FS_FATFS_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ #endif -/*PNG decoder library*/ -#define LV_USE_PNG 0 +/*API for memory-mapped file access. */ +#define LV_USE_FS_MEMFS 0 +#if LV_USE_FS_MEMFS + #define LV_FS_MEMFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ +#endif + +/*LODEPNG decoder library*/ +#define LV_USE_LODEPNG 0 + +/*PNG decoder(libpng) library*/ +#define LV_USE_LIBPNG 0 /*BMP decoder library*/ #define LV_USE_BMP 0 /* JPG + split JPG decoder library. * Split JPG is a custom format optimized for embedded systems. */ -#define LV_USE_SJPG 0 +#define LV_USE_TJPGD 0 + +/* libjpeg-turbo decoder library. + * Supports complete JPEG specifications and high-performance JPEG decoding. */ +#define LV_USE_LIBJPEG_TURBO 0 /*GIF decoder library*/ #define LV_USE_GIF 0 +#if LV_USE_GIF +/*GIF decoder accelerate*/ +#define LV_GIF_CACHE_DECODE_DATA 0 +#endif + + +/*Decode bin images to RAM*/ +#define LV_BIN_DECODER_RAM_LOAD 0 + +/*RLE decompress library*/ +#define LV_USE_RLE 0 /*QR code library*/ #define LV_USE_QRCODE 0 +/*Barcode code library*/ +#define LV_USE_BARCODE 0 + /*FreeType library*/ #define LV_USE_FREETYPE 0 #if LV_USE_FREETYPE - /*Memory used by FreeType to cache characters [bytes] (-1: no caching)*/ - #define LV_FREETYPE_CACHE_SIZE (16 * 1024) - #if LV_FREETYPE_CACHE_SIZE >= 0 - /* 1: bitmap cache use the sbit cache, 0:bitmap cache use the image cache. */ - /* sbit cache:it is much more memory efficient for small bitmaps(font size < 256) */ - /* if font size >= 256, must be configured as image cache */ - #define LV_FREETYPE_SBIT_CACHE 0 - /* Maximum number of opened FT_Face/FT_Size objects managed by this cache instance. */ - /* (0:use system defaults) */ - #define LV_FREETYPE_CACHE_FT_FACES 0 - #define LV_FREETYPE_CACHE_FT_SIZES 0 - #endif + /*Memory used by FreeType to cache characters in kilobytes*/ + #define LV_FREETYPE_CACHE_SIZE 768 + + /*Let FreeType to use LVGL memory and file porting*/ + #define LV_FREETYPE_USE_LVGL_PORT 0 + + /* Maximum number of opened FT_Face/FT_Size objects managed by this cache instance. */ + /* (0:use system defaults) */ + #define LV_FREETYPE_CACHE_FT_FACES 8 + #define LV_FREETYPE_CACHE_FT_SIZES 8 + #define LV_FREETYPE_CACHE_FT_GLYPH_CNT 256 +#endif + +/* Built-in TTF decoder */ +#define LV_USE_TINY_TTF 0 +#if LV_USE_TINY_TTF + /* Enable loading TTF data from files */ + #define LV_TINY_TTF_FILE_SUPPORT 0 #endif /*Rlottie library*/ #define LV_USE_RLOTTIE 0 +/*Enable Vector Graphic APIs*/ +#define LV_USE_VECTOR_GRAPHIC 0 + +/* Enable ThorVG (vector graphics library) from the src/libs folder */ +#define LV_USE_THORVG_INTERNAL 0 + +/* Enable ThorVG by assuming that its installed and linked to the project */ +#define LV_USE_THORVG_EXTERNAL 0 + +/*Enable LZ4 compress/decompress lib*/ +#define LV_USE_LZ4 0 + +/*Use lvgl built-in LZ4 lib*/ +#define LV_USE_LZ4_INTERNAL 0 + +/*Use external LZ4 library*/ +#define LV_USE_LZ4_EXTERNAL 0 + /*FFmpeg library for image decoding and playing videos *Supports all major image formats so do not enable other image decoder with it*/ #define LV_USE_FFMPEG 0 @@ -675,13 +724,65 @@ #define LV_FFMPEG_DUMP_FORMAT 0 #endif -/*----------- - * Others - *----------*/ +/*================== + * OTHERS + *==================*/ /*1: Enable API to take snapshot for object*/ #define LV_USE_SNAPSHOT 0 +/*1: Enable system monitor component*/ +#define LV_USE_SYSMON 0 +#if LV_USE_SYSMON + /*Get the idle percentage. E.g. uint32_t my_get_idle(void);*/ + #define LV_SYSMON_GET_IDLE lv_timer_get_idle + + /*1: Show CPU usage and FPS count + * Requires `LV_USE_SYSMON = 1`*/ + #define LV_USE_PERF_MONITOR 0 + #if LV_USE_PERF_MONITOR + #define LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT + + /*0: Displays performance data on the screen, 1: Prints performance data using log.*/ + #define LV_USE_PERF_MONITOR_LOG_MODE 0 + #endif + + /*1: Show the used memory and the memory fragmentation + * Requires `LV_USE_BUILTIN_MALLOC = 1` + * Requires `LV_USE_SYSMON = 1`*/ + #define LV_USE_MEM_MONITOR 0 + #if LV_USE_MEM_MONITOR + #define LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_LEFT + #endif + +#endif /*LV_USE_SYSMON*/ + +/*1: Enable the runtime performance profiler*/ +#define LV_USE_PROFILER 0 +#if LV_USE_PROFILER + /*1: Enable the built-in profiler*/ + #define LV_USE_PROFILER_BUILTIN 1 + #if LV_USE_PROFILER_BUILTIN + /*Default profiler trace buffer size*/ + #define LV_PROFILER_BUILTIN_BUF_SIZE (16 * 1024) /*[bytes]*/ + #endif + + /*Header to include for the profiler*/ + #define LV_PROFILER_INCLUDE "lvgl/src/misc/lv_profiler_builtin.h" + + /*Profiler start point function*/ + #define LV_PROFILER_BEGIN LV_PROFILER_BUILTIN_BEGIN + + /*Profiler end point function*/ + #define LV_PROFILER_END LV_PROFILER_BUILTIN_END + + /*Profiler start point function with custom tag*/ + #define LV_PROFILER_BEGIN_TAG LV_PROFILER_BUILTIN_BEGIN_TAG + + /*Profiler end point function with custom tag*/ + #define LV_PROFILER_END_TAG LV_PROFILER_BUILTIN_END_TAG +#endif + /*1: Enable Monkey test*/ #define LV_USE_MONKEY 0 @@ -694,8 +795,8 @@ /*1: Support using images as font in label or span widgets */ #define LV_USE_IMGFONT 0 -/*1: Enable a published subscriber based messaging system */ -#define LV_USE_MSG 0 +/*1: Enable an observer pattern implementation*/ +#define LV_USE_OBSERVER 1 /*1: Enable Pinyin input method*/ /*Requires: lv_keyboard*/ @@ -712,9 +813,109 @@ #define LV_IME_PINYIN_USE_K9_MODE 1 #if LV_IME_PINYIN_USE_K9_MODE == 1 #define LV_IME_PINYIN_K9_CAND_TEXT_NUM 3 - #endif // LV_IME_PINYIN_USE_K9_MODE + #endif /*LV_IME_PINYIN_USE_K9_MODE*/ +#endif + +/*1: Enable file explorer*/ +/*Requires: lv_table*/ +#define LV_USE_FILE_EXPLORER 0 +#if LV_USE_FILE_EXPLORER + /*Maximum length of path*/ + #define LV_FILE_EXPLORER_PATH_MAX_LEN (128) + /*Quick access bar, 1:use, 0:not use*/ + /*Requires: lv_list*/ + #define LV_FILE_EXPLORER_QUICK_ACCESS 1 +#endif + +/*================== + * DEVICES + *==================*/ + +/*Use SDL to open window on PC and handle mouse and keyboard*/ +#define LV_USE_SDL 0 +#if LV_USE_SDL + #define LV_SDL_INCLUDE_PATH + #define LV_SDL_RENDER_MODE LV_DISPLAY_RENDER_MODE_DIRECT /*LV_DISPLAY_RENDER_MODE_DIRECT is recommended for best performance*/ + #define LV_SDL_BUF_COUNT 1 /*1 or 2*/ + #define LV_SDL_FULLSCREEN 0 /*1: Make the window full screen by default*/ + #define LV_SDL_DIRECT_EXIT 1 /*1: Exit the application when all SDL windows are closed*/ +#endif + +/*Use X11 to open window on Linux desktop and handle mouse and keyboard*/ +#define LV_USE_X11 0 +#if LV_USE_X11 + #define LV_X11_DIRECT_EXIT 1 /*Exit the application when all X11 windows have been closed*/ + #define LV_X11_DOUBLE_BUFFER 1 /*Use double buffers for endering*/ + /*select only 1 of the following render modes (LV_X11_RENDER_MODE_PARTIAL preferred!)*/ + #define LV_X11_RENDER_MODE_PARTIAL 1 /*Partial render mode (preferred)*/ + #define LV_X11_RENDER_MODE_DIRECT 0 /*direct render mode*/ + #define LV_X11_RENDER_MODE_FULL 0 /*Full render mode*/ #endif +/*Driver for /dev/fb*/ +#define LV_USE_LINUX_FBDEV 0 +#if LV_USE_LINUX_FBDEV + #define LV_LINUX_FBDEV_BSD 0 + #define LV_LINUX_FBDEV_RENDER_MODE LV_DISPLAY_RENDER_MODE_PARTIAL + #define LV_LINUX_FBDEV_BUFFER_COUNT 0 + #define LV_LINUX_FBDEV_BUFFER_SIZE 60 +#endif + +/*Use Nuttx to open window and handle touchscreen*/ +#define LV_USE_NUTTX 0 + +#if LV_USE_NUTTX + #define LV_USE_NUTTX_LIBUV 0 + + /*Use Nuttx custom init API to open window and handle touchscreen*/ + #define LV_USE_NUTTX_CUSTOM_INIT 0 + + /*Driver for /dev/lcd*/ + #define LV_USE_NUTTX_LCD 0 + #if LV_USE_NUTTX_LCD + #define LV_NUTTX_LCD_BUFFER_COUNT 0 + #define LV_NUTTX_LCD_BUFFER_SIZE 60 + #endif + + /*Driver for /dev/input*/ + #define LV_USE_NUTTX_TOUCHSCREEN 0 + +#endif + +/*Driver for /dev/dri/card*/ +#define LV_USE_LINUX_DRM 0 + +/*Interface for TFT_eSPI*/ +#define LV_USE_TFT_ESPI 0 + +/*Driver for evdev input devices*/ +#define LV_USE_EVDEV 0 + +/*Driver for libinput input devices*/ +#define LV_USE_LIBINPUT 0 + +#if LV_USE_LIBINPUT + #define LV_LIBINPUT_BSD 0 + + /*Full keyboard support*/ + #define LV_LIBINPUT_XKB 0 + #if LV_LIBINPUT_XKB + /*"setxkbmap -query" can help find the right values for your keyboard*/ + #define LV_LIBINPUT_XKB_KEY_MAP { .rules = NULL, .model = "pc101", .layout = "us", .variant = NULL, .options = NULL } + #endif +#endif + +/*Drivers for LCD devices connected via SPI/parallel port*/ +#define LV_USE_ST7735 0 +#define LV_USE_ST7789 0 +#define LV_USE_ST7796 0 +#define LV_USE_ILI9341 0 + +#define LV_USE_GENERIC_MIPI (LV_USE_ST7735 | LV_USE_ST7789 | LV_USE_ST7796 | LV_USE_ILI9341) + +/* LVGL Windows backend */ +#define LV_USE_WINDOWS 0 + /*================== * EXAMPLES *==================*/ @@ -728,19 +929,15 @@ /*Show some widget. It might be required to increase `LV_MEM_SIZE` */ #define LV_USE_DEMO_WIDGETS 0 -#if LV_USE_DEMO_WIDGETS -#define LV_DEMO_WIDGETS_SLIDESHOW 0 -#endif /*Demonstrate the usage of encoder and keyboard*/ #define LV_USE_DEMO_KEYPAD_AND_ENCODER 0 /*Benchmark your system*/ #define LV_USE_DEMO_BENCHMARK 0 -#if LV_USE_DEMO_BENCHMARK -/*Use RGB565A8 images with 16 bit color depth instead of ARGB8565*/ -#define LV_DEMO_BENCHMARK_RGB565A8 0 -#endif + +/*Render test for each primitives. Requires at least 480x272 display*/ +#define LV_USE_DEMO_RENDER 0 /*Stress test for LVGL*/ #define LV_USE_DEMO_STRESS 0 @@ -755,6 +952,20 @@ #define LV_DEMO_MUSIC_AUTO_PLAY 0 #endif +/*Flex layout demo*/ +#define LV_USE_DEMO_FLEX_LAYOUT 0 + +/*Smart-phone like multi-language demo*/ +#define LV_USE_DEMO_MULTILANG 0 + +/*Widget transformation demo*/ +#define LV_USE_DEMO_TRANSFORM 0 + +/*Demonstrate scroll settings*/ +#define LV_USE_DEMO_SCROLL 0 + +/*Vector graphic demo*/ +#define LV_USE_DEMO_VECTOR_GRAPHIC 0 /*--END OF LV_CONF_H--*/ #endif /*LV_CONF_H*/ From 64390377048b9c1dc8b26413c0b7463665ac2034 Mon Sep 17 00:00:00 2001 From: Marco Marche Date: Wed, 14 Feb 2024 11:53:31 +0100 Subject: [PATCH 02/37] fix(Ethernet): missing return statement in begin with mac, timeout and responseTimeout --- libraries/Ethernet/src/Ethernet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/Ethernet/src/Ethernet.cpp b/libraries/Ethernet/src/Ethernet.cpp index 196afa01d..50c43c9c5 100644 --- a/libraries/Ethernet/src/Ethernet.cpp +++ b/libraries/Ethernet/src/Ethernet.cpp @@ -9,7 +9,7 @@ int arduino::EthernetClass::begin(uint8_t *mac, unsigned long timeout, unsigned if (eth_if == nullptr) return 0; } eth_if->set_dhcp(true); - _begin(mac, timeout, responseTimeout); + return _begin(mac, timeout, responseTimeout); } int arduino::EthernetClass::_begin(uint8_t *mac, unsigned long timeout, unsigned long responseTimeout) { From d21da60d36ccc3589b3fb51acc2008f68f9ee698 Mon Sep 17 00:00:00 2001 From: iabdalkader Date: Thu, 15 Feb 2024 13:48:19 +0100 Subject: [PATCH 03/37] variants/NICLA_VISION: Fix typos in pins definitions. Signed-off-by: iabdalkader --- variants/NICLA_VISION/pins_arduino.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/variants/NICLA_VISION/pins_arduino.h b/variants/NICLA_VISION/pins_arduino.h index 8046d39a1..b6aac6221 100644 --- a/variants/NICLA_VISION/pins_arduino.h +++ b/variants/NICLA_VISION/pins_arduino.h @@ -60,12 +60,12 @@ static const uint8_t A2 = PIN_A2; #define D13 (13u) #define D14 (14u) #define D15 (15u) -#define D16 (u16) -#define D17 (u17) -#define D18 (u18) -#define D19 (u19) -#define D20 (u20) -#define D21 (u21) +#define D16 (16u) +#define D17 (17u) +#define D18 (18u) +#define D19 (19u) +#define D20 (20u) +#define D21 (21u) // Serial #define PIN_SERIAL_RX (2ul) From 0f1918d9de5ceb99225a813321a55cf421e02910 Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Mon, 4 Mar 2024 16:55:05 +0100 Subject: [PATCH 04/37] lvgl9: fix rotation for Giga display shield --- .../Arduino_H7_Video/src/Arduino_H7_Video.cpp | 46 +++++++++++-------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/libraries/Arduino_H7_Video/src/Arduino_H7_Video.cpp b/libraries/Arduino_H7_Video/src/Arduino_H7_Video.cpp index 3526b749d..6467ac725 100644 --- a/libraries/Arduino_H7_Video/src/Arduino_H7_Video.cpp +++ b/libraries/Arduino_H7_Video/src/Arduino_H7_Video.cpp @@ -105,7 +105,7 @@ int Arduino_H7_Video::begin() { lv_display_t *display; if(_rotated) { display = lv_display_create(height(), width()); - lv_display_set_rotation(display, LV_DISPLAY_ROTATION_270); + lv_display_set_rotation(display, LV_DISPLAY_ROTATION_90); //display->sw_rotate = 1; } else { display = lv_display_create(width(), height()); @@ -194,28 +194,38 @@ void Arduino_H7_Video::set(int x, int y, uint8_t r, uint8_t g, uint8_t b) { #endif #if __has_include("lvgl.h") -static uint8_t* dst = nullptr; +static uint8_t* rotated_buf = nullptr; void lvgl_displayFlushing(lv_display_t * disp, const lv_area_t * area, unsigned char * px_map) { - uint32_t width = lv_area_get_width(area); - uint32_t height = lv_area_get_height(area); - uint32_t offsetPos = (area->x1 + (dsi_getDisplayXSize() * area->y1)) * sizeof(uint16_t); + uint32_t w = lv_area_get_width(area); + uint32_t h = lv_area_get_height(area); + lv_area_t* area_in_use = (lv_area_t *)area; // TODO: find a smart way to tackle sw rotation -/* - if (lv_display_get_rotation(disp) != LV_DISPLAY_ROTATION_0) { - if (dst != nullptr) { - free(dst); - } - dst = (uint8_t*)malloc(width * height * 2); - lv_draw_sw_rotate(px_map, dst, height, width, - height * 2, - width * 2, - lv_display_get_rotation(disp), LV_COLOR_FORMAT_RGB565); - px_map = dst; + lv_display_rotation_t rotation = lv_display_get_rotation(disp); + lv_area_t rotated_area; + if (rotation != LV_DISPLAY_ROTATION_0) { + rotated_buf = (uint8_t*)realloc(rotated_buf, w * h * 4); + lv_color_format_t cf = lv_display_get_color_format(disp); + lv_draw_sw_rotate(px_map, rotated_buf, + w, h, lv_draw_buf_width_to_stride(w, cf), + lv_draw_buf_width_to_stride(h, cf), + LV_DISPLAY_ROTATION_270, cf); + rotated_area.x1 = area->y1; + rotated_area.y2 = lv_display_get_horizontal_resolution(disp) - area->x1 - 1; + //rotated_area.y2 = dsi_getDisplayYSize() - area->x1 - 1; + rotated_area.x2 = rotated_area.x1 + h - 1; + rotated_area.y1 = rotated_area.y2 - w + 1; + + area_in_use = &rotated_area; + px_map = rotated_buf; + auto temp = w; + w = h; + h = temp; } -*/ - dsi_lcdDrawImage((void *) px_map, (void *)(dsi_getActiveFrameBuffer() + offsetPos), width, height, DMA2D_INPUT_RGB565); + uint32_t offsetPos = (area_in_use->x1 + (dsi_getDisplayXSize() * area_in_use->y1)) * sizeof(uint16_t); + + dsi_lcdDrawImage((void *) px_map, (void *)(dsi_getActiveFrameBuffer() + offsetPos), w, h, DMA2D_INPUT_RGB565); lv_display_flush_ready(disp); /* Indicate you are ready with the flushing*/ } #endif From 7368a3b330f8e609198b45bef1211f70d06855a4 Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Mon, 4 Mar 2024 17:02:29 +0100 Subject: [PATCH 05/37] boards.txt: update bootloader.tool for all boards --- boards.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/boards.txt b/boards.txt index b3f57311f..94f603fa6 100644 --- a/boards.txt +++ b/boards.txt @@ -599,6 +599,7 @@ nicla_vision.menu.target_core.cm4.upload.maximum_data_size=294248 nicla_vision.debug.tool=gdb nicla_vision.bootloader.tool=openocd +nicla_vision.bootloader.tool.default=openocd nicla_vision.bootloader.config=-f target/stm32h7x_dual_bank.cfg nicla_vision.bootloader.programmer=-f interface/stlink.cfg nicla_vision.bootloader.extra_action.preflash=stm32h7x option_write 0 0x01c 0xb86aaf0 @@ -735,6 +736,7 @@ opta.menu.target_core.cm4.upload.maximum_data_size=294248 opta.debug.tool=gdb opta.bootloader.tool=openocd +opta.bootloader.tool.default=openocd opta.bootloader.config=-f target/stm32h7x_dual_bank.cfg opta.bootloader.programmer=-f interface/stlink.cfg opta.bootloader.extra_action.preflash=stm32h7x option_write 0 0x01c 0xb86aaf0 @@ -838,6 +840,7 @@ giga.menu.target_core.cm4.upload.maximum_data_size=294248 giga.debug.tool=gdb giga.bootloader.tool=openocd +giga.bootloader.tool.default=openocd giga.bootloader.config=-f target/stm32h7x_dual_bank.cfg giga.bootloader.programmer=-f interface/stlink.cfg giga.bootloader.extra_action.preflash=stm32h7x option_write 0 0x01c 0xb86aaf0 From 0da4e2001950f9598733e49f5df78eb9218d905f Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Mon, 4 Mar 2024 19:18:44 +0100 Subject: [PATCH 06/37] lvgl: fix lvgl8 build --- .../examples/LVGLDemo/LVGLDemo.ino | 4 + .../examples/LVGLDemo/img_arduinologo.c | 12 + .../Arduino_H7_Video/src/Arduino_H7_Video.cpp | 47 + libraries/Arduino_H7_Video/src/lv_conf.h | 980 +----------------- libraries/Arduino_H7_Video/src/lv_conf_8.h | 762 ++++++++++++++ libraries/Arduino_H7_Video/src/lv_conf_9.h | 973 +++++++++++++++++ 6 files changed, 1805 insertions(+), 973 deletions(-) create mode 100644 libraries/Arduino_H7_Video/src/lv_conf_8.h create mode 100644 libraries/Arduino_H7_Video/src/lv_conf_9.h diff --git a/libraries/Arduino_H7_Video/examples/LVGLDemo/LVGLDemo.ino b/libraries/Arduino_H7_Video/examples/LVGLDemo/LVGLDemo.ino index 3267c7e74..385ead77c 100644 --- a/libraries/Arduino_H7_Video/examples/LVGLDemo/LVGLDemo.ino +++ b/libraries/Arduino_H7_Video/examples/LVGLDemo/LVGLDemo.ino @@ -76,7 +76,11 @@ void setup() { lv_style_init(&style_radio); lv_style_set_radius(&style_radio, LV_RADIUS_CIRCLE); lv_style_init(&style_radio_chk); + #if (LVGL_VERSION_MAJOR == 9) lv_style_set_bg_image_src(&style_radio_chk, NULL); + #else + lv_style_set_bg_img_src(&style_radio_chk, NULL); + #endif cb = lv_checkbox_create(obj); lv_checkbox_set_text(cb, "Lemon"); diff --git a/libraries/Arduino_H7_Video/examples/LVGLDemo/img_arduinologo.c b/libraries/Arduino_H7_Video/examples/LVGLDemo/img_arduinologo.c index 7c5c72cdb..e938d7999 100644 --- a/libraries/Arduino_H7_Video/examples/LVGLDemo/img_arduinologo.c +++ b/libraries/Arduino_H7_Video/examples/LVGLDemo/img_arduinologo.c @@ -636,6 +636,7 @@ const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_IMG_ARDUI #endif }; +#if (LVGL_VERSION_MAJOR == 9) const lv_img_dsc_t img_arduinologo = { .header.cf = LV_COLOR_FORMAT_RGB565, .header.w = 200, @@ -643,3 +644,14 @@ const lv_img_dsc_t img_arduinologo = { .data_size = 30000 * LV_COLOR_DEPTH / 8, .data = img_arduinologo_map, }; +#else +const lv_img_dsc_t img_arduinologo = { + .header.cf = LV_IMG_CF_TRUE_COLOR, + .header.always_zero = 0, + .header.reserved = 0, + .header.w = 200, + .header.h = 150, + .data_size = 30000 * LV_COLOR_SIZE / 8, + .data = img_arduinologo_map, +}; +#endif \ No newline at end of file diff --git a/libraries/Arduino_H7_Video/src/Arduino_H7_Video.cpp b/libraries/Arduino_H7_Video/src/Arduino_H7_Video.cpp index 6467ac725..89d18dfde 100644 --- a/libraries/Arduino_H7_Video/src/Arduino_H7_Video.cpp +++ b/libraries/Arduino_H7_Video/src/Arduino_H7_Video.cpp @@ -38,6 +38,7 @@ extern "C" { /* Private function prototypes -----------------------------------------------*/ #if __has_include ("lvgl.h") #include "mbed.h" +#if (LVGL_VERSION_MAJOR == 9) void lvgl_displayFlushing(lv_display_t * display, const lv_area_t * area, unsigned char * px_map); static void inc_thd() { while (1) { @@ -46,6 +47,9 @@ static void inc_thd() { } } static rtos::Thread lvgl_inc_thd; +#else +void lvgl_displayFlushing(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p); +#endif #endif /* Functions -----------------------------------------------------------------*/ @@ -92,6 +96,8 @@ int Arduino_H7_Video::begin() { /* Initiliaze LVGL library */ lv_init(); + + #if (LVGL_VERSION_MAJOR == 9) /* Create a draw buffer */ static lv_color_t * buf1 = (lv_color_t*)malloc((width() * height() / 10)); /* Declare a buffer for 1/10 screen size */ if (buf1 == NULL) { @@ -114,6 +120,36 @@ int Arduino_H7_Video::begin() { lv_display_set_flush_cb(display, lvgl_displayFlushing); lvgl_inc_thd.start(inc_thd); + + #else //LVGL_VERSION_MAJOR + + /* Create a draw buffer */ + static lv_disp_draw_buf_t draw_buf; + static lv_color_t * buf1; + buf1 = (lv_color_t*)malloc((width() * height() / 10) * sizeof(lv_color_t)); /* Declare a buffer for 1/10 screen size */ + if (buf1 == NULL) { + return 2; /* Insuff memory err */ + } + lv_disp_draw_buf_init(&draw_buf, buf1, NULL, width() * height() / 10); /* Initialize the display buffer. */ + + /* Initialize display features for LVGL library */ + static lv_disp_drv_t disp_drv; /* Descriptor of a display driver */ + lv_disp_drv_init(&disp_drv); /* Basic initialization */ + disp_drv.flush_cb = lvgl_displayFlushing; /* Set your driver function */ + disp_drv.draw_buf = &draw_buf; /* Assign the buffer to the display */ + if(_rotated) { + disp_drv.hor_res = height(); /* Set the horizontal resolution of the display */ + disp_drv.ver_res = width(); /* Set the vertical resolution of the display */ + disp_drv.rotated = LV_DISP_ROT_270; + } else { + disp_drv.hor_res = width(); /* Set the horizontal resolution of the display */ + disp_drv.ver_res = height(); /* Set the vertical resolution of the display */ + disp_drv.rotated = LV_DISP_ROT_NONE; + } + disp_drv.sw_rotate = 1; + lv_disp_drv_register(&disp_drv); /* Finally register the driver */ + + #endif #endif /* Configure SDRAM */ @@ -194,6 +230,7 @@ void Arduino_H7_Video::set(int x, int y, uint8_t r, uint8_t g, uint8_t b) { #endif #if __has_include("lvgl.h") +#if (LVGL_VERSION_MAJOR == 9) static uint8_t* rotated_buf = nullptr; void lvgl_displayFlushing(lv_display_t * disp, const lv_area_t * area, unsigned char * px_map) { uint32_t w = lv_area_get_width(area); @@ -228,6 +265,16 @@ void lvgl_displayFlushing(lv_display_t * disp, const lv_area_t * area, unsigned dsi_lcdDrawImage((void *) px_map, (void *)(dsi_getActiveFrameBuffer() + offsetPos), w, h, DMA2D_INPUT_RGB565); lv_display_flush_ready(disp); /* Indicate you are ready with the flushing*/ } +#else +void lvgl_displayFlushing(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p) { + uint32_t width = lv_area_get_width(area); + uint32_t height = lv_area_get_height(area); + uint32_t offsetPos = (area->x1 + (dsi_getDisplayXSize() * area->y1)) * sizeof(uint16_t); + + dsi_lcdDrawImage((void *) color_p, (void *)(dsi_getActiveFrameBuffer() + offsetPos), width, height, DMA2D_INPUT_RGB565); + lv_disp_flush_ready(disp); /* Indicate you are ready with the flushing*/ +} +#endif #endif /**** END OF FILE ****/ \ No newline at end of file diff --git a/libraries/Arduino_H7_Video/src/lv_conf.h b/libraries/Arduino_H7_Video/src/lv_conf.h index 635a2816c..82448db9c 100644 --- a/libraries/Arduino_H7_Video/src/lv_conf.h +++ b/libraries/Arduino_H7_Video/src/lv_conf.h @@ -1,973 +1,7 @@ -/** - * @file lv_conf.h - * Configuration file for v9.0.1-dev - */ - -/* - * Copy this file as `lv_conf.h` - * 1. simply next to the `lvgl` folder - * 2. or any other places and - * - define `LV_CONF_INCLUDE_SIMPLE` - * - add the path as include path - */ - -/* clang-format off */ -#if 1 /*Set it to "1" to enable content*/ - -#ifndef LV_CONF_H -#define LV_CONF_H - -/*==================== - COLOR SETTINGS - *====================*/ - -/*Color depth: 8 (A8), 16 (RGB565), 24 (RGB888), 32 (XRGB8888)*/ -#define LV_COLOR_DEPTH 16 - -/*========================= - STDLIB WRAPPER SETTINGS - *=========================*/ - -/* Possible values - * - LV_STDLIB_BUILTIN: LVGL's built in implementation - * - LV_STDLIB_CLIB: Standard C functions, like malloc, strlen, etc - * - LV_STDLIB_MICROPYTHON: MicroPython implementation - * - LV_STDLIB_RTTHREAD: RT-Thread implementation - * - LV_STDLIB_CUSTOM: Implement the functions externally - */ -#define LV_USE_STDLIB_MALLOC LV_STDLIB_BUILTIN -#define LV_USE_STDLIB_STRING LV_STDLIB_BUILTIN -#define LV_USE_STDLIB_SPRINTF LV_STDLIB_BUILTIN - - -#if LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN - /*Size of the memory available for `lv_malloc()` in bytes (>= 2kB)*/ - #define LV_MEM_SIZE (64 * 1024U) /*[bytes]*/ - - /*Size of the memory expand for `lv_malloc()` in bytes*/ - #define LV_MEM_POOL_EXPAND_SIZE 0 - - /*Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too.*/ - #define LV_MEM_ADR 0 /*0: unused*/ - /*Instead of an address give a memory allocator that will be called to get a memory pool for LVGL. E.g. my_malloc*/ - #if LV_MEM_ADR == 0 - #undef LV_MEM_POOL_INCLUDE - #undef LV_MEM_POOL_ALLOC - #endif -#endif /*LV_USE_MALLOC == LV_STDLIB_BUILTIN*/ - -/*==================== - HAL SETTINGS - *====================*/ - -/*Default display refresh, input device read and animation step period.*/ -#define LV_DEF_REFR_PERIOD 33 /*[ms]*/ - -/*Default Dot Per Inch. Used to initialize default sizes such as widgets sized, style paddings. - *(Not so important, you can adjust it to modify default sizes and spaces)*/ -#define LV_DPI_DEF 130 /*[px/inch]*/ - -/*================= - * OPERATING SYSTEM - *=================*/ -/*Select an operating system to use. Possible options: - * - LV_OS_NONE - * - LV_OS_PTHREAD - * - LV_OS_FREERTOS - * - LV_OS_CMSIS_RTOS2 - * - LV_OS_RTTHREAD - * - LV_OS_WINDOWS - * - LV_OS_CUSTOM */ -#define LV_USE_OS LV_OS_NONE - -#if LV_USE_OS == LV_OS_CUSTOM - #define LV_OS_CUSTOM_INCLUDE -#endif - -/*======================== - * RENDERING CONFIGURATION - *========================*/ - -/*Align the stride of all layers and images to this bytes*/ -#define LV_DRAW_BUF_STRIDE_ALIGN 1 - -/*Align the start address of draw_buf addresses to this bytes*/ -#define LV_DRAW_BUF_ALIGN 4 - -#define LV_USE_DRAW_SW 1 -#if LV_USE_DRAW_SW == 1 - /* Set the number of draw unit. - * > 1 requires an operating system enabled in `LV_USE_OS` - * > 1 means multiply threads will render the screen in parallel */ - #define LV_DRAW_SW_DRAW_UNIT_CNT 1 - - /* Use Arm-2D to accelerate the sw render */ - #define LV_USE_DRAW_ARM2D_SYNC 1 - - /* If a widget has `style_opa < 255` (not `bg_opa`, `text_opa` etc) or not NORMAL blend mode - * it is buffered into a "simple" layer before rendering. The widget can be buffered in smaller chunks. - * "Transformed layers" (if `transform_angle/zoom` are set) use larger buffers - * and can't be drawn in chunks. */ - - /*The target buffer size for simple layer chunks.*/ - #define LV_DRAW_SW_LAYER_SIMPLE_BUF_SIZE (24 * 1024) /*[bytes]*/ - - /* 0: use a simple renderer capable of drawing only simple rectangles with gradient, images, texts, and straight lines only - * 1: use a complex renderer capable of drawing rounded corners, shadow, skew lines, and arcs too */ - #define LV_DRAW_SW_COMPLEX 1 - - #if LV_DRAW_SW_COMPLEX == 1 - /*Allow buffering some shadow calculation. - *LV_DRAW_SW_SHADOW_CACHE_SIZE is the max. shadow size to buffer, where shadow size is `shadow_width + radius` - *Caching has LV_DRAW_SW_SHADOW_CACHE_SIZE^2 RAM cost*/ - #define LV_DRAW_SW_SHADOW_CACHE_SIZE 0 - - /* Set number of maximally cached circle data. - * The circumference of 1/4 circle are saved for anti-aliasing - * radius * 4 bytes are used per circle (the most often used radiuses are saved) - * 0: to disable caching */ - #define LV_DRAW_SW_CIRCLE_CACHE_SIZE 4 - #endif - - #define LV_USE_DRAW_SW_ASM LV_DRAW_SW_ASM_NONE - - #if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM - #define LV_DRAW_SW_ASM_CUSTOM_INCLUDE "" - #endif -#endif - -/* Use NXP's VG-Lite GPU on iMX RTxxx platforms. */ -#define LV_USE_DRAW_VGLITE 0 - -#if LV_USE_DRAW_VGLITE - /* Enable blit quality degradation workaround recommended for screen's dimension > 352 pixels. */ - #define LV_USE_VGLITE_BLIT_SPLIT 0 - - #if LV_USE_OS - /* Enable VGLite draw async. Queue multiple tasks and flash them once to the GPU. */ - #define LV_USE_VGLITE_DRAW_ASYNC 1 - #endif - - /* Enable VGLite asserts. */ - #define LV_USE_VGLITE_ASSERT 0 -#endif - -/* Use NXP's PXP on iMX RTxxx platforms. */ -#define LV_USE_DRAW_PXP 0 - -#if LV_USE_DRAW_PXP - /* Enable PXP asserts. */ - #define LV_USE_PXP_ASSERT 0 -#endif - -/* Use Renesas Dave2D on RA platforms. */ -#define LV_USE_DRAW_DAVE2D 0 - -/* Draw using cached SDL textures*/ -#define LV_USE_DRAW_SDL 0 - -/* Use VG-Lite GPU. */ -#define LV_USE_DRAW_VG_LITE 0 - -#if LV_USE_DRAW_VG_LITE -/* Enable VG-Lite custom external 'gpu_init()' function */ -#define LV_VG_LITE_USE_GPU_INIT 0 - -/* Enable VG-Lite assert. */ -#define LV_VG_LITE_USE_ASSERT 0 - -/* VG-Lite flush commit trigger threshold. GPU will try to batch these many draw tasks. */ -#define LV_VG_LITE_FLUSH_MAX_COUNT 8 - -/* Enable border to simulate shadow - * NOTE: which usually improves performance, - * but does not guarantee the same rendering quality as the software. */ -#define LV_VG_LITE_USE_BOX_SHADOW 0 - -#endif - -/*======================= - * FEATURE CONFIGURATION - *=======================*/ - -/*------------- - * Logging - *-----------*/ - -/*Enable the log module*/ -#define LV_USE_LOG 0 -#if LV_USE_LOG - - /*How important log should be added: - *LV_LOG_LEVEL_TRACE A lot of logs to give detailed information - *LV_LOG_LEVEL_INFO Log important events - *LV_LOG_LEVEL_WARN Log if something unwanted happened but didn't cause a problem - *LV_LOG_LEVEL_ERROR Only critical issue, when the system may fail - *LV_LOG_LEVEL_USER Only logs added by the user - *LV_LOG_LEVEL_NONE Do not log anything*/ - #define LV_LOG_LEVEL LV_LOG_LEVEL_WARN - - /*1: Print the log with 'printf'; - *0: User need to register a callback with `lv_log_register_print_cb()`*/ - #define LV_LOG_PRINTF 0 - - /*1: Enable print timestamp; - *0: Disable print timestamp*/ - #define LV_LOG_USE_TIMESTAMP 1 - - /*1: Print file and line number of the log; - *0: Do not print file and line number of the log*/ - #define LV_LOG_USE_FILE_LINE 1 - - /*Enable/disable LV_LOG_TRACE in modules that produces a huge number of logs*/ - #define LV_LOG_TRACE_MEM 1 - #define LV_LOG_TRACE_TIMER 1 - #define LV_LOG_TRACE_INDEV 1 - #define LV_LOG_TRACE_DISP_REFR 1 - #define LV_LOG_TRACE_EVENT 1 - #define LV_LOG_TRACE_OBJ_CREATE 1 - #define LV_LOG_TRACE_LAYOUT 1 - #define LV_LOG_TRACE_ANIM 1 - #define LV_LOG_TRACE_CACHE 1 - -#endif /*LV_USE_LOG*/ - -/*------------- - * Asserts - *-----------*/ - -/*Enable asserts if an operation is failed or an invalid data is found. - *If LV_USE_LOG is enabled an error message will be printed on failure*/ -#define LV_USE_ASSERT_NULL 1 /*Check if the parameter is NULL. (Very fast, recommended)*/ -#define LV_USE_ASSERT_MALLOC 1 /*Checks is the memory is successfully allocated or no. (Very fast, recommended)*/ -#define LV_USE_ASSERT_STYLE 0 /*Check if the styles are properly initialized. (Very fast, recommended)*/ -#define LV_USE_ASSERT_MEM_INTEGRITY 0 /*Check the integrity of `lv_mem` after critical operations. (Slow)*/ -#define LV_USE_ASSERT_OBJ 0 /*Check the object's type and existence (e.g. not deleted). (Slow)*/ - -/*Add a custom handler when assert happens e.g. to restart the MCU*/ -#define LV_ASSERT_HANDLER_INCLUDE -#define LV_ASSERT_HANDLER while(1); /*Halt by default*/ - -/*------------- - * Debug - *-----------*/ - -/*1: Draw random colored rectangles over the redrawn areas*/ -#define LV_USE_REFR_DEBUG 0 - -/*1: Draw a red overlay for ARGB layers and a green overlay for RGB layers*/ -#define LV_USE_LAYER_DEBUG 0 - -/*1: Draw overlays with different colors for each draw_unit's tasks. - *Also add the index number of the draw unit on white background. - *For layers add the index number of the draw unit on black background.*/ -#define LV_USE_PARALLEL_DRAW_DEBUG 0 - -/*------------- - * Others - *-----------*/ - -#define LV_ENABLE_GLOBAL_CUSTOM 0 -#if LV_ENABLE_GLOBAL_CUSTOM - /*Header to include for the custom 'lv_global' function"*/ - #define LV_GLOBAL_CUSTOM_INCLUDE -#endif - -/*Default cache size in bytes. - *Used by image decoders such as `lv_lodepng` to keep the decoded image in the memory. - *If size is not set to 0, the decoder will fail to decode when the cache is full. - *If size is 0, the cache function is not enabled and the decoded mem will be released immediately after use.*/ -#define LV_CACHE_DEF_SIZE 0 - -/*Default number of image header cache entries. The cache is used to store the headers of images - *The main logic is like `LV_CACHE_DEF_SIZE` but for image headers.*/ -#define LV_IMAGE_HEADER_CACHE_DEF_CNT 0 - -/*Number of stops allowed per gradient. Increase this to allow more stops. - *This adds (sizeof(lv_color_t) + 1) bytes per additional stop*/ -#define LV_GRADIENT_MAX_STOPS 2 - -/* Adjust color mix functions rounding. GPUs might calculate color mix (blending) differently. - * 0: round down, 64: round up from x.75, 128: round up from half, 192: round up from x.25, 254: round up */ -#define LV_COLOR_MIX_ROUND_OFS 0 - -/* Add 2 x 32 bit variables to each lv_obj_t to speed up getting style properties */ -#define LV_OBJ_STYLE_CACHE 0 - -/* Add `id` field to `lv_obj_t` */ -#define LV_USE_OBJ_ID 0 - -/* Use lvgl builtin method for obj ID */ -#define LV_USE_OBJ_ID_BUILTIN 0 - -/*Use obj property set/get API*/ -#define LV_USE_OBJ_PROPERTY 0 - -/* VG-Lite Simulator */ -/*Requires: LV_USE_THORVG_INTERNAL or LV_USE_THORVG_EXTERNAL */ -#define LV_USE_VG_LITE_THORVG 0 - -#if LV_USE_VG_LITE_THORVG - - /*Enable LVGL's blend mode support*/ - #define LV_VG_LITE_THORVG_LVGL_BLEND_SUPPORT 0 - - /*Enable YUV color format support*/ - #define LV_VG_LITE_THORVG_YUV_SUPPORT 0 - - /*Enable 16 pixels alignment*/ - #define LV_VG_LITE_THORVG_16PIXELS_ALIGN 1 - - /*Enable multi-thread render*/ - #define LV_VG_LITE_THORVG_THREAD_RENDER 0 - -#endif - -/*===================== - * COMPILER SETTINGS - *====================*/ - -/*For big endian systems set to 1*/ -#define LV_BIG_ENDIAN_SYSTEM 0 - -/*Define a custom attribute to `lv_tick_inc` function*/ -#define LV_ATTRIBUTE_TICK_INC - -/*Define a custom attribute to `lv_timer_handler` function*/ -#define LV_ATTRIBUTE_TIMER_HANDLER - -/*Define a custom attribute to `lv_display_flush_ready` function*/ -#define LV_ATTRIBUTE_FLUSH_READY - -/*Required alignment size for buffers*/ -#define LV_ATTRIBUTE_MEM_ALIGN_SIZE 1 - -/*Will be added where memories needs to be aligned (with -Os data might not be aligned to boundary by default). - * E.g. __attribute__((aligned(4)))*/ -#define LV_ATTRIBUTE_MEM_ALIGN - -/*Attribute to mark large constant arrays for example font's bitmaps*/ -#define LV_ATTRIBUTE_LARGE_CONST - -/*Compiler prefix for a big array declaration in RAM*/ -#define LV_ATTRIBUTE_LARGE_RAM_ARRAY - -/*Place performance critical functions into a faster memory (e.g RAM)*/ -#define LV_ATTRIBUTE_FAST_MEM - -/*Export integer constant to binding. This macro is used with constants in the form of LV_ that - *should also appear on LVGL binding API such as Micropython.*/ -#define LV_EXPORT_CONST_INT(int_value) struct _silence_gcc_warning /*The default value just prevents GCC warning*/ - -/*Prefix all global extern data with this*/ -#define LV_ATTRIBUTE_EXTERN_DATA - -/* Use `float` as `lv_value_precise_t` */ -#define LV_USE_FLOAT 0 - -/*================== - * FONT USAGE - *===================*/ - -/*Montserrat fonts with ASCII range and some symbols using bpp = 4 - *https://fonts.google.com/specimen/Montserrat*/ -#define LV_FONT_MONTSERRAT_8 0 -#define LV_FONT_MONTSERRAT_10 0 -#define LV_FONT_MONTSERRAT_12 0 -#define LV_FONT_MONTSERRAT_14 1 -#define LV_FONT_MONTSERRAT_16 0 -#define LV_FONT_MONTSERRAT_18 0 -#define LV_FONT_MONTSERRAT_20 0 -#define LV_FONT_MONTSERRAT_22 0 -#define LV_FONT_MONTSERRAT_24 0 -#define LV_FONT_MONTSERRAT_26 0 -#define LV_FONT_MONTSERRAT_28 0 -#define LV_FONT_MONTSERRAT_30 0 -#define LV_FONT_MONTSERRAT_32 0 -#define LV_FONT_MONTSERRAT_34 0 -#define LV_FONT_MONTSERRAT_36 0 -#define LV_FONT_MONTSERRAT_38 0 -#define LV_FONT_MONTSERRAT_40 0 -#define LV_FONT_MONTSERRAT_42 0 -#define LV_FONT_MONTSERRAT_44 0 -#define LV_FONT_MONTSERRAT_46 0 -#define LV_FONT_MONTSERRAT_48 0 - -/*Demonstrate special features*/ -#define LV_FONT_MONTSERRAT_28_COMPRESSED 0 /*bpp = 3*/ -#define LV_FONT_DEJAVU_16_PERSIAN_HEBREW 0 /*Hebrew, Arabic, Persian letters and all their forms*/ -#define LV_FONT_SIMSUN_16_CJK 0 /*1000 most common CJK radicals*/ - -/*Pixel perfect monospace fonts*/ -#define LV_FONT_UNSCII_8 0 -#define LV_FONT_UNSCII_16 0 - -/*Optionally declare custom fonts here. - *You can use these fonts as default font too and they will be available globally. - *E.g. #define LV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(my_font_1) LV_FONT_DECLARE(my_font_2)*/ -#define LV_FONT_CUSTOM_DECLARE - -/*Always set a default font*/ -#define LV_FONT_DEFAULT &lv_font_montserrat_14 - -/*Enable handling large font and/or fonts with a lot of characters. - *The limit depends on the font size, font face and bpp. - *Compiler error will be triggered if a font needs it.*/ -#define LV_FONT_FMT_TXT_LARGE 0 - -/*Enables/disables support for compressed fonts.*/ -#define LV_USE_FONT_COMPRESSED 0 - -/*Enable drawing placeholders when glyph dsc is not found*/ -#define LV_USE_FONT_PLACEHOLDER 1 - -/*================= - * TEXT SETTINGS - *=================*/ - -/** - * Select a character encoding for strings. - * Your IDE or editor should have the same character encoding - * - LV_TXT_ENC_UTF8 - * - LV_TXT_ENC_ASCII - */ -#define LV_TXT_ENC LV_TXT_ENC_UTF8 - -/*Can break (wrap) texts on these chars*/ -#define LV_TXT_BREAK_CHARS " ,.;:-_)]}" - -/*If a word is at least this long, will break wherever "prettiest" - *To disable, set to a value <= 0*/ -#define LV_TXT_LINE_BREAK_LONG_LEN 0 - -/*Minimum number of characters in a long word to put on a line before a break. - *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/ -#define LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN 3 - -/*Minimum number of characters in a long word to put on a line after a break. - *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/ -#define LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN 3 - -/*Support bidirectional texts. Allows mixing Left-to-Right and Right-to-Left texts. - *The direction will be processed according to the Unicode Bidirectional Algorithm: - *https://www.w3.org/International/articles/inline-bidi-markup/uba-basics*/ -#define LV_USE_BIDI 0 -#if LV_USE_BIDI - /*Set the default direction. Supported values: - *`LV_BASE_DIR_LTR` Left-to-Right - *`LV_BASE_DIR_RTL` Right-to-Left - *`LV_BASE_DIR_AUTO` detect texts base direction*/ - #define LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_AUTO -#endif - -/*Enable Arabic/Persian processing - *In these languages characters should be replaced with an other form based on their position in the text*/ -#define LV_USE_ARABIC_PERSIAN_CHARS 0 - -/*================== - * WIDGETS - *================*/ - -/*Documentation of the widgets: https://docs.lvgl.io/latest/en/html/widgets/index.html*/ - -#define LV_WIDGETS_HAS_DEFAULT_VALUE 1 - -#define LV_USE_ANIMIMG 1 - -#define LV_USE_ARC 1 - -#define LV_USE_BAR 1 - -#define LV_USE_BUTTON 1 - -#define LV_USE_BUTTONMATRIX 1 - -#define LV_USE_CALENDAR 1 -#if LV_USE_CALENDAR - #define LV_CALENDAR_WEEK_STARTS_MONDAY 0 - #if LV_CALENDAR_WEEK_STARTS_MONDAY - #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"} - #else - #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"} - #endif - - #define LV_CALENDAR_DEFAULT_MONTH_NAMES {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"} - #define LV_USE_CALENDAR_HEADER_ARROW 1 - #define LV_USE_CALENDAR_HEADER_DROPDOWN 1 -#endif /*LV_USE_CALENDAR*/ - -#define LV_USE_CANVAS 1 - -#define LV_USE_CHART 1 - -#define LV_USE_CHECKBOX 1 - -#define LV_USE_DROPDOWN 1 /*Requires: lv_label*/ - -#define LV_USE_IMAGE 1 /*Requires: lv_label*/ - -#define LV_USE_IMAGEBUTTON 1 - -#define LV_USE_KEYBOARD 1 - -#define LV_USE_LABEL 1 -#if LV_USE_LABEL - #define LV_LABEL_TEXT_SELECTION 1 /*Enable selecting text of the label*/ - #define LV_LABEL_LONG_TXT_HINT 1 /*Store some extra info in labels to speed up drawing of very long texts*/ - #define LV_LABEL_WAIT_CHAR_COUNT 3 /*The count of wait chart*/ -#endif - -#define LV_USE_LED 1 - -#define LV_USE_LINE 1 - -#define LV_USE_LIST 1 - -#define LV_USE_MENU 1 - -#define LV_USE_MSGBOX 1 - -#define LV_USE_ROLLER 1 /*Requires: lv_label*/ - -#define LV_USE_SCALE 1 - -#define LV_USE_SLIDER 1 /*Requires: lv_bar*/ - -#define LV_USE_SPAN 1 -#if LV_USE_SPAN - /*A line text can contain maximum num of span descriptor */ - #define LV_SPAN_SNIPPET_STACK_SIZE 64 -#endif - -#define LV_USE_SPINBOX 1 - -#define LV_USE_SPINNER 1 - -#define LV_USE_SWITCH 1 - -#define LV_USE_TEXTAREA 1 /*Requires: lv_label*/ -#if LV_USE_TEXTAREA != 0 - #define LV_TEXTAREA_DEF_PWD_SHOW_TIME 1500 /*ms*/ -#endif - -#define LV_USE_TABLE 1 - -#define LV_USE_TABVIEW 1 - -#define LV_USE_TILEVIEW 1 - -#define LV_USE_WIN 1 - -/*================== - * THEMES - *==================*/ - -/*A simple, impressive and very complete theme*/ -#define LV_USE_THEME_DEFAULT 1 -#if LV_USE_THEME_DEFAULT - - /*0: Light mode; 1: Dark mode*/ - #define LV_THEME_DEFAULT_DARK 0 - - /*1: Enable grow on press*/ - #define LV_THEME_DEFAULT_GROW 1 - - /*Default transition time in [ms]*/ - #define LV_THEME_DEFAULT_TRANSITION_TIME 80 -#endif /*LV_USE_THEME_DEFAULT*/ - -/*A very simple theme that is a good starting point for a custom theme*/ -#define LV_USE_THEME_SIMPLE 1 - -/*A theme designed for monochrome displays*/ -#define LV_USE_THEME_MONO 1 - -/*================== - * LAYOUTS - *==================*/ - -/*A layout similar to Flexbox in CSS.*/ -#define LV_USE_FLEX 1 - -/*A layout similar to Grid in CSS.*/ -#define LV_USE_GRID 1 - -/*==================== - * 3RD PARTS LIBRARIES - *====================*/ - -/*File system interfaces for common APIs */ - -/*API for fopen, fread, etc*/ -#define LV_USE_FS_STDIO 0 -#if LV_USE_FS_STDIO - #define LV_FS_STDIO_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ - #define LV_FS_STDIO_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ - #define LV_FS_STDIO_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ -#endif - -/*API for open, read, etc*/ -#define LV_USE_FS_POSIX 0 -#if LV_USE_FS_POSIX - #define LV_FS_POSIX_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ - #define LV_FS_POSIX_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ - #define LV_FS_POSIX_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ -#endif - -/*API for CreateFile, ReadFile, etc*/ -#define LV_USE_FS_WIN32 0 -#if LV_USE_FS_WIN32 - #define LV_FS_WIN32_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ - #define LV_FS_WIN32_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ - #define LV_FS_WIN32_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ -#endif - -/*API for FATFS (needs to be added separately). Uses f_open, f_read, etc*/ -#define LV_USE_FS_FATFS 0 -#if LV_USE_FS_FATFS - #define LV_FS_FATFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ - #define LV_FS_FATFS_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ -#endif - -/*API for memory-mapped file access. */ -#define LV_USE_FS_MEMFS 0 -#if LV_USE_FS_MEMFS - #define LV_FS_MEMFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ -#endif - -/*LODEPNG decoder library*/ -#define LV_USE_LODEPNG 0 - -/*PNG decoder(libpng) library*/ -#define LV_USE_LIBPNG 0 - -/*BMP decoder library*/ -#define LV_USE_BMP 0 - -/* JPG + split JPG decoder library. - * Split JPG is a custom format optimized for embedded systems. */ -#define LV_USE_TJPGD 0 - -/* libjpeg-turbo decoder library. - * Supports complete JPEG specifications and high-performance JPEG decoding. */ -#define LV_USE_LIBJPEG_TURBO 0 - -/*GIF decoder library*/ -#define LV_USE_GIF 0 -#if LV_USE_GIF -/*GIF decoder accelerate*/ -#define LV_GIF_CACHE_DECODE_DATA 0 -#endif - - -/*Decode bin images to RAM*/ -#define LV_BIN_DECODER_RAM_LOAD 0 - -/*RLE decompress library*/ -#define LV_USE_RLE 0 - -/*QR code library*/ -#define LV_USE_QRCODE 0 - -/*Barcode code library*/ -#define LV_USE_BARCODE 0 - -/*FreeType library*/ -#define LV_USE_FREETYPE 0 -#if LV_USE_FREETYPE - /*Memory used by FreeType to cache characters in kilobytes*/ - #define LV_FREETYPE_CACHE_SIZE 768 - - /*Let FreeType to use LVGL memory and file porting*/ - #define LV_FREETYPE_USE_LVGL_PORT 0 - - /* Maximum number of opened FT_Face/FT_Size objects managed by this cache instance. */ - /* (0:use system defaults) */ - #define LV_FREETYPE_CACHE_FT_FACES 8 - #define LV_FREETYPE_CACHE_FT_SIZES 8 - #define LV_FREETYPE_CACHE_FT_GLYPH_CNT 256 -#endif - -/* Built-in TTF decoder */ -#define LV_USE_TINY_TTF 0 -#if LV_USE_TINY_TTF - /* Enable loading TTF data from files */ - #define LV_TINY_TTF_FILE_SUPPORT 0 -#endif - -/*Rlottie library*/ -#define LV_USE_RLOTTIE 0 - -/*Enable Vector Graphic APIs*/ -#define LV_USE_VECTOR_GRAPHIC 0 - -/* Enable ThorVG (vector graphics library) from the src/libs folder */ -#define LV_USE_THORVG_INTERNAL 0 - -/* Enable ThorVG by assuming that its installed and linked to the project */ -#define LV_USE_THORVG_EXTERNAL 0 - -/*Enable LZ4 compress/decompress lib*/ -#define LV_USE_LZ4 0 - -/*Use lvgl built-in LZ4 lib*/ -#define LV_USE_LZ4_INTERNAL 0 - -/*Use external LZ4 library*/ -#define LV_USE_LZ4_EXTERNAL 0 - -/*FFmpeg library for image decoding and playing videos - *Supports all major image formats so do not enable other image decoder with it*/ -#define LV_USE_FFMPEG 0 -#if LV_USE_FFMPEG - /*Dump input information to stderr*/ - #define LV_FFMPEG_DUMP_FORMAT 0 -#endif - -/*================== - * OTHERS - *==================*/ - -/*1: Enable API to take snapshot for object*/ -#define LV_USE_SNAPSHOT 0 - -/*1: Enable system monitor component*/ -#define LV_USE_SYSMON 0 -#if LV_USE_SYSMON - /*Get the idle percentage. E.g. uint32_t my_get_idle(void);*/ - #define LV_SYSMON_GET_IDLE lv_timer_get_idle - - /*1: Show CPU usage and FPS count - * Requires `LV_USE_SYSMON = 1`*/ - #define LV_USE_PERF_MONITOR 0 - #if LV_USE_PERF_MONITOR - #define LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT - - /*0: Displays performance data on the screen, 1: Prints performance data using log.*/ - #define LV_USE_PERF_MONITOR_LOG_MODE 0 - #endif - - /*1: Show the used memory and the memory fragmentation - * Requires `LV_USE_BUILTIN_MALLOC = 1` - * Requires `LV_USE_SYSMON = 1`*/ - #define LV_USE_MEM_MONITOR 0 - #if LV_USE_MEM_MONITOR - #define LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_LEFT - #endif - -#endif /*LV_USE_SYSMON*/ - -/*1: Enable the runtime performance profiler*/ -#define LV_USE_PROFILER 0 -#if LV_USE_PROFILER - /*1: Enable the built-in profiler*/ - #define LV_USE_PROFILER_BUILTIN 1 - #if LV_USE_PROFILER_BUILTIN - /*Default profiler trace buffer size*/ - #define LV_PROFILER_BUILTIN_BUF_SIZE (16 * 1024) /*[bytes]*/ - #endif - - /*Header to include for the profiler*/ - #define LV_PROFILER_INCLUDE "lvgl/src/misc/lv_profiler_builtin.h" - - /*Profiler start point function*/ - #define LV_PROFILER_BEGIN LV_PROFILER_BUILTIN_BEGIN - - /*Profiler end point function*/ - #define LV_PROFILER_END LV_PROFILER_BUILTIN_END - - /*Profiler start point function with custom tag*/ - #define LV_PROFILER_BEGIN_TAG LV_PROFILER_BUILTIN_BEGIN_TAG - - /*Profiler end point function with custom tag*/ - #define LV_PROFILER_END_TAG LV_PROFILER_BUILTIN_END_TAG -#endif - -/*1: Enable Monkey test*/ -#define LV_USE_MONKEY 0 - -/*1: Enable grid navigation*/ -#define LV_USE_GRIDNAV 0 - -/*1: Enable lv_obj fragment*/ -#define LV_USE_FRAGMENT 0 - -/*1: Support using images as font in label or span widgets */ -#define LV_USE_IMGFONT 0 - -/*1: Enable an observer pattern implementation*/ -#define LV_USE_OBSERVER 1 - -/*1: Enable Pinyin input method*/ -/*Requires: lv_keyboard*/ -#define LV_USE_IME_PINYIN 0 -#if LV_USE_IME_PINYIN - /*1: Use default thesaurus*/ - /*If you do not use the default thesaurus, be sure to use `lv_ime_pinyin` after setting the thesauruss*/ - #define LV_IME_PINYIN_USE_DEFAULT_DICT 1 - /*Set the maximum number of candidate panels that can be displayed*/ - /*This needs to be adjusted according to the size of the screen*/ - #define LV_IME_PINYIN_CAND_TEXT_NUM 6 - - /*Use 9 key input(k9)*/ - #define LV_IME_PINYIN_USE_K9_MODE 1 - #if LV_IME_PINYIN_USE_K9_MODE == 1 - #define LV_IME_PINYIN_K9_CAND_TEXT_NUM 3 - #endif /*LV_IME_PINYIN_USE_K9_MODE*/ -#endif - -/*1: Enable file explorer*/ -/*Requires: lv_table*/ -#define LV_USE_FILE_EXPLORER 0 -#if LV_USE_FILE_EXPLORER - /*Maximum length of path*/ - #define LV_FILE_EXPLORER_PATH_MAX_LEN (128) - /*Quick access bar, 1:use, 0:not use*/ - /*Requires: lv_list*/ - #define LV_FILE_EXPLORER_QUICK_ACCESS 1 -#endif - -/*================== - * DEVICES - *==================*/ - -/*Use SDL to open window on PC and handle mouse and keyboard*/ -#define LV_USE_SDL 0 -#if LV_USE_SDL - #define LV_SDL_INCLUDE_PATH - #define LV_SDL_RENDER_MODE LV_DISPLAY_RENDER_MODE_DIRECT /*LV_DISPLAY_RENDER_MODE_DIRECT is recommended for best performance*/ - #define LV_SDL_BUF_COUNT 1 /*1 or 2*/ - #define LV_SDL_FULLSCREEN 0 /*1: Make the window full screen by default*/ - #define LV_SDL_DIRECT_EXIT 1 /*1: Exit the application when all SDL windows are closed*/ -#endif - -/*Use X11 to open window on Linux desktop and handle mouse and keyboard*/ -#define LV_USE_X11 0 -#if LV_USE_X11 - #define LV_X11_DIRECT_EXIT 1 /*Exit the application when all X11 windows have been closed*/ - #define LV_X11_DOUBLE_BUFFER 1 /*Use double buffers for endering*/ - /*select only 1 of the following render modes (LV_X11_RENDER_MODE_PARTIAL preferred!)*/ - #define LV_X11_RENDER_MODE_PARTIAL 1 /*Partial render mode (preferred)*/ - #define LV_X11_RENDER_MODE_DIRECT 0 /*direct render mode*/ - #define LV_X11_RENDER_MODE_FULL 0 /*Full render mode*/ -#endif - -/*Driver for /dev/fb*/ -#define LV_USE_LINUX_FBDEV 0 -#if LV_USE_LINUX_FBDEV - #define LV_LINUX_FBDEV_BSD 0 - #define LV_LINUX_FBDEV_RENDER_MODE LV_DISPLAY_RENDER_MODE_PARTIAL - #define LV_LINUX_FBDEV_BUFFER_COUNT 0 - #define LV_LINUX_FBDEV_BUFFER_SIZE 60 -#endif - -/*Use Nuttx to open window and handle touchscreen*/ -#define LV_USE_NUTTX 0 - -#if LV_USE_NUTTX - #define LV_USE_NUTTX_LIBUV 0 - - /*Use Nuttx custom init API to open window and handle touchscreen*/ - #define LV_USE_NUTTX_CUSTOM_INIT 0 - - /*Driver for /dev/lcd*/ - #define LV_USE_NUTTX_LCD 0 - #if LV_USE_NUTTX_LCD - #define LV_NUTTX_LCD_BUFFER_COUNT 0 - #define LV_NUTTX_LCD_BUFFER_SIZE 60 - #endif - - /*Driver for /dev/input*/ - #define LV_USE_NUTTX_TOUCHSCREEN 0 - -#endif - -/*Driver for /dev/dri/card*/ -#define LV_USE_LINUX_DRM 0 - -/*Interface for TFT_eSPI*/ -#define LV_USE_TFT_ESPI 0 - -/*Driver for evdev input devices*/ -#define LV_USE_EVDEV 0 - -/*Driver for libinput input devices*/ -#define LV_USE_LIBINPUT 0 - -#if LV_USE_LIBINPUT - #define LV_LIBINPUT_BSD 0 - - /*Full keyboard support*/ - #define LV_LIBINPUT_XKB 0 - #if LV_LIBINPUT_XKB - /*"setxkbmap -query" can help find the right values for your keyboard*/ - #define LV_LIBINPUT_XKB_KEY_MAP { .rules = NULL, .model = "pc101", .layout = "us", .variant = NULL, .options = NULL } - #endif -#endif - -/*Drivers for LCD devices connected via SPI/parallel port*/ -#define LV_USE_ST7735 0 -#define LV_USE_ST7789 0 -#define LV_USE_ST7796 0 -#define LV_USE_ILI9341 0 - -#define LV_USE_GENERIC_MIPI (LV_USE_ST7735 | LV_USE_ST7789 | LV_USE_ST7796 | LV_USE_ILI9341) - -/* LVGL Windows backend */ -#define LV_USE_WINDOWS 0 - -/*================== -* EXAMPLES -*==================*/ - -/*Enable the examples to be built with the library*/ -#define LV_BUILD_EXAMPLES 1 - -/*=================== - * DEMO USAGE - ====================*/ - -/*Show some widget. It might be required to increase `LV_MEM_SIZE` */ -#define LV_USE_DEMO_WIDGETS 0 - -/*Demonstrate the usage of encoder and keyboard*/ -#define LV_USE_DEMO_KEYPAD_AND_ENCODER 0 - -/*Benchmark your system*/ -#define LV_USE_DEMO_BENCHMARK 0 - -/*Render test for each primitives. Requires at least 480x272 display*/ -#define LV_USE_DEMO_RENDER 0 - -/*Stress test for LVGL*/ -#define LV_USE_DEMO_STRESS 0 - -/*Music player demo*/ -#define LV_USE_DEMO_MUSIC 0 -#if LV_USE_DEMO_MUSIC - #define LV_DEMO_MUSIC_SQUARE 0 - #define LV_DEMO_MUSIC_LANDSCAPE 0 - #define LV_DEMO_MUSIC_ROUND 0 - #define LV_DEMO_MUSIC_LARGE 0 - #define LV_DEMO_MUSIC_AUTO_PLAY 0 -#endif - -/*Flex layout demo*/ -#define LV_USE_DEMO_FLEX_LAYOUT 0 - -/*Smart-phone like multi-language demo*/ -#define LV_USE_DEMO_MULTILANG 0 - -/*Widget transformation demo*/ -#define LV_USE_DEMO_TRANSFORM 0 - -/*Demonstrate scroll settings*/ -#define LV_USE_DEMO_SCROLL 0 - -/*Vector graphic demo*/ -#define LV_USE_DEMO_VECTOR_GRAPHIC 0 -/*--END OF LV_CONF_H--*/ - -#endif /*LV_CONF_H*/ - -#endif /*End of "Content enable"*/ +//#if (LVGL_VERSION_MAJOR == 9) +// TODO: find a way to autodiscover lvgl version +#if (0) +#include "lv_conf_9.h" +#else +#include "lv_conf_8.h" +#endif \ No newline at end of file diff --git a/libraries/Arduino_H7_Video/src/lv_conf_8.h b/libraries/Arduino_H7_Video/src/lv_conf_8.h new file mode 100644 index 000000000..c69b43e27 --- /dev/null +++ b/libraries/Arduino_H7_Video/src/lv_conf_8.h @@ -0,0 +1,762 @@ +/** + * @file lv_conf.h + * Configuration file for v8.3.5 + */ + +/* + * Copy this file as `lv_conf.h` + * 1. simply next to the `lvgl` folder + * 2. or any other places and + * - define `LV_CONF_INCLUDE_SIMPLE` + * - add the path as include path + */ + +/* clang-format off */ +#if 1 /*Set it to "1" to enable content*/ + +#ifndef LV_CONF_H +#define LV_CONF_H + +#include + +/*==================== + COLOR SETTINGS + *====================*/ + +/*Color depth: 1 (1 byte per pixel), 8 (RGB332), 16 (RGB565), 32 (ARGB8888)*/ +#define LV_COLOR_DEPTH 16 + +/*Swap the 2 bytes of RGB565 color. Useful if the display has an 8-bit interface (e.g. SPI)*/ +#define LV_COLOR_16_SWAP 0 + +/*Enable features to draw on transparent background. + *It's required if opa, and transform_* style properties are used. + *Can be also used if the UI is above another layer, e.g. an OSD menu or video player.*/ +#define LV_COLOR_SCREEN_TRANSP 0 + +/* Adjust color mix functions rounding. GPUs might calculate color mix (blending) differently. + * 0: round down, 64: round up from x.75, 128: round up from half, 192: round up from x.25, 254: round up */ +#define LV_COLOR_MIX_ROUND_OFS 0 + +/*Images pixels with this color will not be drawn if they are chroma keyed)*/ +#define LV_COLOR_CHROMA_KEY lv_color_hex(0x00ff00) /*pure green*/ + +/*========================= + MEMORY SETTINGS + *=========================*/ + +/*1: use custom malloc/free, 0: use the built-in `lv_mem_alloc()` and `lv_mem_free()`*/ +#define LV_MEM_CUSTOM 0 +#if LV_MEM_CUSTOM == 0 + /*Size of the memory available for `lv_mem_alloc()` in bytes (>= 2kB)*/ + #define LV_MEM_SIZE (48U * 1024U) /*[bytes]*/ + + /*Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too.*/ + #define LV_MEM_ADR 0 /*0: unused*/ + /*Instead of an address give a memory allocator that will be called to get a memory pool for LVGL. E.g. my_malloc*/ + #if LV_MEM_ADR == 0 + #undef LV_MEM_POOL_INCLUDE + #undef LV_MEM_POOL_ALLOC + #endif + +#else /*LV_MEM_CUSTOM*/ + #define LV_MEM_CUSTOM_INCLUDE /*Header for the dynamic memory function*/ + #define LV_MEM_CUSTOM_ALLOC malloc + #define LV_MEM_CUSTOM_FREE free + #define LV_MEM_CUSTOM_REALLOC realloc +#endif /*LV_MEM_CUSTOM*/ + +/*Number of the intermediate memory buffer used during rendering and other internal processing mechanisms. + *You will see an error log message if there wasn't enough buffers. */ +#define LV_MEM_BUF_MAX_NUM 16 + +/*Use the standard `memcpy` and `memset` instead of LVGL's own functions. (Might or might not be faster).*/ +#define LV_MEMCPY_MEMSET_STD 0 + +/*==================== + HAL SETTINGS + *====================*/ + +/*Default display refresh period. LVG will redraw changed areas with this period time*/ +#define LV_DISP_DEF_REFR_PERIOD 30 /*[ms]*/ + +/*Input device read period in milliseconds*/ +#define LV_INDEV_DEF_READ_PERIOD 30 /*[ms]*/ + +/*Use a custom tick source that tells the elapsed time in milliseconds. + *It removes the need to manually update the tick with `lv_tick_inc()`)*/ +#define LV_TICK_CUSTOM 1 +#if LV_TICK_CUSTOM + #define LV_TICK_CUSTOM_INCLUDE "Arduino.h" /*Header for the system time function*/ + #define LV_TICK_CUSTOM_SYS_TIME_EXPR (millis()) /*Expression evaluating to current system time in ms*/ + /*If using lvgl as ESP32 component*/ + // #define LV_TICK_CUSTOM_INCLUDE "esp_timer.h" + // #define LV_TICK_CUSTOM_SYS_TIME_EXPR ((esp_timer_get_time() / 1000LL)) +#endif /*LV_TICK_CUSTOM*/ + +/*Default Dot Per Inch. Used to initialize default sizes such as widgets sized, style paddings. + *(Not so important, you can adjust it to modify default sizes and spaces)*/ +#define LV_DPI_DEF 130 /*[px/inch]*/ + +/*======================= + * FEATURE CONFIGURATION + *=======================*/ + +/*------------- + * Drawing + *-----------*/ + +/*Enable complex draw engine. + *Required to draw shadow, gradient, rounded corners, circles, arc, skew lines, image transformations or any masks*/ +#define LV_DRAW_COMPLEX 1 +#if LV_DRAW_COMPLEX != 0 + + /*Allow buffering some shadow calculation. + *LV_SHADOW_CACHE_SIZE is the max. shadow size to buffer, where shadow size is `shadow_width + radius` + *Caching has LV_SHADOW_CACHE_SIZE^2 RAM cost*/ + #define LV_SHADOW_CACHE_SIZE 0 + + /* Set number of maximally cached circle data. + * The circumference of 1/4 circle are saved for anti-aliasing + * radius * 4 bytes are used per circle (the most often used radiuses are saved) + * 0: to disable caching */ + #define LV_CIRCLE_CACHE_SIZE 4 +#endif /*LV_DRAW_COMPLEX*/ + +/** + * "Simple layers" are used when a widget has `style_opa < 255` to buffer the widget into a layer + * and blend it as an image with the given opacity. + * Note that `bg_opa`, `text_opa` etc don't require buffering into layer) + * The widget can be buffered in smaller chunks to avoid using large buffers. + * + * - LV_LAYER_SIMPLE_BUF_SIZE: [bytes] the optimal target buffer size. LVGL will try to allocate it + * - LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE: [bytes] used if `LV_LAYER_SIMPLE_BUF_SIZE` couldn't be allocated. + * + * Both buffer sizes are in bytes. + * "Transformed layers" (where transform_angle/zoom properties are used) use larger buffers + * and can't be drawn in chunks. So these settings affects only widgets with opacity. + */ +#define LV_LAYER_SIMPLE_BUF_SIZE (24 * 1024) +#define LV_LAYER_SIMPLE_FALLBACK_BUF_SIZE (3 * 1024) + +/*Default image cache size. Image caching keeps the images opened. + *If only the built-in image formats are used there is no real advantage of caching. (I.e. if no new image decoder is added) + *With complex image decoders (e.g. PNG or JPG) caching can save the continuous open/decode of images. + *However the opened images might consume additional RAM. + *0: to disable caching*/ +#define LV_IMG_CACHE_DEF_SIZE 0 + +/*Number of stops allowed per gradient. Increase this to allow more stops. + *This adds (sizeof(lv_color_t) + 1) bytes per additional stop*/ +#define LV_GRADIENT_MAX_STOPS 2 + +/*Default gradient buffer size. + *When LVGL calculates the gradient "maps" it can save them into a cache to avoid calculating them again. + *LV_GRAD_CACHE_DEF_SIZE sets the size of this cache in bytes. + *If the cache is too small the map will be allocated only while it's required for the drawing. + *0 mean no caching.*/ +#define LV_GRAD_CACHE_DEF_SIZE 0 + +/*Allow dithering the gradients (to achieve visual smooth color gradients on limited color depth display) + *LV_DITHER_GRADIENT implies allocating one or two more lines of the object's rendering surface + *The increase in memory consumption is (32 bits * object width) plus 24 bits * object width if using error diffusion */ +#define LV_DITHER_GRADIENT 0 +#if LV_DITHER_GRADIENT + /*Add support for error diffusion dithering. + *Error diffusion dithering gets a much better visual result, but implies more CPU consumption and memory when drawing. + *The increase in memory consumption is (24 bits * object's width)*/ + #define LV_DITHER_ERROR_DIFFUSION 0 +#endif + +/*Maximum buffer size to allocate for rotation. + *Only used if software rotation is enabled in the display driver.*/ +#define LV_DISP_ROT_MAX_BUF (10*1024) + +/*------------- + * GPU + *-----------*/ + +/*Use Arm's 2D acceleration library Arm-2D */ +#define LV_USE_GPU_ARM2D 0 + +/*Use STM32's DMA2D (aka Chrom Art) GPU*/ +#define LV_USE_GPU_STM32_DMA2D 0 +#if LV_USE_GPU_STM32_DMA2D + /*Must be defined to include path of CMSIS header of target processor + e.g. "stm32f769xx.h" or "stm32f429xx.h"*/ + #define LV_GPU_DMA2D_CMSIS_INCLUDE +#endif + +/*Use SWM341's DMA2D GPU*/ +#define LV_USE_GPU_SWM341_DMA2D 0 +#if LV_USE_GPU_SWM341_DMA2D + #define LV_GPU_SWM341_DMA2D_INCLUDE "SWM341.h" +#endif + +/*Use NXP's PXP GPU iMX RTxxx platforms*/ +#define LV_USE_GPU_NXP_PXP 0 +#if LV_USE_GPU_NXP_PXP + /*1: Add default bare metal and FreeRTOS interrupt handling routines for PXP (lv_gpu_nxp_pxp_osa.c) + * and call lv_gpu_nxp_pxp_init() automatically during lv_init(). Note that symbol SDK_OS_FREE_RTOS + * has to be defined in order to use FreeRTOS OSA, otherwise bare-metal implementation is selected. + *0: lv_gpu_nxp_pxp_init() has to be called manually before lv_init() + */ + #define LV_USE_GPU_NXP_PXP_AUTO_INIT 0 +#endif + +/*Use NXP's VG-Lite GPU iMX RTxxx platforms*/ +#define LV_USE_GPU_NXP_VG_LITE 0 + +/*Use SDL renderer API*/ +#define LV_USE_GPU_SDL 0 +#if LV_USE_GPU_SDL + #define LV_GPU_SDL_INCLUDE_PATH + /*Texture cache size, 8MB by default*/ + #define LV_GPU_SDL_LRU_SIZE (1024 * 1024 * 8) + /*Custom blend mode for mask drawing, disable if you need to link with older SDL2 lib*/ + #define LV_GPU_SDL_CUSTOM_BLEND_MODE (SDL_VERSION_ATLEAST(2, 0, 6)) +#endif + +/*------------- + * Logging + *-----------*/ + +/*Enable the log module*/ +#define LV_USE_LOG 0 +#if LV_USE_LOG + + /*How important log should be added: + *LV_LOG_LEVEL_TRACE A lot of logs to give detailed information + *LV_LOG_LEVEL_INFO Log important events + *LV_LOG_LEVEL_WARN Log if something unwanted happened but didn't cause a problem + *LV_LOG_LEVEL_ERROR Only critical issue, when the system may fail + *LV_LOG_LEVEL_USER Only logs added by the user + *LV_LOG_LEVEL_NONE Do not log anything*/ + #define LV_LOG_LEVEL LV_LOG_LEVEL_WARN + + /*1: Print the log with 'printf'; + *0: User need to register a callback with `lv_log_register_print_cb()`*/ + #define LV_LOG_PRINTF 0 + + /*Enable/disable LV_LOG_TRACE in modules that produces a huge number of logs*/ + #define LV_LOG_TRACE_MEM 1 + #define LV_LOG_TRACE_TIMER 1 + #define LV_LOG_TRACE_INDEV 1 + #define LV_LOG_TRACE_DISP_REFR 1 + #define LV_LOG_TRACE_EVENT 1 + #define LV_LOG_TRACE_OBJ_CREATE 1 + #define LV_LOG_TRACE_LAYOUT 1 + #define LV_LOG_TRACE_ANIM 1 + +#endif /*LV_USE_LOG*/ + +/*------------- + * Asserts + *-----------*/ + +/*Enable asserts if an operation is failed or an invalid data is found. + *If LV_USE_LOG is enabled an error message will be printed on failure*/ +#define LV_USE_ASSERT_NULL 1 /*Check if the parameter is NULL. (Very fast, recommended)*/ +#define LV_USE_ASSERT_MALLOC 1 /*Checks is the memory is successfully allocated or no. (Very fast, recommended)*/ +#define LV_USE_ASSERT_STYLE 0 /*Check if the styles are properly initialized. (Very fast, recommended)*/ +#define LV_USE_ASSERT_MEM_INTEGRITY 0 /*Check the integrity of `lv_mem` after critical operations. (Slow)*/ +#define LV_USE_ASSERT_OBJ 0 /*Check the object's type and existence (e.g. not deleted). (Slow)*/ + +/*Add a custom handler when assert happens e.g. to restart the MCU*/ +#define LV_ASSERT_HANDLER_INCLUDE +#define LV_ASSERT_HANDLER while(1); /*Halt by default*/ + +/*------------- + * Others + *-----------*/ + +/*1: Show CPU usage and FPS count*/ +#define LV_USE_PERF_MONITOR 0 +#if LV_USE_PERF_MONITOR + #define LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT +#endif + +/*1: Show the used memory and the memory fragmentation + * Requires LV_MEM_CUSTOM = 0*/ +#define LV_USE_MEM_MONITOR 0 +#if LV_USE_MEM_MONITOR + #define LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_LEFT +#endif + +/*1: Draw random colored rectangles over the redrawn areas*/ +#define LV_USE_REFR_DEBUG 0 + +/*Change the built in (v)snprintf functions*/ +#define LV_SPRINTF_CUSTOM 0 +#if LV_SPRINTF_CUSTOM + #define LV_SPRINTF_INCLUDE + #define lv_snprintf snprintf + #define lv_vsnprintf vsnprintf +#else /*LV_SPRINTF_CUSTOM*/ + #define LV_SPRINTF_USE_FLOAT 0 +#endif /*LV_SPRINTF_CUSTOM*/ + +#define LV_USE_USER_DATA 1 + +/*Garbage Collector settings + *Used if lvgl is bound to higher level language and the memory is managed by that language*/ +#define LV_ENABLE_GC 0 +#if LV_ENABLE_GC != 0 + #define LV_GC_INCLUDE "gc.h" /*Include Garbage Collector related things*/ +#endif /*LV_ENABLE_GC*/ + +/*===================== + * COMPILER SETTINGS + *====================*/ + +/*For big endian systems set to 1*/ +#define LV_BIG_ENDIAN_SYSTEM 0 + +/*Define a custom attribute to `lv_tick_inc` function*/ +#define LV_ATTRIBUTE_TICK_INC + +/*Define a custom attribute to `lv_timer_handler` function*/ +#define LV_ATTRIBUTE_TIMER_HANDLER + +/*Define a custom attribute to `lv_disp_flush_ready` function*/ +#define LV_ATTRIBUTE_FLUSH_READY + +/*Required alignment size for buffers*/ +#define LV_ATTRIBUTE_MEM_ALIGN_SIZE 1 + +/*Will be added where memories needs to be aligned (with -Os data might not be aligned to boundary by default). + * E.g. __attribute__((aligned(4)))*/ +#define LV_ATTRIBUTE_MEM_ALIGN + +/*Attribute to mark large constant arrays for example font's bitmaps*/ +#define LV_ATTRIBUTE_LARGE_CONST + +/*Compiler prefix for a big array declaration in RAM*/ +#define LV_ATTRIBUTE_LARGE_RAM_ARRAY + +/*Place performance critical functions into a faster memory (e.g RAM)*/ +#define LV_ATTRIBUTE_FAST_MEM + +/*Prefix variables that are used in GPU accelerated operations, often these need to be placed in RAM sections that are DMA accessible*/ +#define LV_ATTRIBUTE_DMA + +/*Export integer constant to binding. This macro is used with constants in the form of LV_ that + *should also appear on LVGL binding API such as Micropython.*/ +#define LV_EXPORT_CONST_INT(int_value) struct _silence_gcc_warning /*The default value just prevents GCC warning*/ + +/*Extend the default -32k..32k coordinate range to -4M..4M by using int32_t for coordinates instead of int16_t*/ +#define LV_USE_LARGE_COORD 0 + +/*================== + * FONT USAGE + *===================*/ + +/*Montserrat fonts with ASCII range and some symbols using bpp = 4 + *https://fonts.google.com/specimen/Montserrat*/ +#define LV_FONT_MONTSERRAT_8 0 +#define LV_FONT_MONTSERRAT_10 0 +#define LV_FONT_MONTSERRAT_12 0 +#define LV_FONT_MONTSERRAT_14 1 +#define LV_FONT_MONTSERRAT_16 0 +#define LV_FONT_MONTSERRAT_18 0 +#define LV_FONT_MONTSERRAT_20 0 +#define LV_FONT_MONTSERRAT_22 0 +#define LV_FONT_MONTSERRAT_24 0 +#define LV_FONT_MONTSERRAT_26 0 +#define LV_FONT_MONTSERRAT_28 0 +#define LV_FONT_MONTSERRAT_30 0 +#define LV_FONT_MONTSERRAT_32 0 +#define LV_FONT_MONTSERRAT_34 0 +#define LV_FONT_MONTSERRAT_36 0 +#define LV_FONT_MONTSERRAT_38 0 +#define LV_FONT_MONTSERRAT_40 0 +#define LV_FONT_MONTSERRAT_42 0 +#define LV_FONT_MONTSERRAT_44 0 +#define LV_FONT_MONTSERRAT_46 0 +#define LV_FONT_MONTSERRAT_48 0 + +/*Demonstrate special features*/ +#define LV_FONT_MONTSERRAT_12_SUBPX 0 +#define LV_FONT_MONTSERRAT_28_COMPRESSED 0 /*bpp = 3*/ +#define LV_FONT_DEJAVU_16_PERSIAN_HEBREW 0 /*Hebrew, Arabic, Persian letters and all their forms*/ +#define LV_FONT_SIMSUN_16_CJK 0 /*1000 most common CJK radicals*/ + +/*Pixel perfect monospace fonts*/ +#define LV_FONT_UNSCII_8 0 +#define LV_FONT_UNSCII_16 0 + +/*Optionally declare custom fonts here. + *You can use these fonts as default font too and they will be available globally. + *E.g. #define LV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(my_font_1) LV_FONT_DECLARE(my_font_2)*/ +#define LV_FONT_CUSTOM_DECLARE + +/*Always set a default font*/ +#define LV_FONT_DEFAULT &lv_font_montserrat_14 + +/*Enable handling large font and/or fonts with a lot of characters. + *The limit depends on the font size, font face and bpp. + *Compiler error will be triggered if a font needs it.*/ +#define LV_FONT_FMT_TXT_LARGE 0 + +/*Enables/disables support for compressed fonts.*/ +#define LV_USE_FONT_COMPRESSED 0 + +/*Enable subpixel rendering*/ +#define LV_USE_FONT_SUBPX 0 +#if LV_USE_FONT_SUBPX + /*Set the pixel order of the display. Physical order of RGB channels. Doesn't matter with "normal" fonts.*/ + #define LV_FONT_SUBPX_BGR 0 /*0: RGB; 1:BGR order*/ +#endif + +/*Enable drawing placeholders when glyph dsc is not found*/ +#define LV_USE_FONT_PLACEHOLDER 1 + +/*================= + * TEXT SETTINGS + *=================*/ + +/** + * Select a character encoding for strings. + * Your IDE or editor should have the same character encoding + * - LV_TXT_ENC_UTF8 + * - LV_TXT_ENC_ASCII + */ +#define LV_TXT_ENC LV_TXT_ENC_UTF8 + +/*Can break (wrap) texts on these chars*/ +#define LV_TXT_BREAK_CHARS " ,.;:-_" + +/*If a word is at least this long, will break wherever "prettiest" + *To disable, set to a value <= 0*/ +#define LV_TXT_LINE_BREAK_LONG_LEN 0 + +/*Minimum number of characters in a long word to put on a line before a break. + *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/ +#define LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN 3 + +/*Minimum number of characters in a long word to put on a line after a break. + *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/ +#define LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN 3 + +/*The control character to use for signalling text recoloring.*/ +#define LV_TXT_COLOR_CMD "#" + +/*Support bidirectional texts. Allows mixing Left-to-Right and Right-to-Left texts. + *The direction will be processed according to the Unicode Bidirectional Algorithm: + *https://www.w3.org/International/articles/inline-bidi-markup/uba-basics*/ +#define LV_USE_BIDI 0 +#if LV_USE_BIDI + /*Set the default direction. Supported values: + *`LV_BASE_DIR_LTR` Left-to-Right + *`LV_BASE_DIR_RTL` Right-to-Left + *`LV_BASE_DIR_AUTO` detect texts base direction*/ + #define LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_AUTO +#endif + +/*Enable Arabic/Persian processing + *In these languages characters should be replaced with an other form based on their position in the text*/ +#define LV_USE_ARABIC_PERSIAN_CHARS 0 + +/*================== + * WIDGET USAGE + *================*/ + +/*Documentation of the widgets: https://docs.lvgl.io/latest/en/html/widgets/index.html*/ + +#define LV_USE_ARC 1 + +#define LV_USE_BAR 1 + +#define LV_USE_BTN 1 + +#define LV_USE_BTNMATRIX 1 + +#define LV_USE_CANVAS 1 + +#define LV_USE_CHECKBOX 1 + +#define LV_USE_DROPDOWN 1 /*Requires: lv_label*/ + +#define LV_USE_IMG 1 /*Requires: lv_label*/ + +#define LV_USE_LABEL 1 +#if LV_USE_LABEL + #define LV_LABEL_TEXT_SELECTION 1 /*Enable selecting text of the label*/ + #define LV_LABEL_LONG_TXT_HINT 1 /*Store some extra info in labels to speed up drawing of very long texts*/ +#endif + +#define LV_USE_LINE 1 + +#define LV_USE_ROLLER 1 /*Requires: lv_label*/ +#if LV_USE_ROLLER + #define LV_ROLLER_INF_PAGES 7 /*Number of extra "pages" when the roller is infinite*/ +#endif + +#define LV_USE_SLIDER 1 /*Requires: lv_bar*/ + +#define LV_USE_SWITCH 1 + +#define LV_USE_TEXTAREA 1 /*Requires: lv_label*/ +#if LV_USE_TEXTAREA != 0 + #define LV_TEXTAREA_DEF_PWD_SHOW_TIME 1500 /*ms*/ +#endif + +#define LV_USE_TABLE 1 + +/*================== + * EXTRA COMPONENTS + *==================*/ + +/*----------- + * Widgets + *----------*/ +#define LV_USE_ANIMIMG 1 + +#define LV_USE_CALENDAR 1 +#if LV_USE_CALENDAR + #define LV_CALENDAR_WEEK_STARTS_MONDAY 0 + #if LV_CALENDAR_WEEK_STARTS_MONDAY + #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"} + #else + #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"} + #endif + + #define LV_CALENDAR_DEFAULT_MONTH_NAMES {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"} + #define LV_USE_CALENDAR_HEADER_ARROW 1 + #define LV_USE_CALENDAR_HEADER_DROPDOWN 1 +#endif /*LV_USE_CALENDAR*/ + +#define LV_USE_CHART 1 + +#define LV_USE_COLORWHEEL 1 + +#define LV_USE_IMGBTN 1 + +#define LV_USE_KEYBOARD 1 + +#define LV_USE_LED 1 + +#define LV_USE_LIST 1 + +#define LV_USE_MENU 1 + +#define LV_USE_METER 1 + +#define LV_USE_MSGBOX 1 + +#define LV_USE_SPAN 1 +#if LV_USE_SPAN + /*A line text can contain maximum num of span descriptor */ + #define LV_SPAN_SNIPPET_STACK_SIZE 64 +#endif + +#define LV_USE_SPINBOX 1 + +#define LV_USE_SPINNER 1 + +#define LV_USE_TABVIEW 1 + +#define LV_USE_TILEVIEW 1 + +#define LV_USE_WIN 1 + +/*----------- + * Themes + *----------*/ + +/*A simple, impressive and very complete theme*/ +#define LV_USE_THEME_DEFAULT 1 +#if LV_USE_THEME_DEFAULT + + /*0: Light mode; 1: Dark mode*/ + #define LV_THEME_DEFAULT_DARK 0 + + /*1: Enable grow on press*/ + #define LV_THEME_DEFAULT_GROW 1 + + /*Default transition time in [ms]*/ + #define LV_THEME_DEFAULT_TRANSITION_TIME 80 +#endif /*LV_USE_THEME_DEFAULT*/ + +/*A very simple theme that is a good starting point for a custom theme*/ +#define LV_USE_THEME_BASIC 1 + +/*A theme designed for monochrome displays*/ +#define LV_USE_THEME_MONO 1 + +/*----------- + * Layouts + *----------*/ + +/*A layout similar to Flexbox in CSS.*/ +#define LV_USE_FLEX 1 + +/*A layout similar to Grid in CSS.*/ +#define LV_USE_GRID 1 + +/*--------------------- + * 3rd party libraries + *--------------------*/ + +/*File system interfaces for common APIs */ + +/*API for fopen, fread, etc*/ +#define LV_USE_FS_STDIO 0 +#if LV_USE_FS_STDIO + #define LV_FS_STDIO_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_STDIO_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #define LV_FS_STDIO_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for open, read, etc*/ +#define LV_USE_FS_POSIX 0 +#if LV_USE_FS_POSIX + #define LV_FS_POSIX_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_POSIX_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #define LV_FS_POSIX_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for CreateFile, ReadFile, etc*/ +#define LV_USE_FS_WIN32 0 +#if LV_USE_FS_WIN32 + #define LV_FS_WIN32_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_WIN32_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #define LV_FS_WIN32_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for FATFS (needs to be added separately). Uses f_open, f_read, etc*/ +#define LV_USE_FS_FATFS 0 +#if LV_USE_FS_FATFS + #define LV_FS_FATFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_FATFS_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*PNG decoder library*/ +#define LV_USE_PNG 0 + +/*BMP decoder library*/ +#define LV_USE_BMP 0 + +/* JPG + split JPG decoder library. + * Split JPG is a custom format optimized for embedded systems. */ +#define LV_USE_SJPG 0 + +/*GIF decoder library*/ +#define LV_USE_GIF 0 + +/*QR code library*/ +#define LV_USE_QRCODE 0 + +/*FreeType library*/ +#define LV_USE_FREETYPE 0 +#if LV_USE_FREETYPE + /*Memory used by FreeType to cache characters [bytes] (-1: no caching)*/ + #define LV_FREETYPE_CACHE_SIZE (16 * 1024) + #if LV_FREETYPE_CACHE_SIZE >= 0 + /* 1: bitmap cache use the sbit cache, 0:bitmap cache use the image cache. */ + /* sbit cache:it is much more memory efficient for small bitmaps(font size < 256) */ + /* if font size >= 256, must be configured as image cache */ + #define LV_FREETYPE_SBIT_CACHE 0 + /* Maximum number of opened FT_Face/FT_Size objects managed by this cache instance. */ + /* (0:use system defaults) */ + #define LV_FREETYPE_CACHE_FT_FACES 0 + #define LV_FREETYPE_CACHE_FT_SIZES 0 + #endif +#endif + +/*Rlottie library*/ +#define LV_USE_RLOTTIE 0 + +/*FFmpeg library for image decoding and playing videos + *Supports all major image formats so do not enable other image decoder with it*/ +#define LV_USE_FFMPEG 0 +#if LV_USE_FFMPEG + /*Dump input information to stderr*/ + #define LV_FFMPEG_DUMP_FORMAT 0 +#endif + +/*----------- + * Others + *----------*/ + +/*1: Enable API to take snapshot for object*/ +#define LV_USE_SNAPSHOT 0 + +/*1: Enable Monkey test*/ +#define LV_USE_MONKEY 0 + +/*1: Enable grid navigation*/ +#define LV_USE_GRIDNAV 0 + +/*1: Enable lv_obj fragment*/ +#define LV_USE_FRAGMENT 0 + +/*1: Support using images as font in label or span widgets */ +#define LV_USE_IMGFONT 0 + +/*1: Enable a published subscriber based messaging system */ +#define LV_USE_MSG 0 + +/*1: Enable Pinyin input method*/ +/*Requires: lv_keyboard*/ +#define LV_USE_IME_PINYIN 0 +#if LV_USE_IME_PINYIN + /*1: Use default thesaurus*/ + /*If you do not use the default thesaurus, be sure to use `lv_ime_pinyin` after setting the thesauruss*/ + #define LV_IME_PINYIN_USE_DEFAULT_DICT 1 + /*Set the maximum number of candidate panels that can be displayed*/ + /*This needs to be adjusted according to the size of the screen*/ + #define LV_IME_PINYIN_CAND_TEXT_NUM 6 + + /*Use 9 key input(k9)*/ + #define LV_IME_PINYIN_USE_K9_MODE 1 + #if LV_IME_PINYIN_USE_K9_MODE == 1 + #define LV_IME_PINYIN_K9_CAND_TEXT_NUM 3 + #endif // LV_IME_PINYIN_USE_K9_MODE +#endif + +/*================== +* EXAMPLES +*==================*/ + +/*Enable the examples to be built with the library*/ +#define LV_BUILD_EXAMPLES 1 + +/*=================== + * DEMO USAGE + ====================*/ + +/*Show some widget. It might be required to increase `LV_MEM_SIZE` */ +#define LV_USE_DEMO_WIDGETS 0 +#if LV_USE_DEMO_WIDGETS +#define LV_DEMO_WIDGETS_SLIDESHOW 0 +#endif + +/*Demonstrate the usage of encoder and keyboard*/ +#define LV_USE_DEMO_KEYPAD_AND_ENCODER 0 + +/*Benchmark your system*/ +#define LV_USE_DEMO_BENCHMARK 0 +#if LV_USE_DEMO_BENCHMARK +/*Use RGB565A8 images with 16 bit color depth instead of ARGB8565*/ +#define LV_DEMO_BENCHMARK_RGB565A8 0 +#endif + +/*Stress test for LVGL*/ +#define LV_USE_DEMO_STRESS 0 + +/*Music player demo*/ +#define LV_USE_DEMO_MUSIC 0 +#if LV_USE_DEMO_MUSIC + #define LV_DEMO_MUSIC_SQUARE 0 + #define LV_DEMO_MUSIC_LANDSCAPE 0 + #define LV_DEMO_MUSIC_ROUND 0 + #define LV_DEMO_MUSIC_LARGE 0 + #define LV_DEMO_MUSIC_AUTO_PLAY 0 +#endif + +/*--END OF LV_CONF_H--*/ + +#endif /*LV_CONF_H*/ + +#endif /*End of "Content enable"*/ \ No newline at end of file diff --git a/libraries/Arduino_H7_Video/src/lv_conf_9.h b/libraries/Arduino_H7_Video/src/lv_conf_9.h new file mode 100644 index 000000000..635a2816c --- /dev/null +++ b/libraries/Arduino_H7_Video/src/lv_conf_9.h @@ -0,0 +1,973 @@ +/** + * @file lv_conf.h + * Configuration file for v9.0.1-dev + */ + +/* + * Copy this file as `lv_conf.h` + * 1. simply next to the `lvgl` folder + * 2. or any other places and + * - define `LV_CONF_INCLUDE_SIMPLE` + * - add the path as include path + */ + +/* clang-format off */ +#if 1 /*Set it to "1" to enable content*/ + +#ifndef LV_CONF_H +#define LV_CONF_H + +/*==================== + COLOR SETTINGS + *====================*/ + +/*Color depth: 8 (A8), 16 (RGB565), 24 (RGB888), 32 (XRGB8888)*/ +#define LV_COLOR_DEPTH 16 + +/*========================= + STDLIB WRAPPER SETTINGS + *=========================*/ + +/* Possible values + * - LV_STDLIB_BUILTIN: LVGL's built in implementation + * - LV_STDLIB_CLIB: Standard C functions, like malloc, strlen, etc + * - LV_STDLIB_MICROPYTHON: MicroPython implementation + * - LV_STDLIB_RTTHREAD: RT-Thread implementation + * - LV_STDLIB_CUSTOM: Implement the functions externally + */ +#define LV_USE_STDLIB_MALLOC LV_STDLIB_BUILTIN +#define LV_USE_STDLIB_STRING LV_STDLIB_BUILTIN +#define LV_USE_STDLIB_SPRINTF LV_STDLIB_BUILTIN + + +#if LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN + /*Size of the memory available for `lv_malloc()` in bytes (>= 2kB)*/ + #define LV_MEM_SIZE (64 * 1024U) /*[bytes]*/ + + /*Size of the memory expand for `lv_malloc()` in bytes*/ + #define LV_MEM_POOL_EXPAND_SIZE 0 + + /*Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too.*/ + #define LV_MEM_ADR 0 /*0: unused*/ + /*Instead of an address give a memory allocator that will be called to get a memory pool for LVGL. E.g. my_malloc*/ + #if LV_MEM_ADR == 0 + #undef LV_MEM_POOL_INCLUDE + #undef LV_MEM_POOL_ALLOC + #endif +#endif /*LV_USE_MALLOC == LV_STDLIB_BUILTIN*/ + +/*==================== + HAL SETTINGS + *====================*/ + +/*Default display refresh, input device read and animation step period.*/ +#define LV_DEF_REFR_PERIOD 33 /*[ms]*/ + +/*Default Dot Per Inch. Used to initialize default sizes such as widgets sized, style paddings. + *(Not so important, you can adjust it to modify default sizes and spaces)*/ +#define LV_DPI_DEF 130 /*[px/inch]*/ + +/*================= + * OPERATING SYSTEM + *=================*/ +/*Select an operating system to use. Possible options: + * - LV_OS_NONE + * - LV_OS_PTHREAD + * - LV_OS_FREERTOS + * - LV_OS_CMSIS_RTOS2 + * - LV_OS_RTTHREAD + * - LV_OS_WINDOWS + * - LV_OS_CUSTOM */ +#define LV_USE_OS LV_OS_NONE + +#if LV_USE_OS == LV_OS_CUSTOM + #define LV_OS_CUSTOM_INCLUDE +#endif + +/*======================== + * RENDERING CONFIGURATION + *========================*/ + +/*Align the stride of all layers and images to this bytes*/ +#define LV_DRAW_BUF_STRIDE_ALIGN 1 + +/*Align the start address of draw_buf addresses to this bytes*/ +#define LV_DRAW_BUF_ALIGN 4 + +#define LV_USE_DRAW_SW 1 +#if LV_USE_DRAW_SW == 1 + /* Set the number of draw unit. + * > 1 requires an operating system enabled in `LV_USE_OS` + * > 1 means multiply threads will render the screen in parallel */ + #define LV_DRAW_SW_DRAW_UNIT_CNT 1 + + /* Use Arm-2D to accelerate the sw render */ + #define LV_USE_DRAW_ARM2D_SYNC 1 + + /* If a widget has `style_opa < 255` (not `bg_opa`, `text_opa` etc) or not NORMAL blend mode + * it is buffered into a "simple" layer before rendering. The widget can be buffered in smaller chunks. + * "Transformed layers" (if `transform_angle/zoom` are set) use larger buffers + * and can't be drawn in chunks. */ + + /*The target buffer size for simple layer chunks.*/ + #define LV_DRAW_SW_LAYER_SIMPLE_BUF_SIZE (24 * 1024) /*[bytes]*/ + + /* 0: use a simple renderer capable of drawing only simple rectangles with gradient, images, texts, and straight lines only + * 1: use a complex renderer capable of drawing rounded corners, shadow, skew lines, and arcs too */ + #define LV_DRAW_SW_COMPLEX 1 + + #if LV_DRAW_SW_COMPLEX == 1 + /*Allow buffering some shadow calculation. + *LV_DRAW_SW_SHADOW_CACHE_SIZE is the max. shadow size to buffer, where shadow size is `shadow_width + radius` + *Caching has LV_DRAW_SW_SHADOW_CACHE_SIZE^2 RAM cost*/ + #define LV_DRAW_SW_SHADOW_CACHE_SIZE 0 + + /* Set number of maximally cached circle data. + * The circumference of 1/4 circle are saved for anti-aliasing + * radius * 4 bytes are used per circle (the most often used radiuses are saved) + * 0: to disable caching */ + #define LV_DRAW_SW_CIRCLE_CACHE_SIZE 4 + #endif + + #define LV_USE_DRAW_SW_ASM LV_DRAW_SW_ASM_NONE + + #if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM + #define LV_DRAW_SW_ASM_CUSTOM_INCLUDE "" + #endif +#endif + +/* Use NXP's VG-Lite GPU on iMX RTxxx platforms. */ +#define LV_USE_DRAW_VGLITE 0 + +#if LV_USE_DRAW_VGLITE + /* Enable blit quality degradation workaround recommended for screen's dimension > 352 pixels. */ + #define LV_USE_VGLITE_BLIT_SPLIT 0 + + #if LV_USE_OS + /* Enable VGLite draw async. Queue multiple tasks and flash them once to the GPU. */ + #define LV_USE_VGLITE_DRAW_ASYNC 1 + #endif + + /* Enable VGLite asserts. */ + #define LV_USE_VGLITE_ASSERT 0 +#endif + +/* Use NXP's PXP on iMX RTxxx platforms. */ +#define LV_USE_DRAW_PXP 0 + +#if LV_USE_DRAW_PXP + /* Enable PXP asserts. */ + #define LV_USE_PXP_ASSERT 0 +#endif + +/* Use Renesas Dave2D on RA platforms. */ +#define LV_USE_DRAW_DAVE2D 0 + +/* Draw using cached SDL textures*/ +#define LV_USE_DRAW_SDL 0 + +/* Use VG-Lite GPU. */ +#define LV_USE_DRAW_VG_LITE 0 + +#if LV_USE_DRAW_VG_LITE +/* Enable VG-Lite custom external 'gpu_init()' function */ +#define LV_VG_LITE_USE_GPU_INIT 0 + +/* Enable VG-Lite assert. */ +#define LV_VG_LITE_USE_ASSERT 0 + +/* VG-Lite flush commit trigger threshold. GPU will try to batch these many draw tasks. */ +#define LV_VG_LITE_FLUSH_MAX_COUNT 8 + +/* Enable border to simulate shadow + * NOTE: which usually improves performance, + * but does not guarantee the same rendering quality as the software. */ +#define LV_VG_LITE_USE_BOX_SHADOW 0 + +#endif + +/*======================= + * FEATURE CONFIGURATION + *=======================*/ + +/*------------- + * Logging + *-----------*/ + +/*Enable the log module*/ +#define LV_USE_LOG 0 +#if LV_USE_LOG + + /*How important log should be added: + *LV_LOG_LEVEL_TRACE A lot of logs to give detailed information + *LV_LOG_LEVEL_INFO Log important events + *LV_LOG_LEVEL_WARN Log if something unwanted happened but didn't cause a problem + *LV_LOG_LEVEL_ERROR Only critical issue, when the system may fail + *LV_LOG_LEVEL_USER Only logs added by the user + *LV_LOG_LEVEL_NONE Do not log anything*/ + #define LV_LOG_LEVEL LV_LOG_LEVEL_WARN + + /*1: Print the log with 'printf'; + *0: User need to register a callback with `lv_log_register_print_cb()`*/ + #define LV_LOG_PRINTF 0 + + /*1: Enable print timestamp; + *0: Disable print timestamp*/ + #define LV_LOG_USE_TIMESTAMP 1 + + /*1: Print file and line number of the log; + *0: Do not print file and line number of the log*/ + #define LV_LOG_USE_FILE_LINE 1 + + /*Enable/disable LV_LOG_TRACE in modules that produces a huge number of logs*/ + #define LV_LOG_TRACE_MEM 1 + #define LV_LOG_TRACE_TIMER 1 + #define LV_LOG_TRACE_INDEV 1 + #define LV_LOG_TRACE_DISP_REFR 1 + #define LV_LOG_TRACE_EVENT 1 + #define LV_LOG_TRACE_OBJ_CREATE 1 + #define LV_LOG_TRACE_LAYOUT 1 + #define LV_LOG_TRACE_ANIM 1 + #define LV_LOG_TRACE_CACHE 1 + +#endif /*LV_USE_LOG*/ + +/*------------- + * Asserts + *-----------*/ + +/*Enable asserts if an operation is failed or an invalid data is found. + *If LV_USE_LOG is enabled an error message will be printed on failure*/ +#define LV_USE_ASSERT_NULL 1 /*Check if the parameter is NULL. (Very fast, recommended)*/ +#define LV_USE_ASSERT_MALLOC 1 /*Checks is the memory is successfully allocated or no. (Very fast, recommended)*/ +#define LV_USE_ASSERT_STYLE 0 /*Check if the styles are properly initialized. (Very fast, recommended)*/ +#define LV_USE_ASSERT_MEM_INTEGRITY 0 /*Check the integrity of `lv_mem` after critical operations. (Slow)*/ +#define LV_USE_ASSERT_OBJ 0 /*Check the object's type and existence (e.g. not deleted). (Slow)*/ + +/*Add a custom handler when assert happens e.g. to restart the MCU*/ +#define LV_ASSERT_HANDLER_INCLUDE +#define LV_ASSERT_HANDLER while(1); /*Halt by default*/ + +/*------------- + * Debug + *-----------*/ + +/*1: Draw random colored rectangles over the redrawn areas*/ +#define LV_USE_REFR_DEBUG 0 + +/*1: Draw a red overlay for ARGB layers and a green overlay for RGB layers*/ +#define LV_USE_LAYER_DEBUG 0 + +/*1: Draw overlays with different colors for each draw_unit's tasks. + *Also add the index number of the draw unit on white background. + *For layers add the index number of the draw unit on black background.*/ +#define LV_USE_PARALLEL_DRAW_DEBUG 0 + +/*------------- + * Others + *-----------*/ + +#define LV_ENABLE_GLOBAL_CUSTOM 0 +#if LV_ENABLE_GLOBAL_CUSTOM + /*Header to include for the custom 'lv_global' function"*/ + #define LV_GLOBAL_CUSTOM_INCLUDE +#endif + +/*Default cache size in bytes. + *Used by image decoders such as `lv_lodepng` to keep the decoded image in the memory. + *If size is not set to 0, the decoder will fail to decode when the cache is full. + *If size is 0, the cache function is not enabled and the decoded mem will be released immediately after use.*/ +#define LV_CACHE_DEF_SIZE 0 + +/*Default number of image header cache entries. The cache is used to store the headers of images + *The main logic is like `LV_CACHE_DEF_SIZE` but for image headers.*/ +#define LV_IMAGE_HEADER_CACHE_DEF_CNT 0 + +/*Number of stops allowed per gradient. Increase this to allow more stops. + *This adds (sizeof(lv_color_t) + 1) bytes per additional stop*/ +#define LV_GRADIENT_MAX_STOPS 2 + +/* Adjust color mix functions rounding. GPUs might calculate color mix (blending) differently. + * 0: round down, 64: round up from x.75, 128: round up from half, 192: round up from x.25, 254: round up */ +#define LV_COLOR_MIX_ROUND_OFS 0 + +/* Add 2 x 32 bit variables to each lv_obj_t to speed up getting style properties */ +#define LV_OBJ_STYLE_CACHE 0 + +/* Add `id` field to `lv_obj_t` */ +#define LV_USE_OBJ_ID 0 + +/* Use lvgl builtin method for obj ID */ +#define LV_USE_OBJ_ID_BUILTIN 0 + +/*Use obj property set/get API*/ +#define LV_USE_OBJ_PROPERTY 0 + +/* VG-Lite Simulator */ +/*Requires: LV_USE_THORVG_INTERNAL or LV_USE_THORVG_EXTERNAL */ +#define LV_USE_VG_LITE_THORVG 0 + +#if LV_USE_VG_LITE_THORVG + + /*Enable LVGL's blend mode support*/ + #define LV_VG_LITE_THORVG_LVGL_BLEND_SUPPORT 0 + + /*Enable YUV color format support*/ + #define LV_VG_LITE_THORVG_YUV_SUPPORT 0 + + /*Enable 16 pixels alignment*/ + #define LV_VG_LITE_THORVG_16PIXELS_ALIGN 1 + + /*Enable multi-thread render*/ + #define LV_VG_LITE_THORVG_THREAD_RENDER 0 + +#endif + +/*===================== + * COMPILER SETTINGS + *====================*/ + +/*For big endian systems set to 1*/ +#define LV_BIG_ENDIAN_SYSTEM 0 + +/*Define a custom attribute to `lv_tick_inc` function*/ +#define LV_ATTRIBUTE_TICK_INC + +/*Define a custom attribute to `lv_timer_handler` function*/ +#define LV_ATTRIBUTE_TIMER_HANDLER + +/*Define a custom attribute to `lv_display_flush_ready` function*/ +#define LV_ATTRIBUTE_FLUSH_READY + +/*Required alignment size for buffers*/ +#define LV_ATTRIBUTE_MEM_ALIGN_SIZE 1 + +/*Will be added where memories needs to be aligned (with -Os data might not be aligned to boundary by default). + * E.g. __attribute__((aligned(4)))*/ +#define LV_ATTRIBUTE_MEM_ALIGN + +/*Attribute to mark large constant arrays for example font's bitmaps*/ +#define LV_ATTRIBUTE_LARGE_CONST + +/*Compiler prefix for a big array declaration in RAM*/ +#define LV_ATTRIBUTE_LARGE_RAM_ARRAY + +/*Place performance critical functions into a faster memory (e.g RAM)*/ +#define LV_ATTRIBUTE_FAST_MEM + +/*Export integer constant to binding. This macro is used with constants in the form of LV_ that + *should also appear on LVGL binding API such as Micropython.*/ +#define LV_EXPORT_CONST_INT(int_value) struct _silence_gcc_warning /*The default value just prevents GCC warning*/ + +/*Prefix all global extern data with this*/ +#define LV_ATTRIBUTE_EXTERN_DATA + +/* Use `float` as `lv_value_precise_t` */ +#define LV_USE_FLOAT 0 + +/*================== + * FONT USAGE + *===================*/ + +/*Montserrat fonts with ASCII range and some symbols using bpp = 4 + *https://fonts.google.com/specimen/Montserrat*/ +#define LV_FONT_MONTSERRAT_8 0 +#define LV_FONT_MONTSERRAT_10 0 +#define LV_FONT_MONTSERRAT_12 0 +#define LV_FONT_MONTSERRAT_14 1 +#define LV_FONT_MONTSERRAT_16 0 +#define LV_FONT_MONTSERRAT_18 0 +#define LV_FONT_MONTSERRAT_20 0 +#define LV_FONT_MONTSERRAT_22 0 +#define LV_FONT_MONTSERRAT_24 0 +#define LV_FONT_MONTSERRAT_26 0 +#define LV_FONT_MONTSERRAT_28 0 +#define LV_FONT_MONTSERRAT_30 0 +#define LV_FONT_MONTSERRAT_32 0 +#define LV_FONT_MONTSERRAT_34 0 +#define LV_FONT_MONTSERRAT_36 0 +#define LV_FONT_MONTSERRAT_38 0 +#define LV_FONT_MONTSERRAT_40 0 +#define LV_FONT_MONTSERRAT_42 0 +#define LV_FONT_MONTSERRAT_44 0 +#define LV_FONT_MONTSERRAT_46 0 +#define LV_FONT_MONTSERRAT_48 0 + +/*Demonstrate special features*/ +#define LV_FONT_MONTSERRAT_28_COMPRESSED 0 /*bpp = 3*/ +#define LV_FONT_DEJAVU_16_PERSIAN_HEBREW 0 /*Hebrew, Arabic, Persian letters and all their forms*/ +#define LV_FONT_SIMSUN_16_CJK 0 /*1000 most common CJK radicals*/ + +/*Pixel perfect monospace fonts*/ +#define LV_FONT_UNSCII_8 0 +#define LV_FONT_UNSCII_16 0 + +/*Optionally declare custom fonts here. + *You can use these fonts as default font too and they will be available globally. + *E.g. #define LV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(my_font_1) LV_FONT_DECLARE(my_font_2)*/ +#define LV_FONT_CUSTOM_DECLARE + +/*Always set a default font*/ +#define LV_FONT_DEFAULT &lv_font_montserrat_14 + +/*Enable handling large font and/or fonts with a lot of characters. + *The limit depends on the font size, font face and bpp. + *Compiler error will be triggered if a font needs it.*/ +#define LV_FONT_FMT_TXT_LARGE 0 + +/*Enables/disables support for compressed fonts.*/ +#define LV_USE_FONT_COMPRESSED 0 + +/*Enable drawing placeholders when glyph dsc is not found*/ +#define LV_USE_FONT_PLACEHOLDER 1 + +/*================= + * TEXT SETTINGS + *=================*/ + +/** + * Select a character encoding for strings. + * Your IDE or editor should have the same character encoding + * - LV_TXT_ENC_UTF8 + * - LV_TXT_ENC_ASCII + */ +#define LV_TXT_ENC LV_TXT_ENC_UTF8 + +/*Can break (wrap) texts on these chars*/ +#define LV_TXT_BREAK_CHARS " ,.;:-_)]}" + +/*If a word is at least this long, will break wherever "prettiest" + *To disable, set to a value <= 0*/ +#define LV_TXT_LINE_BREAK_LONG_LEN 0 + +/*Minimum number of characters in a long word to put on a line before a break. + *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/ +#define LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN 3 + +/*Minimum number of characters in a long word to put on a line after a break. + *Depends on LV_TXT_LINE_BREAK_LONG_LEN.*/ +#define LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN 3 + +/*Support bidirectional texts. Allows mixing Left-to-Right and Right-to-Left texts. + *The direction will be processed according to the Unicode Bidirectional Algorithm: + *https://www.w3.org/International/articles/inline-bidi-markup/uba-basics*/ +#define LV_USE_BIDI 0 +#if LV_USE_BIDI + /*Set the default direction. Supported values: + *`LV_BASE_DIR_LTR` Left-to-Right + *`LV_BASE_DIR_RTL` Right-to-Left + *`LV_BASE_DIR_AUTO` detect texts base direction*/ + #define LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_AUTO +#endif + +/*Enable Arabic/Persian processing + *In these languages characters should be replaced with an other form based on their position in the text*/ +#define LV_USE_ARABIC_PERSIAN_CHARS 0 + +/*================== + * WIDGETS + *================*/ + +/*Documentation of the widgets: https://docs.lvgl.io/latest/en/html/widgets/index.html*/ + +#define LV_WIDGETS_HAS_DEFAULT_VALUE 1 + +#define LV_USE_ANIMIMG 1 + +#define LV_USE_ARC 1 + +#define LV_USE_BAR 1 + +#define LV_USE_BUTTON 1 + +#define LV_USE_BUTTONMATRIX 1 + +#define LV_USE_CALENDAR 1 +#if LV_USE_CALENDAR + #define LV_CALENDAR_WEEK_STARTS_MONDAY 0 + #if LV_CALENDAR_WEEK_STARTS_MONDAY + #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"} + #else + #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"} + #endif + + #define LV_CALENDAR_DEFAULT_MONTH_NAMES {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"} + #define LV_USE_CALENDAR_HEADER_ARROW 1 + #define LV_USE_CALENDAR_HEADER_DROPDOWN 1 +#endif /*LV_USE_CALENDAR*/ + +#define LV_USE_CANVAS 1 + +#define LV_USE_CHART 1 + +#define LV_USE_CHECKBOX 1 + +#define LV_USE_DROPDOWN 1 /*Requires: lv_label*/ + +#define LV_USE_IMAGE 1 /*Requires: lv_label*/ + +#define LV_USE_IMAGEBUTTON 1 + +#define LV_USE_KEYBOARD 1 + +#define LV_USE_LABEL 1 +#if LV_USE_LABEL + #define LV_LABEL_TEXT_SELECTION 1 /*Enable selecting text of the label*/ + #define LV_LABEL_LONG_TXT_HINT 1 /*Store some extra info in labels to speed up drawing of very long texts*/ + #define LV_LABEL_WAIT_CHAR_COUNT 3 /*The count of wait chart*/ +#endif + +#define LV_USE_LED 1 + +#define LV_USE_LINE 1 + +#define LV_USE_LIST 1 + +#define LV_USE_MENU 1 + +#define LV_USE_MSGBOX 1 + +#define LV_USE_ROLLER 1 /*Requires: lv_label*/ + +#define LV_USE_SCALE 1 + +#define LV_USE_SLIDER 1 /*Requires: lv_bar*/ + +#define LV_USE_SPAN 1 +#if LV_USE_SPAN + /*A line text can contain maximum num of span descriptor */ + #define LV_SPAN_SNIPPET_STACK_SIZE 64 +#endif + +#define LV_USE_SPINBOX 1 + +#define LV_USE_SPINNER 1 + +#define LV_USE_SWITCH 1 + +#define LV_USE_TEXTAREA 1 /*Requires: lv_label*/ +#if LV_USE_TEXTAREA != 0 + #define LV_TEXTAREA_DEF_PWD_SHOW_TIME 1500 /*ms*/ +#endif + +#define LV_USE_TABLE 1 + +#define LV_USE_TABVIEW 1 + +#define LV_USE_TILEVIEW 1 + +#define LV_USE_WIN 1 + +/*================== + * THEMES + *==================*/ + +/*A simple, impressive and very complete theme*/ +#define LV_USE_THEME_DEFAULT 1 +#if LV_USE_THEME_DEFAULT + + /*0: Light mode; 1: Dark mode*/ + #define LV_THEME_DEFAULT_DARK 0 + + /*1: Enable grow on press*/ + #define LV_THEME_DEFAULT_GROW 1 + + /*Default transition time in [ms]*/ + #define LV_THEME_DEFAULT_TRANSITION_TIME 80 +#endif /*LV_USE_THEME_DEFAULT*/ + +/*A very simple theme that is a good starting point for a custom theme*/ +#define LV_USE_THEME_SIMPLE 1 + +/*A theme designed for monochrome displays*/ +#define LV_USE_THEME_MONO 1 + +/*================== + * LAYOUTS + *==================*/ + +/*A layout similar to Flexbox in CSS.*/ +#define LV_USE_FLEX 1 + +/*A layout similar to Grid in CSS.*/ +#define LV_USE_GRID 1 + +/*==================== + * 3RD PARTS LIBRARIES + *====================*/ + +/*File system interfaces for common APIs */ + +/*API for fopen, fread, etc*/ +#define LV_USE_FS_STDIO 0 +#if LV_USE_FS_STDIO + #define LV_FS_STDIO_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_STDIO_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #define LV_FS_STDIO_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for open, read, etc*/ +#define LV_USE_FS_POSIX 0 +#if LV_USE_FS_POSIX + #define LV_FS_POSIX_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_POSIX_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #define LV_FS_POSIX_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for CreateFile, ReadFile, etc*/ +#define LV_USE_FS_WIN32 0 +#if LV_USE_FS_WIN32 + #define LV_FS_WIN32_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_WIN32_PATH "" /*Set the working directory. File/directory paths will be appended to it.*/ + #define LV_FS_WIN32_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for FATFS (needs to be added separately). Uses f_open, f_read, etc*/ +#define LV_USE_FS_FATFS 0 +#if LV_USE_FS_FATFS + #define LV_FS_FATFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ + #define LV_FS_FATFS_CACHE_SIZE 0 /*>0 to cache this number of bytes in lv_fs_read()*/ +#endif + +/*API for memory-mapped file access. */ +#define LV_USE_FS_MEMFS 0 +#if LV_USE_FS_MEMFS + #define LV_FS_MEMFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ +#endif + +/*LODEPNG decoder library*/ +#define LV_USE_LODEPNG 0 + +/*PNG decoder(libpng) library*/ +#define LV_USE_LIBPNG 0 + +/*BMP decoder library*/ +#define LV_USE_BMP 0 + +/* JPG + split JPG decoder library. + * Split JPG is a custom format optimized for embedded systems. */ +#define LV_USE_TJPGD 0 + +/* libjpeg-turbo decoder library. + * Supports complete JPEG specifications and high-performance JPEG decoding. */ +#define LV_USE_LIBJPEG_TURBO 0 + +/*GIF decoder library*/ +#define LV_USE_GIF 0 +#if LV_USE_GIF +/*GIF decoder accelerate*/ +#define LV_GIF_CACHE_DECODE_DATA 0 +#endif + + +/*Decode bin images to RAM*/ +#define LV_BIN_DECODER_RAM_LOAD 0 + +/*RLE decompress library*/ +#define LV_USE_RLE 0 + +/*QR code library*/ +#define LV_USE_QRCODE 0 + +/*Barcode code library*/ +#define LV_USE_BARCODE 0 + +/*FreeType library*/ +#define LV_USE_FREETYPE 0 +#if LV_USE_FREETYPE + /*Memory used by FreeType to cache characters in kilobytes*/ + #define LV_FREETYPE_CACHE_SIZE 768 + + /*Let FreeType to use LVGL memory and file porting*/ + #define LV_FREETYPE_USE_LVGL_PORT 0 + + /* Maximum number of opened FT_Face/FT_Size objects managed by this cache instance. */ + /* (0:use system defaults) */ + #define LV_FREETYPE_CACHE_FT_FACES 8 + #define LV_FREETYPE_CACHE_FT_SIZES 8 + #define LV_FREETYPE_CACHE_FT_GLYPH_CNT 256 +#endif + +/* Built-in TTF decoder */ +#define LV_USE_TINY_TTF 0 +#if LV_USE_TINY_TTF + /* Enable loading TTF data from files */ + #define LV_TINY_TTF_FILE_SUPPORT 0 +#endif + +/*Rlottie library*/ +#define LV_USE_RLOTTIE 0 + +/*Enable Vector Graphic APIs*/ +#define LV_USE_VECTOR_GRAPHIC 0 + +/* Enable ThorVG (vector graphics library) from the src/libs folder */ +#define LV_USE_THORVG_INTERNAL 0 + +/* Enable ThorVG by assuming that its installed and linked to the project */ +#define LV_USE_THORVG_EXTERNAL 0 + +/*Enable LZ4 compress/decompress lib*/ +#define LV_USE_LZ4 0 + +/*Use lvgl built-in LZ4 lib*/ +#define LV_USE_LZ4_INTERNAL 0 + +/*Use external LZ4 library*/ +#define LV_USE_LZ4_EXTERNAL 0 + +/*FFmpeg library for image decoding and playing videos + *Supports all major image formats so do not enable other image decoder with it*/ +#define LV_USE_FFMPEG 0 +#if LV_USE_FFMPEG + /*Dump input information to stderr*/ + #define LV_FFMPEG_DUMP_FORMAT 0 +#endif + +/*================== + * OTHERS + *==================*/ + +/*1: Enable API to take snapshot for object*/ +#define LV_USE_SNAPSHOT 0 + +/*1: Enable system monitor component*/ +#define LV_USE_SYSMON 0 +#if LV_USE_SYSMON + /*Get the idle percentage. E.g. uint32_t my_get_idle(void);*/ + #define LV_SYSMON_GET_IDLE lv_timer_get_idle + + /*1: Show CPU usage and FPS count + * Requires `LV_USE_SYSMON = 1`*/ + #define LV_USE_PERF_MONITOR 0 + #if LV_USE_PERF_MONITOR + #define LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT + + /*0: Displays performance data on the screen, 1: Prints performance data using log.*/ + #define LV_USE_PERF_MONITOR_LOG_MODE 0 + #endif + + /*1: Show the used memory and the memory fragmentation + * Requires `LV_USE_BUILTIN_MALLOC = 1` + * Requires `LV_USE_SYSMON = 1`*/ + #define LV_USE_MEM_MONITOR 0 + #if LV_USE_MEM_MONITOR + #define LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_LEFT + #endif + +#endif /*LV_USE_SYSMON*/ + +/*1: Enable the runtime performance profiler*/ +#define LV_USE_PROFILER 0 +#if LV_USE_PROFILER + /*1: Enable the built-in profiler*/ + #define LV_USE_PROFILER_BUILTIN 1 + #if LV_USE_PROFILER_BUILTIN + /*Default profiler trace buffer size*/ + #define LV_PROFILER_BUILTIN_BUF_SIZE (16 * 1024) /*[bytes]*/ + #endif + + /*Header to include for the profiler*/ + #define LV_PROFILER_INCLUDE "lvgl/src/misc/lv_profiler_builtin.h" + + /*Profiler start point function*/ + #define LV_PROFILER_BEGIN LV_PROFILER_BUILTIN_BEGIN + + /*Profiler end point function*/ + #define LV_PROFILER_END LV_PROFILER_BUILTIN_END + + /*Profiler start point function with custom tag*/ + #define LV_PROFILER_BEGIN_TAG LV_PROFILER_BUILTIN_BEGIN_TAG + + /*Profiler end point function with custom tag*/ + #define LV_PROFILER_END_TAG LV_PROFILER_BUILTIN_END_TAG +#endif + +/*1: Enable Monkey test*/ +#define LV_USE_MONKEY 0 + +/*1: Enable grid navigation*/ +#define LV_USE_GRIDNAV 0 + +/*1: Enable lv_obj fragment*/ +#define LV_USE_FRAGMENT 0 + +/*1: Support using images as font in label or span widgets */ +#define LV_USE_IMGFONT 0 + +/*1: Enable an observer pattern implementation*/ +#define LV_USE_OBSERVER 1 + +/*1: Enable Pinyin input method*/ +/*Requires: lv_keyboard*/ +#define LV_USE_IME_PINYIN 0 +#if LV_USE_IME_PINYIN + /*1: Use default thesaurus*/ + /*If you do not use the default thesaurus, be sure to use `lv_ime_pinyin` after setting the thesauruss*/ + #define LV_IME_PINYIN_USE_DEFAULT_DICT 1 + /*Set the maximum number of candidate panels that can be displayed*/ + /*This needs to be adjusted according to the size of the screen*/ + #define LV_IME_PINYIN_CAND_TEXT_NUM 6 + + /*Use 9 key input(k9)*/ + #define LV_IME_PINYIN_USE_K9_MODE 1 + #if LV_IME_PINYIN_USE_K9_MODE == 1 + #define LV_IME_PINYIN_K9_CAND_TEXT_NUM 3 + #endif /*LV_IME_PINYIN_USE_K9_MODE*/ +#endif + +/*1: Enable file explorer*/ +/*Requires: lv_table*/ +#define LV_USE_FILE_EXPLORER 0 +#if LV_USE_FILE_EXPLORER + /*Maximum length of path*/ + #define LV_FILE_EXPLORER_PATH_MAX_LEN (128) + /*Quick access bar, 1:use, 0:not use*/ + /*Requires: lv_list*/ + #define LV_FILE_EXPLORER_QUICK_ACCESS 1 +#endif + +/*================== + * DEVICES + *==================*/ + +/*Use SDL to open window on PC and handle mouse and keyboard*/ +#define LV_USE_SDL 0 +#if LV_USE_SDL + #define LV_SDL_INCLUDE_PATH + #define LV_SDL_RENDER_MODE LV_DISPLAY_RENDER_MODE_DIRECT /*LV_DISPLAY_RENDER_MODE_DIRECT is recommended for best performance*/ + #define LV_SDL_BUF_COUNT 1 /*1 or 2*/ + #define LV_SDL_FULLSCREEN 0 /*1: Make the window full screen by default*/ + #define LV_SDL_DIRECT_EXIT 1 /*1: Exit the application when all SDL windows are closed*/ +#endif + +/*Use X11 to open window on Linux desktop and handle mouse and keyboard*/ +#define LV_USE_X11 0 +#if LV_USE_X11 + #define LV_X11_DIRECT_EXIT 1 /*Exit the application when all X11 windows have been closed*/ + #define LV_X11_DOUBLE_BUFFER 1 /*Use double buffers for endering*/ + /*select only 1 of the following render modes (LV_X11_RENDER_MODE_PARTIAL preferred!)*/ + #define LV_X11_RENDER_MODE_PARTIAL 1 /*Partial render mode (preferred)*/ + #define LV_X11_RENDER_MODE_DIRECT 0 /*direct render mode*/ + #define LV_X11_RENDER_MODE_FULL 0 /*Full render mode*/ +#endif + +/*Driver for /dev/fb*/ +#define LV_USE_LINUX_FBDEV 0 +#if LV_USE_LINUX_FBDEV + #define LV_LINUX_FBDEV_BSD 0 + #define LV_LINUX_FBDEV_RENDER_MODE LV_DISPLAY_RENDER_MODE_PARTIAL + #define LV_LINUX_FBDEV_BUFFER_COUNT 0 + #define LV_LINUX_FBDEV_BUFFER_SIZE 60 +#endif + +/*Use Nuttx to open window and handle touchscreen*/ +#define LV_USE_NUTTX 0 + +#if LV_USE_NUTTX + #define LV_USE_NUTTX_LIBUV 0 + + /*Use Nuttx custom init API to open window and handle touchscreen*/ + #define LV_USE_NUTTX_CUSTOM_INIT 0 + + /*Driver for /dev/lcd*/ + #define LV_USE_NUTTX_LCD 0 + #if LV_USE_NUTTX_LCD + #define LV_NUTTX_LCD_BUFFER_COUNT 0 + #define LV_NUTTX_LCD_BUFFER_SIZE 60 + #endif + + /*Driver for /dev/input*/ + #define LV_USE_NUTTX_TOUCHSCREEN 0 + +#endif + +/*Driver for /dev/dri/card*/ +#define LV_USE_LINUX_DRM 0 + +/*Interface for TFT_eSPI*/ +#define LV_USE_TFT_ESPI 0 + +/*Driver for evdev input devices*/ +#define LV_USE_EVDEV 0 + +/*Driver for libinput input devices*/ +#define LV_USE_LIBINPUT 0 + +#if LV_USE_LIBINPUT + #define LV_LIBINPUT_BSD 0 + + /*Full keyboard support*/ + #define LV_LIBINPUT_XKB 0 + #if LV_LIBINPUT_XKB + /*"setxkbmap -query" can help find the right values for your keyboard*/ + #define LV_LIBINPUT_XKB_KEY_MAP { .rules = NULL, .model = "pc101", .layout = "us", .variant = NULL, .options = NULL } + #endif +#endif + +/*Drivers for LCD devices connected via SPI/parallel port*/ +#define LV_USE_ST7735 0 +#define LV_USE_ST7789 0 +#define LV_USE_ST7796 0 +#define LV_USE_ILI9341 0 + +#define LV_USE_GENERIC_MIPI (LV_USE_ST7735 | LV_USE_ST7789 | LV_USE_ST7796 | LV_USE_ILI9341) + +/* LVGL Windows backend */ +#define LV_USE_WINDOWS 0 + +/*================== +* EXAMPLES +*==================*/ + +/*Enable the examples to be built with the library*/ +#define LV_BUILD_EXAMPLES 1 + +/*=================== + * DEMO USAGE + ====================*/ + +/*Show some widget. It might be required to increase `LV_MEM_SIZE` */ +#define LV_USE_DEMO_WIDGETS 0 + +/*Demonstrate the usage of encoder and keyboard*/ +#define LV_USE_DEMO_KEYPAD_AND_ENCODER 0 + +/*Benchmark your system*/ +#define LV_USE_DEMO_BENCHMARK 0 + +/*Render test for each primitives. Requires at least 480x272 display*/ +#define LV_USE_DEMO_RENDER 0 + +/*Stress test for LVGL*/ +#define LV_USE_DEMO_STRESS 0 + +/*Music player demo*/ +#define LV_USE_DEMO_MUSIC 0 +#if LV_USE_DEMO_MUSIC + #define LV_DEMO_MUSIC_SQUARE 0 + #define LV_DEMO_MUSIC_LANDSCAPE 0 + #define LV_DEMO_MUSIC_ROUND 0 + #define LV_DEMO_MUSIC_LARGE 0 + #define LV_DEMO_MUSIC_AUTO_PLAY 0 +#endif + +/*Flex layout demo*/ +#define LV_USE_DEMO_FLEX_LAYOUT 0 + +/*Smart-phone like multi-language demo*/ +#define LV_USE_DEMO_MULTILANG 0 + +/*Widget transformation demo*/ +#define LV_USE_DEMO_TRANSFORM 0 + +/*Demonstrate scroll settings*/ +#define LV_USE_DEMO_SCROLL 0 + +/*Vector graphic demo*/ +#define LV_USE_DEMO_VECTOR_GRAPHIC 0 +/*--END OF LV_CONF_H--*/ + +#endif /*LV_CONF_H*/ + +#endif /*End of "Content enable"*/ From a12c8c792289dad205f47bfc7295c26249554f43 Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Mon, 4 Mar 2024 19:42:48 +0100 Subject: [PATCH 07/37] lvgl: found a way to automatically select lvgl9 --- libraries/Arduino_H7_Video/src/lv_conf.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libraries/Arduino_H7_Video/src/lv_conf.h b/libraries/Arduino_H7_Video/src/lv_conf.h index 82448db9c..e664bb2de 100644 --- a/libraries/Arduino_H7_Video/src/lv_conf.h +++ b/libraries/Arduino_H7_Video/src/lv_conf.h @@ -1,6 +1,5 @@ //#if (LVGL_VERSION_MAJOR == 9) -// TODO: find a way to autodiscover lvgl version -#if (0) +#if __has_include("draw/sw/blend/neon/lv_blend_neon.h") #include "lv_conf_9.h" #else #include "lv_conf_8.h" From 0e3dc0d061fda8f44c512271d40f58891e4eb5cf Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Tue, 5 Mar 2024 15:05:58 +0100 Subject: [PATCH 08/37] lvgl9: restore original rotation for landscape --- libraries/Arduino_H7_Video/src/Arduino_H7_Video.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libraries/Arduino_H7_Video/src/Arduino_H7_Video.cpp b/libraries/Arduino_H7_Video/src/Arduino_H7_Video.cpp index 89d18dfde..90e075afa 100644 --- a/libraries/Arduino_H7_Video/src/Arduino_H7_Video.cpp +++ b/libraries/Arduino_H7_Video/src/Arduino_H7_Video.cpp @@ -111,7 +111,7 @@ int Arduino_H7_Video::begin() { lv_display_t *display; if(_rotated) { display = lv_display_create(height(), width()); - lv_display_set_rotation(display, LV_DISPLAY_ROTATION_90); + lv_display_set_rotation(display, LV_DISPLAY_ROTATION_270); //display->sw_rotate = 1; } else { display = lv_display_create(width(), height()); @@ -246,12 +246,12 @@ void lvgl_displayFlushing(lv_display_t * disp, const lv_area_t * area, unsigned lv_draw_sw_rotate(px_map, rotated_buf, w, h, lv_draw_buf_width_to_stride(w, cf), lv_draw_buf_width_to_stride(h, cf), - LV_DISPLAY_ROTATION_270, cf); - rotated_area.x1 = area->y1; - rotated_area.y2 = lv_display_get_horizontal_resolution(disp) - area->x1 - 1; + LV_DISPLAY_ROTATION_90, cf); + rotated_area.x1 = lv_display_get_vertical_resolution(disp) - area->y2 - 1; + rotated_area.y1 = area->x1; //rotated_area.y2 = dsi_getDisplayYSize() - area->x1 - 1; rotated_area.x2 = rotated_area.x1 + h - 1; - rotated_area.y1 = rotated_area.y2 - w + 1; + rotated_area.y2 = rotated_area.y1 + w + 1; area_in_use = &rotated_area; px_map = rotated_buf; From 1a96ac7eaef73e64380272c78d8fdbd51072dced Mon Sep 17 00:00:00 2001 From: Juraj Andrassy Date: Tue, 5 Mar 2024 21:43:45 +0100 Subject: [PATCH 09/37] SocketWrapper - use DNS of specific netif, not global DNS IP address assigned by DHCP was not used. Instead DNS serves hardcoded in Mbed were used. --- libraries/SocketWrapper/src/MbedClient.cpp | 4 ++-- libraries/SocketWrapper/src/MbedUdp.cpp | 2 +- libraries/SocketWrapper/src/SocketHelpers.cpp | 7 ++++++- libraries/SocketWrapper/src/SocketHelpers.h | 1 + 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/libraries/SocketWrapper/src/MbedClient.cpp b/libraries/SocketWrapper/src/MbedClient.cpp index ee2947304..83dc3c0e8 100644 --- a/libraries/SocketWrapper/src/MbedClient.cpp +++ b/libraries/SocketWrapper/src/MbedClient.cpp @@ -129,7 +129,7 @@ int arduino::MbedClient::connect(IPAddress ip, uint16_t port) { int arduino::MbedClient::connect(const char *host, uint16_t port) { SocketAddress socketAddress = SocketAddress(); socketAddress.set_port(port); - getNetwork()->gethostbyname(host, &socketAddress); + SocketHelpers::gethostbyname(getNetwork(), host, &socketAddress); return connect(socketAddress); } @@ -199,7 +199,7 @@ int arduino::MbedClient::connectSSL(const char *host, uint16_t port, bool disabl SocketAddress socketAddress = SocketAddress(); socketAddress.set_port(port); - getNetwork()->gethostbyname(host, &socketAddress); + SocketHelpers::gethostbyname(getNetwork(), host, &socketAddress); return connectSSL(socketAddress); } diff --git a/libraries/SocketWrapper/src/MbedUdp.cpp b/libraries/SocketWrapper/src/MbedUdp.cpp index e5605a74c..56d40f06f 100644 --- a/libraries/SocketWrapper/src/MbedUdp.cpp +++ b/libraries/SocketWrapper/src/MbedUdp.cpp @@ -63,7 +63,7 @@ int arduino::MbedUDP::beginPacket(IPAddress ip, uint16_t port) { int arduino::MbedUDP::beginPacket(const char *host, uint16_t port) { _host = SocketAddress(host, port); txBuffer.clear(); - getNetwork()->gethostbyname(host, &_host); + SocketHelpers::gethostbyname(getNetwork(), host, &_host); //If IP is null and port is 0 the initialization failed return (_host.get_ip_address() == nullptr && _host.get_port() == 0) ? 0 : 1; } diff --git a/libraries/SocketWrapper/src/SocketHelpers.cpp b/libraries/SocketWrapper/src/SocketHelpers.cpp index 57626e76c..ada31434f 100644 --- a/libraries/SocketWrapper/src/SocketHelpers.cpp +++ b/libraries/SocketWrapper/src/SocketHelpers.cpp @@ -17,7 +17,7 @@ String arduino::MbedSocketClass::macAddress() { int arduino::MbedSocketClass::hostByName(const char* aHostname, IPAddress& aResult) { SocketAddress socketAddress = SocketAddress(); - nsapi_error_t returnCode = getNetwork()->gethostbyname(aHostname, &socketAddress); + nsapi_error_t returnCode = gethostbyname(getNetwork(), aHostname, &socketAddress); nsapi_addr_t address = socketAddress.get_addr(); aResult[0] = address.bytes[0]; aResult[1] = address.bytes[1]; @@ -120,6 +120,11 @@ SocketAddress arduino::MbedSocketClass::socketAddressFromIpAddress(arduino::IPAd return SocketAddress(convertedIP, port); } +nsapi_error_t arduino::MbedSocketClass::gethostbyname(NetworkInterface* interface, const char* aHostname, SocketAddress* socketAddress) { + char ifname[5] {}; + interface->get_interface_name(ifname); + return interface->gethostbyname(aHostname, socketAddress, NSAPI_UNSPEC, ifname); +} // Download helper diff --git a/libraries/SocketWrapper/src/SocketHelpers.h b/libraries/SocketWrapper/src/SocketHelpers.h index 52b2ff777..c31988fde 100644 --- a/libraries/SocketWrapper/src/SocketHelpers.h +++ b/libraries/SocketWrapper/src/SocketHelpers.h @@ -154,6 +154,7 @@ class MbedSocketClass { static arduino::IPAddress ipAddressFromSocketAddress(SocketAddress socketAddress); static SocketAddress socketAddressFromIpAddress(arduino::IPAddress ip, uint16_t port); + static nsapi_error_t gethostbyname(NetworkInterface* interface, const char* aHostname, SocketAddress* socketAddress); }; using SocketHelpers = MbedSocketClass; From 216c7a3bc995a3e654e54fe5725a42f86ddb6177 Mon Sep 17 00:00:00 2001 From: per1234 Date: Tue, 12 Mar 2024 12:49:01 -0700 Subject: [PATCH 10/37] Correct servertype identifier in "BlackMagic" programmer definition When Arduino IDE initializes the integrated sketch debugger, it sets the `servertype` debug attribute to the value of the `debug.server` platform property. This property must be set to one of the GDB Server type identifiers recognized by the Cortex-Debug debugger extension. The previous value was not a recognized identifier, which caused the debugger initialization to fail: Invalid servertype parameters. The following values are supported: "jlink", "openocd", "stlink", "stutil", "pyocd", "bmp", "pe", "qemu", "external" --- programmers.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/programmers.txt b/programmers.txt index 06ecd7f09..91a0ce01d 100644 --- a/programmers.txt +++ b/programmers.txt @@ -35,4 +35,4 @@ blackmagic.program.protocol= blackmagic.program.tool= blackmagic.program.tool.default= blackmagic.program.extra_params= -blackmagic.debug.server=blackmagic +blackmagic.debug.server=bmp From ac4c5c467b678148ba577d344501c6111aead35c Mon Sep 17 00:00:00 2001 From: pennam Date: Thu, 4 Apr 2024 12:41:07 +0200 Subject: [PATCH 11/37] Remove MBEDTLS_HAVE_TIME_DATE to align to other variants This will also avoid TLS connection to be closed because the certificate validity starts in the future --- variants/NICLA_VISION/conf/custom_mbedtls_config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/variants/NICLA_VISION/conf/custom_mbedtls_config.h b/variants/NICLA_VISION/conf/custom_mbedtls_config.h index cfea49137..b61b5a129 100644 --- a/variants/NICLA_VISION/conf/custom_mbedtls_config.h +++ b/variants/NICLA_VISION/conf/custom_mbedtls_config.h @@ -186,7 +186,7 @@ void * tstDoTraceAndCalloc( * mbedtls_platform_gmtime_r() at compile-time by using the macro * MBEDTLS_PLATFORM_GMTIME_R_ALT. */ -#define MBEDTLS_HAVE_TIME_DATE +//#define MBEDTLS_HAVE_TIME_DATE /** * \def MBEDTLS_PLATFORM_MEMORY From 89f1f03e58d17909dfee6697f0fcb1621abe481a Mon Sep 17 00:00:00 2001 From: pennam Date: Thu, 4 Apr 2024 12:43:17 +0200 Subject: [PATCH 12/37] Remove MBEDTLS_FS_IO and MBEDTLS_SHA1_C They are already defined in target.json file and causing redefinition warnings --- variants/NICLA_VISION/conf/custom_mbedtls_config.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/variants/NICLA_VISION/conf/custom_mbedtls_config.h b/variants/NICLA_VISION/conf/custom_mbedtls_config.h index b61b5a129..c2a399cc2 100644 --- a/variants/NICLA_VISION/conf/custom_mbedtls_config.h +++ b/variants/NICLA_VISION/conf/custom_mbedtls_config.h @@ -1163,7 +1163,7 @@ void * tstDoTraceAndCalloc( * * Enable functions that use the filesystem. */ -#define MBEDTLS_FS_IO +//#define MBEDTLS_FS_IO /** * \def MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES @@ -2770,7 +2770,7 @@ void * tstDoTraceAndCalloc( * on it, and considering stronger message digests instead. * */ -#define MBEDTLS_SHA1_C +//#define MBEDTLS_SHA1_C /** * \def MBEDTLS_SHA256_C From dd866dada7a6fdc964b3d44147b343406e06f1f6 Mon Sep 17 00:00:00 2001 From: Juraj Andrassy Date: Thu, 4 Apr 2024 19:15:42 +0200 Subject: [PATCH 13/37] Ethernet begin with static IP - set DNS with interface name --- libraries/Ethernet/src/Ethernet.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libraries/Ethernet/src/Ethernet.cpp b/libraries/Ethernet/src/Ethernet.cpp index 50c43c9c5..2e0f1a94f 100644 --- a/libraries/Ethernet/src/Ethernet.cpp +++ b/libraries/Ethernet/src/Ethernet.cpp @@ -55,7 +55,9 @@ int arduino::EthernetClass::begin(uint8_t *mac, IPAddress ip, IPAddress dns, IPA eth_if->set_dhcp(false); eth_if->set_network(_ip, _netmask, _gateway); - eth_if->add_dns_server(_dnsServer1, nullptr); + char if_name[5]; + eth_if->get_interface_name(if_name); + eth_if->add_dns_server(_dnsServer1, if_name); auto ret = _begin(mac, timeout, responseTimeout); return ret; From 56b213beb0a94462de0c3b2d7f626c4862f53e31 Mon Sep 17 00:00:00 2001 From: Juraj Andrassy Date: Fri, 5 Apr 2024 20:45:13 +0200 Subject: [PATCH 14/37] WiFi.h - methods without implementation removed --- libraries/WiFi/src/WiFi.h | 7 ------- 1 file changed, 7 deletions(-) diff --git a/libraries/WiFi/src/WiFi.h b/libraries/WiFi/src/WiFi.h index 5a0cd7968..77a64f783 100644 --- a/libraries/WiFi/src/WiFi.h +++ b/libraries/WiFi/src/WiFi.h @@ -187,13 +187,6 @@ class WiFiClass : public MbedSocketClass { unsigned long getTime(); - void lowPowerMode(); - void noLowPowerMode(); - - int ping(const char* hostname, uint8_t ttl = 128); - int ping(const String& hostname, uint8_t ttl = 128); - int ping(IPAddress host, uint8_t ttl = 128); - friend class WiFiClient; friend class WiFiServer; friend class WiFiUDP; From 024cf36e47c8706a2f68c3b4253b31aeeb70ae0b Mon Sep 17 00:00:00 2001 From: iabdalkader Date: Fri, 12 Apr 2024 14:14:21 +0200 Subject: [PATCH 15/37] RPC: Add a function to return the current CPU ID. Signed-off-by: iabdalkader --- libraries/RPC/src/RPC.h | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/libraries/RPC/src/RPC.h b/libraries/RPC/src/RPC.h index 533988323..d4a8729b8 100644 --- a/libraries/RPC/src/RPC.h +++ b/libraries/RPC/src/RPC.h @@ -42,19 +42,26 @@ class RPCClass : public Stream, public rpc::detail::dispatcher { for (int i = 0; i< 10; i++) { clients[i] = NULL; } - }; + } int begin(); - void end() {}; + void end() { + + } int available(void) { return rx_buffer.available(); - }; + } int peek(void) { return rx_buffer.peek(); } int read(void) { return rx_buffer.read_char(); } - void flush(void) {}; + void flush(void) { + + } + uint32_t cpu_id() { + return HAL_GetCurrentCPUID(); + } size_t write(uint8_t c); size_t write(const uint8_t *buf, size_t len, bool raw = true); From 2c5d982bb3902a5203e94d660f0d04cfcd87e122 Mon Sep 17 00:00:00 2001 From: iabdalkader Date: Fri, 12 Apr 2024 14:17:43 +0200 Subject: [PATCH 16/37] RPC: Update examples. Signed-off-by: iabdalkader --- libraries/RPC/examples/Basic_AddSub/Basic_AddSub.ino | 8 ++++---- libraries/RPC/examples/RPC_m4/RPC_m4.ino | 2 +- .../SerialPassthrough_RPC/SerialPassthrough_RPC.ino | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/libraries/RPC/examples/Basic_AddSub/Basic_AddSub.ino b/libraries/RPC/examples/Basic_AddSub/Basic_AddSub.ino index 2df49f0c0..61f96d53f 100644 --- a/libraries/RPC/examples/Basic_AddSub/Basic_AddSub.ino +++ b/libraries/RPC/examples/Basic_AddSub/Basic_AddSub.ino @@ -17,7 +17,7 @@ void setup() { RPC.begin(); RPC.bind("add", add); RPC.bind("sub", sub); - if (HAL_GetCurrentCPUID() == CM7_CPUID) { + if (RPC.cpu_id() == CM7_CPUID) { // Introduce a brief delay to allow the M4 sufficient time // to bind remote functions before invoking them. delay(100); @@ -29,7 +29,7 @@ void loop() { static size_t loop_count = 0; // Blink every 512 iterations - if (HAL_GetCurrentCPUID() == CM4_CPUID && (loop_count++ % 512) == 0) { + if (RPC.cpu_id() == CM4_CPUID && (loop_count++ % 512) == 0) { digitalWrite(LEDG, LOW); delay(10); digitalWrite(LEDG, HIGH); @@ -37,12 +37,12 @@ void loop() { } int res = RPC.call("add", 1, 2).as(); - if (HAL_GetCurrentCPUID() == CM7_CPUID) { + if (RPC.cpu_id() == CM7_CPUID) { Serial.println("add(1, 2) = " + String(res)); } res = RPC.call("sub", res, 1).as(); - if (HAL_GetCurrentCPUID() == CM7_CPUID) { + if (RPC.cpu_id() == CM7_CPUID) { Serial.println("sub(3, 1) = " + String(res)); } delay(250); diff --git a/libraries/RPC/examples/RPC_m4/RPC_m4.ino b/libraries/RPC/examples/RPC_m4/RPC_m4.ino index 1af8e6e5c..439a85caf 100644 --- a/libraries/RPC/examples/RPC_m4/RPC_m4.ino +++ b/libraries/RPC/examples/RPC_m4/RPC_m4.ino @@ -11,7 +11,7 @@ Thread subtractThread; Note that the sketch has to be uploaded to both cores. **/ String currentCPU() { - if (HAL_GetCurrentCPUID() == CM7_CPUID) { + if (RPC.cpu_id() == CM7_CPUID) { return "M7"; } else { return "M4"; diff --git a/libraries/RPC/examples/SerialPassthrough_RPC/SerialPassthrough_RPC.ino b/libraries/RPC/examples/SerialPassthrough_RPC/SerialPassthrough_RPC.ino index 98451da3b..eb8917bb7 100644 --- a/libraries/RPC/examples/SerialPassthrough_RPC/SerialPassthrough_RPC.ino +++ b/libraries/RPC/examples/SerialPassthrough_RPC/SerialPassthrough_RPC.ino @@ -9,7 +9,7 @@ void setup() { } void loop() { - if (HAL_GetCurrentCPUID() == CM4_CPUID) { + if (RPC.cpu_id() == CM4_CPUID) { RPC.println("Printed from M4 core"); delay(1000); } else { From dad8f23800dcc32c44ec0c0cb85fa21e4e54a95d Mon Sep 17 00:00:00 2001 From: Andrea Gilardoni Date: Tue, 16 Apr 2024 16:20:26 +0200 Subject: [PATCH 17/37] fixing reader_th function when stop() is called on a client when the rxBuffer is not empty the reader thread won't be joined to the main thread due to the logic implemented in the readSocket function --- libraries/SocketWrapper/src/MbedClient.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/libraries/SocketWrapper/src/MbedClient.cpp b/libraries/SocketWrapper/src/MbedClient.cpp index ee2947304..1007a4ab3 100644 --- a/libraries/SocketWrapper/src/MbedClient.cpp +++ b/libraries/SocketWrapper/src/MbedClient.cpp @@ -13,20 +13,24 @@ uint8_t arduino::MbedClient::status() { return _status; } + void arduino::MbedClient::readSocket() { - while (1) { + uint8_t data[SOCKET_BUFFER_SIZE]; + + while (sock != nullptr) { event->wait_any(0xFF, 100); - uint8_t data[SOCKET_BUFFER_SIZE]; int ret = NSAPI_ERROR_WOULD_BLOCK; do { + mutex->lock(); + if (sock == nullptr) { + goto cleanup; + } + mutex->unlock(); if (rxBuffer.availableForStore() == 0) { yield(); continue; } mutex->lock(); - if (sock == nullptr) { - goto cleanup; - } ret = sock->recv(data, rxBuffer.availableForStore()); if (ret < 0 && ret != NSAPI_ERROR_WOULD_BLOCK) { goto cleanup; From 12096f8df74612a31759d3f23160658d0259cf41 Mon Sep 17 00:00:00 2001 From: Andrea Gilardoni Date: Tue, 16 Apr 2024 16:24:20 +0200 Subject: [PATCH 18/37] adding rxBuffer.clear() in stop() --- libraries/SocketWrapper/src/MbedClient.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/SocketWrapper/src/MbedClient.cpp b/libraries/SocketWrapper/src/MbedClient.cpp index 1007a4ab3..55d0393f0 100644 --- a/libraries/SocketWrapper/src/MbedClient.cpp +++ b/libraries/SocketWrapper/src/MbedClient.cpp @@ -299,6 +299,7 @@ void arduino::MbedClient::stop() { mutex = nullptr; } _status = false; + rxBuffer.clear(); } uint8_t arduino::MbedClient::connected() { From abaef3f145576ff105cbfd89acc1e903d1bc3bfd Mon Sep 17 00:00:00 2001 From: Andrea Gilardoni Date: Tue, 16 Apr 2024 16:24:34 +0200 Subject: [PATCH 19/37] removing spaces in file --- libraries/SocketWrapper/src/MbedClient.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/SocketWrapper/src/MbedClient.cpp b/libraries/SocketWrapper/src/MbedClient.cpp index 55d0393f0..78e9f63d1 100644 --- a/libraries/SocketWrapper/src/MbedClient.cpp +++ b/libraries/SocketWrapper/src/MbedClient.cpp @@ -65,7 +65,7 @@ void arduino::MbedClient::configureSocket(Socket *_s) { _s->set_timeout(_timeout); _s->set_blocking(false); _s->getpeername(&address); - + if (event == nullptr) { event = new rtos::EventFlags; } From b2de6f2cb784fdf89eb808536a05176d28c30ad1 Mon Sep 17 00:00:00 2001 From: pennam Date: Wed, 17 Apr 2024 12:18:58 +0200 Subject: [PATCH 20/37] GSMClient GSMSSLClient: align constructor to other Client classes Remove the possibility to set socket timeout from constructor. The preferred way should be using setSocketTimeout() method. --- libraries/GSM/src/GSMClient.cpp | 24 ------------------------ libraries/GSM/src/GSMClient.h | 4 ---- libraries/GSM/src/GSMSSLClient.cpp | 24 ------------------------ libraries/GSM/src/GSMSSLClient.h | 3 --- 4 files changed, 55 deletions(-) delete mode 100644 libraries/GSM/src/GSMClient.cpp delete mode 100644 libraries/GSM/src/GSMSSLClient.cpp diff --git a/libraries/GSM/src/GSMClient.cpp b/libraries/GSM/src/GSMClient.cpp deleted file mode 100644 index 2db67df7d..000000000 --- a/libraries/GSM/src/GSMClient.cpp +++ /dev/null @@ -1,24 +0,0 @@ -/* - GSMClient.cpp - Copyright (c) 2023 Arduino SA. All right reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "GSMClient.h" - -arduino::GSMClient::GSMClient(): AClient(100) { - -} diff --git a/libraries/GSM/src/GSMClient.h b/libraries/GSM/src/GSMClient.h index 52c794a75..f29292fb9 100644 --- a/libraries/GSM/src/GSMClient.h +++ b/libraries/GSM/src/GSMClient.h @@ -26,10 +26,6 @@ namespace arduino { class GSMClient : public AClient { -public: - GSMClient(); - -private: NetworkInterface *getNetwork() { return GSM.getNetwork(); } diff --git a/libraries/GSM/src/GSMSSLClient.cpp b/libraries/GSM/src/GSMSSLClient.cpp deleted file mode 100644 index 0070f210e..000000000 --- a/libraries/GSM/src/GSMSSLClient.cpp +++ /dev/null @@ -1,24 +0,0 @@ -/* - GSMSSLClient.cpp - Copyright (c) 2023 Arduino SA. All right reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "GSMSSLClient.h" - -arduino::GSMSSLClient::GSMSSLClient(): ASslClient(100) { - -} diff --git a/libraries/GSM/src/GSMSSLClient.h b/libraries/GSM/src/GSMSSLClient.h index ab07d1f79..cc7d3c194 100644 --- a/libraries/GSM/src/GSMSSLClient.h +++ b/libraries/GSM/src/GSMSSLClient.h @@ -28,9 +28,6 @@ extern const char CA_CERTIFICATES[]; namespace arduino { class GSMSSLClient : public arduino::ASslClient { -public: - GSMSSLClient(); - private: NetworkInterface *getNetwork() { return GSM.getNetwork(); From 6011d05097dd59314e6d7632fc672271d35bc84a Mon Sep 17 00:00:00 2001 From: pennam Date: Wed, 17 Apr 2024 12:20:16 +0200 Subject: [PATCH 21/37] AClient ASSLClient: remove possibility to set timeout from constructor This way was used on by GSMClient and now is not more needed --- libraries/SocketWrapper/src/AClient.cpp | 4 ---- libraries/SocketWrapper/src/AClient.h | 2 -- 2 files changed, 6 deletions(-) diff --git a/libraries/SocketWrapper/src/AClient.cpp b/libraries/SocketWrapper/src/AClient.cpp index 013868d7c..272b18946 100644 --- a/libraries/SocketWrapper/src/AClient.cpp +++ b/libraries/SocketWrapper/src/AClient.cpp @@ -2,10 +2,6 @@ #include "AClient.h" #include "MbedSSLClient.h" -AClient::AClient(unsigned long timeout) { - setSocketTimeout(timeout); -} - void arduino::AClient::newMbedClient() { client.reset(new MbedClient()); client->setNetwork(getNetwork()); diff --git a/libraries/SocketWrapper/src/AClient.h b/libraries/SocketWrapper/src/AClient.h index c93bea0f3..195f7a1f2 100644 --- a/libraries/SocketWrapper/src/AClient.h +++ b/libraries/SocketWrapper/src/AClient.h @@ -28,7 +28,6 @@ class AClient : public Client { public: AClient() {} - AClient(unsigned long timeout); virtual int connect(IPAddress ip, uint16_t port); virtual int connect(const char *host, uint16_t port); @@ -71,7 +70,6 @@ class ASslClient : public AClient { public: ASslClient() {} - ASslClient(unsigned long timeout) : AClient(timeout) {} void disableSNI(bool statusSNI); From eb6f97eeab8dc24adfbfd93ebfb0edf7b7b76d54 Mon Sep 17 00:00:00 2001 From: iabdalkader Date: Thu, 18 Apr 2024 09:55:48 +0200 Subject: [PATCH 22/37] Camera: Fix framebuffer malloc alignment. - Allocate extra memory for cache-line alignment. - Fixes #838. Signed-off-by: iabdalkader --- libraries/Camera/src/camera.cpp | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/libraries/Camera/src/camera.cpp b/libraries/Camera/src/camera.cpp index 2cc3da2ef..050ea3772 100644 --- a/libraries/Camera/src/camera.cpp +++ b/libraries/Camera/src/camera.cpp @@ -27,6 +27,12 @@ #define ALIGN_PTR(p,a) ((p & (a-1)) ?(((uintptr_t)p + a) & ~(uintptr_t)(a-1)) : p) +#ifdef __SCB_DCACHE_LINE_SIZE +#define FB_ALIGNMENT __SCB_DCACHE_LINE_SIZE +#else +#define FB_ALIGNMENT 32 +#endif + // Include all image sensor drivers here. #if defined (ARDUINO_PORTENTA_H7_M7) @@ -337,15 +343,16 @@ FrameBuffer::FrameBuffer(int32_t x, int32_t y, int32_t bpp) : _fb_size(x*y*bpp), _isAllocated(true) { - uint8_t *buffer = (uint8_t *)malloc(x*y*bpp); - _fb = (uint8_t *)ALIGN_PTR((uintptr_t)buffer, 32); + uint8_t *buffer = (uint8_t *) malloc(x * y * bpp + FB_ALIGNMENT); + _fb = (uint8_t *) ALIGN_PTR((uintptr_t) buffer, FB_ALIGNMENT); } FrameBuffer::FrameBuffer(int32_t address) : _fb_size(0), - _isAllocated(true) + _isAllocated(true), + _fb((uint8_t *) address) { - _fb = (uint8_t *)ALIGN_PTR((uintptr_t)address, 32); + // Assume that `address` is aligned, this will be verified later in grabFrame. } FrameBuffer::FrameBuffer() : @@ -688,17 +695,17 @@ int Camera::grabFrame(FrameBuffer &fb, uint32_t timeout) } } } else { - uint8_t *buffer = (uint8_t *)malloc(framesize+32); - uint8_t *alignedBuff = (uint8_t *)ALIGN_PTR((uintptr_t)buffer, 32); - fb.setBuffer(alignedBuff); + uint8_t *buffer = (uint8_t *) malloc(framesize + FB_ALIGNMENT); + uint8_t *aligned_buffer = (uint8_t *) ALIGN_PTR((uintptr_t) buffer, FB_ALIGNMENT); + fb.setBuffer(aligned_buffer); } uint8_t *framebuffer = fb.getBuffer(); - // Ensure FB is aligned to 32 bytes cache lines. - if ((uint32_t) framebuffer & 0x1F) { + // Ensure that the framebuffer is aligned. + if ((uint32_t) framebuffer & (FB_ALIGNMENT - 1)) { if (_debug) { - _debug->println("Framebuffer not aligned to 32 bytes cache lines"); + _debug->println("The framebuffer memory is not aligned!"); } return -1; } From 4e2e81c8d44c1bcc7dbe318727d402e57654aa3e Mon Sep 17 00:00:00 2001 From: pennam Date: Thu, 18 Apr 2024 15:18:16 +0200 Subject: [PATCH 23/37] MbedSSLClient: remove the possibility to set timeout from constructor --- libraries/SocketWrapper/src/MbedSSLClient.cpp | 4 ---- libraries/SocketWrapper/src/MbedSSLClient.h | 2 -- 2 files changed, 6 deletions(-) diff --git a/libraries/SocketWrapper/src/MbedSSLClient.cpp b/libraries/SocketWrapper/src/MbedSSLClient.cpp index 3233c8dba..e0aa1d2dd 100644 --- a/libraries/SocketWrapper/src/MbedSSLClient.cpp +++ b/libraries/SocketWrapper/src/MbedSSLClient.cpp @@ -1,9 +1,5 @@ #include "MbedSSLClient.h" -arduino::MbedSSLClient::MbedSSLClient(unsigned long timeout): MbedClient(timeout), _disableSNI{false} { - onBeforeConnect(mbed::callback(this, &MbedSSLClient::setRootCA)); -} - arduino::MbedSSLClient::MbedSSLClient(): _disableSNI{false} { onBeforeConnect(mbed::callback(this, &MbedSSLClient::setRootCA)); }; diff --git a/libraries/SocketWrapper/src/MbedSSLClient.h b/libraries/SocketWrapper/src/MbedSSLClient.h index ddedcb563..34f4d583d 100644 --- a/libraries/SocketWrapper/src/MbedSSLClient.h +++ b/libraries/SocketWrapper/src/MbedSSLClient.h @@ -33,8 +33,6 @@ class MbedSSLClient : public arduino::MbedClient { public: MbedSSLClient(); - MbedSSLClient(unsigned long timeout); - virtual ~MbedSSLClient() { stop(); } From c5972429fc42ac8db85e4e38dca4a5b870c6b58f Mon Sep 17 00:00:00 2001 From: pennam Date: Thu, 18 Apr 2024 15:20:02 +0200 Subject: [PATCH 24/37] GSM: fix context initialization when client method is called before GSM.begin() --- libraries/GSM/src/GSM.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/libraries/GSM/src/GSM.cpp b/libraries/GSM/src/GSM.cpp index f45d7b35c..cf5f5b975 100644 --- a/libraries/GSM/src/GSM.cpp +++ b/libraries/GSM/src/GSM.cpp @@ -50,7 +50,9 @@ int arduino::GSMClass::begin(const char* pin, const char* apn, const char* usern reset(); } - _context = mbed::CellularContext::get_default_instance(); + if (!_context) { + _context = mbed::CellularContext::get_default_instance(); + } if (_context == nullptr) { DEBUG_ERROR("Invalid mbed::CellularContext"); @@ -117,7 +119,10 @@ void arduino::GSMClass::end() { } int arduino::GSMClass::disconnect() { - return _context->disconnect(); + if (_context) { + return _context->disconnect(); + } + return 0; } unsigned long arduino::GSMClass::getTime() @@ -144,9 +149,12 @@ bool arduino::GSMClass::isConnected() } } - - NetworkInterface* arduino::GSMClass::getNetwork() { + /* Can happen this is called before GSM.begin( .. ) when configuring GSMSSLClient + * from sketch calling client.appendCustomCACert( .. ) */ + if (!_context) { + _context = mbed::CellularContext::get_default_instance(); + } return _context; } From 7eecb7cab16b655e5dfea3b828debe72b8b17b77 Mon Sep 17 00:00:00 2001 From: pennam Date: Thu, 18 Apr 2024 15:28:53 +0200 Subject: [PATCH 25/37] GSMSSLClient example update root_ca and enable GSM library debug --- .../examples/GSMSSLClient/GSMSSLClient.ino | 14 ++++-- libraries/GSM/examples/GSMSSLClient/root_ca.h | 44 +++++++++++-------- 2 files changed, 35 insertions(+), 23 deletions(-) diff --git a/libraries/GSM/examples/GSMSSLClient/GSMSSLClient.ino b/libraries/GSM/examples/GSMSSLClient/GSMSSLClient.ino index 0aa85f669..721b8ea12 100644 --- a/libraries/GSM/examples/GSMSSLClient/GSMSSLClient.ino +++ b/libraries/GSM/examples/GSMSSLClient/GSMSSLClient.ino @@ -1,5 +1,5 @@ /* - GSMSSLlient + GSMSSLClient This sketch connects to a website (https://example.com) using the Portenta CAT.M1/NB IoT GNSS Shield and TLS. @@ -7,6 +7,8 @@ */ #include +#include +#include #include "arduino_secrets.h" #if defined(ARDUINO_EDGE_CONTROL) @@ -25,6 +27,9 @@ GSMSSLClient client; void setup() { + Serial.begin(9600); + while(!Serial) {} + #if defined(ARDUINO_EDGE_CONTROL) // Power ON MKR2 pinMode(ON_MKR2, OUTPUT); @@ -34,13 +39,14 @@ void setup() { client.appendCustomCACert(root_ca); #endif - Serial.begin(115200); - while(!Serial) {} - // To enable AT Trace debug uncomment the following lines //GSM.trace(Serial); //GSM.setTraceLevel(4); + // Enable GSM library debug + Debug.setDebugOutputStream(&Serial); + Debug.setDebugLevel(4); + Serial.println("Starting Carrier Network registration"); if(!GSM.begin(pin, apn, username, pass, CATM1, BAND_3 | BAND_20 | BAND_19)){ Serial.println("The board was not able to register to the network..."); diff --git a/libraries/GSM/examples/GSMSSLClient/root_ca.h b/libraries/GSM/examples/GSMSSLClient/root_ca.h index c314f4cc2..581338be2 100644 --- a/libraries/GSM/examples/GSMSSLClient/root_ca.h +++ b/libraries/GSM/examples/GSMSSLClient/root_ca.h @@ -1,23 +1,29 @@ static const char root_ca[] = "-----BEGIN CERTIFICATE-----\n" -"MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh\n" +"MIIEyDCCA7CgAwIBAgIQDPW9BitWAvR6uFAsI8zwZjANBgkqhkiG9w0BAQsFADBh\n" "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\n" -"d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD\n" -"QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT\n" -"MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\n" -"b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG\n" -"9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB\n" -"CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97\n" -"nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt\n" -"43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P\n" -"T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4\n" -"gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO\n" -"BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR\n" -"TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw\n" -"DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr\n" -"hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg\n" -"06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF\n" -"PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls\n" -"YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk\n" -"CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=\n" +"d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\n" +"MjAeFw0yMTAzMzAwMDAwMDBaFw0zMTAzMjkyMzU5NTlaMFkxCzAJBgNVBAYTAlVT\n" +"MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxMzAxBgNVBAMTKkRpZ2lDZXJ0IEdsb2Jh\n" +"bCBHMiBUTFMgUlNBIFNIQTI1NiAyMDIwIENBMTCCASIwDQYJKoZIhvcNAQEBBQAD\n" +"ggEPADCCAQoCggEBAMz3EGJPprtjb+2QUlbFbSd7ehJWivH0+dbn4Y+9lavyYEEV\n" +"cNsSAPonCrVXOFt9slGTcZUOakGUWzUb+nv6u8W+JDD+Vu/E832X4xT1FE3LpxDy\n" +"FuqrIvAxIhFhaZAmunjZlx/jfWardUSVc8is/+9dCopZQ+GssjoP80j812s3wWPc\n" +"3kbW20X+fSP9kOhRBx5Ro1/tSUZUfyyIxfQTnJcVPAPooTncaQwywa8WV0yUR0J8\n" +"osicfebUTVSvQpmowQTCd5zWSOTOEeAqgJnwQ3DPP3Zr0UxJqyRewg2C/Uaoq2yT\n" +"zGJSQnWS+Jr6Xl6ysGHlHx+5fwmY6D36g39HaaECAwEAAaOCAYIwggF+MBIGA1Ud\n" +"EwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFHSFgMBmx9833s+9KTeqAx2+7c0XMB8G\n" +"A1UdIwQYMBaAFE4iVCAYlebjbuYP+vq5Eu0GF485MA4GA1UdDwEB/wQEAwIBhjAd\n" +"BgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwdgYIKwYBBQUHAQEEajBoMCQG\n" +"CCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQAYIKwYBBQUHMAKG\n" +"NGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RH\n" +"Mi5jcnQwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybDMuZGlnaWNlcnQuY29t\n" +"L0RpZ2lDZXJ0R2xvYmFsUm9vdEcyLmNybDA9BgNVHSAENjA0MAsGCWCGSAGG/WwC\n" +"ATAHBgVngQwBATAIBgZngQwBAgEwCAYGZ4EMAQICMAgGBmeBDAECAzANBgkqhkiG\n" +"9w0BAQsFAAOCAQEAkPFwyyiXaZd8dP3A+iZ7U6utzWX9upwGnIrXWkOH7U1MVl+t\n" +"wcW1BSAuWdH/SvWgKtiwla3JLko716f2b4gp/DA/JIS7w7d7kwcsr4drdjPtAFVS\n" +"slme5LnQ89/nD/7d+MS5EHKBCQRfz5eeLjJ1js+aWNJXMX43AYGyZm0pGrFmCW3R\n" +"bpD0ufovARTFXFZkAdl9h6g4U5+LXUZtXMYnhIHUfoyMo5tS58aI7Dd8KvvwVVo4\n" +"chDYABPPTHPbqjc1qCmBaZx2vN4Ye5DUys/vZwP9BFohFrH/6j/f3IL16/RZkiMN\n" +"JCqVJUzKoZHm1Lesh3Sz8W2jmdv51b2EQJ8HmA==\n" "-----END CERTIFICATE-----\n"; From aca5d7ad2ea819319e5992d1ea898c87af55712a Mon Sep 17 00:00:00 2001 From: pennam Date: Thu, 18 Apr 2024 15:31:46 +0200 Subject: [PATCH 26/37] GSMClient example: enable GSM library debug --- .../GSM/examples/GSMClient/GSMClient.ino | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/libraries/GSM/examples/GSMClient/GSMClient.ino b/libraries/GSM/examples/GSMClient/GSMClient.ino index 14b031b0b..287cac24c 100644 --- a/libraries/GSM/examples/GSMClient/GSMClient.ino +++ b/libraries/GSM/examples/GSMClient/GSMClient.ino @@ -1,6 +1,16 @@ +/* + GSMClient + + This sketch connects to a website (https://example.com) + using the Portenta CAT.M1/NB IoT GNSS Shield. + + */ + #include +#include +#include +#include "arduino_secrets.h" -#include "arduino_secrets.h" char pin[] = SECRET_PIN; char apn[] = SECRET_APN; char username[] = SECRET_USERNAME; @@ -13,19 +23,22 @@ GSMClient client; void setup() { + Serial.begin(9600); + while(!Serial) {} + #if defined(ARDUINO_EDGE_CONTROL) // Power ON MKR2 pinMode(ON_MKR2, OUTPUT); digitalWrite(ON_MKR2, HIGH); #endif - Serial.begin(115200); - while(!Serial) {} - // To enable AT Trace debug uncomment the following lines //GSM.trace(Serial); //GSM.setTraceLevel(4); + Debug.setDebugOutputStream(&Serial); + Debug.setDebugLevel(4); + Serial.println("Starting Carrier Network registration"); if(!GSM.begin(pin, apn, username, pass, CATNB, BAND_20 | BAND_19)){ Serial.println("The board was not able to register to the network..."); From a588a81f1cb8792c5f5ab0588577ae7d61df9d01 Mon Sep 17 00:00:00 2001 From: pennam Date: Thu, 18 Apr 2024 15:49:46 +0200 Subject: [PATCH 27/37] Compile examples: add Arduino_DebugUtils librery dependency --- .github/workflows/compile-examples.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/compile-examples.yml b/.github/workflows/compile-examples.yml index 71c0cef9d..645f35f96 100644 --- a/.github/workflows/compile-examples.yml +++ b/.github/workflows/compile-examples.yml @@ -72,6 +72,7 @@ jobs: - name: ArduinoGraphics - name: Arduino_GigaDisplayTouch - name: emWin + - name: Arduino_DebugUtils additional-sketch-paths: | - libraries/PDM - libraries/doom @@ -177,6 +178,7 @@ jobs: fqbn: arduino:mbed:edge_control additional-libraries: | - name: MicroNMEA + - name: Arduino_DebugUtils additional-sketch-paths: | - libraries/GSM - libraries/USBHID From 5ca5520c90f39082a9d2b123ec9e2cf65ac155cb Mon Sep 17 00:00:00 2001 From: iabdalkader Date: Thu, 18 Apr 2024 15:58:43 +0200 Subject: [PATCH 28/37] ea_malloc: Fix `defrag_free_list` block size bug. Fixes #864. --- libraries/ea_malloc/malloc_freelist.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/ea_malloc/malloc_freelist.c b/libraries/ea_malloc/malloc_freelist.c index 833597baa..aa6fed5f9 100644 --- a/libraries/ea_malloc/malloc_freelist.c +++ b/libraries/ea_malloc/malloc_freelist.c @@ -20,7 +20,7 @@ /* * This is the container for our free-list. - * Node the usage of the linked list here: the library uses offsetof + * Note the usage of the linked list here: the library uses offsetof * and container_of to manage the list and get back to the parent struct. */ typedef struct @@ -67,7 +67,7 @@ void defrag_free_list(void) { if((((uintptr_t)&lb->block) + lb->size) == (uintptr_t)b) { - lb->size += sizeof(*b) + b->size; + lb->size += ALLOC_HEADER_SZ + b->size; list_del(&b->node); continue; } From 715433788f067e4d42adba8d64c263df5299ba19 Mon Sep 17 00:00:00 2001 From: iabdalkader Date: Fri, 19 Apr 2024 12:49:51 +0200 Subject: [PATCH 29/37] Wire: Fix buffer overflow in requestFrom. Fixes #813 Signed-off-by: iabdalkader --- libraries/Wire/Wire.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/Wire/Wire.cpp b/libraries/Wire/Wire.cpp index 38c6f7e91..ddd3a3ce4 100644 --- a/libraries/Wire/Wire.cpp +++ b/libraries/Wire/Wire.cpp @@ -93,6 +93,7 @@ uint8_t arduino::MbedI2C::endTransmission(void) { size_t arduino::MbedI2C::requestFrom(uint8_t address, size_t len, bool stopBit) { char buf[256]; + len = min(len, sizeof(buf)); int ret = master->read(address << 1, buf, len, !stopBit); if (ret != 0) { return 0; From b172e128592f879bac618a1fa4b77d008a83a3c5 Mon Sep 17 00:00:00 2001 From: Andrea Gilardoni Date: Tue, 23 Apr 2024 11:26:12 +0200 Subject: [PATCH 30/37] MbedClient: improving logic of readSocket --- libraries/SocketWrapper/src/MbedClient.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/libraries/SocketWrapper/src/MbedClient.cpp b/libraries/SocketWrapper/src/MbedClient.cpp index 06427b293..49188df7e 100644 --- a/libraries/SocketWrapper/src/MbedClient.cpp +++ b/libraries/SocketWrapper/src/MbedClient.cpp @@ -22,15 +22,13 @@ void arduino::MbedClient::readSocket() { int ret = NSAPI_ERROR_WOULD_BLOCK; do { mutex->lock(); - if (sock == nullptr) { - goto cleanup; - } - mutex->unlock(); - if (rxBuffer.availableForStore() == 0) { + if (sock != nullptr && rxBuffer.availableForStore() == 0) { + mutex->unlock(); yield(); continue; + } else if (sock == nullptr) { + goto cleanup; } - mutex->lock(); ret = sock->recv(data, rxBuffer.availableForStore()); if (ret < 0 && ret != NSAPI_ERROR_WOULD_BLOCK) { goto cleanup; From 79d35efeeb94ee89c01e1dc934516cbfb26a3ef7 Mon Sep 17 00:00:00 2001 From: iabdalkader Date: Mon, 22 Apr 2024 10:53:28 +0200 Subject: [PATCH 31/37] WiFi: Support for hidden networks and misc fixes. - Add support for connecting to hidden networks (issue #855). - Implement `begin()` for OPEN security. - Deprecate WEP security (issue #819). - Add sanity checks to all functions accepting network index from the user. Signed-off-by: iabdalkader --- libraries/WiFi/src/WiFi.cpp | 105 ++++++++++++++++++++++++++---------- libraries/WiFi/src/WiFi.h | 13 +---- 2 files changed, 78 insertions(+), 40 deletions(-) diff --git a/libraries/WiFi/src/WiFi.cpp b/libraries/WiFi/src/WiFi.cpp index 1c3a9945d..09e8c6e56 100644 --- a/libraries/WiFi/src/WiFi.cpp +++ b/libraries/WiFi/src/WiFi.cpp @@ -3,6 +3,39 @@ #define SSID_MAX_LENGTH 32 #define SSID_MAX_COUNT 64 +static uint8_t sec2enum(nsapi_security_t sec) { + switch (sec) { + case NSAPI_SECURITY_NONE: + return ENC_TYPE_NONE; + case NSAPI_SECURITY_WEP: + return ENC_TYPE_WEP; + case NSAPI_SECURITY_WPA: + return ENC_TYPE_TKIP; + case NSAPI_SECURITY_WPA2: + return ENC_TYPE_CCMP; + case NSAPI_SECURITY_WPA_WPA2: + return ENC_TYPE_CCMP; + case NSAPI_SECURITY_UNKNOWN: + default: + return ENC_TYPE_AUTO; + } +} + +static nsapi_security_t enum2sec(wl_enc_type sec) { + switch (sec) { + case ENC_TYPE_NONE: + return NSAPI_SECURITY_NONE; + case ENC_TYPE_WEP: + return NSAPI_SECURITY_WEP; + case ENC_TYPE_TKIP: + return NSAPI_SECURITY_WPA; + case ENC_TYPE_CCMP: + return NSAPI_SECURITY_WPA_WPA2; + default: + return NSAPI_SECURITY_UNKNOWN; + } +} + bool arduino::WiFiClass::isVisible(const char* ssid) { for (int i = 0; i < SSID_MAX_COUNT; i++) { if (strncmp(ap_list[i].get_ssid(), ssid, SSID_MAX_LENGTH) == 0) { @@ -13,7 +46,7 @@ bool arduino::WiFiClass::isVisible(const char* ssid) { return false; } -int arduino::WiFiClass::begin(const char* ssid, const char* passphrase) { +int arduino::WiFiClass::begin(const char* ssid, const char* passphrase, wl_enc_type security) { if (wifi_if == nullptr) { return 0; } @@ -21,10 +54,13 @@ int arduino::WiFiClass::begin(const char* ssid, const char* passphrase) { wifi_if->attach(&arduino::WiFiClass::statusCallback); scanNetworks(); - // use scan result to populate security field - if (!isVisible(ssid)) { - _currentNetworkStatus = WL_CONNECT_FAILED; - return _currentNetworkStatus; + + if (isVisible(ssid)) { + // Set the network security mode from the scan result. + _security = ap_list[connected_ap].get_security(); + } else { + // For hidden networks, the security mode must be set explicitly. + _security = enum2sec(security); } wifi_if->set_dhcp(!_useStaticIP); @@ -36,7 +72,7 @@ int arduino::WiFiClass::begin(const char* ssid, const char* passphrase) { wifi_if->add_dns_server(_dnsServer1, if_name); // pushes dnsServer2 at index 1 } - nsapi_error_t result = wifi_if->connect(ssid, passphrase, ap_list[connected_ap].get_security()); + nsapi_error_t result = wifi_if->connect(ssid, passphrase, _security); if(result == NSAPI_ERROR_IS_CONNECTED) { wifi_if->disconnect(); @@ -46,6 +82,10 @@ int arduino::WiFiClass::begin(const char* ssid, const char* passphrase) { return _currentNetworkStatus; } +int arduino::WiFiClass::begin(const char* ssid) { + return begin(ssid, NULL, ENC_TYPE_NONE); +} + //Config Wifi to set Static IP && Disable DHCP void arduino::WiFiClass::config(const char* localip, const char* netmask, const char* gateway){ SocketHelpers::config(IPAddress(localip), dnsIP(0), IPAddress(gateway), IPAddress(netmask)); @@ -161,25 +201,8 @@ int arduino::WiFiClass::setSSID(const char* ssid) { return 1; } -static uint8_t sec2enum(nsapi_security_t sec) { - switch (sec) { - case NSAPI_SECURITY_NONE: - return ENC_TYPE_NONE; - case NSAPI_SECURITY_WEP: - return ENC_TYPE_WEP; - case NSAPI_SECURITY_WPA: - return ENC_TYPE_TKIP; - case NSAPI_SECURITY_WPA2: - return ENC_TYPE_CCMP; - case NSAPI_SECURITY_WPA_WPA2: - return ENC_TYPE_CCMP; - case NSAPI_SECURITY_UNKNOWN: - default: - return ENC_TYPE_AUTO; - } -} - int8_t arduino::WiFiClass::scanNetworks() { + connected_ap = SSID_MAX_COUNT; uint8_t count = SSID_MAX_COUNT; if (ap_list != nullptr) { free(ap_list); @@ -189,23 +212,39 @@ int8_t arduino::WiFiClass::scanNetworks() { } char* arduino::WiFiClass::SSID(uint8_t networkItem) { + if (networkItem >= SSID_MAX_COUNT) { + return NULL; + } return (char*)ap_list[networkItem].get_ssid(); } int32_t arduino::WiFiClass::RSSI(uint8_t networkItem) { + if (networkItem >= SSID_MAX_COUNT) { + return 0; + } return ap_list[networkItem].get_rssi(); } uint8_t arduino::WiFiClass::encryptionType(uint8_t networkItem) { + if (networkItem >= SSID_MAX_COUNT) { + return ENC_TYPE_UNKNOWN; + } return sec2enum(ap_list[networkItem].get_security()); } uint8_t* arduino::WiFiClass::BSSID(uint8_t networkItem, uint8_t* bssid) { - memcpy(bssid, ap_list[networkItem].get_bssid(), 6); + if (networkItem >= SSID_MAX_COUNT) { + memset(bssid, 0, 6); + } else { + memcpy(bssid, ap_list[networkItem].get_bssid(), 6); + } return bssid; } uint8_t arduino::WiFiClass::channel(uint8_t networkItem) { + if (networkItem >= SSID_MAX_COUNT) { + return -1; + } return ap_list[networkItem].get_channel(); } @@ -218,13 +257,21 @@ uint8_t arduino::WiFiClass::status() { } uint8_t arduino::WiFiClass::encryptionType() { - return sec2enum(ap_list[connected_ap].get_security()); + if (connected_ap >= SSID_MAX_COUNT) { + return sec2enum(_security); + } else { + return sec2enum(ap_list[connected_ap].get_security()); + } } uint8_t* arduino::WiFiClass::BSSID(unsigned char* bssid) { - const uint8_t* reverse_bssid = ap_list[connected_ap].get_bssid(); - for (int b = 0; b < 6; b++) { - bssid[b] = reverse_bssid[5 - b]; + if (connected_ap >= SSID_MAX_COUNT) { + memset(bssid, 0, 6); + } else { + const uint8_t* reverse_bssid = ap_list[connected_ap].get_bssid(); + for (int b = 0; b < 6; b++) { + bssid[b] = reverse_bssid[5 - b]; + } } return bssid; } diff --git a/libraries/WiFi/src/WiFi.h b/libraries/WiFi/src/WiFi.h index 77a64f783..f90a0747f 100644 --- a/libraries/WiFi/src/WiFi.h +++ b/libraries/WiFi/src/WiFi.h @@ -67,16 +67,6 @@ class WiFiClass : public MbedSocketClass { */ int begin(const char* ssid); - /* Start Wifi connection with WEP encryption. - * Configure a key into the device. The key type (WEP-40, WEP-104) - * is determined by the size of the key (5 bytes for WEP-40, 13 bytes for WEP-104). - * - * param ssid: Pointer to the SSID string. - * param key_idx: The key index to set. Valid values are 0-3. - * param key: Key input buffer. - */ - int begin(const char* ssid, uint8_t key_idx, const char* key); - void MACAddress(uint8_t *mac_address); /* Start Wifi connection with passphrase @@ -86,7 +76,7 @@ class WiFiClass : public MbedSocketClass { * param passphrase: Passphrase. Valid characters in a passphrase * must be between ASCII 32-126 (decimal). */ - int begin(const char* ssid, const char* passphrase); + int begin(const char* ssid, const char* passphrase, wl_enc_type security = ENC_TYPE_CCMP); // Inherit config methods from the parent class using MbedSocketClass::config; @@ -201,6 +191,7 @@ class WiFiClass : public MbedSocketClass { WiFiInterface* wifi_if = nullptr; WiFiAccessPoint* ap_list = nullptr; uint8_t connected_ap; + nsapi_security_t _security; int setSSID(const char* ssid); void ensureDefaultAPNetworkConfiguration(); static void* handleAPEvents(whd_interface_t ifp, const whd_event_header_t* event_header, const uint8_t* event_data, void* handler_user_data); From de0003ca1fb6f30d5044402a4d6a873aedb7faa5 Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Mon, 29 Apr 2024 10:44:42 +0200 Subject: [PATCH 32/37] patches: add adc DUAL_PAD patch for STM32H747_M4 --- ..._PAD-fix-definitions-for-GENERIC_M4-.patch | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 patches/0228-stm32h7-adc-DUAL_PAD-fix-definitions-for-GENERIC_M4-.patch diff --git a/patches/0228-stm32h7-adc-DUAL_PAD-fix-definitions-for-GENERIC_M4-.patch b/patches/0228-stm32h7-adc-DUAL_PAD-fix-definitions-for-GENERIC_M4-.patch new file mode 100644 index 000000000..16061d42e --- /dev/null +++ b/patches/0228-stm32h7-adc-DUAL_PAD-fix-definitions-for-GENERIC_M4-.patch @@ -0,0 +1,40 @@ +From 992ed2cca5ebbce5f817d9fd25b2162ff8e77bbe Mon Sep 17 00:00:00 2001 +From: Martino Facchin +Date: Mon, 29 Apr 2024 10:41:37 +0200 +Subject: [PATCH] stm32h7: adc: DUAL_PAD: fix definitions for GENERIC_M4 target + +Completes 2e1da0130 and fixes https://github.com/arduino/ArduinoCore-mbed/issues/867 +--- + .../TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/PinNames.h | 2 +- + targets/TARGET_STM/tools/STM32_gen_PeripheralPins.py | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/PinNames.h b/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/PinNames.h +index 97d48334d7..04a34504a7 100644 +--- a/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/PinNames.h ++++ b/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/PinNames.h +@@ -43,7 +43,7 @@ + extern "C" { + #endif + +-#define DUAL_PAD 0xF00 ++#define DUAL_PAD 0x800 + + typedef enum { + ALT0 = 0x100, +diff --git a/targets/TARGET_STM/tools/STM32_gen_PeripheralPins.py b/targets/TARGET_STM/tools/STM32_gen_PeripheralPins.py +index 44a95f9c02..903ce5f7e0 100644 +--- a/targets/TARGET_STM/tools/STM32_gen_PeripheralPins.py ++++ b/targets/TARGET_STM/tools/STM32_gen_PeripheralPins.py +@@ -491,7 +491,7 @@ extern "C" { + + if DUAL_PAD: + line_to_write = (""" +-#define DUAL_PAD 0xF00 ++#define DUAL_PAD 0x800 + """) + out_h_file.write(line_to_write) + +-- +2.44.0 + From bf1557720a7e488e9e07719022dc32b9af867843 Mon Sep 17 00:00:00 2001 From: pennam Date: Mon, 29 Apr 2024 11:26:04 +0200 Subject: [PATCH 33/37] SocketWrapper: remove unused files --- .../src/utility/wl_definitions.h | 78 ------------------- .../SocketWrapper/src/utility/wl_types.h | 53 ------------- 2 files changed, 131 deletions(-) delete mode 100644 libraries/SocketWrapper/src/utility/wl_definitions.h delete mode 100644 libraries/SocketWrapper/src/utility/wl_types.h diff --git a/libraries/SocketWrapper/src/utility/wl_definitions.h b/libraries/SocketWrapper/src/utility/wl_definitions.h deleted file mode 100644 index 9ea1f9fe4..000000000 --- a/libraries/SocketWrapper/src/utility/wl_definitions.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - wl_definitions.h - Library for Arduino Wifi shield. - Copyright (c) 2011-2014 Arduino. All right reserved. - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ -/* - * wl_definitions.h - * - * Created on: Mar 6, 2011 - * Author: dlafauci - */ - -#ifndef WL_DEFINITIONS_H_ -#define WL_DEFINITIONS_H_ - -// Maximum size of a SSID -#define WL_SSID_MAX_LENGTH 32 -// Length of passphrase. Valid lengths are 8-63. -#define WL_WPA_KEY_MAX_LENGTH 63 -// Length of key in bytes. Valid values are 5 and 13. -#define WL_WEP_KEY_MAX_LENGTH 13 -// Size of a MAC-address or BSSID -#define WL_MAC_ADDR_LENGTH 6 -// Size of a MAC-address or BSSID -#define WL_IPV4_LENGTH 4 -// Maximum size of a SSID list -#define WL_NETWORKS_LIST_MAXNUM 10 -// Maxmium number of socket -#define MAX_SOCK_NUM 4 -// Socket not available constant -#define SOCK_NOT_AVAIL 255 -// Default state value for Wifi state field -#define NA_STATE -1 -//Maximum number of attempts to establish wifi connection -#define WL_MAX_ATTEMPT_CONNECTION 10 - -typedef enum { - WL_NO_SHIELD = 255, - WL_NO_MODULE = 255, - WL_IDLE_STATUS = 0, - WL_NO_SSID_AVAIL, - WL_SCAN_COMPLETED, - WL_CONNECTED, - WL_CONNECT_FAILED, - WL_CONNECTION_LOST, - WL_DISCONNECTED, - WL_AP_LISTENING, - WL_AP_CONNECTED, - WL_AP_FAILED -} wl_status_t; - -/* Encryption modes */ -enum wl_enc_type { /* Values map to 802.11 encryption suites... */ - ENC_TYPE_WEP = 5, - ENC_TYPE_TKIP = 2, - ENC_TYPE_CCMP = 4, - /* ... except these two, 7 and 8 are reserved in 802.11-2007 */ - ENC_TYPE_NONE = 7, - ENC_TYPE_UNKNOWN = 9, - ENC_TYPE_AUTO = 8 -}; - -#if defined(ARDUINO_PORTENTA_H7_M7) -#include "whd_version.h" -#define WIFI_FIRMWARE_LATEST_VERSION WHD_VERSION -#endif - -#endif /* WL_DEFINITIONS_H_ */ diff --git a/libraries/SocketWrapper/src/utility/wl_types.h b/libraries/SocketWrapper/src/utility/wl_types.h deleted file mode 100644 index 65f8caae2..000000000 --- a/libraries/SocketWrapper/src/utility/wl_types.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - wl_types.h - Library for Arduino Wifi shield. - Copyright (c) 2011-2014 Arduino. All right reserved. - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ -/* - * wl_types.h - * - * Created on: Jul 30, 2010 - * Author: dlafauci - */ - - -#ifndef _WL_TYPES_H_ -#define _WL_TYPES_H_ - -#include - -typedef enum { - WL_FAILURE = -1, - WL_SUCCESS = 1, -} wl_error_code_t; - -/* Authentication modes */ -enum wl_auth_mode { - AUTH_MODE_INVALID, - AUTH_MODE_AUTO, - AUTH_MODE_OPEN_SYSTEM, - AUTH_MODE_SHARED_KEY, - AUTH_MODE_WPA, - AUTH_MODE_WPA2, - AUTH_MODE_WPA_PSK, - AUTH_MODE_WPA2_PSK -}; - -typedef enum { - WL_PING_DEST_UNREACHABLE = -1, - WL_PING_TIMEOUT = -2, - WL_PING_UNKNOWN_HOST = -3, - WL_PING_ERROR = -4 -} wl_ping_result_t; - -#endif //_WL_TYPES_H_ \ No newline at end of file From 0183e059f77519d88757cff848a11f4f9a99b963 Mon Sep 17 00:00:00 2001 From: pennam Date: Mon, 29 Apr 2024 11:26:19 +0200 Subject: [PATCH 34/37] Add WHD_VERSION definition for GIGA OPTA and NICLA VISION --- libraries/WiFi/src/utility/wl_definitions.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libraries/WiFi/src/utility/wl_definitions.h b/libraries/WiFi/src/utility/wl_definitions.h index 3e6239140..43091d590 100644 --- a/libraries/WiFi/src/utility/wl_definitions.h +++ b/libraries/WiFi/src/utility/wl_definitions.h @@ -74,7 +74,8 @@ enum wl_enc_type { /* Values map to 802.11 Cipher Algorithm Identifier */ ENC_TYPE_AUTO = 8 }; -#if defined(ARDUINO_PORTENTA_H7_M7) +#if defined(ARDUINO_PORTENTA_H7_M7) || defined(ARDUINO_NICLA_VISION) || \ + defined(ARDUINO_GIGA) || defined(ARDUINO_OPTA) #include "whd_version.h" #define WIFI_FIRMWARE_LATEST_VERSION WHD_VERSION #endif From 80ebbf7917f9b7a8ee03c61a624b6c0ecaa645da Mon Sep 17 00:00:00 2001 From: Sebastian Romero Date: Wed, 31 Jan 2024 14:35:07 -0300 Subject: [PATCH 35/37] Add dropdown for image filter --- .../Camera/extras/WebSerialCamera/app.js | 45 ++++++++++++++++--- .../Camera/extras/WebSerialCamera/index.html | 13 +++++- .../Camera/extras/WebSerialCamera/style.css | 17 ++++++- .../extras/WebSerialCamera/transformers.js | 1 + 4 files changed, 67 insertions(+), 9 deletions(-) diff --git a/libraries/Camera/extras/WebSerialCamera/app.js b/libraries/Camera/extras/WebSerialCamera/app.js index 68823b347..364a7d1d5 100644 --- a/libraries/Camera/extras/WebSerialCamera/app.js +++ b/libraries/Camera/extras/WebSerialCamera/app.js @@ -21,6 +21,7 @@ const connectButton = document.getElementById('connect'); const refreshButton = document.getElementById('refresh'); const startButton = document.getElementById('start'); const saveImageButton = document.getElementById('save-image'); +const filterSelector = document.getElementById('filter-selector'); const canvas = document.getElementById('bitmapCanvas'); const ctx = canvas.getContext('2d'); @@ -28,12 +29,6 @@ const imageDataTransfomer = new ImageDataTransformer(ctx); imageDataTransfomer.setStartSequence([0xfa, 0xce, 0xfe, 0xed]); imageDataTransfomer.setStopSequence([0xda, 0xbb, 0xad, 0x00]); -// 🐣 Uncomment one of the following lines to apply a filter to the image data -// imageDataTransfomer.filter = new GrayScaleFilter(); -// imageDataTransfomer.filter = new BlackAndWhiteFilter(); -// imageDataTransfomer.filter = new SepiaColorFilter(); -// imageDataTransfomer.filter = new PixelateFilter(8); -// imageDataTransfomer.filter = new BlurFilter(8); const connectionHandler = new SerialConnectionHandler(); @@ -54,12 +49,20 @@ connectionHandler.onConnect = async () => { } imageDataTransfomer.setImageMode(imageMode); imageDataTransfomer.setResolution(imageResolution.width, imageResolution.height); + + // Filters are only available for color images + if(imageMode !== 'GRAYSCALE'){ + filterSelector.disabled = false; + } + renderStream(); }; connectionHandler.onDisconnect = () => { - connectButton.textContent = 'Connect'; imageDataTransfomer.reset(); + connectButton.textContent = 'Connect'; + filterSelector.disabled = true; + filterSelector.value = 'none'; }; @@ -122,9 +125,37 @@ saveImageButton.addEventListener('click', () => { link.remove(); }); +filterSelector.addEventListener('change', () => { + const filter = filterSelector.value; + switch(filter){ + case 'none': + imageDataTransfomer.filter = null; + break; + case 'gray-scale': + imageDataTransfomer.filter = new GrayScaleFilter(); + break; + case 'black-and-white': + imageDataTransfomer.filter = new BlackAndWhiteFilter(); + break; + case 'sepia': + imageDataTransfomer.filter = new SepiaColorFilter(); + break; + case 'pixelate': + imageDataTransfomer.filter = new PixelateFilter(8); + break; + case 'blur': + imageDataTransfomer.filter = new BlurFilter(8); + break; + default: + imageDataTransfomer.filter = null; + } +}); + // On page load event, try to connect to the serial port window.addEventListener('load', async () => { + filterSelector.disabled = true; console.log('🚀 Page loaded. Trying to connect to serial port...'); + setTimeout(() => { connectionHandler.autoConnect(); }, 1000); diff --git a/libraries/Camera/extras/WebSerialCamera/index.html b/libraries/Camera/extras/WebSerialCamera/index.html index 3f677a2ff..ba70c1b43 100644 --- a/libraries/Camera/extras/WebSerialCamera/index.html +++ b/libraries/Camera/extras/WebSerialCamera/index.html @@ -9,12 +9,23 @@
-
+
+
+ + +
diff --git a/libraries/Camera/extras/WebSerialCamera/style.css b/libraries/Camera/extras/WebSerialCamera/style.css index ef9f7832f..71fe2c19c 100644 --- a/libraries/Camera/extras/WebSerialCamera/style.css +++ b/libraries/Camera/extras/WebSerialCamera/style.css @@ -22,7 +22,7 @@ body { margin-top: 20px; } -#controls { +.controls { display: flex; flex-direction: row; align-items: center; @@ -58,6 +58,21 @@ button:hover { background-color: var(--main-control-color-hover); } +label { + font-family: 'Open Sans', sans-serif; + font-size: 1rem; + font-weight: bold; + color: var(--secondary-text-color); +} + +select { + font-family: 'Open Sans', sans-serif; + font-size: 1rem; + border: 1px solid #ccc; + padding: 5px 10px; + border-radius: 5px; +} + #refresh { display: none; } diff --git a/libraries/Camera/extras/WebSerialCamera/transformers.js b/libraries/Camera/extras/WebSerialCamera/transformers.js index 722353c20..ac32c43c4 100644 --- a/libraries/Camera/extras/WebSerialCamera/transformers.js +++ b/libraries/Camera/extras/WebSerialCamera/transformers.js @@ -306,6 +306,7 @@ class ImageDataTransformer extends StartStopSequenceTransformer { this.imageMode = null; this.width = null; this.height = null; + this.filter = null; this.imageDataProcessor.reset(); } From f239a27bd6191daff6e63488825816158be61e4f Mon Sep 17 00:00:00 2001 From: pennam Date: Thu, 2 May 2024 09:46:04 +0200 Subject: [PATCH 36/37] full variants rebuild --- .../TARGET_GENERIC_STM32H747_M4/PinNames.h | 2 +- variants/ARDUINO_NANO33BLE/defines.txt | 2 +- variants/ARDUINO_NANO33BLE/libs/libmbed.a | Bin 6254938 -> 6254938 bytes variants/EDGE_CONTROL/defines.txt | 2 +- variants/EDGE_CONTROL/libs/libmbed.a | Bin 7142362 -> 7142362 bytes variants/GENERIC_STM32H747_M4/defines.txt | 2 +- variants/GENERIC_STM32H747_M4/libs/libmbed.a | Bin 7457448 -> 7457440 bytes variants/GIGA/defines.txt | 2 +- variants/GIGA/libs/libmbed.a | Bin 7493196 -> 7493196 bytes variants/NANO_RP2040_CONNECT/defines.txt | 2 +- variants/NANO_RP2040_CONNECT/libs/libmbed.a | Bin 3906822 -> 3906822 bytes variants/NICLA/defines.txt | 2 +- variants/NICLA/libs/libmbed.a | Bin 5973220 -> 5973220 bytes variants/NICLA_VISION/defines.txt | 2 +- variants/NICLA_VISION/libs/libmbed.a | Bin 7959446 -> 7958400 bytes variants/OPTA/defines.txt | 2 +- variants/OPTA/libs/libmbed.a | Bin 7546012 -> 7546012 bytes variants/PORTENTA_H7_M7/defines.txt | 2 +- variants/PORTENTA_H7_M7/libs/libmbed.a | Bin 7746156 -> 7746156 bytes variants/PORTENTA_X8/defines.txt | 2 +- variants/PORTENTA_X8/libs/libmbed.a | Bin 5265376 -> 5265376 bytes variants/RASPBERRY_PI_PICO/defines.txt | 2 +- variants/RASPBERRY_PI_PICO/libs/libmbed.a | Bin 3906822 -> 3906822 bytes 23 files changed, 12 insertions(+), 12 deletions(-) diff --git a/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/PinNames.h b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/PinNames.h index 97d48334d..04a34504a 100644 --- a/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/PinNames.h +++ b/cores/arduino/mbed/targets/TARGET_STM/TARGET_STM32H7/TARGET_STM32H747xI/TARGET_GENERIC_STM32H747_M4/PinNames.h @@ -43,7 +43,7 @@ extern "C" { #endif -#define DUAL_PAD 0xF00 +#define DUAL_PAD 0x800 typedef enum { ALT0 = 0x100, diff --git a/variants/ARDUINO_NANO33BLE/defines.txt b/variants/ARDUINO_NANO33BLE/defines.txt index d4e05641f..9db4877d6 100644 --- a/variants/ARDUINO_NANO33BLE/defines.txt +++ b/variants/ARDUINO_NANO33BLE/defines.txt @@ -34,7 +34,7 @@ -DFEATURE_STORAGE=1 -D__FPU_PRESENT=1 -D__MBED__=1 --DMBED_BUILD_TIMESTAMP=1707145658.676456 +-DMBED_BUILD_TIMESTAMP=1714634438.5709226 -D__MBED_CMSIS_RTOS_CM -DMBED_MPU_CUSTOM -DMBED_TICKLESS diff --git a/variants/ARDUINO_NANO33BLE/libs/libmbed.a b/variants/ARDUINO_NANO33BLE/libs/libmbed.a index 87701ce282545f7e21a75bc08d124be0f4c7168a..4f20e16085530679c4988cef76c3d6d80fe5972f 100644 GIT binary patch delta 20721 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 diff --git a/variants/EDGE_CONTROL/defines.txt b/variants/EDGE_CONTROL/defines.txt index 8e40a6dc3..45fea078e 100644 --- a/variants/EDGE_CONTROL/defines.txt +++ b/variants/EDGE_CONTROL/defines.txt @@ -38,7 +38,7 @@ -DFEATURE_STORAGE=1 -D__FPU_PRESENT=1 -D__MBED__=1 --DMBED_BUILD_TIMESTAMP=1707145833.1860046 +-DMBED_BUILD_TIMESTAMP=1714634611.8500743 -D__MBED_CMSIS_RTOS_CM -DMBED_MPU_CUSTOM -DMBED_TICKLESS diff --git a/variants/EDGE_CONTROL/libs/libmbed.a b/variants/EDGE_CONTROL/libs/libmbed.a index f71c11f5878646696a4afea0aca65cd02e718f54..377fdbf8d5f0f7887034b855fb214209de9aa2c0 100644 GIT binary patch delta 21851 zcmZ{Mdwh(?`uHajbw^k@hDeBN_tHdc@ zN{gb2)11%)#v`U(d zCHds)73bTI9CkS%*Fai-c3$F(uvNja2D0w4vs35J%KVYiyrM)S+2`m|(;2ZOIx^GE zWhNgfwfs_OkOG$ag^?~HE(=@*vLVMcyd^2naMyll({VK zh%jQVbjkBaQcB{g3}n+nm)#+VA#FE%=*jGQm$TZoFbQBI$)UY23xyA@@mjrf=g+i( z%n2QhkcXCuVdYO1%Bx+18+rcxF=No*3NVbHQ~@z9Y-0-mDO(V z3M>fNSs7y;_O;r~ke>`4Z4_Zv4eS0P0)l8?L15)|Wdi>IEPyXf|QD6S~c z4U?SQUl2Bo;&t~uMY!i-8Xvksi=)T zTHyXEDwIt!z2&7Rhb8x&136w@qYf(fWgzD-xUUn`gYK2|i~DkcRl3HI zhweps97~X|%`+AQH!cfH^dwT3dZL<-Wt`w=YN))AEsz+C(!Y08!8OfAv zk6aXxP10nHG?Jf-J@&^jDs0le#YRK@p|u_Y8kP5dw|Zv1Yv?Le*wE`9 zXVFiB;ADZMJo4BskWv~~r6)d}yPQSMg0Vw}!2b2>@>MrZip;%qvteR5NyzN-J&HhG zsNdKwi?pb%{VH7y%PY9iM78 zlA66;VuEotWqZzbsYpSPGIFTNa}l~Dn?#*KtJU**9>>#c_W=V~>{$@WVKk`JeBoKc zg+)NnhXnqqf*rc+`5>MT(_93lyKK?S?9E|ROI{wUIgLuJDs1&+&B{cMN0m7EQ_V(H zSlI3_g7oAP(Tom4=BbQE{h;wMv<3a`w&sZ-Hp=LRPF@?h9?DVCNXB`3T|-L;C6hxy znV(msXWQv+_Vx-yO9a>cRg{7BO7>bO2!JZewTWI)97ceN`A(cCs_M;4y>bNoqAu3_ zp4Vfvdz%ukFK>$rBQxr~zIPQ#F_MbUytMu}r@X{e2kFI;9$IPXmJtC`P%m!{i9YUi ztOMdu6O)#?7Kf8z-+K+iu%*}!*?Z2*fCdyLL0pFz`is|_ERTr(c_ z-Tg=(ckg+ESg7h83H8=sng9wLuQiazVcrkWQ^0hyybaRgEbkK*X7(_Un`gYcq9Ri?Jqd61UV|#2?3e^L5Kg+d`&<=~OUn&J z)7?jldlW_8fHZH$uyFEXyw3q|T#U*zH{0i)pbFI9CYAWS7Ql2Vih%tt#8@09(Jf!G z#K#G@9F~x`eAjZHL1=7IN=(wf=kuu`F6uIFZ1CwNz?5iE?{k)qC9sA~m|pe_(%Z|6 z!pYK|KA#95=-9$NKB0oBVXTpC{KhA^V_Qxyedn_q(+rh7@}ticVLF=h?z-SJvpp>P znop?!19}Xk<%Z7=wDc%RW=-1uvu_wV_M4Bdz#q*(obLK$3u2Zdo3ypa(3^bFLEAw@ zmep>bv$le(9i5q^X|yQXwjys*J4wsa8>)tS^6?AWHw8Rc z+b9(k>f_1ZXKMQjlfnlGEpxQL2;5WHe-~(HasDJKzWHxzrwMpee7D~9O&}wdY5x=^ zrQ#d32DISsE3_Z+4+IkKX`=Qy>Wt*{N7`nNqDXGX$Jz}7j4nQHyLOPUIE}HVc4|!m z9wpr83+>MW9yJdAKJ5izcVzmA_B*Xsz%v0YQqfawJbC??cCIifAm@|uC;vwcNXZ%P zJ6uBGbdAL0lJ*Y{lIWbkUpy)Pk9I-ZISoxWwWkCS&<^Rx9qmF9=BOJ(e!8ojA;2i@ zwGXvN1em-I0owO)7y(!d|5qUeP!h=qXWc7pKa3%LJ#^w4RF3<-bSp*qyyZ29e4*F% z5XZ{O^UPnjwJn~W9PFywEy7gUCX%Z?+b?b;uSVzu!jaN=vMN$1ZUoI`Y|*+}VJBs& zNu_DJ1kz!kZXzd*)F!uOUzRT5ZRRM7rghKKiJC^Uv}-xKtr&=@k2H|Ra$Tb^R>|fn zb*Y$CLP(IazVmZ*aRMHdr2RGB*Mc+@ygJ<&2kG|L*(N1(`EarB6U2g@{Zp+!skYlcTQ}YEHD0 zeV_F8osPaST58=j(NJH}-50Y_HRo8I;MncOS+NAVludd^*(kVB2)S zu*zj*82Q&o-_MZQ=vB+@MzV5@@422#abRJ&m$YnwZxJuZMIAFl z02`;sQ%*d<_jBhHt)$ldKJY#2hsj8=Y>@uDeZNIjRK@V@E8j}YK%)utK?*SKqP!WT z)>XzZ;(gwCE;1Ocqz90A3_=|RWVxlGx#b&yfsn3YAY=dZy@7d%%5hmo{cq@4RM_M$ zdM_>oO7eQW{>x6t1>MZqLHc_FiHiLC{m;ne82uW7I4ZiC1NCMuI#|F+4yEXqIN<^S z@{`uAD}fX#T|by_9QBf<<1jrBoxmHIt)jUhx%!J}3d#opDjm>vVgd<4HJ_6}NyZyq zszPtB(Q8nlRk560q_4!xDq86>6fW26utL=NoKd-LuomEZjq zeH1qaTD)Xl*Y_ICRg%hTMVR5Pg~9AfTLhBFa6zUtZ~vpruo8=eXgXcPJj1DEHWY}H z%jvcI4I_EULG4I$#n31yw;XSz?86md(kICw8shtlVJcS;0$+Ji9WBYNM3ViNVUWNu zpyZR=osAiMn4+fz8ly=doA#L`Ut=T}ASL@ogs~=-lT8)trK!fF+?i07ESYWG%2iSZ zN%O)?;nGh(`)Z`88jnuWhS|mt^40=lU%n`T9nuIkK+82StOjmVY6sc>LnH4XQw=Z> z_svG0?Seq%9!_SXaR(o)*nDu4@t^3xRE@gTVsz#jMH$upYK%)kou^7Mxv$@J>?Xph z;0=k>Aiq{Vl5V5)=&V0Gw~+biqMEVN)x}kxr^P$Edu~^nSK-0_Q&1Lm#oqRq{oluCB3OgmgMRi7oFX)(`j1B) zv=dXVe=Da}af#+qe|MCFGM@yEx^VJ(mH!w%sk}8!^Ze(a<)}-q{g;0t7Tb2knqV82 z;|{2>kN@;f7htr%;^Pxggj;BrXzyrQM8LhSoMl?(Y#tWSAdm=U5_B&{2Xw>Duq&1I zw$gyp*zL7TEza>qvSmX+GjEjLk&E)bH3v-R?IZvhl}-M_wOAwF-jeD}#{4_rPu>fW zF-YzA0k_(K3}p6C0hMj$F%ZX}1JVUbY0Rm)6W}bsWcMXO=@~}8dKlo10Z-lCJ5K|) z2)j$2)90GN7X;B!*uXx44uM=uGy^Tk2uwuRsm|A26gW$OQGyDl1ojdMl6$-BX9tcB zK?9M+BtZ`$Tzc;}vxbcLAn;f8TI$4w^??o;=cvlTkq!wwg4%BOw9|lVQ-Y@p zyA2XINHAX*`EXINt1v0GzQZenD+TMLC1>8Y;9Gt9q%;Uuc@c^?`tm&KE3G zHrb|16EDB)%9%mUi>8@8{4Q&Ro&hxS!bsnjO;3g4wCo%Ds%fVHqpcp(-%R|_T6Mjb z!mQ!shqp|Ag5}T&JU5uWM4gIJoaN1rOkZ=8*tRamj~qQ{svg01FotGJ3oF-oIzVRDEKEm5WJ z$DtuvAq+28(d6V8Lw-5VVRWa4CUkRI&tWvKzI376&RGZ}pmgqR&n#vo5Ed48@6&)N zO4`xj7`g-%Ayz3K^E^U(MXGr6Sh=EEn-Hp-$j4IH@y(%&&@IN&9hNfpWrvXuwuR0` z-V_-~+kP!oaw;-oS18Y4!Dw}0`asn@FWNGWq5+eY?2%}m%5sc6Qg zQN3S?;WI$`VvGgKma^5|9{ z52of8i$sr9d-mvC)SbexvI=Tx>IZJ zLUtFLkMr#z@OifS#aLoKj9)Cuk&)9l^IqovERm{{POdVelLnwL#l{zeDbz0nmOabo zmFtB}R&|2-1kG9hviY=w8aFHwy|nP|EOQnMj({wuDNXO0P0So+kX%C!+H5|BqP8f; zVf)PdpdXV1tRwfuGq0MRSSW|F)VwGEWh6KNMNi`(My2A4>JdZoAnU9`HdH-II=9yP zWFUu8%Xo0knwgE$!FijJlt1{fx{6s%XHcD7rw^V2Ag?#MeW*R3JZM`I8~D-Ba&bons0 zo?2yX+8TWU*HiQ1_4}fK;acf=5rRU)m1qp~7CO{OT-@zL*`*7ML|2$*vdw;dnI3sooS*Y3DGilz;pb^A0Ly3^lc#>ti3XP6F@=45+@3_y@*bKqnN_6dZdb zg-xesAUDfm`=Iiwg`<5|>K)BS&R>e%z|ue1 zOX@V&>iS0s6v$T&No!F58z{gS0!e;%cbsYcS5ZdNJ+XfSx_%~%;e-3PBhNtM()w%r zaFP{2J-z>EVM#fdOAyS%iTAwzOEIFyD7~|NtNM3G)_`XD`Vrjj2`7Eu?>~lBLRK|l ztl!>0{vYaU0Hf)VW8r|GTQ~(&lbj>sYS4eEO8xH8xGBOy)MUDih^y?{W-Oevz7*#o zz~mSJXVPKh>5902U;-OMwy%lPpgqSZK?|pM_;~sPA zDmFJ@f847Ac{Is7^IcpT>T0YKq6VIb`p{d(IVtJqUl*&FHVfA_a8gP^R13mfsZ=10m9%E92l!EAbG^|1!5(60W#k+p05zQ zb9)+49HEUrBv7mp0!iu1`uK182X)qFKXFzS=oTab=~BQ8OfjnKbEa6|UBp(WxY@G} zP^oO~;ceJdfN%6|18m8RpXWf%MYdgt0((Y@Kqb?2v&V2a0dMBTyO9rb;twz}fh7pJ8GPo6FlIFO`%1B2L2MypaS%pWwclsO2P0M<1$jT#ui;xB+? z$GCERY&e-wJ@6O{h5)BAv+VVO9eXgEpg53kt}kvJSi}6g6%uN=YW0Tp>Oi8sIw+;5 z>cFkiak*(a(vleg#)Q;NNPc`t9vE^uoJocaT51$7NyJl z&!i(PLW1_w5*n`Q7olTN%fta+Ct=1Ti(S+ftqVk(#=+vapN6G!il7-NPAz@D)b^kU^(<)$`UpBJ+-VF*e%O^MyG7lj#(~Lv;~4O9 z(sO{Bg8_&NJMWbWKN6Leyng`Bs5n2v!sJ?XekwKfpCsq7Ha1XAJ(m7Raz|7ni$t@( zxQoe0P=_tDpHj5g(bI%C@^dm#g{6{nQ4j=9x}^FhaC^0E{U(tU}r zocNi*XAFukkjkcPd5Q-nnDl}#c=*jJ-?280)k;dAq^xEsJ#a>EEE(KWH?uB;JQXw} zCFo3qOP@rJfKz2%>U+XhdRo&Gn2LQ6tA)@gPG0JripQ`BJQyJWtxAHtt8eNJb{Abn zq+zz(i>a7qA#n1P=K%Li6M$C5i*1^b8jGPxZGAjilDdYqKCG~`d{|CV7Jwj37D%SpSy@WRZV@19|u)bw8RNbWot)e&gJ;RC4aw z;I63HR>d3x!iE^o9M!&Co_$E321%%gmkbznR9$JQ9x_wV71>=#aMwCqnw#yTAs?t2IV3#`g!}UW>pyyV_vS;s*C_yZ8o=P;QhhRPnV;QX6f$Tjy*+c%tr?@T+ChX9;*DG~s%CY2 zKaFda`Y6F?eOkvPoKH!#Vy>iRqHnOOiq-jE8doeuy9vBzo51QhD?A#2%k4X-rH{q2 z>N|o~@ANsCMJZxY^6@+NbnYL-5B357pAYjA+J2Bv+V-6*1qmNYOh3gXtZG?sYPzU; ziiu24OXr+G?@bN^1sUn&Cu0bs%*VKfQ5gjuIqn_Bv2JZ|WkZm-$I{Rj%Bs0k;{AZ3Q6DipwVOF~|Il>S&6L-W zo6kFfGOwc;q6j=}y!9lm5E)mc@(JC>}KsC?=x zkLl;CTn!?1X!_!yY(xQhL@>7rA%5zhc_W0DWmMk2qBn`Jh zh8tLe$O@;|^6i1{Ny9Uzvyn?1b$+Cd439`)klV9;jO5(C;U_Tc*i|z6IcIY+)P7{J zYxYVz4wbK;oJ`D~z)mz^NtziHWM#)pV5BLxe#o}ZvR_4cz(q*;oht<526RWXNhaTS z&+fh%$Eu!i&x<)n9oVvz`-a+_U6{71J@R=obJhq;(5G85ujhP&b``DEn*s0U6ri1} zmrGaY_@Il4Ch&;1!kMjivBlF!>|1ia#0{o0^VyoS95<8V?BA1fp)F2xbIxcCk}8$< z6FDn6m8;~dt-oE&@x;|>gA-2RuH~c+V3w4 zwD=nI`iL`Fe8K&y5~zoJ;hat=T{@12n*69%9?Fr0xr3Y-7sCz&`Vn}Iei{9Y(r=f*_k@%D^|@8}fpvtF zn{v6Qg1)qTLD#%1x3-+=rP9zP%>j8EaeGys=k?9Ihdmg&5Tg%Mcx^vgEqBga`RB0Lnvb~Rw)4Jga3@%c|AA*YMA)rfk3@_^#I=Igp*E> z^1c$Nl6zGwI{|JI$aOAjwgC+A}=4r6K4>hn4Ir`Zkw zjCKO*Kg@rhCG-qd_F4Wr%%=g2mbRMa{3T4r3~$eY{2auKRPvGVllfg)K4Me5Kh<~g z-(faji~OkLsO2iLfIx5QcU?8AzLdkLW4-a`s9ST}z>MVH^n#(Uau{uNmHbiQHHyP% z!>=x5bc&V301w8#I=XB)gISbRe&*598wj)GzN5PPk(fnerm^;+O}!3r_~S9X2lA1y zf|2NMj=5vwFq(>WGZlKVlnpqOPfDbIJH~~Rxe0}zFeQUY>HcIE7iQuG zJau)q$%R|kWegZhmF0Lt;ZElFU?u94Hh*2%y%$nMz)5$nVgD+ZRFp@P3Hf93(Im`A zW#~3`>K)FJDQ{ItjcXJu7k}U;TtB;TgIT_)o;Ei^!thetDtN233LA54*7gx4-9u0wwWMFIW! zgcZeekUl8JBlA8j{wMl8wSzVE>*9?pSpiz))|~`TZ{exWk>Uhg z2=-jAsgWcB7~q1#rP5)z zEoxy0mmn)~`&5|y_fmX54&=#lB+x5|CMz}P4G&7svknY!N=v78f0dqhYfnXmLzDA3 zZ0`#*VY5pWa<0d?-t1|I3R>HJ+_z}$Z~;h8Eawjxhiz0?m|DfY)N$v1)N-u9hY<%?KL1!$$VzT$NG5mYL*UYdWU{77Znq18hte2IY>CZ`>& z#!VBr4XW2cR&SXwpXI1Fda*`N>{llQzQMS%tAo!}P5ht1-_%TW76wzt13zW+1dT9; zz{8_7Oi$?*4d@DCo0m24M}w|Lva?$PS1hlE|r7-04X+Ozxmwkq=qwoGW$=Vbjrz9B{=ky8?e*3PeJa z8u*ce7!3I_%DK*p@`~#iU1A9QLdcl`Y${cfFE>?e;lfaQqHv@BF1yuila~E%FcNqq z*NAz8I@JGE#ZGikF^WaDUa1&_u_lK05wmYqoI!^I<)_?ON&BNB0y7I>RKB;l;#mc} z8&mo~HehsPiIFTaRyv~gvg*$*r4p+@#{J#Y$~nlrx)F6lEAi(cU_x4Vj2cxr3%$2e zdlC4thb>58EYJ*<_S8x#MW99Q6xWbS{Ph=@j(U-`dnS3i>5EH1Ek%V@tdRrI^#~em-!mDZvdHRabux&m9vOlp;fyu9)j5AUyNDaugZsWPk^nr9f;jt#YGHvcI3>!6kElkNUV&Q z$JbQH4M}V>4shrlzCj#O%`yhJpX+Z9BzI^PFAIw9$Mb7Ck;?ux2iY+|l+;{W z?niRsY96t?k|7g776?%Cl05}AyID(wA*#I2cn+^KYqA7hp^i6_oTW84nQa6A)Z*ZP zY6@3Gxj-{WaQqfVeCuoQXBlN-$(5V`wwf;maVsYlg}ZCee=)j9{a%p)Rjl`$p937S yUj!;$VcWMgy97dM%yn<6S;#CN=%G0&cr1*70HaL}&&xH-1$inocKfS_IQ$=4NJGT{ delta 21869 zcmZ{Md3=q>`uHc-ta6f^lXFgXAw&|goh64PWFwJ;L?S|DAwibY3PmYJm6ld3Zt-eq zMbX5qi?(EJZS>O8TPli{+Lzv|rIr3r)b@McdEa?vlKTFUKk~dY&pg{a+svGw?tRwr zC-|%Lag4G?o6K=m^DDuNf*lqGcUTnMaZzxmMZujH1$S8#+;wNLG;H^Np0+6-jvBgal%5hTqoPBM`F9i8j~j84sRahl1e zN-e(>86>~AeZok$V5bGn9Koff;|yebgi}i|4r`t5r6=q1oG!a_SXp_Hfz+2fE$)mk z5>@4t?~DIRW%1Q|vSFdq?qK9>Ta=rD%x-Wxqiq9{05p;u-siMX%cr*{X!X*qKhp=2 ze;#-0<-|Ww9$SBMx;B`@a=!LAND)i&!bm`{bCZsLkg<^4R_9kZkECU4)NBWGFU9$| z0}doD9ZTjrkengTM>tT@G`Z->fDGphf%CdQ3 z);PbV?V{*a`XD09hisqcyv0i#WF&Lman=ZY&o6LImY&Zo*O311NY%apb- z1KBaiWmh*&noI^+I^0F;#$aZt_FL~{^6OX^Zw<=uRsswI){2oUvtoK{X1as~;nY=~ zM;XcG)h_Sg3TA2kZXW|#(cm(T!w67!kpC;~wXg_AfDpHQQ%tEU$OP5;Q z_2ldYm-jRzBt?PPEj%j<8o1Q#e;Q9%glUWLS!$VKLm0WiY#Hq`+=!~TPM_0ct%rpb8X8VwH z=UvwdGNfvfesNtca7h;!^1!uNkBd?-bWr1_?TYws$&BCAyPbFEAX!Pbd%NvKGcyxF zR>u7RRbynDTX%s3(2tQ!$#KgQB%>KR(nx+TaXS!?BuM)g8x0MI*SHD8s6PI;*=>^` zXiELZ-?_bl{=qC!SmrgiGu~}vk^0bWyFdtaWnNvoo#FN*Z67iO)E3(9iyoXyU|hP< zI5C_gW_A0%z1$+lc3UJU2E3)7oT%;A*B~$=`;nj}-HxEUGfQ+FnC<)eHtUc>|LnF% zuq<$D24dgWEiRCuvnZ-L+pRLS?aa&|_eI=v ztXY}FrmChJ_=#qH7Y4IP`}YLs$wi_W9l&8!LZg1rxS=F1iqu~HUGtbrjWSx_#iJf= z&?3h{BN^xJaTT|>McLlvJ|0!5Ko#AMJ|6yj1FrkRY$Ty69%}^wP&>Ig(ZkGP1UBIO zPMla8kec82$aO(^9FsSD)O#L}aI;gw4AP}-@nK{}gU9y*b-*lm_fI{v7-=o?5>p+d z=SR9}rMEYY@RI^UJvGE~%;UQbZP%5SIhTZ!Vc&ZU<8i8avC&BOo%Jx_=25x5{foyE zmbk=Pl+0pnC(l}R@c=7uHIlxrp7StDf%Ih4ITGTj!NkBK0nY~VD9rP|ICqw(L0X*c znM?{|Jzo<()Q3jE;QpR=!8+!{U;={=3*)GNnmp1oO;8gZce28B1s_K@!D74TLBWXT zzf@@?&%NO3!eIoa?%=Z&BglKjbEKdXns^+3%QKaaqu3)>dS2(4WN!5&cCBX>ZelQ7 zd1LR}SJ-{n?7OuR?6+a}3 z0D^^>bEsNhvDB+md#&$U?lnl*Z!{X|-}CxJkQenD*XzAP1sIiKWP{fkK9_)HnFRDQ zD(TJT#o^@bonBjo4|HzPUat^A)-cyd)*ti=6vk0jFMi{-8}kd*4Ur$cE(_yms=MpF z*Ua{?oU2}C0t^T;ke2ISJA~aX^CoTo**lDU_nVh@7u@pmKWgmyi@I0UZQ!)ydx7K%xd~ zMbS`Lr%dfZ#Aj8U%=O{gvB;^FI+RsTBNNGoqqH9gW91Ttl#SK4qI0w=QmLJ!_2Z-{ z+wtS)v`d6>u(nYuF48BEf6UbO6Oh6O2rqNAzaaNkB{cnSfp!*GUuk)ek<4GBoz@vO zDubk(?|3JY5zDlH3Mi@Y2E7X=@Q)SRkN5`y`Rz0`Jy@nAWM!v5(l+xUirjX5tgY|V zW*stZyLOO3A&s#ocWQ&$PSq2yJ=&jzadc;we3?eT&N+yrPk~UDV#@Aj+Nu>?M$r|7sVs#c61|p*<;psA=4} zrClh(I_k!dpYCX92ryZ+r1pXKhybHv1lsp<7y(!d|5qUeh9r>@j=GoHei%dgx#`3; zs6`y`(5)2Z^M=P5vPZA$CC-&C=c%u5bK7xxa;Up*w+K^Zn?$bkZojyZyd0qu2uDg2 z$f{_as0doNnJl_mL6fr7q_T8fBIz(tH<6P@YE#;>FK5q9>A*Ptnb_$UA!=kO49m@?n^-$%D6h+7zgS1FLQ#F z%;m$yx~(1B8hq`Wx~ykRixbdOV*n@BwF4O-=^U_kq7pOqJzd2!Mmx60>bOzYQyeEV zlGP|OLcpnO1k0v8?Eh4k-hNsr(WP=2fpHTZq;4MLR5qPI*S(Dino8xaW}SggQIe_F z1G?)RrlJ}4wO1UO`ybtF0*0tjJq^;9ieX`7*iqeg?F9f7%2NK?H$a+yC(ws{_r0!3 zm`u6YcuE(_m!evff=1~R$&*iYe&Xc0XLWDz$udo%(Ds*A7)bsVohxP>R@n_3$tw?a z9R-V}7Pg_Iw})ssa?9m}xA%0xHMZ`WXlSVH>5b{A>b4dqdWQ=7quF0eiuZmYdO+f3 zB%fq@AHrlnnF|pmjQo3~_ov*mKCQF*kdVKNba@#GmI))4rQWM} z*-L{0L;#+osAPik7u^pnS0X>~J}R(7_lECo@2>=QXnyka3-2mSL9GP(ABC89S!r4+ zwXQOT5zlkpa|Ie{P6c_#Ai+*)D?@YBJ3ECS^Q)dp;M+qX3T^c!@s$VJ?CBTf* zyK74!P0G*@7C*=VwDT~%7(ivKRxCI;Pk*8PmH^ZC6A=Jr0$D)~hY@JR@NQR}L@j%x zU9V|t*^Gi)Bz2bSX$(gZ?I3cAT8ECzG#t>OC=!2l>nG)_W~_ zGq2H~20%c~x~2~u%uF**q8Z$ZFvFb~2D3@DIRYtUII09lmMiAl<%X5M=u#=V#(9R5 zDQv1bY|R0~NUS{KB)XwAmknERL&ZsQ+tPhK!e~$9bW`hkVXE;cr$Wit zN@p843+QBPmF9&7g-bvE?5&ZWXxzF;^|Ot^ERh)=t7P0nTR!8oMMy*X872!kc^`T0R#>L zwxCmplW4tgeYH;u8nnWmw9h{vO!_OuTSGiI`8*Mfg1V~6fB9sftBNDgysH%iNs(#} z`^*%P$_zD}@c9Na43)@b|MhXgCS9CV|ApB=c0KgT@6k>e;eozWum`5j-5cfmKDOE7 zXdy2>eG85en$mp7b2}tKdA_ZjT&2+)Rp#p|2tqbN3EFny{yWZi84(ZNi7FjYQ`f}TRS^xkh#8ZzPo|6kGHsECUi{2egrfh(3H>m1^L1owcA zz$w*XG;4L5^_>69X#Ui)$jRUR9Z|NbIv?KkUn#^&nZ#|6{C~rKG$j#QO#T6JoG{v* z()J3-LPNDFE_r@cKp}1gWzqXH0yM&+mrVT)By?`TN#3RexfqGx8v#qP!>qD!Xmh|H zoO1#uzERKwjY*462Sm0b|HOrW2?F`Fe_i-Az_BfM1DPKXXyVuvCw8J=U@=BkDj@^O zNei47A!tnYEmx-mP8XC7k<}mpzA*CPqCjT>DcynJt_-Zg9jGGB-xheYA4f`edFh3~ zmHgZya#T;Fl5{8D4&+IsL|>;`Kxq!j&w{v*I>O0g|9=z*}4XkQ}!>&isZWmHfT zraU&K33IL}Xbv|A0(*46uruW?+f)_AOEMeH3yA&spqbqKXjqq^vlmACy%_XFm`_v3 z%$I|93NYH`3VJn&A6?t1vZae*vEk&0H-dbGtwRyG*9T$lX^K(~{cd~|^d++@fWhgc zksLh~R5L+Q|QxuP#A}`I3_@ZN$q})xknkFe8jz@y!#w8A4ju|;qP|8T+3mU zmf_C9Iva=4Y+zwZu!%{7(f4C!a5nQRrf9{QQ=Sk06+#2!xTIE)6^7tZ(C zISXL~$~{-6HdBl;t*EGH-$opwWG{^!LzXgIfF)_2obMJA%FcG=xpI2HCNV@ek-r3w%3;*<>pFzlGZ@Sy$+i6J zepz9}FDrcGJO+y5sr9Pk4O!$2P1?CWMj(8U&a1L@tXUvWJ zkch&5m=yy|IY=z)SH}{2lLRNm5L#aBcYi%&!z6QRASPpET@J25&xo&9MfNRZ!_>q0 z$bUyZkQgjh_5{#wPN^<;kZ#pRbtAirqK=_nVhMbnt$s0rsfkX%X*+8A{bMQu{{wdvES`;lxRlVS>4SE4$xq}xR03RT2!QKxYG0^bF$22$~7 z)Daf{*tp@E=xFpEDtYUS(N0L73Oi(rPGZTqNjOa_2i?X$A{t@#s3lt^`X>Ew9 zWwo`54uOo~K#VI(<^e`i?T>$qfznO6sRJ;2ecgJNeDvAJrK{Op?8#{)Tx8u2-A*kD7fZ50S00nU|NK1sG0lO z0@EKDhSavfjYFm-ESof0B``E2S^1O6oh4N!r931D9+*BC@KJWx>C7Iz7%58OM2-zG z&q8)#u3QaQW|$Y3AbA)4^5Ar_(YzRS6Gxz4n}*h)t{8j8ytDm^U7wiUdh!*izl;sG z97TVrX0<^@mWp9)oRSrg4Vx|J@y0HN62YpnvdrsdYg-fbu_l5ci#JZ3fhh&^i6vG5Ks%F(1-*2hWeTsH32 z=(x^|R)A4cXv~eq8ExVM;D!dy9b-MP;8z(*k8NAZ5d*WY%Y zxgm3OQ=sigDnq8`9yiKueVOetf~~V`$5|9LM-j-4AVYm~zU>=C6{RGJ(-znkc4f7$rlbuYe4_&TzCZ1`<^VbhiSBH(KD%kBlG-7;PAoyxh$e(D>0Dx z^#0nuOgZYBlc)C|EvzYPT7oDZPCV!Jf15QLU?ti<+rO%RPk}i(<(J^5PdMrKe*ZD7 z2r{dAV#D_S3IAlPsYy}Cq5(g*Fc?Te4x)|`@pk4rU?FOg?_|bL5f-BEv&V?|s_t#( z>dD71#5)NvIpKrT=`iwSMf^Wm(r1n)+ux1XFy8?RpiK_A`0|K_JAlDfHj>AC;ydzb z61}Jz)Exf^rAq|~*EJ8szsyQavoufckDUG{KAlB$Ku4>+fyd*&L=i^I0ey}GS@>)G zX*6;*_ndt*-pH<)0J+L;&_9mny8(!X@}cQzd}v42Et*O5hGf9^amR$CERABYhg|@M zqLT5Yau!tdl3PN1^klw!LMR`&b9*}AkI*I@=C~LckcqyiPxy*|P_Z`qh*(viOMnOz zP>kyS3>52nilbE&H+loG9p~2YzjOY2zqXubCCqamXQSILLxH``B2cLTT&xKp>_Q=v z;X9PNhysXlY_- zp$5tGO(rFwiCfVz#VC<6!koA?jE|#pPnRYZvh2aEChs{@6K}Ev1-u6>pNbA7zKnY( zhFtn7v7!e@MO&QZPZHf&i%v!*cVm|M3_K&ES7Cb{NOI)B0M?p-(X>LCKWJbX`h{3| zVMEiXfe|cno1sPmf4Fj;Eu74#8Tg$K)3HQLlk(RFc4o;845e;;@s@#hbnB35LSps0 z_R2t_y)r131$S6o-ppjCQ_>dJ3jnrhGLagZgr}o2mGYI}HzSgM#$5?8`TBfaR8l7a zAB{h7wiiw=j7oYB18XdSx(~0CF??4ml6JC`2`TEw z2=A{r5ZkS!Lukz^-9djOb&5u{(7XRB!O7DxV!~W&vMX!6nk5)vBsY_i{RAD;Fg9Rg zb-46v+BgjvUywW=O-QY8u2m+VLk^+7kYuW%6lIlNbGhG3;u5S-aM-u~{<%_;hrB^zTy2j)d zE_6kW5&*l9-#<>~&c#Igz$gEed<4TbXh`m>!1erMbPQ@~IN-}70L{={&Ls>BQ)FH3bJJ(spY!#@-F%p)RP=aqL@`SMgZ%qr;>UvTgnQ@>%Y8MB3yJx*QCI&WsP z(jhjurfp=62eUFwf@Vaxv^9DJoF?ni-V?sk!G6CT&#oA7@|0%)_f8XmO7Pn-Bh7|!No{pJT$=W-0hbZl zq!%`&VVe}#rM56frNO9ZmOKf!@Kc${_scb#Itub+LI zM$SGR+#T)OqU=V$uptKAjZ}GXH^(|8U&BbSG{92^j5(^UwA2ilDcFkaEhM;X9WKqy z@zRhFR}XQ$i6c}4kA~onXNlJ z#DhivDj2bnNWpy8H<{9s4hDgEX+B$HMEm zXjIec@qRitE%ipQ*Shr1$%s!$wBjzOXQ6YjsHWBRZaOzDbyvU}wh36p0Sj=yedn}{ zv7TtD^d&*7XT}^%q7<<}MFFY&Eo%mM5aI{xfdAveyu`L2?;wW0+ayQiEKZdA=rmH{QkEv97Rc+WfzZT;PVi(l?=L>F_Rm+ z%JhIIBGWXd+8H|Z5*C9Py8mI9Xv!n*Bkx3yE2i&2uVXg9ak_A~LK5m}Bd+Id5>EM!p(MHe`=u&0ljI zfpZ{yY-fgMt9+CB-0#`jW6+f84WKREhh0L)1J}jiR0yu$4!e&zfZC@$P&w>G(hzl!LlX8#tmXD+f*K2_;wiQK|TMiI67=5CM*DxAK*MXIjjZcWs_)va5H$g z0UJbca4laO=$Sk`Yr49KMeR=2k>L@ExUfRt*}KD!vyEwiJ|h)qq+<>e1Cy!j0-bYK zvMwmVsD++L%9+4UH2_B4eqnY_+yuTbO>wth+EC3RG@zEJ1o^L;{xjA<x$cY#St9b;o8Q&kbk=oOrB1KF5J=VjVl={FunlO2_a8AT6UC?asX?!e zIL!((&~MQ45!hXTX|&O|dc%lIe27Axv~|R2mRvAxyMHm_v9KiV;DsL=F^lbez(py9BK<#Y-v*s!sA=i8(DEHAH$-P?n4 za-TwK^$H3j6Q9o;EFhrmf+Gv_2BA!2lN*op_{M^&hV<9?3OmQo{1IH%2}h$#AKC$4euzs)HqIyZe``Bg1>+FnaMI)}>%G zS|9C*!E5i3f&@X*RIG*Z1?Sp}HE(FaZ#@}#u}Wo7Ho3s$hD*@4*=KVKPO%s47UhmW z!-oa$v%aeeD*v?LE#}&QUger_bHP%SuG(JM`*lGsj#G>N@Dl~y{cus*6soyZ@D^?g z(?^|0EoX$n9Qpo!_f?}B$~cU=*Xw_dx;dA@pgNY{(B7S1nE5i|rnd!3Zx?!u;=^bk zux{w+)L3zt54rpD=u;s0dxg zj(x6xjfLZK`Otp#r(;ubd#RK>BxCOiFdC-ZzZm-#3sXQHE#LOFj6KY*wp%3nI(6f< zv3R2%hEXSU^6}U$;e1(|A=UROzR4bJz|=hfMzW<}@l1Bx5T?@Ys@!2|$S%gN1$?3O ztQlT>8R=1A=OPg%prRtYX1qU~H?ENEkILB>E0$u*i98?b4DubVX1o&>vM;Q8EV!gd62@A7S77 zB^y~m0c$9k+$Saf!sJ7}Xp#A4$$Csult-%4en&XTv>Yi(6c!R}@7~E0ZhLVG`8R(k zxrF4adHapWB~C9f+p{VMx!Ref@vQa%vZ!8a=a$xDwyV}{PnVR=YHQ0z0`FobqlHF~lHf=W1=A1^r>ru&Pgx^UK=CbfAoV@Uu(be_ z=>~p1r0jFl4_xwqAigqmXc&3hT!wd8VJy{UdH=FS%;>FAq;*JH%ZrS2o02A7Y%Y5a zb3>I6a`H?YMyOh$f5Jnw@sk;bPe^)QnnX!9~a_)Sz1bS^p@*N98~u%~qj> z4$W7(rR(pPonvhbi*(V{-$>T}Rdxhsa35;GIP9>(T)H>*r;R&@dqb@`_KqI6gmtYf61^s0ZXY)tx2}!A z@mCa2TIdLfaA%mMSk>ztp(n?MzN2aaVASJIo-}?Fi=qId$*!qkyz2x$4lD|Oti!du zp$CUi2huyL{4t{f=0X~mOyC!k@KKeFPd;#1XD`3Y?jQk-&i!n0d3Rwh&D`%amOHXw z3F9ct?|Au+K73t@@77=Cp9uJ9`q=DUv6%_o3Rei^YGX;iib$6Gf+0fZ0;3%ap$_!c ztcpdf;Q~w2O~2w)#SvxzFpd^X^DkE%sbXZPb89jue9i*2jGkUS*s@^)?nanQuZXPP zG+{o=Q30kDgI6Z_zs?Y{$)~F){%!I>`$R`!GTn{vTQ`r{ZnQ=dc&C}p5>y$#d;_cS z#KbI=rAqLDhZ94PF(nfxj$J36jAV2`9U@1gN0v!jrgE7443r$+JjsA-s0Gl|1C#t& z0c4F)GL-mJlT5K}F65~4DNLPX<&Gh0M7GM=t&vpZRN`+=0m(GEfuBH#W5FNL(W^cy zDk`tBIAe_=Q2v}Az_6>5e6gu=6ADA+3hvk6Vg49U$@ixTJf7RaYFU6$E%=_S+=;GA zE%jP2R}Nxf#~MTXj5#+ePcz2?Q)#y){dQ#pOR@n*uX3(JqoKe?nJ+!=i_Mjn0%pXHwzyib!aDI=M|<=_E-O0)hgJM zTQGLn!k)o%)O;TXh7j(b#Z<4Y<*XPvJ4fuLEMQ0xk+ z-o-+r73@nsXa^+c8$9-V3r-V=%GOE5rG?B>fkr4M~D&j0b+D zc@Q6{=DLI1<9gMBk1aCt0&j5u5UwIDvq zkM&~p12h#FyuP%M)LpN>*>0SCMwvv;-K<_A45oEx-QDWzoGB%FUEQH32zN8wxp1#J zSB9!oTLXbpYp^u{^efHh$@BqK zW+ymopvvqFU>0{0?U-DhY0pMp;Yx`7D`vTG+i&33RvR#Id^H6PQF&4!!QosO@ouo= zZ#7!giyyw*?4JwbR@#F_yY1W!(fb(kx%57fepRgZnx6q2azF$sDU9hW`!0b{8gpD* l>t-E?PCAGcpM@9F8@c* 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 delta 18952 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 diff --git a/variants/GIGA/defines.txt b/variants/GIGA/defines.txt index a5c33c1c1..85b043463 100644 --- a/variants/GIGA/defines.txt +++ b/variants/GIGA/defines.txt @@ -44,7 +44,7 @@ -DFEATURE_BLE=1 -D__FPU_PRESENT=1 -D__MBED__=1 --DMBED_BUILD_TIMESTAMP=1707146033.533364 +-DMBED_BUILD_TIMESTAMP=1714634802.9424186 -D__MBED_CMSIS_RTOS_CM -DMBED_TICKLESS -DMBEDTLS_FS_IO diff --git a/variants/GIGA/libs/libmbed.a b/variants/GIGA/libs/libmbed.a index 83387ba98eaf00220830afbeefdc56754fa89810..25bbb5197593c2efe1858d5f9f3e4e2d40906847 100644 GIT binary patch delta 17969 zcmZ`hdtB62_Ma(VAg|#eGb5;jfC7Wg3=9ti6ciK`Wq2tF$U{-g2Uxn&sw)+lu9|Gw zSNf$Zl@ClzOuboA(ncGu6qA}#;X-Dmn{D(CUpD zc041~KjM@;i2qBf*%qK>Pp@*?HbQ^^LBmW>JE?{a07(^bUSVwgcBdqQ#tOQfPPq%Xoq?N9TLvpZ zzU=Z(P6;CgsOIAw4YRm8pAI0A4**F3%3=8_&QB4%>gseYyO;00$Vs5$ zwl#~KucZhO$fseouQ~Vn2oNj;P^)tdiB@ta8EAbMwNS-sJDhDQfr}qDF3wz}VxM<9 zpQ8`0@yQz2_Nj9!2@Q00Y~okWzQho2wfJAo^#nqO{BJpLCrNDIx@cIt)9}S!%6&B~ z-G6v3X$ytxiy7WEZ6Mb5^}{Rt1qiXKUL4*;CaxN`RL7>gJp8p`0t-M|=KR|5X9xrW zY1#2NhF7`{z>)wffo*CXo<^v+$MyE%{zC*RN)^;O+(d3IhUawNk@cl3e-}%*j^l$Z%;Q)hevmzrcm8$ZUl!v0_W6 zE_dmmMXf(UtlVAYlCI-yGV4|sy_Ww=LU!t2afzMIK@1GGMJ@hS((e*Ni|f2x8~wz$ zM5Ak=FaMX+cNkRCGQ;&Wc^-mxWxCpi3oPIk0=mdGPOvP2{5p2E+;xVFz(SRzKI)q2 zCO}B5vBtHUXqloTv@B`6>j$0!3s};ypnb0W)oc19zn;`*v{wN%7vmO0BPBXV{TIkgqB@%&Ml8@iGtp|=GLbdf}+yy4s~xN zn;;Wyp6)>uLy1i}5HLFTGgHLEntagEjXd{{MhOrKx>ywz#(rDpo~9rO7M0vCd4#f^ zPrAF2S@kPZMzS-1cE3RzAv^8QxmVC?1X=gGr``twjXDuXW?E`_v~mg?^M?C9Iv&uF z32(Z;N`^#TJ#^N65$Vdd9z3)58~3{kkerno9`;D2tb~b5h`6aya_+cb=R=P|MbWsH$=X=1Jrrs z>bPT$QSC}Q%2-nRdpTk3NVNK>h(lH~P2Dh>c9d1CFH`rC*tR^_(e#*l4W;rLL!gfR zy-q!mxCb&C=CfP9Sa8p3-c-j5%B=O0I-Q6nzCBaRCVZzZzAq~`-BVW?267W0=2=Bn z1u{DJNrGoI(XxH96w=0Au&r3w=as5uN0)kjH$i~ZHy~J<U z=9s67)Y#_%vGsC`r%_}Krn+ZYr()KBcy`cu2J+_lYVk z3-Iw;PnK3yS8Cb2eqM{H#6eI}fY)pS)zyHwP2;?(@AIu>qgM#=i|)2P%BzJI;*QJW zyq43Bw&EzQH0Ry1p=``_FCE1KtcFuH&+8o`XmX2&%Bt9_RrrZia>El`r^ahVrZ86X zRRA@d_eu;Epx#l@TK3RAugjFw5UbzMyV@eKkXBu$cYTQfHNOMCkaoiRf?0qNEB;$= z3&~y=K3^*>J6{;e-ubt80Of~XKW|_5o7yMpL$TWCt-U#E`N zNGski4`bdwnlup?lIeuEmTlB)T#SMsa(&pUxkIZ}|4!2$e1D#XGAK&hvsiPFVyB_U z7wVq%nx-fRDU;M}8R@(Eqc=3{qc^la)QTNSa!2^G3$ePb9}AGR8y0UEHqt_B2YNbo ze)z~sTvnhLG6m{d%gAeGVj=F@Q9m*@MeN#oC{eT7(le4-di)d>WkYYghE;vz*IXbl z)maH}0h#7saae%tTio=&UM@f~J?UqY8`4l%Hup`*=#e7OXQ(Xie*qbn$v)r?Qz7m4=5 z(F#{UCBC_E^k29IOp?t%RKqIPjyCNUyjv@*8g|-kO!aI50;512EEqF*o&eP?9|e{5 z@iC{L5+G~AXkYf@vtcDF))b@fCUH#Kh2Sx>^($1&H%|W#`XFy5wf&krg-uP+KhCp^ ziP`GIKqs*?^dj||BqAcs&2SpZUQE+}K$Q5`814)vR`WtwwTeYq^_>EZ0U8jl&DJZF z-S;1mq&ipM6(=MCke01}PJfKMxJlBFG=bee&|l-liAn0cl&N9Kz52wlVqx$HkP5FY^@hM^QZ0fiDgyh`1r}aot6AVl zo-07xk2v|V*&hb3CK0egy3!MP#wr$K<jisuCw__JI?YLkQdcnRYGg_H%g@M|o@ z*IRIv8~mprb+Dj?rIlrWP&EmPWo5_lAg2Wa3(x=CuEEbJY;pt+uswmnh2#ZTM`>pU zpQIhJXu4Sz+|AD$$OUqJcm3($ju=7SS`i4@|GnT&QVtX|aL0EY*G)UZ!K!8N2aY>J zmc#VDefqeI;{`1M`Lazb#?2v<<4JO}X56(o0t;#V)cF9dmLJEN#tAG=OFfwR`;U+3 z?FQLn;Eb;}jQ1h2Ak9OyF=xDOs#uPh|D|Wg58>w=#EyK}o_T%zQL-k0v}}heBrC?Vc z0@%<~yTi^>MzrIm{*MyZ4%@Z&L0E6YgRt=Z55lSsJqT-iO$oD$qJCW|3Z7-E<}fvv z*evPqrfZq`y|Btip%=UB{BKwkFQm{ozRde>*bTBOYR})x;KU0Tho+{FHXIO|lJKaU zu-sIvV#@*zqP6C*T28RRCtU1{#lV&8tEG+~x{ z*Fvpv^9w`zWQPc5sjdtvgM8oc-*~ZYmf+Bab37@03(r-Kh5kk1wfsOvEC|=d;Un%N zf9sFo8zu?aV)5U8IJOnaarD=ZWGh?eS)2FQDpCsa2G;Ze7q-4hB12~cxKxQ1=-ouE1>K>8y_ z$d1oUZ0Hmq+;MrH@hj3Tdi}~u<8;~)u{zfnZxdet(y(h=jfuP@0Rzj0W6D9}1!4jh z#vC#JGQcQWmifN%4)2#Z^jKH|dVIda_!;R@)-T&)GxjS$I}_ome9^d`JGVpI@n0H~ z$;xsC%o?s5+j#M778M-i>1)3kyLb*VOEty<$cOigngM2jl5uY=1m;?I(?^7hLKmt{ zL4qOKRiMy&XoN|`FS-xF=4cf#+124r9b|(2>-|ja18DLOy`%5@0EdlQP7fhtO>GaZ z7%#Z62a+B4WXONRg>Cx{_fhBDCK~Viz_;BJ@c^ln7Sq6OwG2SO;)qEKMKRSuSt~{H z3JtKn00Y1dPgTI|TDg*JDg*YWJ+K*kP;7>`g`iYZkT8^kVll5R| z+^euy`2nhHer0JWGl|p9%&N9!!BN&%ZW0B%S>jYmRcz)m(}%(;3_bwz_7x^Y&Ol_h zwX%5Km5MDL$oj|r8?r)VT)%g{tlv|QEA(sU0zN2k>n7>B+{rbHy`+-K6ErO3Nz<-l zBI@z})E!~&;^&iDO7snf>TjxfDZjm%CCoF0%gi|R7^(Z!jUlBAh5)AYZA`5pS!QOK`*}wZP>cx@cedIwFOCrw(Jw(;}iM zSK&3KwKyVNk(lHQh|8LYUwDlMsapmG?u>YdSKM&4k4k}Dbt+;xFO19*3{NzhZU2g3 zwtqzy@(Laj#}x36IZl=%ydebVO7z)eiczVV5w6xLv%LD>Id zxRP*UdVr4oZDQ0=6LBt2B(E1ot)W8!$AlZ!M&07&4di7Rt8P=2Kbck@wz7`rqxO(v z$fH`e^%AIu`4!L6Su z6{Yy_d6(jYgM*-M1r-OZs^>vi%T)zT-VOUt#VV=rM$~ZT{cV(}tI?H_7bAHiUVYQQ zk7}obv$Z>0%cA}_s(`Wp*a2pszegF#4%p*YIYoyEpJgz%{)0-Y9OX5L9dVDoB66TS zrGpNWI@-j`MKEK&i;n#|D*9UrAN%wrA-a-s0S+bV@}qC*$xGzv(vFX1k96J`tvG~n z?3D0i^kNm8R}=kr+MRzekkr6DxX07cXQ&KSjfdv;viGBxQW=W(_P+0<6DjJ|PeRmZ zI>!tWPGq0{t?`R#6K>03M{xMl5ixXVNVen97C&r>xj+GpD%=wvlOsTml~pMNR?6)I z=qWaIlr z`=+xBk`7pHhXN+y4Sd}vF>d_&03Iec)AxTB)6V-XQ2s&7mTjLLTf?spW`~s9XT>V? zg9CvL>9H62#e<{S<|)wRrBE#dEQl2iG>%tQq`;HV!llKrzwvu8x*V2oio+2V<+eW- zx`X3hiM`)v;DZ7ehiy5BV&g?(lW>sQ{BGaXLEhxBvzj|Sx*j&m|c%dj-@z* zffd|Ut0!l8h|OW{1Xb{s$v5d3whyeDCa)7tVBaqsd-#?(&OM)TfFMU89vBu$|PRk84!;kvz|cv*;&bm?XRp>T z&W%@8>%a*Ny{z%#%?(roa<6OZg7~+{Ul62O9e*}R?4e2y;^kRMeY`?jiVyo=`hPxL z|EuDIBSgbriC3fu99!8Pt>!>HIhuqYRvwC1XcH$er(TPH$t<`-EU1kk^?drzcts*X z&7ba#cO^GR;l92eZx(sbu7b$lr6BHB`AASk>e?BCID?i|d<0mG3MSg4t zWhIo7w*v^yp0b2=Q4dKd=!m5WJp{re<+CE8h9UCMr~fAMA0GxFb;!C!i=T3*DKxkID_y-FGh}eoB=- zDyr*HV($P&LAi|?Gxl%Ft#El@TjE&?GnCQg%fvL^$AxBqJifIrzc?X@ICY4nHz$!; z4p@~%0kadZOVk>Zq>u<(sg0A87Ej@-viH!!A5W^~om#WK;cBZ*YNpu2g$-{esVU)< zbd1nSTW!V!=J9LNTU4%K5AyoGq&;LIXt!zE0heh%lE)#zlcT3q@Fq7LdGgdPp?I1i z&mq?KvT4<#=#cb1v04`V$TZR6hhyv(bU#L%o~GgL{0MtrD*f`boHY(XBj9AS!i6q< zx+y_`a1^QDHr>V}FoHpg1Ime#z0-w?aV6AI`=&o1EmrpBWNO)v%hMNetwl&xSq3Q6 zu1+`R3oN|tcf}`fAXTW%3$$$QtmH#H7ez?er?vzg*@^d zQG#d332e;EslmdvSZ|TseP}z9Dv~B>TW)w9J(~J8Sq}L4X&bMd~IpFDkqHmsGtIm$Os8@A(f(OH5O;3%9B{X{O-=kUH|xDq;l^ zU8mW}=hH-81@?s7qV(>M<3ibm7t)4|<0Q`ft6UGHyYkl?pi}wb*rdDZGb08dH5liV%;k_{ zPGCs=ra5~Uhh!Y_)Uhkkb1Q>6oSNBU8Im1bL$aZ7kjv3z;BwkN}N`2ZZXv$bn5hairVhqXJ4L*&h*6_v&? zW?W>|2}I?RHiikM zVc|UF3+s0xATzpswam50S}io_xP}b=-Kq!|xe%4$3Kqr!Rhg%hd_cH(W!fh2O=a6j zZcmkmGVf`b`9nAurQe>KnK+C?P=xQTnfD$Z02!8>86^T5aSBQ@9}-#7QQCEvXWE3( z5bNC1%nwDjK*+JxnF)e+r#Fn_UDsx=AQzA!^-pH*7ZCeyb(yzE4B)8pP-c{~0-|MY z$1|&jIv@-bxKYL4dOP!+V5m5EgpM6($<*-pbs#1E1CWF*a8MiGk=djqu3>jBWd`#* zGh~NHCPQ+(lR1;;kVv^s(XoSrvnGaereHq}`*~tkt`CQRC|XvLoK;8p0=LtqXKfH# z%8)00Cvvk6a3_kimx$HNvYL1@inPyKlONC8!%Krm`wUoBn^hsGJKmdJ-<~CWCemI6 zbw8Wc8|;wTLBIP{R{!Ii)16k0j@>q8$I(%XoLXbDt9Ts=q~!N;z09(7JG1u;)Xbt6v(JteRxTI~ zU8|suFr4ES;|dhSDDoEXZYQN%ZZ%#c`QiiQQyCv zlf=tjhp_N$yh|9u;Htrm)HMEPOpHYR{L!^A$$-OX)pE?ujjOh zP(5ZDsXG~*>nDN&4Lt2q+vZi z^AGzDAbu!({)7MyL7boG&cDa&NQa2(iutv?(GV$52{r8G2lLy7F(sVS?CqRCf0^I_ zb>lNRZ&#rJ;UpIN*>K*5zL+PHAP6qkuRbs3)$q4`k@kY<+(j-=$E(cYjZv&NuU-4)=wr==uEFq)RNs5`W9jp;QYCA%8e6$R;fOeOah^ zL1Z>@CqFA(|MY@UL>}J|p5C{>pI;3iisT=S-D+N7i4Y56qM&25t}U22OMr0DQg1A9 z9l$-j)tgcfqF5-?a(%R*-z*j)`Je*@8%zQO0>O*EO9lH#Ae6D@TES@|k28py{)MYl z?4#QSV%7u5@LQCkFBhI5 zpTRDv>Dz_2N`WOaB&|5VG>pxjUu>oW8iyNui;MS#2~=dXXj`#D9Q<+1sb`D7pD3^p z^!|Ir-_!AlKPmb6gW}m!1QwE?G^nJ>q?A6o(2Y$gE>$>}y@gv^8bGmv6c?{9wGu@HLGV>m+@U-x+De^xo$>e#Le zrFr~10{WAGf8+L3=_X2cxU4C#ERWQn5bZg0**`?_;87N&V;dvOc9Rm34@*W_Ja50C zjo?kf#UfKqbyz&n4M1t>)5-jY#48O!hs0WQpxp_M;Poh>&)?BOkfMhv?z1di@gHeY>iImQ+}TWpR)C{3U&qTJZsKVUmuyxqdW1{y^Y#6U)>Ct*9M^Ae$6>s|?p5>eLN$;h-JBVLdnI~UaT2Ff*!IkHi z7I0HpB46k(pIVgftD|nR7*?g+JdT0b*pIRsdOFzZLMelGR79YOCUrigIi?u<9aR60GM7;X&EoS1l!a@{ixxo$ISk@m;|~ zWFvIkT;(HLEl5h$zv>oW=RorDt90TDx3k9Jf5qtKCmskO{}e9XQt2;9{kS1a%c`eV zCiC`()Uy^K-Los#h+K-0Dr@B}ZgPu#{_^y^$}!xdED}EVZCg;;#Z_pL2RAzQ-lLV1 zX(0}=wAGbOJhK8V`Ni@#O_k!eh!*)Gu4Df?UinuZ6d;W}rD=StGB(IzZIlLnCE8Q@ z5f2eCt^5PD?`~8^c`LC%=HDx|^~k(=J>MU64Oi^%HZwex>jV>xrsAkyL2z-CL`i^-4}4 z=3c96B|YMf4S%bu70GXtWYDpc_Nq>P^9TLQFKeSNR~;M0J+3kfkcRxH$}o`klh)O0 i(moEJY9d#wNIj}!Q{Z`b-0CAdH#nqOk-qw$!~PHQK_FlN delta 18100 zcmZ`hdt8*&w!b-P$(!LJGbrjHpuB7bnPE@{0R;s`86GMx=rU_S);c*IIiI z9~|nu;{*7&BXE>H&Jb(To6YsX4Z*60;J-8k-_Z~}q9J%>L-3sq!FM$Tk7^Be`F+J* z4!o&McaKZz2>ySPy~Lzp4fnci8!bS9pkao`TvT@nP`}noBULB(MzVF=Tv7<0toP8c zo~K;uXtiy>Nh?k1%8p>qzwENfRggI9;ugS?j=OvmCP3Df0L3Cc&04nR8Mi}ZSbH((+wy|j;ZXt$ zK`t-5Z6T21KA?5y z!gjD_yx5JwqAr&^9nmB8wq*peoAS+>WCIPRq{5E4j;mrsSaQv&wE@a*DIX~u4ifWh@U91 zaN*AL9<@SF39tg#3&(Qj4!gB-`<%XQj}#B*U5i5zk}-;p+Q8@GKyM zqO{j8dG_msw5YkEyS!S+FxCWL2yGv)5DFn+PRm>ay-v;$3vtIQ`Cgsl1PG3$pjH=G?#mN~GRH{o z-dAH`6JGPWNk;-2)AEMbUNR;!u6p0Af>ec|hHt!v2!sop@9<8hoP;1%fOj2%klm&T z?{EcgvPbpBdgoIr2Q00$=k2rz_UIz->m)xC++E_W@)jyYA8M=d?o#-+?0g3v_C7{= z8yD8?^xi_gjqam6;O#=X1W+KG`>OYolt<73hFZP*Cx{(U1TYR|38`udby; zj^sNU)dmIkQIo;RpH^20?innM7nB)L&LpC807yw0Q=_D$p-695by*!o*;zNDRLfqu zsji6{&X*<9$42&5=Ok*`hlxIBqS}5SS;ImX_*7F^IcQb+T%ICm$$PWcC7)d)z?t=s zk6PiFpwRuBj`)y1?S2{!Yi{!~Q2Ic%WIh>LqGHy6_;iUAS+-CBOX%`hO#-QRBx@zl z1osH`%U3>?q_pNfi-y%*^+~7fBZH*%YaveEfAM*r;Pzd~TK4OZ&+im0hS&YH%+uTV z7vj8cY?+n?`}?jVy8}B~_Rd(}WmM!KC?(i;-bfyzKY3ZluvaJfK0pD0j+UzT4Zo8k zWmQ`P*>;of+e%8X---m^mBaQ6kmkKJF^Wx?k19u1zEYz@V_R-zjoxASJ%n4+hN&+4yizlnAG%R{W zz!p+Z)sl$B~eg9Dc5%fj1&=#N|b8nrbe<4J`UI*EXqJ_P(F5k8DLj&S+fdr z1KFFs0ndgDf~ccfSIs5zDg@PeX{==U(uJcn(yCLHk<8CulR;6@`2O-h_OMRlrWXW} z=@zSIkXEDk?Ta)jo=IaR-61`s<_gUaj~W1tOM}vRo#v3qNh=ma(*^L60vC>iF7!9+1Gxlf^VNRc-VaYRtst*c~V~cA+ zS1JX_{&|%~8Y+r{qd0fm_5d!$Pu?I!%gS-rHVe$gX*w<2Flx+F74!dfoI;lVvB7ZW z|2{5(JF-JHQg2*%6x$IoJ|=`{tQ@Ch7w31Jm?Rdk}f*`0v!%lcksGBE1^^XS!u&lxfcPlfj&R|K2x`%jniDjj~r-Bd1&(?{At0W>V z$a1-hJ(Hn(k0|ji;_u*!KJs)v)Yd4z(W(>mI43k}45ajiT%AJQGB*&^x(f+H7yv;p z^Q7(wcl20EbrZ0X-_uI4Z$Ci9kHiwdOWy+?A54-_9yYh;QLAKfCYX(Y2rGbi(@71a#vX|rj$~h)o49AO5DL4sXQD!mkYaVc@o=P6hy0W&u(0r|V$SOOUL zhSrgwczkyq3w0?JSa|sV;t{r$OoFs_hlCZA6F8Wd6V^&Q_I;YIVb{vTdV;zBC%j%6 z$gVyX_JLVYx2EQ3*(dLYoz3J(S)al2)!{LzhxS8C?IDv6lieVJYuWZ$lRln2Y@LT@ zviC@-W#A59Ngp&hNYdXo$yX`~nq0)-zxI%_Z8=fETm7U<^ZD{5byXny`Rt@aw1>4Y z7wU|kCg~>$cJai7O)`Z~!8$Fgi<<1ukJVTSjt40A=1)GGq#&+kyPudmk{^6Vsq`e| z?o+Q$KE!Qnbes;`RpGHF=YB@X+NIY>6%pg1b~1;H6ljz)bpR_W3cpUyf=Ys11fkyj zV0aHt7e)#5zx|=`)>(oq9!-1S4UgvjY?PWkCumsz$KlNuAuKBCs858JAH=}VTBsPV z1Vvn0FKFSyYyTV3&leh{-f`=?+cAN7o`8MVu2I3bI25PgH!;lRYGsTx+B61`;%58d8PwlQq{lITbH zi4A_bf3}9TS48^{qpo2Ce~n&0MNmhq#)HwFqR^hwTC7lW|Hv(NaGGB~RV-DRs?4cvP)V z&y=DO0%SV|mxxr61%&6{jAHN2Cdcg@el_rR58KDw$d?y4mwz=}%K+Ak$DRLe9Q)Lw|un&0(IKdM()kd;luv zJ@J6M*2{2)aFIx{+7K!ja{7yEw1ND^3Cq+fU=q^w3^hQ?Y#M9mB$|p3edCoM_-4RG z_(Vg;?JFh=E*!xGi~(+I_@Cjzwu4bh>WXcX^~w)eh&o7ZnW`iOAGB<>(V*CtgJ9dy z(-ewg@ByNz*rL#Y6V{TXfXP)alwGNYa$s-fZJWUd#b($Pgr*xpg`u1zJM(WLsbLQO z{fqyMBCnxLoAadc|IH$*p1Gj~I3y5m8^t zLLeJWjk!Q)67&mD7$(J3@!r-bVFoE)5tAnpqtt&8XxZ1r7_$T|Oe&#WG3zPJfK~uI z`E^XjM1h5OIpL$Gy6_n+MEy>TQ2&CxC>PWUSW2%XA z6*da(B~zm*F=1!oQ9E^zmuhgX9fIL|=#Hr>UW>y)J(LN#>iE=^R3XVF^=A8bQ4+F zh+BM7=H&BelY$czlSZI$)ajrOEw%*%eZC@#1jy83@Jc^KtubSML-?t`3$?ez; zKG1HCi-FAVO`UYCLd&XUrhl7?C{bX`dh`#Ify@G9(N-nK*%Ub=YOwS4BlCu%==C-^V2@l7c)-&vrGB zAb+xcRtcr-SaXN)V5dn>Of}!C)}C%w97&1~ z{+Wso%-$rAYpb)&q#C(dhE$Vn?n~zybb_8W7e{drv*GkJ=6&zO=d+@%(BsFe^E`Hxd^BF#)ffS0f>gnBV?Oj^ZB_xM<o06xorsU~5@>0aSaL@F3iYe8R8Spx#Zo1W*?<>JgLLhr_%k=N) zXzufcOO#g*Pk&ID-(j%S&!(r-uGXUQ0qoF~>7)6@7#xE#sP``kCK4V%ya?GjHbGIY zDn48oul#@$o;F=V3-=&s$mDB_24lhrn%=;2EnBiML0H2ik7U5l@)ItX3gK{o^vYWa zCnpIII_S2q68c1-GN1)faqYJRay{8XP=XF7j7S-_QiAFyl0_w0BE)i8YN+Y3hVNcr zQPl7-zJZ3?Y7y^rpjhmP3S=`2EsQ({uX40&ES;fZCxvcGn=F5>w7t*%KOe3kp0sSp7Z=xtc?W)dwsJeZtsE%Z|Tnc{WDL7#8MGetz^Xi=sThN!5uy ziwF5Q+VRpAi-D&<6Asgu@ej+;Fi|2SGXM8;j3kDJ4 zGx~Ym;-qyUc7`aMkrpsvozayon7|R!wHIf2@Kf647}98u%t+oRuyA(t(88p7eAaA| zRL{W(@0+7Zy-*6}l|lLQmk z%O{r1)Dtbl+EzZZju#eACPMF-Y0nf3am3(%Vy2c);=wuPJG;#DGxKT*OTNHr&zxmQ zB#=CZQa?V+PT__PtK(vit#$i`uwb&abh{%V~sdJt5TsgxxL)-)ht7Sz`|Db zf+cl5=>ydbx6>^=`+)DrJ+37;HRvV2kTt$1H}4k)QxzV73V}Pp6QmH-_wGB=nutD1 zpQldipm4(LyZCWw`Mkn4NeDVRG0mUS2uk$zq_k{e3_-d2w0FoVhPbI(789GcgUpFo zy=iG*5*7~mdNR`TDL@>26{YPYR*?yp6=~w>iAjEor)AStr_GwrRpIE`cfXw$%1d_0 zp4B06r`wUXn3p6FMerP!6{u&Qr}Tpp0PEP<$;2w&!$ETe_i$5YA1736-drs^7C(D2 zFBu^BMgb=g>9cQ;I^^bDivBqko;Kb!s_%3BJ0~+8quc!Y`Tq8g4zny;m7Ovad(~EiW3Fnl2+iCecy`HR$ zI`6rjt|L~kwF(-Mk(@D%YqoxVhJn(KPQEAoXMV==c!8zpsal`P5Y?1PlKVpmE-53} z$GbA_oJ0!>p{2dvmT`bw4Eu%l^BM7ET`bbIKW6lhVoSTA!uKD_xJHV__Bc3rZtN{s zwRg|$=Czd5NY#0Bn<(P2T@S99`#5DTbe=BT+%2SFWTLiiZYE)23EI~%SI1jz5LAAw zq8{wy2++>$hF5Ahl<@fA# zVi*gIy(4oB5oC2)hJm|t@_1r!GF+XS(?|^Cj+)Gz4Wv5&X;|yRoW0~{Sklz3$T`e& zSe%3lXFZg&hgd}>R1G=RMBZ_ehYzi;Y|BwN72Z93@kGu=N(PSGj^jCl4+$B-#o#Th zAvb|s3HQx1=dK|q!SbhXX6}0OO<)CHCoatW2RROMS6!GJeG8~{X>K>gHj+QEIrk!Y zsspqmcMqw^;28(Qqi1qEMbdFzOdWnJSCL^*$Y(-Zd94o! z-QrJedj2b~P7rj;(A|_rGB_{SLU-pWjE67O0-wv9zz2oklkzWU3J&L0k)`BIC<%U8 z0FQKD&pRcAW1zeTRBT>b-bFsN1kaRjy5Plfg8C0e1^R`x z6oYv0v%|VDkX#3`;5fPy3COUy(!c8esIZ`5XBgLOG*BRn~ewU)T6& z%NO2LaO?7vRRyDHIZj@yTMC9m3`jUCZa7h3pb`M@8a_E!Fpt!U`zGHg$fFdDSjSxo za|z2f3LgDL#1zKn3htnS3t;OWD;!7UarSxQ`NALySDgM294$0XbuKhZ_G9o?Z0@DP zyXOiJ&Xbz-MIOXG7SbIvio*Fq`CNya1dscQ24e&h^#w4(58GF?&Oo3?vIE)QJ}r8V z1j6fp`b$M8h&;?K;m{5$hF832ek~IBRB?F0AVJdv?dI=AWh4kzhQ+SMJ1OLlAGLpR zwWxm_<4`Gce6bI68(aK0N(+2HGbK>0cT;u6tLRum1=>x;77Aj-iq0r*=U8UPdq0no z;>=VbG$+4GB|WjBcqIFNU$J;8V8+T%`sA6i2zKK@@%#v}3g_PNvw=(=5oW1A7RL3T z4irm##Dd$w3#L1lydiWFgu7jUkg&Omr#S@{%>|b(`YXtU?pWPcqE*&HgR(yLx z%2ufu3tUS4F!%s7nW3Pi;^_@ABtL>57{4@{hcoOhSB#GJuSVUrUbd$vyFn*ZS9(ox*Yos!y%OONt+0%OVjM)RstJFnkyN4PrOTzVr( zkjGyZ96nQ8K|(_H4A!)lUg4*RlUDpdsg9>}=Z|BXCXml1^iGp zJKpE-4kwKF0@&kSk`Cl#zGItqo+K zva$&jEch<2a!pwlQA7|#--A5xP#k#F)KNBy6o~cZ&X3FTc^?Csmq)suKbLLf`Oc|_ z!y)DQqz7E+5bnvCa)oe?iZ!;piPVUVjxnp;!W$j4qswaCP=1sm78x#ktvrFe2N$-n za+f$^OK2mYL;BP^f_eW~E`EiH1mU-2zm<=^Wm}uivLM<6r=W+^mJRVNZI)o$K=zN^ zWejMvQWyJsE&bOmo<`t zu^HIwS5dlANQEVA=+25DvjAb$T+&ssDNlfqylP_QUIlr%_U$lN4q6CHo~-w*t%RR6 zI{y%XL)#vYRyGi;G7}QqrNDu+welk6B;=%LSEZU<8$lj>Dh(8hF#m@B?!`)lws6&@m8-)pR;WGux zf1>EXHl=0h@=nSFxUjKixjI@b#HVcSyO&=hei5r{|8gTSA=mK|CJ%>qA&bj@J)`s2s#0Eoqc#KB9M9@wWLB7+!^<|G z>JlnJD?4WOa5{r%o* zB8ZL3;FWt@XwqGEfgoLb}r82!CcwF$fBZGX@oy z2n=CZ3Kd?$2aX`{68L}vvc&-%AYh^b;sXYdz<}UmaRCj;J9Vq>xz)gr{K%QlpAC0@CtM4n-tX$_fa?K0Eab*43Rv(+>?UjO7$Dne}*rGC7#4_uEo zeb+TYJK`!)8tu_3(3xb~oJ_c<;>#@1UT9hrCeT`rCZxbyvT1C%fU%=p%S<06(b1+g z{s-ZDwdpUB0KRA&;f=1IvZASuue|QyU)P|<8qP6_2SE-rjmEiL5 z@aFLx=24hYx9!guk4k~u_af%mIjlrMf@tqu5o4nXrrWIPP=v6VN7JsMEnQF}gd++-hhJ6y*YWSi> zPs83wqb0b}os^zlrT#zw#or&97sFNZX0%ExCnJ@!jbxp!>E8ma3*xLSRboC=tJ2<@BRT5{#*c>hBQekmq;HsZmK1 zp(vHJiiW~R^P`SZPU~VdERMQH+3D9pw`on(%r*S1Ulaea$GZ3Xg2TLkC8xiLT1~2m z^5`9*grXfgTN(X5k@u=WkOEhRM6d55@G$u$*fA-({qD1CUy0skuox!41aHra4vi9L z(Ha(5vow0P;cU%IaS~K7kN#1ZQaK%8Cc)DyqE}NT^=jTLSRMTk1s8g65>|&rP0@>l z>D2HXWFUnFq)PeUQg0j_ZH@kwqQMI_{nfx6cp`c~#g`Xae#6*?`KO{kH2}2`Zu>S` zgs@kOYXyNO=y5)Jp8;JXJo;h~VGX$Qau87C_Ma<3+%(MGAMS(s{LlBnT>DE9rgr?w ztso#W@(Y{js!#43V^m!`2w_1$P4&)hF?Xq6Nz{BgwK;J?2Q_MKW&_ZtMJpu5d{6xq z+M;5ng@7#|@pvX+B0XCeBb>mwd{}HC=-2y3Mt+P5uDWAH-uV??6Gnt6>SqN% zhe4G$MwBZ~a(2MT8|9fA0-u-P2hm)4FXHeA?}OOzUj`u=oAO|Dp>}zLWA@#x@$=ON zjr~f^c?%}S?_(xx=LzIj;?`zKa3VUkgUXO!sSLGYsY{LR(M#a5mX_8p_FRI1v9_7< zWbFPS2ADc0gs+diM#aIu<qA z5Y-m{L8icE5zu}mep5P!>G1-0ViQFB@Wbhi2^fOa<^++%XjHW|`;ro_5qH1RGCD_s z{^bb=sVE~%o$utT1Tjwpw6jeQC45h9J)q)Y)ts2n*TtpLVVR8y2dNqcV9ZqWt0C~h zKN9{$6(yhzBSTgvyiIddK$Th~VL;CW)XW5pkRURFf4Nee7zW>eoFJO1?wGH4B)m(G zLH>VJ`CmJ1z^&pnHZnPl%{DqI~lPgOgcc+WMG1)Mb$8 zqvm>Q5<2R%25q5+L|(d=n`-E6R@Zsh0Q2m-RvLSYtc ze$#xf1=TMKehJ+&D~O>kTHW11G~7r>@9XPbwJ&CK! zb&@Jf9i=W$O59f{V5o`(j{JAxhzw$_)u2aqC7O5*!n5qkHMu=;up!h94zIkBXmI!v zN2&B-;dhC2y{go2CtG0T^`tz0@p3!$d&r$G$y7cOh&=E*!0v9;W|6@S!4F^lMVLNfvu0<2N*ld2-L#h#_;3~JPc5N zoFQxZ_=wJ_JZr6j*WO9q!o82?VfUKqg~|H{2}zjRu<%SWO-9@naJ(Z3h!f}_VMMK8 zrTv@?X+Nj*%O-+qGFxCqnzV-}APQ42`Ed@;m&U|#JQPOlOlJeqdfr_SkEKTQAEZ@< zE;%NK=TlOH)7med%^0p*2lHH`|*fVFH&v1ZNzOX#R3@;OIj}AS0;cHWU@W z#5U<2Gp7o7zLmD|R*Yx0VNf<%gx6Tir9fJ^C26cdH+7V$9&dRvkCS3?s9+rSg6s8` z-}wBFPGLI7HCpO<_f%o(y`g25W%UC@6L5@LN|k`i^471xvZ%Mf3AZd$c+o^!c&-Y1 zg{2NnAX!i?2^yqSt5uNKX85wQ)O(FJz0ZAs+aE9jwG3^1Fx8N?T1LUZ{;49gT#z{+ zm8M9P4qLJX{yaGKYd%kqncHep?=dsHnfja|o>?`ln3MWAZ{SFfZJRbVrXHh^Ga!^~pGP-AJ0X%#qb)qq%Rj;48liJ_lNj5L_4NW_3 zfU()(!ER}F;;e3~-=(DqTe-DfDfdjf{UG^C?+Rnn9=azM%rB>j@~dD%NYMF8+HJlb zbSup5DSuCkH-xlvW7_Lc6d3GK>&`SQU$?p4+D0nsSX#(XAp~o(1&$sT-mnpmY4ucT zk3aM66F+?Y`6|3Cj z^tOlZIlISj)}^Y^m*1LD1pN0eA@HXI>7VhLg#v!A-TbnbUq{<}go@%?9Av~pvwfonMSNWvjmI3>ZpX?>8HNyh$R%a@d zT>9GZkry-TUgkjwr#dpnQR~!1gQslPii|)o-@=(~gGwVx(2ic8y zw5dP(R%MBvn{_ z+a5mMK8b3ozVlWV2OY~?XCFe8wJoWFy{!OtHQRep;nB~Ae`a4HV9N5pe*Jsxm%)^%6Q}$(FrToC1yc*AM9nF4# z`ns-XM`!jb3Ie_k?HZ9IngL&O&X36ngTYZbbcJ^7UjV;|l;yy$4Rq)S1&j0W`CGos83ds|x-J^4E2Y4=c)zZk{UwrT9 z93ecV!jHwOV0q4dJ4g0ul9~URvz#x#Fa+3W)b>qI5=DvrmJoU+=LDJ6$Ht{Cw{tES ztg1G5rD3_N0Nl3RFo6p=TE+1-60%^AG&MtWmr}ZUwVQnIGr5bYlOR!`Xj-h zr73T3E&tcA$+gm%KWv78vCCqQjro0_6fo8}--zt>LJ7fGaCfihm03+7ZPpn$zt;;p z1dOdOj}0s+$rUg*gcMFLI94fOjD>AeL6O%0`wca%`L3XZI-!p(BlbiTUZkp|Ytfol z_ziV0pWb{kyoI9mu??RE;{AokDWn2gltjH$c#;M}xH7l!oIzS_juQO1sW5J$K{9n$ zXtx#Zr51!c#k1B_h|Dkg>Na^u_kT7MM4;XgZZ~eMg2Dugz3% zbU`~e7M-Ko8(>9e%fX_p1wkAoICi6`g9?nk)H!~u$VzrJZqQ+B4+lMEy7eXR^XZOw z1M`*%P75q|IU0%uC+5YGV;!|Z8Li?y>nNvz04i!6@di=Y!)whH$0Djt`a;$Ah9iXV z{JQ^e?I8T8FRbckImB&>>4yEd&Or|#r~#Y9ee)cTQdq&s=F;|x`Z zfHq4`X>l}CFzIVMn19G9j3%Liz(_dP?hwTjJ*B>>w|?nZL30P+{INC4Vy|z?R73MlQ6B8w|DL?@lQ`Ni|20m+gIupQDn1R>fID!TQn* zCJrh7Befu1yelJ$KjHNliE4FmT=7osbA(|btAeAi7QY#*mmXO`VJ$GNu6R?V0I8er zfs2aA891;q-Tr7=OA7UWxg=d9&+ zQiW50Dbet#^94iJuu@a_w6ib85n4gLeBuv0@QO)XCj&v3Y9$=RZ#c(O5a515&Bt#-U0;)0%5HUK(B93J$4iaOj;26LtSe+1X^)Ge zPkCn|6-F<08C78ZtA5XA^dIvTwm+9a3RVHGe&nj*zEahnRa6BZZE$@@VmQ@}G(Nk= zZgZXCw>v~+1Y@_mF7iY}nAYECImU#*w0*92fvu7la<@VE9CBsz%td9Hk;Biqj_@%G zVb}vLaJ$o$VF(?DR~F_zNwJRWmsIyLz6g@ljerHDBKKVKwZ50zGuYiTmzz>s9Nd}W zKE!(wGGyMrw8(wZ9*p*%ZSEvK>mV9?c1t_qp2XMe9JcnR+uAeu=%pmtWYrTyc54wG z=aZZB?}D8kBXp&nRshL>C;=i%K@2h-<`KQ zJg-;qbF%jPjv*60r|US3A8!8T-owi}JwNiRFbd3SLsO~uHpRKDwfWWo-Ttvni}SpTDO5PdQtxWQP%64)THtbv_w|8XGM)JB?!MkcT)U#d*&Lsh-z;Rj zdaKib&F?!YlffCe%n81y2XJ!QWnaNnPyu|t#TORCKj?S-ANKmL@uH_Hp-#S`$9${1 z63vEPvIPzv_bsA?DbeEcjZ?mJc0rB}h;N7bFHn`k<%9arH#f$As~aZ=^CkZzzEnVl z>;jyb@2?@nWZkdb%l$!qRUdS2_V%yh?}m51QBbTZH@AG*Z9Gf0ef;6abT7g2o;G@hMzC1@*H) z-eLbVgOXa4?eKpiWYSEt^@9H%)-wc5jaHj^xv=DkpdeGXW90@ zJuC3E0gu(D$K*gas$n|4=??{d5(TPFEo=271C^vK?r`=+Tj1I=fmo_Wy4N#i1wJJ; z7+wl=eJ3!lC%2m(m`xuBW{{=$%Bd-^nF3IU*>(lS@e7I!^A7}y3>Zv-Wacj(@fl3@JLkYHhzoJQpy7PQfUgc z8{J^IiGDYZPN57*2KFowWpC*=Ln7iYL81GfN;l;j%+i!+finwBZ;-l783i8?dqLKU z(xV1*vG)pTO=)uhF-46$24z^yx1B2esf*yiPWitr?OP;Z%!Kd9mi6vJl<=pgD=1@h z1skNYQB(&?^d;NW!ZNzCqjl6@N5S75Ws#IO+F=C`7r?i@%iMy3zE-a;n?c6birwMI q%k~)*Wkd7!QDvhumd3}E0TN3PnwfEt?3KqSmW0~`v39bvAGsB$ z`M$gIqTa4gA{|D}_Cy7CKCVz8ZMmA|S_Rg8GCqmC<nV^=i}(x$7V zYW}yQl%$N;Rx47G`a>x*!-!>y_VX}2%z$FuJcouFgVM>Y+ZwcE(I5elDz&aro41jl4Tu$s{Q|i*DxzsJ zhxtXS)ZGUn_9k&yfK;81*z-63=o8y?(O|PrqDF@iGAZ&a6a+5ZVK9-+&qa=Q%bw>E zi-S6WWWF1@*sfdv_kp_iMNZHoOjcQAOXTNac(%^27f4-ewXsRC)P>T!86!U*WEVgx>lKvEzj=~0#Q@%H?~dJ{Qc;{Y-8H$|OAvIJgKhKT@+ zAuAiBj;iFNgsQegZHwTykXBuEWf*DvD5~Wl7etHwA~X@C=f0?e4|_{SejIfSulLJ3 zs5=;?(gECWl9cVlzzm4BM?(TReSqs!1;nPQp!=epIxqT5fceW3 zqwW=zPN_XIb9He&@hm9`>UJt53D_LOtn8~({5Bw-f5Iq`@x{7<4&@xsoU9^8-6=3j zXA}@cEUC^LPCi_sJBhI@vsJf3cN3#B#9X#sCX;m zDzZqwCmd1Ov5O`8AMpBs=sXPR?fNkN=3WXO1ie7^%+R-WJ-hK`{VtWpAm{}$Z?QgH zrKibH2AK778uX8;A{JC9kmZf~<%;SE z@H|*`6(o*Q@qY{avE<}2{cq9el+y=F)+#%rKZ4#BAkDw)At^06r$3|uf?WaF`mMgD zD^LWWhV=SQe^_x{cJH_=aBmk{>#jY7)_<-8tuBa}KRyKUg--1zH*RIcCcdN|m< z%l$LEM?b(E(EH(>>~SxYgUnp}A+h2+ z6NJPcqo?dvV6hw11ad|n(~b!!MB5T_-W=1b566?Wojf4sQap!+SW&b*9dl%u3MO?1 z5u0OfVp<68I23c)reM(EkGK-E7=xeZ8zJ^U7>Am_HmzY<2u4e^RWK&L@n5(yaNZ*t1B#HZ_ zEa)kXSNaF}Xyaq?Kkz!v_=apbExx}?ebhu!>*J4ya}XIf%kXL#nflN8Pq`PsQQCS8 zYlxr6yC%@e`K|FK+@;`=Hc=u-r6Khs9s>d2T+dI?k{>>b#|jG9QlosmC;lC76u=(; zcLQkR<_R@@A|-maqE&kCcBJ8F-q^uiZ6^u@($iwdQdpGBPqtwTH!$GQ&dS!$;N!JL zqWOfOmX`+3R?Jw#E)@z$J3EXFe9?dgf^!U5`%)+1_*n+EUf>brvA$+d>60+v^KWzl zsx;X2rr|*iO1c%{P56%LP6TDvYPte}?9xS@D1dHNtg#H$ywrfr3L1-=v0|l~3Fh{r zR~eq?MGrJZTak-(hL?CI;D(sJ$#8@B6>uwbnnm1Uy=3T77i7JRy@qd9F2=f={RSiN zGNr4e6guX(;WCdNfYDU&%vHk?B|zyIQ5KnSAq`zbHqEBoga_^QQ~pDMMIJR!Jl_sI zs@<2+P$UP2S3D;*4A*8P9L_}$2x2B*{ddA>3le7jHFRHsh9@83nfmL@wuB)nKUZ11 z{h~jMfK`E!jusVPJ zW0+C(T2@?<#;7RH&02PQgmK#-E~uM8167sFA6<-U)$2yZnPgbo+)glvKY^sqH!i~9 za!W-)Ajel3D@H2!u_^18F^f-G+&RhpZizUk0T7&IW*8gP%C(8u{&-2L|! zplz(;9i!JJmRz)!l2_kO+=12ym^3eyFH1Z;SmA^UO_p6q#HPsWVwxbQ+dBb4kAqQ# zE*d@yl7C4g$-g8G;8Q#hhVV0yxyix-3_q7xD+C2HF5R+qwE!U^M+n zSg!G*>5>tyblFrkBD(v!X1wtgJcx9s=C`h#JU(w*FDG60~mFi^>L? z71wf;)InzKA3;(`NG9^vA?B}L3M;IaZLKmtpl0%>`FZqbHw%N}h32QQdV}hv#nQHV z^C@&mP#tZKBMz%Cl!0Z(9s*qQStsE5HuHL{8*ZAH#c{n0a>(P?&C}4MWvidLZyu~XpiI?<*cl$KO`rsbj7l@r+4zbM^QO)RhW?cm|{*@6vIo&ofIbZ z!W}Os-{V^{FSC2nKa%6nr`^Q4HTgB{Siqa5Q^)ouTk({Kb=ta9$zj74HfWK}ar81_ zz4kEHo+;?{SH5cU%4hFi>ece6E@!Xy@9pAi48Wr?UHD}0-p3G6Zg0P|q$o+6JC((j zqEeKsfafw&)C!>Uc6nCHPCjpY-6S?YWfSl3!TYGRr%O^^GAUG9LOeEFO@OgS#-?mQ zPxC-^g*-PirS-9EG7DpXO~)bAWI&$Br95BS&b>1 z8B>IjD~F`5vwRfKQ=)h-uFyp8Znr#*smUuFs`ZXVF_f2awf{HEE7)py2^63ps>>@S z4HJ2%JXOT#^0G#7==9W@mpDmsu03^9KmH_Iq_Y2v&3Xl+hcoc0&#ExsV*}34fc2*U zSAkaqZ!aakOt%)G`e3^%CC&0V*1@AVo{wo{&sWyhP$R(nMe7|*K0fB{Bd%E&zmLb{ zC?2;g4VQvm@qS)`nG9Kxc3aT{yME%DwDqd%VHQ4v!Nk-jUa!h4CWCgSMPbV;7KhtL zkga>uzCinVS%9wlIBf>9=Vj&9b2M$c3NO{{E+y{I(pF;bV0hyG_Fyr|xRCa)3K>EL zmW}Oct1(`vaRjpZm$cP-ZVm$cWMgjg(V(b_w0(_Mmi1dT!e+;!1m7N{PUPTt+nq90 zo=A6VXExbR;oQZPEDoKJoI`#mwiIL=j4LhTijLY&sF9@=vGXh2Z0r?$q^aGOfOP4W zTOjQ}*pxQGFP0yLWAn83dhESry#5*X@z_!Mr6u=p(yiG39UpPMB3)ER^taE&KFm*Q zN7mNm!#dw9LSf4x`1j9l3=y-)0GF%9`i(`mah zipjhE*mL&P&vMQBnX4WfkiI>x^G$Ul(yu6-Gqew;rMs}9_LK8-)0J}VXFJxS`RVm& za=$cXkh?YM*U-OZw8(#?A4D{H(|dJg`o~ByAXl5s=`~nw{A|fxc{u$B#s)0LMZLHrIzvl_=rTT4nsv6phZjn)%3J-f;{c|p zk5-8Th76yHtB>5z&FIUwhF-C8s?J2lI5T>or-8WpJf-Acp^X2*QIakQVO+gBR!wpL zxQu%tPAed#ME;E>@LmRfWAVy5$XSzd#I9gd&J6#`Si|>SfJZB7>o*xj^bz^PLHPBI zGZ?pGu`|=O<6g#Pl}4qSF4nDas6kM;e4z?Ys}?7Hac*F+XC z%A11;Twa;N$h94ljm&4q*1StR>-wBDOGtq&VXEq~{a&PjQ;b8keIkUlEpCaLfcpl_CmDcF#GAA~`#xxWW;~ zIq`z5(zn%$O2=|cOY#oY_J$)&!IO;#Uxn4iW6@vjP^KulM}|6F;|OAHmc1dc*zpt( zQVW&Sj*cD#HJs)ubpum=ULWA_W#>)gsTG1LUj~K!xcw4FOfdyj;Q>4l^itJ z?@!7<%QFs~qB(7Mzx?NUHUOB^LWq!E`jBbE^8d_J3}^59==_g)HukyXq&O*mFZVXU zgEUr3PQH@=CQoC4N85_oHTm0AEYrMDwmg55iUu`Q+k5$FC^$bz3&;TG5T$c2kQ2MKjOW|!*%?;5!2V|Kf)V4%rs%-U+l_%Jg2u&YhM zmaZ7qRi6i1TFIyMfuXMNYIs^nM+STRmvv%DCO=+(zE%02g#qW-XOl=mi@4+d>%=ve)%_u2~_&qHdz z@HX=%!UwzTt?{rbKA!8tJv`h`{b;Ad_gXQYV{PuRX}CHfzits^bGXn9fXg~;TJOkRz4s48AcXW!qVQ9J28<6_7wz-Fp8s@UIl^G3lsx#2bAe0fnjY33&I=D- z##$i57DWf|V(KGHgy0OmP5?3J=$o1ytWZRg4coIQs2JAE#-TfXgX=L(f%>ZROk{6q zFb0!`Jd9r*7~G5OdI|XNDs)|#;idnAO`aUIqe-bc;cr#5f*mfdAvm@n*sRzOmJ9GN zp>4q%Sev|3E*41rp5SB*0xw&@XPpSnR!K?q1(W|be30>ptx`JKc{z9o)kUvMBCWTA z>3j^8O>c+{wWw~R+5Wx|+M+s2*Zys3p@}Lynw_5XgnA^R6Vi>&oX0{x^DUFiNbQ(V z3FbA}-AMo2y7_D<2GfzOSW9*2kfK zeMy8t$wV$JE4Yo)O4}-v2;U6*khHZ0CsA8I=IX+Rf+pUG`v`c8PbCY@`L=TfKX+3o z(0_^rzb)vWr@*KN--{{i+l@0vV5zuP%b%Ehbwc4-OafkcvoI SO8DOjw{_MVIkmjd5&8e()Fa{m diff --git a/variants/NICLA/defines.txt b/variants/NICLA/defines.txt index 4bb8a4946..952ca4679 100644 --- a/variants/NICLA/defines.txt +++ b/variants/NICLA/defines.txt @@ -33,7 +33,7 @@ -DFEATURE_BLE=1 -D__FPU_PRESENT=1 -D__MBED__=1 --DMBED_BUILD_TIMESTAMP=1707145878.4650075 +-DMBED_BUILD_TIMESTAMP=1714634654.8014047 -D__MBED_CMSIS_RTOS_CM -DMBED_MPU_CUSTOM -DMBED_TICKLESS diff --git a/variants/NICLA/libs/libmbed.a b/variants/NICLA/libs/libmbed.a index c35ddeb24341b210c2877c7b2501e6d5f1149538..993e06a428e570a44e3596ef61e66d40c383bf90 100644 GIT binary patch delta 20051 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 Y6i)We*LvN9XYhWMRTj@ObOzJ>f7KP%>i_@% diff --git a/variants/NICLA_VISION/defines.txt b/variants/NICLA_VISION/defines.txt index 77da6da28..62570a0ed 100644 --- a/variants/NICLA_VISION/defines.txt +++ b/variants/NICLA_VISION/defines.txt @@ -45,7 +45,7 @@ -DFLOW_SILENT -D__FPU_PRESENT=1 -D__MBED__=1 --DMBED_BUILD_TIMESTAMP=1707145915.505897 +-DMBED_BUILD_TIMESTAMP=1714634691.0340967 -D__MBED_CMSIS_RTOS_CM -DMBED_TICKLESS -DMBEDTLS_FS_IO diff --git a/variants/NICLA_VISION/libs/libmbed.a b/variants/NICLA_VISION/libs/libmbed.a index ece9e9e842c3def7319c5610159669acf630bd80..d603d4b94ebf7da3fbd67ed31f76460926aceb67 100644 GIT binary patch delta 84501 zcmeIbdt4RO`uP8#qFiNjQ8wN{L`6UZ_J$40O+iIPML|GCK}7{crBcDN7L^^fyj9v* zd5S*S$;y(-96MQAsoBxg3eT~QC6>2}icWTpmFD-EHM7simb%vx*K>>j&(v2)eAi=DUhBGJY;gVAJ+3kr$~lKyG`1_i~%B*e!XrSKv*fJAq2 zeS5Xcdq=_54vM^0r#dbmVi1g1aS%rNDL!BNnY{4+Bm{fcwb^EPwgLF~|D7 z;I8Fr6}UHoV8D&cTkvqc3RdB}20YB^69FEK;1cj?4$|CBOZVdUgNHfy>;R9o>r^&n zfd^w7fQOc6b>P9Mi2&k(e>nTgz{8yPQ^CVl&h7>e>mb$&s&c>9f`{E8_EgpiUBqrV zX+`3gHnE>8TV(*2e}{UYiSqXx9sw;f;Q)BHh57a1Nu)ovaNiE_Yzt2ScxoWp3(uWr zfKqc5Jk5DC1U#GK@CNX-h0ie4GK8JT$8&4Ivnl>l0-nv#y;~L74)*`eMhZIv-CH8D z47xYPlo05yW%dQ=u7xbd1gvExK=-!r;4bKH1~Ct4=WB9{McjZB8PL70T*MqVfmf$| z@ajaQKh4l@KX}=b_$ctwLbMmwp3g`HFUEWq@M4r@f|rdDTO-(6o-}Xq?g;Q|Eyw)8 zt0_+J0xyZL2;d*&l80p)wt|;Azh4J0Gjz@&Kyj-Aoh=Y^;Xdi0vz7RxptF`~7eJ?h zXfLcfFGT}wW%XImnX?u>wl;)Fe;mgPJ3wcN*Xlq=A?(EL_yK^fIXIA8Qz14nA!m zs{wo{1W)d+l6hDMKGyI|3HaCxA}RVi8o~JX8u&2&+zq~+4%vp+1@L7AR)KE|kd_2| z<2;}di3h;9ImU#5Z*yeDgRctFUNk6(m$a55~w^=+P>0{l}_^#i`K45fDcxwLvFw zNUp3m0L$NcVF$<(%jMcLY%8=2q`eYqA|28$xs(#$b-)tDQeZoV5sOx}p8>?OTiRrR zf8YV|A8^Vlh_!+ak|S1G>7c|hZDO69Y&PJvL*TFFKsoqZf>;V{DeOx<_}d9$FGX5C z`rZeDGw1^7n?2Z%kCv_S{4OD-B4ux$xD-MB-Dg!I1WVG?mEu zOc-J-FCT>=)^a=%h9E@x(}7_5YYYhU)`3L^6+oCnAgxeb+y}y}VOb7@wFGHNz`^%P zixxW803y5ShkOX@5U~F@PdGfh1lkSK9*Hf=hwvsKP2F&4cy$JZOB^jG(jS?V%OSiK zM06?xtI+L$h+80*0^1>MbOc055O!jIoKyu7_MmtjL^K1TH_K}vqT-;+&Z`h%&MPGl z(HuuoA%byy4Mdnz7YY%#LLlPXE{*wLJw!CYQ0KE?Ux-Fw&owZ#Eey?vp|(P7iBNI~ zhT0ioQQ@O?FtjE1tb?JJ5F=oyHGEtILq9Ge(jWWs$8{KLHTeF=dg1F3>3snr1Fp#g z8X>YNjP(%N6616bNhU@>q?YUqh-`_u$04#gZr=itRzf2GQVWy~n6vhWbVQ<>G>PML zJuGrHP-3pZFms4`Ks#TPTP$i{1IVo|v9|$V=wVos;QrsHZ??ld(xheWkT|AIIyCoR z;QsH9G$86lat5MaG~+$I{xH!pXR{#6o)AgdwHlclJ0YqaiS|7JMEYYB{c0gP_$ovX z_K+F63!)jZ7-kzpj*yiB(ORC^0?}G(w?ec-AdXUOrC#EYTv?eorcJDMYs>=~&?1kd zLX2$?TO(K}|JG56v4#^Q5n@hsAfzJ`$Fxanb8qOk1zIF70u0SVnirV96%5w0;s6*d zv2HIIEb-)SFg%I-{|xj*b9@c0Zi*w7V6c|+=%JP%EeR<1jooU%5fDcxZKN|P5sXbk zn!DK!_ptppW1Zvgk)~ba_{1@7(xJIeO8o!J-?j=EJ7YiC6VjxzRcj#j?xPTU?{P;$ zZdHEyEW|Q?I0&&4zj`AjB&WcG5vd!Y#4c0DLaQw;5u)l7yfO&}NJ} zNRS}xq=SxxTH)x#H(Y}R%aB`dJaq*U7_T0O1bcC#1`;$3@3tL=cO%lDR?_z>3~wt$ zQV_RGCS^4YZ)b?z65MWt;Z3ox2!>mR$TvP+4#S(`d>ssT82J0&j#F-hZsM?te?!HLh8>X949Q*df#Y=+lA8qge>8b> z&|XM(G{iiC=~p4yR_-i@#C=tetmXJlNVW&(F+*mgxaWfcft21LGx!vwSYp~1 zNHJ&8a!8R_S_dh2G{L=9kkTUf|Nm(u^ujerG3V_rkYX$UHbROu5UtQJ$05Z=QhiQ= zMf%o3YD>(l29kPcJ6Pn@AxL#R#O6ds-kA@a3)L{voc~~$)eu{R9Ux1rw$uTMW7@=e zS2@H0(rj6c`sx&LE^dKQe>Sw5w7$h~3sJcLH!aEnW3wR5o@_q~X_g=_)-I8g~{ z*6__PNYg;*MSTIJbqvH|38#nGK_g6SApI8b`@dTQ9T>JK2hz0=?L`NilSbCq(}3OR z#hM*W^G-gbzmrd-Kh5(=38Xs=;z;FB*fFxv58`8z%ln#P!{GtL5`GF!sy+2$BA1xP*$n>vAjC_d*8L z+=@>qWCWgtj1Z63L0TKpPVtCMmfv0u8O?DQddW73tr6@jPi(OG!wAT*hEGEv!&-c#MKG={jyxqY0pZ%0+bbWLd#-G^P zn1Akt@&De?7-Ak^>H3#bFy29swknEr&@qKx`3qfGn234c6LUme}SlO9o7ySqH6#v?a0~;*wTdu1)-P518CK zNNXdu9PiR{nA{>*{w)hRP=>T{O0C z6F<~ImJJYFgqiFVzf`aj#9oS;*OR>lrdR~`e_6iKPT|CoRqM9Gly-tl`P(6I2uBXU zl$OEr|5s%PLT*ibs&^tZB77%IbreLaID0=#ZD)u>6MXjqOl2HC3sY}}SPE>nuMk(Q5st1dBtb=K`LRf^LOqgaXQF@rx9K&m2T2qX!foTYl{&XP3a^huZRJ%ahE1@RR zA&$=F<)bjooF7AAngXFGzwL!-Es*Px1-Upf%I&evo)CK~Ygt#)YRJ_x8u$O_jy7X* z2;|y}+lwK0Wk%Bw^P3Nzfn3HT)sU;@X>`9O_UIvZuN53V1-WJr^MH1~#_~6_sC}== ztuAR-1Bi{e&r8|~7Rj!IJags-K^~)I7v!0<+z&|JUk*a6dCCRy+6Ivo?5&49bKVVw zyw>s==G-cXnc&4kkY^|I@gwvWA=U`lA~SRgwY$afHAx^o0LjG%Qey?IDW0!`mf+yT?u4F3OLnpILz3)3A5v84QgE-<~F zAXX>z${Cn$f3W;5DgDPTnC>XPE{EwHqP=L{`HU_Hpw*C;BKJK5Gwj8x)i8tcKrzff zi1eoeAsv}Grj76aTb28t&cY0PKw3~TGwUok64EB+8&|{3wn18@pdi=<>;tivB8{He zQBYtl#9VM`CKNcDbvvLyfv}SfIudS4BLiMVcQW2t4F&e*QUerF2s`PZBjJ|ZYQU@! z>Ch&oRl%$lAY5R<0hraEJfVYGPw0sBrvo8PB!007W|?z!1I)5F#NG;R)JJT|(d@ys zU}s3n3TM>AY==RbQNCdv%x(=&WWa1|AzHzgD`B?1csB%QH^oP1V73C8{Z9|DJKt}I z+17#O-<;r|S7ElDDDRbnLCY8+%lwjq4fn&+#3E?3&mD}^MC6Eo00o` zITYK%x9L#KAnc@#$N62ZLu(+diDZ{JhJ2WBz~BGHKaQs)6y}$$u>gMmWBG;y!k^s@ z^R?{m0`rOV#}RxO5A&^nSR>S=%pc2Pz7;HR-2zQOn!3^Y@R(3oU^T=F;VBnjfukTz zDc%wS3mA`8!h*K)(g9dt0b(i8>adT>U_sl!@^71hHpa*Ke}@`C9Gv@w03uwB9S?~nxlbrcp_1F64Knw7VbS80ws)>4nfJD z<0@|)gc2?9)I$m5NCcEH2s@FEr}nCxz5*qmpK&-uN~F}QNX4%lN?XIgd?>XY(wazi zjDz!kYW380P}&p)TcMOO=L(eC%8Ij4Y7Xu@ET!-h7SO&&B3of&qI*!@5^rZgsW~65 zhSC$6O@ZZae)G%YP-@QQK2R!A?*XL^wT=062b5}9T-fWd>fGGrt}d5$TVutnLGg>;$n%(fi9`5#z(-ut>|v3$TcBW;HCb4q~lfBe})V zYk*=p3ya$Xe*bH;f;=58wim=+idw0M*exfmGl0P2Z`N7n#~rY^DSp2IixtY85`hx1 z1Io;ase!U)!S6qt7jV%1M+=~=VLOx&>5qmbZaabEp9xFa0n#3cG?NBtdoJ(a0!vyA zX-i}~#3i;`{(cE8G3QecSYnB9;$cY(kd_1-d>_ld1q&Tmho#6ek1dVSm%uWK;0$vJEQ={?%zJp`dA_&TdHQ0x#l|ahz&&opuG8eO8rGu$(O$7}^zUUDG6&(WUsDzbtNr&WG%{1v4 zw{ruq{5#SE@gyE9;*pdKjhT$sjF~}D(Gm;SKt-7zDsGQ}ij`$8v#A&=9z6&ZMEcW# z5StS}iUv!3e5f&}(F3-Fm962>L8!D10+na0RlZJ#N=y7~gvvIu zO6LNUfE-xG!TsOrg`LkQu7OpIX**$+C6X-#S_)fG4y$hE(c~Nb?|-~u?c)tjNGGJT z_;^E?s$D`s|3nudsDGm8+Kk7Yk*-KL#6`?_+_gBwCE6HgFvcas2ti?qdhz(%t`S{$ z*uM8&clP90LPNZV{`o^^T)Sz4PS4W|*EjiwiQVg5N2xa+d*4+rmS1+Q)I_g}8R#!| z`_uJhH%)x^9KBfU;&y6~8Wv?3<}ZY&SA>f{4s+Y*)lIQb7?wSxmv}hEZLPB^+tAO; zUtB!eEvdH}w&jgMdhuwH+x}oRtolEmda?R`w=;f?!vqY=5$m_RtJE1qT7WrJZ#^eZr6J7D}iRu-_QMCHG5+9a8reo=pW?%i4zx;1BH_-a-7Ao z0q(~&cTxws7kM#3gMfAfi0>KQ{WW&bRQ{Lb{x}aaps)SKJ!9QB@+=qx$%o?10{8j8 zs{6(U>cw-*+#k@mN-9xt%|q^I(i)51b<(}GFEb=YDtLdf^AGMXs|74ny;m9_esb0Q zB^Ol=!}Q{g8}93Pm_ew1d#qke@9I(R$>a=DT)lvD$)b;+$9RqK!TWsm;_5ygeY&c` zr@9T-i~EB;qIgv@h-lE+(W;29XmWt~!#y6yG^(-|2gpSAW$HMQ_rkC#;^D@FOxD;{c58ib%bN&>{YYdiuq3DXjKYrn@EYGi>{)6MUD zOzfo^O~d{;>){%p36shr1r4)%DaYp-sY`_(YWrJp57XLQDX!B#SsfUAMT^d zRh{ULj=9e>&0iBHWp45lo^SGciUlHt4Svq^6Zb}PdQtzXXQC!=)LD1D={e3rm5bV# zpcl^`_Dt=rhEaVZYCTtJ^p#(V!=`@D^N!b{amIJISVnE2F`?khEANli8sc0a8#Su#(U@P}8pIJK<%S86#? z#gkWdU$0SI7wsJ&{`O#ZlE!Tk(XII!k4l~w(DUJ9@TKkxH14N2o<18DE`Hj{tEYNH z#PTcG6g$l~iTC=sKTkt0lFc)`UU1`0^QY7E0>u3JULm|08U$LUca(V@Oi`m&Z;ZxP zwA<@wKQ)YIIWRjeT-BX$Cyy_c=Vc&Ae ztF*BefAO0JuW{yK=w(+;SXA~9y|DX{ie&LMXWgItNuzXFC*5?g)`;x{))SSiZtLpSJ^}oZ^-Hyghh| zM&V#_gkC79%nK8fAM}2Ow^b!s_s6`~2eM?1Le2D9dU5X?-VNLXM!7UTIO4s6KP*tG z)Q9I^@QyOi#`E8K&*#~oarI(^yHAiN4O(i8!+c`ZH0Vg;;BcQJ-u+|Lr^oBX)G0pY z5vqAK>dCu(ZsP@xa#F=8eAp*JRVP+I<5R_(9#s_}j(p4KawJzpdx5dv`E2u3Tb?vb z`QuNY-#YUk$;Z$8b@tV`SaPRm)cHp7uEr>0Tf`B-H+_9S=FfQ}&C;nr-!e^>q{0{Q z(G({BCC+z&#&vWs;*sQ=!7HPY_6>sRC^qJ&#`yk2bAx7hZI07C(epu$I8kf(unD1!bSd4OiR{xUk0j@4qZUi5`=KCJ6J+X8MA@2Ij zw`?jaw^(@uYaHa48pccM>5b6=;?^v`GrTK|l{2+rnO|kB8kKep1D^AHd=8IFbh!cI z*{(fmV;YI+#Zw7Aj6CnMbwb64!f}7C%m)J;pa-Jzein z!)UGXc%f(AN;Ry(J;z^k5Ay%Dvl>R9vq2&LwVTv1YPRp|{u_B6h?Bkb?g9Vx+*@&C z)|dX($t)T=PkP*Y_0c=?CNDcw*y21kOq@Mfe~+3!?QpdyTCWaQ<0OCg5+@n-PYmIi zrcQI2rN6){o8oVex%w<#8)9Wg+_g}@f;W{oxuWWp>ph~FrEzj+lDJcUjmK4-nEj&O ziFdmuT9fYBufM@tlu0h;EhqK6Q(60A zOds*Xn7(~^ItAlZ}_U+5qwNw!RBrRKsYQ%}nk0?E*Ed;b^5^*#AmI zn7HZrew+A+Btaf@C%)USek~I=Ng2xI)hR*t_Kxv^iM)DK_xKA>t{;K}nY#mHLU>$3 z7ljX$70(1NJbDkQO`Wp7TF3$b;uVHcH<@$YYeg7n$nRv1K$^H*Gi7#yGe@rPX zNuiX8aPEz$6k!7w?nEZ^ZvrzkN|J%jYKZJL668im6 zoG8ToUw-rXt_`iEe(!Rnvf|<3G;h8I3ik= zqy13fso>K}d7>N^onFlODtHYqx)_1F|Jv2y<%;`dF@N!)RRiu;`fO8FjHuf@po=o8 z#7m*3G!!3$FAnffM$u9j%|PKh1Kw61_EH$_uV}o4R2D}yW^F&pS=HK8t@C~I4 zF-4)Aw3N_IKkznXPGyQRirDDROi`oJ$7{u!fl10pPKrj0>$ArO{;UjvFq$0p&EA1; z_vR-5B#j{6JvGpK5L0KATWQ082UhaT8s+X_U6(;FGr1gXRIe5eTHCX+w!D>tX7T!< zB>LIogWljpVHDBrSCxUSDJoW=&*hzG1|5%Q%422sZ1x`f33pE{^*AXU{3Wjn$}{+` zm4jdA1xWjUy_oUX;M!2GPQ=0=>@1wDAMCL$s7p5?YR>>a;m@U^u2?jKeFd^8c)Sob zH`qn2J2ZF~cRu$0(mZ3=XM-^my?n#=2cCJX1FJ`2hVt% zJgO+E4n391qM3w)(fK$|Js;Xdc}|+5OtKlPordh@g^vAZ_K-~F5h97uT8n+;EM99( zLd_AwC~?#)Lr(CjqnI)5qajJkkP)jbeJpG^K4fpYY6V@GD)J7C;O!}1uEo0tg;ggp zIqD!>=qe5iP#)Q)sCfAy`s}i>i+3|QCGM^t!Wwwocscj`!^2N0LjY4$g1BW-_!VXR zBdMZ`f7`3WuMbx1nDh|ado;X3d00uAr(=*qC&Mdw(J9XXVb8@PXYt^H22O6U5cuRT76LE- z*E|qAZsYG-ixrc|jmDDFBHkOvB2mtgHtT>dX`|8mVMrDA8 zzNS;eQ)6fmi070C5{4)pV{9=e8jV_gpIfs@d@wEs6L$Ibsf4+nSfzj`kbllIdm`YT(B|@9a=ns zjDDp-CC4?U_rSV+vk0718|Bw4)OCvu-gBYjY3^os1Gj6DdJ956VDl8>S z!+Ot)d`=TaAGvk6M}}yUpq+il+Q%4lC%Qghj`Qm^J@r%Qom9ye!>UiQuqc|T!7oLfSBsH003oPfc9<}Jy{}H3`+k(0CT*%@!-r84x?DtqUIiIW1O z|H<2qGOj&Vlb#~pHz4}&>;}f5OD+Y2qgS&wAZd~2#@B{Mr?cXh!j4u3h_hm&KVa=A zI!YRI;soL8NztFPJ`Dx2aP;E#tY|$e9287FAuRz6n-l$!D!6Z6bfRj9Qf=N^7|pAV zlmPAEx-D)LC@afes#T_>@Z@dUKukeecvv2NSWQ(C99(&;;Ig|c2)=%gR#1uk$GzG> zIhnKvEW}>BPAjOyKKW3iK+I$MEq<8yNTV#5zn+XebnH0 z%nESqyV|5>L2>K*79{_D*n(u}M~x)0{4w$Jsu$(l-TYLOyBN9Ue^VR1t%fz> zXt^g59*FtegXK*KlqR@a9*HSYCb*{PXc|@cz9A`Gh;ysdiBk{6^kO|;G`=>JUV&^p z5o5?w71!v?1H|+F40rM75-mT|?us*v8^9AoN9x6IrW;&Y>qm9+V(Ci58J>iJhyC42 zeCI(!KV@yp6fM2^(hImY7$y$dVTfZrQM5sxf~=37|YneC|Vv>uYD-VC_a=FJBtnRQ535c&P->kC%VncY( zB~NmMlk-Ya#N2yg|Hca`hAta)ii;8+KB*rfj=3-P$b9C%7GcCC%It;@!*u1l}|0`>U-l{*o2i9w7>Z5YjG>smS{IX(Dy%pOv)x5J>Tgo}AH^Y}uD40ewo&WTIsHtk zPaEBNxxeK*-NZjaOsZ#b>6m&pJ+x60a^TkRMuD^}#k$B_0|m6*S&WXckR*EDS-d;8 z(H(pqS2ziqNnBU)qj=LvUMZ+C8NBu?ZxdXSO-K2I(^A+{pEU)gAjE?wEx4*?K03tvvqlb)TM4~0>z|rCvGOD>{fy}#8@NU* z3(z5c@g;2FieYq!^HOsBNZxs17*;jG>#u3yVq8J|7rZ}&7wv;tWxGHKY46z952yDNCtBN??Mgc&&GWnjl+b#XD+(s6uLp zhW-hjY!VV}k|!a!;&YTO_C({vd}G3PHvfpGj=}-Y*uN(5d0KRw954RqgjzOv;erpn zpb=!T|GnEnV0eu-P|kIq*AiA|um_o#LLbWh*AvtcUMwA3?)x*Ls;imUP3PenF%jn~ zIlM>2Qj}Jq()tbG##Z&P3eg$ZwYcGXc_x&M9Zwm)ojXLSYWHs+?#bJQ61HdG@L&0( zk1oCkh=)HNK7kLDWVyA&z8)?P`+7uwUVU+~U0Q)H_ehNQWZ4jg;p9O4Fd%V?PAy`5 z^wsbogA%JDJ8|p1Ttw;~Mu{g*C-&p1#>u&LznIuVc_U}SBBSe?sedLKxd-CpTD7%j zQZbvop&V^k{-cwAP8LQgakd}*y#P#!n^@?g?o-u;My z=NGSX65}@|9p_zaZ*FW%6I?Hq)(i>()~&%;YVrxGFLg~G#5+&vMF&3Jb;|aC>fvhj8C*DM>x%FS%p>asVBQbaIj9J9QVT{ZmE? zMYpH82<0P^UBugNPjPi}jX*Ob5jVl>GcSL)&ayOQfUsqbZ%-jIpi(Eic&fs~vn$?_ z(v*bf3vVs(9qhDJ7+Goij*q;99GKb*nKHI)bdd(*$XLZ#gl8jFk-`a9CE#s@;+CJ%R|!ifATvi-n_#? zrBVk-&Zey5%^wq&9{2&jrhKE3qr<=6eyKn6AsjC0N?Q*i0#o_IX|(cs?)!q&&r5hE zlJ-5|c=&LtJFg$~of|&5K22Tz0+UnXK6}^5A&VN-tnV+5JkQ-AFKE^OGBV<87Ll!D z3jZ3VK8s9Z`RAk5xh`uxhOb7c?H;SzAY5qZTQ}-yKCYr3(K{K0hhKIZ(&=hX!R7L( zIbzl2QAwV}8;f-SVnEW6LIi)v5OyH1Bgc?$kUtP#Ea-3~16hJRg6u&~AwMHNSn>uW z2U&qUhKR@+4MlR0Rmc;_yT~QP%NZjhvyeLx z0ojG@Lq0`*KyD)5SYe}(Ok^qY5b_Fg6!{Ku?*=ds8I2Tl!>q2rlTFBT$UfvVN0? z29k>uBX=P8BM&3bBCjLwA*YZF$j``4#M2!h5HTQQksM?pawqa2@+9&K@*eU}l0U3fMAu&_&&q8Ds@(}V@WDoK_@^9oS;^~QX1W81ud5T*e_waEN-ucUXKOwnC zX)ht_+NiK@@mRi2&`o&eA>aPueb+|SbrIr5R^U_Z#;7=_PFK8zGk=Z>b1D`(-yAid z(*aMRXnkQ%VbLU$&iNWv!4e@`3cu?$fJkWnjbwbT0*Fmn;QqP7J z%|p1^%{$PkTKMVasKL%fJ<(sZ!`T*@#=8d7WAma}o%gMhdr#i!hC|r4zosRLe{o7% z@8T3B9t_LIEX|%YLoY0KPm6c%h3TXVBQGcW3-7$*8~oVmnLff-a|Z{@>>tn>dQz=w%%1dihOo@&7B2jWR#23U3eycZ18)4#v}VD70^A1Bre}~g-6*A<})R+wj4%d~fc={=&Wu zZur0nbJuxGy^M6*h2HKCLxh`Cz5Nr4>7@?FD7O<)#0USIDak7TB<*)8_t)XM5BR}W z;oN)4f&E`qg5^B)gd@uJH7XVW{}y_8Ef0+T-b|Z2t=0h5RICq#DAxz*bs!`QDX)YE z7D&Av`zIN(UJ(n$a~}wXzbV()kKuI)9Bgzw5WB(2d!gc9c-!WXYQV{`Kz?kx279o|E%_fE_0gkPQEQyje^nc$YJ98<9pN!OzQ z#!JT}>|&&28bFm2zFj(|U>_wN)3KLU!mlew9lFA8G(d!OL_Mj>b(wTTJ@?7sDR2N! zI$^G{8B)PG<(MTM$IA6VQm{|DMnmhA@Imxi(Dg_&5j0XSU1IS_10yLKngnhmvHz8h z6Xoh8sfm)V@fa)}F^#FxaSC?!(h)CKE7v=f<2%Z+4v(GC)fbdwy>e{8Bav=gRRV_N zQBqi@95+beLjblYN6B&0^$z7o^F2*52;*TEY5W}NmjU z5Q9kn&Ims(_wg4_6zA!>O5Q!?B-HA?f<3b^g>t->T7ie~^qk1vo%VJT%1e9o6q4(_ zb)E*yYO!1yxzih*DCbFKmOvb^K8JI@ybn|Kn@Jrn(H`4F`P4U=rcCq4aFAlw|AsTU?pS>WXwg>ix~G*k#Q3=iyd!CCgk7vC?_g=OJA zopcY83bYF%`TuWnC(=WUQAitO%9mqp+kb0Ab3$ zHB*+@O{lvOgpn?#={jY06HdL?y{C|i7h(HR19MFujRs?<#;&jLCLDB5>FF~^31``M zaS^uM?S{o!jpkg@m=mZ`cCVSTLoPy*TUbw@SIv~2auMo&KxGep7^n+N^-~=ctWj2L z7U>#BI^4ad&sDSV>vFhoVtBTTo0LWR&sBc#2jWv-`{2LRl|J}ArEye^GY(r&c!Y2+ zeQqCTFMzY1gsOWy1~{Wd!#WEE#& zH@-A9rhU$*k94Gt@7*S(<+F_&7?rLg;VPT68dYBPH|$AUGJuWfpZbqyFY(}~Y3w@$ zlQd_*?^DEv%V}Hrf=hz@s&HpRT5$?r2*J0-dU0@6`U7lFMzpf6?)ZrGniw`4P@?Ww znywqAhSAp#_)79OzNnfY&9QJ=vN!!nKDkg{GC%!(`p+yAG0I!Zn$zheY&T0xlo-@= zG+&=Z5xO+DE?{&eUkt>zpwgzh!2YB8P9HQEXJ9z%SvFeFw)MnB(_P_W#-`CZD-?63 zFllCWp!1lhWEMtWCI^U~qsE+M>p(Hl$~wr*oH2ajgOTZ*=*-+PTTLu7?n;xkpx)d# zWjQmPOy#MhrQ)a7j^z)&s{~NQK`2;gZiwC!=?qbD*acN=absyVzCy%QvTKw|* zSiWc>c}DUA?h1U9c?O+_iPUKH(>LtPj*UIcriU1f?u5=cGd7)jbgM~XZ|>Li>6p5xi|jE_>zmsuinJ}b;+2{)`-!Y z)Fb6RGq$o7xfuDaT}ViVjvGRqiTn9NGtwtWALrYd5s)(^q5p-9dze?t7!lV6qu82&R9U3=Ty+KGLU@5lI|cFUsk!5- zS;v54xXTOMROPsTb4^N$=eCb4W!tr4qp~KxND{D z`~CuceiSa=b7I_5wssUl!$tRR#%*IuSTV}yIR~$eD`4~a7<~UBRs9h+$1N#l&Xzxa z5#D`ucDVSTdE@8u(x!Ha%U6uwr7?+CbzDyQf&1Sm;u>HrTN}k>>5^c`iSfI*)wGE4 ztCmm4H}HzD$X)+p{C+NnZ%w3qrM2hAhv=1#E=Hicy7kw_A7JkkF&DISe+ixNId3?) zcrDfR@8c%?9Kv!IE7v)?k~zF!0$<6DF)FKv=N3%h>mR61&Rk>HXU&3mUf5lyQ~;Q3OPNl#A7+@2UF{+N~7bug1w7P@^a zGhg6U4tHaA8; z|45nGzYnh?^mB(11rs;2JvuQ$inJN#@@*5(Z&4jVJ$t#+r00rwOe*%$yh%Ub(>Um@ zuP04pI~!w6BEAI)$zzJ}=`MYmk|R#eFsNau9G_C(O)i?OhRLmEc-CJ=ne?Mp4 z#@_wM&`pv7;(Gm*0Vzxl*94_cVou~u`O&C`No$q@u33hQT{lj-#9r#f(EX&N#JHEH zyuzy*?unB=#Bx41WdbiBwl;Y3^C{{hGG4Ct2md`~X9D-ZPyM{~;{83Qj^kBES)HyQ zHuWm6TFN5j&Ah3eWz0yr2p=F0Jv8-SycyxrqBN)p`N!0=*-Q=>U?nHwj;(Yqr@w{#4G(Voa&#hn?iw64H6v(?t6jD>vP%091bzsCm(ZtLqM_BfG!l6QXcc2}WK zQc0K?c_VuU?|79#;;zm)sr=~^FJe{j>%zu@_u%$Faeyu-mN$FM6mBYe9ygV7gK;aS z^s-0(fctt-&T;-Cf=0g_oO9TfDctnNpa4I6ZIoWb)|KUycVk7Se3yWUs$8J3=*+qAn`-)xY+Nx<)cb<>_>l?=sbcl2n;w3k^| zW>5x`g~n-rWj;YU>XSYx(@NANlv>p}V;Zkj7#Rx~Kkywl?Hub2FpMVhzw&9n-N_s( z(CwMJ`e})*LNSvU|7Y55tiE7WIxp%Y2fk7F3-~Vjx+q_Ja@fp4} zt78oZ_0hh#aDVROY=C3HPd22FCiVZw-CMzG41NV7J#xMunYW7TYm}KQQ}Z;LkxNz1 zW_)hmDPDyYTLpiWecRI(o68ERTKQY(g{X=o2@ij8wfNn~9&wo>7Zh zldw>|}$kD+<{PzXM9A==B#zQHy`l@M&_@$zeH)b3cO5=$xi)R@PEE*19r5-Hrsaeqz z)G%z|__@!wvph6epmA%j%?j1TrD1&{W?zd@<5qj)cs;go_Fd6R-)s<`mKIL%#~-RS zxuSi@=BH-AsU{(B*_OUV=`Nn$Gy52Sa7P-31&BEN+NjA2tpSTan7xfRzBp+-7$EjP zF?%5!E*av)EuYP1pH-UhlI{wpNeIJUb#)Q`^WX4t@$MhOot=bD-xVbbAz#eaal7f5 zIs1#*OM0+JEVbm^PqUMF`;McV!V)_d9%Ro?1NEt1>=RI!Ihy-Lld|}0VIltz5~XQH zsGCz*8OEjMJ`TTHo*1l2x|ew2mBQ_8IR|6X;o6RO3-?F!m{NxETg&tRDdhVb4JHvi z(cZz;f zeWDm~__HFd5vuRSfPWRK9#B&1{CUw(-keQ}inlLXR^cP|_*Q#Iz->AK;*IZ$1hxmk zpnUT3y6c?BA7U9$l3KiN&KtbmC`0s=>N%g3YviQic$D|t0yY>mm;@Xw_Yz+TnEO;X zm(v#O=VRtJ%9Jz*K9n)Hei)aQ3+zjN2Y&#jA4 zqtaTE@!i}k{&>K-iub%AHVrVy^SN_9=e^3Cl(Jo8&!BmqurWWng>GVaCUxE)sj7C` zp&Yn(UNO(E@|jc0gY&*+Tfz+jo%D=-WnO>w<)o78+K=YV;WZ~-#KGMTJ|l+s!3Sv*ZGF{N@$3@FxUlsjHS@8bTvg(wP_ zhZkpQ6iSH**xv9*v2uzh@kU4M3;r<6J;g5Efyy43XEzp4XR{y4fl|r#d8xRHcY8`* zd+W>M=^8g^D*Q9w7prwc(fZI2#gFr6B!)@*#L`{oC$hN`rbIi~YSa80Hp68;DleO# z$VYDYMV0i64#&&qyO>y!QoqT+93$c{$8>k$6^@qSgqrz1c-lC1lO7CJ$L9CZq(gh? zw{FhA!Fz4x)2}n03o1joy3Nwhc`b`u@Yg^dM91P0xeJ1l8wZtbU0~#6JDg8RKl*j> zi3K6N=R`xKEk~Ve7Cg+{ZB(WduYbH?P8G|Xl40Ydg?-pIHUqBhOHH=?FAJ-taXH#K z>&`CR$yPlK@mX6sQpLIp45Qg_uPOPK&6teBN#9JI{_idMj9G_b zbhoU_-%C8$>`00#{jQergOVU-kCcS;Apri25sp{?QIgEszH~!seb;MC{4`2w+QYsm z`GmO(<*2)YzA7n+RSKHL-Q`=_z}k)x-!AA&>sXH=MU$Fg^^j8CP)#&xu6;7M^aqX2 zRQ=haQln}Hog|>UPHQ|xci4yAS-M;kmF8go{iSv6$$-hy*9QAvFFnYrAX)l_|{ z?FhJC9-mylEPjz27$r}2MbnMNeB}hKk+)mkY-AyQd$7j2ER{{LjM21@ywJC-nsvj* zXhmP=*fOm?YSI7V%HD`}GKw#kltuN$<5v%q{f!OFF-=NSo#IU%F*)vd0Gt+tX*+ zd%Vsoi!qxAEpyiKar?%EUgF-kWp$g>1ZY>X_wcgqyem9rRsP8#4d)ed;retr4;@hPjg bmrzXlf~J1@s@;58U=--EW&fg8U%C801%f~% delta 84546 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 GQU4F)hDSL7 diff --git a/variants/PORTENTA_H7_M7/defines.txt b/variants/PORTENTA_H7_M7/defines.txt index ff42a78e7..83157a234 100644 --- a/variants/PORTENTA_H7_M7/defines.txt +++ b/variants/PORTENTA_H7_M7/defines.txt @@ -46,7 +46,7 @@ -D__FPU_PRESENT=1 -DLSE_STARTUP_TIMEOUT=200 -D__MBED__=1 --DMBED_BUILD_TIMESTAMP=1707145720.2958481 +-DMBED_BUILD_TIMESTAMP=1714634500.4736958 -D__MBED_CMSIS_RTOS_CM -DMBED_TICKLESS -DMBEDTLS_FS_IO diff --git a/variants/PORTENTA_H7_M7/libs/libmbed.a b/variants/PORTENTA_H7_M7/libs/libmbed.a index 73b0341bc36603b5bc70110360903ffdaec3a65a..a6ea813f42587adca7a09d54d6ffe80097618ef7 100644 GIT binary patch delta 17532 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 delta 17666 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 Ux?ahjzFKujQhjz;O+V}Re>C46WdHyG delta 14293 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 Ia@PC*0ZF+1E&u=k diff --git a/variants/RASPBERRY_PI_PICO/defines.txt b/variants/RASPBERRY_PI_PICO/defines.txt index 9ebf46403..d5ed854ec 100644 --- a/variants/RASPBERRY_PI_PICO/defines.txt +++ b/variants/RASPBERRY_PI_PICO/defines.txt @@ -20,7 +20,7 @@ -DDEVICE_USTICKER=1 -DDEVICE_WATCHDOG=1 -D__MBED__=1 --DMBED_BUILD_TIMESTAMP=1707145693.993115 +-DMBED_BUILD_TIMESTAMP=1714634475.1721134 -D__MBED_CMSIS_RTOS_CM -DMBED_MPU_CUSTOM -DMBEDTLS_ENTROPY_NV_SEED diff --git a/variants/RASPBERRY_PI_PICO/libs/libmbed.a b/variants/RASPBERRY_PI_PICO/libs/libmbed.a index ad8e05b9be565c5a1d33940103d4d5b2ba3a0c6d..e600284b582d948b35d39f2daa8e9fbc79e3de47 100644 GIT binary patch delta 11141 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 From b21c7bfa98f4bc5801f09efbb53565a0fab7b90c Mon Sep 17 00:00:00 2001 From: pennam Date: Thu, 2 May 2024 09:56:04 +0200 Subject: [PATCH 37/37] Release 4.1.3 --- package_full.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package_full.sh b/package_full.sh index 6dcadf305..daef7f642 100755 --- a/package_full.sh +++ b/package_full.sh @@ -1,5 +1,5 @@ #Get version from git(hub) tag -export VERSION="4.1.1" +export VERSION="4.1.3" FLAVOURS=`ls *.variables`