From 3ef283824dd37da908b4dab18ec0f064d1f881ea Mon Sep 17 00:00:00 2001 From: WillyJL <49810075+Willy-JL@users.noreply.github.com> Date: Tue, 5 Nov 2024 07:32:24 +0000 Subject: [PATCH] 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 fb23d97952a7f10f263ed8c8b339443d831a5b06. * 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 --- .github/workflows/build.yml | 16 ++- CHANGELOG.md | 7 +- applications/main/nfc/application.fam | 2 +- applications/settings/about/application.fam | 1 + .../power_settings_app/application.fam | 1 + .../settings/storage_settings/application.fam | 1 + applications/system/js_app/application.fam | 2 + assets/SConscript | 26 ++++- assets/icons/Infrared/Play_25x27.png | Bin 137 -> 0 bytes assets/icons/Infrared/Play_hvr_25x27.png | Bin 128 -> 0 bytes assets/icons/Infrared/hourglass0_24x24.png | Bin 138 -> 0 bytes assets/icons/Infrared/hourglass1_24x24.png | Bin 143 -> 0 bytes assets/icons/Infrared/hourglass2_24x24.png | Bin 137 -> 0 bytes assets/icons/Infrared/hourglass3_24x24.png | Bin 136 -> 0 bytes assets/icons/Infrared/hourglass4_24x24.png | Bin 144 -> 0 bytes assets/icons/Infrared/hourglass5_24x24.png | Bin 136 -> 0 bytes assets/icons/Infrared/hourglass6_24x24.png | Bin 145 -> 0 bytes assets/icons/PIN/Pin_cell_13x13.png | Bin 79 -> 0 bytes scripts/assets.py | 92 +++++++++++------- scripts/check_unused_icons.py | 39 ++++++++ scripts/fbt_tools/fbt_assets.py | 16 ++- scripts/fbt_tools/fbt_extapps.py | 1 + targets/f7/api_symbols.csv | 54 +++++----- targets/f7/target.json | 2 +- 24 files changed, 183 insertions(+), 77 deletions(-) delete mode 100644 assets/icons/Infrared/Play_25x27.png delete mode 100644 assets/icons/Infrared/Play_hvr_25x27.png delete mode 100644 assets/icons/Infrared/hourglass0_24x24.png delete mode 100644 assets/icons/Infrared/hourglass1_24x24.png delete mode 100644 assets/icons/Infrared/hourglass2_24x24.png delete mode 100644 assets/icons/Infrared/hourglass3_24x24.png delete mode 100644 assets/icons/Infrared/hourglass4_24x24.png delete mode 100644 assets/icons/Infrared/hourglass5_24x24.png delete mode 100644 assets/icons/Infrared/hourglass6_24x24.png delete mode 100644 assets/icons/PIN/Pin_cell_13x13.png create mode 100755 scripts/check_unused_icons.py diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d221e9524..fcad25108 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -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 diff --git a/CHANGELOG.md b/CHANGELOG.md index 12b5fea2b..ab9defb1f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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) diff --git a/applications/main/nfc/application.fam b/applications/main/nfc/application.fam index 13c26b7aa..3878fc2e8 100644 --- a/applications/main/nfc/application.fam +++ b/applications/main/nfc/application.fam @@ -13,7 +13,7 @@ App( "!plugins", "!nfc_cli.c", ], - fap_libs=["mbedtls"], + fap_libs=["assets", "mbedtls"], fap_icon="icon.png", fap_category="NFC", ) diff --git a/applications/settings/about/application.fam b/applications/settings/about/application.fam index 055933544..e7b474c22 100644 --- a/applications/settings/about/application.fam +++ b/applications/settings/about/application.fam @@ -12,4 +12,5 @@ App( stack_size=1 * 1024, order=1000, fap_category="assets", + fap_libs=["assets"], ) diff --git a/applications/settings/power_settings_app/application.fam b/applications/settings/power_settings_app/application.fam index 65f90b14f..23cfdfabc 100644 --- a/applications/settings/power_settings_app/application.fam +++ b/applications/settings/power_settings_app/application.fam @@ -12,4 +12,5 @@ App( stack_size=1 * 1024, order=40, fap_category="assets", + fap_libs=["assets"], ) diff --git a/applications/settings/storage_settings/application.fam b/applications/settings/storage_settings/application.fam index eba847ddb..560f1f56c 100644 --- a/applications/settings/storage_settings/application.fam +++ b/applications/settings/storage_settings/application.fam @@ -8,4 +8,5 @@ App( stack_size=2 * 1024, order=30, fap_category="assets", + fap_libs=["assets"], ) diff --git a/applications/system/js_app/application.fam b/applications/system/js_app/application.fam index 988fedb03..6d2b4fe80 100644 --- a/applications/system/js_app/application.fam +++ b/applications/system/js_app/application.fam @@ -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( diff --git a/assets/SConscript b/assets/SConscript index a5454fffa..7aefdc0a5 100644 --- a/assets/SConscript +++ b/assets/SConscript @@ -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"]: diff --git a/assets/icons/Infrared/Play_25x27.png b/assets/icons/Infrared/Play_25x27.png deleted file mode 100644 index f1064d7b164140b9fc048e77956ad9c8789728f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^l0YoY2qYL5MoAt8QURVWjv*CuSPvfLZ3^QQF_ZuR diff --git a/assets/icons/Infrared/Play_hvr_25x27.png b/assets/icons/Infrared/Play_hvr_25x27.png deleted file mode 100644 index fa234ba172fb30e69115683a9d374e1406387c8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^l0YoY2qYL5MoAt8QtqBEjv*CuLeFdzY*1i0df|Dw zpnIW-Te67Tf+ZggFi8h5IptbB%_Ml$)5T8Be9Uq)HgLG^NWI>jzopr01!_wxc~qF diff --git a/assets/icons/Infrared/hourglass1_24x24.png b/assets/icons/Infrared/hourglass1_24x24.png deleted file mode 100644 index ef048a7bdab260080ce7c6458fc4c9a3a946a57d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^5+KY7Bp6QcFoXiBFi#i9kcv5~CpQYZ28g&`tX(I4 zxj}NPhOhSij`>21m>cDKIwU{$9q^jY6Jrwj(_>}uMG*%BfiFwybpJ`e=gZn>&1p6% qHE`$i1XYQ^i$|QNe>>=^e3<*0tjyFa!Eb(mZ1QyVb6Mw<&;$UKTroNT diff --git a/assets/icons/Infrared/hourglass2_24x24.png b/assets/icons/Infrared/hourglass2_24x24.png deleted file mode 100644 index 918bd79d869be1a4d5a2c6689cc237033ba408ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^5+KY7Bp6QcFoXiB08bakkcv6FCpHQ?1cFDRxUX)i z(=g?!M9WD9q2LX!E>oGFYBU@=J2`cM;nIVqo{_Pt4fd6+`FutPfBbYUP}1N0>tgfY i+TC2{mN%y!Q#s6R(=72Xy)At&$O=zaKbLh*2~7ZC9xhq{ diff --git a/assets/icons/Infrared/hourglass4_24x24.png b/assets/icons/Infrared/hourglass4_24x24.png deleted file mode 100644 index 7ed58a5b4b0e92001f865ceb21af031bc7d8ea38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^5+KY7Bp6QcFoXiBa8DPW0o68rx#%5Z6MpZT}^1js5+S3j3^P6TPj=N$AxAsa*?OUm95H&5xM88q +#include #include """ 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 \n") icons_h.close() self.logger.debug("Done") diff --git a/scripts/check_unused_icons.py b/scripts/check_unused_icons.py new file mode 100755 index 000000000..0f7967db3 --- /dev/null +++ b/scripts/check_unused_icons.py @@ -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") diff --git a/scripts/fbt_tools/fbt_assets.py b/scripts/fbt_tools/fbt_assets.py index 012ff5329..b3e70ab05 100644 --- a/scripts/fbt_tools/fbt_assets.py +++ b/scripts/fbt_tools/fbt_assets.py @@ -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}", diff --git a/scripts/fbt_tools/fbt_extapps.py b/scripts/fbt_tools/fbt_extapps.py index da5e272a8..26b1025d9 100644 --- a/scripts/fbt_tools/fbt_extapps.py +++ b/scripts/fbt_tools/fbt_extapps.py @@ -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]) diff --git a/targets/f7/api_symbols.csv b/targets/f7/api_symbols.csv index af8ab3f60..cd892e373 100644 --- a/targets/f7/api_symbols.csv +++ b/targets/f7/api_symbols.csv @@ -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, diff --git a/targets/f7/target.json b/targets/f7/target.json index c5a65704a..810c76d95 100644 --- a/targets/f7/target.json +++ b/targets/f7/target.json @@ -35,7 +35,7 @@ "microtar", "usb_stm32", "infrared", - "assets", + "fwassets", "one_wire", "ibutton", "music_worker",