From 8ccba15c2501b80b2323748361bd8afaffeecd7d Mon Sep 17 00:00:00 2001 From: Ken Van Hoeylandt Date: Sat, 8 Feb 2025 17:06:16 +0100 Subject: [PATCH] Simplify LVGL init: move code into Tactility (#208) The esp_lvgl_port code was duplicated across all boards, so I moved it into the Tactility subproject to simplify the board implementations. --- Boards/CYD-2432S024C/Source/CYD2432S024C.cpp | 1 - Boards/CYD-2432S024C/Source/Lvgl.cpp | 26 --------------- Boards/LilygoTdeck/Source/LilygoTdeck.cpp | 2 -- Boards/M5stackCore2/Source/InitLvgl.cpp | 31 ------------------ Boards/M5stackCore2/Source/InitLvgl.h | 3 -- Boards/M5stackCore2/Source/M5stackCore2.cpp | 2 -- Boards/M5stackCoreS3/Source/InitLvgl.cpp | 31 ------------------ Boards/M5stackCoreS3/Source/InitLvgl.h | 3 -- Boards/M5stackCoreS3/Source/M5stackCoreS3.cpp | 2 -- .../{hal/Configuration.cpp => Simulator.cpp} | 13 ++++---- Boards/UnPhone/Source/Lvgl.cpp | 32 ------------------- Boards/UnPhone/Source/UnPhone.cpp | 2 -- Tactility/CMakeLists.txt | 2 +- .../Private/Tactility/lvgl/EspLvglPort.h | 11 +++++++ Tactility/Source/app/power/Power.cpp | 2 +- .../Source/lvgl/EspLvglPort.cpp | 21 ++++++------ Tactility/Source/lvgl/Init.cpp | 9 ++++-- .../Include/Tactility/hal/Configuration.h | 15 +++++---- TactilityHeadless/Source/hal/Hal.cpp | 1 + 19 files changed, 49 insertions(+), 160 deletions(-) delete mode 100644 Boards/CYD-2432S024C/Source/Lvgl.cpp delete mode 100644 Boards/M5stackCore2/Source/InitLvgl.cpp delete mode 100644 Boards/M5stackCore2/Source/InitLvgl.h delete mode 100644 Boards/M5stackCoreS3/Source/InitLvgl.cpp delete mode 100644 Boards/M5stackCoreS3/Source/InitLvgl.h rename Boards/Simulator/Source/{hal/Configuration.cpp => Simulator.cpp} (93%) delete mode 100644 Boards/UnPhone/Source/Lvgl.cpp create mode 100644 Tactility/Private/Tactility/lvgl/EspLvglPort.h rename Boards/LilygoTdeck/Source/Lvgl.cpp => Tactility/Source/lvgl/EspLvglPort.cpp (78%) diff --git a/Boards/CYD-2432S024C/Source/CYD2432S024C.cpp b/Boards/CYD-2432S024C/Source/CYD2432S024C.cpp index e59a9677..de9700c9 100644 --- a/Boards/CYD-2432S024C/Source/CYD2432S024C.cpp +++ b/Boards/CYD-2432S024C/Source/CYD2432S024C.cpp @@ -9,7 +9,6 @@ bool twodotfour_lvgl_init(); const tt::hal::Configuration cyd_2432S024c_config = { - .initLvgl = &twodotfour_lvgl_init, .createDisplay = createDisplay, .sdcard = createYellowSdCard(), .power = nullptr, diff --git a/Boards/CYD-2432S024C/Source/Lvgl.cpp b/Boards/CYD-2432S024C/Source/Lvgl.cpp deleted file mode 100644 index 5f26dfef..00000000 --- a/Boards/CYD-2432S024C/Source/Lvgl.cpp +++ /dev/null @@ -1,26 +0,0 @@ -#include "esp_lvgl_port.h" -#include -#include -#include - -#define TAG "twodotfour_lvgl" - -bool twodotfour_lvgl_init() { - const lvgl_port_cfg_t lvgl_cfg = { - .task_priority = static_cast(tt::THREAD_PRIORITY_RENDER), - .task_stack = 8096, - .task_affinity = -1, // core pinning - .task_max_sleep_ms = 500, - .timer_period_ms = 5 - }; - - if (lvgl_port_init(&lvgl_cfg) != ESP_OK) { - TT_LOG_E(TAG, "lvgl port init failed"); - return false; - } - - // Set syncing functions - tt::lvgl::syncSet(&lvgl_port_lock, &lvgl_port_unlock); - - return true; -} diff --git a/Boards/LilygoTdeck/Source/LilygoTdeck.cpp b/Boards/LilygoTdeck/Source/LilygoTdeck.cpp index 290b57b3..c7203552 100644 --- a/Boards/LilygoTdeck/Source/LilygoTdeck.cpp +++ b/Boards/LilygoTdeck/Source/LilygoTdeck.cpp @@ -10,11 +10,9 @@ #define TDECK_SPI_TRANSFER_SIZE_LIMIT (TDECK_LCD_HORIZONTAL_RESOLUTION * TDECK_LCD_SPI_TRANSFER_HEIGHT * (TDECK_LCD_BITS_PER_PIXEL / 8)) bool tdeck_init_power(); -bool tdeck_init_lvgl(); extern const tt::hal::Configuration lilygo_tdeck = { .initBoot = tdeck_init_power, - .initLvgl = tdeck_init_lvgl, .createDisplay = createDisplay, .createKeyboard = createKeyboard, .sdcard = createTdeckSdCard(), diff --git a/Boards/M5stackCore2/Source/InitLvgl.cpp b/Boards/M5stackCore2/Source/InitLvgl.cpp deleted file mode 100644 index 6094a8fc..00000000 --- a/Boards/M5stackCore2/Source/InitLvgl.cpp +++ /dev/null @@ -1,31 +0,0 @@ -#include -#include -#include -#include "esp_lvgl_port.h" - -#define TAG "core2" - -// LVGL -// The minimum task stack seems to be about 3500, but that crashes the wifi app in some scenarios -// At 4000, it crashes when the fps renderer is available -#define CORE2_LVGL_TASK_STACK_DEPTH 9216 - -bool initLvgl() { - const lvgl_port_cfg_t lvgl_cfg = { - .task_priority = static_cast(tt::THREAD_PRIORITY_RENDER), - .task_stack = CORE2_LVGL_TASK_STACK_DEPTH, - .task_affinity = -1, // core pinning - .task_max_sleep_ms = 500, - .timer_period_ms = 5 - }; - - TT_LOG_D(TAG, "LVGL port init"); - if (lvgl_port_init(&lvgl_cfg) != ESP_OK) { - TT_LOG_E(TAG, "LVGL port init failed"); - return false; - } - - tt::lvgl::syncSet(&lvgl_port_lock, &lvgl_port_unlock); - - return true; -} diff --git a/Boards/M5stackCore2/Source/InitLvgl.h b/Boards/M5stackCore2/Source/InitLvgl.h deleted file mode 100644 index e57bd9bd..00000000 --- a/Boards/M5stackCore2/Source/InitLvgl.h +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -bool initLvgl(); diff --git a/Boards/M5stackCore2/Source/M5stackCore2.cpp b/Boards/M5stackCore2/Source/M5stackCore2.cpp index b6ec2637..ca9b2114 100644 --- a/Boards/M5stackCore2/Source/M5stackCore2.cpp +++ b/Boards/M5stackCore2/Source/M5stackCore2.cpp @@ -1,6 +1,5 @@ #include "M5stackCore2.h" #include "InitBoot.h" -#include "InitLvgl.h" #include "Tactility/lvgl/LvglSync.h" #include "hal/Core2Display.h" #include "hal/Core2DisplayConstants.h" @@ -11,7 +10,6 @@ extern const tt::hal::Configuration m5stack_core2 = { .initBoot = initBoot, - .initLvgl = initLvgl, .createDisplay = createDisplay, .sdcard = createSdCard(), .power = createPower, diff --git a/Boards/M5stackCoreS3/Source/InitLvgl.cpp b/Boards/M5stackCoreS3/Source/InitLvgl.cpp deleted file mode 100644 index f741f6e2..00000000 --- a/Boards/M5stackCoreS3/Source/InitLvgl.cpp +++ /dev/null @@ -1,31 +0,0 @@ -#include -#include -#include -#include - -#define TAG "core2" - -// LVGL -// The minimum task stack seems to be about 3500, but that crashes the wifi app in some scenarios -// At 4000, it crashes when the fps renderer is available -#define CORE2_LVGL_TASK_STACK_DEPTH 9216 - -bool initLvgl() { - const lvgl_port_cfg_t lvgl_cfg = { - .task_priority = static_cast(tt::THREAD_PRIORITY_RENDER), - .task_stack = CORE2_LVGL_TASK_STACK_DEPTH, - .task_affinity = -1, // core pinning - .task_max_sleep_ms = 500, - .timer_period_ms = 5 - }; - - TT_LOG_D(TAG, "LVGL port init"); - if (lvgl_port_init(&lvgl_cfg) != ESP_OK) { - TT_LOG_E(TAG, "LVGL port init failed"); - return false; - } - - tt::lvgl::syncSet(&lvgl_port_lock, &lvgl_port_unlock); - - return true; -} diff --git a/Boards/M5stackCoreS3/Source/InitLvgl.h b/Boards/M5stackCoreS3/Source/InitLvgl.h deleted file mode 100644 index e57bd9bd..00000000 --- a/Boards/M5stackCoreS3/Source/InitLvgl.h +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -bool initLvgl(); diff --git a/Boards/M5stackCoreS3/Source/M5stackCoreS3.cpp b/Boards/M5stackCoreS3/Source/M5stackCoreS3.cpp index 7192233e..740e071f 100644 --- a/Boards/M5stackCoreS3/Source/M5stackCoreS3.cpp +++ b/Boards/M5stackCoreS3/Source/M5stackCoreS3.cpp @@ -1,6 +1,5 @@ #include "M5stackCoreS3.h" #include "InitBoot.h" -#include "InitLvgl.h" #include "Tactility/lvgl/LvglSync.h" #include "hal/CoreS3Display.h" #include "hal/CoreS3DisplayConstants.h" @@ -11,7 +10,6 @@ const tt::hal::Configuration m5stack_cores3 = { .initBoot = initBoot, - .initLvgl = initLvgl, .createDisplay = createDisplay, .sdcard = createSdCard(), .power = createPower, diff --git a/Boards/Simulator/Source/hal/Configuration.cpp b/Boards/Simulator/Source/Simulator.cpp similarity index 93% rename from Boards/Simulator/Source/hal/Configuration.cpp rename to Boards/Simulator/Source/Simulator.cpp index e808d6ba..c16c23b6 100644 --- a/Boards/Simulator/Source/hal/Configuration.cpp +++ b/Boards/Simulator/Source/Simulator.cpp @@ -1,10 +1,11 @@ -#include -#include "hal/SimulatorPower.h" #include "LvglTask.h" -#include "src/lv_init.h" -#include "SdlDisplay.h" -#include "SdlKeyboard.h" -#include "SimulatorSdCard.h" +#include "hal/SdlDisplay.h" +#include "hal/SdlKeyboard.h" +#include "hal/SimulatorPower.h" +#include "hal/SimulatorSdCard.h" + +#include // LVGL +#include #define TAG "hardware" diff --git a/Boards/UnPhone/Source/Lvgl.cpp b/Boards/UnPhone/Source/Lvgl.cpp deleted file mode 100644 index fb471cc0..00000000 --- a/Boards/UnPhone/Source/Lvgl.cpp +++ /dev/null @@ -1,32 +0,0 @@ -#include -#include -#include -#include - -#define TAG "unphone_lvgl" - -// LVGL -// The minimum task stack seems to be about 3500, but that crashes the wifi app in some scenarios -// At 8192, it sometimes crashes when wifi-auto enables and is busy connecting and then you open WifiManage -#define UNPHONE_LVGL_TASK_STACK_DEPTH 9216 - -bool unPhoneInitLvgl() { - static lv_disp_t* display = nullptr; - const lvgl_port_cfg_t lvgl_cfg = { - .task_priority = static_cast(tt::THREAD_PRIORITY_RENDER), - .task_stack = UNPHONE_LVGL_TASK_STACK_DEPTH, - .task_affinity = -1, // core pinning - .task_max_sleep_ms = 500, - .timer_period_ms = 5 - }; - - TT_LOG_D(TAG, "LVGL port init"); - if (lvgl_port_init(&lvgl_cfg) != ESP_OK) { - TT_LOG_E(TAG, "LVGL port init failed"); - return false; - } - - tt::lvgl::syncSet(&lvgl_port_lock, &lvgl_port_unlock); - - return true; -} diff --git a/Boards/UnPhone/Source/UnPhone.cpp b/Boards/UnPhone/Source/UnPhone.cpp index 4e5e507e..5d30b830 100644 --- a/Boards/UnPhone/Source/UnPhone.cpp +++ b/Boards/UnPhone/Source/UnPhone.cpp @@ -9,11 +9,9 @@ #define UNPHONE_SPI_TRANSFER_SIZE_LIMIT (UNPHONE_LCD_HORIZONTAL_RESOLUTION * UNPHONE_LCD_SPI_TRANSFER_HEIGHT * LV_COLOR_DEPTH / 8) bool unPhoneInitPower(); -bool unPhoneInitLvgl(); extern const tt::hal::Configuration unPhone = { .initBoot = unPhoneInitPower, - .initLvgl = unPhoneInitLvgl, .createDisplay = createDisplay, .sdcard = createUnPhoneSdCard(), .power = unPhoneGetPower, diff --git a/Tactility/CMakeLists.txt b/Tactility/CMakeLists.txt index ccd4898b..26ea9640 100644 --- a/Tactility/CMakeLists.txt +++ b/Tactility/CMakeLists.txt @@ -10,7 +10,7 @@ if (DEFINED ENV{ESP_IDF_VERSION}) SRCS ${SOURCE_FILES} INCLUDE_DIRS "Include/" PRIV_INCLUDE_DIRS "Private/" - REQUIRES TactilityHeadless lvgl driver elf_loader lv_screenshot QRCode + REQUIRES TactilityHeadless lvgl driver elf_loader lv_screenshot QRCode esp_lvgl_port ) if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") diff --git a/Tactility/Private/Tactility/lvgl/EspLvglPort.h b/Tactility/Private/Tactility/lvgl/EspLvglPort.h new file mode 100644 index 00000000..a1db1de0 --- /dev/null +++ b/Tactility/Private/Tactility/lvgl/EspLvglPort.h @@ -0,0 +1,11 @@ +#pragma once + +#ifdef ESP_PLATFORM + +namespace tt::lvgl { + +bool initEspLvglPort(); + +} + +#endif diff --git a/Tactility/Source/app/power/Power.cpp b/Tactility/Source/app/power/Power.cpp index c2485a38..a99b4a15 100644 --- a/Tactility/Source/app/power/Power.cpp +++ b/Tactility/Source/app/power/Power.cpp @@ -5,8 +5,8 @@ #include "Tactility/service/loader/Loader.h" #include +#include #include -#include #include #include diff --git a/Boards/LilygoTdeck/Source/Lvgl.cpp b/Tactility/Source/lvgl/EspLvglPort.cpp similarity index 78% rename from Boards/LilygoTdeck/Source/Lvgl.cpp rename to Tactility/Source/lvgl/EspLvglPort.cpp index 257328af..849731d6 100644 --- a/Boards/LilygoTdeck/Source/Lvgl.cpp +++ b/Tactility/Source/lvgl/EspLvglPort.cpp @@ -1,19 +1,19 @@ -#include "hal/TdeckDisplay.h" +#ifdef ESP_PLATFORM -#include -#include #include - #include - -#define TAG "tdeck_lvgl" +#include // LVGL // The minimum task stack seems to be about 3500, but that crashes the wifi app in some scenarios // At 8192, it sometimes crashes when wifi-auto enables and is busy connecting and then you open WifiManage #define TDECK_LVGL_TASK_STACK_DEPTH 9216 +#define TAG "lvgl" -bool tdeck_init_lvgl() { +namespace tt::lvgl { + +bool initEspLvglPort() { + TT_LOG_D(TAG, "Port init"); static lv_disp_t* display = nullptr; const lvgl_port_cfg_t lvgl_cfg = { .task_priority = static_cast(tt::THREAD_PRIORITY_RENDER), @@ -23,9 +23,8 @@ bool tdeck_init_lvgl() { .timer_period_ms = 5 }; - TT_LOG_D(TAG, "LVGL port init"); if (lvgl_port_init(&lvgl_cfg) != ESP_OK) { - TT_LOG_E(TAG, "LVGL port init failed"); + TT_LOG_E(TAG, "Port init failed"); return false; } @@ -33,3 +32,7 @@ bool tdeck_init_lvgl() { return true; } + +} // namespace tt::lvgl + +#endif diff --git a/Tactility/Source/lvgl/Init.cpp b/Tactility/Source/lvgl/Init.cpp index 43d226be..81183a5b 100644 --- a/Tactility/Source/lvgl/Init.cpp +++ b/Tactility/Source/lvgl/Init.cpp @@ -7,6 +7,10 @@ #include #include +#ifdef ESP_PLATFORM +#include "Tactility/lvgl/EspLvglPort.h" +#endif + #include namespace tt::lvgl { @@ -82,10 +86,11 @@ void init(const hal::Configuration& config) { kernel::systemEventPublish(kernel::SystemEvent::BootInitLvglBegin); - if (config.initLvgl != nullptr && !config.initLvgl()) { - TT_LOG_E(TAG, "LVGL init failed"); +#ifdef ESP_PLATFORM + if (config.lvglInit == hal::LvglInit::Default && !initEspLvglPort()) { return; } +#endif auto display = initDisplay(config); if (display == nullptr) { diff --git a/TactilityHeadless/Include/Tactility/hal/Configuration.h b/TactilityHeadless/Include/Tactility/hal/Configuration.h index 2846d131..ff494e03 100644 --- a/TactilityHeadless/Include/Tactility/hal/Configuration.h +++ b/TactilityHeadless/Include/Tactility/hal/Configuration.h @@ -1,6 +1,5 @@ #pragma once -#include "./Power.h" #include "./SdCard.h" #include "./i2c/I2c.h" #include "Tactility/hal/spi/Spi.h" @@ -8,15 +7,19 @@ namespace tt::hal { typedef bool (*InitBoot)(); -typedef bool (*InitHardware)(); -typedef bool (*InitLvgl)(); class Display; class Keyboard; +class Power; typedef std::shared_ptr (*CreateDisplay)(); typedef std::shared_ptr (*CreateKeyboard)(); typedef std::shared_ptr (*CreatePower)(); +enum class LvglInit { + Default, + None +}; + struct Configuration { /** * Called before I2C/SPI/etc is initialized. @@ -24,13 +27,13 @@ struct Configuration { */ const InitBoot _Nullable initBoot = nullptr; - /** Create and initialize all LVGL devices. (e.g. display, touch, keyboard) */ - const InitLvgl _Nullable initLvgl = nullptr; + /** Init behaviour: default (esp_lvgl_port for ESP32, nothing for PC) or None (nothing on any platform). Only used in Tactility, not in TactilityHeadless. */ + const LvglInit lvglInit = LvglInit::Default; /** Display HAL functionality. */ const CreateDisplay _Nullable createDisplay = nullptr; - /** Display HAL functionality. */ + /** Keyboard HAL functionality. */ const CreateKeyboard _Nullable createKeyboard = nullptr; /** An optional SD card interface. */ diff --git a/TactilityHeadless/Source/hal/Hal.cpp b/TactilityHeadless/Source/hal/Hal.cpp index 964a0396..9880678e 100644 --- a/TactilityHeadless/Source/hal/Hal.cpp +++ b/TactilityHeadless/Source/hal/Hal.cpp @@ -2,6 +2,7 @@ #include "Tactility/hal/Hal_i.h" #include "Tactility/hal/i2c/I2c.h" #include "Tactility/hal/spi/Spi.h" +#include "Tactility/hal/Power.h" #include