diff --git a/MDK-ARM/RTE/LVGL/lv_cmsis_pack.c b/MDK-ARM/RTE/LVGL/lv_cmsis_pack.c new file mode 100644 index 0000000..e8d58e8 --- /dev/null +++ b/MDK-ARM/RTE/LVGL/lv_cmsis_pack.c @@ -0,0 +1,115 @@ +/**************************************************************************** +* Copyright 2022 Gorgon Meducer (Email:embedded_zhuoran@hotmail.com) * +* * +* Licensed under the Apache License, Version 2.0 (the "License"); * +* you may not use this file except in compliance with the License. * +* You may obtain a copy of the License at * +* * +* http://www.apache.org/licenses/LICENSE-2.0 * +* * +* Unless required by applicable law or agreed to in writing, software * +* distributed under the License is distributed on an "AS IS" BASIS, * +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * +* See the License for the specific language governing permissions and * +* limitations under the License. * +* * +****************************************************************************/ + +/** + * @file lv_cmsis_pack.c + * + * @brief This file will only be used by cmsis-pack. + */ + +/********************* + * INCLUDES + *********************/ +#include "RTE_Components.h" +#include + + /********************* + * DEFINES + *********************/ + + /********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + + /********************** + * STATIC VARIABLES + **********************/ + + /********************** + * MACROS + **********************/ + + /*! \name The macros to identify the compiler */ +/*! @{ */ + +/*! \note for IAR */ +#undef __IS_COMPILER_IAR__ +#if defined(__IAR_SYSTEMS_ICC__) +# define __IS_COMPILER_IAR__ 1 +#endif + +/*! \note for arm compiler 5 */ +#undef __IS_COMPILER_ARM_COMPILER_5__ +#if ((__ARMCC_VERSION >= 5000000) && (__ARMCC_VERSION < 6000000)) +# define __IS_COMPILER_ARM_COMPILER_5__ 1 +#endif +/*! @} */ + +/*! \note for arm compiler 6 */ + +#undef __IS_COMPILER_ARM_COMPILER_6__ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) +# define __IS_COMPILER_ARM_COMPILER_6__ 1 +#endif + +#undef __IS_COMPILER_ARM_COMPILER__ +#if defined(__IS_COMPILER_ARM_COMPILER_5__) && __IS_COMPILER_ARM_COMPILER_5__ \ +|| defined(__IS_COMPILER_ARM_COMPILER_6__) && __IS_COMPILER_ARM_COMPILER_6__ + +# define __IS_COMPILER_ARM_COMPILER__ 1 + +#endif + + +#undef __IS_COMPILER_LLVM__ +#if defined(__clang__) && !__IS_COMPILER_ARM_COMPILER_6__ +# define __IS_COMPILER_LLVM__ 1 +#else +/*! \note for gcc */ +# undef __IS_COMPILER_GCC__ +# if defined(__GNUC__) && !( defined(__IS_COMPILER_ARM_COMPILER__) \ + || defined(__IS_COMPILER_LLVM__)) +# define __IS_COMPILER_GCC__ 1 +# endif +/*! @} */ +#endif +/*! @} */ + + + /********************** + * GLOBAL FUNCTIONS + **********************/ + +/* only arm compilers will use microLib that doesn't implement time() */ +#if defined(__MICROLIB) +__attribute__((weak)) +_ARMABI time_t time(time_t * time) +{ + return (time_t)(-1); +} +#endif + +/* when people don't want to use src/extra */ +__attribute__((weak)) +void lv_extra_init(void) +{ +} + diff --git a/MDK-ARM/RTE/LVGL/lv_conf_cmsis.h b/MDK-ARM/RTE/LVGL/lv_conf_cmsis.h new file mode 100644 index 0000000..89fa125 --- /dev/null +++ b/MDK-ARM/RTE/LVGL/lv_conf_cmsis.h @@ -0,0 +1,1149 @@ +/** + * @file lv_conf.h + * Configuration file for v9.3.0-dev + */ + +/* clang-format off */ +#if 1 /* Set this to "1" to enable content */ + +#ifndef LV_CONF_H +#define LV_CONF_H + +#include "RTE_Components.h" + +/* If you need to include anything here, do it inside the `__ASSEMBLY__` guard */ +#if 0 && defined(__ASSEMBLY__) +#include "my_include.h" +#endif + +/*==================== + COLOR SETTINGS + *====================*/ + +/** Color depth: 1 (I1), 8 (L8), 16 (RGB565), 24 (RGB888), 32 (XRGB8888) */ +#define LV_COLOR_DEPTH 16 + +/** Swap the high and low bytes for RGB565 */ +#define LV_COLOR_16_SWAP 0 + +/*========================= + 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 + +/** 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_STRING LV_STDLIB_BUILTIN + +/** 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_SPRINTF LV_STDLIB_BUILTIN + +#define LV_STDINT_INCLUDE +#define LV_STDDEF_INCLUDE +#define LV_STDBOOL_INCLUDE +#define LV_INTTYPES_INCLUDE +#define LV_LIMITS_INCLUDE +#define LV_STDARG_INCLUDE + +#if LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN + /** Size of memory available for `lv_malloc()` in bytes (>= 2kB) */ + #define LV_MEM_SIZE (128 * 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_STDLIB_MALLOC == LV_STDLIB_BUILTIN*/ + +/*==================== + HAL SETTINGS + *====================*/ + +/** Default display refresh, input device read and animation step period. */ +#define LV_DEF_REFR_PERIOD 33 /**< [ms] */ + +/** Default Dots 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] */ + +/*customize tick-get */ +#if defined(__PERF_COUNTER__) && __PERF_COUNTER__ + #define LV_GLOBAL_INIT(__GLOBAL_PTR) \ + do { \ + lv_global_init((lv_global_t *)(__GLOBAL_PTR)); \ + extern uint32_t perfc_tick_get(void); \ + (__GLOBAL_PTR)->tick_state.tick_get_cb = perfc_tick_get; \ + } while(0) +#endif + +/*================= + * OPERATING SYSTEM + *=================*/ +/** Select 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_MQX + * - LV_OS_CUSTOM */ + +#if LV_USE_OS == LV_OS_CUSTOM + #define LV_OS_CUSTOM_INCLUDE +#endif +#if LV_USE_OS == LV_OS_FREERTOS + /* + * Unblocking an RTOS task with a direct notification is 45% faster and uses less RAM + * than unblocking a task using an intermediary object such as a binary semaphore. + * RTOS task notifications can only be used when there is only one task that can be the recipient of the event. + */ + #define LV_USE_FREERTOS_TASK_NOTIFY 1 +#endif + +/*======================== + * RENDERING CONFIGURATION + *========================*/ + +/** Align stride of all layers and images to this bytes */ +#define LV_DRAW_BUF_STRIDE_ALIGN 4 + +/** Align start address of draw_buf addresses to this bytes*/ +#define LV_DRAW_BUF_ALIGN 4 + +/** Using matrix for transformations. + * Requirements: + * - `LV_USE_MATRIX = 1`. + * - Rendering engine needs to support 3x3 matrix transformations. */ +#define LV_DRAW_TRANSFORM_USE_MATRIX 0 + +/* 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_LAYER_SIMPLE_BUF_SIZE (24 * 1024) /**< [bytes]*/ + +/** Stack size of drawing thread. + * NOTE: If FreeType or ThorVG is enabled, it is recommended to set it to 32KB or more. + */ +#define LV_DRAW_THREAD_STACK_SIZE (8 * 1024) /**< [bytes]*/ + +#define LV_USE_DRAW_SW 1 +#if LV_USE_DRAW_SW == 1 + /* + * Selectively disable color format support in order to reduce code size. + * NOTE: some features use certain color formats internally, e.g. + * - gradients use RGB888 + * - bitmaps with transparency may use ARGB8888 + */ + #define LV_DRAW_SW_SUPPORT_RGB565 1 + #define LV_DRAW_SW_SUPPORT_RGB565A8 1 + #define LV_DRAW_SW_SUPPORT_RGB888 1 + #define LV_DRAW_SW_SUPPORT_XRGB8888 1 + #define LV_DRAW_SW_SUPPORT_ARGB8888 1 + #define LV_DRAW_SW_SUPPORT_L8 1 + #define LV_DRAW_SW_SUPPORT_AL88 1 + #define LV_DRAW_SW_SUPPORT_A8 1 + #define LV_DRAW_SW_SUPPORT_I1 1 + + /** Set number of draw units. + * - > 1 requires operating system to be enabled in `LV_USE_OS`. + * - > 1 means multiple threads will render the screen in parallel. */ + #define LV_DRAW_SW_DRAW_UNIT_CNT 1 + + /** Enable native helium assembly to be compiled. */ + #define LV_USE_NATIVE_HELIUM_ASM 0 + + /** + * - 0: Use a simple renderer capable of drawing only simple rectangles with gradient, images, text, 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 maximum 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: disables caching */ + #define LV_DRAW_SW_CIRCLE_CACHE_SIZE 4 + #endif + + #if !defined(LV_USE_DRAW_SW_ASM) && defined(RTE_Acceleration_Arm_2D) + /*turn-on helium acceleration when Arm-2D and the Helium-powered device are detected */ + #if defined(__ARM_FEATURE_MVE) && __ARM_FEATURE_MVE + #define LV_USE_DRAW_SW_ASM LV_DRAW_SW_ASM_HELIUM + #define LV_USE_DRAW_ARM2D_SYNC 1 + #endif + #endif + + #ifndef LV_USE_DRAW_SW_ASM + #define LV_USE_DRAW_SW_ASM LV_DRAW_SW_ASM_NONE + #endif + + #if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM + #define LV_DRAW_SW_ASM_CUSTOM_INCLUDE "" + #endif + + /** Enable drawing complex gradients in software: linear at an angle, radial or conical */ + #define LV_USE_DRAW_SW_COMPLEX_GRADIENTS 0 +#endif + +/*Use TSi's aka (Think Silicon) NemaGFX */ +#if LV_USE_NEMA_GFX + #define LV_NEMA_GFX_HAL_INCLUDE + + /*Enable Vector Graphics Operations. Available only if NemaVG library is present*/ + #define LV_USE_NEMA_VG 0 + + #if LV_USE_NEMA_VG + /*Define application's resolution used for VG related buffer allocation */ + #define LV_NEMA_GFX_MAX_RESX 800 + #define LV_NEMA_GFX_MAX_RESY 600 + #endif +#endif + +/** Use NXP's VG-Lite GPU on iMX RTxxx platforms. */ +#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 + /** Use additional draw thread for VG-Lite processing. */ + #define LV_USE_VGLITE_DRAW_THREAD 1 + + #if LV_USE_VGLITE_DRAW_THREAD + /** Enable VGLite draw async. Queue multiple tasks and flash them once to the GPU. */ + #define LV_USE_VGLITE_DRAW_ASYNC 1 + #endif + #endif + + /** Enable VGLite asserts. */ + #define LV_USE_VGLITE_ASSERT 0 +#endif + +/** Use NXP's PXP on iMX RTxxx platforms. */ +#define LV_USE_PXP 0 + +#if LV_USE_PXP + /** Use PXP for drawing.*/ + #define LV_USE_DRAW_PXP 1 + + /** Use PXP to rotate display.*/ + #define LV_USE_ROTATE_PXP 0 + + #if LV_USE_DRAW_PXP && LV_USE_OS + /** Use additional draw thread for PXP processing.*/ + #define LV_USE_PXP_DRAW_THREAD 1 + #endif + + /** Enable PXP asserts. */ + #define LV_USE_PXP_ASSERT 0 +#endif + +/** Use VG-Lite GPU. */ +#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 + + /** VG-Lite gradient maximum cache number. + * @note The memory usage of a single gradient image is 4K bytes. */ + #define LV_VG_LITE_GRAD_CACHE_CNT 32 + + /** VG-Lite stroke maximum cache number. */ + #define LV_VG_LITE_STROKE_CACHE_CNT 32 +#endif + +/** Accelerate blends, fills, etc. with STM32 DMA2D */ +#if LV_USE_DRAW_DMA2D + #define LV_DRAW_DMA2D_HAL_INCLUDE "stm32h7xx_hal.h" + + /* if enabled, the user is required to call `lv_draw_dma2d_transfer_complete_interrupt_handler` + * upon receiving the DMA2D global interrupt + */ + #define LV_USE_DRAW_DMA2D_INTERRUPT 0 +#endif + +/** Draw using cached OpenGLES textures */ +#define LV_USE_DRAW_OPENGLES 0 + +/*======================= + * FEATURE CONFIGURATION + *=======================*/ + +/*------------- + * Logging + *-----------*/ + +/** Enable log module */ +#define LV_USE_LOG 0 +#if LV_USE_LOG + /** Set value to one of the following levels of logging detail: + * - LV_LOG_LEVEL_TRACE Log 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 Log only critical issues, when system may fail. + * - LV_LOG_LEVEL_USER Log only custom log messages added by the user. + * - LV_LOG_LEVEL_NONE Do not log anything. */ + #define LV_LOG_LEVEL LV_LOG_LEVEL_USER + + /** - 1: Print log with 'printf'; + * - 0: User needs to register a callback with `lv_log_register_print_cb()`. */ + #define LV_LOG_PRINTF 1 + + /** Set callback to print logs. + * E.g `my_print`. The prototype should be `void my_print(lv_log_level_t level, const char * buf)`. + * Can be overwritten by `lv_log_register_print_cb`. */ + //#define LV_LOG_PRINT_CB + + /** - 1: Enable printing timestamp; + * - 0: Disable printing 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 /**< Enable/disable trace logs in memory operations. */ + #define LV_LOG_TRACE_TIMER 1 /**< Enable/disable trace logs in timer operations. */ + #define LV_LOG_TRACE_INDEV 1 /**< Enable/disable trace logs in input device operations. */ + #define LV_LOG_TRACE_DISP_REFR 1 /**< Enable/disable trace logs in display re-draw operations. */ + #define LV_LOG_TRACE_EVENT 1 /**< Enable/disable trace logs in event dispatch logic. */ + #define LV_LOG_TRACE_OBJ_CREATE 1 /**< Enable/disable trace logs in object creation (core `obj` creation plus every widget). */ + #define LV_LOG_TRACE_LAYOUT 1 /**< Enable/disable trace logs in flex- and grid-layout operations. */ + #define LV_LOG_TRACE_ANIM 1 /**< Enable/disable trace logs in animation logic. */ + #define LV_LOG_TRACE_CACHE 1 /**< Enable/disable trace logs in cache operations. */ +#endif /*LV_USE_LOG*/ + +/*------------- + * Asserts + *-----------*/ + +/* Enable assertion failures if an operation fails or 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 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: Adds the following behaviors for debugging: + * - Draw overlays with different colors for each draw_unit's tasks. + * - Draw index number of draw unit on white background. + * - For layers, draws index number of 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 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 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 memory 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 + +/** Automatically assign an ID when obj is created */ +#define LV_OBJ_ID_AUTO_ASSIGN LV_USE_OBJ_ID + +/** Use builtin obj ID handler functions: +* - lv_obj_assign_id: Called when a widget is created. Use a separate counter for each widget class as an ID. +* - lv_obj_id_compare: Compare the ID to decide if it matches with a requested value. +* - lv_obj_stringify_id: Return string-ified identifier, e.g. "button3". +* - lv_obj_free_id: Does nothing, as there is no memory allocation for the ID. +* When disabled these functions needs to be implemented by the user.*/ +#define LV_USE_OBJ_ID_BUILTIN 1 + +/** Use obj property set/get API. */ +#define LV_USE_OBJ_PROPERTY 0 + +/** Enable property name support. */ +#define LV_USE_OBJ_PROPERTY_NAME 1 + +/* Use 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 Linear gradient extension support */ + #define LV_VG_LITE_THORVG_LINEAR_GRADIENT_EXT_SUPPORT 0 + + /** Enable alignment on 16 pixels */ + #define LV_VG_LITE_THORVG_16PIXELS_ALIGN 1 + + /** Buffer address alignment */ + #define LV_VG_LITE_THORVG_BUF_ADDR_ALIGN 64 + + /** 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 for `lv_tick_inc` function */ +#define LV_ATTRIBUTE_TICK_INC + +/** Define a custom attribute for `lv_timer_handler` function */ +#define LV_ATTRIBUTE_TIMER_HANDLER + +/** Define a custom attribute for `lv_display_flush_ready` function */ +#define LV_ATTRIBUTE_FLUSH_READY + +/** Align VG_LITE buffers on this number of bytes. + * @note vglite_src_buf_aligned() uses this value to validate alignment of passed buffer pointers. */ +#define LV_ATTRIBUTE_MEM_ALIGN_SIZE 1 + +/** Will be added where memory 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__((aligned(4))) + +/** Attribute to mark large constant arrays, for example for font bitmaps */ +#define LV_ATTRIBUTE_LARGE_CONST + +/** Compiler prefix for a large 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 + +/** Enable matrix support + * - Requires `LV_USE_FLOAT = 1` */ +#define LV_USE_MATRIX 0 + +/** Include `lvgl_private.h` in `lvgl.h` to access internal data and functions by default */ +#define LV_USE_PRIVATE_API 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 1 +#define LV_FONT_MONTSERRAT_14 1 +#define LV_FONT_MONTSERRAT_16 1 +#define LV_FONT_MONTSERRAT_18 0 +#define LV_FONT_MONTSERRAT_20 1 +#define LV_FONT_MONTSERRAT_22 0 +#define LV_FONT_MONTSERRAT_24 1 +#define LV_FONT_MONTSERRAT_26 1 +#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_14_CJK 0 /**< 1000 most common CJK radicals */ +#define LV_FONT_SIMSUN_16_CJK 0 /**< 1000 most common CJK radicals */ + +/** Pixel perfect monospaced fonts */ +#define LV_FONT_UNSCII_8 0 +#define LV_FONT_UNSCII_16 0 + +/** Optionally declare custom fonts here. + * + * You can use any of these fonts as the default font too and they will be available + * globally. Example: + * + * @code + * #define LV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(my_font_1) LV_FONT_DECLARE(my_font_2) + * @endcode + */ +#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. + * A 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 + +/** While rendering text strings, break (wrap) text 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 text. Allows mixing Left-to-Right and Right-to-Left text. + * 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 text 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 another form based on their position in the text */ +#define LV_USE_ARABIC_PERSIAN_CHARS 0 + +/*The control character to use for signaling text recoloring*/ +#define LV_TXT_COLOR_CMD "#" + +/*================== + * WIDGETS + *================*/ +/* Documentation for widgets can be found here: https://docs.lvgl.io/latest/en/html/widgets/index.html . */ + +/** 1: Causes these widgets to be given default values at creation time. + * - lv_buttonmatrix_t: Get default maps: {"Btn1", "Btn2", "Btn3", "\n", "Btn4", "Btn5", ""}, else map not set. + * - lv_checkbox_t : String label set to "Check box", else set to empty string. + * - lv_dropdown_t : Options set to "Option 1", "Option 2", "Option 3", else no values are set. + * - lv_roller_t : Options set to "Option 1", "Option 2", "Option 3", "Option 4", "Option 5", else no values are set. + * - lv_label_t : Text set to "Text", else empty string. + * */ +#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 + #define LV_USE_CALENDAR_CHINESE 0 +#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 text */ + #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_LOTTIE 0 /**< Requires: lv_canvas, thorvg */ + +#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 of text can contain this maximum number of span descriptors. */ + #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_TABLE 1 + +#define LV_USE_TABVIEW 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_TILEVIEW 1 + +#define LV_USE_WIN 1 + +/*================== + * THEMES + *==================*/ +/* Documentation for themes can be found here: https://docs.lvgl.io/master/overview/style.html#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 + *==================*/ +/* Documentation for layouts can be found here: https://docs.lvgl.io/master/layouts/index.html . */ + +/** 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 + *====================*/ +/* Documentation for libraries can be found here: https://docs.lvgl.io/master/libs/index.html . */ + +/* File system interfaces for common APIs */ + +/** Setting a default driver letter allows skipping the driver prefix in filepaths. */ +#define LV_FS_DEFAULT_DRIVE_LETTER '\0' + +/** API for fopen, fread, etc. */ +#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. */ +#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. */ +#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. */ +#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. */ +#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 + +/** API for LittleFs. */ +#if LV_USE_FS_LITTLEFS + #define LV_FS_LITTLEFS_LETTER '\0' /**< Set an upper cased letter on which the drive will accessible (e.g. 'A') */ +#endif + +/** API for Arduino LittleFs. */ +#if LV_USE_FS_ARDUINO_ESP_LITTLEFS + #define LV_FS_ARDUINO_ESP_LITTLEFS_LETTER '\0' /**< Set an upper cased letter on which the drive will accessible (e.g. 'A') */ +#endif + +/** API for Arduino Sd. */ +#if LV_USE_FS_ARDUINO_SD + #define LV_FS_ARDUINO_SD_LETTER '\0' /**< Set an upper cased letter on which the drive will accessible (e.g. 'A') */ +#endif + +/** GIF decoder library */ +#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 + +/** FreeType library */ +#if LV_USE_FREETYPE + /** Let FreeType use LVGL memory and file porting */ + #define LV_FREETYPE_USE_LVGL_PORT 0 + + /** Cache count of glyphs in FreeType, i.e. number of glyphs that can be cached. + * The higher the value, the more memory will be used. */ + #define LV_FREETYPE_CACHE_FT_GLYPH_CNT 256 +#endif + +/** Built-in TTF decoder */ +#if LV_USE_TINY_TTF + /* Enable loading TTF data from files */ + #define LV_TINY_TTF_FILE_SUPPORT 0 + #define LV_TINY_TTF_CACHE_GLYPH_CNT 256 +#endif + +/** Enable Vector Graphic APIs + * - Requires `LV_USE_MATRIX = 1` */ +/*Enable Vector Graphic APIs*/ +#ifndef LV_USE_VECTOR_GRAPHIC +# 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 +#endif + +/*Enable LZ4 compress/decompress lib*/ +#ifndef LV_USE_LZ4 +# 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 +#endif + +/*SVG library + * - Requires `LV_USE_VECTOR_GRAPHIC = 1` */ +#define LV_USE_SVG_ANIMATION 0 +#define LV_USE_SVG_DEBUG 0 + +/** FFmpeg library for image decoding and playing videos. + * Supports all major image formats so do not enable other image decoder with it. */ +#if LV_USE_FFMPEG + /** Dump input information to stderr */ + #define LV_FFMPEG_DUMP_FORMAT 0 +#endif + +/*================== + * OTHERS + *==================*/ +/* Documentation for several of the below items can be found here: https://docs.lvgl.io/master/others/index.html . */ + +/** 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 used memory and memory fragmentation. + * - Requires `LV_USE_STDLIB_MALLOC = LV_STDLIB_BUILTIN` + * - 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 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 profiler */ + #define LV_PROFILER_INCLUDE "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 + + /*Enable layout profiler*/ + #define LV_PROFILER_LAYOUT 1 + + /*Enable disp refr profiler*/ + #define LV_PROFILER_REFR 1 + + /*Enable draw profiler*/ + #define LV_PROFILER_DRAW 1 + + /*Enable indev profiler*/ + #define LV_PROFILER_INDEV 1 + + /*Enable decoder profiler*/ + #define LV_PROFILER_DECODER 1 + + /*Enable font profiler*/ + #define LV_PROFILER_FONT 1 + + /*Enable fs profiler*/ + #define LV_PROFILER_FS 1 + + /*Enable style profiler*/ + #define LV_PROFILER_STYLE 0 + + /*Enable timer profiler*/ + #define LV_PROFILER_TIMER 1 + + /*Enable cache profiler*/ + #define LV_PROFILER_CACHE 1 +#endif + +/** 1: Enable an observer pattern implementation */ +#define LV_USE_OBSERVER 1 + +/** 1: Enable Pinyin input method + * - Requires: lv_keyboard */ +#if LV_USE_IME_PINYIN + /** 1: Use default thesaurus. + * @note If you do not use the default thesaurus, be sure to use `lv_ime_pinyin` after setting the thesaurus. */ + #define LV_IME_PINYIN_USE_DEFAULT_DICT 1 + /** Set maximum number of candidate panels that can be displayed. + * @note This needs to be adjusted according to size of 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 */ +#if LV_USE_FILE_EXPLORER + /** Maximum length of path */ + #define LV_FILE_EXPLORER_PATH_MAX_LEN (128) + /** Quick access bar, 1:use, 0:do not use. + * - Requires: lv_list */ + #define LV_FILE_EXPLORER_QUICK_ACCESS 1 +#endif + +/** 1: Enable freetype font manager + * - Requires: LV_USE_FREETYPE */ +#if LV_USE_FONT_MANAGER + +/*Font manager name max length*/ +#define LV_FONT_MANAGER_NAME_MAX_LEN 32 + +#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_ACCELERATED 1 /**< 1: Use hardware acceleration*/ + #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 */ + #define LV_SDL_MOUSEWHEEL_MODE LV_SDL_MOUSEWHEEL_MODE_ENCODER /*LV_SDL_MOUSEWHEEL_MODE_ENCODER/CROWN*/ +#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 application when all X11 windows have been closed */ + #define LV_X11_DOUBLE_BUFFER 1 /**< Use double buffers for rendering */ + /* 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 + +/** Use Wayland to open a window and handle input on Linux or BSD desktops */ +#define LV_USE_WAYLAND 0 +#if LV_USE_WAYLAND + #define LV_WAYLAND_WINDOW_DECORATIONS 0 /**< Draw client side window decorations only necessary on Mutter/GNOME */ + #define LV_WAYLAND_WL_SHELL 0 /**< Use the legacy wl_shell protocol instead of the default XDG shell */ +#endif + +/** Driver for /dev/fb */ +#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_INDEPENDENT_IMAGE_HEAP 0 + + #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 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_GENERIC_MIPI (LV_USE_ST7735 | LV_USE_ST7789 | LV_USE_ST7796 | LV_USE_ILI9341) + + +/** Driver for ST LTDC */ +#if LV_USE_ST_LTDC + /* Only used for partial. */ + #define LV_ST_LTDC_USE_DMA2D_FLUSH 0 +#endif + +/** Use OpenGL to open window on PC and handle mouse and keyboard */ +#define LV_USE_OPENGLES 0 +#if LV_USE_OPENGLES + #define LV_USE_OPENGLES_DEBUG 1 /**< Enable or disable debug for opengles */ +#endif + +/** QNX Screen display and input drivers */ +#define LV_USE_QNX 0 +#if LV_USE_QNX + #define LV_QNX_BUF_COUNT 1 /**< 1 or 2 */ +#endif + +/*================== +* EXAMPLES +*==================*/ + +/** Enable examples to be built with the library. */ +#define LV_BUILD_EXAMPLES 1 + +/*=================== + * DEMO USAGE + ====================*/ + +/** Music player demo */ +#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 + +/*E-bike demo with Lottie animations (if LV_USE_LOTTIE is enabled)*/ +#define LV_USE_DEMO_EBIKE 0 +#if LV_USE_DEMO_EBIKE + #define LV_DEMO_EBIKE_PORTRAIT 0 /*0: for 480x270..480x320, 1: for 480x800..720x1280*/ +#endif + +/*--END OF LV_CONF_H--*/ + +#endif /*LV_CONF_H*/ + +#endif /*End of "Content enable"*/ diff --git a/MDK-ARM/RTE/LVGL/lv_port_disp_template.c b/MDK-ARM/RTE/LVGL/lv_port_disp_template.c new file mode 100644 index 0000000..5cb6ea5 --- /dev/null +++ b/MDK-ARM/RTE/LVGL/lv_port_disp_template.c @@ -0,0 +1,149 @@ +/** + * @file lv_port_disp_templ.c + * + */ + +/*Copy this file as "lv_port_disp.c" and set this value to "1" to enable content*/ +#if 0 + +/********************* + * INCLUDES + *********************/ +#include "lv_port_disp_template.h" +#include + +/********************* + * DEFINES + *********************/ +#ifndef MY_DISP_HOR_RES + #warning Please define or replace the macro MY_DISP_HOR_RES with the actual screen width, default value 320 is used for now. + #define MY_DISP_HOR_RES 320 +#endif + +#ifndef MY_DISP_VER_RES + #warning Please define or replace the macro MY_DISP_VER_RES with the actual screen height, default value 240 is used for now. + #define MY_DISP_VER_RES 240 +#endif + +#define BYTE_PER_PIXEL (LV_COLOR_FORMAT_GET_SIZE(LV_COLOR_FORMAT_RGB565)) /*will be 2 for RGB565 */ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void disp_init(void); + +static void disp_flush(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_port_disp_init(void) +{ + /*------------------------- + * Initialize your display + * -----------------------*/ + disp_init(); + + /*------------------------------------ + * Create a display and set a flush_cb + * -----------------------------------*/ + lv_display_t * disp = lv_display_create(MY_DISP_HOR_RES, MY_DISP_VER_RES); + lv_display_set_flush_cb(disp, disp_flush); + + /* Example 1 + * One buffer for partial rendering*/ + LV_ATTRIBUTE_MEM_ALIGN + static uint8_t buf_1_1[MY_DISP_HOR_RES * 10 * BYTE_PER_PIXEL]; /*A buffer for 10 rows*/ + lv_display_set_buffers(disp, buf_1_1, NULL, sizeof(buf_1_1), LV_DISPLAY_RENDER_MODE_PARTIAL); + + /* Example 2 + * Two buffers for partial rendering + * In flush_cb DMA or similar hardware should be used to update the display in the background.*/ + LV_ATTRIBUTE_MEM_ALIGN + static uint8_t buf_2_1[MY_DISP_HOR_RES * 10 * BYTE_PER_PIXEL]; + + LV_ATTRIBUTE_MEM_ALIGN + static uint8_t buf_2_2[MY_DISP_HOR_RES * 10 * BYTE_PER_PIXEL]; + lv_display_set_buffers(disp, buf_2_1, buf_2_2, sizeof(buf_2_1), LV_DISPLAY_RENDER_MODE_PARTIAL); + + /* Example 3 + * Two buffers screen sized buffer for double buffering. + * Both LV_DISPLAY_RENDER_MODE_DIRECT and LV_DISPLAY_RENDER_MODE_FULL works, see their comments*/ + LV_ATTRIBUTE_MEM_ALIGN + static uint8_t buf_3_1[MY_DISP_HOR_RES * MY_DISP_VER_RES * BYTE_PER_PIXEL]; + + LV_ATTRIBUTE_MEM_ALIGN + static uint8_t buf_3_2[MY_DISP_HOR_RES * MY_DISP_VER_RES * BYTE_PER_PIXEL]; + lv_display_set_buffers(disp, buf_3_1, buf_3_2, sizeof(buf_3_1), LV_DISPLAY_RENDER_MODE_DIRECT); + +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/*Initialize your display and the required peripherals.*/ +static void disp_init(void) +{ + /*You code here*/ +} + +volatile bool disp_flush_enabled = true; + +/* Enable updating the screen (the flushing process) when disp_flush() is called by LVGL + */ +void disp_enable_update(void) +{ + disp_flush_enabled = true; +} + +/* Disable updating the screen (the flushing process) when disp_flush() is called by LVGL + */ +void disp_disable_update(void) +{ + disp_flush_enabled = false; +} + +/*Flush the content of the internal buffer the specific area on the display. + *`px_map` contains the rendered image as raw pixel map and it should be copied to `area` on the display. + *You can use DMA or any hardware acceleration to do this operation in the background but + *'lv_display_flush_ready()' has to be called when it's finished.*/ +static void disp_flush(lv_display_t * disp_drv, const lv_area_t * area, uint8_t * px_map) +{ + if(disp_flush_enabled) { + /*The most simple case (but also the slowest) to put all pixels to the screen one-by-one*/ + + int32_t x; + int32_t y; + for(y = area->y1; y <= area->y2; y++) { + for(x = area->x1; x <= area->x2; x++) { + /*Put a pixel to the display. For example:*/ + /*put_px(x, y, *px_map)*/ + px_map++; + } + } + } + + /*IMPORTANT!!! + *Inform the graphics library that you are ready with the flushing*/ + lv_display_flush_ready(disp_drv); +} + +#else /*Enable this file at the top*/ + +/*This dummy typedef exists purely to silence -Wpedantic.*/ +typedef int keep_pedantic_happy; +#endif diff --git a/MDK-ARM/RTE/LVGL/lv_port_disp_template.h b/MDK-ARM/RTE/LVGL/lv_port_disp_template.h new file mode 100644 index 0000000..b3328d5 --- /dev/null +++ b/MDK-ARM/RTE/LVGL/lv_port_disp_template.h @@ -0,0 +1,57 @@ +/** + * @file lv_port_disp_templ.h + * + */ + +/*Copy this file as "lv_port_disp.h" and set this value to "1" to enable content*/ +#if 0 + +#ifndef LV_PORT_DISP_TEMPL_H +#define LV_PORT_DISP_TEMPL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#if defined(LV_LVGL_H_INCLUDE_SIMPLE) +#include "lvgl.h" +#else +#include "lvgl/lvgl.h" +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ +/* Initialize low level display driver */ +void lv_port_disp_init(void); + +/* Enable updating the screen (the flushing process) when disp_flush() is called by LVGL + */ +void disp_enable_update(void); + +/* Disable updating the screen (the flushing process) when disp_flush() is called by LVGL + */ +void disp_disable_update(void); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_PORT_DISP_TEMPL_H*/ + +#endif /*Disable/Enable content*/ diff --git a/MDK-ARM/RTE/LVGL/lv_port_fs_template.c b/MDK-ARM/RTE/LVGL/lv_port_fs_template.c new file mode 100644 index 0000000..fab2cb3 --- /dev/null +++ b/MDK-ARM/RTE/LVGL/lv_port_fs_template.c @@ -0,0 +1,261 @@ +/** + * @file lv_port_fs_templ.c + * + */ + +/*Copy this file as "lv_port_fs.c" and set this value to "1" to enable content*/ +#if 0 + +/********************* + * INCLUDES + *********************/ +#include "lv_port_fs_template.h" +#include "../../lvgl.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void fs_init(void); + +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode); +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p); +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); +static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw); +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence); +static lv_fs_res_t fs_size(lv_fs_drv_t * drv, void * file_p, uint32_t * size_p); +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); + +static void * fs_dir_open(lv_fs_drv_t * drv, const char * path); +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * rddir_p, char * fn, uint32_t fn_len); +static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * rddir_p); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_port_fs_init(void) +{ + /*---------------------------------------------------- + * Initialize your storage device and File System + * -------------------------------------------------*/ + fs_init(); + + /*--------------------------------------------------- + * Register the file system interface in LVGL + *--------------------------------------------------*/ + + static lv_fs_drv_t fs_drv; + lv_fs_drv_init(&fs_drv); + + /*Set up fields...*/ + fs_drv.letter = 'P'; + fs_drv.open_cb = fs_open; + fs_drv.close_cb = fs_close; + fs_drv.read_cb = fs_read; + fs_drv.write_cb = fs_write; + fs_drv.seek_cb = fs_seek; + fs_drv.tell_cb = fs_tell; + + fs_drv.dir_close_cb = fs_dir_close; + fs_drv.dir_open_cb = fs_dir_open; + fs_drv.dir_read_cb = fs_dir_read; + + lv_fs_drv_register(&fs_drv); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/*Initialize your Storage device and File system.*/ +static void fs_init(void) +{ + /*E.g. for FatFS initialize the SD card and FatFS itself*/ + + /*You code here*/ +} + +/** + * Open a file + * @param drv pointer to a driver where this function belongs + * @param path path to the file beginning with the driver letter (e.g. S:/folder/file.txt) + * @param mode read: FS_MODE_RD, write: FS_MODE_WR, both: FS_MODE_RD | FS_MODE_WR + * @return a file descriptor or NULL on error + */ +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode) +{ + lv_fs_res_t res = LV_FS_RES_NOT_IMP; + + void * f = NULL; + + if(mode == LV_FS_MODE_WR) { + /*Open a file for write*/ + f = ... /*Add your code here*/ + } + else if(mode == LV_FS_MODE_RD) { + /*Open a file for read*/ + f = ... /*Add your code here*/ + } + else if(mode == (LV_FS_MODE_WR | LV_FS_MODE_RD)) { + /*Open a file for read and write*/ + f = ... /*Add your code here*/ + } + + return f; +} + +/** + * Close an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a file_t variable. (opened with fs_open) + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p) +{ + lv_fs_res_t res = LV_FS_RES_NOT_IMP; + + /*Add your code here*/ + + return res; +} + +/** + * Read data from an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a file_t variable. + * @param buf pointer to a memory block where to store the read data + * @param btr number of Bytes To Read + * @param br the real number of read bytes (Byte Read) + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) +{ + lv_fs_res_t res = LV_FS_RES_NOT_IMP; + + /*Add your code here*/ + + return res; +} + +/** + * Write into a file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a file_t variable + * @param buf pointer to a buffer with the bytes to write + * @param btw Bytes To Write + * @param bw the number of real written bytes (Bytes Written). NULL if unused. + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw) +{ + lv_fs_res_t res = LV_FS_RES_NOT_IMP; + + /*Add your code here*/ + + return res; +} + +/** + * Set the read write pointer. Also expand the file size if necessary. + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a file_t variable. (opened with fs_open ) + * @param pos the new position of read write pointer + * @param whence tells from where to interpret the `pos`. See @lv_fs_whence_t + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence) +{ + lv_fs_res_t res = LV_FS_RES_NOT_IMP; + + /*Add your code here*/ + + return res; +} +/** + * Give the position of the read write pointer + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a file_t variable + * @param pos_p pointer to store the result + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) +{ + lv_fs_res_t res = LV_FS_RES_NOT_IMP; + + /*Add your code here*/ + + return res; +} + +/** + * Initialize a 'lv_fs_dir_t' variable for directory reading + * @param drv pointer to a driver where this function belongs + * @param path path to a directory + * @return pointer to the directory read descriptor or NULL on error + */ +static void * fs_dir_open(lv_fs_drv_t * drv, const char * path) +{ + void * dir = NULL; + /*Add your code here*/ + dir = ... /*Add your code here*/ + return dir; +} + +/** + * Read the next filename form a directory. + * The name of the directories will begin with '/' + * @param drv pointer to a driver where this function belongs + * @param rddir_p pointer to an initialized 'lv_fs_dir_t' variable + * @param fn pointer to a buffer to store the filename + * @param fn_len length of the buffer to store the filename + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * rddir_p, char * fn, uint32_t fn_len) +{ + lv_fs_res_t res = LV_FS_RES_NOT_IMP; + + /*Add your code here*/ + + return res; +} + +/** + * Close the directory reading + * @param drv pointer to a driver where this function belongs + * @param rddir_p pointer to an initialized 'lv_fs_dir_t' variable + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * rddir_p) +{ + lv_fs_res_t res = LV_FS_RES_NOT_IMP; + + /*Add your code here*/ + + return res; +} + +#else /*Enable this file at the top*/ + +/*This dummy typedef exists purely to silence -Wpedantic.*/ +typedef int keep_pedantic_happy; +#endif diff --git a/MDK-ARM/RTE/LVGL/lv_port_fs_template.h b/MDK-ARM/RTE/LVGL/lv_port_fs_template.h new file mode 100644 index 0000000..b34fd3c --- /dev/null +++ b/MDK-ARM/RTE/LVGL/lv_port_fs_template.h @@ -0,0 +1,44 @@ +/** + * @file lv_port_fs_templ.h + * + */ + +/*Copy this file as "lv_port_fs.h" and set this value to "1" to enable content*/ +#if 0 + +#ifndef LV_PORT_FS_TEMPL_H +#define LV_PORT_FS_TEMPL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lvgl/lvgl.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ +void lv_port_fs_init(void); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_PORT_FS_TEMPL_H*/ + +#endif /*Disable/Enable content*/ diff --git a/MDK-ARM/RTE/LVGL/lv_port_indev_template.c b/MDK-ARM/RTE/LVGL/lv_port_indev_template.c new file mode 100644 index 0000000..6415c4f --- /dev/null +++ b/MDK-ARM/RTE/LVGL/lv_port_indev_template.c @@ -0,0 +1,406 @@ +/** + * @file lv_port_indev_templ.c + * + */ + +/*Copy this file as "lv_port_indev.c" and set this value to "1" to enable content*/ +#if 0 + +/********************* + * INCLUDES + *********************/ +#include "lv_port_indev_template.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void touchpad_init(void); +static void touchpad_read(lv_indev_t * indev, lv_indev_data_t * data); +static bool touchpad_is_pressed(void); +static void touchpad_get_xy(int32_t * x, int32_t * y); + +static void mouse_init(void); +static void mouse_read(lv_indev_t * indev, lv_indev_data_t * data); +static bool mouse_is_pressed(void); +static void mouse_get_xy(int32_t * x, int32_t * y); + +static void keypad_init(void); +static void keypad_read(lv_indev_t * indev, lv_indev_data_t * data); +static uint32_t keypad_get_key(void); + +static void encoder_init(void); +static void encoder_read(lv_indev_t * indev, lv_indev_data_t * data); +static void encoder_handler(void); + +static void button_init(void); +static void button_read(lv_indev_t * indev, lv_indev_data_t * data); +static int8_t button_get_pressed_id(void); +static bool button_is_pressed(uint8_t id); + +/********************** + * STATIC VARIABLES + **********************/ +lv_indev_t * indev_touchpad; +lv_indev_t * indev_mouse; +lv_indev_t * indev_keypad; +lv_indev_t * indev_encoder; +lv_indev_t * indev_button; + +static int32_t encoder_diff; +static lv_indev_state_t encoder_state; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_port_indev_init(void) +{ + /** + * Here you will find example implementation of input devices supported by LittelvGL: + * - Touchpad + * - Mouse (with cursor support) + * - Keypad (supports GUI usage only with key) + * - Encoder (supports GUI usage only with: left, right, push) + * - Button (external buttons to press points on the screen) + * + * The `..._read()` function are only examples. + * You should shape them according to your hardware + */ + + /*------------------ + * Touchpad + * -----------------*/ + + /*Initialize your touchpad if you have*/ + touchpad_init(); + + /*Register a touchpad input device*/ + indev_touchpad = lv_indev_create(); + lv_indev_set_type(indev_touchpad, LV_INDEV_TYPE_POINTER); + lv_indev_set_read_cb(indev_touchpad, touchpad_read); + + /*------------------ + * Mouse + * -----------------*/ + + /*Initialize your mouse if you have*/ + mouse_init(); + + /*Register a mouse input device*/ + indev_mouse = lv_indev_create(); + lv_indev_set_type(indev_mouse, LV_INDEV_TYPE_POINTER); + lv_indev_set_read_cb(indev_mouse, mouse_read); + + /*Set cursor. For simplicity set a HOME symbol now.*/ + lv_obj_t * mouse_cursor = lv_image_create(lv_screen_active()); + lv_image_set_src(mouse_cursor, LV_SYMBOL_HOME); + lv_indev_set_cursor(indev_mouse, mouse_cursor); + + /*------------------ + * Keypad + * -----------------*/ + + /*Initialize your keypad or keyboard if you have*/ + keypad_init(); + + /*Register a keypad input device*/ + indev_keypad = lv_indev_create(); + lv_indev_set_type(indev_keypad, LV_INDEV_TYPE_KEYPAD); + lv_indev_set_read_cb(indev_keypad, keypad_read); + + /*Later you should create group(s) with `lv_group_t * group = lv_group_create()`, + *add objects to the group with `lv_group_add_obj(group, obj)` + *and assign this input device to group to navigate in it: + *`lv_indev_set_group(indev_keypad, group);`*/ + + /*------------------ + * Encoder + * -----------------*/ + + /*Initialize your encoder if you have*/ + encoder_init(); + + /*Register a encoder input device*/ + indev_encoder = lv_indev_create(); + lv_indev_set_type(indev_encoder, LV_INDEV_TYPE_ENCODER); + lv_indev_set_read_cb(indev_encoder, encoder_read); + + /*Later you should create group(s) with `lv_group_t * group = lv_group_create()`, + *add objects to the group with `lv_group_add_obj(group, obj)` + *and assign this input device to group to navigate in it: + *`lv_indev_set_group(indev_encoder, group);`*/ + + /*------------------ + * Button + * -----------------*/ + + /*Initialize your button if you have*/ + button_init(); + + /*Register a button input device*/ + indev_button = lv_indev_create(); + lv_indev_set_type(indev_button, LV_INDEV_TYPE_BUTTON); + lv_indev_set_read_cb(indev_button, button_read); + + /*Assign buttons to points on the screen*/ + static const lv_point_t btn_points[2] = { + {10, 10}, /*Button 0 -> x:10; y:10*/ + {40, 100}, /*Button 1 -> x:40; y:100*/ + }; + lv_indev_set_button_points(indev_button, btn_points); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/*------------------ + * Touchpad + * -----------------*/ + +/*Initialize your touchpad*/ +static void touchpad_init(void) +{ + /*Your code comes here*/ +} + +/*Will be called by the library to read the touchpad*/ +static void touchpad_read(lv_indev_t * indev_drv, lv_indev_data_t * data) +{ + static int32_t last_x = 0; + static int32_t last_y = 0; + + /*Save the pressed coordinates and the state*/ + if(touchpad_is_pressed()) { + touchpad_get_xy(&last_x, &last_y); + data->state = LV_INDEV_STATE_PRESSED; + } + else { + data->state = LV_INDEV_STATE_RELEASED; + } + + /*Set the last pressed coordinates*/ + data->point.x = last_x; + data->point.y = last_y; +} + +/*Return true is the touchpad is pressed*/ +static bool touchpad_is_pressed(void) +{ + /*Your code comes here*/ + + return false; +} + +/*Get the x and y coordinates if the touchpad is pressed*/ +static void touchpad_get_xy(int32_t * x, int32_t * y) +{ + /*Your code comes here*/ + + (*x) = 0; + (*y) = 0; +} + +/*------------------ + * Mouse + * -----------------*/ + +/*Initialize your mouse*/ +static void mouse_init(void) +{ + /*Your code comes here*/ +} + +/*Will be called by the library to read the mouse*/ +static void mouse_read(lv_indev_t * indev_drv, lv_indev_data_t * data) +{ + /*Get the current x and y coordinates*/ + mouse_get_xy(&data->point.x, &data->point.y); + + /*Get whether the mouse button is pressed or released*/ + if(mouse_is_pressed()) { + data->state = LV_INDEV_STATE_PRESSED; + } + else { + data->state = LV_INDEV_STATE_RELEASED; + } +} + +/*Return true is the mouse button is pressed*/ +static bool mouse_is_pressed(void) +{ + /*Your code comes here*/ + + return false; +} + +/*Get the x and y coordinates if the mouse is pressed*/ +static void mouse_get_xy(int32_t * x, int32_t * y) +{ + /*Your code comes here*/ + + (*x) = 0; + (*y) = 0; +} + +/*------------------ + * Keypad + * -----------------*/ + +/*Initialize your keypad*/ +static void keypad_init(void) +{ + /*Your code comes here*/ +} + +/*Will be called by the library to read the mouse*/ +static void keypad_read(lv_indev_t * indev_drv, lv_indev_data_t * data) +{ + static uint32_t last_key = 0; + + /*Get the current x and y coordinates*/ + mouse_get_xy(&data->point.x, &data->point.y); + + /*Get whether the a key is pressed and save the pressed key*/ + uint32_t act_key = keypad_get_key(); + if(act_key != 0) { + data->state = LV_INDEV_STATE_PRESSED; + + /*Translate the keys to LVGL control characters according to your key definitions*/ + switch(act_key) { + case 1: + act_key = LV_KEY_NEXT; + break; + case 2: + act_key = LV_KEY_PREV; + break; + case 3: + act_key = LV_KEY_LEFT; + break; + case 4: + act_key = LV_KEY_RIGHT; + break; + case 5: + act_key = LV_KEY_ENTER; + break; + } + + last_key = act_key; + } + else { + data->state = LV_INDEV_STATE_RELEASED; + } + + data->key = last_key; +} + +/*Get the currently being pressed key. 0 if no key is pressed*/ +static uint32_t keypad_get_key(void) +{ + /*Your code comes here*/ + + return 0; +} + +/*------------------ + * Encoder + * -----------------*/ + +/*Initialize your encoder*/ +static void encoder_init(void) +{ + /*Your code comes here*/ +} + +/*Will be called by the library to read the encoder*/ +static void encoder_read(lv_indev_t * indev_drv, lv_indev_data_t * data) +{ + + data->enc_diff = encoder_diff; + data->state = encoder_state; +} + +/*Call this function in an interrupt to process encoder events (turn, press)*/ +static void encoder_handler(void) +{ + /*Your code comes here*/ + + encoder_diff += 0; + encoder_state = LV_INDEV_STATE_RELEASED; +} + +/*------------------ + * Button + * -----------------*/ + +/*Initialize your buttons*/ +static void button_init(void) +{ + /*Your code comes here*/ +} + +/*Will be called by the library to read the button*/ +static void button_read(lv_indev_t * indev_drv, lv_indev_data_t * data) +{ + + static uint8_t last_btn = 0; + + /*Get the pressed button's ID*/ + int8_t btn_act = button_get_pressed_id(); + + if(btn_act >= 0) { + data->state = LV_INDEV_STATE_PRESSED; + last_btn = btn_act; + } + else { + data->state = LV_INDEV_STATE_RELEASED; + } + + /*Save the last pressed button's ID*/ + data->btn_id = last_btn; +} + +/*Get ID (0, 1, 2 ..) of the pressed button*/ +static int8_t button_get_pressed_id(void) +{ + uint8_t i; + + /*Check to buttons see which is being pressed (assume there are 2 buttons)*/ + for(i = 0; i < 2; i++) { + /*Return the pressed button's ID*/ + if(button_is_pressed(i)) { + return i; + } + } + + /*No button pressed*/ + return -1; +} + +/*Test if `id` button is pressed or not*/ +static bool button_is_pressed(uint8_t id) +{ + + /*Your code comes here*/ + + return false; +} + +#else /*Enable this file at the top*/ + +/*This dummy typedef exists purely to silence -Wpedantic.*/ +typedef int keep_pedantic_happy; +#endif diff --git a/MDK-ARM/RTE/LVGL/lv_port_indev_template.h b/MDK-ARM/RTE/LVGL/lv_port_indev_template.h new file mode 100644 index 0000000..1979566 --- /dev/null +++ b/MDK-ARM/RTE/LVGL/lv_port_indev_template.h @@ -0,0 +1,49 @@ + +/** + * @file lv_port_indev_templ.h + * + */ + +/*Copy this file as "lv_port_indev.h" and set this value to "1" to enable content*/ +#if 0 + +#ifndef LV_PORT_INDEV_TEMPL_H +#define LV_PORT_INDEV_TEMPL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#if defined(LV_LVGL_H_INCLUDE_SIMPLE) +#include "lvgl.h" +#else +#include "lvgl/lvgl.h" +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ +void lv_port_indev_init(void); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_PORT_INDEV_TEMPL_H*/ + +#endif /*Disable/Enable content*/ diff --git a/MDK-ARM/RTE/_freertos_f407/Pre_Include_Global.h b/MDK-ARM/RTE/_freertos_f407/Pre_Include_Global.h new file mode 100644 index 0000000..9a5a3c6 --- /dev/null +++ b/MDK-ARM/RTE/_freertos_f407/Pre_Include_Global.h @@ -0,0 +1,19 @@ + +/* + * Auto generated Run-Time-Environment Configuration File + * *** Do not modify ! *** + * + * Project: 'freertos_f407' + * Target: 'freertos_f407' + */ + +#ifndef PRE_INCLUDE_GLOBAL_H +#define PRE_INCLUDE_GLOBAL_H + +/* LVGL.LVGL::LVGL:lvgl:Essential:8.3.5 */ +/*! \brief use lv_config_cmsis.h which will be pre-included */ +#define LV_CONF_SKIP +#define LV_LVGL_H_INCLUDE_SIMPLE 1 + + +#endif /* PRE_INCLUDE_GLOBAL_H */ diff --git a/MDK-ARM/RTE/_freertos_f407/RTE_Components.h b/MDK-ARM/RTE/_freertos_f407/RTE_Components.h index de2040f..30eed77 100644 --- a/MDK-ARM/RTE/_freertos_f407/RTE_Components.h +++ b/MDK-ARM/RTE/_freertos_f407/RTE_Components.h @@ -16,6 +16,15 @@ */ #define CMSIS_device_header "stm32f4xx.h" +/* LVGL.LVGL::LVGL:lvgl:Benchmark:8.3.5 */ +/*! \brief enable demo:bencharmk */ +#define LV_USE_DEMO_BENCHMARK 1 +/* LVGL.LVGL::LVGL:lvgl:Essential:8.3.5 */ +/*! \brief Enable LVGL */ +#define RTE_GRAPHICS_LVGL +/* LVGL.LVGL::LVGL:lvgl:Extra Themes:8.3.5 */ +/*! \brief use extra themes, widgets and layouts */ +#define RTE_GRAPHICS_LVGL_USE_EXTRA_THEMES #endif /* RTE_COMPONENTS_H */ diff --git a/MDK-ARM/freertos_f407.uvoptx b/MDK-ARM/freertos_f407.uvoptx index a4586d0..29bbfdf 100644 --- a/MDK-ARM/freertos_f407.uvoptx +++ b/MDK-ARM/freertos_f407.uvoptx @@ -200,7 +200,7 @@ 1 0 - 0x40002850 + 0x2001F000 0 @@ -1336,4 +1336,12 @@ 1 + + ::LVGL + 1 + 0 + 0 + 1 + + diff --git a/MDK-ARM/freertos_f407.uvprojx b/MDK-ARM/freertos_f407.uvprojx index bcc3ea7..eb5b721 100644 --- a/MDK-ARM/freertos_f407.uvprojx +++ b/MDK-ARM/freertos_f407.uvprojx @@ -336,7 +336,7 @@ 0 0 - + --diag_suppress=68 --diag_suppress=111 --diag_suppress=188 --diag_suppress=223 --diag_suppress=546 --diag_suppress=1295 STM32,USE_HAL_DRIVER,STM32F407xx ../Core/Inc;../Drivers/STM32F4xx_HAL_Driver/Inc;../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy;../Drivers/CMSIS/Device/ST/STM32F4xx/Include;../Drivers/CMSIS/Include;../Middlewares/Third_Party/FreeRTOS/Source/include;../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS;../Middlewares/Third_Party/FreeRTOS/Source/portable/RVDS/ARM_CM4F;../User/application;../User/board;../User/system;../User/system/lib/inc;../User/system/bsp;../FATFS/Target;../FATFS/App;../Middlewares/Third_Party/FatFs/src;../User/system/lib/lcd;../User/system/lib/lcd/gui/Config;../User/system/lib/lcd/gui/Core @@ -2812,6 +2812,9 @@ ::CMSIS + + ::LVGL + @@ -2819,14 +2822,103 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + RTE\LVGL\lv_cmsis_pack.c + + + + + + + + RTE\LVGL\lv_conf_cmsis.h + + + + + + + + RTE\LVGL\lv_port_disp_template.c + + + + + + + + RTE\LVGL\lv_port_disp_template.h + + + + + + + + RTE\LVGL\lv_port_fs_template.c + + + + + + + + RTE\LVGL\lv_port_fs_template.h + + + + + + + + RTE\LVGL\lv_port_indev_template.c + + + + + + + + RTE\LVGL\lv_port_indev_template.h + + + + + + + diff --git a/MDK-ARM/freertos_f407/freertos_f407.hex b/MDK-ARM/freertos_f407/freertos_f407.hex index aeb2356..9ef875d 100644 --- a/MDK-ARM/freertos_f407/freertos_f407.hex +++ b/MDK-ARM/freertos_f407/freertos_f407.hex @@ -1,5 +1,5 @@ :020000040800F2 -:1000000090D4002061020008252E0008AD2A0008C7 +:1000000090F7002061020008252E0008AD2A0008A4 :10001000212E0008D9040008AD43000800000000AC :10002000000000000000000000000000A101000826 :100030001B06000800000000FD010008893F0008C1 @@ -24,7 +24,7 @@ :100160007B0200087B0200087B0200087B0200087B :100170007B0200087B0200087B02000800000000F0 :100180007B0200087B020008DFF810D000F0EEF8D8 -:1001900000480047E9570008AFF3008090D40020E2 +:1001900000480047E9570008AFF3008090F70020BF :1001A0002C4B19680868B0E8F04F80F30988BFF35A :1001B0006F8F4FF0000080F311887047000000003F :1001C00008480068006880F308884FF0000080F35A @@ -103,7 +103,7 @@ :10065000867B001D40F82630001F867B0C308255BB :100660003E46B07B461CBE73044604F13000087061 :100670003A2048702F2088700020C8700025284636 -:10068000F0BD000080D000200146486D704700009A +:10068000F0BD000080F300200146486D7047000077 :10069000F8B50446002000908C4800684FF41651CD :1006A000B0FBF1F7A56D2E6894F85C100820884027 :1006B000304098B12068006800F0040070B12068F4 @@ -1965,8 +1965,8 @@ :107AB00000000000000000000000000000000300C3 :107AC00000000000000000000000000000000000B6 :107AD000000000005F6C697374006C69737420614E -:107AE0006C6C20636F6D6D616E640000800C000033 -:107AF000000800000800000008000000006400000A +:107AE0006C6C20636F6D6D616E64000000100000AF +:107AF00000080000080000000800000000800000EE :107B000000400000353C0008913D00080D3D000894 :107B10009D3D0008A13C00080A0000000200000092 :107B200000000000000000004000FE079200FE0779 @@ -3638,10 +3638,10 @@ :10E3400002251800000000000000000064656661FE :10E35000756C745461736B0088E300080000002042 :10E36000400100009003000824E400084001002060 -:10E3700050D300002044000824E4000800C001201D +:10E3700050F600002044000824E4000800C00120FA :10E3800000400000204400088132104201035D2457 :10E39000F41AAA01011413A95814089559140880F5 -:10E3A00043122016C0012080A71C2080C00C699851 +:10E3A00043122016C0012080C31C2080E30C699812 :10E3B000B113287B13080C120C1218121413087DC9 :10E3C0001B0810BE1A200C13887F1B0814081A3C67 :10E3D000041338841B081822124812411380961B1C diff --git a/MDK-ARM/keil.importer.warning.txt b/MDK-ARM/keil.importer.warning.txt new file mode 100644 index 0000000..f2b0cd0 --- /dev/null +++ b/MDK-ARM/keil.importer.warning.txt @@ -0,0 +1,32 @@ +!!! 警告 !!! + +存在未解决的依赖项,请手动添加它们 !, 完成添加后,请删除该文件,避免再次弹出提示。 + +项目位置:'e:\work\stm32\study\freertos_f407\MDK-ARM\MDK-ARM.code-workspace' + +--- + +FileName: 'lv_cmsis_pack.c' + Class: 'LVGL' + Category: 'sourceC' + Location: 'RTE/LVGL/lv_cmsis_pack.c' + +FileName: 'lv_conf_cmsis.h' + Class: 'LVGL' + Category: 'preIncludeGlobal' + Location: 'RTE/LVGL/lv_conf_cmsis.h' + +FileName: 'examples\porting\lv_port_disp_template.c' + Class: 'LVGL' + Category: 'sourceC' + Location: 'RTE/LVGL/lv_port_disp_template.c' + +FileName: 'examples\porting\lv_port_fs_template.c' + Class: 'LVGL' + Category: 'sourceC' + Location: 'RTE/LVGL/lv_port_fs_template.c' + +FileName: 'examples\porting\lv_port_indev_template.c' + Class: 'LVGL' + Category: 'sourceC' + Location: 'RTE/LVGL/lv_port_indev_template.c' \ No newline at end of file diff --git a/User/board/board.c b/User/board/board.c index b24c352..477ba95 100644 --- a/User/board/board.c +++ b/User/board/board.c @@ -141,13 +141,15 @@ void lcd_rtc_test(void) board.lcd->driver.set_hz_font(board.lcd, &ch_font_24); // ú board.lcd->driver.full_fill(board.lcd, LCD_BLACK); // ñɫ board.lcd->driver.set_color(board.lcd, LCD_WHITE); // ûɫ - - board.lcd->driver.display_text(board.lcd, 13, 70, "STM32 RTC"); - board.lcd->driver.display_text(board.lcd, 13, 106, "Ļֱ:240*240"); - + uint8_t hight_offset = 70; + board.lcd->driver.set_color(board.lcd, LIGHT_BLUE); // ûɫ + board.lcd->driver.display_text(board.lcd, 13, hight_offset, "STM32 RTC"); + board.lcd->driver.set_color(board.lcd, LIGHT_YELLOW); // ûɫ + board.lcd->driver.display_text(board.lcd, 13, hight_offset + board.lcd->info.hz_font->height, "Ļֱ:240*240"); + board.lcd->driver.set_color(board.lcd, LIGHT_RED); // ûɫ board.lcd->driver.set_asscii_font(board.lcd, &ascii_font_20); sprintf(buf, "%d-%02d-%02d %02d:%02d:%02d", 2000 + board.rtc_date.year, board.rtc_date.month, board.rtc_date.day, board.rtc_time.hour, board.rtc_time.minute, board.rtc_time.second); - board.lcd->driver.display_text(board.lcd, 13, 142, buf); + board.lcd->driver.display_text(board.lcd, 13, hight_offset + board.lcd->info.hz_font->height * 2, buf); } //