- v3.0: Единый скрипт
create_embedded_icons.py, авто-определениеUSE_BUILTIN_ICONS, staleness detection - v2.0: Раздельные скрипты для app/system иконок
- v1.0: Ручная генерация
Иконки встраиваются в прошивку автоматически при сборке. Скрипт create_embedded_icons.py сканирует все icon.png в data/apps/*/ и системные иконки в data/system/resources/icons/, конвертирует в RGB565 и генерирует C-хедер.
Staleness detection: каждая встроенная иконка хранит размер исходного PNG. Если файл на LittleFS отличается по размеру (пользователь залил новую иконку без пересборки), используется FS-версия.
| Директория | Назначение |
|---|---|
data/apps/{name}/icon.png |
Иконки приложений |
data/system/resources/icons/ |
Системные/категорийные иконки (game.png, puzzle-game.png) |
| Flag | Описание |
|---|---|
USE_BUILTIN_ICONS |
Авто-определяется скриптом когда иконки найдены. Не нужно задавать вручную |
NO_BUILTIN_ICONS |
Принудительно отключить встроенные иконки |
NO_PNG_ICONS |
Отключить загрузку PNG с файловой системы (только embedded) |
PRELOAD_ICONS_TO_PSRAM |
Предзагрузка PNG в PSRAM при старте |
- Builtin app icon —
findBuiltinEntry(appName)→ staleness check → если не stale, используется - Builtin system icon — для путей
C:/system/resources/icons/→ staleness check - PSRAM preloaded — если
PRELOAD_ICONS_TO_PSRAMвключён - Filesystem icon —
app.iconPathиз LittleFS - Letter fallback — первая буква названия
Нормализует все icon.png до целевого размера (64×64 по умолчанию).
Конвертирует PNG → RGB565 C-массивы. Генерирует include/_generated_icons.h.
PlatformIO integration:
[env]
extra_scripts =
pre:scripts/resize_icons.py
pre:scripts/create_embedded_icons.pyКогда перегенерирует:
- Хедер отсутствует
- Версия скрипта изменилась
- Размер иконок (
custom_icon_size) изменился - Любой
icon.pngновее хедера
include/_generated_icons.h предоставляет:
struct BuiltinIcon {
const char* name;
const lv_image_dsc_t* icon;
uint32_t png_size; // для staleness detection
};
const BuiltinIcon* findBuiltinEntry(const char* name); // полная запись
const BuiltinIcon* findSystemEntry(const char* name); // системная иконка
const lv_image_dsc_t* findBuiltinIcon(const char* name); // только дескриптор
const lv_image_dsc_t* findSystemIcon(const char* name);
const lv_image_dsc_t* findCategoryIcon(const char* category);Ограниченная RAM, всё embedded, без PNG:
[env:twatch2020]
custom_icon_size = 48
build_flags =
-DNO_PNG_ICONS # Только embedded иконкиГибридный подход: embedded + FS fallback:
[env:esp4848s040]
# custom_icon_size не задан → 64 (default)
build_flags =
# USE_BUILTIN_ICONS определяется автоматически
# FS иконки доступны как fallback| Icon Size | Pixels | RGB565 Bytes | 10 Icons |
|---|---|---|---|
| 32×32 | 1,024 | 2 KB | 20 KB |
| 48×48 | 2,304 | 4.5 KB | 45 KB |
| 64×64 | 4,096 | 8 KB | 80 KB |
| Device | Подход |
|---|---|
| < 320 KB RAM | NO_PNG_ICONS, 48px |
| > 512 KB RAM | Default (hybrid), 64px |
| С PSRAM | PRELOAD_ICONS_TO_PSRAM |
- Проверь что
extra_scriptsнастроены вplatformio.ini - При сборке должно быть
=== Embedded Icons 64x64 ===в выводе - Если
[stale->fs]— размеры PNG на FS не совпадают с embedded. Перезалей FS:pio run -t uploadfs
- Проверь что
icon.pngсуществует в папке приложения - Для системных: файл в
data/system/resources/icons/ NO_BUILTIN_ICONSне должен быть задан
- Уменьши
custom_icon_size(48 или 32) - Удали неиспользуемые иконки