From ae8bb5a01fb00fb837e1187a47f74e12729c94bb Mon Sep 17 00:00:00 2001 From: Thomas Peterson Date: Sun, 1 Feb 2026 21:48:36 +0100 Subject: [PATCH] Fixes --- ...taticFileHandlers.cpp.7B27CFEA2E9C1EF7.idx | Bin 2908 -> 3010 bytes main/SdCard.cpp | 2 +- main/WidgetManager.cpp | 53 ++++++++++++------ main/main.cpp | 13 ++++- sdkconfig | 6 +- web-interface/src/components/FileManager.vue | 2 +- 6 files changed, 53 insertions(+), 23 deletions(-) diff --git a/.cache/clangd/index/StaticFileHandlers.cpp.7B27CFEA2E9C1EF7.idx b/.cache/clangd/index/StaticFileHandlers.cpp.7B27CFEA2E9C1EF7.idx index 82e55c44e16a476be7b0b5541c39db4e54a50cfa..22f08191aaad540ec5ea3569fd1b731a36322786 100644 GIT binary patch literal 3010 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 eEV8ifW9Q&RadBgDcm$HI33P%w&T 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 0 && header.h > 0) { + ESP_LOGI(TAG, "Image size: %dx%d", header.w, header.h); + + // Get display/canvas size + int32_t dispW = lv_obj_get_width(parent); + int32_t dispH = lv_obj_get_height(parent); + if (dispW <= 0) dispW = LV_HOR_RES; + if (dispH <= 0) dispH = LV_VER_RES; + + switch (screen.bgImageMode) { + case BgImageMode::STRETCH: { + // Calculate scale to fill display (in 1/256 units for LVGL) + int32_t scaleX = (dispW * 256) / header.w; + int32_t scaleY = (dispH * 256) / header.h; + lv_image_set_scale_x(bgImg, scaleX); + lv_image_set_scale_y(bgImg, scaleY); + lv_obj_set_pos(bgImg, 0, 0); + ESP_LOGI(TAG, "Stretch scale: %ldx%ld", scaleX, scaleY); + break; + } + case BgImageMode::CENTER: + lv_obj_center(bgImg); + break; + case BgImageMode::TILE: + lv_image_set_inner_align(bgImg, LV_IMAGE_ALIGN_TILE); + lv_obj_set_size(bgImg, lv_pct(100), lv_pct(100)); + break; + default: + break; + } + } else { + ESP_LOGW(TAG, "Could not get image info, using default position"); + lv_obj_set_pos(bgImg, 0, 0); } // Send to background (behind all widgets) diff --git a/main/main.cpp b/main/main.cpp index 3c1aee6..9a00599 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -3,6 +3,7 @@ #include "freertos/task.h" #include "esp_log.h" #include "esp_lv_adapter.h" +#include "esp_lv_decoder.h" #include "lvgl.h" #include "Display.hpp" #include "Touch.hpp" @@ -84,7 +85,17 @@ public: if (!SdCard::instance().init()) { ESP_LOGW(TAG, "SD card not available, using defaults"); } - + + // Initialize hardware JPEG/PNG decoder for LVGL (uses ESP32-P4 hardware acceleration) + ESP_LOGI(TAG, "INIT IMAGE DECODER"); + esp_lv_decoder_handle_t decoder_handle = NULL; + esp_err_t dec_err = esp_lv_decoder_init(&decoder_handle); + if (dec_err != ESP_OK) { + ESP_LOGW(TAG, "Failed to init image decoder: %s", esp_err_to_name(dec_err)); + } else { + ESP_LOGI(TAG, "Hardware image decoder initialized"); + } + ESP_LOGI(TAG, "START KNX"); BaseType_t knx_ok = xTaskCreatePinnedToCore( knx_task, "knx", 4096, &Gui::knxWorker, 5, nullptr, 1); diff --git a/sdkconfig b/sdkconfig index bfb155c..b664f67 100644 --- a/sdkconfig +++ b/sdkconfig @@ -2979,8 +2979,8 @@ CONFIG_LV_ASSERT_HANDLER_INCLUDE="assert.h" # Others # # CONFIG_LV_ENABLE_GLOBAL_CUSTOM is not set -CONFIG_LV_CACHE_DEF_SIZE=0 -CONFIG_LV_IMAGE_HEADER_CACHE_DEF_CNT=0 +CONFIG_LV_CACHE_DEF_SIZE=4194304 +CONFIG_LV_IMAGE_HEADER_CACHE_DEF_CNT=8 CONFIG_LV_GRADIENT_MAX_STOPS=2 CONFIG_LV_COLOR_MIX_ROUND_OFS=128 # CONFIG_LV_OBJ_STYLE_CACHE is not set @@ -3184,7 +3184,7 @@ CONFIG_LV_FS_POSIX_CACHE_SIZE=0 # CONFIG_LV_USE_LODEPNG is not set # CONFIG_LV_USE_LIBPNG is not set # CONFIG_LV_USE_BMP is not set -CONFIG_LV_USE_TJPGD=y +# CONFIG_LV_USE_TJPGD is not set # CONFIG_LV_USE_LIBJPEG_TURBO is not set # CONFIG_LV_USE_GIF is not set # CONFIG_LV_BIN_DECODER_RAM_LOAD is not set diff --git a/web-interface/src/components/FileManager.vue b/web-interface/src/components/FileManager.vue index f3ae236..e50b4b9 100644 --- a/web-interface/src/components/FileManager.vue +++ b/web-interface/src/components/FileManager.vue @@ -219,7 +219,7 @@ const imageExtensions = ['png', 'jpg', 'jpeg', 'gif', 'bmp', 'webp', 'svg']; // Image optimization settings for ESP32 const MAX_IMAGE_WIDTH = 1280; // Display width const MAX_IMAGE_HEIGHT = 800; // Display height -const JPEG_QUALITY = 0.75; // 75% quality +const JPEG_QUALITY = 0.80; // 80% quality - good balance function isImageFile(name) { const ext = name.split('.').pop().toLowerCase();