From 958626f576f124b8c094887a840b010dcd25eaae Mon Sep 17 00:00:00 2001 From: Thomas Farstrike Date: Mon, 28 Apr 2025 15:15:25 +0200 Subject: [PATCH] Improve icon handling --- .../res/mipmap-mdpi/icon_64x64.bin | Bin 8204 -> 12300 bytes .../com.example.launcher/assets/launcher.py | 43 ++++++++++-------- internal_filesystem/main.py | 5 +- pngtobin.sh | 3 +- 4 files changed, 28 insertions(+), 23 deletions(-) diff --git a/internal_filesystem/apps/com.example.imutest/res/mipmap-mdpi/icon_64x64.bin b/internal_filesystem/apps/com.example.imutest/res/mipmap-mdpi/icon_64x64.bin index ddf9eb8d5157acfa9c1384c3fcada235ba9cbe32..1b4560712a1b3c3fbb59c9249eacdbdb847940db 100644 GIT binary patch literal 12300 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 N1V%$(Gz5qZ0RW(c;P3zd diff --git a/internal_filesystem/apps/com.example.launcher/assets/launcher.py b/internal_filesystem/apps/com.example.launcher/assets/launcher.py index f919f9de..db372140 100644 --- a/internal_filesystem/apps/com.example.launcher/assets/launcher.py +++ b/internal_filesystem/apps/com.example.launcher/assets/launcher.py @@ -29,6 +29,23 @@ iconcont_height = icon_size + label_height import time start = time.ticks_ms() +def load_icon(icon_path): + with open(icon_path, 'rb') as f: + f.seek(12) # first 12 bytes are headers + image_data = f.read() + image_dsc = lv.image_dsc_t({ + "header": { + "magic": lv.IMAGE_HEADER_MAGIC, + "w": 64, + "h": 64, + "stride": 64 * 2, + "cf": lv.COLOR_FORMAT.RGB565A8 + }, + 'data_size': len(image_data), + 'data': image_data + }) + return image_dsc + # Get list of app directories # Should we skip 'Launcher' apps from the list here? apps_dir = "/apps" @@ -43,27 +60,17 @@ for app_dir in [d for d in uos.listdir(apps_dir) if uos.stat(f"{apps_dir}/{d}")[ app_cont.set_style_pad_all(0, 0) # Load and display icon icon_path = f"{app_dir_fullpath}/res/mipmap-mdpi/icon_64x64.bin" - #icon_path = "/resources/default_icon_64x64.bin" image = lv.image(app_cont) try: - with open(icon_path, 'rb') as f: - f.seek(12) # first 12 bytes are headers - image_data = f.read() - image_dsc = lv.image_dsc_t({ - "header": { - "magic": lv.IMAGE_HEADER_MAGIC, - "w": 64, - "h": 64, - "stride": 64 * 2, - "cf": lv.COLOR_FORMAT.RGB565A8 - }, - 'data_size': len(image_data), - 'data': image_data - }) - image.set_src(image_dsc) + image.set_src(load_icon(icon_path)) except Exception as e: - print(f"Error loading icon {icon_path}: {e}") - image.set_src(lv.SYMBOL.STOP) # square block + print(f"Error loading icon {icon_path}: {e} - loading default icon") + icon_path = "/resources/default_icon_64x64.bin" + try: + image.set_src(load_icon(icon_path)) + except Exception as e: + print(f"Error loading default icon {icon_path}: {e} - using symbol") + image.set_src(lv.SYMBOL.STOP) # square block image.align(lv.ALIGN.TOP_MID, 0, 0) image.set_size(icon_size, icon_size) # Create label diff --git a/internal_filesystem/main.py b/internal_filesystem/main.py index fcdb9111..b956e30f 100644 --- a/internal_filesystem/main.py +++ b/internal_filesystem/main.py @@ -349,11 +349,8 @@ def start_app(app_dir, is_launcher=False): start_script_fullpath = f"{app_dir}/{start_script}" execute_script_new_thread(start_script_fullpath, True, is_launcher, True) -def run_launcher(): - start_app("/apps/com.example.launcher", True) - execute_script_new_thread("/autorun.py", True, False, False) -run_launcher() +start_app("/apps/com.example.launcher", True) # If we got this far without crashing, then no need to rollback the update import ota.rollback diff --git a/pngtobin.sh b/pngtobin.sh index fe588746..7a361848 100755 --- a/pngtobin.sh +++ b/pngtobin.sh @@ -1,2 +1,3 @@ #~/sources/lvgl_micropython/lib/lvgl/scripts/LVGLImage.py --ofmt BIN --cf RGB565 -o icon_64x64.bin icon_64x64.png -~/sources/lvgl_micropython/lib/lvgl/scripts/LVGLImage.py --ofmt BIN --cf RGB565 icon_64x64.png +#~/sources/lvgl_micropython/lib/lvgl/scripts/LVGLImage.py --ofmt BIN --cf RGB565 icon_64x64.png +~/sources/lvgl_micropython/lib/lvgl/scripts/LVGLImage.py --ofmt BIN --cf RGB565A8 "$1"