فهرست منبع

[FL-2052] New build system based on scons (#1269)

hedger 3 سال پیش
والد
کامیت
f3b1475ede
100فایلهای تغییر یافته به همراه1580 افزوده شده و 3265 حذف شده
  1. 4 20
      .github/workflows/build.yml
  2. 1 1
      .github/workflows/lint_c.yml
  3. 8 0
      .gitignore
  4. 3 0
      .gitmodules
  5. 0 2
      Brewfile
  6. 1 1
      CODING_STYLE.md
  7. 21 157
      Makefile
  8. 12 16
      ReadMe.md
  9. 150 0
      SConstruct
  10. 0 3
      applications/ReadMe.md
  11. 9 3
      applications/about/about.c
  12. 13 0
      applications/about/application.fam
  13. 10 0
      applications/accessor/application.fam
  14. 0 549
      applications/applications.c
  15. 0 353
      applications/applications.mk
  16. 11 0
      applications/archive/application.fam
  17. 14 0
      applications/bad_usb/application.fam
  18. 66 0
      applications/bt/application.fam
  19. 9 0
      applications/cli/application.fam
  20. 6 0
      applications/crypto/application.fam
  21. 115 0
      applications/debug_tools/application.fam
  22. 30 0
      applications/desktop/application.fam
  23. 7 3
      applications/desktop/views/desktop_view_debug.c
  24. 10 0
      applications/dialogs/application.fam
  25. 23 0
      applications/dolphin/application.fam
  26. 57 0
      applications/extapps.scons
  27. 11 0
      applications/gpio/application.fam
  28. 13 0
      applications/gui/application.fam
  29. 23 0
      applications/ibutton/application.fam
  30. 23 0
      applications/infrared/application.fam
  31. 9 0
      applications/input/application.fam
  32. 26 0
      applications/lfrfid/application.fam
  33. 12 0
      applications/lfrfid_debug/application.fam
  34. 10 0
      applications/loader/application.fam
  35. 41 0
      applications/meta/application.fam
  36. 22 0
      applications/music_player/application.fam
  37. 23 0
      applications/nfc/application.fam
  38. 21 0
      applications/notification/application.fam
  39. 53 0
      applications/power/application.fam
  40. 12 0
      applications/rpc/application.fam
  41. 6 34
      applications/rpc/rpc_storage.c
  42. 11 0
      applications/snake_game/application.fam
  43. 19 0
      applications/storage/application.fam
  44. 9 0
      applications/storage_settings/application.fam
  45. 24 0
      applications/subghz/application.fam
  46. 1 1
      applications/subghz/scenes/subghz_scene_save_success.c
  47. 9 0
      applications/system/application.fam
  48. 14 0
      applications/u2f/application.fam
  49. 18 0
      applications/unit_tests/application.fam
  50. 13 8
      applications/unit_tests/rpc/rpc_test.c
  51. 1 1
      applications/unit_tests/test_index.c
  52. 39 0
      applications/updater/application.fam
  53. 0 48
      assets/Makefile
  54. 4 5
      assets/ReadMe.md
  55. 113 0
      assets/SConscript
  56. 0 32
      assets/assets.mk
  57. 0 18
      assets/compiled/application.pb.c
  58. 0 79
      assets/compiled/application.pb.h
  59. 0 330
      assets/compiled/assets_dolphin_blocking.c
  60. 0 7
      assets/compiled/assets_dolphin_blocking.h
  61. 0 8
      assets/compiled/assets_dolphin_internal.c
  62. 0 7
      assets/compiled/assets_dolphin_internal.h
  63. 0 11
      assets/compiled/assets_icons.c
  64. 0 178
      assets/compiled/assets_icons.h
  65. 0 19
      assets/compiled/flipper.pb.c
  66. 0 302
      assets/compiled/flipper.pb.h
  67. 0 29
      assets/compiled/gui.pb.c
  68. 0 152
      assets/compiled/gui.pb.h
  69. 0 3
      assets/compiled/protobuf_version.h
  70. 0 61
      assets/compiled/storage.pb.c
  71. 0 328
      assets/compiled/storage.pb.h
  72. 0 62
      assets/compiled/system.pb.c
  73. 0 342
      assets/compiled/system.pb.h
  74. 0 14
      assets/copro.mk
  75. BIN
      assets/icons/About/Certification1_103x23.png
  76. BIN
      assets/icons/About/Certification1_103x56.png
  77. BIN
      assets/icons/About/Certification2_119x30.png
  78. BIN
      assets/icons/About/Certification2_98x33.png
  79. BIN
      assets/icons/Archive/back_10px.png
  80. BIN
      assets/icons/Common/Loading_24/frame_01.png
  81. BIN
      assets/icons/Common/Loading_24/frame_02.png
  82. BIN
      assets/icons/Common/Loading_24/frame_03.png
  83. BIN
      assets/icons/Common/Loading_24/frame_04.png
  84. BIN
      assets/icons/Common/Loading_24/frame_05.png
  85. BIN
      assets/icons/Common/Loading_24/frame_06.png
  86. BIN
      assets/icons/Common/Loading_24/frame_07.png
  87. BIN
      assets/icons/Dolphin/DolphinFirstStart5_54x49.png
  88. 0 3
      assets/splash.mk
  89. 13 0
      core/SConscript
  90. 0 8
      core/core.mk
  91. 4 3
      docker/Dockerfile
  92. 3 0
      documentation/AppManifests.md
  93. 3 3
      documentation/OTA.md
  94. 77 0
      documentation/fbt.md
  95. 12 0
      fbt
  96. 8 0
      fbt.cmd
  97. 72 0
      fbt_options.py
  98. 227 0
      firmware.scons
  99. 0 27
      firmware/Makefile
  100. 1 34
      firmware/ReadMe.md

+ 4 - 20
.github/workflows/build.yml

@@ -71,14 +71,6 @@ jobs:
         run: |
           tar czpf artifacts/flipper-z-any-scripts-${{steps.names.outputs.suffix}}.tgz scripts
 
-      - name: 'Rebuild Assets'
-        uses: ./.github/actions/docker
-        with:
-          run: |
-            set -e
-            make assets_rebuild assets_manifest
-            git diff --quiet || ( echo "Assets recompilation required."; exit 255 )
-
       - name: 'Build the firmware in docker'
         uses: ./.github/actions/docker
         with:
@@ -86,7 +78,7 @@ jobs:
             set -e
             for TARGET in ${TARGETS}
             do
-              make updater_package TARGET=${TARGET} ${{ startsWith(github.ref, 'refs/tags') && 'DEBUG=0 COMPACT=1' || '' }}
+              ./fbt TARGET_HW=`echo ${TARGET} | sed 's/f//'` --with-updater updater_package ${{ startsWith(github.ref, 'refs/tags') && 'DEBUG=0 COMPACT=1' || '' }}
             done
 
       - name: 'Move upload files'
@@ -97,7 +89,7 @@ jobs:
             set -e
             for TARGET in ${TARGETS}
             do
-              mv dist/${TARGET}/* artifacts/
+              mv dist/${TARGET}-*/* artifacts/
             done
 
       - name: 'Bundle self-update package'
@@ -124,7 +116,7 @@ jobs:
         uses: ./.github/actions/docker
         with:
           run: |
-            make -C assets copro_bundle
+            ./fbt copro_dist
             tar czpf artifacts/flipper-z-any-core2_firmware-${{steps.names.outputs.suffix}}.tgz -C assets core2_firmware
 
       - name: 'Upload artifacts to update server'
@@ -208,14 +200,6 @@ jobs:
           echo "WORKFLOW_BRANCH_OR_TAG=${BRANCH_OR_TAG}" >> $GITHUB_ENV
           echo "DIST_SUFFIX=${SUFFIX}" >> $GITHUB_ENV
 
-      - name: 'Rebuild Assets'
-        uses: ./.github/actions/docker
-        with:
-          run: |
-            set -e
-            make assets_rebuild assets_manifest
-            git diff --quiet || ( echo "Assets recompilation required."; exit 255 )
-
       - name: 'Build the firmware in docker'
         uses: ./.github/actions/docker
         with:
@@ -223,5 +207,5 @@ jobs:
             set -e
             for TARGET in ${TARGETS}
             do
-              make TARGET=${TARGET} DEBUG=0 COMPACT=1
+              ./fbt TARGET_HW=`echo ${TARGET} | sed 's/f//'` --with-updater updater_package DEBUG=0 COMPACT=1
             done

+ 1 - 1
.github/workflows/lint_c.yml

@@ -47,7 +47,7 @@ jobs:
         id: syntax_check
         uses: ./.github/actions/docker
         with:
-          run: SET_GH_OUTPUT=1 make lint
+          run: SET_GH_OUTPUT=1 ./fbt lint
 
       - name: Report code formatting errors
         if: failure() && steps.syntax_check.outputs.errors && github.event.pull_request

+ 8 - 0
.gitignore

@@ -39,3 +39,11 @@ dist
 
 # kde
 .directory
+
+# SCons
+.sconsign.dblite
+# SCons build dir
+build/
+
+# Toolchain
+toolchain*/

+ 3 - 0
.gitmodules

@@ -22,3 +22,6 @@
 [submodule "lib/microtar"]
 	path = lib/microtar
 	url = https://github.com/amachronic/microtar.git
+[submodule "lib/scons"]
+	path = lib/scons
+	url = https://github.com/SCons/scons.git

+ 0 - 2
Brewfile

@@ -1,8 +1,6 @@
 cask "gcc-arm-embedded"
 brew "protobuf"
 brew "gdb"
-brew "heatshrink"
 brew "open-ocd"
 brew "clang-format"
 brew "dfu-util"
-brew "imagemagick"

+ 1 - 1
CODING_STYLE.md

@@ -48,7 +48,7 @@ Almost everything in flipper firmware is built around this concept.
 # C coding style
 
 - Tab is 4 spaces
-- Use `make format` to reformat source code and check style guide before commit
+- Use `fbt format` to reformat source code and check style guide before commit
 
 ## Naming
 

+ 21 - 157
Makefile

@@ -1,157 +1,21 @@
-PROJECT_ROOT := $(abspath $(dir $(abspath $(firstword $(MAKEFILE_LIST)))))
-
-include			$(PROJECT_ROOT)/make/git.mk
-include			$(PROJECT_ROOT)/assets/copro.mk
-include			$(PROJECT_ROOT)/assets/splash.mk
-
-PROJECT_SOURCE_DIRECTORIES := \
-	$(PROJECT_ROOT)/applications \
-	$(PROJECT_ROOT)/core \
-	$(PROJECT_ROOT)/firmware/targets \
-	$(PROJECT_ROOT)/lib/app-template \
-	$(PROJECT_ROOT)/lib/app-scened-template \
-	$(PROJECT_ROOT)/lib/common-api \
-	$(PROJECT_ROOT)/lib/drivers \
-	$(PROJECT_ROOT)/lib/flipper_file \
-	$(PROJECT_ROOT)/lib/infrared \
-	$(PROJECT_ROOT)/lib/nfc_protocols \
-	$(PROJECT_ROOT)/lib/ST25RFAL002 \
-	$(PROJECT_ROOT)/lib/onewire \
-	$(PROJECT_ROOT)/lib/qrcode \
-	$(PROJECT_ROOT)/lib/subghz \
-	$(PROJECT_ROOT)/lib/toolbox \
-	$(PROJECT_ROOT)/lib/u8g2
-
-NPROCS := 3
-OS := $(shell uname -s)
-
-ifeq ($(OS), Linux)
-NPROCS := $(shell grep -c ^processor /proc/cpuinfo)
-else ifeq ($(OS), Darwin)
-NPROCS := $(shell sysctl -n hw.ncpu)
-endif
-
-include	$(PROJECT_ROOT)/make/defaults.mk
-
-.PHONY: all
-all: firmware_all
-	@$(PROJECT_ROOT)/scripts/dist.py copy -t $(TARGET) -p firmware -s $(DIST_SUFFIX)
-
-.PHONY: whole
-whole: flash_radio firmware_flash
-
-.PHONY: clean
-clean: firmware_clean updater_clean
-	@rm -rf $(PROJECT_ROOT)/dist/$(TARGET)
-
-.PHONY: flash
-flash: firmware_flash
-
-.PHONY: debug
-debug:
-	@$(MAKE) -C firmware -j$(NPROCS) debug
-
-.PHONY: debug_other
-debug_other:
-	@$(MAKE) -C firmware -j$(NPROCS) debug_other
-
-.PHONY: blackmagic
-blackmagic:
-	@$(MAKE) -C firmware -j$(NPROCS) blackmagic
-
-.PHONY: wipe
-wipe:
-	@$(PROJECT_ROOT)/scripts/flash.py wipe
-	@$(PROJECT_ROOT)/scripts/ob.py set
-
-.PHONY: firmware_all
-firmware_all:
-	@$(MAKE) -C $(PROJECT_ROOT)/firmware -j$(NPROCS) all
-
-.PHONY: firmware_clean
-firmware_clean:
-	@$(MAKE) -C $(PROJECT_ROOT)/firmware -j$(NPROCS) clean
-
-.PHONY: firmware_flash
-firmware_flash:
-ifeq ($(FORCE), 1)
-	@rm $(PROJECT_ROOT)/firmware/.obj/f*-firmware/flash || true
-endif
-	@$(MAKE) -C $(PROJECT_ROOT)/firmware -j$(NPROCS) flash
-
-.PHONY: updater
-updater:
-	@$(MAKE) -C $(PROJECT_ROOT)/firmware -j$(NPROCS) RAM_EXEC=1 all
-
-.PHONY: updater_clean
-updater_clean:
-	@$(MAKE) -C $(PROJECT_ROOT)/firmware -j$(NPROCS) RAM_EXEC=1 clean
-
-.PHONY: updater_debug
-updater_debug:
-	@$(MAKE) -C $(PROJECT_ROOT)/firmware -j$(NPROCS) RAM_EXEC=1 debug
-
-.PHONY: updater_package_bin
-updater_package_bin: firmware_all updater
-	@$(PROJECT_ROOT)/scripts/dist.py copy -t $(TARGET) -p firmware updater -s $(DIST_SUFFIX) --bundlever "$(VERSION_STRING)"
-
-.PHONY: updater_package
-updater_package: firmware_all updater assets_manifest
-	@$(PROJECT_ROOT)/scripts/dist.py copy \
-	-t $(TARGET) -p firmware updater \
-	-s $(DIST_SUFFIX) -r $(PROJECT_ROOT)/assets/resources \
-	--bundlever "$(VERSION_STRING)" \
-	--radio $(COPRO_STACK_BIN_PATH) \
-	--radiotype $(COPRO_STACK_TYPE) \
-	$(COPRO_DISCLAIMER) \
-	--obdata $(PROJECT_ROOT)/scripts/$(COPRO_OB_DATA) \
-	--splash $(UPDATER_SPLASH_DIR)
-
-.PHONY: assets_manifest
-assets_manifest:
-	@$(MAKE) -C $(PROJECT_ROOT)/assets manifest
-
-.PHONY: assets_rebuild
-assets_rebuild:
-	@$(MAKE) -C $(PROJECT_ROOT)/assets clean all
-
-.PHONY: flash_radio
-flash_radio:
-	@$(PROJECT_ROOT)/scripts/flash.py core2radio $(COPRO_STACK_BIN_PATH) --addr=$(COPRO_STACK_ADDR)
-	@$(PROJECT_ROOT)/scripts/ob.py set
-
-.PHONY: flash_radio_fus
-flash_radio_fus:
-	@echo
-	@echo "================   DON'T DO IT    ================"
-	@echo "= Flashing FUS is going to erase secure enclave  ="
-	@echo "= You will lose ability to use encrypted assets  ="
-	@echo "=       type 'find / -exec rm -rf {} \;'         ="
-	@echo "=     In case if you still want to continue      ="
-	@echo "================    JUST DON'T    ================"
-	@echo
-
-.PHONY: flash_radio_fus_please_i_m_not_going_to_complain
-flash_radio_fus_please_i_m_not_going_to_complain:
-	@$(PROJECT_ROOT)/scripts/flash.py core2fus 0x080EC000 --statement=AGREE_TO_LOSE_FLIPPER_FEATURES_THAT_USE_CRYPTO_ENCLAVE $(COPRO_FIRMWARE_DIR)/stm32wb5x_FUS_fw_for_fus_0_5_3.bin
-	@$(PROJECT_ROOT)/scripts/flash.py core2fus 0x080EC000 --statement=AGREE_TO_LOSE_FLIPPER_FEATURES_THAT_USE_CRYPTO_ENCLAVE $(COPRO_FIRMWARE_DIR)/stm32wb5x_FUS_fw.bin
-	@$(PROJECT_ROOT)/scripts/ob.py set
-
-.PHONY: lint
-lint:
-	@echo "Checking source code formatting"
-	@$(PROJECT_ROOT)/scripts/lint.py check $(PROJECT_SOURCE_DIRECTORIES)
-
-.PHONY: format
-format:
-	@echo "Reformating sources code"
-	@$(PROJECT_ROOT)/scripts/lint.py format $(PROJECT_SOURCE_DIRECTORIES)
-
-.PHONY: guruguru
-guruguru:
-	@echo "ぐるぐる回る"
-	@$(PROJECT_ROOT)/scripts/guruguru.py $(PROJECT_ROOT)
-
-.PHONY: generate_compile_db
-generate_compile_db:
-	@$(MAKE) -C $(PROJECT_ROOT)/firmware -j$(NPROCS) generate_compile_db
+$(info +-------------------------------------------------+)
+$(info |                                                 |)
+$(info |      Hello, this is Flipper team speaking!      |)
+$(info |                                                 |)
+$(info |       We've migrated to new build system        |)
+$(info |          It's nice and based on scons           |)
+$(info |                                                 |)
+$(info |      Crash course:                              |)
+$(info |                                                 |)
+$(info |        `./fbt`                                  |)
+$(info |        `./fbt flash`                            |)
+$(info |        `./fbt debug`                            |)
+$(info |                                                 |)
+$(info |      More details in documentation/fbt.md       |)
+$(info |                                                 |)
+$(info |      Also Please leave your feedback here:      |)
+$(info |           https://flipp.dev/4RDu                |)
+$(info |                      or                         |)
+$(info |           https://flipp.dev/2XM8                |)
+$(info |                                                 |)
+$(info +-------------------------------------------------+)

+ 12 - 16
ReadMe.md

@@ -25,6 +25,12 @@ Flipper Zero's firmware consists of two components:
 
 They both must be flashed in order described.
 
+## With offline update package
+
+`./fbt --with-updater updater_package`
+
+Copy the resulting directory to Flipper's SD card and navigate to `update.fuf` file in Archive app. 
+
 ## With STLink
 
 ### Core1 Firmware
@@ -36,17 +42,7 @@ Prerequisites:
 - [arm-gcc-none-eabi](https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads)
 - openocd
 
-One liner: `make flash`
-
-### Core2 flashing procedures
-
-Prerequisites:
-
-- Linux / macOS
-- Terminal
-- STM32_Programmer_CLI (v2.5.0) added to $PATH
-
-One liner: `make flash_radio`
+One liner: `./fbt firmware_flash`
 
 ## With USB DFU 
 
@@ -56,7 +52,6 @@ One liner: `make flash_radio`
  - Press and hold `← Left` + `↩ Back` for reset 
  - Release `↩ Back` and keep holding `← Left` until blue LED lights up
  - Release `← Left`
-<!-- ![Switch to DFU sequence](https://habrastorage.org/webt/uu/c3/g2/uuc3g2n36f2sju19rskcvjzjf6w.png) -->
 
 3. Run `dfu-util -D full.dfu -a 0`
 
@@ -74,7 +69,7 @@ One liner: `make flash_radio`
 ## Compile everything
 
 ```sh
-docker-compose exec dev make
+docker-compose exec dev ./fbt
 ```
 
 Check `dist/` for build outputs.
@@ -85,6 +80,8 @@ If compilation fails, make sure all submodules are all initialized. Either clone
 
 # Build on Linux/macOS
 
+Check out `documentation/fbt.md` for details on building and flashing firmware. 
+
 ## macOS Prerequisites
 
 Make sure you have [brew](https://brew.sh) and install all the dependencies:
@@ -127,7 +124,7 @@ heatshrink has to be compiled [from sources](https://github.com/atomicobject/hea
 ## Compile everything
 
 ```sh
-make
+./fbt
 ```
 
 Check `dist/` for build outputs.
@@ -138,7 +135,7 @@ Use **`flipper-z-{target}-full-{suffix}.dfu`** to flash your device.
 
 Connect your device via ST-Link and run:
 ```sh
-make whole
+./fbt firmware_flash
 ```
 
 # Links
@@ -158,7 +155,6 @@ make whole
 - `documentation`   - Documentation generation system configs and input files
 - `firmware`        - Firmware source code
 - `lib`             - Our and 3rd party libraries, drivers and etc...
-- `make`            - Make helpers
 - `scripts`         - Supplementary scripts and python libraries home
 
 Also pay attention to `ReadMe.md` files inside of those directories.

+ 150 - 0
SConstruct

@@ -0,0 +1,150 @@
+#
+# Main Fipper Build System entry point
+#
+# This file is evaluated by scons (the build system) every time fbt is invoked.
+# Scons constructs all referenced environments & their targets' dependency
+# trees on startup. So, to keep startup time as low as possible, we're hiding
+# construction of certain targets behind command-line options.
+
+import os
+
+DefaultEnvironment(tools=[])
+# Progress(["OwO\r", "owo\r", "uwu\r", "owo\r"], interval=15)
+
+
+# This environment is created only for loading options & validating file/dir existance
+fbt_variables = SConscript("site_scons/commandline.scons")
+cmd_environment = Environment(tools=[], variables=fbt_variables)
+Help(fbt_variables.GenerateHelpText(cmd_environment))
+
+
+# Building basic environment - tools, utility methods, cross-compilation
+# settings, gcc flags for Cortex-M4, basic builders and more
+coreenv = SConscript(
+    "site_scons/environ.scons",
+    exports={"VAR_ENV": cmd_environment},
+)
+SConscript("site_scons/cc.scons", exports={"ENV": coreenv})
+
+# Store root dir in environment for certain tools
+coreenv["ROOT_DIR"] = Dir(".")
+
+# Create a separate "dist" environment and add construction envs to it
+distenv = coreenv.Clone(
+    tools=["fbt_dist", "openocd"],
+    GDBOPTS="-ex 'target extended-remote | ${OPENOCD} -c \"gdb_port pipe\" ${OPENOCD_OPTS}' "
+    '-ex "set confirm off" ',
+    ENV=os.environ,
+)
+
+firmware_out = distenv.AddFwProject(
+    base_env=coreenv,
+    fw_type="firmware",
+    fw_env_key="FW_ENV",
+)
+
+
+# If enabled, initialize updater-related targets
+if GetOption("fullenv"):
+    updater_out = distenv.AddFwProject(
+        base_env=coreenv,
+        fw_type="updater",
+        fw_env_key="UPD_ENV",
+    )
+
+    # Target for self-update package
+    dist_arguments = [
+        "-r",
+        '"${ROOT_DIR.abspath}/assets/resources"',
+        "--bundlever",
+        '"${UPDATE_VERSION_STRING}"',
+        "--radio",
+        '"${ROOT_DIR.abspath}/${COPRO_STACK_BIN_DIR}/${COPRO_STACK_BIN}"',
+        "--radiotype",
+        "${COPRO_STACK_TYPE}",
+        "${COPRO_DISCLAIMER}",
+        "--obdata",
+        '"${ROOT_DIR.abspath}/${COPRO_OB_DATA}"',
+    ]
+    if distenv["UPDATE_SPLASH"]:
+        dist_arguments += [
+            "--splash",
+            distenv.subst("assets/slideshow/$UPDATE_SPLASH"),
+        ]
+    selfupdate_dist = distenv.DistBuilder(
+        "selfupdate.pseudo",
+        (distenv["DIST_DEPENDS"], firmware_out["FW_RESOURCES"]),
+        DIST_EXTRA=dist_arguments,
+    )
+    distenv.Pseudo("selfupdate.pseudo")
+    AlwaysBuild(selfupdate_dist)
+    Alias("updater_package", selfupdate_dist)
+
+    # Updater debug
+    debug_updater_elf = distenv.AddDebugTarget(updater_out, False)
+    Alias("updater_debug", debug_updater_elf)
+
+
+# Target for copying & renaming binaries to dist folder
+basic_dist = distenv.DistBuilder("dist.pseudo", distenv["DIST_DEPENDS"])
+distenv.Pseudo("dist.pseudo")
+AlwaysBuild(basic_dist)
+Alias("fw_dist", basic_dist)
+Default(basic_dist)
+
+# Target for bundling core2 package for qFlipper
+copro_dist = distenv.CoproBuilder(
+    Dir("assets/core2_firmware"),
+    [],
+)
+AlwaysBuild(copro_dist)
+Alias("copro_dist", copro_dist)
+
+
+# Debugging firmware
+
+debug_fw_elf = distenv.AddDebugTarget(firmware_out)
+Alias("debug", debug_fw_elf)
+
+
+# Debug alien elf
+debug_other = distenv.GDBPy(
+    "debugother.pseudo",
+    None,
+    GDBPYOPTS=
+    # '-ex "source ${ROOT_DIR.abspath}/debug/FreeRTOS/FreeRTOS.py" '
+    '-ex "source debug/PyCortexMDebug/PyCortexMDebug.py" '
+)
+distenv.Pseudo("debugother.pseudo")
+AlwaysBuild(debug_other)
+Alias("debug_other", debug_other)
+
+
+# Just start OpenOCD
+openocd = distenv.OOCDCommand("openocd.pseudo", [])
+distenv.Pseudo("openocd.pseudo")
+AlwaysBuild(openocd)
+Alias("openocd", openocd)
+
+
+# Linter
+lint_check = distenv.Command(
+    "lint.check.pseudo",
+    [],
+    "${PYTHON3} scripts/lint.py check $LINT_SOURCES",
+    LINT_SOURCES=firmware_out["LINT_SOURCES"],
+)
+distenv.Pseudo("lint.check.pseudo")
+AlwaysBuild(lint_check)
+Alias("lint", lint_check)
+
+
+lint_format = distenv.Command(
+    "lint.format.pseudo",
+    [],
+    "${PYTHON3} scripts/lint.py format $LINT_SOURCES",
+    LINT_SOURCES=firmware_out["LINT_SOURCES"],
+)
+distenv.Pseudo("lint.format.pseudo")
+AlwaysBuild(lint_format)
+Alias("format", lint_format)

+ 0 - 3
applications/ReadMe.md

@@ -16,7 +16,6 @@
 - `ibutton`             - iButton application, onewire keys and more
 - `input`               - Input service
 - `infrared`            - Infrared application, controls your IR devices
-- `infrared_monitor`    - Infrared debug tool
 - `lfrfid`              - LF RFID application
 - `lfrfid_debug`        - LF RFID debug tool
 - `loader`              - Application loader service
@@ -36,6 +35,4 @@
 - `u2f`                 - U2F Application
 - `updater`             - Update service & application
 
-- `application.c`       - Firmware application list source
 - `application.h`       - Firmware application list header
-- `application.mk`      - Makefile helper

+ 9 - 3
applications/about/about.c

@@ -5,6 +5,7 @@
 #include <gui/modules/empty_screen.h>
 #include <m-string.h>
 #include <furi_hal_version.h>
+#include <furi_hal_bt.h>
 
 typedef DialogMessageButton (*AboutDialogScreen)(DialogsApp* dialogs, DialogMessage* message);
 
@@ -57,7 +58,7 @@ static DialogMessageButton compliance_screen(DialogsApp* dialogs, DialogMessage*
 static DialogMessageButton icon1_screen(DialogsApp* dialogs, DialogMessage* message) {
     DialogMessageButton result;
 
-    dialog_message_set_icon(message, &I_Certification1_103x23, 12, 12);
+    dialog_message_set_icon(message, &I_Certification1_103x56, 13, 0);
     result = dialog_message_show(dialogs, message);
     dialog_message_set_icon(message, NULL, 0, 0);
 
@@ -67,7 +68,7 @@ static DialogMessageButton icon1_screen(DialogsApp* dialogs, DialogMessage* mess
 static DialogMessageButton icon2_screen(DialogsApp* dialogs, DialogMessage* message) {
     DialogMessageButton result;
 
-    dialog_message_set_icon(message, &I_Certification2_119x30, 4, 9);
+    dialog_message_set_icon(message, &I_Certification2_98x33, 15, 10);
     result = dialog_message_show(dialogs, message);
     dialog_message_set_icon(message, NULL, 0, 0);
 
@@ -111,18 +112,23 @@ static DialogMessageButton fw_version_screen(DialogsApp* dialogs, DialogMessage*
     string_t buffer;
     string_init(buffer);
     const Version* ver = furi_hal_version_get_firmware_version();
+    const BleGlueC2Info* c2_ver = NULL;
+#ifdef SRV_BT
+    c2_ver = ble_glue_get_c2_info();
+#endif
 
     if(!ver) {
         string_cat_printf(buffer, "No info\n");
     } else {
         string_cat_printf(
             buffer,
-            "%s [%s]\n%s%s [%s]\n[%d] %s",
+            "%s [%s]\n%s%s [%s] %s\n[%d] %s",
             version_get_version(ver),
             version_get_builddate(ver),
             version_get_dirty_flag(ver) ? "[!] " : "",
             version_get_githash(ver),
             version_get_gitbranchnum(ver),
+            c2_ver ? c2_ver->StackTypeString : "<none>",
             version_get_target(ver),
             version_get_gitbranch(ver));
     }

+ 13 - 0
applications/about/application.fam

@@ -0,0 +1,13 @@
+App(
+    appid="about",
+    name="About",
+    apptype=FlipperAppType.SETTINGS,
+    entry_point="about_settings_app",
+    cdefines=["APP_ABOUT"],
+    requires=[
+        "gui",
+        "dialogs",
+    ],
+    stack_size=1 * 1024,
+    order=1000,
+)

+ 10 - 0
applications/accessor/application.fam

@@ -0,0 +1,10 @@
+App(
+    appid="accessor",
+    name="Accessor",
+    apptype=FlipperAppType.DEBUG,
+    entry_point="accessor_app",
+    cdefines=["APP_ACCESSOR"],
+    requires=["gui"],
+    stack_size=4 * 1024,
+    order=40,
+)

+ 0 - 549
applications/applications.c

@@ -1,549 +0,0 @@
-#include "applications.h"
-#include <assets_icons.h>
-
-// Services
-extern int32_t rpc_srv(void* p);
-extern int32_t bt_srv(void* p);
-extern int32_t cli_srv(void* p);
-extern int32_t dialogs_srv(void* p);
-extern int32_t dolphin_srv(void* p);
-extern int32_t gui_srv(void* p);
-extern int32_t input_srv(void* p);
-extern int32_t loader_srv(void* p);
-extern int32_t notification_srv(void* p);
-extern int32_t power_srv(void* p);
-extern int32_t storage_srv(void* p);
-extern int32_t desktop_srv(void* p);
-extern int32_t updater_srv(void* p);
-
-// Apps
-extern int32_t accessor_app(void* p);
-extern int32_t archive_app(void* p);
-extern int32_t bad_usb_app(void* p);
-extern int32_t u2f_app(void* p);
-extern int32_t uart_echo_app(void* p);
-extern int32_t blink_test_app(void* p);
-extern int32_t bt_debug_app(void* p);
-extern int32_t delay_test_app(void* p);
-extern int32_t display_test_app(void* p);
-extern int32_t gpio_app(void* p);
-extern int32_t ibutton_app(void* p);
-extern int32_t infrared_app(void* p);
-extern int32_t keypad_test_app(void* p);
-extern int32_t lfrfid_app(void* p);
-extern int32_t lfrfid_debug_app(void* p);
-extern int32_t nfc_app(void* p);
-extern int32_t passport_app(void* p);
-extern int32_t scened_app(void* p);
-extern int32_t storage_test_app(void* p);
-extern int32_t subghz_app(void* p);
-extern int32_t usb_mouse_app(void* p);
-extern int32_t usb_test_app(void* p);
-extern int32_t vibro_test_app(void* p);
-extern int32_t bt_hid_app(void* p);
-extern int32_t battery_test_app(void* p);
-extern int32_t text_box_test_app(void* p);
-extern int32_t file_browser_app(void* p);
-
-// Plugins
-extern int32_t music_player_app(void* p);
-extern int32_t snake_game_app(void* p);
-
-// On system start hooks declaration
-extern void bt_on_system_start();
-extern void crypto_on_system_start();
-extern void ibutton_on_system_start();
-extern void infrared_on_system_start();
-extern void lfrfid_on_system_start();
-extern void music_player_on_system_start();
-extern void nfc_on_system_start();
-extern void storage_on_system_start();
-extern void subghz_on_system_start();
-extern void power_on_system_start();
-extern void unit_tests_on_system_start();
-extern void updater_on_system_start();
-
-// Settings
-extern int32_t notification_settings_app(void* p);
-extern int32_t storage_settings_app(void* p);
-extern int32_t bt_settings_app(void* p);
-extern int32_t desktop_settings_app(void* p);
-extern int32_t about_settings_app(void* p);
-extern int32_t power_settings_app(void* p);
-extern int32_t system_settings_app(void* p);
-
-const FlipperApplication FLIPPER_SERVICES[] = {
-/* Services */
-#ifdef SRV_RPC
-    {.app = rpc_srv,
-     .name = "RpcSrv",
-     .stack_size = 1024 * 4,
-     .icon = NULL,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-#ifdef SRV_BT
-    {.app = bt_srv,
-     .name = "BtSrv",
-     .stack_size = 1024,
-     .icon = NULL,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-#ifdef SRV_CLI
-    {.app = cli_srv,
-     .name = "CliSrv",
-     .stack_size = 4096,
-     .icon = NULL,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-#ifdef SRV_DIALOGS
-    {.app = dialogs_srv,
-     .name = "DialogsSrv",
-     .stack_size = 1024,
-     .icon = NULL,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-#ifdef SRV_DOLPHIN
-    {.app = dolphin_srv,
-     .name = "DolphinSrv",
-     .stack_size = 1024,
-     .icon = NULL,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-#ifdef SRV_DESKTOP
-#ifdef SRV_UPDATER
-#error SRV_UPDATER and SRV_DESKTOP are mutually exclusive!
-#endif
-    {.app = desktop_srv,
-     .name = "DesktopSrv",
-     .stack_size = 2048,
-     .icon = NULL,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-#ifdef SRV_GUI
-    {.app = gui_srv,
-     .name = "GuiSrv",
-     .stack_size = 2048,
-     .icon = NULL,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-#ifdef SRV_INPUT
-    {.app = input_srv,
-     .name = "InputSrv",
-     .stack_size = 1024,
-     .icon = NULL,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-#ifdef SRV_LOADER
-    {.app = loader_srv,
-     .name = "LoaderSrv",
-     .stack_size = 1024,
-     .icon = NULL,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-#ifdef SRV_NOTIFICATION
-    {.app = notification_srv,
-     .name = "NotificationSrv",
-     .stack_size = 1536,
-     .icon = NULL,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-#ifdef SRV_POWER
-    {.app = power_srv,
-     .name = "PowerSrv",
-     .stack_size = 1024,
-     .icon = NULL,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-#ifdef SRV_STORAGE
-    {.app = storage_srv,
-     .name = "StorageSrv",
-     .stack_size = 3072,
-     .icon = NULL,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-#ifdef SRV_UPDATER
-#ifdef SRV_DESKTOP
-#error SRV_UPDATER and SRV_DESKTOP are mutually exclusive!
-#endif
-    {.app = updater_srv,
-     .name = "UpdaterSrv",
-     .stack_size = 2048,
-     .icon = NULL,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-};
-
-const size_t FLIPPER_SERVICES_COUNT = COUNT_OF(FLIPPER_SERVICES);
-
-const FlipperApplication FLIPPER_SYSTEM_APPS[] = {
-#ifdef APP_UPDATER
-#ifdef SRV_UPDATER
-#error APP_UPDATER and SRV_UPDATER are mutually exclusive!
-#endif
-    {.app = updater_srv,
-     .name = "UpdaterApp",
-     .stack_size = 2048,
-     .icon = NULL,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-};
-
-const size_t FLIPPER_SYSTEM_APPS_COUNT = COUNT_OF(FLIPPER_SYSTEM_APPS);
-
-// Main menu APP
-const FlipperApplication FLIPPER_APPS[] = {
-
-#ifdef APP_SUBGHZ
-    {.app = subghz_app,
-     .name = "Sub-GHz",
-     .stack_size = 2048,
-     .icon = &A_Sub1ghz_14,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-#ifdef APP_LF_RFID
-    {.app = lfrfid_app,
-     .name = "125 kHz RFID",
-     .stack_size = 2048,
-     .icon = &A_125khz_14,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-#ifdef APP_NFC
-    {.app = nfc_app,
-     .name = "NFC",
-     .stack_size = 4096,
-     .icon = &A_NFC_14,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-#ifdef APP_INFRARED
-    {.app = infrared_app,
-     .name = "Infrared",
-     .stack_size = 1024 * 3,
-     .icon = &A_Infrared_14,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-#ifdef APP_GPIO
-    {.app = gpio_app,
-     .name = "GPIO",
-     .stack_size = 1024,
-     .icon = &A_GPIO_14,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-#ifdef APP_IBUTTON
-    {.app = ibutton_app,
-     .name = "iButton",
-     .stack_size = 2048,
-     .icon = &A_iButton_14,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-#ifdef APP_BAD_USB
-    {.app = bad_usb_app,
-     .name = "Bad USB",
-     .stack_size = 2048,
-     .icon = &A_BadUsb_14,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-#ifdef APP_U2F
-    {.app = u2f_app,
-     .name = "U2F",
-     .stack_size = 2048,
-     .icon = &A_U2F_14,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-};
-
-const size_t FLIPPER_APPS_COUNT = COUNT_OF(FLIPPER_APPS);
-
-// On system start hooks
-const FlipperOnStartHook FLIPPER_ON_SYSTEM_START[] = {
-    crypto_on_system_start,
-
-#ifdef APP_INFRARED
-    infrared_on_system_start,
-#endif
-
-#ifdef APP_MUSIC_PLAYER
-    music_player_on_system_start,
-#endif
-
-#ifdef APP_NFC
-    nfc_on_system_start,
-#endif
-
-#ifdef APP_SUBGHZ
-    subghz_on_system_start,
-#endif
-
-#ifdef APP_LF_RFID
-    lfrfid_on_system_start,
-#endif
-
-#ifdef APP_IBUTTON
-    ibutton_on_system_start,
-#endif
-
-#ifdef SRV_BT
-    bt_on_system_start,
-#endif
-
-#ifdef SRV_POWER
-    power_on_system_start,
-#endif
-
-#ifdef SRV_STORAGE
-    storage_on_system_start,
-#endif
-
-#ifdef APP_UNIT_TESTS
-    unit_tests_on_system_start,
-#endif
-
-#ifdef APP_UPDATER
-    updater_on_system_start,
-#endif
-};
-
-const size_t FLIPPER_ON_SYSTEM_START_COUNT = COUNT_OF(FLIPPER_ON_SYSTEM_START);
-
-// Plugin menu
-const FlipperApplication FLIPPER_PLUGINS[] = {
-#ifdef APP_BLE_HID
-    {.app = bt_hid_app,
-     .name = "Bluetooth Remote",
-     .stack_size = 1024,
-     .icon = NULL,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-#ifdef APP_MUSIC_PLAYER
-    {.app = music_player_app,
-     .name = "Music Player",
-     .stack_size = 2048,
-     .icon = &A_Plugins_14,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-#ifdef APP_SNAKE_GAME
-    {.app = snake_game_app,
-     .name = "Snake Game",
-     .stack_size = 1024,
-     .icon = &A_Plugins_14,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-};
-
-const size_t FLIPPER_PLUGINS_COUNT = COUNT_OF(FLIPPER_PLUGINS);
-
-// Plugin menu
-const FlipperApplication FLIPPER_DEBUG_APPS[] = {
-#ifdef APP_BLINK
-    {.app = blink_test_app,
-     .name = "Blink Test",
-     .stack_size = 1024,
-     .icon = NULL,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-#ifdef APP_VIBRO_TEST
-    {.app = vibro_test_app,
-     .name = "Vibro Test",
-     .stack_size = 1024,
-     .icon = NULL,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-#ifdef APP_KEYPAD_TEST
-    {.app = keypad_test_app,
-     .name = "Keypad Test",
-     .stack_size = 1024,
-     .icon = NULL,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-#ifdef APP_ACCESSOR
-    {.app = accessor_app,
-     .name = "Accessor",
-     .stack_size = 4096,
-     .icon = NULL,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-#ifdef APP_USB_TEST
-    {.app = usb_test_app,
-     .name = "USB Test",
-     .stack_size = 1024,
-     .icon = NULL,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-#ifdef APP_USB_MOUSE
-    {.app = usb_mouse_app,
-     .name = "USB Mouse Demo",
-     .stack_size = 1024,
-     .icon = NULL,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-#ifdef APP_UART_ECHO
-    {.app = uart_echo_app,
-     .name = "Uart Echo",
-     .stack_size = 2048,
-     .icon = NULL,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-#ifdef APP_LF_RFID
-    {.app = lfrfid_debug_app,
-     .name = "LF-RFID Debug",
-     .stack_size = 1024,
-     .icon = NULL,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-#ifdef SRV_BT
-    {.app = bt_debug_app,
-     .name = "Bluetooth Debug",
-     .stack_size = 1024,
-     .icon = NULL,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-#ifdef APP_UNIT_TESTS
-    {.app = delay_test_app,
-     .name = "Delay Test",
-     .stack_size = 1024,
-     .icon = NULL,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-#ifdef APP_DISPLAY_TEST
-    {.app = display_test_app,
-     .name = "Display Test",
-     .stack_size = 1024,
-     .icon = NULL,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-#ifdef APP_FILE_BROWSER_TEST
-    {.app = file_browser_app,
-     .name = "File Browser test",
-     .stack_size = 2048,
-     .icon = &A_BadUsb_14,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-#ifdef APP_BATTERY_TEST
-    {.app = battery_test_app,
-     .name = "Battery Test",
-     .stack_size = 1024,
-     .icon = NULL,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-#ifdef APP_TEXT_BOX_TEST
-    {.app = text_box_test_app,
-     .name = "Text Box Test",
-     .stack_size = 1024,
-     .icon = NULL,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-};
-
-const size_t FLIPPER_DEBUG_APPS_COUNT = COUNT_OF(FLIPPER_DEBUG_APPS);
-
-#ifdef APP_ARCHIVE
-const FlipperApplication FLIPPER_ARCHIVE = {
-    .app = archive_app,
-    .name = "Archive",
-    .stack_size = 4096,
-    .icon = &A_FileManager_14,
-    .flags = FlipperApplicationFlagDefault};
-#endif
-
-// Settings menu
-const FlipperApplication FLIPPER_SETTINGS_APPS[] = {
-#ifdef SRV_BT
-    {.app = bt_settings_app,
-     .name = "Bluetooth",
-     .stack_size = 1024,
-     .icon = NULL,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-#ifdef SRV_NOTIFICATION
-    {.app = notification_settings_app,
-     .name = "LCD and Notifications",
-     .stack_size = 1024,
-     .icon = NULL,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-#ifdef SRV_STORAGE
-    {.app = storage_settings_app,
-     .name = "Storage",
-     .stack_size = 2048,
-     .icon = NULL,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-#ifdef SRV_POWER
-    {.app = power_settings_app,
-     .name = "Power",
-     .stack_size = 1024,
-     .icon = NULL,
-     .flags = FlipperApplicationFlagInsomniaSafe},
-#endif
-
-#ifdef SRV_DESKTOP
-    {.app = desktop_settings_app,
-     .name = "Desktop",
-     .stack_size = 1024,
-     .icon = NULL,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-#ifdef APP_PASSPORT
-    {.app = passport_app,
-     .name = "Passport",
-     .stack_size = 1024,
-     .icon = NULL,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-#ifdef SRV_GUI
-    {.app = system_settings_app,
-     .name = "System",
-     .stack_size = 1024,
-     .icon = NULL,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-
-#ifdef APP_ABOUT
-    {.app = about_settings_app,
-     .name = "About",
-     .stack_size = 1024,
-     .icon = NULL,
-     .flags = FlipperApplicationFlagDefault},
-#endif
-};
-
-const size_t FLIPPER_SETTINGS_APPS_COUNT = COUNT_OF(FLIPPER_SETTINGS_APPS);

+ 0 - 353
applications/applications.mk

@@ -1,353 +0,0 @@
-APP_DIR		= $(PROJECT_ROOT)/applications
-LIB_DIR		= $(PROJECT_ROOT)/lib
-
-CFLAGS		+= -I$(APP_DIR)
-C_SOURCES	+= $(shell find $(APP_DIR) -name "*.c")
-CPP_SOURCES	+= $(shell find $(APP_DIR) -name "*.cpp")
-
-RAM_EXEC ?= 0
-ifeq ($(RAM_EXEC), 1)
-APP_RELEASE	= 0
-SRV_GUI 	= 1
-SRV_INPUT 	= 1
-SRV_NOTIFICATION	= 1
-SRV_STORAGE	= 1
-SRV_UPDATER	= 1
-APP_UPDATER	= 0
-endif
-
-APP_RELEASE ?= 1
-ifeq ($(APP_RELEASE), 1)
-# Services
-SRV_BT		= 1
-SRV_CLI		= 1
-SRV_DIALOGS	= 1
-SRV_DOLPHIN	= 1
-SRV_GUI		= 1
-SRV_INPUT	= 1
-SRV_LOADER	= 1
-SRV_NOTIFICATION = 1
-SRV_POWER	= 1
-SRV_RPC 	= 1
-SRV_STORAGE	= 1
-
-# Apps
-SRV_DESKTOP	= 1
-APP_ARCHIVE	= 1
-APP_GPIO 	= 1
-APP_IBUTTON	= 1
-APP_INFRARED	= 1
-APP_LF_RFID	= 1
-APP_NFC		= 1
-APP_SUBGHZ	= 1
-APP_ABOUT	= 1
-APP_PASSPORT = 1
-APP_UPDATER = 1
-
-# Plugins
-APP_MUSIC_PLAYER = 1
-APP_SNAKE_GAME = 1
-
-# Debug
-APP_ACCESSOR = 1
-APP_BLINK = 1
-APP_KEYPAD_TEST = 1
-APP_SD_TEST	= 1
-APP_VIBRO_TEST = 1
-APP_USB_TEST = 1
-APP_DISPLAY_TEST = 1
-APP_BLE_HID = 1
-APP_USB_MOUSE = 1
-APP_BAD_USB = 1
-APP_U2F = 1
-APP_UART_ECHO = 1
-APP_FILE_BROWSER_TEST = 1
-endif
-
-
-# Applications
-# that will be shown in menu
-# Prefix with APP_*
-
-APP_UNIT_TESTS ?= 0
-ifeq ($(APP_UNIT_TESTS), 1)
-CFLAGS		+= -DAPP_UNIT_TESTS
-endif
-
-
-APP_ARCHIVE ?= 0
-ifeq ($(APP_ARCHIVE), 1)
-CFLAGS		+= -DAPP_ARCHIVE
-SRV_GUI		= 1
-endif
-
-
-APP_BLINK ?= 0
-ifeq ($(APP_BLINK), 1)
-CFLAGS		+= -DAPP_BLINK
-SRV_GUI		= 1
-endif
-
-
-APP_SUBGHZ ?= 0
-ifeq ($(APP_SUBGHZ), 1)
-CFLAGS		+= -DAPP_SUBGHZ
-SRV_GUI		= 1
-SRV_CLI		= 1
-endif
-
-
-APP_ABOUT ?= 0
-ifeq ($(APP_ABOUT), 1)
-CFLAGS		+= -DAPP_ABOUT
-SRV_GUI		= 1
-endif
-
-
-APP_PASSPORT ?= 0
-ifeq ($(APP_PASSPORT), 1)
-CFLAGS		+= -DAPP_PASSPORT
-SRV_GUI		= 1
-endif
-
-
-APP_LF_RFID ?= 0
-ifeq ($(APP_LF_RFID), 1)
-CFLAGS		+= -DAPP_LF_RFID
-SRV_GUI		= 1
-endif
-
-
-APP_NFC ?= 0
-ifeq ($(APP_NFC), 1)
-CFLAGS		+= -DAPP_NFC
-SRV_GUI		= 1
-endif
-
-
-APP_INFRARED ?= 0
-ifeq ($(APP_INFRARED), 1)
-CFLAGS		+= -DAPP_INFRARED
-SRV_GUI		= 1
-endif
-
-
-APP_VIBRO_TEST ?= 0
-ifeq ($(APP_VIBRO_TEST), 1)
-CFLAGS		+= -DAPP_VIBRO_TEST
-SRV_GUI		= 1
-endif
-
-
-APP_USB_TEST ?= 0
-ifeq ($(APP_USB_TEST), 1)
-CFLAGS		+= -DAPP_USB_TEST
-SRV_GUI = 1
-endif
-
-APP_UART_ECHO ?= 0
-ifeq ($(APP_UART_ECHO), 1)
-CFLAGS		+= -DAPP_UART_ECHO
-SRV_GUI = 1
-endif
-
-APP_DISPLAY_TEST ?= 0
-ifeq ($(APP_DISPLAY_TEST), 1)
-CFLAGS		+= -DAPP_DISPLAY_TEST
-SRV_GUI = 1
-endif
-
-APP_TEXT_BOX_TEST ?= 0
-ifeq ($(APP_TEXT_BOX_TEST), 1)
-CFLAGS		+= -DAPP_TEXT_BOX_TEST
-SRV_GUI = 1
-endif
-
-APP_BATTERY_TEST ?= 0
-ifeq ($(APP_BATTERY_TEST), 1)
-CFLAGS		+= -DAPP_BATTERY_TEST
-SRV_GUI = 1
-endif
-
-APP_USB_MOUSE ?= 0
-ifeq ($(APP_USB_MOUSE), 1)
-CFLAGS		+= -DAPP_USB_MOUSE
-SRV_GUI = 1
-endif
-
-APP_BAD_USB ?= 0
-ifeq ($(APP_BAD_USB), 1)
-CFLAGS		+= -DAPP_BAD_USB
-SRV_GUI = 1
-endif
-
-APP_U2F ?= 0
-ifeq ($(APP_U2F), 1)
-CFLAGS		+= -DAPP_U2F
-SRV_GUI = 1
-endif
-
-APP_BLE_HID ?=0
-ifeq ($(APP_BLE_HID), 1)
-CFLAGS		+= -DAPP_BLE_HID
-SRV_GUI = 1
-endif
-
-APP_KEYPAD_TEST ?= 0
-ifeq ($(APP_KEYPAD_TEST), 1)
-CFLAGS		+= -DAPP_KEYPAD_TEST
-SRV_GUI		= 1
-endif
-
-APP_FILE_BROWSER_TEST ?= 0
-ifeq ($(APP_FILE_BROWSER_TEST), 1)
-CFLAGS		+= -DAPP_FILE_BROWSER_TEST
-SRV_GUI = 1
-endif
-
-APP_ACCESSOR ?= 0
-ifeq ($(APP_ACCESSOR), 1)
-CFLAGS		+= -DAPP_ACCESSOR
-SRV_GUI		= 1
-endif
-
-
-APP_GPIO ?= 0
-ifeq ($(APP_GPIO), 1)
-CFLAGS		+= -DAPP_GPIO
-SRV_GUI		= 1
-endif
-
-
-APP_MUSIC_PLAYER ?= 0
-ifeq ($(APP_MUSIC_PLAYER), 1)
-CFLAGS		+= -DAPP_MUSIC_PLAYER
-SRV_GUI		= 1
-endif
-
-APP_SNAKE_GAME ?= 0
-ifeq ($(APP_SNAKE_GAME), 1)
-CFLAGS		+= -DAPP_SNAKE_GAME
-SRV_GUI		= 1
-endif
-
-APP_IBUTTON ?= 0
-ifeq ($(APP_IBUTTON), 1)
-CFLAGS		+= -DAPP_IBUTTON
-SRV_GUI		= 1
-endif
-
-APP_UPDATER ?= 0
-ifeq ($(APP_UPDATER), 1)
-CFLAGS		+= -DAPP_UPDATER
-SRV_GUI		= 1
-SRV_STORAGE = 1
-SRV_NOTIFICATION = 1
-SRV_INPUT   = 1
-endif
-
-# Services
-# that will start with OS
-# Prefix with SRV_*
-
-
-SRV_BT ?= 0
-ifeq ($(SRV_BT), 1)
-CFLAGS		+= -DSRV_BT
-SRV_CLI		= 1
-endif
-
-
-SRV_DESKTOP ?= 0
-ifeq ($(SRV_DESKTOP), 1)
-CFLAGS		+= -DSRV_DESKTOP
-SRV_DOLPHIN	= 1
-SRV_STORAGE	= 1
-SRV_GUI		= 1
-endif
-
-
-SRV_UPDATER ?= 0
-ifeq ($(SRV_UPDATER), 1)
-CFLAGS		+= -DSRV_UPDATER
-SRV_STORAGE	= 1
-SRV_GUI		= 1
-endif
-
-
-SRV_DOLPHIN ?= 0
-ifeq ($(SRV_DOLPHIN), 1)
-CFLAGS		+= -DSRV_DOLPHIN
-SRV_DOLPHIN_STATE_DEBUG ?= 0
-ifeq ($(SRV_DOLPHIN_STATE_DEBUG), 1)
-CFLAGS		+= -DSRV_DOLPHIN_STATE_DEBUG
-endif
-endif
-
-
-SRV_POWER ?= 0
-ifeq ($(SRV_POWER), 1)
-CFLAGS		+= -DSRV_POWER
-SRV_GUI		= 1
-SRV_CLI		= 1
-endif
-
-SRV_RPC ?= 0
-ifeq ($(SRV_RPC), 1)
-CFLAGS		+= -DSRV_RPC
-ifeq ($(SRV_RPC_DEBUG), 1)
-CFLAGS		+= -DSRV_RPC_DEBUG
-endif
-SRV_CLI		= 1
-endif
-
-SRV_LOADER ?= 0
-ifeq ($(SRV_LOADER), 1)
-CFLAGS		+= -DSRV_LOADER
-SRV_GUI		= 1
-# Loader autostart hook
-LOADER_AUTOSTART ?= ""
-ifneq ($(strip $(LOADER_AUTOSTART)), "")
-CFLAGS		+= -DLOADER_AUTOSTART="\"$(LOADER_AUTOSTART)\""
-endif
-# Loader autostart hook END
-endif
-
-
-SRV_DIALOGS ?= 0
-ifeq ($(SRV_DIALOGS), 1)
-CFLAGS		+= -DSRV_DIALOGS
-SRV_GUI		= 1
-endif
-
-
-SRV_GUI	?= 0
-ifeq ($(SRV_GUI), 1)
-CFLAGS		+= -DSRV_GUI
-SRV_INPUT	= 1
-SRV_NOTIFICATION = 1
-endif
-
-
-SRV_INPUT	?= 0
-ifeq ($(SRV_INPUT), 1)
-CFLAGS		+= -DSRV_INPUT
-endif
-
-
-SRV_CLI ?= 0
-ifeq ($(SRV_CLI), 1)
-CFLAGS		+= -DSRV_CLI
-endif
-
-
-SRV_NOTIFICATION ?= 0
-ifeq ($(SRV_NOTIFICATION), 1)
-CFLAGS		+= -DSRV_NOTIFICATION
-endif
-
-
-SRV_STORAGE ?= 0
-ifeq ($(SRV_STORAGE), 1)
-CFLAGS		+= -DSRV_STORAGE
-endif

+ 11 - 0
applications/archive/application.fam

@@ -0,0 +1,11 @@
+App(
+    appid="archive",
+    name="Archive",
+    apptype=FlipperAppType.ARCHIVE,
+    entry_point="archive_app",
+    cdefines=["APP_ARCHIVE"],
+    requires=["gui"],
+    stack_size=4 * 1024,
+    icon="A_FileManager_14",
+    order=0,
+)

+ 14 - 0
applications/bad_usb/application.fam

@@ -0,0 +1,14 @@
+App(
+    appid="bad_usb",
+    name="Bad USB",
+    apptype=FlipperAppType.APP,
+    entry_point="bad_usb_app",
+    cdefines=["APP_BAD_USB"],
+    requires=[
+        "gui",
+        "dialogs",
+    ],
+    stack_size=2 * 1024,
+    icon="A_BadUsb_14",
+    order=70,
+)

+ 66 - 0
applications/bt/application.fam

@@ -0,0 +1,66 @@
+App(
+    appid="bt",
+    name="BtSrv",
+    apptype=FlipperAppType.SERVICE,
+    entry_point="bt_srv",
+    cdefines=["SRV_BT"],
+    requires=[
+        "cli",
+        "dialogs",
+    ],
+    provides=[
+        "bt_start",
+        "bt_settings",
+        "bt_debug",
+    ],
+    stack_size=1 * 1024,
+    order=20,
+)
+
+App(
+    appid="bt_start",
+    apptype=FlipperAppType.STARTUP,
+    entry_point="bt_on_system_start",
+    order=70,
+)
+
+App(
+    appid="bt_settings",
+    name="Bluetooth",
+    apptype=FlipperAppType.SETTINGS,
+    entry_point="bt_settings_app",
+    stack_size=1 * 1024,
+    requires=[
+        "bt",
+        "gui",
+    ],
+    order=10,
+)
+
+App(
+    appid="bt_debug",
+    name="Bluetooth Debug",
+    apptype=FlipperAppType.DEBUG,
+    entry_point="bt_debug_app",
+    stack_size=1 * 1024,
+    requires=[
+        "bt",
+        "gui",
+        "dialogs",
+    ],
+    order=110,
+)
+
+App(
+    appid="bt_hid",
+    name="Bluetooth Remote",
+    apptype=FlipperAppType.PLUGIN,
+    entry_point="bt_hid_app",
+    stack_size=1 * 1024,
+    cdefines=["APP_BLE_HID"],
+    requires=[
+        "bt",
+        "gui",
+    ],
+    order=10,
+)

+ 9 - 0
applications/cli/application.fam

@@ -0,0 +1,9 @@
+App(
+    appid="cli",
+    name="CliSrv",
+    apptype=FlipperAppType.SERVICE,
+    entry_point="cli_srv",
+    cdefines=["SRV_CLI"],
+    stack_size=4 * 1024,
+    order=30,
+)

+ 6 - 0
applications/crypto/application.fam

@@ -0,0 +1,6 @@
+App(
+    appid="crypto_start",
+    apptype=FlipperAppType.STARTUP,
+    entry_point="crypto_on_system_start",
+    order=10,
+)

+ 115 - 0
applications/debug_tools/application.fam

@@ -0,0 +1,115 @@
+App(
+    appid="debug_apps",
+    name="Basic debug apps bundle",
+    apptype=FlipperAppType.METAPACKAGE,
+    provides=[
+        "blink_test",
+        "vibro_test",
+        "keypad_test",
+        "usb_test",
+        "usb_mouse",
+        "uart_echo",
+        "display_test",
+        "text_box_test",
+        "file_browser_test",
+    ],
+)
+
+App(
+    appid="blink_test",
+    name="Blink Test",
+    apptype=FlipperAppType.DEBUG,
+    entry_point="blink_test_app",
+    cdefines=["APP_BLINK"],
+    requires=["gui"],
+    stack_size=1 * 1024,
+    order=10,
+)
+
+App(
+    appid="vibro_test",
+    name="Vibro Test",
+    apptype=FlipperAppType.DEBUG,
+    entry_point="vibro_test_app",
+    cdefines=["APP_VIBRO_TEST"],
+    requires=["gui"],
+    stack_size=1 * 1024,
+    order=20,
+)
+
+App(
+    appid="keypad_test",
+    name="Keypad Test",
+    apptype=FlipperAppType.DEBUG,
+    entry_point="keypad_test_app",
+    cdefines=["APP_KEYPAD_TEST"],
+    requires=["gui"],
+    stack_size=1 * 1024,
+    order=30,
+)
+
+App(
+    appid="usb_test",
+    name="USB Test",
+    apptype=FlipperAppType.DEBUG,
+    entry_point="usb_test_app",
+    cdefines=["APP_USB_TEST"],
+    requires=["gui"],
+    stack_size=1 * 1024,
+    order=50,
+)
+
+App(
+    appid="usb_mouse",
+    name="USB Mouse Demo",
+    apptype=FlipperAppType.DEBUG,
+    entry_point="usb_mouse_app",
+    cdefines=["APP_USB_MOUSE"],
+    requires=["gui"],
+    stack_size=1 * 1024,
+    order=60,
+)
+
+App(
+    appid="uart_echo",
+    name="UART Echo",
+    apptype=FlipperAppType.DEBUG,
+    entry_point="uart_echo_app",
+    cdefines=["APP_UART_ECHO"],
+    requires=["gui"],
+    stack_size=2 * 1024,
+    order=70,
+)
+
+App(
+    appid="display_test",
+    name="Display Test",
+    apptype=FlipperAppType.DEBUG,
+    entry_point="display_test_app",
+    cdefines=["APP_DISPLAY_TEST"],
+    requires=["gui"],
+    stack_size=1 * 1024,
+    order=120,
+)
+
+App(
+    appid="text_box_test",
+    name="Text Box Test",
+    apptype=FlipperAppType.DEBUG,
+    entry_point="text_box_test_app",
+    cdefines=["APP_TEXT_BOX_TEST"],
+    requires=["gui"],
+    stack_size=1 * 1024,
+    order=140,
+)
+
+App(
+    appid="file_browser_test",
+    name="File Browser Test",
+    apptype=FlipperAppType.DEBUG,
+    entry_point="file_browser_app",
+    cdefines=["APP_FILE_BROWSER_TEST"],
+    requires=["gui"],
+    stack_size=2 * 1024,
+    order=150,
+)

+ 30 - 0
applications/desktop/application.fam

@@ -0,0 +1,30 @@
+App(
+    appid="desktop",
+    name="DesktopSrv",
+    apptype=FlipperAppType.SERVICE,
+    entry_point="desktop_srv",
+    cdefines=["SRV_DESKTOP"],
+    requires=[
+        "gui",
+        "dolphin",
+        "storage",
+        "input",
+    ],
+    provides=["desktop_settings"],
+    conflicts=["updater"],
+    stack_size=2 * 1024,
+    order=60,
+)
+
+App(
+    appid="desktop_settings",
+    name="Desktop",
+    apptype=FlipperAppType.SETTINGS,
+    entry_point="desktop_settings_app",
+    requires=[
+        "desktop",
+        "gui",
+    ],
+    stack_size=1 * 1024,
+    order=50,
+)

+ 7 - 3
applications/desktop/views/desktop_view_debug.c

@@ -46,7 +46,10 @@ void desktop_debug_render(Canvas* canvas, void* model) {
         canvas_draw_str(canvas, 5, 19 + STATUS_BAR_Y_SHIFT, buffer);
 
         ver = furi_hal_version_get_firmware_version();
-
+        const BleGlueC2Info* c2_ver = NULL;
+#ifdef SRV_BT
+        c2_ver = ble_glue_get_c2_info();
+#endif
         if(!ver) {
             canvas_draw_str(canvas, 5, 29 + STATUS_BAR_Y_SHIFT, "No info");
             return;
@@ -63,10 +66,11 @@ void desktop_debug_render(Canvas* canvas, void* model) {
         snprintf(
             buffer,
             sizeof(buffer),
-            "%s%s [%s]",
+            "%s%s [%s] %s",
             version_get_dirty_flag(ver) ? "[!] " : "",
             version_get_githash(ver),
-            version_get_gitbranchnum(ver));
+            version_get_gitbranchnum(ver),
+            c2_ver ? c2_ver->StackTypeString : "<none>");
         canvas_draw_str(canvas, 5, 39 + STATUS_BAR_Y_SHIFT, buffer);
 
         snprintf(

+ 10 - 0
applications/dialogs/application.fam

@@ -0,0 +1,10 @@
+App(
+    appid="dialogs",
+    name="DialogsSrv",
+    apptype=FlipperAppType.SERVICE,
+    entry_point="dialogs_srv",
+    cdefines=["SRV_DIALOGS"],
+    requires=["gui"],
+    stack_size=1 * 1024,
+    order=40,
+)

+ 23 - 0
applications/dolphin/application.fam

@@ -0,0 +1,23 @@
+App(
+    appid="dolphin",
+    name="DolphinSrv",
+    apptype=FlipperAppType.SERVICE,
+    entry_point="dolphin_srv",
+    cdefines=["SRV_DOLPHIN"],
+    stack_size=1 * 1024,
+    order=50,
+)
+
+App(
+    appid="passport",
+    name="Passport",
+    apptype=FlipperAppType.SETTINGS,
+    entry_point="passport_app",
+    cdefines=["APP_PASSPORT"],
+    requires=[
+        "gui",
+        "dolphin",
+    ],
+    stack_size=1 * 1024,
+    order=60,
+)

+ 57 - 0
applications/extapps.scons

@@ -0,0 +1,57 @@
+Import("ENV")
+
+
+from fbt.appmanifest import FlipperAppType
+
+
+appenv = ENV.Clone(tools=["fbt_extapps"])
+
+appenv.Replace(
+    LINKER_SCRIPT="application-ext",
+    STRIPFLAGS=[
+        "--strip-debug",
+        "--strip-unneeded",
+        "-d",
+        "-g",
+        "-S",
+    ],
+)
+
+appenv.AppendUnique(
+    CCFLAGS=[
+        "-Os",
+        "-ggdb3",
+        "-mword-relocations",
+        "-mlong-calls",
+        "-fno-common",
+        "-nostdlib",
+        "-fvisibility=hidden",
+    ],
+    LINKFLAGS=[
+        "-r",
+        "-s",
+        # "-Bsymbolic",
+        "-nostartfiles",
+        "-mlong-calls",
+        "-fno-common",
+        "-nostdlib",
+        "-Wl,--gc-sections",
+        "-Wl,--no-export-dynamic",
+        "-fvisibility=hidden",
+        "-Wl,-e${APP_ENTRY}",
+    ],
+)
+
+
+extapps = []
+for apptype in (FlipperAppType.PLUGIN, FlipperAppType.EXTERNAL):
+    for app in appenv["APPBUILD"].get_apps_of_type(apptype):
+        extapps.append(appenv.BuildAppElf(app))
+
+# Ugly access to global option
+if extra_app_list := GetOption("extra_ext_apps"):
+    for extra_app in extra_app_list.split(","):
+        extapps.append(appenv.BuildAppElf(appenv["APPMGR"].get(extra_app)))
+
+Alias(appenv["FIRMWARE_BUILD_CFG"] + "_extapps", extapps)
+Return("extapps")

+ 11 - 0
applications/gpio/application.fam

@@ -0,0 +1,11 @@
+App(
+    appid="gpio",
+    name="GPIO",
+    apptype=FlipperAppType.APP,
+    entry_point="gpio_app",
+    cdefines=["APP_GPIO"],
+    requires=["gui"],
+    stack_size=1 * 1024,
+    icon="A_GPIO_14",
+    order=50,
+)

+ 13 - 0
applications/gui/application.fam

@@ -0,0 +1,13 @@
+App(
+    appid="gui",
+    name="GuiSrv",
+    apptype=FlipperAppType.SERVICE,
+    entry_point="gui_srv",
+    cdefines=["SRV_GUI"],
+    requires=[
+        "input",
+        "notification",
+    ],
+    stack_size=2 * 1024,
+    order=70,
+)

+ 23 - 0
applications/ibutton/application.fam

@@ -0,0 +1,23 @@
+App(
+    appid="ibutton",
+    name="iButton",
+    apptype=FlipperAppType.APP,
+    entry_point="ibutton_app",
+    cdefines=["APP_IBUTTON"],
+    requires=[
+        "gui",
+        "dialogs",
+    ],
+    provides=["ibutton_start"],
+    icon="A_iButton_14",
+    stack_size=2 * 1024,
+    order=60,
+)
+
+App(
+    appid="ibutton_start",
+    apptype=FlipperAppType.STARTUP,
+    entry_point="ibutton_on_system_start",
+    requires=["ibutton"],
+    order=60,
+)

+ 23 - 0
applications/infrared/application.fam

@@ -0,0 +1,23 @@
+App(
+    appid="infrared",
+    name="Infrared",
+    apptype=FlipperAppType.APP,
+    entry_point="infrared_app",
+    cdefines=["APP_INFRARED"],
+    requires=[
+        "gui",
+        "dialogs",
+    ],
+    provides=["infrared_start"],
+    icon="A_Infrared_14",
+    stack_size=3 * 1024,
+    order=40,
+)
+
+App(
+    appid="infrared_start",
+    apptype=FlipperAppType.STARTUP,
+    entry_point="infrared_on_system_start",
+    requires=["infrared"],
+    order=20,
+)

+ 9 - 0
applications/input/application.fam

@@ -0,0 +1,9 @@
+App(
+    appid="input",
+    name="InputSrv",
+    apptype=FlipperAppType.SERVICE,
+    entry_point="input_srv",
+    cdefines=["SRV_INPUT"],
+    stack_size=1 * 1024,
+    order=80,
+)

+ 26 - 0
applications/lfrfid/application.fam

@@ -0,0 +1,26 @@
+App(
+    appid="lfrfid",
+    name="125 kHz RFID",
+    apptype=FlipperAppType.APP,
+    entry_point="lfrfid_app",
+    cdefines=["APP_LF_RFID"],
+    requires=[
+        "gui",
+        "dialogs",
+    ],
+    provides=[
+        "lfrfid_start",
+        "lfrfid_debug",
+    ],
+    icon="A_125khz_14",
+    stack_size=2 * 1024,
+    order=20,
+)
+
+App(
+    appid="lfrfid_start",
+    apptype=FlipperAppType.STARTUP,
+    entry_point="lfrfid_on_system_start",
+    requires=["lfrfid"],
+    order=50,
+)

+ 12 - 0
applications/lfrfid_debug/application.fam

@@ -0,0 +1,12 @@
+App(
+    appid="lfrfid_debug",
+    name="LF-RFID Debug",
+    apptype=FlipperAppType.DEBUG,
+    entry_point="lfrfid_debug_app",
+    requires=[
+        "gui",
+        "lfrfid",
+    ],
+    stack_size=1 * 1024,
+    order=100,
+)

+ 10 - 0
applications/loader/application.fam

@@ -0,0 +1,10 @@
+App(
+    appid="loader",
+    name="LoaderSrv",
+    apptype=FlipperAppType.SERVICE,
+    entry_point="loader_srv",
+    cdefines=["SRV_LOADER"],
+    requires=["gui"],
+    stack_size=1 * 1024,
+    order=90,
+)

+ 41 - 0
applications/meta/application.fam

@@ -0,0 +1,41 @@
+App(
+    appid="basic_services",
+    name="Basic services",
+    apptype=FlipperAppType.METAPACKAGE,
+    provides=[
+        "rpc",
+        "bt",
+        "desktop",
+        "loader",
+        "power",
+    ],
+)
+
+
+App(
+    appid="basic_apps",
+    name="Basic applications for main menu",
+    apptype=FlipperAppType.METAPACKAGE,
+    provides=[
+        "gpio",
+        "ibutton",
+        "infrared",
+        "lfrfid",
+        "nfc",
+        "subghz",
+        "bad_usb",
+        "u2f",
+    ],
+)
+
+
+App(
+    appid="basic_plugins",
+    name="Basic applications for plug-in menu",
+    apptype=FlipperAppType.METAPACKAGE,
+    provides=[
+        "music_player",
+        "snake_game",
+        "bt_hid",
+    ],
+)

+ 22 - 0
applications/music_player/application.fam

@@ -0,0 +1,22 @@
+App(
+    appid="music_player",
+    name="Music Player",
+    apptype=FlipperAppType.PLUGIN,
+    entry_point="music_player_app",
+    cdefines=["APP_MUSIC_PLAYER"],
+    requires=[
+        "gui",
+        "dialogs",
+    ],
+    provides=["music_player_start"],
+    stack_size=2 * 1024,
+    order=20,
+)
+
+App(
+    appid="music_player_start",
+    apptype=FlipperAppType.STARTUP,
+    entry_point="music_player_on_system_start",
+    requires=["music_player"],
+    order=30,
+)

+ 23 - 0
applications/nfc/application.fam

@@ -0,0 +1,23 @@
+App(
+    appid="nfc",
+    name="NFC",
+    apptype=FlipperAppType.APP,
+    entry_point="nfc_app",
+    cdefines=["APP_NFC"],
+    requires=[
+        "gui",
+        "dialogs",
+    ],
+    provides=["nfc_start"],
+    icon="A_NFC_14",
+    stack_size=4 * 1024,
+    order=30,
+)
+
+App(
+    appid="nfc_start",
+    apptype=FlipperAppType.STARTUP,
+    entry_point="nfc_on_system_start",
+    requires=["nfc"],
+    order=30,
+)

+ 21 - 0
applications/notification/application.fam

@@ -0,0 +1,21 @@
+App(
+    appid="notification",
+    name="NotificationSrv",
+    apptype=FlipperAppType.SERVICE,
+    entry_point="notification_srv",
+    cdefines=["SRV_NOTIFICATION"],
+    requires=["input"],
+    provides=["notification_settings"],
+    stack_size=int(1.5 * 1024),
+    order=100,
+)
+
+App(
+    appid="notification_settings",
+    name="LCD and Notifications",
+    apptype=FlipperAppType.SETTINGS,
+    entry_point="notification_settings_app",
+    requires=["notification"],
+    stack_size=1 * 1024,
+    order=20,
+)

+ 53 - 0
applications/power/application.fam

@@ -0,0 +1,53 @@
+App(
+    appid="power",
+    name="PowerSrv",
+    apptype=FlipperAppType.SERVICE,
+    entry_point="power_srv",
+    cdefines=["SRV_POWER"],
+    requires=[
+        "gui",
+        "cli",
+    ],
+    provides=[
+        "power_settings",
+        "power_start",
+    ],
+    stack_size=1 * 1024,
+    order=110,
+)
+
+App(
+    appid="power_settings",
+    name="Power",
+    apptype=FlipperAppType.SETTINGS,
+    entry_point="power_settings_app",
+    requires=[
+        "gui",
+        "power",
+    ],
+    flags=["InsomniaSafe"],
+    stack_size=1 * 1024,
+    order=40,
+)
+
+App(
+    appid="power_start",
+    apptype=FlipperAppType.STARTUP,
+    entry_point="power_on_system_start",
+    requires=["power"],
+    order=80,
+)
+
+App(
+    appid="battery_test",
+    name="Battery Test",
+    apptype=FlipperAppType.DEBUG,
+    entry_point="battery_test_app",
+    cdefines=["APP_BATTERY_TEST"],
+    requires=[
+        "gui",
+        "power",
+    ],
+    stack_size=1 * 1024,
+    order=130,
+)

+ 12 - 0
applications/rpc/application.fam

@@ -0,0 +1,12 @@
+App(
+    appid="rpc",
+    name="RpcSrv",
+    apptype=FlipperAppType.SERVICE,
+    entry_point="rpc_srv",
+    cdefines=["SRV_RPC"],
+    requires=[
+        "cli",
+    ],
+    stack_size=4 * 1024,
+    order=10,
+)

+ 6 - 34
applications/rpc/rpc_storage.c

@@ -10,6 +10,7 @@
 #include "storage/storage.h"
 #include <stdint.h>
 #include <lib/toolbox/md5.h>
+#include <lib/toolbox/path.h>
 #include <update_util/lfs_backup.h>
 
 #define TAG "RpcStorage"
@@ -100,35 +101,6 @@ static PB_CommandStatus rpc_system_storage_get_file_error(File* file) {
     return rpc_system_storage_get_error(storage_file_get_error(file));
 }
 
-static bool rpc_system_storage_is_filename_correct(const char* path) {
-    const char* name_pos = strrchr(path, '/');
-    if(name_pos == NULL) {
-        name_pos = path;
-    } else {
-        name_pos++;
-    }
-
-    while(*name_pos != '\0') {
-        if((*name_pos >= '0') && (*name_pos <= '9')) {
-            name_pos++;
-            continue;
-        } else if((*name_pos >= 'A') && (*name_pos <= 'Z')) {
-            name_pos++;
-            continue;
-        } else if((*name_pos >= 'a') && (*name_pos <= 'z')) {
-            name_pos++;
-            continue;
-        } else if(strchr(".!#\\$%&'()-@^_`{}~", *name_pos) != NULL) {
-            name_pos++;
-            continue;
-        }
-
-        return false;
-    }
-
-    return true;
-}
-
 static void rpc_system_storage_info_process(const PB_Main* request, void* context) {
     furi_assert(request);
     furi_assert(context);
@@ -274,7 +246,7 @@ static void rpc_system_storage_list_process(const PB_Main* request, void* contex
         FileInfo fileinfo;
         char* name = malloc(MAX_NAME_LENGTH + 1);
         if(storage_dir_read(dir, &fileinfo, name, MAX_NAME_LENGTH)) {
-            if(rpc_system_storage_is_filename_correct(name)) {
+            if(path_contains_only_ascii(name)) {
                 if(i == COUNT_OF(list->file)) {
                     list->file_count = i;
                     response.has_next = true;
@@ -379,7 +351,7 @@ static void rpc_system_storage_write_process(const PB_Main* request, void* conte
 
     bool result = true;
 
-    if(!rpc_system_storage_is_filename_correct(request->content.storage_write_request.path)) {
+    if(!path_contains_only_ascii(request->content.storage_write_request.path)) {
         rpc_storage->current_command_id = request->command_id;
         rpc_send_and_release_empty(
             session, rpc_storage->current_command_id, PB_CommandStatus_ERROR_STORAGE_INVALID_NAME);
@@ -433,7 +405,7 @@ static bool rpc_system_storage_is_dir_is_empty(Storage* fs_api, const char* path
         if(storage_dir_open(dir, path)) {
             char* name = malloc(MAX_NAME_LENGTH);
             while(storage_dir_read(dir, &fileinfo, name, MAX_NAME_LENGTH)) {
-                if(rpc_system_storage_is_filename_correct(name)) {
+                if(path_contains_only_ascii(name)) {
                     is_dir_is_empty = false;
                     break;
                 }
@@ -505,7 +477,7 @@ static void rpc_system_storage_mkdir_process(const PB_Main* request, void* conte
     Storage* fs_api = furi_record_open("storage");
     char* path = request->content.storage_mkdir_request.path;
     if(path) {
-        if(rpc_system_storage_is_filename_correct(path)) {
+        if(path_contains_only_ascii(path)) {
             FS_Error error = storage_common_mkdir(fs_api, path);
             status = rpc_system_storage_get_error(error);
         } else {
@@ -602,7 +574,7 @@ static void rpc_system_storage_rename_process(const PB_Main* request, void* cont
 
     Storage* fs_api = furi_record_open("storage");
 
-    if(rpc_system_storage_is_filename_correct(request->content.storage_rename_request.new_path)) {
+    if(path_contains_only_ascii(request->content.storage_rename_request.new_path)) {
         FS_Error error = storage_common_rename(
             fs_api,
             request->content.storage_rename_request.old_path,

+ 11 - 0
applications/snake_game/application.fam

@@ -0,0 +1,11 @@
+App(
+    appid="snake_game",
+    name="Snake Game",
+    apptype=FlipperAppType.PLUGIN,
+    entry_point="snake_game_app",
+    cdefines=["APP_SNAKE_GAME"],
+    requires=["gui"],
+    stack_size=1 * 1024,
+    icon="A_Plugins_14",
+    order=30,
+)

+ 19 - 0
applications/storage/application.fam

@@ -0,0 +1,19 @@
+App(
+    appid="storage",
+    name="StorageSrv",
+    apptype=FlipperAppType.SERVICE,
+    entry_point="storage_srv",
+    cdefines=["SRV_STORAGE"],
+    requires=["storage_settings"],
+    provides=["storage_start"],
+    stack_size=3 * 1024,
+    order=120,
+)
+
+App(
+    appid="storage_start",
+    apptype=FlipperAppType.STARTUP,
+    entry_point="storage_on_system_start",
+    requires=["storage"],
+    order=90,
+)

+ 9 - 0
applications/storage_settings/application.fam

@@ -0,0 +1,9 @@
+App(
+    appid="storage_settings",
+    name="Storage",
+    apptype=FlipperAppType.SETTINGS,
+    entry_point="storage_settings_app",
+    requires=["storage"],
+    stack_size=2 * 1024,
+    order=30,
+)

+ 24 - 0
applications/subghz/application.fam

@@ -0,0 +1,24 @@
+App(
+    appid="subghz",
+    name="Sub-GHz",
+    apptype=FlipperAppType.APP,
+    entry_point="subghz_app",
+    cdefines=["APP_SUBGHZ"],
+    requires=[
+        "gui",
+        "cli",
+        "dialogs",
+    ],
+    provides=["subghz_start"],
+    icon="A_Sub1ghz_14",
+    stack_size=2 * 1024,
+    order=10,
+)
+
+App(
+    appid="subghz_start",
+    apptype=FlipperAppType.STARTUP,
+    entry_point="subghz_on_system_start",
+    requires=["subghz"],
+    order=40,
+)

+ 1 - 1
applications/subghz/scenes/subghz_scene_save_success.c

@@ -1,6 +1,6 @@
 #include "../subghz_i.h"
 #include "../helpers/subghz_custom_event.h"
-#include "dolphin/helpers/dolphin_deed.h"
+#include <dolphin/helpers/dolphin_deed.h>
 #include <dolphin/dolphin.h>
 
 void subghz_scene_save_success_popup_callback(void* context) {

+ 9 - 0
applications/system/application.fam

@@ -0,0 +1,9 @@
+App(
+    appid="system_settings",
+    name="System",
+    apptype=FlipperAppType.SETTINGS,
+    entry_point="system_settings_app",
+    requires=["gui"],
+    stack_size=1 * 1024,
+    order=70,
+)

+ 14 - 0
applications/u2f/application.fam

@@ -0,0 +1,14 @@
+App(
+    appid="u2f",
+    name="U2F",
+    apptype=FlipperAppType.APP,
+    entry_point="u2f_app",
+    cdefines=["APP_U2F"],
+    requires=[
+        "gui",
+        "dialogs",
+    ],
+    stack_size=2 * 1024,
+    icon="A_U2F_14",
+    order=80,
+)

+ 18 - 0
applications/unit_tests/application.fam

@@ -0,0 +1,18 @@
+App(
+    appid="unit_tests",
+    apptype=FlipperAppType.STARTUP,
+    entry_point="unit_tests_on_system_start",
+    cdefines=["APP_UNIT_TESTS"],
+    provides=["delay_test"],
+    order=100,
+)
+
+App(
+    appid="delay_test",
+    name="Delay Test",
+    apptype=FlipperAppType.DEBUG,
+    entry_point="delay_test_app",
+    stack_size=1 * 1024,
+    requires=["unit_tests"],
+    order=110,
+)

+ 13 - 8
applications/unit_tests/rpc/rpc_test.c

@@ -16,6 +16,7 @@
 #include <pb_encode.h>
 #include <m-list.h>
 #include <lib/toolbox/md5.h>
+#include <lib/toolbox/path.h>
 #include <cli/cli.h>
 #include <loader/loader.h>
 #include <protobuf_version.h>
@@ -495,7 +496,7 @@ static void test_rpc_compare_messages(PB_Main* result, PB_Main* expected) {
     case PB_Main_storage_list_response_tag: {
         size_t expected_msg_files = expected->content.storage_list_response.file_count;
         size_t result_msg_files = result->content.storage_list_response.file_count;
-        mu_check(result_msg_files == expected_msg_files);
+        mu_assert_int_eq(expected_msg_files, result_msg_files);
         for(size_t i = 0; i < expected_msg_files; ++i) {
             PB_Storage_File* result_msg_file = &result->content.storage_list_response.file[i];
             PB_Storage_File* expected_msg_file = &expected->content.storage_list_response.file[i];
@@ -603,13 +604,17 @@ static void test_rpc_storage_list_create_expected_list(
                 MsgList_push_back(msg_list, response);
                 i = 0;
             }
-            list->file[i].type = (fileinfo.flags & FSF_DIRECTORY) ? PB_Storage_File_FileType_DIR :
-                                                                    PB_Storage_File_FileType_FILE;
-            list->file[i].size = fileinfo.size;
-            list->file[i].data = NULL;
-            /* memory free inside rpc_encode_and_send() -> pb_release() */
-            list->file[i].name = name;
-            ++i;
+
+            if(path_contains_only_ascii(name)) {
+                list->file[i].type = (fileinfo.flags & FSF_DIRECTORY) ?
+                                         PB_Storage_File_FileType_DIR :
+                                         PB_Storage_File_FileType_FILE;
+                list->file[i].size = fileinfo.size;
+                list->file[i].data = NULL;
+                /* memory free inside rpc_encode_and_send() -> pb_release() */
+                list->file[i].name = name;
+                ++i;
+            }
         } else {
             finish = true;
             free(name);

+ 1 - 1
applications/unit_tests/test_index.c

@@ -32,7 +32,7 @@ void minunit_print_progress(void) {
 }
 
 void minunit_print_fail(const char* str) {
-    printf(FURI_LOG_CLR_E "%s\n" FURI_LOG_CLR_RESET, str);
+    printf(FURI_LOG_CLR_E "%s\r\n" FURI_LOG_CLR_RESET, str);
 }
 
 void unit_tests_cli(Cli* cli, string_t args, void* context) {

+ 39 - 0
applications/updater/application.fam

@@ -0,0 +1,39 @@
+App(
+    appid="updater",
+    name="UpdaterSrv",
+    apptype=FlipperAppType.SERVICE,
+    cdefines=["SRV_UPDATER"],
+    requires=[
+        "gui",
+        "storage",
+    ],
+    conflicts=["desktop"],
+    entry_point="updater_srv",
+    stack_size=2 * 1024,
+    order=130,
+)
+
+App(
+    appid="updater_app",
+    name="UpdaterApp",
+    apptype=FlipperAppType.SYSTEM,
+    cdefines=["APP_UPDATER"],
+    requires=[
+        "gui",
+        "storage",
+        "bt",
+    ],
+    conflicts=["updater"],
+    provides=["updater_start"],
+    entry_point="updater_srv",
+    stack_size=2 * 1024,
+    order=10,
+)
+
+App(
+    appid="updater_start",
+    apptype=FlipperAppType.STARTUP,
+    entry_point="updater_on_system_start",
+    requires=["updater_app"],
+    order=110,
+)

+ 0 - 48
assets/Makefile

@@ -1,48 +0,0 @@
-PROJECT_ROOT		= $(abspath $(dir $(abspath $(firstword $(MAKEFILE_LIST))))..)
-
-include				$(PROJECT_ROOT)/assets/assets.mk
-include				$(PROJECT_ROOT)/assets/copro.mk
-
-.PHONY: all
-all: icons protobuf dolphin manifest
-
-$(ASSETS): $(ASSETS_SOURCES) $(ASSETS_COMPILER)
-	@echo "\tASSETS\t\t" $@
-	@$(ASSETS_COMPILER) icons "$(ASSETS_SOURCE_DIR)" "$(ASSETS_COMPILED_DIR)"
-
-.PHONY: icons
-icons: $(ASSETS)
-
-$(PROTOBUF) &: $(PROTOBUF_SOURCES) $(PROTOBUF_COMPILER)
-	@echo "\tPROTOBUF\t" $(PROTOBUF_FILENAMES)
-	@$(PROTOBUF_COMPILER) -q -I$(PROTOBUF_SOURCE_DIR) -D$(PROTOBUF_COMPILED_DIR) $(PROTOBUF_SOURCES)
-	@printf "#pragma once\n#define PROTOBUF_MAJOR_VERSION $(PROTOBUF_MAJOR_VERSION)\n#define PROTOBUF_MINOR_VERSION $(PROTOBUF_MINOR_VERSION)\n" > $(PROTOBUF_COMPILED_DIR)/protobuf_version.h
-
-.PHONY: protobuf
-protobuf: $(PROTOBUF)
-
-$(DOLPHIN_EXTERNAL_OUTPUT_DIR): $(DOLPHIN_SOURCE_DIR)
-	@echo "\tDOLPHIN blocking"
-	@$(ASSETS_COMPILER) dolphin -s dolphin_blocking "$(DOLPHIN_SOURCE_DIR)/blocking" "$(DOLPHIN_INTERNAL_OUTPUT_DIR)"
-	@echo "\tDOLPHIN internal"
-	@$(ASSETS_COMPILER) dolphin -s dolphin_internal "$(DOLPHIN_SOURCE_DIR)/internal" "$(DOLPHIN_INTERNAL_OUTPUT_DIR)"
-	@echo "\tDOLPHIN external"
-	@$(ASSETS_COMPILER) dolphin "$(DOLPHIN_SOURCE_DIR)/external" "$(DOLPHIN_EXTERNAL_OUTPUT_DIR)"
-
-.PHONY: manifest
-manifest:
-	$(ASSETS_COMPILER) manifest $(RESOURCES_DIR)
-
-.PHONY: dolphin
-dolphin: $(DOLPHIN_EXTERNAL_OUTPUT_DIR)
-
-.PHONY: copro_bundle
-copro_bundle:
-	@mkdir -p $(COPRO_BUNDLE_DIR)
-	@$(ASSETS_COMPILER) copro $(COPRO_CUBE_DIR) $(COPRO_BUNDLE_DIR) $(COPRO_MCU_FAMILY) --cube_ver=$(COPRO_CUBE_VERSION) --stack_type=$(COPRO_STACK_TYPE) --stack_file=$(COPRO_STACK_BIN) --stack_addr=$(COPRO_STACK_ADDR)
-
-clean:
-	@echo "\tCLEAN\t"
-	@$(RM) $(ASSETS_COMPILED_DIR)/*
-	@$(RM) -rf $(COPRO_BUNDLE_DIR)
-	@$(RM) -rf $(DOLPHIN_EXTERNAL_OUTPUT_DIR)

+ 4 - 5
assets/ReadMe.md

@@ -1,20 +1,18 @@
 # Requirements
 
 - Python3
-- ImageMagic
-- Make
+- Python3 packages: Pillow & heatshrink2 
 
 # Compiling
 
 ```bash
-make all
+./fbt icons proto dolphin_internal dolphin_blocking dolphin_ext resources
 ```
 
 # Compiling with Docker-Compose
 
 ```bash
-docker-compose exec dev make -C assets clean
-docker-compose exec dev make -C assets all
+docker-compose exec dev ./fbt icons proto dolphin_internal dolphin_blocking dolphin_ext resources
 ```
 
 # Asset naming rules
@@ -46,3 +44,4 @@ Don't include assets that you are not using, compiler is not going to strip unus
 - `icons`               - Icons sources. Goes to `compiled` folder.
 - `protobuf`            - Protobuf sources. Goes to `compiled` folder.
 - `resources`           - Assets that is going to be provisioned to SD card.
+- `slideshow`           - One-time slideshows for desktop 

+ 113 - 0
assets/SConscript

@@ -0,0 +1,113 @@
+Import("env")
+
+# HACHHACK
+# Currently injected to CPPPATH by libs - since they are built earlier and depend on assets
+# env.Append(
+#     CPPPATH=[
+#         Dir("./compiled"),
+#     ]
+# )
+
+assetsenv = env.Clone(
+    tools=["fbt_assets"],
+    FW_LIB_NAME="assets",
+)
+assetsenv.ApplyLibFlags()
+
+if not assetsenv["VERBOSE"]:
+    assetsenv.SetDefault(
+        ICONSCOMSTR="\tICONS\t${TARGET}",
+        PROTOCOMSTR="\tPROTO\t${SOURCE}",
+        DOLPHINCOMSTR="\tDOLPHIN\t${DOLPHIN_RES_TYPE}",
+        RESMANIFESTCOMSTR="\tMANIFEST\t${TARGET}",
+        PBVERCOMSTR="\tPBVER\t${TARGET}",
+    )
+
+# Gathering icons sources
+icons_src = assetsenv.GlobRecursive("*.png", "icons")
+icons_src += assetsenv.GlobRecursive("frame_rate", "icons")
+
+icons = assetsenv.IconBuilder(Dir("compiled"), Dir("#/assets/icons"))
+Depends(icons, icons_src)
+Alias("icons", icons)
+
+
+# Protobuf .proto -> .c + .h
+
+proto_src = Glob("protobuf/*.proto", source=True)
+proto_options = Glob("protobuf/*.options", source=True)
+proto = assetsenv.ProtoBuilder(Dir("compiled"), proto_src)
+Depends(proto, proto_options)
+# Precious(proto)
+Alias("proto", proto)
+
+
+# Internal animations
+
+dolphin_internal = assetsenv.DolphinSymBuilder(
+    Dir("compiled"),
+    Dir("#/assets/dolphin"),
+    DOLPHIN_RES_TYPE="internal",
+)
+Alias("dolphin_internal", dolphin_internal)
+
+
+# Blocking animations
+
+dolphin_blocking = assetsenv.DolphinSymBuilder(
+    Dir("compiled"),
+    Dir("#/assets/dolphin"),
+    DOLPHIN_RES_TYPE="blocking",
+)
+Alias("dolphin_blocking", dolphin_blocking)
+
+
+# Protobuf version meta
+proto_ver = assetsenv.ProtoVerBuilder(
+    "compiled/protobuf_version.h",
+    "#/assets/protobuf/Changelog",
+)
+Depends(proto_ver, proto)
+Alias("proto_ver", proto_ver)
+
+# Gather everything into a static lib
+assets_parts = (icons, proto, dolphin_blocking, dolphin_internal, proto_ver)
+
+assetslib = assetsenv.Library("${FW_LIB_NAME}", assets_parts)
+assetsenv.Install("${LIB_DIST_DIR}", assetslib)
+
+
+# Resources for SD card
+
+if assetsenv["IS_BASE_FIRMWARE"]:
+    # External dolphin animations
+    dolphin_external = assetsenv.DolphinExtBuilder(
+        Dir("#/assets/resources/dolphin"),
+        Dir("#/assets/dolphin"),
+        DOLPHIN_RES_TYPE="external",
+    )
+    NoClean(dolphin_external)
+    if assetsenv["FORCE"]:
+        AlwaysBuild(dolphin_external)
+    Alias("dolphin_ext", dolphin_external)
+
+    # Resources manifest
+
+    resources = assetsenv.Command(
+        "#/assets/resources/Manifest",
+        assetsenv.GlobRecursive("*", "resources", exclude="Manifest"),
+        action=Action(
+            '${PYTHON3} ${ASSETS_COMPILER} manifest "${TARGET.dir.posix}"',
+            "${RESMANIFESTCOMSTR}",
+        ),
+    )
+    Precious(resources)
+    NoClean(resources)
+    if assetsenv["FORCE"]:
+        AlwaysBuild(resources)
+
+    # Exporting resources node to external environment
+    env["FW_RESOURCES"] = resources
+    Alias("resources", resources)
+
+Return("assetslib")

+ 0 - 32
assets/assets.mk

@@ -1,32 +0,0 @@
-ASSETS_DIR			:= $(PROJECT_ROOT)/assets
-ASSETS_COMPILER		:= $(PROJECT_ROOT)/scripts/assets.py
-ASSETS_COMPILED_DIR	:= $(ASSETS_DIR)/compiled
-ASSETS_SOURCE_DIR	:= $(ASSETS_DIR)/icons
-
-ASSETS_SOURCES		+= $(shell find $(ASSETS_SOURCE_DIR) -type f -iname '*.png' -or -iname 'frame_rate')
-ASSETS				+= $(ASSETS_COMPILED_DIR)/assets_icons.c
-
-RESOURCES_DIR		:= $(ASSETS_DIR)/resources
-RESOURCES_MANIFEST	:= $(RESOURCES_DIR)/Manifest
-RESOURCES_FILES		:= $(shell find $(RESOURCES_DIR) ! -name Manifest -type f)
-
-DOLPHIN_SOURCE_DIR			:= $(ASSETS_DIR)/dolphin
-DOLPHIN_INTERNAL_OUTPUT_DIR	:= $(ASSETS_COMPILED_DIR)
-DOLPHIN_EXTERNAL_OUTPUT_DIR	:= $(ASSETS_DIR)/resources/dolphin
-
-PROTOBUF_SOURCE_DIR		:= $(ASSETS_DIR)/protobuf
-PROTOBUF_COMPILER		:= $(PROJECT_ROOT)/lib/nanopb/generator/nanopb_generator.py
-PROTOBUF_COMPILED_DIR	:= $(ASSETS_COMPILED_DIR)
-PROTOBUF_SOURCES		:= $(shell find $(PROTOBUF_SOURCE_DIR) -type f -iname '*.proto')
-PROTOBUF_FILENAMES		:= $(notdir $(addsuffix .pb.c,$(basename $(PROTOBUF_SOURCES))))
-PROTOBUF				:= $(addprefix $(PROTOBUF_COMPILED_DIR)/,$(PROTOBUF_FILENAMES)) $(PROTOBUF_COMPILED_DIR)/protobuf_version.h
-PROTOBUF_VERSION		:= $(shell git -C $(PROTOBUF_SOURCE_DIR) fetch --tags 2>/dev/null ; git -C $(PROTOBUF_SOURCE_DIR) describe --tags --abbrev=0 2>/dev/null || echo 'unknown')
-PROTOBUF_MAJOR_VERSION	:= $(word 1,$(subst ., ,$(PROTOBUF_VERSION)))
-PROTOBUF_MINOR_VERSION	:= $(word 2,$(subst ., ,$(PROTOBUF_VERSION)))
-$(if $(PROTOBUF_MAJOR_VERSION),,$(error "Protobuf major version is not specified, $$PROTOBUF_VERSION=$(PROTOBUF_VERSION), please perform git fetch in assets/protobuf directory"))
-$(if $(PROTOBUF_MINOR_VERSION),,$(error "Protobuf minor version is not specified, $$PROTOBUF_VERSION=$(PROTOBUF_VERSION), please perform git fetch in assets/protobuf directory"))
-
-PROTOBUF_CFLAGS			+= -DPB_ENABLE_MALLOC
-
-CFLAGS				+= -I$(ASSETS_COMPILED_DIR) $(PROTOBUF_CFLAGS)
-C_SOURCES			+= $(wildcard $(ASSETS_COMPILED_DIR)/*.c)

+ 0 - 18
assets/compiled/application.pb.c

@@ -1,18 +0,0 @@
-/* Automatically generated nanopb constant definitions */
-/* Generated by nanopb-0.4.5 */
-
-#include "application.pb.h"
-#if PB_PROTO_HEADER_VERSION != 40
-#error Regenerate this file with the current version of nanopb generator.
-#endif
-
-PB_BIND(PB_App_StartRequest, PB_App_StartRequest, AUTO)
-
-
-PB_BIND(PB_App_LockStatusRequest, PB_App_LockStatusRequest, AUTO)
-
-
-PB_BIND(PB_App_LockStatusResponse, PB_App_LockStatusResponse, AUTO)
-
-
-

+ 0 - 79
assets/compiled/application.pb.h

@@ -1,79 +0,0 @@
-/* Automatically generated nanopb header */
-/* Generated by nanopb-0.4.5 */
-
-#ifndef PB_PB_APP_APPLICATION_PB_H_INCLUDED
-#define PB_PB_APP_APPLICATION_PB_H_INCLUDED
-#include <pb.h>
-
-#if PB_PROTO_HEADER_VERSION != 40
-#error Regenerate this file with the current version of nanopb generator.
-#endif
-
-/* Struct definitions */
-typedef struct _PB_App_LockStatusRequest { 
-    char dummy_field;
-} PB_App_LockStatusRequest;
-
-typedef struct _PB_App_StartRequest { 
-    char *name; 
-    char *args; 
-} PB_App_StartRequest;
-
-typedef struct _PB_App_LockStatusResponse { 
-    bool locked; 
-} PB_App_LockStatusResponse;
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Initializer values for message structs */
-#define PB_App_StartRequest_init_default         {NULL, NULL}
-#define PB_App_LockStatusRequest_init_default    {0}
-#define PB_App_LockStatusResponse_init_default   {0}
-#define PB_App_StartRequest_init_zero            {NULL, NULL}
-#define PB_App_LockStatusRequest_init_zero       {0}
-#define PB_App_LockStatusResponse_init_zero      {0}
-
-/* Field tags (for use in manual encoding/decoding) */
-#define PB_App_StartRequest_name_tag             1
-#define PB_App_StartRequest_args_tag             2
-#define PB_App_LockStatusResponse_locked_tag     1
-
-/* Struct field encoding specification for nanopb */
-#define PB_App_StartRequest_FIELDLIST(X, a) \
-X(a, POINTER,  SINGULAR, STRING,   name,              1) \
-X(a, POINTER,  SINGULAR, STRING,   args,              2)
-#define PB_App_StartRequest_CALLBACK NULL
-#define PB_App_StartRequest_DEFAULT NULL
-
-#define PB_App_LockStatusRequest_FIELDLIST(X, a) \
-
-#define PB_App_LockStatusRequest_CALLBACK NULL
-#define PB_App_LockStatusRequest_DEFAULT NULL
-
-#define PB_App_LockStatusResponse_FIELDLIST(X, a) \
-X(a, STATIC,   SINGULAR, BOOL,     locked,            1)
-#define PB_App_LockStatusResponse_CALLBACK NULL
-#define PB_App_LockStatusResponse_DEFAULT NULL
-
-extern const pb_msgdesc_t PB_App_StartRequest_msg;
-extern const pb_msgdesc_t PB_App_LockStatusRequest_msg;
-extern const pb_msgdesc_t PB_App_LockStatusResponse_msg;
-
-/* Defines for backwards compatibility with code written before nanopb-0.4.0 */
-#define PB_App_StartRequest_fields &PB_App_StartRequest_msg
-#define PB_App_LockStatusRequest_fields &PB_App_LockStatusRequest_msg
-#define PB_App_LockStatusResponse_fields &PB_App_LockStatusResponse_msg
-
-/* Maximum encoded size of messages (where known) */
-/* PB_App_StartRequest_size depends on runtime parameters */
-#define PB_App_LockStatusRequest_size            0
-#define PB_App_LockStatusResponse_size           2
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif

+ 0 - 330
assets/compiled/assets_dolphin_blocking.c

@@ -1,330 +0,0 @@
-#include <assets_dolphin_blocking.h>
-#include <desktop/animations/animation_storage_i.h>
-#include <desktop/animations/animation_manager.h>
-#include <gui/icon_i.h>
-
-
-
-const uint8_t _A_L0_NoDb_128x51_0[] = {
-    0x1,0x0,0x43,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xff,0x11,0x0,0x88,0x0,0x4,0x16,0x34,0x0,0x10,0xc1,0x1,0xf7,0x20,0x7,0xbe,0x62,0x19,0x9c,0x9d,0xdd,0xf3,0x91,0x99,0x1c,0x9a,0x3b,0x7,0x27,0xa6,0xa2,0x25,0x52,0xc9,0x65,0x2a,0x5a,0x4b,0x4,0xa7,0x4a,0x1f,0x10,0x79,0xf2,0x1,0xe7,0x92,0x9e,0x48,0x41,0xef,0x88,0x7,0x9c,0x4a,0xb,0x22,0x7,0xc0,0xfc,0x62,0x77,0x7e,0xe6,0x62,0x43,0xc6,0x92,0x8f,0xd5,0x3f,0xe0,0xff,0x7,0xf8,0x3f,0xc1,0xf9,0x7,0x7,0xbd,0xc2,0x3c,0xaf,0x2a,0x7,0xff,0xf3,0xfc,0x7,0xb6,0x22,0x44,0xf,0x2d,0x7,0xff,0x1d,0xfb,0x7,0xa6,0x2,0x73,0x8,0x91,0x63,0x27,0x70,0x7e,0x85,0xff,0xf7,0xf7,0x7,0xa5,0x2,0x95,0x70,0x91,0x54,0xb1,0x50,0x4f,0x86,0xff,0xfb,0xef,0x7,0xb6,0x2,0x45,0x42,0x7,0x9f,0xfc,0x1e,0xe3,0xf1,0xf,0x9f,0x7e,0x3f,0xdf,0x1f,0xad,0x24,0xbe,0x38,0xc8,0x5c,0x1c,0x1e,0x3e,0xfe,0xf1,0xfe,0xc1,0xe3,0xff,0x7,0xe7,0x0,0x5a,0x22,0xf5,0x7,0xc6,0xfc,0x1f,0xa5,0xf7,0x7,0xc6,0xfc,0x1e,0xff,0xe6,0xd1,0x40,0x68,0x17,0xff,0xff,0x9c,0x1e,0xb8,0x8,0x8,0x10,0xa0,0x4b,0xf1,0xff,0x70,0xc1,0xeb,0xc0,0x2,0x1c,0x13,0xa0,0xdf,0x1c,0x0,0x3e,0xfe,0xf,0xf1,0x83,0x83,0xda,0x11,0x2,0x80,0x42,0x1,0xe5,0xff,0x87,0xdf,0x81,0xeb,0x18,0x81,0xc0,0x23,0x0,0xf3,0x8f,0xdf,0x1,0xeb,0xa8,0x99,0x59,0xe7,0x0,0xf3,0x9f,0xde,0x1,0xeb,0x48,0xa5,0x64,0x6f,0x0,0xf3,0xbf,0x83,0xda,0x11,0x4a,0xf8,0x87,0xd3,0xfe,0xf,0x88,0x88,0xfd,0x4,0x2,0xf,0x69,0x95,0x84,0xbe,0x80,0xf7,0x3f,0xb0,0x3f,0xc1,0xf0,0xbf,0x40,0x7c,0xe0,0x1,0x24,0xdf,0x1f,0x0,0x10,0xa7,0xee,0xf5,0x7,0x98,0x25,0x40,0x1e,0x0,0xf0,0x7,0x80,0x28
-};
-
-const uint8_t _A_L0_NoDb_128x51_1[] = {
-    0x1,0x0,0x45,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xff,0x11,0x0,0x88,0x0,0x4,0x16,0x34,0x0,0x10,0xc1,0x1,0xf7,0x20,0x7,0xbe,0x62,0x19,0x9c,0x9d,0xdd,0xf3,0x91,0x99,0x1c,0x9a,0x3b,0x7,0x27,0xa6,0xa2,0x25,0x52,0xc9,0x65,0x2a,0x5a,0x4b,0x4,0xa7,0x4a,0x1f,0x10,0x79,0xf2,0x1,0xe7,0x92,0x9e,0x48,0x41,0xef,0x88,0x7,0x9c,0x4a,0xb,0x22,0x7,0xc0,0xfc,0x62,0x77,0x7e,0xe6,0x62,0x43,0xc6,0x92,0x8f,0xd5,0x3f,0xe0,0xff,0x7,0xf8,0x3f,0xc1,0xf9,0x1f,0xfe,0x3,0xda,0xe1,0x1e,0x57,0x95,0x3,0xff,0xe7,0xf9,0x83,0xdb,0x11,0x22,0x7,0x96,0x83,0xff,0x3b,0xf7,0x3,0xd3,0x1,0x39,0x84,0x48,0xb1,0x93,0xb8,0x3f,0x43,0xff,0xed,0xef,0x83,0xd2,0x81,0x4a,0xb8,0x48,0xaa,0x58,0xa8,0x27,0xc3,0xff,0xf6,0xdf,0x83,0xdb,0x1,0x22,0xa1,0x3,0xcf,0xfc,0xf,0x71,0xf8,0x87,0xce,0xff,0x1f,0xbf,0x8f,0xd6,0x92,0x5f,0x1c,0x64,0x2e,0xe,0xf,0x1f,0x7d,0xf8,0xff,0x60,0xf1,0xff,0x83,0xf3,0x80,0x2d,0x11,0x7a,0x83,0xe0,0x9c,0x20,0xfc,0x2f,0xb8,0x3e,0x37,0xc0,0xf7,0xff,0x36,0x8a,0x2,0xbf,0x1f,0xee,0x7c,0x1e,0xb8,0x8,0x8,0x10,0xa0,0x4b,0xf1,0xfd,0xc3,0xc1,0xeb,0xc0,0x2,0x1c,0x11,0x7e,0x3e,0x78,0x1d,0xf8,0x1f,0x4a,0xf1,0x8f,0xc7,0x2f,0x80,0xf5,0x84,0x40,0xa0,0x10,0x80,0x79,0x7f,0xe7,0xf7,0x80,0x7a,0xc6,0x20,0x70,0x8,0xc0,0x3c,0xef,0xf7,0x0,0x7a,0xea,0x26,0x56,0x79,0xc0,0x3c,0xff,0xf6,0x0,0x7a,0xd2,0x29,0x59,0x1b,0xc0,0x3d,0x2c,0x23,0xf6,0xa5,0x7c,0x43,0xeb,0x63,0x7,0xbc,0x44,0x7e,0x84,0x1,0x7,0xb4,0xca,0xc2,0x5f,0x40,0x7b,0x9f,0xd8,0x1f,0xe0,0xf8,0x5f,0xa0,0x3e,0x70,0x0,0x92,0x6f,0x8f,0x80,0x8,0x53,0xf7,0x7a,0x83,0xcc,0x12,0xa0,0xf,0x0,0x78,0x3,0xc0,0x14
-};
-
-const uint8_t _A_L0_NoDb_128x51_2[] = {
-    0x1,0x0,0x43,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xff,0x11,0x0,0x88,0x0,0x4,0x16,0x34,0x0,0x10,0xc1,0x1,0xf7,0x20,0x7,0xbe,0x62,0x19,0x9c,0x9d,0xdd,0xf3,0x91,0x99,0x1c,0x9a,0x3b,0x7,0x27,0xa6,0xa2,0x25,0x52,0xc9,0x65,0x2a,0x5a,0x4b,0x4,0xa7,0x4a,0x1f,0x10,0x79,0xf2,0x1,0xe7,0x92,0x9e,0x48,0x41,0xef,0x88,0x7,0x9c,0x4a,0xb,0x22,0x7,0xc0,0xfc,0x62,0x77,0x7e,0xe6,0x62,0x43,0xc6,0x92,0x8f,0xd5,0x3f,0xe0,0xff,0x7,0xf8,0x3f,0xc1,0xfe,0xa,0x5b,0x84,0x79,0x5e,0x54,0x0,0x7c,0xe2,0x24,0x40,0xf2,0xd0,0x7f,0xe3,0xff,0xc0,0x7a,0x60,0x27,0x30,0x89,0x16,0x32,0x77,0x7,0xe8,0x7f,0xfc,0xff,0x30,0x7a,0x50,0x29,0x57,0x9,0x15,0x4b,0x15,0x4,0xf8,0x7f,0xe7,0x7e,0xe0,0x7b,0x60,0x24,0x54,0x20,0x79,0xfb,0x7b,0xe0,0xf6,0x1f,0x88,0x7d,0x22,0xdb,0xf1,0xfa,0xd2,0x4b,0xe3,0x8c,0x85,0xc1,0xc1,0xe3,0xee,0xdf,0x1f,0xef,0xe1,0x7f,0xff,0xdf,0x81,0xf7,0xc0,0xbf,0x80,0x8,0x1f,0x83,0xe1,0x7,0xea,0x78,0x43,0xfe,0xf,0x6f,0xf2,0xe8,0xa0,0x2b,0xf1,0xff,0x1b,0xd4,0xe0,0x30,0x10,0x21,0x40,0x97,0xe2,0xf,0x7e,0x0,0x10,0xe0,0x8b,0xf1,0xfe,0xe7,0xc1,0xf6,0x8f,0x1f,0xdc,0x3c,0x1e,0xd0,0x88,0x14,0x2,0x10,0xf,0x2f,0x3c,0xe,0xfc,0xf,0x58,0xc4,0xe,0x1,0x18,0x7,0x94,0x7e,0x39,0x7c,0x7,0xae,0xa2,0x65,0x67,0x9c,0x3,0xcb,0xff,0x3f,0xbc,0x3,0xd6,0x91,0x4a,0xc8,0xde,0x1,0xe7,0x7f,0xb8,0xf,0xda,0x95,0xf1,0xf,0xa7,0xfe,0xc0,0xf,0x78,0x88,0xfc,0xc0,0x3,0x61,0x7,0xb4,0xca,0xc2,0x5f,0x30,0x0,0xd8,0xcf,0xf8,0x40,0x20,0x7f,0x83,0xd5,0x7e,0x80,0xf9,0xc0,0x2,0x49,0xbe,0x3e,0x0,0x21,0x4f,0xdd,0xea,0xf,0x30,0x4a,0x80,0x3c,0x1,0xe0,0xf,0x0,0x50
-};
-
-const uint8_t _A_L0_NoDb_128x51_3[] = {
-    0x1,0x0,0x43,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xff,0x11,0x0,0x88,0x0,0x4,0x16,0x34,0x0,0x10,0xc1,0x1,0xf7,0x20,0x7,0xbe,0x62,0x19,0x9c,0x9d,0xdd,0xf3,0x91,0x99,0x1c,0x9a,0x3b,0x7,0x27,0xa6,0xa2,0x25,0x52,0xc9,0x65,0x2a,0x5a,0x4b,0x4,0xa7,0x4a,0x1f,0x10,0x79,0xf2,0x1,0xe7,0x92,0x9e,0x48,0x41,0xef,0x88,0x7,0x9c,0x4a,0xb,0x22,0x7,0xc0,0xfc,0x62,0x77,0x7e,0xe6,0x62,0x43,0xc6,0x92,0x8f,0xd5,0x3f,0xe0,0xff,0x7,0xf8,0x3f,0xc1,0xfe,0xa,0x5b,0x84,0x79,0x5e,0x54,0x0,0x7c,0xe2,0x24,0x40,0xf2,0xd0,0x7f,0xe0,0xe0,0xf5,0xc0,0x4e,0x61,0x12,0x2c,0x64,0xee,0xf,0xd0,0xff,0xfe,0x7f,0x80,0xf4,0xa0,0x52,0xae,0x12,0x2a,0x96,0x2a,0x9,0xf0,0xff,0xe3,0xbf,0x60,0xf6,0xc0,0x48,0xa8,0x40,0xf2,0xbf,0xfe,0xfe,0xe0,0xf6,0x1f,0x88,0x7c,0xf7,0xf1,0xdf,0x78,0xfd,0x69,0x25,0xf1,0xc6,0x42,0xe0,0xe0,0xf1,0xf7,0xfb,0x8f,0xf7,0xf0,0xef,0xff,0xfb,0xc0,0xfb,0xe0,0x77,0xef,0xe0,0x11,0x7,0xe6,0xfc,0x1f,0xdf,0xf0,0xff,0x83,0xdf,0xfc,0xba,0x28,0xd,0x3,0x7f,0xff,0x37,0xa9,0xc0,0x60,0x20,0x42,0x81,0x68,0x1,0xf1,0xc0,0x2,0x1c,0x13,0xa1,0x7f,0xff,0xf9,0xc1,0xf6,0xbf,0x1f,0xf7,0xc,0x1e,0xd0,0x88,0x14,0x2,0x10,0xf,0x2f,0xce,0x0,0x1e,0xd1,0x88,0x1c,0x2,0x30,0xf,0x28,0x3c,0x1c,0x1e,0xda,0x89,0x95,0x9e,0x70,0xf,0x2f,0xfc,0x3e,0xfc,0xf,0x5a,0x45,0x2b,0x23,0x78,0x7,0x9c,0x7e,0xf8,0x3f,0x6a,0x57,0xc4,0x3e,0x93,0xfb,0xc0,0x3d,0xe2,0x23,0xf3,0xff,0xdf,0xc1,0xef,0x32,0xb0,0x97,0xcc,0x0,0x20,0xf6,0x3f,0xb0,0x80,0x81,0xfe,0xf,0x55,0xfa,0x3,0xe7,0x0,0x9,0x26,0xf8,0xf8,0x0,0x85,0x3f,0x77,0xa8,0x3c,0xc1,0x2a,0x0,0xf0,0x7,0x80,0x3c,0x1,0x40
-};
-
-
-const uint8_t * const _A_L0_NoDb_128x51[] = {
-
-    _A_L0_NoDb_128x51_0,
-
-    _A_L0_NoDb_128x51_1,
-
-    _A_L0_NoDb_128x51_2,
-
-    _A_L0_NoDb_128x51_3,
-
-};
-
-
-
-const uint8_t L0_NoDb_128x51_frame_order[] = { 0, 1, 2, 3 };
-
-const BubbleAnimation BA_L0_NoDb_128x51 = {
-    .icon_animation = {
-        .width = 128,
-        .height = 51,
-        .frame_count = 4,
-        .frame_rate = 2,
-        .frames = _A_L0_NoDb_128x51
-    },
-    .frame_order = L0_NoDb_128x51_frame_order,
-    .passive_frames = 4,
-    .active_frames = 0,
-    .active_cooldown = 0,
-    .active_cycles = 0,
-    .duration = 0,
-
-    .frame_bubble_sequences = NULL,
-    .frame_bubble_sequences_count = 0,
-
-};
-
-
-const uint8_t _A_L0_SdBad_128x51_0[] = {
-    0x1,0x0,0x1,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xfe,0x1,0x82,0x4,0xc,0x4a,0x1,0x70,0x8f,0x1,0x46,0x8,0xf,0x5e,0x30,0x24,0x60,0x50,0xc,0x44,0x88,0x1f,0x1a,0xaa,0x64,0xeb,0xaf,0x71,0x84,0x48,0xb1,0x93,0xb8,0x39,0x3d,0x72,0x55,0x2a,0x50,0x4,0x6e,0x12,0x2a,0x96,0x28,0x3e,0x20,0xf4,0xc1,0x3,0xcf,0x1,0x22,0xa1,0x3,0xf0,0x7e,0x21,0xf9,0xc6,0x52,0xea,0x57,0x22,0xf8,0xe3,0x21,0x63,0xf6,0x0,0x1d,0x1,0x3f,0xd3,0x5,0x7f,0x83,0xfc,0x1f,0xe0,0xf5,0xcf,0xfc,0xee,0x77,0xe0,0x5b,0x7e,0x28,0x10,0x18,0x25,0x2,0x7f,0xf9,0x93,0x87,0xde,0x11,0x0,0x7,0x8e,0x82,0xff,0xfc,0xc7,0x83,0xe2,0xb9,0x19,0x83,0xf4,0x1,0xf5,0x78,0xa9,0x69,0x60,0x9f,0x1,0x7d,0xd4,0xb7,0xa0,0xf1,0x27,0xd0,0x3c,0x70,0xa0,0xf1,0x37,0xd0,0xfc,0xc1,0xf6,0x0,0x30,0x7f,0xf0,0x1,0xff,0xff,0x83,0xfe,0x1,0xfb,0xf9,0xf0,0x83,0xf6,0x19,0xc6,0x7,0xb0,0xe8,0xe0,0x34,0xf,0xfc,0x1b,0x90,0xf,0x69,0x80,0xc,0xa0,0x5a,0xf,0xfc,0xd8,0x1e,0xf1,0x80,0x19,0x41,0x3a,0x5,0xd1,0xfe,0x3,0xec,0xff,0x51,0x8b,0x84,0x8a,0x4,0xf,0xcc,0x44,0x4a,0xc,0xf,0xd8,0x54,0x38,0x1f,0xb0,0x68,0xf0,0x7f,0xc7,0xfe,0x5f,0xf0,0x7e,0x1f,0xfc,0x1f,0xd3,0x85,0xf9,0x83,0xe8,0x14,0x70,0x1f,0x0,0x10,0xa7,0xe0,0xf5,0x5,0x18,0x25,0x40,0x1e,0x0,0xf0,0x7,0x80,0x28
-};
-
-const uint8_t _A_L0_SdBad_128x51_1[] = {
-    0x1,0x0,0x12,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xfe,0x1,0x82,0x4,0xc,0x4a,0x1,0x70,0x8f,0x1,0x46,0x8,0xf,0x5e,0x30,0x24,0x60,0x50,0xc,0x44,0x88,0x1f,0x1a,0xaa,0x64,0xeb,0xaf,0x71,0x84,0x48,0xb1,0x93,0xb8,0x39,0x3d,0x72,0x55,0x2a,0x50,0x4,0x6e,0x12,0x2a,0x96,0x28,0x3e,0x20,0xf4,0xc1,0x3,0xcf,0x1,0x22,0xa1,0x3,0xf0,0x7e,0x21,0xf9,0xc6,0x52,0xea,0x57,0x22,0xf8,0xe3,0x21,0x63,0xf6,0x0,0x1d,0x1,0x3f,0xd3,0x5,0x7f,0x83,0xfc,0x1f,0xe0,0xf5,0xcf,0xfc,0xee,0x77,0xe0,0x5b,0x7e,0x28,0x10,0x18,0x25,0x2,0x7f,0xf9,0x93,0x87,0xde,0x11,0x0,0x7,0x8e,0x82,0xff,0xfc,0xc7,0x83,0xe2,0xb9,0x19,0x83,0xf4,0x1,0xf5,0x78,0xa9,0x69,0x60,0x9f,0x1,0x7d,0xd4,0xb7,0xa0,0xf1,0x27,0xd0,0x3c,0x70,0xa0,0xf1,0x37,0xd0,0xfc,0xc1,0xf6,0x0,0x30,0x7f,0xf0,0x1,0xff,0xff,0x81,0xfc,0x1,0xfb,0xf8,0xe0,0x83,0xf2,0xff,0x4c,0xc3,0x3,0xd8,0x74,0x70,0x15,0xf8,0xe1,0xa1,0x0,0xf6,0x98,0x0,0xca,0x5,0xa0,0x9f,0xc5,0xa1,0x20,0xf6,0x8c,0x0,0xca,0x9,0xd0,0xbb,0xcf,0xb3,0x17,0xb0,0x7d,0x7c,0x3e,0xf3,0xff,0xc0,0x3d,0xee,0x12,0x28,0x10,0x3c,0x7d,0xee,0x1,0xbe,0x83,0xdb,0x11,0x12,0x83,0x2f,0xec,0x1e,0x30,0xa8,0x70,0x3f,0x60,0xd1,0xe0,0xff,0x83,0xf4,0x7f,0xc5,0xf4,0x7,0xd1,0xfd,0x1,0xfe,0xf,0x99,0xc2,0xfc,0xc1,0xf4,0xa,0x38,0xf,0x80,0x8,0x53,0xf0,0x7a,0x82,0x8c,0x12,0xa0,0xf,0x0,0x78,0x3,0xc0,0x14
-};
-
-
-const uint8_t * const _A_L0_SdBad_128x51[] = {
-
-    _A_L0_SdBad_128x51_0,
-
-    _A_L0_SdBad_128x51_1,
-
-};
-
-
-
-const uint8_t L0_SdBad_128x51_frame_order[] = { 0, 1 };
-
-const BubbleAnimation BA_L0_SdBad_128x51 = {
-    .icon_animation = {
-        .width = 128,
-        .height = 51,
-        .frame_count = 2,
-        .frame_rate = 2,
-        .frames = _A_L0_SdBad_128x51
-    },
-    .frame_order = L0_SdBad_128x51_frame_order,
-    .passive_frames = 2,
-    .active_frames = 0,
-    .active_cooldown = 0,
-    .active_cycles = 0,
-    .duration = 0,
-
-    .frame_bubble_sequences = NULL,
-    .frame_bubble_sequences_count = 0,
-
-};
-
-
-const uint8_t _A_L0_SdOk_128x51_0[] = {
-    0x1,0x0,0x19,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xfc,0xe,0x54,0xec,0xe,0x0,0x8,0x35,0x48,0x20,0x3e,0x2a,0x20,0xf3,0xa8,0x3,0xeb,0xc3,0xdc,0x9c,0xc9,0x2a,0xb1,0xc8,0x19,0x3d,0xeb,0xf9,0x1c,0x94,0x90,0x1e,0x3a,0x48,0x20,0x3d,0xea,0x20,0xf5,0x83,0x83,0xf8,0xff,0x3,0xf1,0xce,0x4e,0x3b,0x15,0x41,0xfc,0xa7,0xfc,0x1f,0xe0,0xff,0x7,0xcc,0x1f,0xf8,0xf,0xdf,0xcf,0xcc,0x1e,0x8a,0xa1,0xb8,0x47,0x80,0xa5,0x40,0xff,0xff,0xbd,0xe0,0xf6,0xc4,0x48,0x80,0xa5,0xa0,0xbf,0xff,0xfb,0xe0,0xf1,0xb0,0x4b,0xa3,0x38,0x79,0xcc,0x22,0x45,0x8c,0x9d,0xc1,0xfa,0x1b,0xff,0xfe,0xfc,0x1e,0x31,0x9,0x4e,0x96,0x89,0x4a,0xb8,0x48,0xaa,0x58,0xa8,0x27,0xc0,0x1e,0x92,0x9,0x4e,0xf4,0x1e,0x38,0x9,0x15,0x8,0x1e,0x5d,0xf3,0x70,0x83,0xc6,0x81,0x29,0xc2,0x83,0xc4,0x7e,0x21,0xf3,0x7,0xa4,0xc3,0x9d,0x18,0xc3,0xd2,0x4b,0xe3,0x8c,0x85,0xc1,0xc1,0xea,0x0,0x90,0x78,0x9f,0x84,0x1f,0x7c,0x0,0x7f,0xf7,0xfe,0xe0,0xfe,0x1f,0xef,0x0,0xfe,0x80,0xa5,0x75,0x14,0x6,0x80,0xf,0x99,0x80,0xc,0xa0,0x4b,0xf5,0x0,0x24,0x61,0xaa,0x7d,0x6,0xfb,0x83,0xdb,0xe0,0xff,0x70,0x79,0x34,0x6,0x4,0xf,0x28,0x3f,0xf0,0x1e,0xf8,0x88,0x94,0x18,0x1e,0x40,0x1,0x7,0xc4,0x2a,0x1c,0xf,0xd8,0x34,0x78,0x3f,0xe0,0xfd,0x1f,0xf1,0x7d,0x41,0xf2,0x7f,0x50,0x7f,0x83,0xe2,0x70,0xbf,0x30,0x7d,0x2,0x8e,0x3,0xe0,0x2,0x14,0xfc,0x1e,0xa0,0xa3,0x4,0xa8,0x3,0xc0,0x1e,0x0,0xf0,0x5,0x0
-};
-
-const uint8_t _A_L0_SdOk_128x51_1[] = {
-    0x1,0x0,0x1e,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xfc,0xe,0x54,0xec,0xe,0x0,0x8,0x35,0x48,0x20,0x3e,0x2a,0x20,0xf3,0xa8,0x3,0xeb,0xc3,0xdc,0x9c,0xc9,0x2a,0xb1,0xc8,0x19,0x3d,0xeb,0xf9,0x1c,0x94,0x90,0x1e,0x3a,0x48,0x20,0x3d,0xea,0x20,0xf5,0x83,0x83,0xf8,0xff,0x3,0xf1,0xce,0x4e,0x3b,0x15,0x41,0xfc,0xa7,0xfc,0x1f,0xe0,0xff,0x7,0xcc,0x1f,0xf8,0xf,0xdf,0xcf,0xcc,0x1e,0x8a,0xa1,0xb8,0x47,0x80,0xa5,0x40,0xff,0xff,0xbd,0xe0,0xf6,0xc4,0x48,0x80,0xa5,0xa0,0xbf,0xff,0xfb,0xe0,0xf1,0xb0,0x4b,0xa3,0x38,0x79,0xcc,0x22,0x45,0x8c,0x9d,0xc1,0xfa,0x1b,0xff,0xfe,0xfc,0x1e,0x31,0x9,0x4e,0x96,0x89,0x4a,0xb8,0x48,0xaa,0x58,0xa8,0x27,0xc0,0x1e,0x92,0x9,0x4e,0xf4,0x1e,0x38,0x9,0x15,0x8,0x1e,0x5d,0xf3,0x70,0x83,0xc6,0x81,0x29,0xc2,0x83,0xc4,0x7e,0x21,0xf3,0x7,0xa4,0xc3,0x9d,0x18,0xc3,0xd2,0x4b,0xe3,0x8c,0x85,0xc1,0xc1,0xea,0x0,0x90,0x78,0x9f,0x84,0x1f,0x7c,0xe,0xff,0x8c,0x1f,0xd8,0x70,0x7f,0x63,0xc1,0xfb,0xbf,0xcf,0x9f,0xc8,0x14,0xae,0xa2,0x80,0xd0,0x11,0xe8,0x0,0x49,0x80,0xc,0xa0,0x4b,0xf5,0x0,0x24,0x61,0xaa,0x7d,0x6,0xfb,0x83,0xdb,0xe0,0xff,0x70,0x79,0x34,0x6,0x4,0xf,0x28,0x3f,0xf0,0x1e,0xf8,0x88,0x94,0x18,0x1e,0x40,0x1,0x7,0xc4,0x2a,0x1c,0xf,0xd8,0x34,0x78,0x3f,0xe0,0xfd,0x1f,0xf1,0x7d,0x41,0xf2,0x7f,0x50,0x7f,0x83,0xe2,0x70,0xbf,0x30,0x7d,0x2,0x8e,0x3,0xe0,0x2,0x14,0xfc,0x1e,0xa0,0xa3,0x4,0xa8,0x3,0xc0,0x1e,0x0,0xf0,0x5,0x0
-};
-
-const uint8_t _A_L0_SdOk_128x51_2[] = {
-    0x1,0x0,0x22,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xfc,0xe,0x54,0xec,0xe,0x0,0x8,0x35,0x48,0x20,0x3e,0x2a,0x20,0xf3,0xa8,0x3,0xeb,0xc3,0xdc,0x9c,0xc9,0x2a,0xb1,0xc8,0x19,0x3d,0xeb,0xf9,0x1c,0x94,0x90,0x1e,0x3a,0x48,0x20,0x3d,0xea,0x20,0xf5,0x83,0x83,0xf8,0xff,0x3,0xf1,0xce,0x4e,0x3b,0x15,0x41,0xfc,0xa7,0xfc,0x1f,0xe0,0xff,0x7,0xcc,0x1f,0xf8,0xf,0xdf,0xcf,0xcc,0x1e,0x8a,0xa1,0xb8,0x47,0x80,0xa5,0x40,0xff,0xff,0xbd,0xe0,0xf6,0xc4,0x48,0x80,0xa5,0xa0,0xbf,0xff,0xfb,0xe0,0xf1,0xb0,0x4b,0xa3,0x38,0x79,0xcc,0x22,0x45,0x8c,0x9d,0xc1,0xfa,0x1b,0xff,0xfe,0xfc,0x1e,0x31,0x9,0x4e,0x96,0x89,0x4a,0xb8,0x48,0xaa,0x58,0xa8,0x27,0xc0,0x1e,0x92,0x9,0x4e,0xf4,0x1e,0x38,0x9,0x15,0x8,0x1e,0x5d,0xf3,0x70,0x83,0xc6,0x81,0x29,0xc2,0x83,0xc4,0x7e,0x21,0xf3,0x7,0xa4,0xc3,0x9d,0x18,0xc3,0xd2,0x4b,0xe3,0x8c,0x85,0xc1,0xc1,0xe5,0x7d,0x3f,0xd8,0x3c,0x7e,0x77,0xc0,0x7d,0xf0,0x3b,0xf6,0x30,0x7f,0x41,0xef,0xc0,0xfd,0x87,0x93,0xc8,0x1f,0x5b,0xfc,0xf9,0xfc,0x81,0x4a,0xea,0x28,0xd,0x1,0x1e,0x80,0x4,0x98,0x0,0xca,0x4,0xbf,0x50,0x2,0x46,0x1a,0xa7,0xd0,0x6f,0xb8,0x3d,0xbe,0xf,0xf7,0x7,0x93,0x40,0x60,0x40,0xf2,0x83,0xff,0x1,0xef,0x88,0x89,0x41,0x81,0xe4,0x0,0x10,0x7c,0x42,0xa1,0xc0,0xfd,0x83,0x47,0x83,0xfe,0xf,0xd1,0xff,0x17,0xd4,0x1f,0x27,0xf5,0x7,0xf8,0x3e,0x27,0xb,0xf3,0x7,0xd0,0x28,0xe0,0x3e,0x0,0x21,0x4f,0xc1,0xea,0xa,0x30,0x4a,0x80,0x3c,0x1,0xe0,0xf,0x0,0x50
-};
-
-const uint8_t _A_L0_SdOk_128x51_3[] = {
-    0x1,0x0,0x26,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xfc,0xe,0x54,0xec,0xe,0x0,0x8,0x35,0x48,0x20,0x3e,0x2a,0x20,0xf3,0xa8,0x3,0xeb,0xc3,0xdc,0x9c,0xc9,0x2a,0xb1,0xc8,0x19,0x3d,0xeb,0xf9,0x1c,0x94,0x90,0x1e,0x3a,0x48,0x20,0x3d,0xea,0x20,0xf5,0x83,0x83,0xf8,0xff,0x3,0xf1,0xce,0x4e,0x3b,0x15,0x41,0xfc,0xa7,0xfc,0x1f,0xe0,0xff,0x7,0xcc,0x1f,0xf8,0xf,0xdf,0xcf,0xcc,0x1e,0x8a,0xa1,0xb8,0x47,0x80,0xa5,0x40,0xff,0xff,0xbd,0xe0,0xf6,0xc4,0x48,0x80,0xa5,0xa0,0xbf,0xff,0xfb,0xe0,0xf1,0xb0,0x4b,0xa3,0x38,0x79,0xcc,0x22,0x45,0x8c,0x9d,0xc1,0xfa,0x1b,0xff,0xfe,0xfc,0x1e,0x31,0x9,0x4e,0x96,0x89,0x4a,0xb8,0x48,0xaa,0x58,0xa8,0x27,0xc0,0x1e,0x92,0x9,0x4e,0xf4,0x1e,0x38,0x9,0x15,0x8,0x1e,0x5d,0xf3,0x70,0x83,0xc6,0x81,0x29,0xc2,0x83,0xc4,0x7e,0x21,0xf3,0x7,0x8d,0xcc,0x1e,0x33,0xe,0x74,0x63,0xf,0x49,0x2f,0x8e,0x32,0x17,0x7,0x7,0x95,0xc4,0xff,0x60,0xf1,0xf9,0xde,0x1,0xf7,0xc0,0xef,0xd8,0xef,0x80,0xfd,0x83,0xdf,0x81,0xfb,0xf,0x2f,0x90,0x3e,0xb7,0xf9,0xf3,0xf9,0x2,0x95,0xd4,0x50,0x1a,0x2,0x3d,0x0,0x9,0x30,0x1,0x94,0x9,0x7e,0xa0,0x4,0x8c,0x35,0x4f,0xa0,0xdf,0x70,0x7b,0x7c,0x1f,0xee,0xf,0x26,0x80,0xc0,0x81,0xe5,0x7,0xfe,0x3,0xdf,0x11,0x12,0x83,0x3,0xc8,0x0,0x20,0xf8,0x85,0x43,0x81,0xfb,0x6,0x8f,0x7,0xfc,0x1f,0xa3,0xfe,0x2f,0xa8,0x3e,0x4f,0xea,0xf,0xf0,0x7c,0x4e,0x17,0xe6,0xf,0xa0,0x51,0xc0,0x7c,0x0,0x42,0x9f,0x83,0xd4,0x14,0x60,0x95,0x0,0x78,0x3,0xc0,0x1e,0x0,0xa0
-};
-
-
-const uint8_t * const _A_L0_SdOk_128x51[] = {
-
-    _A_L0_SdOk_128x51_0,
-
-    _A_L0_SdOk_128x51_1,
-
-    _A_L0_SdOk_128x51_2,
-
-    _A_L0_SdOk_128x51_3,
-
-};
-
-
-
-const uint8_t L0_SdOk_128x51_frame_order[] = { 0, 1, 2, 3 };
-
-const BubbleAnimation BA_L0_SdOk_128x51 = {
-    .icon_animation = {
-        .width = 128,
-        .height = 51,
-        .frame_count = 4,
-        .frame_rate = 2,
-        .frames = _A_L0_SdOk_128x51
-    },
-    .frame_order = L0_SdOk_128x51_frame_order,
-    .passive_frames = 4,
-    .active_frames = 0,
-    .active_cooldown = 0,
-    .active_cycles = 0,
-    .duration = 0,
-
-    .frame_bubble_sequences = NULL,
-    .frame_bubble_sequences_count = 0,
-
-};
-
-
-const uint8_t _A_L0_Url_128x51_0[] = {
-    0x1,0x0,0x2d,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xfc,0x16,0xf0,0x38,0x80,0x3f,0x28,0x10,0x40,0x7f,0x58,0x27,0x10,0x32,0x7d,0xd0,0x32,0xd9,0x8,0x20,0x3f,0x32,0x80,0xff,0x7,0xee,0x2,0xc7,0x10,0x1f,0xe2,0x7f,0xc1,0xfe,0xf,0xf0,0x7d,0x7e,0x1,0x89,0x4,0x7,0x9c,0x1c,0x1e,0x71,0xca,0xc,0x16,0x1,0x8,0x7,0x94,0xa,0x81,0xff,0xfc,0xff,0x1,0xe5,0xba,0x91,0x40,0x41,0xe5,0x2,0x0,0x8e,0x83,0xff,0x8e,0xfd,0x83,0xcb,0xe5,0x22,0xba,0xc3,0xb9,0xd2,0x4c,0x96,0x3a,0x7,0xd0,0xbf,0xfe,0xfe,0xe0,0xf2,0x9f,0x58,0xb2,0xb1,0x29,0x4c,0x97,0x23,0x52,0x81,0x7c,0x37,0xff,0xdf,0x78,0x3c,0xaf,0x52,0x20,0x78,0xfa,0x41,0xeb,0xff,0x7,0xa4,0x8c,0x3e,0x5a,0x4c,0x80,0x3c,0xbb,0xf1,0xfe,0xf8,0x3c,0xbf,0x92,0x1b,0xad,0x3b,0x9d,0x98,0xf0,0xf,0xc4,0x1e,0x3e,0xfe,0xf1,0xfd,0x22,0x5,0xc1,0x0,0x8,0xc,0x41,0xe3,0xff,0x7,0x98,0x0,0x41,0xed,0xc0,0x16,0x88,0xbc,0xc0,0x10,0xf,0x1d,0xf8,0x3f,0x4b,0xea,0xf,0xad,0xf8,0x3e,0x3f,0xd,0xa1,0x80,0xd0,0x2f,0xff,0xff,0x38,0x3d,0xe0,0xc5,0x2,0x5f,0x8f,0xfb,0x86,0xf,0x78,0x1b,0xc4,0xba,0xd,0xf1,0xc0,0x3,0xef,0xe0,0xff,0x18,0x38,0x3d,0xf8,0x78,0x98,0x40,0x3c,0xbf,0xf0,0xfb,0xf0,0x3d,0xa4,0x74,0xa8,0xc0,0x3c,0xe3,0xf7,0xc0,0x7b,0xca,0xa7,0x0,0xf3,0x9f,0xde,0x1,0xef,0x1a,0xbc,0x3,0xce,0xfe,0xf,0x80,0xfa,0xff,0xc1,0xf0,0x3f,0x51,0x0,0x97,0xf4,0x1f,0x7,0xf5,0x7,0xf8,0x3e,0x60,0xeb,0xf2,0x7,0xdf,0xf9,0xbe,0x5e,0x0,0x79,0x4f,0xc1,0xed,0xfc,0x5,0x8,0x25,0x80,0x1e,0x0,0xf0,0x7,0x80,0x24
-};
-
-const uint8_t _A_L0_Url_128x51_1[] = {
-    0x1,0x0,0x2d,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xfc,0x16,0xf0,0x38,0x80,0x3f,0x28,0x10,0x40,0x7f,0x58,0x27,0x10,0x32,0x7d,0xd0,0x32,0xd9,0x8,0x20,0x3f,0x32,0x80,0xff,0x7,0xee,0x2,0xc7,0x10,0x1f,0xe2,0x7f,0xc1,0xfe,0xf,0xf0,0x7d,0x7e,0x1,0x89,0x4,0x7,0x9c,0x7f,0xf8,0xf,0x28,0xe5,0x6,0xb,0x0,0x84,0x3,0xca,0x5,0x40,0xff,0xf9,0xfe,0x60,0xf2,0xdd,0x48,0xa0,0x20,0xf2,0x81,0x0,0x47,0x41,0xff,0x9d,0xfb,0x81,0xe5,0xf2,0x91,0x5d,0x61,0xdc,0xe9,0x26,0x4b,0x1d,0x3,0xe8,0x7f,0xfd,0xbd,0xf0,0x79,0x4f,0xac,0x59,0x58,0x94,0xa6,0x4b,0x91,0xa9,0x40,0xbe,0x1f,0xff,0xb6,0xfc,0x1e,0x57,0xa9,0x10,0x3c,0x7d,0x20,0xf5,0xff,0x3,0xd2,0x46,0x1f,0x2d,0x26,0x40,0x1e,0x57,0xf8,0xfd,0xfc,0x1e,0x5f,0xc9,0xd,0xd6,0x9d,0xce,0xcc,0x78,0x7,0xe2,0xf,0x1f,0x7d,0xf8,0xfe,0x91,0x2,0xe0,0x80,0x4,0x6,0x20,0xf1,0xff,0x83,0xcc,0x0,0x20,0xf6,0xe0,0xb,0x44,0x5e,0x60,0x8,0x7,0x89,0x38,0x41,0xf8,0x5f,0x50,0x7d,0x6f,0x81,0xf1,0xf8,0x6d,0xc,0x5,0x7e,0x3f,0xdc,0xf8,0x3d,0xe0,0xc5,0x2,0x5f,0x8f,0xee,0x1e,0xf,0x78,0x1b,0xc4,0x97,0xe3,0xe7,0x81,0xdf,0x81,0xf4,0xaf,0x18,0xfc,0x72,0xf8,0xf,0x6e,0x1e,0x26,0x10,0xf,0x2f,0xfc,0xfe,0xf0,0xf,0x69,0x1d,0x2a,0x30,0xf,0x3b,0xfd,0xc0,0x1e,0xf2,0xa9,0xc0,0x3c,0xff,0xf6,0x0,0x7b,0xc6,0xaf,0x0,0xf4,0xb0,0x87,0xfa,0xc6,0x3f,0xd2,0x0,0x97,0xf4,0x1f,0x7,0xf5,0x7,0xf8,0x3e,0x60,0xeb,0xf2,0x7,0xdf,0xf9,0xbe,0x5e,0x0,0x79,0x4f,0xc1,0xed,0xfc,0x5,0x8,0x25,0x80,0x1e,0x0,0xf0,0x7,0x80,0x24
-};
-
-const uint8_t _A_L0_Url_128x51_2[] = {
-    0x1,0x0,0x29,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xfc,0x16,0xf0,0x38,0x80,0x3f,0x28,0x10,0x40,0x7f,0x58,0x27,0x10,0x32,0x7d,0xd0,0x32,0xd9,0x8,0x20,0x3f,0x32,0x80,0xff,0x7,0xee,0x2,0xc7,0x10,0x1f,0xe2,0x7f,0xc1,0xfe,0xf,0xf0,0x7d,0x7e,0x1,0x89,0x4,0x7,0xc4,0x72,0x83,0x5,0x80,0x42,0x1,0xe5,0x2,0xa0,0x3,0xd7,0x75,0x22,0x80,0x83,0xca,0x4,0x1,0x1d,0x7,0xfe,0x3f,0xfc,0x7,0x97,0xca,0x45,0x75,0x87,0x73,0xa4,0x99,0x2c,0x74,0xf,0xa1,0xff,0xf3,0xfc,0xc1,0xe5,0x3e,0xb1,0x65,0x62,0x52,0x99,0x2e,0x46,0xa5,0x2,0xf8,0x7f,0xe7,0x7e,0xe0,0x79,0x5e,0xa4,0x40,0xf1,0xf4,0x83,0xd7,0xdb,0xdf,0x7,0x9c,0x8c,0x3e,0x5a,0x4c,0x80,0x3c,0xe2,0xdb,0xf0,0x79,0x7f,0x24,0x37,0x5a,0x77,0x3b,0x31,0xe0,0x1f,0x88,0x3c,0x7d,0xdb,0xe3,0xfa,0x44,0xb,0x82,0x0,0x10,0x18,0xfc,0x2f,0xff,0xfb,0xf2,0x7d,0x1,0xed,0xc0,0xbf,0x80,0x9,0x5f,0x40,0xf1,0x1f,0x8,0x3f,0x53,0xc2,0x1f,0xf0,0x7b,0xfe,0x17,0x43,0x1,0x5f,0x8f,0xf8,0xde,0x60,0x4,0x83,0x14,0x9,0x7e,0x20,0xf9,0x81,0xbc,0x49,0x7e,0x3f,0xdc,0xf8,0x3e,0xd1,0xe3,0xfb,0x87,0x83,0xdf,0x87,0x89,0x84,0x3,0xcb,0xcf,0x3,0xbf,0x3,0xda,0x47,0x4a,0x8c,0x3,0xca,0x3f,0x1c,0xbe,0x3,0xde,0x55,0x38,0x7,0x97,0xfe,0x7f,0x78,0x7,0xbc,0x6a,0xf0,0xf,0x3b,0xfd,0xc0,0x3f,0xbf,0xfb,0x0,0xff,0x0,0x3,0x61,0x2f,0xe0,0x0,0x6c,0x67,0xfc,0x20,0x10,0x3f,0xc1,0xed,0x7,0x5f,0x90,0x3e,0xff,0xcd,0xf2,0xf0,0x3,0xca,0x7e,0xf,0x6f,0xe0,0x28,0x41,0x2c,0x0,0xf0,0x7,0x80,0x3c,0x1,0x20
-};
-
-const uint8_t _A_L0_Url_128x51_3[] = {
-    0x1,0x0,0x2a,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf8,0x7,0xfc,0x0,0x33,0xf0,0x75,0x60,0x1,0xe5,0x7f,0x7,0xde,0x4e,0x49,0x49,0xb9,0x3,0xfc,0x16,0xf0,0x38,0x80,0x3f,0x28,0x10,0x40,0x7f,0x58,0x27,0x10,0x32,0x7d,0xd0,0x32,0xd9,0x8,0x20,0x3f,0x32,0x80,0xff,0x7,0xee,0x2,0xc7,0x10,0x1f,0xe2,0x7f,0xc1,0xfe,0xf,0xf0,0x7d,0x7e,0x1,0x89,0x4,0x7,0xc4,0x72,0x83,0x5,0x80,0x42,0x1,0xe5,0x2,0xa0,0x3,0xd7,0x75,0x22,0x80,0x83,0xca,0x4,0x1,0x1d,0x7,0xfe,0xe,0xf,0x3f,0x94,0x8a,0xeb,0xe,0xe7,0x49,0x32,0x58,0xe8,0x1f,0x43,0xff,0xf9,0xfe,0x3,0xca,0x7d,0x62,0xca,0xc4,0xa5,0x32,0x5c,0x8d,0x4a,0x5,0xf0,0xff,0xe3,0xbf,0x60,0xf2,0xbd,0x48,0x81,0xe3,0xe9,0x7,0xa5,0xff,0xf7,0xf7,0x7,0x9c,0x8c,0x3e,0x5a,0x4c,0x80,0x3c,0xb7,0xf1,0xdf,0x78,0x3c,0xbf,0x92,0x1b,0xad,0x3b,0x9d,0x98,0xf0,0xf,0xc4,0x1e,0x3e,0xff,0x71,0xfd,0x22,0x5,0xc1,0x0,0x8,0xc,0x7e,0x1d,0xff,0xff,0x79,0x3e,0x80,0xf6,0xe0,0x77,0xef,0xe0,0x11,0x57,0xd0,0x3c,0x77,0xe0,0xfe,0xff,0x87,0xfc,0x1f,0x1f,0x85,0xd0,0xc0,0x68,0x1b,0xff,0xf9,0xbc,0xc0,0x9,0x6,0x28,0x16,0x80,0x1f,0x50,0x37,0x89,0x74,0x2f,0xff,0xff,0x38,0x3e,0xd7,0xe3,0xfe,0xe1,0x83,0xdf,0x87,0x89,0x84,0x3,0xcb,0xf3,0x80,0x7,0xbc,0x8e,0x95,0x18,0x7,0x94,0x1e,0xe,0xf,0x89,0x54,0xe0,0x1e,0x5f,0xf8,0x7d,0xf8,0x1e,0xf1,0xab,0xc0,0x3c,0xe3,0xf7,0xc0,0xfe,0xcf,0xef,0x3,0xfc,0xff,0xdf,0xc1,0xee,0x5f,0x50,0x0,0x83,0xdc,0xfe,0xa2,0x2,0x7,0xf8,0x3d,0xa0,0xeb,0xf2,0x7,0xdf,0xf9,0xbe,0x5e,0x0,0x79,0x4f,0xc1,0xed,0xfc,0x5,0x8,0x25,0x80,0x1e,0x0,0xf0,0x7,0x80,0x24
-};
-
-
-const uint8_t * const _A_L0_Url_128x51[] = {
-
-    _A_L0_Url_128x51_0,
-
-    _A_L0_Url_128x51_1,
-
-    _A_L0_Url_128x51_2,
-
-    _A_L0_Url_128x51_3,
-
-};
-
-
-
-const uint8_t L0_Url_128x51_frame_order[] = { 0, 1, 2, 3 };
-
-const BubbleAnimation BA_L0_Url_128x51 = {
-    .icon_animation = {
-        .width = 128,
-        .height = 51,
-        .frame_count = 4,
-        .frame_rate = 2,
-        .frames = _A_L0_Url_128x51
-    },
-    .frame_order = L0_Url_128x51_frame_order,
-    .passive_frames = 4,
-    .active_frames = 0,
-    .active_cooldown = 0,
-    .active_cycles = 0,
-    .duration = 0,
-
-    .frame_bubble_sequences = NULL,
-    .frame_bubble_sequences_count = 0,
-
-};
-
-
-const uint8_t _A_L0_NewMail_128x51_0[] = {
-    0x1,0x0,0x50,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf0,0x7,0x80,0x3c,0x1,0xe0,0x6,0xf8,0x40,0x40,0x63,0x30,0xfb,0x73,0x61,0x80,0xf7,0xfe,0x41,0xc0,0x63,0x70,0x9b,0x73,0x1,0xf1,0xfe,0x87,0x83,0xf7,0xff,0x1f,0x1,0x8e,0xc3,0xed,0xd9,0x83,0x3,0xdf,0x7e,0xf,0x39,0xb7,0x60,0x1e,0xf8,0xc,0xfc,0xfc,0x9e,0x53,0x7f,0xc1,0x14,0x81,0xeb,0xbf,0x7,0xa4,0xc2,0x6,0xa,0x2f,0xf8,0x0,0xc1,0xe9,0xf6,0x98,0x83,0xcb,0x80,0x1f,0x80,0x2,0xd0,0x11,0x24,0xf,0xc8,0x10,0x14,0xe1,0xf1,0xe0,0x7c,0x41,0xf,0xef,0xc,0xe3,0x6c,0x6c,0x20,0xf2,0x84,0x27,0xde,0x39,0xc7,0x7,0xa4,0x40,0x1e,0x7f,0xd3,0xc9,0x47,0x2c,0xfb,0x30,0x79,0xc8,0x9,0xe6,0xdf,0x3d,0xe0,0x3d,0x68,0x4,0x43,0x2,0x1e,0xb3,0xcd,0xb3,0x90,0x82,0x8b,0x0,0xa,0x29,0x0,0x3c,0xfd,0x93,0x6d,0xb0,0x3c,0xe0,0x2,0xa2,0x88,0x3,0xce,0x98,0xf,0x10,0x51,0x2,0x45,0x0,0x50,0x80,0x7b,0x5b,0xc1,0xe6,0x80,0x28,0x20,0x3c,0xd1,0xec,0x1c,0x10,0x20,0xc0,0x81,0xf6,0x80,0x28,0x8,0x3e,0xe6,0x7,0xe1,0x7,0xe5,0x21,0xa6,0x40,0xfb,0xc2,0x1f,0x84,0x9e,0x9f,0xef,0xf8,0x0,0x4e,0x2,0x6f,0x28,0xc,0x40,0xde,0x63,0x41,0x9,0x91,0xec,0x51,0xe5,0x2,0x84,0x23,0xcf,0x80,0x2d,0x33,0xd8,0xab,0xca,0x9,0x4,0x57,0x98,0x3d,0xc1,0x43,0xf8,0x81,0xb3,0xcf,0x81,0x8,0x16,0xc,0x20,0x1e,0x4e,0xf4,0x7,0x9c,0x62,0x7,0x0,0x8c,0x3,0xc9,0x1c,0x40,0x1,0xa0,0x83,0xcb,0x51,0x32,0xb3,0xce,0x1,0xe4,0xae,0x20,0x0,0xd0,0x81,0xe5,0x48,0xa5,0x64,0x6f,0x0,0xf2,0x67,0x10,0x0,0x68,0x83,0xf3,0xa5,0x7c,0x43,0xe6,0xee,0x20,0x0,0xa8,0xc4,0x1e,0x71,0x11,0xf9,0xa1,0x8e,0x1,0x50,0x7,0x9c,0xca,0xc2,0x5f,0x23,0xb2,0x40,0x2c,0x7,0xf8,0xc0,0x2d,0x48,0x0,0x33,0xf0,0x7c,0x0,0x23,0x80,0xbf,0x50,0x4,0xa,0x10,0x98,0x80,0x6,0x7,0x98,0x3a,0x80,0x1e,0x0,0xf0,0x7,0x80,0x14
-};
-
-const uint8_t _A_L0_NewMail_128x51_1[] = {
-    0x1,0x0,0x5d,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf0,0x7,0x80,0x3c,0x1,0xe0,0xa,0x98,0x7d,0xb9,0xb0,0xc0,0x7d,0xdc,0x26,0xdc,0xc0,0x7f,0x83,0xe3,0xe1,0x1,0x1,0x8e,0xc3,0xed,0xd9,0x83,0x3,0x13,0xfd,0xf,0x80,0x7f,0x20,0xe0,0xf2,0x9b,0x76,0x1,0xe9,0xc0,0x80,0xdc,0x2,0x46,0x4f,0x19,0xbf,0xe0,0x2a,0x40,0x1,0x9c,0x7f,0xb1,0xf0,0x3f,0xfc,0x7c,0x1e,0x73,0x8,0x18,0x38,0xb0,0x1c,0x7f,0xfd,0xfe,0x79,0xbf,0x7,0x9f,0xda,0x62,0xf,0x3b,0x87,0xf3,0xff,0xff,0xe3,0xe7,0xe7,0xe6,0x68,0xe7,0x3,0x84,0x0,0x3b,0xf0,0x7c,0x60,0x1,0xc6,0xf,0xae,0x0,0x3e,0x21,0x9c,0x6d,0x8d,0x84,0xa,0x34,0x0,0x7c,0x47,0x38,0xe0,0xf4,0x41,0xa4,0x3e,0x3c,0xf,0x2b,0x3e,0xcc,0x1e,0x70,0x40,0x79,0x9f,0xcf,0x78,0xf,0x58,0x42,0xc9,0xa0,0x1a,0xcf,0x36,0xce,0x42,0xf,0x28,0x80,0x3c,0xff,0xaa,0x92,0xf6,0x4d,0xb6,0xc0,0xf3,0xd0,0x13,0x8d,0xbe,0x74,0xc0,0x78,0x81,0x4a,0x81,0x40,0xf,0x10,0x11,0x1,0xe5,0x6f,0x5,0x16,0x0,0x14,0x52,0x0,0x79,0x80,0x14,0x12,0x22,0x42,0x88,0x3,0xef,0xfc,0x3f,0x18,0x78,0x3e,0xf0,0x82,0xe1,0x82,0x3,0xee,0x90,0x3,0x18,0x10,0x3e,0xe6,0xe,0x31,0x80,0x83,0xcc,0x6e,0x5f,0xf2,0x58,0x82,0x45,0x20,0x40,0xf3,0xa,0x8,0x4c,0xa0,0x40,0xf2,0x58,0x10,0xbc,0xf8,0x2,0xd3,0x66,0x8,0x24,0x5a,0x4,0x4f,0x30,0x7c,0x8,0xc4,0x44,0x20,0xf3,0x84,0x2,0x6,0x10,0xf,0x34,0x7b,0x70,0x23,0x10,0x38,0x4,0x60,0x1e,0x4a,0xf7,0xe0,0x6a,0x26,0x56,0x79,0xc0,0x3c,0x99,0xef,0xc0,0xa4,0x52,0xb2,0x37,0x80,0x79,0x48,0x1,0xe5,0x80,0x1f,0xa5,0x2b,0xe2,0x1f,0x33,0xf1,0x0,0x6,0x82,0xf,0x48,0x88,0xfc,0xcf,0xc4,0x0,0x1a,0x10,0x3c,0xe6,0x56,0x12,0xf9,0x9f,0x88,0x0,0x34,0x43,0xfc,0x9f,0x88,0x0,0x2d,0x31,0x7,0xc2,0xd8,0xe0,0x15,0x0,0x79,0x2f,0xd4,0x2c,0x90,0xb,0x1,0x8c,0x9b,0xc4,0xdf,0x20,0x32,0x7f,0xe7,0xe1,0x32,0x3,0x98,0x71,0x0,0x1e,0x0,0xf0,0x7,0x80,0x2c
-};
-
-const uint8_t _A_L0_NewMail_128x51_2[] = {
-    0x1,0x0,0x79,0x1,0x0,0x78,0x3,0xc0,0x1e,0x0,0xf0,0x1,0xfc,0x20,0x20,0xfd,0x84,0x40,0x81,0xfb,0xf6,0x86,0x83,0xf7,0xf3,0x13,0x3,0x24,0xc3,0xed,0xcd,0x86,0x1,0xcf,0x81,0xfe,0xb7,0x83,0xd2,0xe1,0x36,0xe6,0x3,0xd2,0x41,0xff,0xcf,0x83,0xf3,0xb1,0xff,0xbf,0xc0,0xc0,0xe7,0xb0,0xfb,0x76,0x60,0xc0,0x73,0xf2,0x7f,0xff,0xf0,0x40,0x7a,0x4d,0xbb,0x0,0xf4,0xfd,0x83,0xc6,0x36,0x82,0x39,0x84,0xdf,0xf1,0x7,0x7,0x16,0x3,0xf8,0xf,0x19,0x3f,0xf0,0x12,0x40,0xf1,0x98,0xd,0xcc,0x1c,0x40,0x2,0x87,0x9b,0xce,0x62,0xf,0x31,0xda,0x7f,0xe3,0xe8,0xd8,0x7,0xa6,0xfc,0x1f,0x25,0x33,0xc0,0x67,0xe7,0xe0,0xf8,0x82,0x83,0xcf,0x7e,0xf,0x28,0x67,0x1b,0x63,0x61,0x5,0x16,0x1c,0x9a,0x5b,0xf0,0x79,0xc7,0x38,0xe0,0xf3,0xe0,0x1c,0xd0,0x1e,0x96,0x7d,0x98,0x3c,0xa8,0x0,0xf8,0xde,0x3,0xd5,0x46,0x90,0xf8,0xf0,0xc,0x75,0x9e,0x6d,0x9c,0x84,0x1e,0x58,0x41,0xf9,0x4f,0xcf,0xe7,0xec,0x9b,0x6d,0x81,0xe7,0x8,0xf,0x9f,0xf9,0x3e,0x54,0xc0,0x78,0xb1,0x4a,0x81,0x10,0x7,0x9f,0xf4,0x8a,0x40,0xf2,0xb7,0x83,0xca,0x40,0x4f,0x36,0xf9,0x80,0x16,0x81,0xc0,0x1f,0x95,0xfe,0x80,0x9e,0x8a,0x6,0x0,0x8,0x52,0x0,0x7d,0x40,0x5,0x45,0x10,0x7,0xdc,0x8,0xd8,0x30,0x80,0x7d,0xff,0x20,0x1e,0x8,0x38,0x3c,0xff,0xc4,0x82,0x15,0x88,0x24,0x69,0x0,0x31,0x81,0x3,0xcb,0x0,0x62,0x38,0x10,0x3c,0xa6,0x0,0xa2,0x7,0x97,0x0,0x5a,0x70,0x40,0x79,0x24,0x8,0x1f,0x8b,0x2,0x17,0x9f,0x2,0x10,0x2c,0x18,0x40,0x3c,0xc0,0x62,0x2,0x10,0x79,0xc6,0x20,0x70,0x8,0xc0,0x3c,0xc2,0xc2,0x17,0x10,0x79,0xea,0x26,0x56,0x79,0xc0,0x3c,0xd1,0xed,0xc0,0xa4,0x52,0xb2,0x37,0x80,0x79,0x2b,0xdc,0x7e,0x34,0xaf,0x88,0x7c,0xd1,0x46,0x4,0x30,0x79,0x44,0x47,0xe6,0xef,0x40,0x7a,0x4c,0xac,0x25,0xf3,0x3f,0x10,0x0,0x68,0x27,0xf9,0x3f,0x10,0x0,0x68,0x40,0xf9,0x3f,0x10,0x0,0x68,0x80,0xf2,0x5f,0xb1,0xf8,0x80,0x2,0xd3,0x12,0x18,0xb7,0x89,0xbe,0x61,0x63,0x80,0x54,0x0,0x64,0xf,0x31,0xb3,0x40,0x2c,0x0,0x54,0x0,0x18,0x99,0x3f,0xf3,0xf0,0x7c,0x0,0x3c,0x1,0xc0
-};
-
-const uint8_t _A_L0_NewMail_128x51_3[] = {
-    0x1,0x0,0x77,0x1,0x0,0x1f,0xe2,0x6,0xf,0xd8,0x24,0x10,0x1f,0xbf,0xa8,0x58,0x3f,0x7f,0xb1,0x70,0x76,0x60,0x3f,0xd2,0xf0,0x7e,0x50,0x3f,0xf5,0xf0,0x7e,0x68,0x3f,0xfb,0xf0,0x7e,0x74,0x3f,0xf7,0xf8,0x8,0x1c,0xe6,0x1f,0x6e,0x6c,0x30,0xc,0x5f,0xcf,0xf8,0x0,0xa0,0xe0,0x82,0xb8,0x4d,0xb9,0x80,0xf3,0x3e,0x20,0x10,0xc1,0xff,0xb0,0xfb,0x76,0x60,0xc0,0xfc,0x9b,0x76,0x1,0xf9,0x30,0x9b,0xfe,0x8,0xc7,0x84,0x27,0x14,0xff,0xe8,0x61,0x20,0x78,0xcc,0x1b,0x6,0x1f,0x4f,0xe0,0x64,0x8d,0xe3,0x31,0x7,0xc7,0xfa,0x1e,0xed,0x90,0x21,0xff,0xe3,0xe0,0xf8,0x1f,0xa6,0xfc,0x1f,0x26,0x33,0xc0,0x67,0xe7,0xe0,0x41,0x86,0x71,0xb6,0x36,0x10,0x59,0x41,0x41,0xe7,0xbf,0x7,0x94,0x73,0x8e,0xf,0x3c,0x0,0x7d,0x1,0xe9,0x67,0xd9,0x83,0xcb,0x81,0x87,0x1f,0x96,0xfc,0x1e,0x7b,0xc0,0x7a,0x50,0x12,0x66,0x1f,0x4d,0x67,0x9b,0x67,0x21,0x7,0x90,0xbc,0xe0,0x10,0xf8,0xf0,0xc,0x7d,0x93,0x6d,0xb0,0x3c,0xcf,0xf1,0x4c,0x7,0x8a,0xd4,0xa8,0x18,0x83,0xf9,0xa7,0xcc,0x1e,0x56,0xf0,0x79,0x44,0x3,0xe7,0xfd,0x22,0x98,0x1,0x28,0x12,0x2,0x79,0xfc,0x5,0x24,0xf,0x6a,0x0,0x11,0xc1,0xed,0x80,0x1f,0x98,0x3e,0xa0,0x2,0xa2,0x88,0x3,0xee,0x4,0x6c,0x18,0x40,0x3c,0xff,0xc2,0x82,0xd,0x88,0x24,0x70,0x90,0x9,0x4,0x10,0x1e,0x58,0x2,0x91,0xc0,0x81,0xe5,0x48,0x1,0x8c,0x8,0x1e,0x5c,0x1,0x69,0xa7,0x4,0x12,0x33,0x0,0xd1,0x3,0xed,0x20,0x40,0xf4,0x84,0xb,0x6,0x10,0xf,0x38,0x40,0xd8,0x81,0xe7,0x18,0x81,0xc0,0x23,0x0,0xf3,0x68,0x11,0x3c,0xf8,0x1a,0x89,0x95,0x9e,0x70,0xf,0x31,0x30,0x88,0x84,0x1e,0x74,0x8a,0x56,0x46,0xf0,0xf,0x34,0x7b,0xf,0xc6,0x95,0xf1,0xf,0x9e,0x0,0xac,0x52,0x0,0x7a,0xc4,0x47,0xe6,0xcf,0x70,0x78,0xcc,0xac,0x25,0xf3,0x77,0xa1,0xfe,0x8f,0xc4,0x0,0x1a,0x8,0x3e,0x4f,0xc4,0x0,0x1a,0x10,0x3c,0x97,0xec,0x7e,0x20,0x0,0xd1,0x6,0x64,0xde,0x26,0xf9,0x9f,0x88,0x0,0x2d,0x31,0x0,0x8,0x3c,0xcb,0x44,0x26,0x38,0x5,0x40,0x8,0x60,0x4,0x23,0x24,0x2,0xc0,0xf,0x81,0xb2,0x7f,0xe7,0xe0,0xf8,0x0,0x70
-};
-
-
-const uint8_t * const _A_L0_NewMail_128x51[] = {
-
-    _A_L0_NewMail_128x51_0,
-
-    _A_L0_NewMail_128x51_1,
-
-    _A_L0_NewMail_128x51_2,
-
-    _A_L0_NewMail_128x51_3,
-
-};
-
-
-
-const uint8_t L0_NewMail_128x51_frame_order[] = { 0, 1, 2, 3, 2, 1 };
-
-const BubbleAnimation BA_L0_NewMail_128x51 = {
-    .icon_animation = {
-        .width = 128,
-        .height = 51,
-        .frame_count = 4,
-        .frame_rate = 2,
-        .frames = _A_L0_NewMail_128x51
-    },
-    .frame_order = L0_NewMail_128x51_frame_order,
-    .passive_frames = 6,
-    .active_frames = 0,
-    .active_cooldown = 0,
-    .active_cycles = 0,
-    .duration = 0,
-
-    .frame_bubble_sequences = NULL,
-    .frame_bubble_sequences_count = 0,
-
-};
-
-
-const StorageAnimation dolphin_blocking[] = {
-
-    {
-        .animation = &BA_L0_NoDb_128x51,
-        .manifest_info = {
-            .name = "L0_NoDb_128x51",
-            .min_butthurt = 0,
-            .max_butthurt = 0,
-            .min_level = 0,
-            .max_level = 0,
-            .weight = 0,
-        }
-    },
-
-    {
-        .animation = &BA_L0_SdBad_128x51,
-        .manifest_info = {
-            .name = "L0_SdBad_128x51",
-            .min_butthurt = 0,
-            .max_butthurt = 0,
-            .min_level = 0,
-            .max_level = 0,
-            .weight = 0,
-        }
-    },
-
-    {
-        .animation = &BA_L0_SdOk_128x51,
-        .manifest_info = {
-            .name = "L0_SdOk_128x51",
-            .min_butthurt = 0,
-            .max_butthurt = 0,
-            .min_level = 0,
-            .max_level = 0,
-            .weight = 0,
-        }
-    },
-
-    {
-        .animation = &BA_L0_Url_128x51,
-        .manifest_info = {
-            .name = "L0_Url_128x51",
-            .min_butthurt = 0,
-            .max_butthurt = 0,
-            .min_level = 0,
-            .max_level = 0,
-            .weight = 0,
-        }
-    },
-
-    {
-        .animation = &BA_L0_NewMail_128x51,
-        .manifest_info = {
-            .name = "L0_NewMail_128x51",
-            .min_butthurt = 0,
-            .max_butthurt = 0,
-            .min_level = 0,
-            .max_level = 0,
-            .weight = 0,
-        }
-    },
-
-};
-
-const size_t dolphin_blocking_size = COUNT_OF(dolphin_blocking);

+ 0 - 7
assets/compiled/assets_dolphin_blocking.h

@@ -1,7 +0,0 @@
-#pragma once
-
-#include <stddef.h>
-#include <desktop/animations/animation_storage_i.h>
-
-extern const StorageAnimation dolphin_blocking[];
-extern const size_t dolphin_blocking_size;

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 8
assets/compiled/assets_dolphin_internal.c


+ 0 - 7
assets/compiled/assets_dolphin_internal.h

@@ -1,7 +0,0 @@
-#pragma once
-
-#include <stddef.h>
-#include <desktop/animations/animation_storage_i.h>
-
-extern const StorageAnimation dolphin_internal[];
-extern const size_t dolphin_internal_size;

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 11
assets/compiled/assets_icons.c


+ 0 - 178
assets/compiled/assets_icons.h

@@ -1,178 +0,0 @@
-#pragma once
-#include <gui/icon.h>
-
-extern const Icon I_Certification1_103x23;
-extern const Icon I_Certification2_119x30;
-extern const Icon A_Levelup1_128x64;
-extern const Icon A_Levelup2_128x64;
-extern const Icon I_125_10px;
-extern const Icon I_Nfc_10px;
-extern const Icon I_back_10px;
-extern const Icon I_badusb_10px;
-extern const Icon I_ble_10px;
-extern const Icon I_dir_10px;
-extern const Icon I_ibutt_10px;
-extern const Icon I_ir_10px;
-extern const Icon I_loading_10px;
-extern const Icon I_music_10px;
-extern const Icon I_sub1_10px;
-extern const Icon I_u2f_10px;
-extern const Icon I_unknown_10px;
-extern const Icon I_update_10px;
-extern const Icon I_BLE_Pairing_128x64;
-extern const Icon I_Ble_connected_38x34;
-extern const Icon I_Ble_disconnected_24x34;
-extern const Icon I_Button_18x18;
-extern const Icon I_Circles_47x47;
-extern const Icon I_Ok_btn_9x9;
-extern const Icon I_Pressed_Button_13x13;
-extern const Icon I_Space_65x18;
-extern const Icon I_Voldwn_6x6;
-extern const Icon I_Volup_8x6;
-extern const Icon I_Clock_18x18;
-extern const Icon I_Error_18x18;
-extern const Icon I_EviSmile1_18x21;
-extern const Icon I_EviSmile2_18x21;
-extern const Icon I_EviWaiting1_18x21;
-extern const Icon I_EviWaiting2_18x21;
-extern const Icon I_Percent_10x14;
-extern const Icon I_Smile_18x18;
-extern const Icon I_UsbTree_48x22;
-extern const Icon I_ButtonCenter_7x7;
-extern const Icon I_ButtonDown_7x4;
-extern const Icon I_ButtonLeftSmall_3x5;
-extern const Icon I_ButtonLeft_4x7;
-extern const Icon I_ButtonRightSmall_3x5;
-extern const Icon I_ButtonRight_4x7;
-extern const Icon I_ButtonUp_7x4;
-extern const Icon I_DFU_128x50;
-extern const Icon I_Warning_30x23;
-extern const Icon A_Loading_24;
-extern const Icon I_DolphinFirstStart0_70x53;
-extern const Icon I_DolphinFirstStart1_59x53;
-extern const Icon I_DolphinFirstStart2_59x51;
-extern const Icon I_DolphinFirstStart3_57x48;
-extern const Icon I_DolphinFirstStart4_67x53;
-extern const Icon I_DolphinFirstStart5_54x49;
-extern const Icon I_DolphinFirstStart6_58x54;
-extern const Icon I_DolphinFirstStart7_61x51;
-extern const Icon I_DolphinFirstStart8_56x51;
-extern const Icon I_DolphinOkay_41x43;
-extern const Icon I_ArrowDownEmpty_14x15;
-extern const Icon I_ArrowDownFilled_14x15;
-extern const Icon I_ArrowUpEmpty_14x15;
-extern const Icon I_ArrowUpFilled_14x15;
-extern const Icon I_DolphinReadingSuccess_59x63;
-extern const Icon I_Down_25x27;
-extern const Icon I_Down_hvr_25x27;
-extern const Icon I_InfraredArrowDown_4x8;
-extern const Icon I_InfraredArrowUp_4x8;
-extern const Icon I_InfraredLearnShort_128x31;
-extern const Icon I_InfraredLearn_128x64;
-extern const Icon I_InfraredSendShort_128x34;
-extern const Icon I_InfraredSend_128x64;
-extern const Icon I_Mute_25x27;
-extern const Icon I_Mute_hvr_25x27;
-extern const Icon I_Power_25x27;
-extern const Icon I_Power_hvr_25x27;
-extern const Icon I_Up_25x27;
-extern const Icon I_Up_hvr_25x27;
-extern const Icon I_Vol_down_25x27;
-extern const Icon I_Vol_down_hvr_25x27;
-extern const Icon I_Vol_up_25x27;
-extern const Icon I_Vol_up_hvr_25x27;
-extern const Icon I_DoorLeft_70x55;
-extern const Icon I_DoorLocked_10x56;
-extern const Icon I_DoorRight_70x55;
-extern const Icon I_PassportBottom_128x17;
-extern const Icon I_PassportLeft_6x47;
-extern const Icon I_WarningDolphin_45x42;
-extern const Icon I_KeyBackspaceSelected_16x9;
-extern const Icon I_KeyBackspace_16x9;
-extern const Icon I_KeySaveSelected_24x11;
-extern const Icon I_KeySave_24x11;
-extern const Icon A_125khz_14;
-extern const Icon A_BadUsb_14;
-extern const Icon A_Bluetooth_14;
-extern const Icon A_Debug_14;
-extern const Icon A_FileManager_14;
-extern const Icon A_GPIO_14;
-extern const Icon A_Games_14;
-extern const Icon A_Infrared_14;
-extern const Icon A_NFC_14;
-extern const Icon A_Passport_14;
-extern const Icon A_Plugins_14;
-extern const Icon A_Power_14;
-extern const Icon A_Settings_14;
-extern const Icon A_Sub1ghz_14;
-extern const Icon A_Tamagotchi_14;
-extern const Icon A_U2F_14;
-extern const Icon A_iButton_14;
-extern const Icon I_Detailed_chip_17x13;
-extern const Icon I_Medium_chip_22x21;
-extern const Icon I_Pin_arrow_down_7x9;
-extern const Icon I_Pin_arrow_left_9x7;
-extern const Icon I_Pin_arrow_right_9x7;
-extern const Icon I_Pin_arrow_up7x9;
-extern const Icon I_Pin_attention_dpad_29x29;
-extern const Icon I_Pin_back_arrow_10x8;
-extern const Icon I_Pin_back_full_40x8;
-extern const Icon I_Pin_cell_13x13;
-extern const Icon I_Pin_pointer_5x3;
-extern const Icon I_Pin_star_7x7;
-extern const Icon I_passport_bad1_46x49;
-extern const Icon I_passport_bad2_46x49;
-extern const Icon I_passport_bad3_46x49;
-extern const Icon I_passport_bottom_128x18;
-extern const Icon I_passport_happy1_46x49;
-extern const Icon I_passport_happy2_46x49;
-extern const Icon I_passport_happy3_46x49;
-extern const Icon I_passport_left_6x46;
-extern const Icon I_passport_okay1_46x49;
-extern const Icon I_passport_okay2_46x49;
-extern const Icon I_passport_okay3_46x49;
-extern const Icon I_BatteryBody_52x28;
-extern const Icon I_Battery_16x16;
-extern const Icon I_FaceCharging_29x14;
-extern const Icon I_FaceConfused_29x14;
-extern const Icon I_FaceNopower_29x14;
-extern const Icon I_FaceNormal_29x14;
-extern const Icon I_Health_16x16;
-extern const Icon I_Temperature_16x16;
-extern const Icon I_Voltage_16x16;
-extern const Icon I_RFIDBigChip_37x36;
-extern const Icon I_RFIDDolphinReceive_97x61;
-extern const Icon I_RFIDDolphinSend_97x61;
-extern const Icon I_RFIDDolphinSuccess_108x57;
-extern const Icon I_SDQuestion_35x43;
-extern const Icon I_Cry_dolph_55x52;
-extern const Icon I_Attention_5x8;
-extern const Icon I_Background_128x11;
-extern const Icon I_BadUsb_9x8;
-extern const Icon I_Battery_19x8;
-extern const Icon I_Battery_26x8;
-extern const Icon I_Bluetooth_Connected_16x8;
-extern const Icon I_Bluetooth_Idle_5x8;
-extern const Icon I_Charging_lightning_9x10;
-extern const Icon I_Charging_lightning_mask_9x10;
-extern const Icon I_Lock_8x8;
-extern const Icon I_PlaceholderL_11x13;
-extern const Icon I_PlaceholderR_30x13;
-extern const Icon I_SDcardFail_11x8;
-extern const Icon I_SDcardMounted_11x8;
-extern const Icon I_Lock_7x8;
-extern const Icon I_MHz_25x11;
-extern const Icon I_Quest_7x8;
-extern const Icon I_Scanning_123x52;
-extern const Icon I_Unlock_7x8;
-extern const Icon I_Auth_62x31;
-extern const Icon I_Connect_me_62x31;
-extern const Icon I_Connected_62x31;
-extern const Icon I_Drive_112x35;
-extern const Icon I_Error_62x31;
-extern const Icon I_Updating_32x40;
-extern const Icon I_DolphinMafia_115x62;
-extern const Icon I_DolphinNice_96x59;
-extern const Icon I_DolphinWait_61x59;
-extern const Icon I_iButtonDolphinVerySuccess_108x52;
-extern const Icon I_iButtonKey_49x44;

+ 0 - 19
assets/compiled/flipper.pb.c

@@ -1,19 +0,0 @@
-/* Automatically generated nanopb constant definitions */
-/* Generated by nanopb-0.4.5 */
-
-#include "flipper.pb.h"
-#if PB_PROTO_HEADER_VERSION != 40
-#error Regenerate this file with the current version of nanopb generator.
-#endif
-
-PB_BIND(PB_Empty, PB_Empty, AUTO)
-
-
-PB_BIND(PB_StopSession, PB_StopSession, AUTO)
-
-
-PB_BIND(PB_Main, PB_Main, AUTO)
-
-
-
-

+ 0 - 302
assets/compiled/flipper.pb.h

@@ -1,302 +0,0 @@
-/* Automatically generated nanopb header */
-/* Generated by nanopb-0.4.5 */
-
-#ifndef PB_PB_FLIPPER_PB_H_INCLUDED
-#define PB_PB_FLIPPER_PB_H_INCLUDED
-#include <pb.h>
-#include "storage.pb.h"
-#include "system.pb.h"
-#include "application.pb.h"
-#include "gui.pb.h"
-
-#if PB_PROTO_HEADER_VERSION != 40
-#error Regenerate this file with the current version of nanopb generator.
-#endif
-
-/* Enum definitions */
-typedef enum _PB_CommandStatus { 
-    PB_CommandStatus_OK = 0, 
-    /* *< Common Errors */
-    PB_CommandStatus_ERROR = 1, /* *< Unknown error */
-    PB_CommandStatus_ERROR_DECODE = 2, /* *< Command can't be decoded successfully - command_id in response may be wrong! */
-    PB_CommandStatus_ERROR_NOT_IMPLEMENTED = 3, /* *< Command succesfully decoded, but not implemented (deprecated or not yet implemented) */
-    PB_CommandStatus_ERROR_BUSY = 4, /* *< Somebody took global lock, so not all commands are available */
-    PB_CommandStatus_ERROR_CONTINUOUS_COMMAND_INTERRUPTED = 14, /* *< Not received has_next == 0 */
-    PB_CommandStatus_ERROR_INVALID_PARAMETERS = 15, /* *< not provided (or provided invalid) crucial parameters to perform rpc */
-    /* *< Storage Errors */
-    PB_CommandStatus_ERROR_STORAGE_NOT_READY = 5, /* *< FS not ready */
-    PB_CommandStatus_ERROR_STORAGE_EXIST = 6, /* *< File/Dir alrady exist */
-    PB_CommandStatus_ERROR_STORAGE_NOT_EXIST = 7, /* *< File/Dir does not exist */
-    PB_CommandStatus_ERROR_STORAGE_INVALID_PARAMETER = 8, /* *< Invalid API parameter */
-    PB_CommandStatus_ERROR_STORAGE_DENIED = 9, /* *< Access denied */
-    PB_CommandStatus_ERROR_STORAGE_INVALID_NAME = 10, /* *< Invalid name/path */
-    PB_CommandStatus_ERROR_STORAGE_INTERNAL = 11, /* *< Internal error */
-    PB_CommandStatus_ERROR_STORAGE_NOT_IMPLEMENTED = 12, /* *< Functon not implemented */
-    PB_CommandStatus_ERROR_STORAGE_ALREADY_OPEN = 13, /* *< File/Dir already opened */
-    PB_CommandStatus_ERROR_STORAGE_DIR_NOT_EMPTY = 18, /* *< Directory, you're going to remove is not empty */
-    /* *< Application Errors */
-    PB_CommandStatus_ERROR_APP_CANT_START = 16, /* *< Can't start app - internal error */
-    PB_CommandStatus_ERROR_APP_SYSTEM_LOCKED = 17, /* *< Another app is running */
-    /* *< Virtual Display Errors */
-    PB_CommandStatus_ERROR_VIRTUAL_DISPLAY_ALREADY_STARTED = 19, /* *< Virtual Display session can't be started twice */
-    PB_CommandStatus_ERROR_VIRTUAL_DISPLAY_NOT_STARTED = 20 /* *< Virtual Display session can't be stopped when it's not started */
-} PB_CommandStatus;
-
-/* Struct definitions */
-/* There are Server commands (e.g. Storage_write), which have no body message
- in response. But 'oneof' obligate to have at least 1 encoded message
- in scope. For this needs Empty message is implemented. */
-typedef struct _PB_Empty { 
-    char dummy_field;
-} PB_Empty;
-
-typedef struct _PB_StopSession { 
-    char dummy_field;
-} PB_StopSession;
-
-typedef struct _PB_Main { 
-    uint32_t command_id; 
-    PB_CommandStatus command_status; 
-    bool has_next; 
-    pb_callback_t cb_content;
-    pb_size_t which_content;
-    union {
-        PB_Empty empty;
-        PB_System_PingRequest system_ping_request;
-        PB_System_PingResponse system_ping_response;
-        PB_Storage_ListRequest storage_list_request;
-        PB_Storage_ListResponse storage_list_response;
-        PB_Storage_ReadRequest storage_read_request;
-        PB_Storage_ReadResponse storage_read_response;
-        PB_Storage_WriteRequest storage_write_request;
-        PB_Storage_DeleteRequest storage_delete_request;
-        PB_Storage_MkdirRequest storage_mkdir_request;
-        PB_Storage_Md5sumRequest storage_md5sum_request;
-        PB_Storage_Md5sumResponse storage_md5sum_response;
-        PB_App_StartRequest app_start_request;
-        PB_App_LockStatusRequest app_lock_status_request;
-        PB_App_LockStatusResponse app_lock_status_response;
-        PB_StopSession stop_session;
-        PB_Gui_StartScreenStreamRequest gui_start_screen_stream_request;
-        PB_Gui_StopScreenStreamRequest gui_stop_screen_stream_request;
-        PB_Gui_ScreenFrame gui_screen_frame;
-        PB_Gui_SendInputEventRequest gui_send_input_event_request;
-        PB_Storage_StatRequest storage_stat_request;
-        PB_Storage_StatResponse storage_stat_response;
-        PB_Gui_StartVirtualDisplayRequest gui_start_virtual_display_request;
-        PB_Gui_StopVirtualDisplayRequest gui_stop_virtual_display_request;
-        PB_Storage_InfoRequest storage_info_request;
-        PB_Storage_InfoResponse storage_info_response;
-        PB_Storage_RenameRequest storage_rename_request;
-        PB_System_RebootRequest system_reboot_request;
-        PB_System_DeviceInfoRequest system_device_info_request;
-        PB_System_DeviceInfoResponse system_device_info_response;
-        PB_System_FactoryResetRequest system_factory_reset_request;
-        PB_System_GetDateTimeRequest system_get_datetime_request;
-        PB_System_GetDateTimeResponse system_get_datetime_response;
-        PB_System_SetDateTimeRequest system_set_datetime_request;
-        PB_System_PlayAudiovisualAlertRequest system_play_audiovisual_alert_request;
-        PB_System_ProtobufVersionRequest system_protobuf_version_request;
-        PB_System_ProtobufVersionResponse system_protobuf_version_response;
-        PB_System_UpdateRequest system_update_request;
-        PB_Storage_BackupCreateRequest storage_backup_create_request;
-        PB_Storage_BackupRestoreRequest storage_backup_restore_request;
-        PB_System_PowerInfoRequest system_power_info_request;
-        PB_System_PowerInfoResponse system_power_info_response;
-        PB_System_UpdateResponse system_update_response;
-    } content; 
-} PB_Main;
-
-
-/* Helper constants for enums */
-#define _PB_CommandStatus_MIN PB_CommandStatus_OK
-#define _PB_CommandStatus_MAX PB_CommandStatus_ERROR_VIRTUAL_DISPLAY_NOT_STARTED
-#define _PB_CommandStatus_ARRAYSIZE ((PB_CommandStatus)(PB_CommandStatus_ERROR_VIRTUAL_DISPLAY_NOT_STARTED+1))
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Initializer values for message structs */
-#define PB_Empty_init_default                    {0}
-#define PB_StopSession_init_default              {0}
-#define PB_Main_init_default                     {0, _PB_CommandStatus_MIN, 0, {{NULL}, NULL}, 0, {PB_Empty_init_default}}
-#define PB_Empty_init_zero                       {0}
-#define PB_StopSession_init_zero                 {0}
-#define PB_Main_init_zero                        {0, _PB_CommandStatus_MIN, 0, {{NULL}, NULL}, 0, {PB_Empty_init_zero}}
-
-/* Field tags (for use in manual encoding/decoding) */
-#define PB_Main_command_id_tag                   1
-#define PB_Main_command_status_tag               2
-#define PB_Main_has_next_tag                     3
-#define PB_Main_empty_tag                        4
-#define PB_Main_system_ping_request_tag          5
-#define PB_Main_system_ping_response_tag         6
-#define PB_Main_storage_list_request_tag         7
-#define PB_Main_storage_list_response_tag        8
-#define PB_Main_storage_read_request_tag         9
-#define PB_Main_storage_read_response_tag        10
-#define PB_Main_storage_write_request_tag        11
-#define PB_Main_storage_delete_request_tag       12
-#define PB_Main_storage_mkdir_request_tag        13
-#define PB_Main_storage_md5sum_request_tag       14
-#define PB_Main_storage_md5sum_response_tag      15
-#define PB_Main_app_start_request_tag            16
-#define PB_Main_app_lock_status_request_tag      17
-#define PB_Main_app_lock_status_response_tag     18
-#define PB_Main_stop_session_tag                 19
-#define PB_Main_gui_start_screen_stream_request_tag 20
-#define PB_Main_gui_stop_screen_stream_request_tag 21
-#define PB_Main_gui_screen_frame_tag             22
-#define PB_Main_gui_send_input_event_request_tag 23
-#define PB_Main_storage_stat_request_tag         24
-#define PB_Main_storage_stat_response_tag        25
-#define PB_Main_gui_start_virtual_display_request_tag 26
-#define PB_Main_gui_stop_virtual_display_request_tag 27
-#define PB_Main_storage_info_request_tag         28
-#define PB_Main_storage_info_response_tag        29
-#define PB_Main_storage_rename_request_tag       30
-#define PB_Main_system_reboot_request_tag        31
-#define PB_Main_system_device_info_request_tag   32
-#define PB_Main_system_device_info_response_tag  33
-#define PB_Main_system_factory_reset_request_tag 34
-#define PB_Main_system_get_datetime_request_tag  35
-#define PB_Main_system_get_datetime_response_tag 36
-#define PB_Main_system_set_datetime_request_tag  37
-#define PB_Main_system_play_audiovisual_alert_request_tag 38
-#define PB_Main_system_protobuf_version_request_tag 39
-#define PB_Main_system_protobuf_version_response_tag 40
-#define PB_Main_system_update_request_tag        41
-#define PB_Main_storage_backup_create_request_tag 42
-#define PB_Main_storage_backup_restore_request_tag 43
-#define PB_Main_system_power_info_request_tag    44
-#define PB_Main_system_power_info_response_tag   45
-#define PB_Main_system_update_response_tag       46
-
-/* Struct field encoding specification for nanopb */
-#define PB_Empty_FIELDLIST(X, a) \
-
-#define PB_Empty_CALLBACK NULL
-#define PB_Empty_DEFAULT NULL
-
-#define PB_StopSession_FIELDLIST(X, a) \
-
-#define PB_StopSession_CALLBACK NULL
-#define PB_StopSession_DEFAULT NULL
-
-#define PB_Main_FIELDLIST(X, a) \
-X(a, STATIC,   SINGULAR, UINT32,   command_id,        1) \
-X(a, STATIC,   SINGULAR, UENUM,    command_status,    2) \
-X(a, STATIC,   SINGULAR, BOOL,     has_next,          3) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,empty,content.empty),   4) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,system_ping_request,content.system_ping_request),   5) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,system_ping_response,content.system_ping_response),   6) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,storage_list_request,content.storage_list_request),   7) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,storage_list_response,content.storage_list_response),   8) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,storage_read_request,content.storage_read_request),   9) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,storage_read_response,content.storage_read_response),  10) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,storage_write_request,content.storage_write_request),  11) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,storage_delete_request,content.storage_delete_request),  12) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,storage_mkdir_request,content.storage_mkdir_request),  13) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,storage_md5sum_request,content.storage_md5sum_request),  14) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,storage_md5sum_response,content.storage_md5sum_response),  15) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,app_start_request,content.app_start_request),  16) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,app_lock_status_request,content.app_lock_status_request),  17) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,app_lock_status_response,content.app_lock_status_response),  18) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,stop_session,content.stop_session),  19) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,gui_start_screen_stream_request,content.gui_start_screen_stream_request),  20) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,gui_stop_screen_stream_request,content.gui_stop_screen_stream_request),  21) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,gui_screen_frame,content.gui_screen_frame),  22) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,gui_send_input_event_request,content.gui_send_input_event_request),  23) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,storage_stat_request,content.storage_stat_request),  24) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,storage_stat_response,content.storage_stat_response),  25) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,gui_start_virtual_display_request,content.gui_start_virtual_display_request),  26) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,gui_stop_virtual_display_request,content.gui_stop_virtual_display_request),  27) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,storage_info_request,content.storage_info_request),  28) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,storage_info_response,content.storage_info_response),  29) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,storage_rename_request,content.storage_rename_request),  30) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,system_reboot_request,content.system_reboot_request),  31) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,system_device_info_request,content.system_device_info_request),  32) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,system_device_info_response,content.system_device_info_response),  33) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,system_factory_reset_request,content.system_factory_reset_request),  34) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,system_get_datetime_request,content.system_get_datetime_request),  35) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,system_get_datetime_response,content.system_get_datetime_response),  36) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,system_set_datetime_request,content.system_set_datetime_request),  37) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,system_play_audiovisual_alert_request,content.system_play_audiovisual_alert_request),  38) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,system_protobuf_version_request,content.system_protobuf_version_request),  39) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,system_protobuf_version_response,content.system_protobuf_version_response),  40) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,system_update_request,content.system_update_request),  41) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,storage_backup_create_request,content.storage_backup_create_request),  42) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,storage_backup_restore_request,content.storage_backup_restore_request),  43) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,system_power_info_request,content.system_power_info_request),  44) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,system_power_info_response,content.system_power_info_response),  45) \
-X(a, STATIC,   ONEOF,    MSG_W_CB, (content,system_update_response,content.system_update_response),  46)
-#define PB_Main_CALLBACK NULL
-#define PB_Main_DEFAULT NULL
-#define PB_Main_content_empty_MSGTYPE PB_Empty
-#define PB_Main_content_system_ping_request_MSGTYPE PB_System_PingRequest
-#define PB_Main_content_system_ping_response_MSGTYPE PB_System_PingResponse
-#define PB_Main_content_storage_list_request_MSGTYPE PB_Storage_ListRequest
-#define PB_Main_content_storage_list_response_MSGTYPE PB_Storage_ListResponse
-#define PB_Main_content_storage_read_request_MSGTYPE PB_Storage_ReadRequest
-#define PB_Main_content_storage_read_response_MSGTYPE PB_Storage_ReadResponse
-#define PB_Main_content_storage_write_request_MSGTYPE PB_Storage_WriteRequest
-#define PB_Main_content_storage_delete_request_MSGTYPE PB_Storage_DeleteRequest
-#define PB_Main_content_storage_mkdir_request_MSGTYPE PB_Storage_MkdirRequest
-#define PB_Main_content_storage_md5sum_request_MSGTYPE PB_Storage_Md5sumRequest
-#define PB_Main_content_storage_md5sum_response_MSGTYPE PB_Storage_Md5sumResponse
-#define PB_Main_content_app_start_request_MSGTYPE PB_App_StartRequest
-#define PB_Main_content_app_lock_status_request_MSGTYPE PB_App_LockStatusRequest
-#define PB_Main_content_app_lock_status_response_MSGTYPE PB_App_LockStatusResponse
-#define PB_Main_content_stop_session_MSGTYPE PB_StopSession
-#define PB_Main_content_gui_start_screen_stream_request_MSGTYPE PB_Gui_StartScreenStreamRequest
-#define PB_Main_content_gui_stop_screen_stream_request_MSGTYPE PB_Gui_StopScreenStreamRequest
-#define PB_Main_content_gui_screen_frame_MSGTYPE PB_Gui_ScreenFrame
-#define PB_Main_content_gui_send_input_event_request_MSGTYPE PB_Gui_SendInputEventRequest
-#define PB_Main_content_storage_stat_request_MSGTYPE PB_Storage_StatRequest
-#define PB_Main_content_storage_stat_response_MSGTYPE PB_Storage_StatResponse
-#define PB_Main_content_gui_start_virtual_display_request_MSGTYPE PB_Gui_StartVirtualDisplayRequest
-#define PB_Main_content_gui_stop_virtual_display_request_MSGTYPE PB_Gui_StopVirtualDisplayRequest
-#define PB_Main_content_storage_info_request_MSGTYPE PB_Storage_InfoRequest
-#define PB_Main_content_storage_info_response_MSGTYPE PB_Storage_InfoResponse
-#define PB_Main_content_storage_rename_request_MSGTYPE PB_Storage_RenameRequest
-#define PB_Main_content_system_reboot_request_MSGTYPE PB_System_RebootRequest
-#define PB_Main_content_system_device_info_request_MSGTYPE PB_System_DeviceInfoRequest
-#define PB_Main_content_system_device_info_response_MSGTYPE PB_System_DeviceInfoResponse
-#define PB_Main_content_system_factory_reset_request_MSGTYPE PB_System_FactoryResetRequest
-#define PB_Main_content_system_get_datetime_request_MSGTYPE PB_System_GetDateTimeRequest
-#define PB_Main_content_system_get_datetime_response_MSGTYPE PB_System_GetDateTimeResponse
-#define PB_Main_content_system_set_datetime_request_MSGTYPE PB_System_SetDateTimeRequest
-#define PB_Main_content_system_play_audiovisual_alert_request_MSGTYPE PB_System_PlayAudiovisualAlertRequest
-#define PB_Main_content_system_protobuf_version_request_MSGTYPE PB_System_ProtobufVersionRequest
-#define PB_Main_content_system_protobuf_version_response_MSGTYPE PB_System_ProtobufVersionResponse
-#define PB_Main_content_system_update_request_MSGTYPE PB_System_UpdateRequest
-#define PB_Main_content_storage_backup_create_request_MSGTYPE PB_Storage_BackupCreateRequest
-#define PB_Main_content_storage_backup_restore_request_MSGTYPE PB_Storage_BackupRestoreRequest
-#define PB_Main_content_system_power_info_request_MSGTYPE PB_System_PowerInfoRequest
-#define PB_Main_content_system_power_info_response_MSGTYPE PB_System_PowerInfoResponse
-#define PB_Main_content_system_update_response_MSGTYPE PB_System_UpdateResponse
-
-extern const pb_msgdesc_t PB_Empty_msg;
-extern const pb_msgdesc_t PB_StopSession_msg;
-extern const pb_msgdesc_t PB_Main_msg;
-
-/* Defines for backwards compatibility with code written before nanopb-0.4.0 */
-#define PB_Empty_fields &PB_Empty_msg
-#define PB_StopSession_fields &PB_StopSession_msg
-#define PB_Main_fields &PB_Main_msg
-
-/* Maximum encoded size of messages (where known) */
-#define PB_Empty_size                            0
-#define PB_StopSession_size                      0
-#if defined(PB_System_PingRequest_size) && defined(PB_System_PingResponse_size) && defined(PB_Storage_ListRequest_size) && defined(PB_Storage_ListResponse_size) && defined(PB_Storage_ReadRequest_size) && defined(PB_Storage_ReadResponse_size) && defined(PB_Storage_WriteRequest_size) && defined(PB_Storage_DeleteRequest_size) && defined(PB_Storage_MkdirRequest_size) && defined(PB_Storage_Md5sumRequest_size) && defined(PB_App_StartRequest_size) && defined(PB_Gui_ScreenFrame_size) && defined(PB_Storage_StatRequest_size) && defined(PB_Storage_StatResponse_size) && defined(PB_Gui_StartVirtualDisplayRequest_size) && defined(PB_Storage_InfoRequest_size) && defined(PB_Storage_RenameRequest_size) && defined(PB_System_DeviceInfoResponse_size) && defined(PB_System_UpdateRequest_size) && defined(PB_Storage_BackupCreateRequest_size) && defined(PB_Storage_BackupRestoreRequest_size) && defined(PB_System_PowerInfoResponse_size)
-#define PB_Main_size                             (10 + sizeof(union PB_Main_content_size_union))
-union PB_Main_content_size_union {char f5[(6 + PB_System_PingRequest_size)]; char f6[(6 + PB_System_PingResponse_size)]; char f7[(6 + PB_Storage_ListRequest_size)]; char f8[(6 + PB_Storage_ListResponse_size)]; char f9[(6 + PB_Storage_ReadRequest_size)]; char f10[(6 + PB_Storage_ReadResponse_size)]; char f11[(6 + PB_Storage_WriteRequest_size)]; char f12[(6 + PB_Storage_DeleteRequest_size)]; char f13[(6 + PB_Storage_MkdirRequest_size)]; char f14[(6 + PB_Storage_Md5sumRequest_size)]; char f16[(7 + PB_App_StartRequest_size)]; char f22[(7 + PB_Gui_ScreenFrame_size)]; char f24[(7 + PB_Storage_StatRequest_size)]; char f25[(7 + PB_Storage_StatResponse_size)]; char f26[(7 + PB_Gui_StartVirtualDisplayRequest_size)]; char f28[(7 + PB_Storage_InfoRequest_size)]; char f30[(7 + PB_Storage_RenameRequest_size)]; char f33[(7 + PB_System_DeviceInfoResponse_size)]; char f41[(7 + PB_System_UpdateRequest_size)]; char f42[(7 + PB_Storage_BackupCreateRequest_size)]; char f43[(7 + PB_Storage_BackupRestoreRequest_size)]; char f45[(7 + PB_System_PowerInfoResponse_size)]; char f0[36];};
-#endif
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif

+ 0 - 29
assets/compiled/gui.pb.c

@@ -1,29 +0,0 @@
-/* Automatically generated nanopb constant definitions */
-/* Generated by nanopb-0.4.5 */
-
-#include "gui.pb.h"
-#if PB_PROTO_HEADER_VERSION != 40
-#error Regenerate this file with the current version of nanopb generator.
-#endif
-
-PB_BIND(PB_Gui_ScreenFrame, PB_Gui_ScreenFrame, AUTO)
-
-
-PB_BIND(PB_Gui_StartScreenStreamRequest, PB_Gui_StartScreenStreamRequest, AUTO)
-
-
-PB_BIND(PB_Gui_StopScreenStreamRequest, PB_Gui_StopScreenStreamRequest, AUTO)
-
-
-PB_BIND(PB_Gui_SendInputEventRequest, PB_Gui_SendInputEventRequest, AUTO)
-
-
-PB_BIND(PB_Gui_StartVirtualDisplayRequest, PB_Gui_StartVirtualDisplayRequest, AUTO)
-
-
-PB_BIND(PB_Gui_StopVirtualDisplayRequest, PB_Gui_StopVirtualDisplayRequest, AUTO)
-
-
-
-
-

+ 0 - 152
assets/compiled/gui.pb.h

@@ -1,152 +0,0 @@
-/* Automatically generated nanopb header */
-/* Generated by nanopb-0.4.5 */
-
-#ifndef PB_PB_GUI_GUI_PB_H_INCLUDED
-#define PB_PB_GUI_GUI_PB_H_INCLUDED
-#include <pb.h>
-
-#if PB_PROTO_HEADER_VERSION != 40
-#error Regenerate this file with the current version of nanopb generator.
-#endif
-
-/* Enum definitions */
-typedef enum _PB_Gui_InputKey { 
-    PB_Gui_InputKey_UP = 0, 
-    PB_Gui_InputKey_DOWN = 1, 
-    PB_Gui_InputKey_RIGHT = 2, 
-    PB_Gui_InputKey_LEFT = 3, 
-    PB_Gui_InputKey_OK = 4, 
-    PB_Gui_InputKey_BACK = 5 
-} PB_Gui_InputKey;
-
-typedef enum _PB_Gui_InputType { 
-    PB_Gui_InputType_PRESS = 0, /* *< Press event, emitted after debounce */
-    PB_Gui_InputType_RELEASE = 1, /* *< Release event, emitted after debounce */
-    PB_Gui_InputType_SHORT = 2, /* *< Short event, emitted after InputTypeRelease done withing INPUT_LONG_PRESS interval */
-    PB_Gui_InputType_LONG = 3, /* *< Long event, emmited after INPUT_LONG_PRESS interval, asynchronouse to InputTypeRelease */
-    PB_Gui_InputType_REPEAT = 4 /* *< Repeat event, emmited with INPUT_REPEATE_PRESS period after InputTypeLong event */
-} PB_Gui_InputType;
-
-/* Struct definitions */
-typedef struct _PB_Gui_ScreenFrame { 
-    pb_bytes_array_t *data; 
-} PB_Gui_ScreenFrame;
-
-typedef struct _PB_Gui_StartScreenStreamRequest { 
-    char dummy_field;
-} PB_Gui_StartScreenStreamRequest;
-
-typedef struct _PB_Gui_StopScreenStreamRequest { 
-    char dummy_field;
-} PB_Gui_StopScreenStreamRequest;
-
-typedef struct _PB_Gui_StopVirtualDisplayRequest { 
-    char dummy_field;
-} PB_Gui_StopVirtualDisplayRequest;
-
-typedef struct _PB_Gui_SendInputEventRequest { 
-    PB_Gui_InputKey key; 
-    PB_Gui_InputType type; 
-} PB_Gui_SendInputEventRequest;
-
-typedef struct _PB_Gui_StartVirtualDisplayRequest { 
-    bool has_first_frame;
-    PB_Gui_ScreenFrame first_frame; /* optional */
-} PB_Gui_StartVirtualDisplayRequest;
-
-
-/* Helper constants for enums */
-#define _PB_Gui_InputKey_MIN PB_Gui_InputKey_UP
-#define _PB_Gui_InputKey_MAX PB_Gui_InputKey_BACK
-#define _PB_Gui_InputKey_ARRAYSIZE ((PB_Gui_InputKey)(PB_Gui_InputKey_BACK+1))
-
-#define _PB_Gui_InputType_MIN PB_Gui_InputType_PRESS
-#define _PB_Gui_InputType_MAX PB_Gui_InputType_REPEAT
-#define _PB_Gui_InputType_ARRAYSIZE ((PB_Gui_InputType)(PB_Gui_InputType_REPEAT+1))
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Initializer values for message structs */
-#define PB_Gui_ScreenFrame_init_default          {NULL}
-#define PB_Gui_StartScreenStreamRequest_init_default {0}
-#define PB_Gui_StopScreenStreamRequest_init_default {0}
-#define PB_Gui_SendInputEventRequest_init_default {_PB_Gui_InputKey_MIN, _PB_Gui_InputType_MIN}
-#define PB_Gui_StartVirtualDisplayRequest_init_default {false, PB_Gui_ScreenFrame_init_default}
-#define PB_Gui_StopVirtualDisplayRequest_init_default {0}
-#define PB_Gui_ScreenFrame_init_zero             {NULL}
-#define PB_Gui_StartScreenStreamRequest_init_zero {0}
-#define PB_Gui_StopScreenStreamRequest_init_zero {0}
-#define PB_Gui_SendInputEventRequest_init_zero   {_PB_Gui_InputKey_MIN, _PB_Gui_InputType_MIN}
-#define PB_Gui_StartVirtualDisplayRequest_init_zero {false, PB_Gui_ScreenFrame_init_zero}
-#define PB_Gui_StopVirtualDisplayRequest_init_zero {0}
-
-/* Field tags (for use in manual encoding/decoding) */
-#define PB_Gui_ScreenFrame_data_tag              1
-#define PB_Gui_SendInputEventRequest_key_tag     1
-#define PB_Gui_SendInputEventRequest_type_tag    2
-#define PB_Gui_StartVirtualDisplayRequest_first_frame_tag 1
-
-/* Struct field encoding specification for nanopb */
-#define PB_Gui_ScreenFrame_FIELDLIST(X, a) \
-X(a, POINTER,  SINGULAR, BYTES,    data,              1)
-#define PB_Gui_ScreenFrame_CALLBACK NULL
-#define PB_Gui_ScreenFrame_DEFAULT NULL
-
-#define PB_Gui_StartScreenStreamRequest_FIELDLIST(X, a) \
-
-#define PB_Gui_StartScreenStreamRequest_CALLBACK NULL
-#define PB_Gui_StartScreenStreamRequest_DEFAULT NULL
-
-#define PB_Gui_StopScreenStreamRequest_FIELDLIST(X, a) \
-
-#define PB_Gui_StopScreenStreamRequest_CALLBACK NULL
-#define PB_Gui_StopScreenStreamRequest_DEFAULT NULL
-
-#define PB_Gui_SendInputEventRequest_FIELDLIST(X, a) \
-X(a, STATIC,   SINGULAR, UENUM,    key,               1) \
-X(a, STATIC,   SINGULAR, UENUM,    type,              2)
-#define PB_Gui_SendInputEventRequest_CALLBACK NULL
-#define PB_Gui_SendInputEventRequest_DEFAULT NULL
-
-#define PB_Gui_StartVirtualDisplayRequest_FIELDLIST(X, a) \
-X(a, STATIC,   OPTIONAL, MESSAGE,  first_frame,       1)
-#define PB_Gui_StartVirtualDisplayRequest_CALLBACK NULL
-#define PB_Gui_StartVirtualDisplayRequest_DEFAULT NULL
-#define PB_Gui_StartVirtualDisplayRequest_first_frame_MSGTYPE PB_Gui_ScreenFrame
-
-#define PB_Gui_StopVirtualDisplayRequest_FIELDLIST(X, a) \
-
-#define PB_Gui_StopVirtualDisplayRequest_CALLBACK NULL
-#define PB_Gui_StopVirtualDisplayRequest_DEFAULT NULL
-
-extern const pb_msgdesc_t PB_Gui_ScreenFrame_msg;
-extern const pb_msgdesc_t PB_Gui_StartScreenStreamRequest_msg;
-extern const pb_msgdesc_t PB_Gui_StopScreenStreamRequest_msg;
-extern const pb_msgdesc_t PB_Gui_SendInputEventRequest_msg;
-extern const pb_msgdesc_t PB_Gui_StartVirtualDisplayRequest_msg;
-extern const pb_msgdesc_t PB_Gui_StopVirtualDisplayRequest_msg;
-
-/* Defines for backwards compatibility with code written before nanopb-0.4.0 */
-#define PB_Gui_ScreenFrame_fields &PB_Gui_ScreenFrame_msg
-#define PB_Gui_StartScreenStreamRequest_fields &PB_Gui_StartScreenStreamRequest_msg
-#define PB_Gui_StopScreenStreamRequest_fields &PB_Gui_StopScreenStreamRequest_msg
-#define PB_Gui_SendInputEventRequest_fields &PB_Gui_SendInputEventRequest_msg
-#define PB_Gui_StartVirtualDisplayRequest_fields &PB_Gui_StartVirtualDisplayRequest_msg
-#define PB_Gui_StopVirtualDisplayRequest_fields &PB_Gui_StopVirtualDisplayRequest_msg
-
-/* Maximum encoded size of messages (where known) */
-/* PB_Gui_ScreenFrame_size depends on runtime parameters */
-/* PB_Gui_StartVirtualDisplayRequest_size depends on runtime parameters */
-#define PB_Gui_SendInputEventRequest_size        4
-#define PB_Gui_StartScreenStreamRequest_size     0
-#define PB_Gui_StopScreenStreamRequest_size      0
-#define PB_Gui_StopVirtualDisplayRequest_size    0
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif

+ 0 - 3
assets/compiled/protobuf_version.h

@@ -1,3 +0,0 @@
-#pragma once
-#define PROTOBUF_MAJOR_VERSION 0
-#define PROTOBUF_MINOR_VERSION 7

+ 0 - 61
assets/compiled/storage.pb.c

@@ -1,61 +0,0 @@
-/* Automatically generated nanopb constant definitions */
-/* Generated by nanopb-0.4.5 */
-
-#include "storage.pb.h"
-#if PB_PROTO_HEADER_VERSION != 40
-#error Regenerate this file with the current version of nanopb generator.
-#endif
-
-PB_BIND(PB_Storage_File, PB_Storage_File, AUTO)
-
-
-PB_BIND(PB_Storage_InfoRequest, PB_Storage_InfoRequest, AUTO)
-
-
-PB_BIND(PB_Storage_InfoResponse, PB_Storage_InfoResponse, AUTO)
-
-
-PB_BIND(PB_Storage_StatRequest, PB_Storage_StatRequest, AUTO)
-
-
-PB_BIND(PB_Storage_StatResponse, PB_Storage_StatResponse, AUTO)
-
-
-PB_BIND(PB_Storage_ListRequest, PB_Storage_ListRequest, AUTO)
-
-
-PB_BIND(PB_Storage_ListResponse, PB_Storage_ListResponse, AUTO)
-
-
-PB_BIND(PB_Storage_ReadRequest, PB_Storage_ReadRequest, AUTO)
-
-
-PB_BIND(PB_Storage_ReadResponse, PB_Storage_ReadResponse, AUTO)
-
-
-PB_BIND(PB_Storage_WriteRequest, PB_Storage_WriteRequest, AUTO)
-
-
-PB_BIND(PB_Storage_DeleteRequest, PB_Storage_DeleteRequest, AUTO)
-
-
-PB_BIND(PB_Storage_MkdirRequest, PB_Storage_MkdirRequest, AUTO)
-
-
-PB_BIND(PB_Storage_Md5sumRequest, PB_Storage_Md5sumRequest, AUTO)
-
-
-PB_BIND(PB_Storage_Md5sumResponse, PB_Storage_Md5sumResponse, AUTO)
-
-
-PB_BIND(PB_Storage_RenameRequest, PB_Storage_RenameRequest, AUTO)
-
-
-PB_BIND(PB_Storage_BackupCreateRequest, PB_Storage_BackupCreateRequest, AUTO)
-
-
-PB_BIND(PB_Storage_BackupRestoreRequest, PB_Storage_BackupRestoreRequest, AUTO)
-
-
-
-

+ 0 - 328
assets/compiled/storage.pb.h

@@ -1,328 +0,0 @@
-/* Automatically generated nanopb header */
-/* Generated by nanopb-0.4.5 */
-
-#ifndef PB_PB_STORAGE_STORAGE_PB_H_INCLUDED
-#define PB_PB_STORAGE_STORAGE_PB_H_INCLUDED
-#include <pb.h>
-
-#if PB_PROTO_HEADER_VERSION != 40
-#error Regenerate this file with the current version of nanopb generator.
-#endif
-
-/* Enum definitions */
-typedef enum _PB_Storage_File_FileType { 
-    PB_Storage_File_FileType_FILE = 0, 
-    PB_Storage_File_FileType_DIR = 1 
-} PB_Storage_File_FileType;
-
-/* Struct definitions */
-typedef struct _PB_Storage_BackupCreateRequest { 
-    char *archive_path; 
-} PB_Storage_BackupCreateRequest;
-
-typedef struct _PB_Storage_BackupRestoreRequest { 
-    char *archive_path; 
-} PB_Storage_BackupRestoreRequest;
-
-typedef struct _PB_Storage_InfoRequest { 
-    char *path; 
-} PB_Storage_InfoRequest;
-
-typedef struct _PB_Storage_ListRequest { 
-    char *path; 
-} PB_Storage_ListRequest;
-
-typedef struct _PB_Storage_Md5sumRequest { 
-    char *path; 
-} PB_Storage_Md5sumRequest;
-
-typedef struct _PB_Storage_MkdirRequest { 
-    char *path; 
-} PB_Storage_MkdirRequest;
-
-typedef struct _PB_Storage_ReadRequest { 
-    char *path; 
-} PB_Storage_ReadRequest;
-
-typedef struct _PB_Storage_RenameRequest { 
-    char *old_path; 
-    char *new_path; 
-} PB_Storage_RenameRequest;
-
-typedef struct _PB_Storage_StatRequest { 
-    char *path; 
-} PB_Storage_StatRequest;
-
-typedef struct _PB_Storage_DeleteRequest { 
-    char *path; 
-    bool recursive; 
-} PB_Storage_DeleteRequest;
-
-typedef struct _PB_Storage_File { 
-    PB_Storage_File_FileType type; 
-    char *name; 
-    uint32_t size; 
-    pb_bytes_array_t *data; 
-} PB_Storage_File;
-
-typedef struct _PB_Storage_InfoResponse { 
-    uint64_t total_space; 
-    uint64_t free_space; 
-} PB_Storage_InfoResponse;
-
-typedef struct _PB_Storage_Md5sumResponse { 
-    char md5sum[33]; 
-} PB_Storage_Md5sumResponse;
-
-typedef struct _PB_Storage_ListResponse { 
-    pb_size_t file_count;
-    PB_Storage_File file[8]; 
-} PB_Storage_ListResponse;
-
-typedef struct _PB_Storage_ReadResponse { 
-    bool has_file;
-    PB_Storage_File file; 
-} PB_Storage_ReadResponse;
-
-typedef struct _PB_Storage_StatResponse { 
-    bool has_file;
-    PB_Storage_File file; 
-} PB_Storage_StatResponse;
-
-typedef struct _PB_Storage_WriteRequest { 
-    char *path; 
-    bool has_file;
-    PB_Storage_File file; 
-} PB_Storage_WriteRequest;
-
-
-/* Helper constants for enums */
-#define _PB_Storage_File_FileType_MIN PB_Storage_File_FileType_FILE
-#define _PB_Storage_File_FileType_MAX PB_Storage_File_FileType_DIR
-#define _PB_Storage_File_FileType_ARRAYSIZE ((PB_Storage_File_FileType)(PB_Storage_File_FileType_DIR+1))
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Initializer values for message structs */
-#define PB_Storage_File_init_default             {_PB_Storage_File_FileType_MIN, NULL, 0, NULL}
-#define PB_Storage_InfoRequest_init_default      {NULL}
-#define PB_Storage_InfoResponse_init_default     {0, 0}
-#define PB_Storage_StatRequest_init_default      {NULL}
-#define PB_Storage_StatResponse_init_default     {false, PB_Storage_File_init_default}
-#define PB_Storage_ListRequest_init_default      {NULL}
-#define PB_Storage_ListResponse_init_default     {0, {PB_Storage_File_init_default, PB_Storage_File_init_default, PB_Storage_File_init_default, PB_Storage_File_init_default, PB_Storage_File_init_default, PB_Storage_File_init_default, PB_Storage_File_init_default, PB_Storage_File_init_default}}
-#define PB_Storage_ReadRequest_init_default      {NULL}
-#define PB_Storage_ReadResponse_init_default     {false, PB_Storage_File_init_default}
-#define PB_Storage_WriteRequest_init_default     {NULL, false, PB_Storage_File_init_default}
-#define PB_Storage_DeleteRequest_init_default    {NULL, 0}
-#define PB_Storage_MkdirRequest_init_default     {NULL}
-#define PB_Storage_Md5sumRequest_init_default    {NULL}
-#define PB_Storage_Md5sumResponse_init_default   {""}
-#define PB_Storage_RenameRequest_init_default    {NULL, NULL}
-#define PB_Storage_BackupCreateRequest_init_default {NULL}
-#define PB_Storage_BackupRestoreRequest_init_default {NULL}
-#define PB_Storage_File_init_zero                {_PB_Storage_File_FileType_MIN, NULL, 0, NULL}
-#define PB_Storage_InfoRequest_init_zero         {NULL}
-#define PB_Storage_InfoResponse_init_zero        {0, 0}
-#define PB_Storage_StatRequest_init_zero         {NULL}
-#define PB_Storage_StatResponse_init_zero        {false, PB_Storage_File_init_zero}
-#define PB_Storage_ListRequest_init_zero         {NULL}
-#define PB_Storage_ListResponse_init_zero        {0, {PB_Storage_File_init_zero, PB_Storage_File_init_zero, PB_Storage_File_init_zero, PB_Storage_File_init_zero, PB_Storage_File_init_zero, PB_Storage_File_init_zero, PB_Storage_File_init_zero, PB_Storage_File_init_zero}}
-#define PB_Storage_ReadRequest_init_zero         {NULL}
-#define PB_Storage_ReadResponse_init_zero        {false, PB_Storage_File_init_zero}
-#define PB_Storage_WriteRequest_init_zero        {NULL, false, PB_Storage_File_init_zero}
-#define PB_Storage_DeleteRequest_init_zero       {NULL, 0}
-#define PB_Storage_MkdirRequest_init_zero        {NULL}
-#define PB_Storage_Md5sumRequest_init_zero       {NULL}
-#define PB_Storage_Md5sumResponse_init_zero      {""}
-#define PB_Storage_RenameRequest_init_zero       {NULL, NULL}
-#define PB_Storage_BackupCreateRequest_init_zero {NULL}
-#define PB_Storage_BackupRestoreRequest_init_zero {NULL}
-
-/* Field tags (for use in manual encoding/decoding) */
-#define PB_Storage_BackupCreateRequest_archive_path_tag 1
-#define PB_Storage_BackupRestoreRequest_archive_path_tag 1
-#define PB_Storage_InfoRequest_path_tag          1
-#define PB_Storage_ListRequest_path_tag          1
-#define PB_Storage_Md5sumRequest_path_tag        1
-#define PB_Storage_MkdirRequest_path_tag         1
-#define PB_Storage_ReadRequest_path_tag          1
-#define PB_Storage_RenameRequest_old_path_tag    1
-#define PB_Storage_RenameRequest_new_path_tag    2
-#define PB_Storage_StatRequest_path_tag          1
-#define PB_Storage_DeleteRequest_path_tag        1
-#define PB_Storage_DeleteRequest_recursive_tag   2
-#define PB_Storage_File_type_tag                 1
-#define PB_Storage_File_name_tag                 2
-#define PB_Storage_File_size_tag                 3
-#define PB_Storage_File_data_tag                 4
-#define PB_Storage_InfoResponse_total_space_tag  1
-#define PB_Storage_InfoResponse_free_space_tag   2
-#define PB_Storage_Md5sumResponse_md5sum_tag     1
-#define PB_Storage_ListResponse_file_tag         1
-#define PB_Storage_ReadResponse_file_tag         1
-#define PB_Storage_StatResponse_file_tag         1
-#define PB_Storage_WriteRequest_path_tag         1
-#define PB_Storage_WriteRequest_file_tag         2
-
-/* Struct field encoding specification for nanopb */
-#define PB_Storage_File_FIELDLIST(X, a) \
-X(a, STATIC,   SINGULAR, UENUM,    type,              1) \
-X(a, POINTER,  SINGULAR, STRING,   name,              2) \
-X(a, STATIC,   SINGULAR, UINT32,   size,              3) \
-X(a, POINTER,  SINGULAR, BYTES,    data,              4)
-#define PB_Storage_File_CALLBACK NULL
-#define PB_Storage_File_DEFAULT NULL
-
-#define PB_Storage_InfoRequest_FIELDLIST(X, a) \
-X(a, POINTER,  SINGULAR, STRING,   path,              1)
-#define PB_Storage_InfoRequest_CALLBACK NULL
-#define PB_Storage_InfoRequest_DEFAULT NULL
-
-#define PB_Storage_InfoResponse_FIELDLIST(X, a) \
-X(a, STATIC,   SINGULAR, UINT64,   total_space,       1) \
-X(a, STATIC,   SINGULAR, UINT64,   free_space,        2)
-#define PB_Storage_InfoResponse_CALLBACK NULL
-#define PB_Storage_InfoResponse_DEFAULT NULL
-
-#define PB_Storage_StatRequest_FIELDLIST(X, a) \
-X(a, POINTER,  SINGULAR, STRING,   path,              1)
-#define PB_Storage_StatRequest_CALLBACK NULL
-#define PB_Storage_StatRequest_DEFAULT NULL
-
-#define PB_Storage_StatResponse_FIELDLIST(X, a) \
-X(a, STATIC,   OPTIONAL, MESSAGE,  file,              1)
-#define PB_Storage_StatResponse_CALLBACK NULL
-#define PB_Storage_StatResponse_DEFAULT NULL
-#define PB_Storage_StatResponse_file_MSGTYPE PB_Storage_File
-
-#define PB_Storage_ListRequest_FIELDLIST(X, a) \
-X(a, POINTER,  SINGULAR, STRING,   path,              1)
-#define PB_Storage_ListRequest_CALLBACK NULL
-#define PB_Storage_ListRequest_DEFAULT NULL
-
-#define PB_Storage_ListResponse_FIELDLIST(X, a) \
-X(a, STATIC,   REPEATED, MESSAGE,  file,              1)
-#define PB_Storage_ListResponse_CALLBACK NULL
-#define PB_Storage_ListResponse_DEFAULT NULL
-#define PB_Storage_ListResponse_file_MSGTYPE PB_Storage_File
-
-#define PB_Storage_ReadRequest_FIELDLIST(X, a) \
-X(a, POINTER,  SINGULAR, STRING,   path,              1)
-#define PB_Storage_ReadRequest_CALLBACK NULL
-#define PB_Storage_ReadRequest_DEFAULT NULL
-
-#define PB_Storage_ReadResponse_FIELDLIST(X, a) \
-X(a, STATIC,   OPTIONAL, MESSAGE,  file,              1)
-#define PB_Storage_ReadResponse_CALLBACK NULL
-#define PB_Storage_ReadResponse_DEFAULT NULL
-#define PB_Storage_ReadResponse_file_MSGTYPE PB_Storage_File
-
-#define PB_Storage_WriteRequest_FIELDLIST(X, a) \
-X(a, POINTER,  SINGULAR, STRING,   path,              1) \
-X(a, STATIC,   OPTIONAL, MESSAGE,  file,              2)
-#define PB_Storage_WriteRequest_CALLBACK NULL
-#define PB_Storage_WriteRequest_DEFAULT NULL
-#define PB_Storage_WriteRequest_file_MSGTYPE PB_Storage_File
-
-#define PB_Storage_DeleteRequest_FIELDLIST(X, a) \
-X(a, POINTER,  SINGULAR, STRING,   path,              1) \
-X(a, STATIC,   SINGULAR, BOOL,     recursive,         2)
-#define PB_Storage_DeleteRequest_CALLBACK NULL
-#define PB_Storage_DeleteRequest_DEFAULT NULL
-
-#define PB_Storage_MkdirRequest_FIELDLIST(X, a) \
-X(a, POINTER,  SINGULAR, STRING,   path,              1)
-#define PB_Storage_MkdirRequest_CALLBACK NULL
-#define PB_Storage_MkdirRequest_DEFAULT NULL
-
-#define PB_Storage_Md5sumRequest_FIELDLIST(X, a) \
-X(a, POINTER,  SINGULAR, STRING,   path,              1)
-#define PB_Storage_Md5sumRequest_CALLBACK NULL
-#define PB_Storage_Md5sumRequest_DEFAULT NULL
-
-#define PB_Storage_Md5sumResponse_FIELDLIST(X, a) \
-X(a, STATIC,   SINGULAR, STRING,   md5sum,            1)
-#define PB_Storage_Md5sumResponse_CALLBACK NULL
-#define PB_Storage_Md5sumResponse_DEFAULT NULL
-
-#define PB_Storage_RenameRequest_FIELDLIST(X, a) \
-X(a, POINTER,  SINGULAR, STRING,   old_path,          1) \
-X(a, POINTER,  SINGULAR, STRING,   new_path,          2)
-#define PB_Storage_RenameRequest_CALLBACK NULL
-#define PB_Storage_RenameRequest_DEFAULT NULL
-
-#define PB_Storage_BackupCreateRequest_FIELDLIST(X, a) \
-X(a, POINTER,  SINGULAR, STRING,   archive_path,      1)
-#define PB_Storage_BackupCreateRequest_CALLBACK NULL
-#define PB_Storage_BackupCreateRequest_DEFAULT NULL
-
-#define PB_Storage_BackupRestoreRequest_FIELDLIST(X, a) \
-X(a, POINTER,  SINGULAR, STRING,   archive_path,      1)
-#define PB_Storage_BackupRestoreRequest_CALLBACK NULL
-#define PB_Storage_BackupRestoreRequest_DEFAULT NULL
-
-extern const pb_msgdesc_t PB_Storage_File_msg;
-extern const pb_msgdesc_t PB_Storage_InfoRequest_msg;
-extern const pb_msgdesc_t PB_Storage_InfoResponse_msg;
-extern const pb_msgdesc_t PB_Storage_StatRequest_msg;
-extern const pb_msgdesc_t PB_Storage_StatResponse_msg;
-extern const pb_msgdesc_t PB_Storage_ListRequest_msg;
-extern const pb_msgdesc_t PB_Storage_ListResponse_msg;
-extern const pb_msgdesc_t PB_Storage_ReadRequest_msg;
-extern const pb_msgdesc_t PB_Storage_ReadResponse_msg;
-extern const pb_msgdesc_t PB_Storage_WriteRequest_msg;
-extern const pb_msgdesc_t PB_Storage_DeleteRequest_msg;
-extern const pb_msgdesc_t PB_Storage_MkdirRequest_msg;
-extern const pb_msgdesc_t PB_Storage_Md5sumRequest_msg;
-extern const pb_msgdesc_t PB_Storage_Md5sumResponse_msg;
-extern const pb_msgdesc_t PB_Storage_RenameRequest_msg;
-extern const pb_msgdesc_t PB_Storage_BackupCreateRequest_msg;
-extern const pb_msgdesc_t PB_Storage_BackupRestoreRequest_msg;
-
-/* Defines for backwards compatibility with code written before nanopb-0.4.0 */
-#define PB_Storage_File_fields &PB_Storage_File_msg
-#define PB_Storage_InfoRequest_fields &PB_Storage_InfoRequest_msg
-#define PB_Storage_InfoResponse_fields &PB_Storage_InfoResponse_msg
-#define PB_Storage_StatRequest_fields &PB_Storage_StatRequest_msg
-#define PB_Storage_StatResponse_fields &PB_Storage_StatResponse_msg
-#define PB_Storage_ListRequest_fields &PB_Storage_ListRequest_msg
-#define PB_Storage_ListResponse_fields &PB_Storage_ListResponse_msg
-#define PB_Storage_ReadRequest_fields &PB_Storage_ReadRequest_msg
-#define PB_Storage_ReadResponse_fields &PB_Storage_ReadResponse_msg
-#define PB_Storage_WriteRequest_fields &PB_Storage_WriteRequest_msg
-#define PB_Storage_DeleteRequest_fields &PB_Storage_DeleteRequest_msg
-#define PB_Storage_MkdirRequest_fields &PB_Storage_MkdirRequest_msg
-#define PB_Storage_Md5sumRequest_fields &PB_Storage_Md5sumRequest_msg
-#define PB_Storage_Md5sumResponse_fields &PB_Storage_Md5sumResponse_msg
-#define PB_Storage_RenameRequest_fields &PB_Storage_RenameRequest_msg
-#define PB_Storage_BackupCreateRequest_fields &PB_Storage_BackupCreateRequest_msg
-#define PB_Storage_BackupRestoreRequest_fields &PB_Storage_BackupRestoreRequest_msg
-
-/* Maximum encoded size of messages (where known) */
-/* PB_Storage_File_size depends on runtime parameters */
-/* PB_Storage_InfoRequest_size depends on runtime parameters */
-/* PB_Storage_StatRequest_size depends on runtime parameters */
-/* PB_Storage_StatResponse_size depends on runtime parameters */
-/* PB_Storage_ListRequest_size depends on runtime parameters */
-/* PB_Storage_ListResponse_size depends on runtime parameters */
-/* PB_Storage_ReadRequest_size depends on runtime parameters */
-/* PB_Storage_ReadResponse_size depends on runtime parameters */
-/* PB_Storage_WriteRequest_size depends on runtime parameters */
-/* PB_Storage_DeleteRequest_size depends on runtime parameters */
-/* PB_Storage_MkdirRequest_size depends on runtime parameters */
-/* PB_Storage_Md5sumRequest_size depends on runtime parameters */
-/* PB_Storage_RenameRequest_size depends on runtime parameters */
-/* PB_Storage_BackupCreateRequest_size depends on runtime parameters */
-/* PB_Storage_BackupRestoreRequest_size depends on runtime parameters */
-#define PB_Storage_InfoResponse_size             22
-#define PB_Storage_Md5sumResponse_size           34
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif

+ 0 - 62
assets/compiled/system.pb.c

@@ -1,62 +0,0 @@
-/* Automatically generated nanopb constant definitions */
-/* Generated by nanopb-0.4.5 */
-
-#include "system.pb.h"
-#if PB_PROTO_HEADER_VERSION != 40
-#error Regenerate this file with the current version of nanopb generator.
-#endif
-
-PB_BIND(PB_System_PingRequest, PB_System_PingRequest, AUTO)
-
-
-PB_BIND(PB_System_PingResponse, PB_System_PingResponse, AUTO)
-
-
-PB_BIND(PB_System_RebootRequest, PB_System_RebootRequest, AUTO)
-
-
-PB_BIND(PB_System_DeviceInfoRequest, PB_System_DeviceInfoRequest, AUTO)
-
-
-PB_BIND(PB_System_DeviceInfoResponse, PB_System_DeviceInfoResponse, AUTO)
-
-
-PB_BIND(PB_System_FactoryResetRequest, PB_System_FactoryResetRequest, AUTO)
-
-
-PB_BIND(PB_System_GetDateTimeRequest, PB_System_GetDateTimeRequest, AUTO)
-
-
-PB_BIND(PB_System_GetDateTimeResponse, PB_System_GetDateTimeResponse, AUTO)
-
-
-PB_BIND(PB_System_SetDateTimeRequest, PB_System_SetDateTimeRequest, AUTO)
-
-
-PB_BIND(PB_System_DateTime, PB_System_DateTime, AUTO)
-
-
-PB_BIND(PB_System_PlayAudiovisualAlertRequest, PB_System_PlayAudiovisualAlertRequest, AUTO)
-
-
-PB_BIND(PB_System_ProtobufVersionRequest, PB_System_ProtobufVersionRequest, AUTO)
-
-
-PB_BIND(PB_System_ProtobufVersionResponse, PB_System_ProtobufVersionResponse, AUTO)
-
-
-PB_BIND(PB_System_UpdateRequest, PB_System_UpdateRequest, AUTO)
-
-
-PB_BIND(PB_System_UpdateResponse, PB_System_UpdateResponse, AUTO)
-
-
-PB_BIND(PB_System_PowerInfoRequest, PB_System_PowerInfoRequest, AUTO)
-
-
-PB_BIND(PB_System_PowerInfoResponse, PB_System_PowerInfoResponse, AUTO)
-
-
-
-
-

+ 0 - 342
assets/compiled/system.pb.h

@@ -1,342 +0,0 @@
-/* Automatically generated nanopb header */
-/* Generated by nanopb-0.4.5 */
-
-#ifndef PB_PB_SYSTEM_SYSTEM_PB_H_INCLUDED
-#define PB_PB_SYSTEM_SYSTEM_PB_H_INCLUDED
-#include <pb.h>
-
-#if PB_PROTO_HEADER_VERSION != 40
-#error Regenerate this file with the current version of nanopb generator.
-#endif
-
-/* Enum definitions */
-typedef enum _PB_System_RebootRequest_RebootMode { 
-    PB_System_RebootRequest_RebootMode_OS = 0, 
-    PB_System_RebootRequest_RebootMode_DFU = 1, 
-    PB_System_RebootRequest_RebootMode_UPDATE = 2 
-} PB_System_RebootRequest_RebootMode;
-
-typedef enum _PB_System_UpdateResponse_UpdateResultCode { 
-    PB_System_UpdateResponse_UpdateResultCode_OK = 0, 
-    PB_System_UpdateResponse_UpdateResultCode_ManifestPathInvalid = 1, 
-    PB_System_UpdateResponse_UpdateResultCode_ManifestFolderNotFound = 2, 
-    PB_System_UpdateResponse_UpdateResultCode_ManifestInvalid = 3, 
-    PB_System_UpdateResponse_UpdateResultCode_StageMissing = 4, 
-    PB_System_UpdateResponse_UpdateResultCode_StageIntegrityError = 5, 
-    PB_System_UpdateResponse_UpdateResultCode_ManifestPointerError = 6, 
-    PB_System_UpdateResponse_UpdateResultCode_TargetMismatch = 7 
-} PB_System_UpdateResponse_UpdateResultCode;
-
-/* Struct definitions */
-typedef struct _PB_System_DeviceInfoRequest { 
-    char dummy_field;
-} PB_System_DeviceInfoRequest;
-
-typedef struct _PB_System_DeviceInfoResponse { 
-    char *key; 
-    char *value; 
-} PB_System_DeviceInfoResponse;
-
-typedef struct _PB_System_FactoryResetRequest { 
-    char dummy_field;
-} PB_System_FactoryResetRequest;
-
-typedef struct _PB_System_GetDateTimeRequest { 
-    char dummy_field;
-} PB_System_GetDateTimeRequest;
-
-typedef struct _PB_System_PingRequest { 
-    pb_bytes_array_t *data; 
-} PB_System_PingRequest;
-
-typedef struct _PB_System_PingResponse { 
-    pb_bytes_array_t *data; 
-} PB_System_PingResponse;
-
-typedef struct _PB_System_PlayAudiovisualAlertRequest { 
-    char dummy_field;
-} PB_System_PlayAudiovisualAlertRequest;
-
-typedef struct _PB_System_PowerInfoRequest { 
-    char dummy_field;
-} PB_System_PowerInfoRequest;
-
-typedef struct _PB_System_PowerInfoResponse { 
-    char *key; 
-    char *value; 
-} PB_System_PowerInfoResponse;
-
-typedef struct _PB_System_ProtobufVersionRequest { 
-    char dummy_field;
-} PB_System_ProtobufVersionRequest;
-
-typedef struct _PB_System_UpdateRequest { 
-    char *update_manifest; 
-} PB_System_UpdateRequest;
-
-typedef struct _PB_System_DateTime { 
-    /* Time */
-    uint8_t hour; /* *< Hour in 24H format: 0-23 */
-    uint8_t minute; /* *< Minute: 0-59 */
-    uint8_t second; /* *< Second: 0-59 */
-    /* Date */
-    uint8_t day; /* *< Current day: 1-31 */
-    uint8_t month; /* *< Current month: 1-12 */
-    uint16_t year; /* *< Current year: 2000-2099 */
-    uint8_t weekday; /* *< Current weekday: 1-7 */
-} PB_System_DateTime;
-
-typedef struct _PB_System_ProtobufVersionResponse { 
-    uint32_t major; 
-    uint32_t minor; 
-} PB_System_ProtobufVersionResponse;
-
-typedef struct _PB_System_RebootRequest { 
-    PB_System_RebootRequest_RebootMode mode; 
-} PB_System_RebootRequest;
-
-typedef struct _PB_System_UpdateResponse { 
-    PB_System_UpdateResponse_UpdateResultCode code; 
-} PB_System_UpdateResponse;
-
-typedef struct _PB_System_GetDateTimeResponse { 
-    bool has_datetime;
-    PB_System_DateTime datetime; 
-} PB_System_GetDateTimeResponse;
-
-typedef struct _PB_System_SetDateTimeRequest { 
-    bool has_datetime;
-    PB_System_DateTime datetime; 
-} PB_System_SetDateTimeRequest;
-
-
-/* Helper constants for enums */
-#define _PB_System_RebootRequest_RebootMode_MIN PB_System_RebootRequest_RebootMode_OS
-#define _PB_System_RebootRequest_RebootMode_MAX PB_System_RebootRequest_RebootMode_UPDATE
-#define _PB_System_RebootRequest_RebootMode_ARRAYSIZE ((PB_System_RebootRequest_RebootMode)(PB_System_RebootRequest_RebootMode_UPDATE+1))
-
-#define _PB_System_UpdateResponse_UpdateResultCode_MIN PB_System_UpdateResponse_UpdateResultCode_OK
-#define _PB_System_UpdateResponse_UpdateResultCode_MAX PB_System_UpdateResponse_UpdateResultCode_TargetMismatch
-#define _PB_System_UpdateResponse_UpdateResultCode_ARRAYSIZE ((PB_System_UpdateResponse_UpdateResultCode)(PB_System_UpdateResponse_UpdateResultCode_TargetMismatch+1))
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Initializer values for message structs */
-#define PB_System_PingRequest_init_default       {NULL}
-#define PB_System_PingResponse_init_default      {NULL}
-#define PB_System_RebootRequest_init_default     {_PB_System_RebootRequest_RebootMode_MIN}
-#define PB_System_DeviceInfoRequest_init_default {0}
-#define PB_System_DeviceInfoResponse_init_default {NULL, NULL}
-#define PB_System_FactoryResetRequest_init_default {0}
-#define PB_System_GetDateTimeRequest_init_default {0}
-#define PB_System_GetDateTimeResponse_init_default {false, PB_System_DateTime_init_default}
-#define PB_System_SetDateTimeRequest_init_default {false, PB_System_DateTime_init_default}
-#define PB_System_DateTime_init_default          {0, 0, 0, 0, 0, 0, 0}
-#define PB_System_PlayAudiovisualAlertRequest_init_default {0}
-#define PB_System_ProtobufVersionRequest_init_default {0}
-#define PB_System_ProtobufVersionResponse_init_default {0, 0}
-#define PB_System_UpdateRequest_init_default     {NULL}
-#define PB_System_UpdateResponse_init_default    {_PB_System_UpdateResponse_UpdateResultCode_MIN}
-#define PB_System_PowerInfoRequest_init_default  {0}
-#define PB_System_PowerInfoResponse_init_default {NULL, NULL}
-#define PB_System_PingRequest_init_zero          {NULL}
-#define PB_System_PingResponse_init_zero         {NULL}
-#define PB_System_RebootRequest_init_zero        {_PB_System_RebootRequest_RebootMode_MIN}
-#define PB_System_DeviceInfoRequest_init_zero    {0}
-#define PB_System_DeviceInfoResponse_init_zero   {NULL, NULL}
-#define PB_System_FactoryResetRequest_init_zero  {0}
-#define PB_System_GetDateTimeRequest_init_zero   {0}
-#define PB_System_GetDateTimeResponse_init_zero  {false, PB_System_DateTime_init_zero}
-#define PB_System_SetDateTimeRequest_init_zero   {false, PB_System_DateTime_init_zero}
-#define PB_System_DateTime_init_zero             {0, 0, 0, 0, 0, 0, 0}
-#define PB_System_PlayAudiovisualAlertRequest_init_zero {0}
-#define PB_System_ProtobufVersionRequest_init_zero {0}
-#define PB_System_ProtobufVersionResponse_init_zero {0, 0}
-#define PB_System_UpdateRequest_init_zero        {NULL}
-#define PB_System_UpdateResponse_init_zero       {_PB_System_UpdateResponse_UpdateResultCode_MIN}
-#define PB_System_PowerInfoRequest_init_zero     {0}
-#define PB_System_PowerInfoResponse_init_zero    {NULL, NULL}
-
-/* Field tags (for use in manual encoding/decoding) */
-#define PB_System_DeviceInfoResponse_key_tag     1
-#define PB_System_DeviceInfoResponse_value_tag   2
-#define PB_System_PingRequest_data_tag           1
-#define PB_System_PingResponse_data_tag          1
-#define PB_System_PowerInfoResponse_key_tag      1
-#define PB_System_PowerInfoResponse_value_tag    2
-#define PB_System_UpdateRequest_update_manifest_tag 1
-#define PB_System_DateTime_hour_tag              1
-#define PB_System_DateTime_minute_tag            2
-#define PB_System_DateTime_second_tag            3
-#define PB_System_DateTime_day_tag               4
-#define PB_System_DateTime_month_tag             5
-#define PB_System_DateTime_year_tag              6
-#define PB_System_DateTime_weekday_tag           7
-#define PB_System_ProtobufVersionResponse_major_tag 1
-#define PB_System_ProtobufVersionResponse_minor_tag 2
-#define PB_System_RebootRequest_mode_tag         1
-#define PB_System_UpdateResponse_code_tag        1
-#define PB_System_GetDateTimeResponse_datetime_tag 1
-#define PB_System_SetDateTimeRequest_datetime_tag 1
-
-/* Struct field encoding specification for nanopb */
-#define PB_System_PingRequest_FIELDLIST(X, a) \
-X(a, POINTER,  SINGULAR, BYTES,    data,              1)
-#define PB_System_PingRequest_CALLBACK NULL
-#define PB_System_PingRequest_DEFAULT NULL
-
-#define PB_System_PingResponse_FIELDLIST(X, a) \
-X(a, POINTER,  SINGULAR, BYTES,    data,              1)
-#define PB_System_PingResponse_CALLBACK NULL
-#define PB_System_PingResponse_DEFAULT NULL
-
-#define PB_System_RebootRequest_FIELDLIST(X, a) \
-X(a, STATIC,   SINGULAR, UENUM,    mode,              1)
-#define PB_System_RebootRequest_CALLBACK NULL
-#define PB_System_RebootRequest_DEFAULT NULL
-
-#define PB_System_DeviceInfoRequest_FIELDLIST(X, a) \
-
-#define PB_System_DeviceInfoRequest_CALLBACK NULL
-#define PB_System_DeviceInfoRequest_DEFAULT NULL
-
-#define PB_System_DeviceInfoResponse_FIELDLIST(X, a) \
-X(a, POINTER,  SINGULAR, STRING,   key,               1) \
-X(a, POINTER,  SINGULAR, STRING,   value,             2)
-#define PB_System_DeviceInfoResponse_CALLBACK NULL
-#define PB_System_DeviceInfoResponse_DEFAULT NULL
-
-#define PB_System_FactoryResetRequest_FIELDLIST(X, a) \
-
-#define PB_System_FactoryResetRequest_CALLBACK NULL
-#define PB_System_FactoryResetRequest_DEFAULT NULL
-
-#define PB_System_GetDateTimeRequest_FIELDLIST(X, a) \
-
-#define PB_System_GetDateTimeRequest_CALLBACK NULL
-#define PB_System_GetDateTimeRequest_DEFAULT NULL
-
-#define PB_System_GetDateTimeResponse_FIELDLIST(X, a) \
-X(a, STATIC,   OPTIONAL, MESSAGE,  datetime,          1)
-#define PB_System_GetDateTimeResponse_CALLBACK NULL
-#define PB_System_GetDateTimeResponse_DEFAULT NULL
-#define PB_System_GetDateTimeResponse_datetime_MSGTYPE PB_System_DateTime
-
-#define PB_System_SetDateTimeRequest_FIELDLIST(X, a) \
-X(a, STATIC,   OPTIONAL, MESSAGE,  datetime,          1)
-#define PB_System_SetDateTimeRequest_CALLBACK NULL
-#define PB_System_SetDateTimeRequest_DEFAULT NULL
-#define PB_System_SetDateTimeRequest_datetime_MSGTYPE PB_System_DateTime
-
-#define PB_System_DateTime_FIELDLIST(X, a) \
-X(a, STATIC,   SINGULAR, UINT32,   hour,              1) \
-X(a, STATIC,   SINGULAR, UINT32,   minute,            2) \
-X(a, STATIC,   SINGULAR, UINT32,   second,            3) \
-X(a, STATIC,   SINGULAR, UINT32,   day,               4) \
-X(a, STATIC,   SINGULAR, UINT32,   month,             5) \
-X(a, STATIC,   SINGULAR, UINT32,   year,              6) \
-X(a, STATIC,   SINGULAR, UINT32,   weekday,           7)
-#define PB_System_DateTime_CALLBACK NULL
-#define PB_System_DateTime_DEFAULT NULL
-
-#define PB_System_PlayAudiovisualAlertRequest_FIELDLIST(X, a) \
-
-#define PB_System_PlayAudiovisualAlertRequest_CALLBACK NULL
-#define PB_System_PlayAudiovisualAlertRequest_DEFAULT NULL
-
-#define PB_System_ProtobufVersionRequest_FIELDLIST(X, a) \
-
-#define PB_System_ProtobufVersionRequest_CALLBACK NULL
-#define PB_System_ProtobufVersionRequest_DEFAULT NULL
-
-#define PB_System_ProtobufVersionResponse_FIELDLIST(X, a) \
-X(a, STATIC,   SINGULAR, UINT32,   major,             1) \
-X(a, STATIC,   SINGULAR, UINT32,   minor,             2)
-#define PB_System_ProtobufVersionResponse_CALLBACK NULL
-#define PB_System_ProtobufVersionResponse_DEFAULT NULL
-
-#define PB_System_UpdateRequest_FIELDLIST(X, a) \
-X(a, POINTER,  SINGULAR, STRING,   update_manifest,   1)
-#define PB_System_UpdateRequest_CALLBACK NULL
-#define PB_System_UpdateRequest_DEFAULT NULL
-
-#define PB_System_UpdateResponse_FIELDLIST(X, a) \
-X(a, STATIC,   SINGULAR, UENUM,    code,              1)
-#define PB_System_UpdateResponse_CALLBACK NULL
-#define PB_System_UpdateResponse_DEFAULT NULL
-
-#define PB_System_PowerInfoRequest_FIELDLIST(X, a) \
-
-#define PB_System_PowerInfoRequest_CALLBACK NULL
-#define PB_System_PowerInfoRequest_DEFAULT NULL
-
-#define PB_System_PowerInfoResponse_FIELDLIST(X, a) \
-X(a, POINTER,  SINGULAR, STRING,   key,               1) \
-X(a, POINTER,  SINGULAR, STRING,   value,             2)
-#define PB_System_PowerInfoResponse_CALLBACK NULL
-#define PB_System_PowerInfoResponse_DEFAULT NULL
-
-extern const pb_msgdesc_t PB_System_PingRequest_msg;
-extern const pb_msgdesc_t PB_System_PingResponse_msg;
-extern const pb_msgdesc_t PB_System_RebootRequest_msg;
-extern const pb_msgdesc_t PB_System_DeviceInfoRequest_msg;
-extern const pb_msgdesc_t PB_System_DeviceInfoResponse_msg;
-extern const pb_msgdesc_t PB_System_FactoryResetRequest_msg;
-extern const pb_msgdesc_t PB_System_GetDateTimeRequest_msg;
-extern const pb_msgdesc_t PB_System_GetDateTimeResponse_msg;
-extern const pb_msgdesc_t PB_System_SetDateTimeRequest_msg;
-extern const pb_msgdesc_t PB_System_DateTime_msg;
-extern const pb_msgdesc_t PB_System_PlayAudiovisualAlertRequest_msg;
-extern const pb_msgdesc_t PB_System_ProtobufVersionRequest_msg;
-extern const pb_msgdesc_t PB_System_ProtobufVersionResponse_msg;
-extern const pb_msgdesc_t PB_System_UpdateRequest_msg;
-extern const pb_msgdesc_t PB_System_UpdateResponse_msg;
-extern const pb_msgdesc_t PB_System_PowerInfoRequest_msg;
-extern const pb_msgdesc_t PB_System_PowerInfoResponse_msg;
-
-/* Defines for backwards compatibility with code written before nanopb-0.4.0 */
-#define PB_System_PingRequest_fields &PB_System_PingRequest_msg
-#define PB_System_PingResponse_fields &PB_System_PingResponse_msg
-#define PB_System_RebootRequest_fields &PB_System_RebootRequest_msg
-#define PB_System_DeviceInfoRequest_fields &PB_System_DeviceInfoRequest_msg
-#define PB_System_DeviceInfoResponse_fields &PB_System_DeviceInfoResponse_msg
-#define PB_System_FactoryResetRequest_fields &PB_System_FactoryResetRequest_msg
-#define PB_System_GetDateTimeRequest_fields &PB_System_GetDateTimeRequest_msg
-#define PB_System_GetDateTimeResponse_fields &PB_System_GetDateTimeResponse_msg
-#define PB_System_SetDateTimeRequest_fields &PB_System_SetDateTimeRequest_msg
-#define PB_System_DateTime_fields &PB_System_DateTime_msg
-#define PB_System_PlayAudiovisualAlertRequest_fields &PB_System_PlayAudiovisualAlertRequest_msg
-#define PB_System_ProtobufVersionRequest_fields &PB_System_ProtobufVersionRequest_msg
-#define PB_System_ProtobufVersionResponse_fields &PB_System_ProtobufVersionResponse_msg
-#define PB_System_UpdateRequest_fields &PB_System_UpdateRequest_msg
-#define PB_System_UpdateResponse_fields &PB_System_UpdateResponse_msg
-#define PB_System_PowerInfoRequest_fields &PB_System_PowerInfoRequest_msg
-#define PB_System_PowerInfoResponse_fields &PB_System_PowerInfoResponse_msg
-
-/* Maximum encoded size of messages (where known) */
-/* PB_System_PingRequest_size depends on runtime parameters */
-/* PB_System_PingResponse_size depends on runtime parameters */
-/* PB_System_DeviceInfoResponse_size depends on runtime parameters */
-/* PB_System_UpdateRequest_size depends on runtime parameters */
-/* PB_System_PowerInfoResponse_size depends on runtime parameters */
-#define PB_System_DateTime_size                  22
-#define PB_System_DeviceInfoRequest_size         0
-#define PB_System_FactoryResetRequest_size       0
-#define PB_System_GetDateTimeRequest_size        0
-#define PB_System_GetDateTimeResponse_size       24
-#define PB_System_PlayAudiovisualAlertRequest_size 0
-#define PB_System_PowerInfoRequest_size          0
-#define PB_System_ProtobufVersionRequest_size    0
-#define PB_System_ProtobufVersionResponse_size   12
-#define PB_System_RebootRequest_size             2
-#define PB_System_SetDateTimeRequest_size        24
-#define PB_System_UpdateResponse_size            2
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif

+ 0 - 14
assets/copro.mk

@@ -1,14 +0,0 @@
-COPRO_CUBE_VERSION	:= 1.13.3
-COPRO_MCU_FAMILY	:= STM32WB5x
-COPRO_STACK_BIN 	?= stm32wb5x_BLE_Stack_light_fw.bin
-#  See __STACK_TYPE_CODES in scripts/flipper/assets/coprobin.py
-COPRO_STACK_TYPE	?= ble_light
-COPRO_DISCLAIMER	?=
-COPRO_OB_DATA		?= ob.data
-#  Keep 0 for auto, or put a value from release_notes for chosen stack
-COPRO_STACK_ADDR	:= 0
-
-COPRO_BUNDLE_DIR	:= $(ASSETS_DIR)/core2_firmware
-COPRO_CUBE_DIR		:= $(PROJECT_ROOT)/lib/STM32CubeWB
-COPRO_FIRMWARE_DIR	:= $(COPRO_CUBE_DIR)/Projects/STM32WB_Copro_Wireless_Binaries/$(COPRO_MCU_FAMILY)
-COPRO_STACK_BIN_PATH	:= $(COPRO_FIRMWARE_DIR)/$(COPRO_STACK_BIN)

BIN
assets/icons/About/Certification1_103x23.png


BIN
assets/icons/About/Certification1_103x56.png


BIN
assets/icons/About/Certification2_119x30.png


BIN
assets/icons/About/Certification2_98x33.png


BIN
assets/icons/Archive/back_10px.png


BIN
assets/icons/Common/Loading_24/frame_01.png


BIN
assets/icons/Common/Loading_24/frame_02.png


BIN
assets/icons/Common/Loading_24/frame_03.png


BIN
assets/icons/Common/Loading_24/frame_04.png


BIN
assets/icons/Common/Loading_24/frame_05.png


BIN
assets/icons/Common/Loading_24/frame_06.png


BIN
assets/icons/Common/Loading_24/frame_07.png


BIN
assets/icons/Dolphin/DolphinFirstStart5_54x49.png


+ 0 - 3
assets/splash.mk

@@ -1,3 +0,0 @@
-ASSETS_DIR			?= $(PROJECT_ROOT)/assets
-UPDATER_SPLASH		?= update_default
-UPDATER_SPLASH_DIR	:= $(ASSETS_DIR)/slideshow/$(UPDATER_SPLASH)

+ 13 - 0
core/SConscript

@@ -0,0 +1,13 @@
+Import("env")
+
+env.Append(LINT_SOURCES=["core"])
+
+
+libenv = env.Clone(FW_LIB_NAME="core")
+libenv.ApplyLibFlags()
+
+sources = libenv.GlobRecursive("*.c")
+
+lib = libenv.StaticLibrary("${FW_LIB_NAME}", sources)
+libenv.Install("${LIB_DIST_DIR}", lib)
+Return("lib")

+ 0 - 8
core/core.mk

@@ -1,8 +0,0 @@
-CORE_DIR		= $(PROJECT_ROOT)/core
-
-CFLAGS			+= -I$(CORE_DIR) -D_GNU_SOURCE
-ASM_SOURCES		+= $(wildcard $(CORE_DIR)/*.s)
-C_SOURCES		+= $(wildcard $(CORE_DIR)/*.c)
-C_SOURCES		+= $(wildcard $(CORE_DIR)/furi/*.c)
-C_SOURCES		+= $(wildcard $(CORE_DIR)/furi_hal/*.c)
-CPP_SOURCES		+= $(wildcard $(CORE_DIR)/*.cpp)

+ 4 - 3
docker/Dockerfile

@@ -16,9 +16,11 @@ RUN apt-get update \
         libxslt1-dev \
         zlib1g-dev \
         wget \
-        imagemagick \
         python3-protobuf \
         protobuf-compiler \
+        python3-pip \
+        libpython3-dev \
+        ccache \
     && apt-get clean \
     && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
 
@@ -30,8 +32,7 @@ RUN wget --progress=dot:giga "https://developer.arm.com/-/media/Files/downloads/
     for file in * ; do ln -s "${PWD}/${file}" "/usr/bin/${file}" ; done && \
     cd / && arm-none-eabi-gcc -v && arm-none-eabi-gdb -v
 
-RUN git clone --depth 1 --branch v0.4.1 https://github.com/atomicobject/heatshrink.git && \
-    cd heatshrink && make && mv ./heatshrink /usr/local/bin/heatshrink
+RUN pip3 install heatshrink2==0.11.0 Pillow==9.1.1
 
 RUN ln -s `which clang-format-12` /usr/local/bin/clang-format
 

+ 3 - 0
documentation/AppManifests.md

@@ -0,0 +1,3 @@
+# Flipper Application Manifests (.fam)
+
+TBD

+ 3 - 3
documentation/OTA.md

@@ -110,15 +110,15 @@ Even if something goes wrong, Updater gives you an option to retry failed operat
 
 ## Full package
 
-To build a basic update package, run `make COMPACT=1 DEBUG=0 updater_package`
+To build a basic update package, run `./fbt --with-updater COMPACT=1 DEBUG=0 updater_package`
 
 
 ## Customizing update bundles
 
 Default update packages are built with Bluetooth Light stack. 
-You can pick a different stack, if your firmware version supports it, and build a bundle with it passing stack type and binary name to `make`: 
+You can pick a different stack, if your firmware version supports it, and build a bundle with it passing stack type and binary name to `fbt`: 
 
-`make updater_package COMPACT=1 DEBUG=0 COPRO_OB_DATA=ob_custradio.data COPRO_STACK_BIN=stm32wb5x_BLE_Stack_full_fw.bin COPRO_STACK_TYPE=ble_full`  
+`./fbt --with-updater updater_package COMPACT=1 DEBUG=0 COPRO_OB_DATA=scripts/ob_custradio.data COPRO_STACK_BIN=stm32wb5x_BLE_Stack_full_fw.bin COPRO_STACK_TYPE=ble_full`  
 
 Note that `COPRO_OB_DATA` must point to a valid file in `scripts` folder containing reference Option Byte data matching to your radio stack type.
 

+ 77 - 0
documentation/fbt.md

@@ -0,0 +1,77 @@
+# Flipper Build Tool
+
+FBT is the entry point for most firmware-related commands and utilities.
+It is invoked by `./fbt` in firmware project root directory. Internally, it is a wrapper around [scons](https://scons.org/) build system.
+
+## Requirements
+
+Please install Python packages required by assets build scripts: `pip3 install -r scripts/requirements.txt`
+
+## NB
+
+FBT constructs all referenced environments & their targets' dependency trees on startup. So, to keep startup time as low as possible, we're hiding construction of certain targets behind command-line options.
+
+## Invoking FBT
+
+To build with FBT, call it specifying configuration options & targets to build. For example,
+
+`./fbt --with-updater COMPACT=1 DEBUG=0 VERBOSE=1 updater_package copro_dist`
+
+To run cleanup (think of `make clean`) for specified targets, all `-c` option.
+
+## FBT targets
+
+FBT keeps track of internal dependencies, so you only need to build the highest-level target you need, and FBT will make sure everything it needs is up-to-date.
+
+### High-level (what you most likely need)
+
+- `fw_dist` - build & publish firmware to `dist` folder
+- `updater_package` - build self-update package. _Requires `--with-updater` option_
+- `copro_dist` - bundle Core2 FUS+stack binaries for qFlipper
+- `debug` - build and flash firmware, then attach with gdb with firmware's .elf loaded
+- `debug_updater` - attach gdb with updater's .elf loaded. _Requires `--with-updater` option_
+- `debug_other` - attach gdb without loading built elf. Allows to manually add external elf files with `add-symbol-file` in gdb.
+- `openocd` - just start OpenOCD
+
+### Firmware targets
+
+- `firmware_extapps` - build all plug-ins as separate .elf files
+    - `firmware_snake_game`, etc - build single plug-in as .elf by its name
+    - Check out `--extra-ext-apps` for force adding extra apps to external build 
+    - `firmware_snake_game_list`, etc - generate source + assembler listing for app's .elf
+- `firmware_flash` - flash current version to attached device with OpenOCD
+- `firmware_cdb` - generate compilation database
+- `firmware_all`, `updater_all` - build basic set of binaries
+- `firmware_list`, `updater_list` - generate source + assembler listing
+
+### Assets
+
+- `resources` - build resources and their Manifest
+    - `dolphin_ext` - process dolphin animations for SD card 
+- `icons` - generate .c+.h for icons from png assets
+- `proto` - generate .pb.c+.pb.h for .proto sources
+- `proto_ver` - generate .h with protobuf version 
+- `dolphin_internal`, `dolphin_blocking` - generate .c+.h for corresponding dolphin assets
+ 
+
+## Command-line parameters
+
+- `--options optionfile.py` (default value `fbt_options.py`) - load file with multiple configuration values
+- `--with-updater` - enables updater-related targets and dependency tracking. Enabling this options introduces extra startup time costs, so use it when bundling update packages. Or if you have a fast computer and don't care about a few extra seconds of startup time
+- `--extra-int-apps=app1,app2,appN` - forces listed apps to be built as internal with `firmware` target
+- `--extra-ext-apps=app1,app2,appN` - forces listed apps to be built as external with `firmware_extapps` target
+
+
+## Configuration 
+
+Default configuration variables are set in configuration file `fbt_options.py`. 
+Values set on command-line have higher precedence over configuration file.
+
+You can find out available options with `./fbt -h`.
+
+### Firmware application set
+
+You can create customized firmware builds by modifying application list to be included in the build. Application presets are configured with `FIRMWARE_APPS` option, which is a map(configuration_name:str -> application_list:tuple(str)). To specify application set to use in a build, set `FIRMWARE_APP_SET` to its name.
+For example, to build firmware image with unit tests, run `./fbt FIRMWARE_APP_SET=unit_tests`.
+
+Check out `fbt_options.py` for details.

+ 12 - 0
fbt

@@ -0,0 +1,12 @@
+#!/bin/bash
+
+set -e
+
+if [[ -d .git ]]; then
+	echo "Updating git submodules"
+	git submodule update --init
+fi
+
+SCRIPTDIR="$( dirname -- "$0"; )";
+SCONS_DEFAULT_FLAGS="-Q --warn=target-not-built"
+python3 ${SCRIPTDIR}/lib/scons/scripts/scons.py ${SCONS_DEFAULT_FLAGS} "$@"

+ 8 - 0
fbt.cmd

@@ -0,0 +1,8 @@
+@echo off
+if exist ".git" (
+	echo Prepairing git submodules
+	git submodule update --init
+)
+
+set "SCONS_DEFAULT_FLAGS=-Q --warn=target-not-built"
+python lib/scons/scripts/scons.py %SCONS_DEFAULT_FLAGS% %*

+ 72 - 0
fbt_options.py

@@ -0,0 +1,72 @@
+import posixpath
+
+
+# Default hardware target
+TARGET_HW = 7
+
+# Optimization flags
+## Optimize for size
+COMPACT = 0
+## Optimize for debugging experience
+DEBUG = 1
+
+# Suffix to add to files when building distribution.
+# If OS environment has DIST_SUFFIX set, it will be used instead..
+DIST_SUFFIX = "local"
+
+# Coprocessor firmware
+COPRO_OB_DATA = "scripts/ob.data"
+
+# Must match lib/STM32CubeWB version
+COPRO_CUBE_VERSION = "1.13.3"
+
+COPRO_CUBE_DIR = "lib/STM32CubeWB"
+
+# Default radio stack
+COPRO_STACK_BIN = "stm32wb5x_BLE_Stack_light_fw.bin"
+# Firmware also supports "ble_full", but it might not fit into debug builds
+COPRO_STACK_TYPE = "ble_light"
+
+# Leave 0 to lets scripts automatically calculate it
+COPRO_STACK_ADDR = "0x0"
+
+# If you override COPRO_CUBE_DIR on commandline, override this aswell
+COPRO_STACK_BIN_DIR = posixpath.join(
+    COPRO_CUBE_DIR,
+    "Projects",
+    "STM32WB_Copro_Wireless_Binaries",
+    "STM32WB5x",
+)
+
+# Supported toolchain versions
+FBT_TOOLCHAIN_VERSIONS = (" 10.3.",)
+
+OPENOCD_OPTS = '-f interface/stlink.cfg -c "transport select hla_swd" -f debug/stm32wbx.cfg -c "stm32wbx.cpu configure -rtos auto" -c "init"'
+
+SVD_FILE = "debug/STM32WB55_CM4.svd"
+
+FIRMWARE_APPS = {
+    "default": (
+        "crypto_start",
+        # Svc
+        "basic_services",
+        # Apps
+        "basic_apps",
+        "updater_app",
+        "archive",
+        # Settings
+        "passport",
+        "system_settings",
+        "about",
+        # Plugins
+        "basic_plugins",
+        # Debug
+        "debug_apps",
+    ),
+    "unit_tests": (
+        "basic_services",
+        "unit_tests",
+    ),
+}
+
+FIRMWARE_APP_SET = "default"

+ 227 - 0
firmware.scons

@@ -0,0 +1,227 @@
+Import("ENV", "fw_build_meta")
+
+import os
+
+
+# Building initial C environment for libs
+env = ENV.Clone(
+    tools=["compilation_db", "fwbin", "openocd", "fbt_apps"],
+    COMPILATIONDB_USE_ABSPATH=True,
+    BUILD_DIR=fw_build_meta["build_dir"],
+    IS_BASE_FIRMWARE=fw_build_meta["type"] == "firmware",
+    FW_FLAVOR=fw_build_meta["flavor"],
+    PLUGIN_ELF_DIR="${BUILD_DIR}",
+    LIB_DIST_DIR="${BUILD_DIR}/lib",
+    LINT_SOURCES=[
+        "applications",
+    ],
+    LIBPATH=[
+        "${LIB_DIST_DIR}",
+    ],
+    CPPPATH=[
+        "#/core",
+        "#/applications",
+        "#/firmware/targets/f${TARGET_HW}/ble_glue",
+        "#/firmware/targets/f${TARGET_HW}/fatfs",
+        "#/firmware/targets/f${TARGET_HW}/furi_hal",
+        "#/firmware/targets/f${TARGET_HW}/Inc",
+        "#/firmware/targets/furi_hal_include",
+    ],
+    # Specific flags for building libraries - always do optimized builds
+    FW_LIB_OPTS={
+        "Default": {
+            "CCFLAGS": [
+                "-Os",
+            ],
+            "CPPDEFINES": [
+                "NDEBUG",
+                "FURI_NDEBUG",
+            ],
+            # You can add other entries named after libraries
+            # If they are present, they have precedence over Default
+        }
+    },
+)
+
+
+def ApplyLibFlags(env):
+    flags_to_apply = env["FW_LIB_OPTS"].get(
+        env.get("FW_LIB_NAME"),
+        env["FW_LIB_OPTS"]["Default"],
+    )
+    # print("Flags for ", env.get("FW_LIB_NAME", "Default"), flags_to_apply)
+    env.MergeFlags(flags_to_apply)
+
+
+env.AddMethod(ApplyLibFlags)
+
+Export("env")
+
+if not env["VERBOSE"]:
+    env.SetDefault(
+        HEXCOMSTR="\tHEX\t${TARGET}",
+        BINCOMSTR="\tBIN\t${TARGET}",
+        DFUCOMSTR="\tDFU\t${TARGET}",
+        OOCDCOMSTR="\tFLASH\t${SOURCE}",
+    )
+
+
+if fw_build_meta["type"] == "updater":
+    env.Append(
+        FIRMWARE_BUILD_CFG="updater",
+        RAM_EXEC=True,
+        CPPDEFINES=[
+            "FURI_RAM_EXEC",
+        ],
+    )
+else:
+    env.Append(
+        FIRMWARE_BUILD_CFG="firmware",
+        RAM_EXEC=False,
+    )
+# print(env.Dump())
+
+
+# Invoke child SCopscripts to populate global `env` + build their own part of the code
+lib_targets = env.BuildModules(
+    [
+        "lib",
+        "assets",
+        "firmware",
+        "core",
+    ],
+)
+
+
+# Now, env is fully set up with everything to build apps
+fwenv = env.Clone()
+
+# Set up additional app-specific build flags
+SConscript("site_scons/firmwareopts.scons", exports={"ENV": fwenv})
+
+# Set up app configuration
+if env["IS_BASE_FIRMWARE"]:
+    fwenv.Append(APPS=fwenv["FIRMWARE_APPS"].get(fwenv.subst("$FIRMWARE_APP_SET")))
+else:
+    fwenv.Append(APPS=["updater"])
+
+if extra_int_apps := GetOption("extra_int_apps"):
+    for extra_int_app in extra_int_apps.split(","):
+        fwenv.Append(APPS=[extra_int_app])
+
+fwenv.LoadApplicationManifests()
+fwenv.PrepareApplicationsBuild()
+
+# Build external apps
+extapps = SConscript("applications/extapps.scons", exports={"ENV": fwenv})
+
+
+# Add preprocessor definitions for current set of apps
+fwenv.AppendUnique(
+    CPPDEFINES=fwenv["APPBUILD"].get_apps_cdefs(),
+)
+
+
+# Build applications.c for selected services & apps
+
+# Depends on virtual value-only node, so it only gets rebuilt when set of apps changes
+apps_c = fwenv.ApplicationsC(
+    "applications/applications.c",
+    Value(fwenv["APPS"]),
+)
+
+sources = [apps_c]
+# Gather sources only from app folders from current configuration
+for app_folder in fwenv["APPBUILD"].get_builtin_app_folders():
+    sources += fwenv.GlobRecursive("*.c*", os.path.join("applications", app_folder))
+
+
+fwenv.AppendUnique(
+    LINKFLAGS=[
+        "-specs=nano.specs",
+        "-specs=nosys.specs",
+        "-Wl,--start-group",
+        "-lstdc++",
+        "-lsupc++",
+        "-Wl,--end-group",
+        "-Wl,--gc-sections",
+        "-Wl,--undefined=uxTopUsedPriority",
+        "-Wl,--wrap,_malloc_r",
+        "-Wl,--wrap,_free_r",
+        "-Wl,--wrap,_calloc_r",
+        "-Wl,--wrap,_realloc_r",
+        "-u",
+        "_printf_float",
+        "-n",
+    ],
+)
+
+# Debug
+# print(fwenv.Dump())
+
+# Full firmware definition
+
+fwelf = fwenv["FW_ELF"] = fwenv.Program(
+    "${FIRMWARE_BUILD_CFG}",
+    sources,
+    LIBS=[
+        "flipper${TARGET_HW}",
+        "core",
+        "freertos",
+        "stm32cubewb",
+        "hwdrivers",
+        "fatfs",
+        "littlefs",
+        "subghz",
+        "flipperformat",
+        "toolbox",
+        "microtar",
+        "usb_stm32",
+        "st25rfal002",
+        "infrared",
+        "appframe",
+        "assets",
+        "misc",
+        # 2nd round
+        "flipperformat",
+        "toolbox",
+    ],
+)
+
+# Make it depend on everything child builders returned
+Depends(fwelf, lib_targets)
+AddPostAction(fwelf, fwenv["APPBUILD_DUMP"])
+
+
+fwhex = fwenv["FW_HEX"] = fwenv.HEXBuilder("${FIRMWARE_BUILD_CFG}")
+fwbin = fwenv["FW_BIN"] = fwenv.BINBuilder("${FIRMWARE_BUILD_CFG}")
+fwdfu = fwenv["FW_DFU"] = fwenv.DFUBuilder("${FIRMWARE_BUILD_CFG}")
+# Default(dfu)
+Alias(fwenv["FIRMWARE_BUILD_CFG"] + "_dfu", fwdfu)
+
+fwdump = fwenv.ObjDump("${FIRMWARE_BUILD_CFG}")
+Alias(fwenv["FIRMWARE_BUILD_CFG"] + "_list", fwdump)
+
+# Additional FW-related pseudotargets
+flash = fwenv["FW_FLASH"] = fwenv.OOCDFlashCommand(
+    "${FIRMWARE_BUILD_CFG}",
+    OPENOCD_COMMAND='-c "program ${SOURCE.posix} reset exit ${IMAGE_BASE_ADDRESS}"',
+)
+if fwenv["FORCE"]:
+    AlwaysBuild(flash)
+Alias(fwenv["FIRMWARE_BUILD_CFG"] + "_flash", flash)
+if fwenv["IS_BASE_FIRMWARE"]:
+    Alias("flash", flash)
+
+
+# Compile DB generation
+fwcdb = fwenv["FW_CDB"] = fwenv.CompilationDatabase("compile_commands.json")
+Alias(fwenv["FIRMWARE_BUILD_CFG"] + "_cdb", fwcdb)
+
+
+artifacts = [fwhex, fwbin, fwdfu, env["FW_VERSION_JSON"]]
+fwenv["FW_ARTIFACTS"] = artifacts
+
+Alias(fwenv["FIRMWARE_BUILD_CFG"] + "_all", artifacts)
+
+Return("fwenv")

+ 0 - 27
firmware/Makefile

@@ -1,27 +0,0 @@
-MAKEFILE_DIR	:= $(dir $(abspath $(firstword $(MAKEFILE_LIST))))
-PROJECT_ROOT	:= $(abspath $(MAKEFILE_DIR)/..)
-
-include 		$(PROJECT_ROOT)/make/base.mk
-include 		$(PROJECT_ROOT)/make/freertos-heap.mk
-include			$(PROJECT_ROOT)/assets/assets.mk
-include			$(PROJECT_ROOT)/core/core.mk
-include 		$(PROJECT_ROOT)/applications/applications.mk
-include			$(PROJECT_ROOT)/lib/lib.mk
-
-CFLAGS			+= -I$(PROJECT_ROOT) -Itargets/furi_hal_include
-CFLAGS			+= -Werror -Wno-address-of-packed-member
-CPPFLAGS		+= -Werror
-
-include			$(PROJECT_ROOT)/make/defaults.mk
-TARGET_DIR		= targets/$(TARGET)
-include			$(TARGET_DIR)/target.mk
-
-ifeq ($(RAM_EXEC), 0)
-PROJECT			:= firmware
-else
-PROJECT			:= updater
-endif
-
-include			$(PROJECT_ROOT)/make/git.mk
-include			$(PROJECT_ROOT)/make/toolchain.mk
-include			$(PROJECT_ROOT)/make/rules.mk

+ 1 - 34
firmware/ReadMe.md

@@ -19,37 +19,4 @@ Target independent code and headers in `target/include` folders. More details in
 
 # Building
 
-## With dev docker image:
-
-`docker-compose exec dev make -C firmware`
-
-## With toolchain installed in path:
-
-`make -C firmware`
-
-## Build Options
-
-- `DEBUG` - 0/1 - enable or disable debug build. Default is 1.
-- `COMPACT` - 0/1 - enable or disable compiler optimizations. Significantly reduces binary size. Default is 0.
-- `TARGET` - string - target to build. Default is `f7`.
-- `RAM_EXEC` - 0/1 - whether to build full firmware or RAM-based stage for firmware update. 0 is default, builds firmware.
-
-# Building self-update package
-
-`make DEBUG=0 COMPACT=1 updater_package`
-
-# Flashing 
-
-Using SWD (STLink):
-
-`make -C firmware flash`
-
-Or use DFU (USB):
-
-`make -C firmware upload`
-
-# Debug
-
-Using SWD (STLink):
-
-`make -C firmware debug`
+Check out `documentation/fbt.md` on how to build and flash firmware.

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است