FBT: Optimize icons blob -4KB DFU, scrub unused icons (#291)

* Unused icons to check later

* Exclude disabled icons from firmware

* Format

* Also report free flash in gh comment

* Fix free flash calc

* Fix?

* Fix??

* Split to next line

* Remove dead icons

* Some spring cleaning of icons cooker

* Improve unused icons script

* Disable icons that cant be used in asset packs

* These will need a workaround for external

* Revert "These will need a workaround for external"

This reverts commit fb23d97952.

* Here's the workaround: split assets lib

now there is "assets" and "fwassets"

firmware links with fwassets and includes all icons
however not all of them are exposed to api

if an app needs a firmware icon not in api, it can use fap_libs=["assets"]
this will link against this dummy assets lib
it only contains the icons that arent exposed to api

this way, an app using assets lib will still benefit from asset packs
but at same time, we can remove pointless icons from dfu blob

* Update changelog
This commit is contained in:
WillyJL
2024-11-05 07:32:24 +00:00
committed by GitHub
parent 78f517b294
commit 3ef283824d
24 changed files with 183 additions and 77 deletions
+14 -2
View File
@@ -128,11 +128,22 @@ jobs:
dfu_size_new=$(du --apparent-size -B 1 artifacts/flipper-z-${TARGET}-full-*.dfu | cut -f1)
dfu_size_dev=$(du --apparent-size -B 1 dev.dfu | cut -f1)
dfu_size_diff=$((dfu_size_new - dfu_size_dev))
DFU_SIZE=$(echo ${dfu_size_new}B | sed -r 's/^([0-9]+)([0-9]{2})([0-9])B/\1.\2K/')
DFU_DIFF=$(echo ${dfu_size_diff}B | sed -r 's/^(-?[0-9]+)([0-9]{2})([0-9])B/\1.\2K/' | sed -r 's/^([^-])/+\1/')
DFU_SIZE=$(echo $dfu_size_new | numfmt --to=iec --format=%.2f)
DFU_DIFF=$(echo $dfu_size_diff | numfmt --to=iec --format=%.2f | sed -r 's/^([^-])/+\1/')
echo "DFU_SIZE=$DFU_SIZE" >> $GITHUB_ENV
echo "DFU_DIFF=$DFU_DIFF" >> $GITHUB_ENV
tar xzf build/core2_firmware.tgz
radio_addr=$(jq -r '.copro.radio.files[0].address' core2_firmware/Manifest.json)
flash_base=0x8000000
min_gap=$((2 * 4 * 1024))
flash_free_total=$((radio_addr - flash_base - dfu_size_new))
flash_free_usable=$((flash_free_total - min_gap))
FLASH_FREE=$(echo $flash_free_total | numfmt --to=iec --format=%.2f)
FLASH_USABLE=$(echo $flash_free_usable | numfmt --to=iec --format=%.2f)
echo "FLASH_FREE=$FLASH_FREE" >> $GITHUB_ENV
echo "FLASH_USABLE=$FLASH_USABLE" >> $GITHUB_ENV
- name: "Upload artifacts to update server"
env:
INDEXER_URL: ${{ secrets.INDEXER_URL }}
@@ -170,6 +181,7 @@ jobs:
- [☁️ Flipper Lab/App](https://lab.flipper.net/?url=${{secrets.INDEXER_URL}}/builds/firmware/${{steps.names.outputs.branch_name}}/flipper-z-${{steps.names.outputs.default_target}}-update-${{steps.names.outputs.suffix}}.tgz&channel=mntm-${{steps.names.outputs.branch_name}}&version=${{steps.names.outputs.commit_sha}})
- [📦 qFlipper Package](${{secrets.INDEXER_URL}}/builds/firmware/${{steps.names.outputs.branch_name}}/flipper-z-${{steps.names.outputs.default_target}}-update-${{steps.names.outputs.suffix}}.tgz)
- DFU Size: `${{ env.DFU_SIZE }}` (`${{ env.DFU_DIFF }}` from dev)
- Free Flash: `${{ env.FLASH_FREE }}` (`${{ env.FLASH_USABLE }}` usable)
edit-mode: replace
- name: Send devbuild webhook
+4 -3
View File
@@ -133,9 +133,6 @@
- UL: W5500 Ethernet: Various fixes and improvements (by @xMasterX)
- OFW: SPI Mem Manager: Fixed UI rendering bug related to line breaks (by @portasynthinca3)
- OFW: USB/BT Remote: Mouse clicker option to click as fast as possible (by @sumukhj1219)
- CLI:
- Print plugin name on load fail (by @Willy-JL)
- Move more commands as plugins on SD, refactor plugin wrapper (#276 by @Willy-JL)
- NFC:
- NDEF Parser:
- Mifare Classic support (#265 by @luu176), protocol-agnostic rewrite and more improvements (#265 by @Willy-JL)
@@ -166,6 +163,10 @@
- OFW: Add TCL 75S451 to TV universal remote (by @christhetech131)
- OFW: Universal remote additions (by @jaylikesbunda)
- OFW: Heavily Expand Universal Remotes (by @jaylikesbunda)
- CLI:
- Print plugin name on load fail (by @Willy-JL)
- Move more commands as plugins on SD, refactor plugin wrapper (#276 by @Willy-JL)
- FBT: Optimize icons blob, scrub unused icons (#291 by @Willy-JL)
- OFW: BadKB: Improve ChromeOS and GNOME demo scripts (by @kowalski7cc)
- OFW: GUI: Change dialog_ex text ownership model (by @skotopes)
- OFW: CCID: App changes and improvements (by @kidbomb)
+1 -1
View File
@@ -13,7 +13,7 @@ App(
"!plugins",
"!nfc_cli.c",
],
fap_libs=["mbedtls"],
fap_libs=["assets", "mbedtls"],
fap_icon="icon.png",
fap_category="NFC",
)
@@ -12,4 +12,5 @@ App(
stack_size=1 * 1024,
order=1000,
fap_category="assets",
fap_libs=["assets"],
)
@@ -12,4 +12,5 @@ App(
stack_size=1 * 1024,
order=40,
fap_category="assets",
fap_libs=["assets"],
)
@@ -8,4 +8,5 @@ App(
stack_size=2 * 1024,
order=30,
fap_category="assets",
fap_libs=["assets"],
)
@@ -5,6 +5,7 @@ App(
cdefines=["JS_RUNNER_FAP"],
fap_icon="icon.png",
fap_category="assets",
fap_libs=["assets"],
entry_point="js_app",
stack_size=2 * 1024,
resources="examples",
@@ -35,6 +36,7 @@ App(
"modules/js_flipper.c",
"modules/js_tests.c",
],
fap_libs=["assets"],
)
App(
+24 -2
View File
@@ -14,9 +14,26 @@ icons_path = (
if assetsenv["IS_BASE_FIRMWARE"]
else assetsenv["ASSETS_WORK_DIR"]
)
icons = assetsenv.CompileIcons(icons_path, assetsenv["ASSETS_SRC_DIR"].Dir("icons"))
icons = assetsenv.CompileIcons(
icons_path,
assetsenv["ASSETS_SRC_DIR"].Dir("icons"),
fw_bundle=True,
)
assetsenv.Alias("icons", icons)
# Extra icons lib so apps don't override asset packs to use fw icons not exposed to api
# Not used anywhere in code, apps still reference assets_icons.h, but if one of the
# icons they need is not exposed in api, they can link with fap_libs=["assets"] which
# will use this lib purely for linking as a drop-in for missing symbols.
# Should mean that apps made for OFW with fap_libs=["assets"], when compiled with
# this FBT, will still use asset packs at runtime and only link non-exposed icons.
if assetsenv["IS_BASE_FIRMWARE"]:
dropin_icons = assetsenv.CompileIcons(
assetsenv["ASSETS_WORK_DIR"],
assetsenv["ASSETS_SRC_DIR"].Dir("icons"),
icon_bundle_name="_assets_icons_dropin",
)
# Protobuf .proto -> .c + .h
proto_src = assetsenv.Glob("protobuf/*.proto", source=True)
@@ -59,9 +76,14 @@ assetsenv.Alias("proto_ver", proto_ver)
assets_parts = (icons, proto, dolphin_blocking, dolphin_internal, proto_ver)
env.Replace(FW_ASSETS_HEADERS=assets_parts)
assetslib = assetsenv.Library("${FW_LIB_NAME}", assets_parts)
assetslib = assetsenv.Library("fw${FW_LIB_NAME}", assets_parts)
assetsenv.Install("${LIB_DIST_DIR}", assetslib)
if assetsenv["IS_BASE_FIRMWARE"]:
dropin_parts = (dropin_icons, proto, dolphin_blocking, dolphin_internal, proto_ver)
dropin_assetslib = assetsenv.Library("${FW_LIB_NAME}", dropin_parts)
assetsenv.Install("${LIB_DIST_DIR}", dropin_assetslib)
# Resources for SD card
if assetsenv["IS_BASE_FIRMWARE"]:
Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 128 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 143 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 136 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 136 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 145 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 B

+57 -35
View File
@@ -11,11 +11,20 @@ ICONS_SUPPORTED_FORMATS = ["png"]
ICONS_TEMPLATE_H_HEADER = """#pragma once
#include <furi.h>
#include <stddef.h>
#include <gui/icon.h>
"""
ICONS_TEMPLATE_H_ICON_NAME = "extern const Icon {name};\n"
ICONS_TEMPLATE_H_ICON_PATHS = """
typedef struct {
const Icon* icon;
const char* path;
} IconPath;
extern const IconPath ICON_PATHS[];
extern const size_t ICON_PATHS_COUNT;
"""
ICONS_TEMPLATE_C_HEADER = """#include "{assets_filename}.h"
@@ -25,6 +34,15 @@ ICONS_TEMPLATE_C_HEADER = """#include "{assets_filename}.h"
ICONS_TEMPLATE_C_FRAME = "const uint8_t {name}[] = {data};\n"
ICONS_TEMPLATE_C_DATA = "const uint8_t* const {name}[] = {data};\n"
ICONS_TEMPLATE_C_ICONS = "const Icon {name} = {{.width={width},.height={height},.frame_count={frame_count},.frame_rate={frame_rate},.frames=_{name}}};\n"
ICONS_TEMPLATE_C_ICON_PATH = ' {{&{name}, "{path}"}},\n'
ICONS_TEMPLATE_C_ICON_PATHS = """
const IconPath ICON_PATHS[] = {{
#ifndef FURI_RAM_EXEC
{icon_paths}
#endif
}};
const size_t ICON_PATHS_COUNT = COUNT_OF(ICON_PATHS);
"""
MAX_IMAGE_WIDTH = 2**16 - 1
MAX_IMAGE_HEIGHT = 2**16 - 1
@@ -45,6 +63,22 @@ class Main(App):
required=False,
default="assets_icons",
)
self.parser_icons.add_argument(
"--fw-bundle",
dest="fw_bundle",
help="Bundle all icons and path info, only for use in firmware blob",
default=0,
type=int,
required=False,
)
self.parser_icons.add_argument(
"--add-include",
dest="add_include",
help="Add assets_icons.h include drop-in for apps",
default=0,
type=int,
required=False,
)
self.parser_icons.set_defaults(func=self.icons)
@@ -138,7 +172,6 @@ class Main(App):
)
icons = []
paths = []
is_main_assets = self.args.filename == "assets_icons"
symbols = pathlib.Path(__file__).parent.parent
if "UFBT_HOME" in os.environ:
symbols /= "sdk_headers/f7_sdk"
@@ -154,7 +187,8 @@ class Main(App):
if "frame_rate" in filenames:
self.logger.debug("Folder contains animation")
icon_name = "A_" + os.path.split(dirpath)[1].replace("-", "_")
if not is_main_assets and api_has_icon(icon_name):
icon_in_api = api_has_icon(icon_name)
if not self.args.fw_bundle and icon_in_api:
self.logger.info(
f"{self.args.filename}: ignoring duplicate icon {icon_name}"
)
@@ -193,8 +227,9 @@ class Main(App):
)
icons_c.write("\n")
icons.append((icon_name, width, height, frame_rate, frame_count))
p = dirpath.removeprefix(self.args.input_directory)[1:]
paths.append((icon_name, p.replace("\\", "/")))
if self.args.fw_bundle and icon_in_api:
path = dirpath.removeprefix(self.args.input_directory)[1:]
paths.append((icon_name, path.replace("\\", "/")))
else:
# process icons
for filename in filenames:
@@ -204,7 +239,8 @@ class Main(App):
icon_name = "I_" + "_".join(filename.split(".")[:-1]).replace(
"-", "_"
)
if not is_main_assets and api_has_icon(icon_name):
icon_in_api = api_has_icon(icon_name)
if not self.args.fw_bundle and icon_in_api:
self.logger.info(
f"{self.args.filename}: ignoring duplicate icon {icon_name}"
)
@@ -222,8 +258,11 @@ class Main(App):
)
icons_c.write("\n")
icons.append((icon_name, width, height, 0, 1))
p = fullfilename.removeprefix(self.args.input_directory)[1:]
paths.append((icon_name, p.replace("\\", "/").rsplit(".", 1)[0]))
if self.args.fw_bundle and icon_in_api:
path = fullfilename.removeprefix(self.args.input_directory)[1:]
paths.append(
(icon_name, path.replace("\\", "/").rsplit(".", 1)[0])
)
# Create array of images:
self.logger.debug("Finalizing source file")
for name, width, height, frame_rate, frame_count in icons:
@@ -236,21 +275,14 @@ class Main(App):
frame_count=frame_count,
)
)
if is_main_assets:
icons_c.write(
"""
const IconPath ICON_PATHS[] = {
#ifndef FURI_RAM_EXEC
"""
)
for name, path in paths:
icons_c.write(f' {{&{name}, "{path}"}},\n')
icons_c.write(
"""#endif
};
const size_t ICON_PATHS_COUNT = COUNT_OF(ICON_PATHS);
"""
if not self.args.fw_bundle:
icons_c.write("\n")
else:
icon_paths = "\n".join(
ICONS_TEMPLATE_C_ICON_PATH.format(name=name, path=path)
for name, path in paths
)
icons_c.write(ICONS_TEMPLATE_C_ICON_PATHS.format(icon_paths=icon_paths))
icons_c.close()
# Create Public Header
@@ -263,19 +295,9 @@ const size_t ICON_PATHS_COUNT = COUNT_OF(ICON_PATHS);
icons_h.write(ICONS_TEMPLATE_H_HEADER)
for name, width, height, frame_rate, frame_count in icons:
icons_h.write(ICONS_TEMPLATE_H_ICON_NAME.format(name=name))
if is_main_assets:
icons_h.write(
"""
typedef struct {
const Icon* icon;
const char* path;
} IconPath;
extern const IconPath ICON_PATHS[];
extern const size_t ICON_PATHS_COUNT;
"""
)
else:
if self.args.fw_bundle:
icons_h.write(ICONS_TEMPLATE_H_ICON_PATHS)
if self.args.add_include:
icons_h.write("#include <assets_icons.h>\n")
icons_h.close()
self.logger.debug("Done")
+39
View File
@@ -0,0 +1,39 @@
#!/usr/bin/env python3
import pathlib
root = pathlib.Path(__file__).parent / ".."
icons = root / "assets/icons"
def count_icon_usages(name: str):
count = 0
name = name.encode()
# EXTREMELY wasteful, but who cares
for dir in ("applications", "furi", "lib", "targets"):
for filetype in (".c", ".cpp", ".h", ".fam"):
for file in (root / dir).glob(f"**/*{filetype}"):
try:
if name in file.read_bytes():
count += 1
except Exception:
print(f"Failed to read {file}")
return count
if __name__ == "__main__":
counts = {}
for category in icons.iterdir():
if not category.is_dir():
continue
for icon in category.iterdir():
if icon.is_dir() and (icon / "frame_rate").is_file():
name = "A_" + icon.name.replace("-", "_")
elif icon.is_file() and icon.suffix == ".png":
name = "I_" + "_".join(icon.name.split(".")[:-1]).replace("-", "_")
else:
continue
counts[name[2:]] = count_icon_usages(name)
for name, count in sorted(counts.items(), key=lambda x: x[1], reverse=True):
print(f"{name} used {count} times")
+15 -1
View File
@@ -181,7 +181,15 @@ def _proto_ver_generator(target, source, env):
file.write("\n".join(version_file_data))
def CompileIcons(env, target_dir, source_dir, *, icon_bundle_name="assets_icons"):
def CompileIcons(
env,
target_dir,
source_dir,
*,
icon_bundle_name="assets_icons",
fw_bundle=False,
add_include=False,
):
try:
os.mkdir(str(source_dir))
except FileExistsError:
@@ -191,6 +199,8 @@ def CompileIcons(env, target_dir, source_dir, *, icon_bundle_name="assets_icons"
None,
ICON_SRC_DIR=source_dir,
ICON_FILE_NAME=icon_bundle_name,
ICON_FW_BUNDLE=int(fw_bundle),
ICON_ADD_INCLUDE=int(add_include),
)
@@ -223,6 +233,10 @@ def generate(env):
"${TARGET.dir}",
"--filename",
"${ICON_FILE_NAME}",
"--fw-bundle",
"${ICON_FW_BUNDLE}",
"--add-include",
"${ICON_ADD_INCLUDE}",
],
],
"${ICONSCOMSTR}",
+1
View File
@@ -90,6 +90,7 @@ class AppBuilder:
self.app_work_dir,
self.app._appdir.Dir(self.app.fap_icon_assets),
icon_bundle_name=f"{self.app.fap_icon_assets_symbol or self.app.appid }_icons",
add_include=True,
)
self.app_env.Alias("_fap_icons", fap_icons)
self.fw_env.Append(_APP_ICONS=[fap_icons])
+22 -32
View File
@@ -3919,12 +3919,12 @@ Variable,+,I_CC_LefthandedMode_16x16,const Icon,
Variable,+,I_CC_Lock_16x16,const Icon,
Variable,+,I_CC_Momentum_16x16,const Icon,
Variable,+,I_CC_Settings_16x16,const Icon,
Variable,+,I_Certification1_103x56,const Icon,
Variable,+,I_Certification2_46x33,const Icon,
Variable,+,I_CertificationChina0_121x41,const Icon,
Variable,+,I_CertificationChina1_124x47,const Icon,
Variable,+,I_CertificationMexico_98x41,const Icon,
Variable,+,I_CertificationTaiwan_33x32,const Icon,
Variable,-,I_Certification1_103x56,const Icon,
Variable,-,I_Certification2_46x33,const Icon,
Variable,-,I_CertificationChina0_121x41,const Icon,
Variable,-,I_CertificationChina1_124x47,const Icon,
Variable,-,I_CertificationMexico_98x41,const Icon,
Variable,-,I_CertificationTaiwan_33x32,const Icon,
Variable,+,I_Charging_lightning_9x10,const Icon,
Variable,+,I_Charging_lightning_mask_9x10,const Icon,
Variable,+,I_Circles_47x47,const Icon,
@@ -3932,7 +3932,7 @@ Variable,+,I_Clock_18x18,const Icon,
Variable,+,I_Connect_me_62x31,const Icon,
Variable,+,I_Connected_62x31,const Icon,
Variable,+,I_Cos_9x7,const Icon,
Variable,+,I_DFU_128x50,const Icon,
Variable,-,I_DFU_128x50,const Icon,
Variable,+,I_DolphinDone_80x58,const Icon,
Variable,+,I_DolphinMafia_119x62,const Icon,
Variable,+,I_DolphinReadingSuccess_59x63,const Icon,
@@ -3941,7 +3941,7 @@ Variable,+,I_DolphinSuccess_91x55,const Icon,
Variable,+,I_DolphinWait_59x54,const Icon,
Variable,+,I_Drive_112x35,const Icon,
Variable,+,I_Dynamic_9x7,const Icon,
Variable,+,I_Erase_pin_128x64,const Icon,
Variable,-,I_Erase_pin_128x64,const Icon,
Variable,+,I_Error_18x18,const Icon,
Variable,+,I_Error_62x31,const Icon,
Variable,+,I_EviSmile1_18x21,const Icon,
@@ -3975,7 +3975,7 @@ Variable,+,I_Left_mouse_icon_9x9,const Icon,
Variable,+,I_LoadingHourglass_24x24,const Icon,
Variable,+,I_Lock_7x8,const Icon,
Variable,+,I_Lockscreen,const Icon,
Variable,+,I_MFKey_qr_25x25,const Icon,
Variable,-,I_MFKey_qr_25x25,const Icon,
Variable,+,I_MHz_25x11,const Icon,
Variable,+,I_Modern_reader_18x34,const Icon,
Variable,+,I_More_data_placeholder_5x7,const Icon,
@@ -3990,11 +3990,8 @@ Variable,+,I_Percent_10x14,const Icon,
Variable,+,I_Pin_arrow_up_7x9,const Icon,
Variable,+,I_Pin_attention_dpad_29x29,const Icon,
Variable,+,I_Pin_back_arrow_10x8,const Icon,
Variable,+,I_Pin_cell_13x13,const Icon,
Variable,+,I_Pin_pointer_5x3,const Icon,
Variable,+,I_Pin_star_7x7,const Icon,
Variable,+,I_Play_25x27,const Icon,
Variable,+,I_Play_hvr_25x27,const Icon,
Variable,+,I_Pressed_Button_13x13,const Icon,
Variable,+,I_Quest_7x8,const Icon,
Variable,+,I_RFIDDolphinReceive_97x61,const Icon,
@@ -4005,7 +4002,7 @@ Variable,+,I_Release_arrow_18x15,const Icon,
Variable,+,I_Right_mouse_icon_9x9,const Icon,
Variable,+,I_Rpc_active_7x8,const Icon,
Variable,+,I_SDQuestion_35x43,const Icon,
Variable,+,I_SDcardFail_11x8,const Icon,
Variable,-,I_SDcardFail_11x8,const Icon,
Variable,+,I_SDcardMounted_11x8,const Icon,
Variable,+,I_Sats_6x9,const Icon,
Variable,+,I_Scanning_123x52,const Icon,
@@ -4018,15 +4015,15 @@ Variable,+,I_Temperature_16x16,const Icon,
Variable,+,I_Unlock_7x8,const Icon,
Variable,+,I_Unplug_bg_bottom_128x10,const Icon,
Variable,+,I_Unplug_bg_top_128x14,const Icon,
Variable,+,I_Updating_32x40,const Icon,
Variable,+,I_Updating_Logo_62x15,const Icon,
Variable,-,I_Updating_32x40,const Icon,
Variable,-,I_Updating_Logo_62x15,const Icon,
Variable,+,I_UsbTree_48x22,const Icon,
Variable,+,I_Voldwn_6x6,const Icon,
Variable,+,I_Voltage_16x16,const Icon,
Variable,+,I_Volup_8x6,const Icon,
Variable,+,I_WarningDolphinFlip_45x42,const Icon,
Variable,+,I_WarningDolphin_45x42,const Icon,
Variable,+,I_Warning_30x23,const Icon,
Variable,-,I_Warning_30x23,const Icon,
Variable,+,I_Weather_7x8,const Icon,
Variable,+,I_arrow_nano_down,const Icon,
Variable,+,I_arrow_nano_up,const Icon,
@@ -4053,14 +4050,14 @@ Variable,+,I_dry_text_15x5,const Icon,
Variable,+,I_eject_19x20,const Icon,
Variable,+,I_eject_hover_19x20,const Icon,
Variable,+,I_eject_text_19x5,const Icon,
Variable,+,I_err_01,const Icon,
Variable,+,I_err_02,const Icon,
Variable,+,I_err_03,const Icon,
Variable,+,I_err_04,const Icon,
Variable,+,I_err_05,const Icon,
Variable,+,I_err_06,const Icon,
Variable,+,I_err_07,const Icon,
Variable,+,I_err_09,const Icon,
Variable,-,I_err_01,const Icon,
Variable,-,I_err_02,const Icon,
Variable,-,I_err_03,const Icon,
Variable,-,I_err_04,const Icon,
Variable,-,I_err_05,const Icon,
Variable,-,I_err_06,const Icon,
Variable,-,I_err_07,const Icon,
Variable,-,I_err_09,const Icon,
Variable,+,I_exit_19x20,const Icon,
Variable,+,I_exit_hover_19x20,const Icon,
Variable,+,I_exit_text_18x5,const Icon,
@@ -4077,13 +4074,6 @@ Variable,+,I_floppydisk_10px,const Icon,
Variable,+,I_green_19x20,const Icon,
Variable,+,I_green_hover_19x20,const Icon,
Variable,+,I_heat_30x51,const Icon,
Variable,+,I_hourglass0_24x24,const Icon,
Variable,+,I_hourglass1_24x24,const Icon,
Variable,+,I_hourglass2_24x24,const Icon,
Variable,+,I_hourglass3_24x24,const Icon,
Variable,+,I_hourglass4_24x24,const Icon,
Variable,+,I_hourglass5_24x24,const Icon,
Variable,+,I_hourglass6_24x24,const Icon,
Variable,+,I_iButtonDolphinVerySuccess_92x55,const Icon,
Variable,+,I_iButtonKey_49x44,const Icon,
Variable,+,I_ibutt_10px,const Icon,
@@ -4136,7 +4126,7 @@ Variable,+,I_power_text_24x5,const Icon,
Variable,+,I_prev_19x20,const Icon,
Variable,+,I_prev_hover_19x20,const Icon,
Variable,+,I_prev_text_19x5,const Icon,
Variable,+,I_qr_benchmark_25x25,const Icon,
Variable,-,I_qr_benchmark_25x25,const Icon,
Variable,+,I_red_19x20,const Icon,
Variable,+,I_red_hover_19x20,const Icon,
Variable,+,I_rotate_19x20,const Icon,
1 entry status name type params
3919 Variable + I_CC_Lock_16x16 const Icon
3920 Variable + I_CC_Momentum_16x16 const Icon
3921 Variable + I_CC_Settings_16x16 const Icon
3922 Variable + - I_Certification1_103x56 const Icon
3923 Variable + - I_Certification2_46x33 const Icon
3924 Variable + - I_CertificationChina0_121x41 const Icon
3925 Variable + - I_CertificationChina1_124x47 const Icon
3926 Variable + - I_CertificationMexico_98x41 const Icon
3927 Variable + - I_CertificationTaiwan_33x32 const Icon
3928 Variable + I_Charging_lightning_9x10 const Icon
3929 Variable + I_Charging_lightning_mask_9x10 const Icon
3930 Variable + I_Circles_47x47 const Icon
3932 Variable + I_Connect_me_62x31 const Icon
3933 Variable + I_Connected_62x31 const Icon
3934 Variable + I_Cos_9x7 const Icon
3935 Variable + - I_DFU_128x50 const Icon
3936 Variable + I_DolphinDone_80x58 const Icon
3937 Variable + I_DolphinMafia_119x62 const Icon
3938 Variable + I_DolphinReadingSuccess_59x63 const Icon
3941 Variable + I_DolphinWait_59x54 const Icon
3942 Variable + I_Drive_112x35 const Icon
3943 Variable + I_Dynamic_9x7 const Icon
3944 Variable + - I_Erase_pin_128x64 const Icon
3945 Variable + I_Error_18x18 const Icon
3946 Variable + I_Error_62x31 const Icon
3947 Variable + I_EviSmile1_18x21 const Icon
3975 Variable + I_LoadingHourglass_24x24 const Icon
3976 Variable + I_Lock_7x8 const Icon
3977 Variable + I_Lockscreen const Icon
3978 Variable + - I_MFKey_qr_25x25 const Icon
3979 Variable + I_MHz_25x11 const Icon
3980 Variable + I_Modern_reader_18x34 const Icon
3981 Variable + I_More_data_placeholder_5x7 const Icon
3990 Variable + I_Pin_arrow_up_7x9 const Icon
3991 Variable + I_Pin_attention_dpad_29x29 const Icon
3992 Variable + I_Pin_back_arrow_10x8 const Icon
Variable + I_Pin_cell_13x13 const Icon
3993 Variable + I_Pin_pointer_5x3 const Icon
3994 Variable + I_Pin_star_7x7 const Icon
Variable + I_Play_25x27 const Icon
Variable + I_Play_hvr_25x27 const Icon
3995 Variable + I_Pressed_Button_13x13 const Icon
3996 Variable + I_Quest_7x8 const Icon
3997 Variable + I_RFIDDolphinReceive_97x61 const Icon
4002 Variable + I_Right_mouse_icon_9x9 const Icon
4003 Variable + I_Rpc_active_7x8 const Icon
4004 Variable + I_SDQuestion_35x43 const Icon
4005 Variable + - I_SDcardFail_11x8 const Icon
4006 Variable + I_SDcardMounted_11x8 const Icon
4007 Variable + I_Sats_6x9 const Icon
4008 Variable + I_Scanning_123x52 const Icon
4015 Variable + I_Unlock_7x8 const Icon
4016 Variable + I_Unplug_bg_bottom_128x10 const Icon
4017 Variable + I_Unplug_bg_top_128x14 const Icon
4018 Variable + - I_Updating_32x40 const Icon
4019 Variable + - I_Updating_Logo_62x15 const Icon
4020 Variable + I_UsbTree_48x22 const Icon
4021 Variable + I_Voldwn_6x6 const Icon
4022 Variable + I_Voltage_16x16 const Icon
4023 Variable + I_Volup_8x6 const Icon
4024 Variable + I_WarningDolphinFlip_45x42 const Icon
4025 Variable + I_WarningDolphin_45x42 const Icon
4026 Variable + - I_Warning_30x23 const Icon
4027 Variable + I_Weather_7x8 const Icon
4028 Variable + I_arrow_nano_down const Icon
4029 Variable + I_arrow_nano_up const Icon
4050 Variable + I_eject_19x20 const Icon
4051 Variable + I_eject_hover_19x20 const Icon
4052 Variable + I_eject_text_19x5 const Icon
4053 Variable + - I_err_01 const Icon
4054 Variable + - I_err_02 const Icon
4055 Variable + - I_err_03 const Icon
4056 Variable + - I_err_04 const Icon
4057 Variable + - I_err_05 const Icon
4058 Variable + - I_err_06 const Icon
4059 Variable + - I_err_07 const Icon
4060 Variable + - I_err_09 const Icon
4061 Variable + I_exit_19x20 const Icon
4062 Variable + I_exit_hover_19x20 const Icon
4063 Variable + I_exit_text_18x5 const Icon
4074 Variable + I_green_19x20 const Icon
4075 Variable + I_green_hover_19x20 const Icon
4076 Variable + I_heat_30x51 const Icon
Variable + I_hourglass0_24x24 const Icon
Variable + I_hourglass1_24x24 const Icon
Variable + I_hourglass2_24x24 const Icon
Variable + I_hourglass3_24x24 const Icon
Variable + I_hourglass4_24x24 const Icon
Variable + I_hourglass5_24x24 const Icon
Variable + I_hourglass6_24x24 const Icon
4077 Variable + I_iButtonDolphinVerySuccess_92x55 const Icon
4078 Variable + I_iButtonKey_49x44 const Icon
4079 Variable + I_ibutt_10px const Icon
4126 Variable + I_prev_19x20 const Icon
4127 Variable + I_prev_hover_19x20 const Icon
4128 Variable + I_prev_text_19x5 const Icon
4129 Variable + - I_qr_benchmark_25x25 const Icon
4130 Variable + I_red_19x20 const Icon
4131 Variable + I_red_hover_19x20 const Icon
4132 Variable + I_rotate_19x20 const Icon
+1 -1
View File
@@ -35,7 +35,7 @@
"microtar",
"usb_stm32",
"infrared",
"assets",
"fwassets",
"one_wire",
"ibutton",
"music_worker",