From b7220237de243894144e8bbc5728a9e198813d22 Mon Sep 17 00:00:00 2001 From: Willy-JL <49810075+Willy-JL@users.noreply.github.com> Date: Wed, 28 Feb 2024 01:22:45 +0000 Subject: [PATCH] Small bump in the road - Update assets and references for new project - Revert DFU image and CLI motd - Remove NSFW text and flag - Remove credits animation (will be replaced with a setting menu soon) - New EvilPortal example HTML and better error message - Initial standalone naming for asset packs and mainmenu apps - File migration fixes/improvements - Remove hotfix workflow --- .github/CODEOWNERS | 16 +- .github/FUNDING.yml | 15 +- .github/assets/badkb.png | Bin 0 -> 4761 bytes .github/assets/logo.png | Bin 0 -> 142475 bytes .github/assets/packs-done.png | Bin 0 -> 2649 bytes .github/assets/packs-folder.png | Bin 0 -> 6307 bytes .github/assets/packs-select.png | Bin 0 -> 1897 bytes .github/assets/settings.png | Bin 0 -> 1816 bytes .github/workflow_data/devbuild.py | 23 +- .github/workflow_data/hotfix.py | 88 ------- .github/workflow_data/release.md | 40 +-- .github/workflow_data/version.sh | 4 +- .github/workflow_data/webupdater.py | 10 +- .github/workflows/hotfix.yml | 73 ------ .github/workflows/webhook.yml | 1 - .gitmodules | 2 +- ReadMe.md | 142 +++++------ .../drivers/subghz/cc1101_ext/cc1101_ext.c | 10 +- .../drivers/subghz/cc1101_ext/cc1101_ext.h | 2 +- applications/external | 2 +- applications/main/application.fam | 2 +- .../main/archive/helpers/archive_browser.c | 4 +- .../main/archive/helpers/archive_favorites.h | 5 +- .../main/archive/helpers/archive_files.h | 4 +- .../main/archive/helpers/favorite_timeout.c | 4 +- .../archive/scenes/archive_scene_search.c | 2 +- applications/main/bad_kb/bad_kb_app.c | 16 +- .../bad_kb/resources/badkb/demo_android.txt | 2 +- .../main/bad_kb/resources/badkb/demo_ios.txt | 2 +- .../main/bad_kb/scenes/bad_kb_scene_config.c | 2 +- .../bad_kb/scenes/bad_kb_scene_file_select.c | 2 +- applications/main/bad_kb/views/bad_kb_view.c | 23 +- .../main/lfrfid/scenes/lfrfid_scene_emulate.c | 5 +- .../application.fam | 8 +- .../{xtreme_app => momentum_app}/icon.png | Bin .../momentum_app.c} | 95 +++---- .../momentum_app.h} | 28 +-- .../momentum_app/scenes/momentum_app_scene.c | 30 +++ .../scenes/momentum_app_scene.h} | 16 +- .../scenes/momentum_app_scene_config.h | 21 ++ .../scenes/momentum_app_scene_interface.c | 90 +++++++ ...momentum_app_scene_interface_filebrowser.c | 124 ++++++++++ .../momentum_app_scene_interface_graphics.c} | 91 +++---- .../momentum_app_scene_interface_lockscreen.c | 234 ++++++++++++++++++ .../momentum_app_scene_interface_mainmenu.c} | 54 ++-- ...mentum_app_scene_interface_mainmenu_add.c} | 28 +-- ...m_app_scene_interface_mainmenu_add_main.c} | 26 +- ...ntum_app_scene_interface_mainmenu_reset.c} | 26 +- .../momentum_app_scene_interface_statusbar.c | 147 +++++++++++ .../scenes/momentum_app_scene_misc.c} | 58 ++--- .../scenes/momentum_app_scene_misc_dolphin.c} | 49 ++-- .../scenes/momentum_app_scene_misc_rename.c} | 26 +- .../scenes/momentum_app_scene_misc_screen.c} | 122 ++++----- .../momentum_app_scene_misc_screen_color.c} | 26 +- .../scenes/momentum_app_scene_protocols.c | 124 ++++++++++ .../momentum_app_scene_protocols_freqs.c} | 40 +-- .../momentum_app_scene_protocols_freqs_add.c} | 32 +-- ...mentum_app_scene_protocols_freqs_hopper.c} | 38 +-- ...mentum_app_scene_protocols_freqs_static.c} | 38 +-- .../momentum_app_scene_protocols_gpio.c | 158 ++++++++++++ .../scenes/momentum_app_scene_start.c} | 38 +-- .../main/nfc/scenes/nfc_scene_emulate.c | 5 +- applications/main/subghz/helpers/subghz_gps.h | 4 +- .../subghz/resources/subghz/assets/README.md | 4 +- .../subghz/scenes/subghz_scene_transmitter.c | 4 +- applications/main/subghz/subghz.c | 4 +- .../main/u2f/scenes/u2f_scene_error.c | 2 +- applications/main/u2f/u2f_data.h | 2 - applications/main/u2f/views/u2f_view.c | 54 +--- .../main/xtreme_app/scenes/xtreme_app_scene.c | 30 --- .../scenes/xtreme_app_scene_config.h | 21 -- .../scenes/xtreme_app_scene_interface.c | 86 ------- .../xtreme_app_scene_interface_filebrowser.c | 122 --------- .../xtreme_app_scene_interface_lockscreen.c | 230 ----------------- .../xtreme_app_scene_interface_statusbar.c | 147 ----------- .../scenes/xtreme_app_scene_protocols.c | 123 --------- .../scenes/xtreme_app_scene_protocols_gpio.c | 152 ------------ applications/services/bt/bt_service/bt.h | 17 +- applications/services/bt/bt_service/bt_i.h | 1 - applications/services/bt/bt_settings.h | 1 - applications/services/cli/cli.c | 32 ++- applications/services/cli/cli_commands.c | 2 +- .../desktop/animations/animation_manager.c | 21 +- .../desktop/animations/animation_storage.c | 10 +- applications/services/desktop/desktop.c | 10 +- .../services/desktop/desktop_settings.h | 2 - .../desktop/scenes/desktop_scene_fault.c | 26 +- .../desktop/scenes/desktop_scene_lock_menu.c | 12 +- .../desktop/scenes/desktop_scene_locked.c | 4 +- .../desktop/scenes/desktop_scene_pin_input.c | 4 +- .../services/desktop/views/desktop_events.h | 2 +- .../desktop/views/desktop_view_lock_menu.c | 18 +- .../desktop/views/desktop_view_lock_menu.h | 2 +- .../desktop/views/desktop_view_locked.c | 14 +- applications/services/dolphin/dolphin.c | 4 +- .../services/dolphin/helpers/dolphin_state.h | 1 - .../expansion/expansion_settings_filename.h | 1 - applications/services/gui/canvas.c | 14 +- applications/services/gui/gui.c | 20 +- .../services/gui/modules/file_browser.c | 4 +- applications/services/gui/modules/menu.c | 14 +- applications/services/loader/loader.c | 19 +- .../services/notification/notification_app.h | 1 - .../services/power/power_service/power.c | 8 +- applications/services/power/power_settings.h | 1 - applications/services/rpc/rpc.c | 5 +- applications/settings/about/about.c | 2 +- ...ktop_settings_scene_keybinds_action_type.c | 4 +- .../settings/dolphin_passport/passport.c | 31 +-- .../scenes/power_settings_scene_power_off.c | 11 +- .../updater/util/update_task_worker_backup.c | 9 +- .../system/updater/views/updater_main.c | 6 +- .../dolphin/external/Credits_128x64/meta.txt | 14 -- assets/dolphin/external/manifest.txt | 7 - assets/icons/Common/DFU_128x50.png | Bin 4599 -> 3177 bytes .../ControlCenter/CC_Momentum_16x16.png} | Bin 4964 -> 4616 bytes .../icons/ControlCenter/CC_Xtreme_16x16.png | Bin 631 -> 0 bytes .../MainMenu/Momentum_14/frame_01.png} | Bin 5034 -> 4614 bytes .../MainMenu/Momentum_14/frame_02.png} | Bin 5047 -> 4614 bytes .../icons/MainMenu/Momentum_14/frame_03.png | Bin 0 -> 4614 bytes .../icons/MainMenu/Momentum_14/frame_04.png | Bin 0 -> 4614 bytes .../MainMenu/Momentum_14/frame_05.png} | Bin 5110 -> 4570 bytes .../icons/MainMenu/Momentum_14/frame_06.png | Bin 0 -> 4614 bytes .../icons/MainMenu/Momentum_14/frame_07.png | Bin 0 -> 4570 bytes .../icons/MainMenu/Momentum_14/frame_08.png | Bin 0 -> 4570 bytes .../icons/MainMenu/Momentum_14/frame_09.png | Bin 0 -> 4599 bytes .../icons/MainMenu/Momentum_14/frame_10.png | Bin 0 -> 4607 bytes .../icons/MainMenu/Momentum_14/frame_11.png | Bin 0 -> 4614 bytes .../{Xtreme_14 => Momentum_14}/frame_rate | 0 assets/icons/MainMenu/Xtreme_14/frame_01.png | Bin 9296 -> 0 bytes assets/icons/MainMenu/Xtreme_14/frame_02.png | Bin 9296 -> 0 bytes assets/icons/MainMenu/Xtreme_14/frame_03.png | Bin 9034 -> 0 bytes assets/icons/MainMenu/Xtreme_14/frame_04.png | Bin 5701 -> 0 bytes assets/icons/MainMenu/Xtreme_14/frame_05.png | Bin 6982 -> 0 bytes assets/icons/MainMenu/Xtreme_14/frame_06.png | Bin 6911 -> 0 bytes assets/icons/MainMenu/Xtreme_14/frame_07.png | Bin 7733 -> 0 bytes assets/icons/MainMenu/Xtreme_14/frame_08.png | Bin 8435 -> 0 bytes assets/icons/MainMenu/Xtreme_14/frame_09.png | Bin 8881 -> 0 bytes assets/icons/MainMenu/Xtreme_14/frame_10.png | Bin 9296 -> 0 bytes assets/icons/Update/Updating_32x40.png | Bin 4492 -> 3704 bytes .../Update/Updating_Logo_62x15.png} | Bin 5112 -> 4682 bytes assets/slideshow/firstboot/frame_00.png | Bin 0 -> 5888 bytes .../{xfwfirstboot => firstboot}/frame_01.png | Bin .../{xfwfirstboot => firstboot}/frame_02.png | Bin .../{xfwfirstboot => firstboot}/frame_03.png | Bin .../firstboot/frame_04.png} | Bin 5138 -> 5180 bytes .../{xfwfirstboot => firstboot}/frame_05.png | Bin 5113 -> 5288 bytes .../{xfwfirstboot => firstboot}/frame_06.png | Bin 5311 -> 5629 bytes assets/slideshow/update_default/frame_00.png | Bin 1044 -> 4995 bytes assets/slideshow/xfwfirstboot/frame_00.png | Bin 6224 -> 0 bytes assets/slideshow/xfwfirstboot/frame_04.png | Bin 923 -> 0 bytes fbt_options.py | 5 +- furi/flipper.c | 77 +++--- lib/SConscript | 2 +- lib/{xtreme => momentum}/SConscript | 4 +- lib/{xtreme => momentum}/assets.c | 40 ++- lib/{xtreme/xtreme.h => momentum/momentum.h} | 30 +-- lib/{xtreme => momentum}/namespoof.c | 0 lib/{xtreme => momentum}/namespoof.h | 0 lib/{xtreme => momentum}/settings.c | 68 +++-- lib/toolbox/name_generator.c | 10 +- scripts/update.py | 8 +- sonar-project.properties | 6 +- targets/f7/api_symbols.csv | 19 +- targets/f7/furi_hal/furi_hal_light.c | 4 +- targets/f7/target.json | 4 +- targets/furi_hal_include/furi_hal_usb_hid.h | 2 +- 167 files changed, 1795 insertions(+), 2096 deletions(-) create mode 100644 .github/assets/badkb.png create mode 100644 .github/assets/logo.png create mode 100644 .github/assets/packs-done.png create mode 100644 .github/assets/packs-folder.png create mode 100644 .github/assets/packs-select.png create mode 100644 .github/assets/settings.png delete mode 100644 .github/workflow_data/hotfix.py delete mode 100644 .github/workflows/hotfix.yml rename applications/main/{xtreme_app => momentum_app}/application.fam (61%) rename applications/main/{xtreme_app => momentum_app}/icon.png (100%) rename applications/main/{xtreme_app/xtreme_app.c => momentum_app/momentum_app.c} (78%) rename applications/main/{xtreme_app/xtreme_app.h => momentum_app/momentum_app.h} (82%) create mode 100644 applications/main/momentum_app/scenes/momentum_app_scene.c rename applications/main/{xtreme_app/scenes/xtreme_app_scene.h => momentum_app/scenes/momentum_app_scene.h} (65%) create mode 100644 applications/main/momentum_app/scenes/momentum_app_scene_config.h create mode 100644 applications/main/momentum_app/scenes/momentum_app_scene_interface.c create mode 100644 applications/main/momentum_app/scenes/momentum_app_scene_interface_filebrowser.c rename applications/main/{xtreme_app/scenes/xtreme_app_scene_interface_graphics.c => momentum_app/scenes/momentum_app_scene_interface_graphics.c} (53%) create mode 100644 applications/main/momentum_app/scenes/momentum_app_scene_interface_lockscreen.c rename applications/main/{xtreme_app/scenes/xtreme_app_scene_interface_mainmenu.c => momentum_app/scenes/momentum_app_scene_interface_mainmenu.c} (74%) rename applications/main/{xtreme_app/scenes/xtreme_app_scene_interface_mainmenu_add.c => momentum_app/scenes/momentum_app_scene_interface_mainmenu_add.c} (73%) rename applications/main/{xtreme_app/scenes/xtreme_app_scene_interface_mainmenu_add_main.c => momentum_app/scenes/momentum_app_scene_interface_mainmenu_add_main.c} (57%) rename applications/main/{xtreme_app/scenes/xtreme_app_scene_interface_mainmenu_reset.c => momentum_app/scenes/momentum_app_scene_interface_mainmenu_reset.c} (64%) create mode 100644 applications/main/momentum_app/scenes/momentum_app_scene_interface_statusbar.c rename applications/main/{xtreme_app/scenes/xtreme_app_scene_misc.c => momentum_app/scenes/momentum_app_scene_misc.c} (54%) rename applications/main/{xtreme_app/scenes/xtreme_app_scene_misc_dolphin.c => momentum_app/scenes/momentum_app_scene_misc_dolphin.c} (62%) rename applications/main/{xtreme_app/scenes/xtreme_app_scene_misc_rename.c => momentum_app/scenes/momentum_app_scene_misc_rename.c} (60%) rename applications/main/{xtreme_app/scenes/xtreme_app_scene_misc_screen.c => momentum_app/scenes/momentum_app_scene_misc_screen.c} (68%) rename applications/main/{xtreme_app/scenes/xtreme_app_scene_misc_screen_color.c => momentum_app/scenes/momentum_app_scene_misc_screen_color.c} (59%) create mode 100644 applications/main/momentum_app/scenes/momentum_app_scene_protocols.c rename applications/main/{xtreme_app/scenes/xtreme_app_scene_protocols_freqs.c => momentum_app/scenes/momentum_app_scene_protocols_freqs.c} (54%) rename applications/main/{xtreme_app/scenes/xtreme_app_scene_protocols_freqs_add.c => momentum_app/scenes/momentum_app_scene_protocols_freqs_add.c} (67%) rename applications/main/{xtreme_app/scenes/xtreme_app_scene_protocols_freqs_hopper.c => momentum_app/scenes/momentum_app_scene_protocols_freqs_hopper.c} (74%) rename applications/main/{xtreme_app/scenes/xtreme_app_scene_protocols_freqs_static.c => momentum_app/scenes/momentum_app_scene_protocols_freqs_static.c} (74%) create mode 100644 applications/main/momentum_app/scenes/momentum_app_scene_protocols_gpio.c rename applications/main/{xtreme_app/scenes/xtreme_app_scene_start.c => momentum_app/scenes/momentum_app_scene_start.c} (51%) delete mode 100644 applications/main/xtreme_app/scenes/xtreme_app_scene.c delete mode 100644 applications/main/xtreme_app/scenes/xtreme_app_scene_config.h delete mode 100644 applications/main/xtreme_app/scenes/xtreme_app_scene_interface.c delete mode 100644 applications/main/xtreme_app/scenes/xtreme_app_scene_interface_filebrowser.c delete mode 100644 applications/main/xtreme_app/scenes/xtreme_app_scene_interface_lockscreen.c delete mode 100644 applications/main/xtreme_app/scenes/xtreme_app_scene_interface_statusbar.c delete mode 100644 applications/main/xtreme_app/scenes/xtreme_app_scene_protocols.c delete mode 100644 applications/main/xtreme_app/scenes/xtreme_app_scene_protocols_gpio.c delete mode 100644 assets/dolphin/external/Credits_128x64/meta.txt rename assets/{dolphin/external/Credits_128x64/frame_3.png => icons/ControlCenter/CC_Momentum_16x16.png} (58%) delete mode 100644 assets/icons/ControlCenter/CC_Xtreme_16x16.png rename assets/{dolphin/external/Credits_128x64/frame_0.png => icons/MainMenu/Momentum_14/frame_01.png} (57%) rename assets/{dolphin/external/Credits_128x64/frame_2.png => icons/MainMenu/Momentum_14/frame_02.png} (57%) create mode 100644 assets/icons/MainMenu/Momentum_14/frame_03.png create mode 100644 assets/icons/MainMenu/Momentum_14/frame_04.png rename assets/{dolphin/external/Credits_128x64/frame_5.png => icons/MainMenu/Momentum_14/frame_05.png} (56%) create mode 100644 assets/icons/MainMenu/Momentum_14/frame_06.png create mode 100644 assets/icons/MainMenu/Momentum_14/frame_07.png create mode 100644 assets/icons/MainMenu/Momentum_14/frame_08.png create mode 100644 assets/icons/MainMenu/Momentum_14/frame_09.png create mode 100644 assets/icons/MainMenu/Momentum_14/frame_10.png create mode 100644 assets/icons/MainMenu/Momentum_14/frame_11.png rename assets/icons/MainMenu/{Xtreme_14 => Momentum_14}/frame_rate (100%) delete mode 100644 assets/icons/MainMenu/Xtreme_14/frame_01.png delete mode 100644 assets/icons/MainMenu/Xtreme_14/frame_02.png delete mode 100644 assets/icons/MainMenu/Xtreme_14/frame_03.png delete mode 100644 assets/icons/MainMenu/Xtreme_14/frame_04.png delete mode 100644 assets/icons/MainMenu/Xtreme_14/frame_05.png delete mode 100644 assets/icons/MainMenu/Xtreme_14/frame_06.png delete mode 100644 assets/icons/MainMenu/Xtreme_14/frame_07.png delete mode 100644 assets/icons/MainMenu/Xtreme_14/frame_08.png delete mode 100644 assets/icons/MainMenu/Xtreme_14/frame_09.png delete mode 100644 assets/icons/MainMenu/Xtreme_14/frame_10.png rename assets/{dolphin/external/Credits_128x64/frame_4.png => icons/Update/Updating_Logo_62x15.png} (56%) create mode 100644 assets/slideshow/firstboot/frame_00.png rename assets/slideshow/{xfwfirstboot => firstboot}/frame_01.png (100%) rename assets/slideshow/{xfwfirstboot => firstboot}/frame_02.png (100%) rename assets/slideshow/{xfwfirstboot => firstboot}/frame_03.png (100%) rename assets/{dolphin/external/Credits_128x64/frame_1.png => slideshow/firstboot/frame_04.png} (55%) rename assets/slideshow/{xfwfirstboot => firstboot}/frame_05.png (59%) rename assets/slideshow/{xfwfirstboot => firstboot}/frame_06.png (60%) delete mode 100644 assets/slideshow/xfwfirstboot/frame_00.png delete mode 100644 assets/slideshow/xfwfirstboot/frame_04.png rename lib/{xtreme => momentum}/SConscript (81%) rename lib/{xtreme => momentum}/assets.c (86%) rename lib/{xtreme/xtreme.h => momentum/momentum.h} (76%) rename lib/{xtreme => momentum}/namespoof.c (100%) rename lib/{xtreme => momentum}/namespoof.h (100%) rename lib/{xtreme => momentum}/settings.c (79%) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 1b076ebc1..a1626c2cd 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,15 +1 @@ -# Lines starting with '#' are comments. -# Each line is a file pattern followed by one or more owners. - -# More details are here: https://help.github.com/articles/about-codeowners/ - -# The '*' pattern is global owners. - -# Order is important. The last matching pattern has the most precedence. -# The folders are ordered as follows: - -# In each subsection folders are ordered first by depth, then alphabetically. -# This should make it easy to add new rules without breaking existing ones. - -# Global rule: -* @ClaraCrazy +* @Willy-JL @Sil333033 diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index b70b073d7..a9c2e81cc 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,13 +1,2 @@ -# These are supported funding model platforms - -github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] -patreon: crazyco -open_collective: # Replace with a single Open Collective username -ko_fi: # Replace with a single Ko-fi username -tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel -community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry -liberapay: # Replace with a single Liberapay username -issuehunt: # Replace with a single IssueHunt username -otechie: # Replace with a single Otechie username -lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry -custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] +ko_fi: willyjl +custom: ["https://bunq.me/WillyJL", "https://paypal.me/willyjl1"] diff --git a/.github/assets/badkb.png b/.github/assets/badkb.png new file mode 100644 index 0000000000000000000000000000000000000000..dd2e081310457d46139c0faa87b6c56817aa873b GIT binary patch literal 4761 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öR!&HQz#Risooe8$lD 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

xv$63Z##ZW1c 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 literal 0 HcmV?d00001 diff --git a/.github/assets/packs-folder.png b/.github/assets/packs-folder.png new file mode 100644 index 0000000000000000000000000000000000000000..13ba6a94a0f8e71b672babdd95a8535b713f4a5f GIT binary patch literal 6307 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 LRgg_PBp`yW1b!kLP(lzu))!{k%NS zxrBJK_dNf3008gp+ctj!fCuy!0lZvG+<0O*w9Nf#TOu6*pI=-*#1CtHmI8oUx_$G; zeR-v?`u7x$-t?XGOuaid$}i=;OQzHfd)ONn&hxBu;Iu5Nk$Y9v%);@c+-MOr6H zDxR9Q5vLuI=-WsRaxUN`cz~cz(KzvB=2p-|qZqq=K+t6XyjB1Z>u72Qz}dK;D8&G< z3j)4<;NJJ|msW!|CF1yynZG-srXc$_g0^d-n{gE%_9nxTyx+mYaXQ?HPpPB=VSNe^QD6}7k38Q&ho)p$B zAsQ8KxA$93W%dEVOFpx($IQxA8p!IL9nIr8!JQ7~>*{tv?@7be-3p9+s);exe$lvm z{R{)HNg8gTY9~+pUh;6TnDMZfcB;`(JJq3&EEqQz=*5*`}_gzo*m$k?`(brS?&B9dbqw7wyD#?4lK5Y{Ud1+@ZZq>v*3s}xp*@dt)fT{eeA zgiQl+me8%=ks?rw6?d|A6C2_ZnZOyAZ$IifS*kbi<=4gy8sphk`BnN;-+vg@Ra|inH5N^|P(_sCtI0ssh_1HYH zev}>7=S(E6fN+?N?s4x~KucygO=bBlo#-XJbAAMys^?lq>DXi>3XrzE zMYDp#r?X=N7L*@>QDy-kMge7Iu}e`1+5QhoS%E+*`#&{Fbp;^6Z5OCu1PY90K|)t~ zxqXf2wB5}-0V+q`CUB*lizOxATH8#iXV)EP_dcMvB-x`0hGYHHH&pb#EO{_*_Nd%^ z-)BejYXzIUolOjR`%Ye#Z2ASg@CHSeF^nfWF675oy>DC6EQ-UuWVBg_Ken&?!sZ_b z^Y)0!h&)I!Qz>Lx*SZ5%xg2Md?*wP1O0-wBlNN(a%ji zheE}Nsu!^(@MF0~Pb?$$;{2eCFxsMjLIG(E40ag{aSHRfRiEpD9NPf%)lBTQx$u%pI1I@3163{oHqVgvtYlI)gbjaf1Sq@Mm z?>{NDGl#kMn=c!*4I?p4m)ImCjHAp%^uU?)RKmRE q^gV&S$0tI9{wq;n!Bf})4)6B0Li?6oA}93i1lza7Z?1_weCjXU=E~&& literal 0 HcmV?d00001 diff --git a/.github/assets/settings.png b/.github/assets/settings.png new file mode 100644 index 0000000000000000000000000000000000000000..bd72696f7d6c04225bb456275d2db25ac44afbd2 GIT binary patch literal 1816 zcmb_dYfuwc6h0w5BpSjLY!ye;QY#(CDO#gI%0o-VR|9mcV!-&KlYx}cijf!^*;;EY zEtC4FMyrV96M>~RiHI~LY8#Xw+iDVOBqS0w%95l~V}J;BGlpTAYX7u9cJA(+bMCp{ zYq)1p;{03pA4AIkSJA(H?Cn-{0f zUoJdiH);2@&kYaAs9SnBIw|08Z@8p+?8e=Dr%|qaHPso>j7&c5DcQyaBKv7?2D43AqYHIX-WdVO zETFH=HJ8gp?k=9*^RB)C+tTAa|Mbw2kF;E6dK)dulWLm#AlpGx+ll7U6bQ}lJ44r=KH;jq z`tgz9@U?*ux&)qs;(FMYGj9L(Qy)tX8Xw1?vRh$IIs5)B?lz_IUD!=lc^DZ!mdAVx zG)yHc_i7x(efM&m{$0hFN5%DnO=feWnHd5R1HCqUKR&9xi3%1>Z=iAvTW-AAAphK2 zCs!hBP05o5&%cw*aKE37;tX#eMBm>x|9m%7^Ol0S! zyQSrU7r(hQl+X_lJ?6QCbX5k(7of&jRf=zU_u3C!8VbfJoZe;V2?iiLeAZJzu~sxA7LsoTLCSoe zgPsuMLCzrhaM@D;0tmZ$U3N1FLYqmOKB9s!UJMXE>{8AYwL+uoln;KvDeHdJ(O*ch zwv33Y+nawd)YFFB5W}!&vdS&(5DmBpNvzjq6&=k!p=rKe9n^A)#F**AYoW<^`r36_@rST` zIb^~=Ev8IwsB+{bB4NGVHDsC-x6>R*i;3VWgAl=c zm3T!sPR40<`}tYg$QcA!a>o87Ko0)T%%{|7=HLl3l%XympM~JuOH*%zphP$i{|tXf zg^H;@O_myfGq_!Ke`t+D7sR)E`4AaXz1xXt~d;D4uBr@9x| VV<;3O6Nz6PEPkJziY{2Y<8NurvT^_b literal 0 HcmV?d00001 diff --git a/.github/workflow_data/devbuild.py b/.github/workflow_data/devbuild.py index 3a2d8facc..2f00e8a87 100644 --- a/.github/workflow_data/devbuild.py +++ b/.github/workflow_data/devbuild.py @@ -5,26 +5,21 @@ import requests import json import os -dev_share = os.environ["NC_HOST"] + "s/sGHsQB94a9x5CRs/download?path=/&files={files}" +dev_share_id = "" +dev_share = os.environ["NC_HOST"] + f"s/{dev_share_id}/download?path=/&files={{files}}" if __name__ == "__main__": with open(os.environ["GITHUB_EVENT_PATH"], "r") as f: event = json.load(f) client = nextcloud_client.Client(os.environ["NC_HOST"]) - _session = requests.session - def session(*args, **kwargs): - s = _session(*args, **kwargs) - s.headers["User-Agent"] = os.environ["NC_USERAGENT"] - return s - requests.session = session client.login(os.environ["NC_USER"], os.environ["NC_PASS"]) for file in ( os.environ["ARTIFACT_TGZ"], os.environ["ARTIFACT_SDK"], ): - path = f"XFW-Dev/{file}" + path = f"MNTM-Dev/{file}" # try: # client.delete(path) # except Exception: @@ -38,7 +33,7 @@ if __name__ == "__main__": "content": None, "embeds": [ { - "title": "Devbuild infos:", + "title": "New Devbuild:", "description": "", "url": "", "color": 16734443, @@ -58,12 +53,12 @@ if __name__ == "__main__": ], "author": { "name": "Build Succeeded!", - "icon_url": "https://cdn.discordapp.com/emojis/1080005692485795930.png" - }, - "footer": { - "text": "Build go brrrr", - "icon_url": "https://cdn.discordapp.com/emojis/1059798228725403719.png" + # "icon_url": "" }, + # "footer": { + # "text": "Build go brrrr", + # "icon_url": "" + # }, "timestamp": dt.datetime.utcnow().isoformat() } ], diff --git a/.github/workflow_data/hotfix.py b/.github/workflow_data/hotfix.py deleted file mode 100644 index 91a60868f..000000000 --- a/.github/workflow_data/hotfix.py +++ /dev/null @@ -1,88 +0,0 @@ -#!/usr/bin/env python -import datetime as dt -import requests -import pathlib -import json -import sys -import os -import re - -if __name__ == "__main__": - with open(os.environ["GITHUB_EVENT_PATH"], "r") as f: - event = json.load(f) - - release = requests.get( - event["repository"]["releases_url"].rsplit("{/")[0] + "/latest", - headers={ - "Accept": "application/vnd.github.v3+json", - "Authorization": f"token {os.environ['GITHUB_TOKEN']}" - } - ).json() - - artifacts = { - os.environ['ARTIFACT_TGZ']: "application/gzip", - os.environ['ARTIFACT_ZIP']: "application/zip", - os.environ['ARTIFACT_SDK']: "application/zip", - } - - for asset in release["assets"]: - req = requests.delete( - asset["url"], - headers={ - "Accept": "application/vnd.github.v3+json", - "Authorization": f"token {os.environ['GITHUB_TOKEN']}" - } - ) - if not req.ok: - print(f"{req.url = }\n{req.status_code = }\n{req.content = }") - sys.exit(1) - - for artifact, mediatype in artifacts.items(): - req = requests.post( - release["upload_url"].rsplit("{?", 1)[0], - headers={ - "Accept": "application/vnd.github.v3+json", - "Authorization": f"token {os.environ['GITHUB_TOKEN']}", - "Content-Type": mediatype - }, - params={ - "name": artifact - }, - data=pathlib.Path(artifact).read_bytes() - ) - if not req.ok: - print(f"{req.url = }\n{req.status_code = }\n{req.content = }") - sys.exit(1) - - hotfix_time = dt.datetime.now().strftime(r"%d-%m-%Y %H:%M") - hotfix_desc = event['pull_request']['body'] - hotfix = f"- `{hotfix_time}`: {hotfix_desc}\n" - - body = release["body"] - body = re.sub( - r"(https://github\.com/Flipper-XFW/Xtreme-Firmware/releases/download/[A-Za-z0-9_-]+?/)[A-Za-z0-9_-]+", - r"\1" + os.environ['VERSION_TAG'], - body - ) - body = body.replace("", "") - insert = body.find("\n [//]: \n") - body = body[:insert] + hotfix + body[insert:] - - req = requests.patch( - release["url"], - headers={ - "Accept": "application/vnd.github.v3+json", - "Authorization": f"token {os.environ['GITHUB_TOKEN']}" - }, - json={ - "body": body - } - ) - if not req.ok: - print(f"{req.url = }\n{req.status_code = }\n{req.content = }") - sys.exit(1) - - changelog = body.split("## 🚀 Changelog", 1)[1] - with open(os.environ["ARTIFACT_TGZ"].removesuffix(".tgz") + ".md", "w") as f: - f.write(changelog.strip() + "\n\n") diff --git a/.github/workflow_data/release.md b/.github/workflow_data/release.md index f3fdab973..f556bfb57 100644 --- a/.github/workflow_data/release.md +++ b/.github/workflow_data/release.md @@ -1,30 +1,32 @@ ## ⬇️ Download ->### [🖥️ Web Updater (chrome)](https://flipper-xtre.me/update) [recommended] +>### [🖥️ Web Updater (chrome)](https://momentum-fw.dev/update) [recommended] ->### [🐬 qFlipper Package (.tgz)](https://github.com/Flipper-XFW/Xtreme-Firmware/releases/download/{VERSION_TAG}/{ARTIFACT_TGZ}) +>### [🐬 qFlipper Package (.tgz)](https://github.com/Next-Flip/Momentum-Firmware/releases/download/{VERSION_TAG}/{ARTIFACT_TGZ}) ->### [📦 Zipped Archive (.zip)](https://github.com/Flipper-XFW/Xtreme-Firmware/releases/download/{VERSION_TAG}/{ARTIFACT_ZIP}) +>### [📦 Zipped Archive (.zip)](https://github.com/Next-Flip/Momentum-Firmware/releases/download/{VERSION_TAG}/{ARTIFACT_ZIP}) -**Check the [install guide](https://github.com/Flipper-XFW/Xtreme-Firmware#install) if you're not sure, or [join our Discord](https://discord.gg/flipper-xtreme) if you have questions or encounter issues!** +**Check the [install guide](https://github.com/Next-Flip/Momentum-Firmware#install) if you're not sure, or [join our Discord](https://discord.gg/momentum) if you have questions or encounter issues!** ## ❤️ Support -If you like what you're seeing, **please consider donating to us**. We won't ever put this behind a paywall, but we'd still appreciate a few bucks! +If you enjoy the firmware, please consider donating to the team, or sharing it with others! :D -- **[Patreon](https://patreon.com/CynthiaLabs)**: ❤️ Account needed, subscription with perks across my entire org. -- **[Wire-transfer](https://bunq.me/ClaraK)**: No account needed, one-time -- **[Paypal](https://paypal.me/RdX2020)**: Account needed, one-time -- **[ko-fi](https://ko-fi.com/cynthialabs)**: No account needed, one-time -- **Monero**: `41kyWeeoVdK4quzQ4M9ikVGs6tCQCLfdx8jLExTNsAu2SF1QAyDqRdjfGM6EL8L9NpXwt89HJeAoGf1aoArk7nDr4AMMV4T` +> **[Ko-fi](https://ko-fi.com/willyjl)**: One-off or Recurring, No signup required -**Thanks for all your support <3** +> **[Bank transfer](https://bunq.me/WillyJL)**: One-off, No signup required + +> **[PayPal](https://paypal.me/willyjl1)**: One-off, Signup required + +> **BCH**: `1EnCi1HF8Jw6m2dWSUwHLbCRbVBCQSyDKm` + +> **ETH**: `0x90b8284c3eba44108427e3148ff8efa0ae7a61a8` + +> **BTC**: `1EnCi1HF8Jw6m2dWSUwHLbCRbVBCQSyDKm` + +> **SHIB**: `0x90b8284c3eba44108427e3148ff8efa0ae7a61a8` + +> **DOGE**: `DNUdUqtmWaAiJ6yoV6hRNEh6Nn1Tg4Aorr` + +**Thank you <3** ## 🚀 Changelog {CHANGELOG} - - diff --git a/.github/workflow_data/version.sh b/.github/workflow_data/version.sh index 7803bd3e9..2e98c4b04 100644 --- a/.github/workflow_data/version.sh +++ b/.github/workflow_data/version.sh @@ -6,8 +6,8 @@ import json import os with open(os.environ["GITHUB_EVENT_PATH"], "r") as f: event = json.load(f) -version = int(event["pull_request"]["title"].removeprefix("V").removesuffix(" Release").removesuffix(" Hotfix")) +version = int(event["pull_request"]["title"].removeprefix("V").removesuffix(" Release") date = dt.datetime.now().strftime("%d%m%Y") -print(f"XFW-{version:04}_{date}", end="") +print(f"MNTM-{version:03}_{date}", end="") ''')" echo "VERSION_TAG=${VERSION_TAG}" >> $GITHUB_ENV diff --git a/.github/workflow_data/webupdater.py b/.github/workflow_data/webupdater.py index e9a861aaa..b30fc17fe 100644 --- a/.github/workflow_data/webupdater.py +++ b/.github/workflow_data/webupdater.py @@ -5,16 +5,10 @@ import os if __name__ == "__main__": client = nextcloud_client.Client(os.environ["NC_HOST"]) - _session = requests.session - def session(*args, **kwargs): - s = _session(*args, **kwargs) - s.headers["User-Agent"] = os.environ["NC_USERAGENT"] - return s - requests.session = session client.login(os.environ["NC_USER"], os.environ["NC_PASS"]) file = os.environ["ARTIFACT_TGZ"] - path = f"XFW-Updater/{file}" + path = f"MNTM-Release/{file}" try: client.delete(path) except Exception: @@ -34,7 +28,7 @@ if __name__ == "__main__": os.environ['ARTIFACT_TGZ'], os.environ['ARTIFACT_TGZ'].removesuffix(".tgz") + ".md" ) - for file in client.list("XFW-Updater"): + for file in client.list("MNTM-Release"): if file.name.startswith(version) and file.name not in files: try: client.delete(file.path) diff --git a/.github/workflows/hotfix.yml b/.github/workflows/hotfix.yml deleted file mode 100644 index 2357afd4d..000000000 --- a/.github/workflows/hotfix.yml +++ /dev/null @@ -1,73 +0,0 @@ -name: "Hotfix" - -on: - pull_request_review: - types: [submitted] - -env: - TARGETS: f7 - DEFAULT_TARGET: f7 - -jobs: - hotfix: - if: | - github.event.pull_request.head.repo.full_name == github.event.pull_request.base.repo.full_name && - endsWith(github.event.pull_request.title, ' Hotfix') && - github.event.review.author_association == 'OWNER' && - startsWith(github.event.pull_request.title, 'V') && - github.event.pull_request.base.ref == 'main' && - github.event.pull_request.head.ref == 'dev' && - github.event.pull_request.state == 'open' && - github.event.pull_request.draft == false && - github.event.review.state == 'APPROVED' - runs-on: ubuntu-latest - permissions: - contents: write - steps: - - - name: 'Checkout code' - uses: actions/checkout@v3 - with: - fetch-depth: 0 - ref: ${{ github.event.pull_request.head.sha }} - - - name: "Read version tag" - run: bash .github/workflow_data/version.sh - - - name: 'Build the firmware' - run: | - set -e - for TARGET in ${TARGETS}; do - TARGET_HW="$(echo "${TARGET}" | sed 's/f//')"; \ - ./fbt TARGET_HW=$TARGET_HW DIST_SUFFIX=$VERSION_TAG updater_package - done - - - name: "Check for uncommitted changes" - run: | - git diff --exit-code - - - name: "Make tgz, zip and sdk" - run: bash .github/workflow_data/package.sh - - - name: "Upload hotfix" - env: - GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" - run: | - python -m pip install requests - python .github/workflow_data/hotfix.py - - - name: "Upload to webupdater" - env: - NC_HOST: "https://cloud.cynthialabs.net/" - NC_USERAGENT: "${{ secrets.NC_USERAGENT }}" - NC_USER: "${{ secrets.NC_USER }}" - NC_PASS: "${{ secrets.NC_PASS }}" - run: | - python -m pip install pyncclient - python .github/workflow_data/webupdater.py - - - name: "Merge pull request" - uses: "pascalgn/automerge-action@v0.15.6" - env: - MERGE_LABELS: "" - GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" diff --git a/.github/workflows/webhook.yml b/.github/workflows/webhook.yml index 6ea140c62..1de0b1de2 100644 --- a/.github/workflows/webhook.yml +++ b/.github/workflows/webhook.yml @@ -13,7 +13,6 @@ on: workflow_run: workflows: - "Build" - - "Hotfix" - "Lint" - "Release" - "SonarCloud" diff --git a/.gitmodules b/.gitmodules index 0dd8d045e..642cd8979 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,6 @@ [submodule "applications/external"] path = applications/external - url = https://github.com/Flipper-XFW/Xtreme-Apps.git + url = https://github.com/Next-Flip/Momentum-Apps.git [submodule "lib/mlib"] path = lib/mlib url = https://github.com/P-p-H-d/mlib.git diff --git a/ReadMe.md b/ReadMe.md index c1ee8b816..6d64ebf9b 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -1,81 +1,68 @@ -

XFW - Xtreme Firmware for the Flipper Zero

-

- + Momentum Firmware +

for Flipper Zero

- Website | Intro | Install | Changelog | Wiki | Discord | Donate + Install | Features | Discord | Donate

-This firmware is an extensive overhaul of the [Official Firmware](https://github.com/flipperdevices/flipperzero-firmware), and also features most of the awesome code-bits from [Unleashed](https://github.com/DarkFlippers/unleashed-firmware). +This custom firmware is based on the [Official Firmware](https://github.com/flipperdevices/flipperzero-firmware), and features most of the awesome features from [Unleashed](https://github.com/DarkFlippers/unleashed-firmware). It is a direct continuation of the Xtreme firmware, built by the same (and only) developers who made that project special, until being unfairly thrown out. -----
-

What makes it special?

+

Modus Operandi:

-We have spent many hours perfecting this code even further, and getting the most out of it. - -The goal of this Firmware is to regularly bring out amazing updates based on what the community wants, with an actual understanding of whats going on. Fixing bugs that are regularly talked about, broadening the capabilities of the Flipper with new exciting functionality, and most importantly, ensuring the easiest user experience possible. +The goal of this firmware is to constantly push the bounds of what is possible with Flipper Zero, driving the innovation of many new groundbreaking features, while maintaining the easiest and most customizable user experience of any firmware. Fixing bugs promptly and ensuring a stable and compatible system is also of our utmost importance.

--

Feature-rich: We include all commonly found apps in the firmware, as long as they work.

+-

Feature-rich: We include all third-party features and apps as long as they fulfill a useful purpose and they work correctly, aswell as implement ourselves many new exciting functionalities.

--

Stable: Many hours have been spent rewriting core parts of the Flipper's firmware as well as some of its apps to ensure stability. A task that was long needed on all Firmware, so we tackled it right away.

+-

Stable: We ensure the most stable experience possible by having an actual understanding of what's going on, and proactively making all tweaks and additions backwards-, and inter-, compatible.

--

Customizable: Dont like the Animations, want to turn on/off the Home screen icons (battery, SD card etc), change the flippers name or anything like that? You absolutely can. No need to mess with code or deal with weird manifest files. Its all done with an App.

+-

Customizable: You can tweak just about everything you see: add/remove apps from the menu, change the animations, replace icon graphics, change your Flipper's name, change how the main menu looks, setup different keybinds like never before, and so much more. All on-device, with no complicated configuration.



-Note, the below mentioned changes are only a few things we did. For a full list check [down here](https://github.com/Flipper-XFW/Xtreme-Firmware#List-of-Changes) +Note that mentioned below are only a few of our staple additions to the firmware. For a full list check [down here](https://github.com/Next-Flip/Momentum-Firmware#List-of-Changes). -----
-

Xtreme Settings:

+

Momentum Settings:

-We wrote a powerful yet easy-to-use application specifically for our Firmware, that gives you easy-access to most of the fancy things we implemented: +We offer a powerful and easy-to-use application tailor-made for our firmware, that lets you configure everything you could dream of, and more: - - - + -- Interface: Customize every bit of your Flipper, from the desktop animations, to the main menu apps, lockscreen style etc. +- Interface: Tweak every part of your Flipper, from the desktop animations, to the main menu, lockscreen behavior, file browser, etc. -- Protocols: Here you can configure BadKB, manage custom Subghz frequencies, and setup the GPIO pins mappings. +- Protocols: Configure SubGhz settings, add/remove custom frequencies, and setup which GPIO pins are used by different external modules. -- Misc: All the other options that don't fit elsewhere. Change your Flipper's name, xp level, and configure the RGB backlight. +- Misc: Everything else that doesn't fit the previous categories. Change your Flipper's name, XP level, screen options, and configure the RGB backlight.
-----
-

Animations / Asset Packs: -

Want to try some asset packs? Check here -

- +

Animations / Asset Packs:

-We created our own improved Animation / Asset system that lets you create and cycle through your own `Asset Packs` with only a few button presses, allowing you to easily load custom Animations, Icons and Fonts like never before. +We created our own improved Animation / Asset system that lets you create and cycle through your own `Asset Packs` with only a few button presses, allowing you to easily load custom Animations, Icons and Fonts like never before. Think of it as a Theme system that's never been easier. - -You can easily create your own pack, or find some user made ones on our website or on discord. Check here for a tutorial on creating your own. Essentially, each Asset Pack can configure its own Anims, Icons & Fonts. + +You can easily create your own pack, or find some community-made ones on our website or on Discord. Check here for a tutorial on creating your own. Essentially, each Asset Pack can configure its own Anims, Icons & Fonts.

- -Once you have some packs, upload them to your Flipper in SD/asset_packs (if you did this right you should see SD/asset_packs/PackName/Anims and/or SD/asset_packs/PackName/Icons). + +Once you have some asset packs, upload them to your Flipper in SD/asset_packs (if you did this right you should see SD/asset_packs/PackName/Anims and/or SD/asset_packs/PackName/Icons). Alternatively, install directly using the website.

- -After installing the packs to Flipper, hit the Arrow UP button on the main menu and go to Xtreme Settings. Here choose which pack you want and tweak the other settings how you prefer, then press back to reboot and enjoy your newly fully customized Flipper! + +After installing the packs to Flipper, hit the Arrow Up button on the main menu and go to Momentum Settings > Interface > Graphics. Here choose which asset pack you want and tweak the other settings how you prefer, then exit the app to reboot and enjoy your fully customized Flipper!
@@ -83,45 +70,41 @@ After installing the packs to Flipper, hit the Arrow UP button on t

Bad Keyboard:

- - -BadUSB is a wonderful app, but it lacks bluetooth capabilities. Now some might argue that its useless as you will always need authentication from both sides, but what if I told you that we found a solution to this problem? -

-Bad-KB allows you to toggle between USB and Bluetooth mode for your attacks. In Bluetooth mode it allows you to spoof the name & MAC of the device to whatever you want. Being a JBL speaker or a wireless razer keyboard is easily doable, allowing you to trick people so you can run your payloads without needing a cable at hand. + +BadUSB is a great app, but it lacks Bluetooth connectivity. Bad-KB allows you to toggle between USB and Bluetooth mode for your attacks. ------ -
-

Levels:

+In Bluetooth mode it allows you to spoof the display name and MAC address of the device to whatever you want. Showing up as a portable speaker or a wireless keyboard is easily doable, allowing you to get the attention of your target without needing a cable at hand. -This Firmware has 30 levels, not just the basic 3 the official one has. - -With this new system in place, it allows for some cool stuff like locking animations behind a certain level. This can be done fairly easy: The idle_animations are tied to the level system. Specifically, the `Min level` variable of your manifest file is used here. Each level you reach, unlocks a new animation. The higher your level, the more animations people can see. +In USB mode it also enables additional functionality to spoof the manufacturer and product names, as well as vendor and product IDs (VID/PID). -----

List of changes:

-There are too many to name them all, this is a **non-comprehensive** list of the **most notable from an end-user perspective**. For a more detailed list, read through the [**changelogs**](https://github.com/Flipper-XFW/Xtreme-Firmware/releases) and commits/code. Also, you can find a **feature comparison with other firmwares** on [our website](https://flipper-xtre.me/#features). +There are too many to name them all, this is a **non-comprehensive** list of the **most notable from an end-user perspective**. For a more detailed list, you can read through the [**changelogs**](https://github.com/Next-Flip/Momentum-Firmware/releases) and commits/code. Also, you can find a **feature comparison with other firmwares** on [our website](https://momentum-fw.dev/#features). Note that this repo is always updated with the great work from our friends at [Unleashed](https://github.com/DarkFlippers/unleashed-firmware) and the latest changes from [OFW](https://github.com/flipperdevices/flipperzero-firmware). Below are mentioned only **our** changes that we can actually be credited for, so make sure to check their fantastic additions aswell. And a huge thank you to both teams! ```txt [Added] -- Xtreme App (Easy configuration of most features exclusive to Xtreme) +- Momentum App (Easy configuration of features and behavior of the firmware) - Asset Packs (Unparalleled theming and customization) - More UI customization, redesigns and optimizations - Bad-Keyboard App - BLE Spam App +- NFC Maker App - Wardriver App - File Search across SD Card -- Easy spoofing (Name, Mac, Serial) - Additional NFC parsers and protocols - Subdriving (saving GPS coordinates for Sub-GHz) +- Easy spoofing (Name, MAC address, Serial number) - Enhanced RGB Backlight modes (Full customization & Rainbow mode) - File management on device (Cut, Copy, Paste, Show, New Dir, etc.) +- Remember Infrared GPIO settings and add IR Blaster support in apps - Advanced Security measures (Lock on Boot, reset on false pins, etc.) -- Remember Infrared GPIO and IR Blaster auto-detection + support in apps +- Disk Image management (Mount and view image contents, open in Mass Storage) +- Extended JavaScript API (Support for UsbDisk/Mass Storage, File operations) ``` ```txt [Updated] @@ -129,12 +112,12 @@ Note that this repo is always updated with the great work from our friends at [U - Enhanced WiFi support for easiest setup ever - Extended keyboard with cursor movevent and symbols - File Browser with Sorting, More supported File Types -- Advanced and optimized Level System (Read more above) -- Storage backend with instant rename and more optimizations +- Advanced and optimized Level System (Up to 30 levels) - Desktop Keybind system for full key and press/hold remapping +- Storage backend with instant rename and virtual mounting for disk images - Weather Station, POCSAG, TPMS protocols and more integrated into Sub-GHz - Expanded Sub-GHz App (Duplicate detection & Ignore, Autosave, History improvements) -- Improved Error Messages (Showing actual root) +- Improved Error Messages (Showing source file paths) ``` ```txt [Removed] @@ -148,26 +131,27 @@ Note that this repo is always updated with the great work from our friends at [U

Install:


-There are 3 methods to install Xtreme, we recommend you use the **Web Updater**, but choose whichever one you prefer: +There are 3 methods to install Momentum, we recommend you use the **Web Updater**, but choose whichever one you prefer:
>
Web Updater (Chrome)
    ->
  • Open the latest release page and click on the Web Updater link
  • >
  • Make sure qFlipper is closed
  • +>
  • Open the Web Updater
  • >
  • Click Connect and select your Flipper from the list
  • >
  • Click Flash and wait for the update to complete
  • >
>
qFlipper Package (.tgz)
    ->
  • Download the qFlipper package (.tgz) from the latest release page
  • +>
  • Download the qFlipper package (.tgz) from the latest release page
  • +>
  • Make sure the WebUpdater and lab.flipper.net are closed
  • >
  • Open qFlipper and connect your Flipper
  • >
  • Click Install from file
  • >
  • Select the .tgz you downloaded and wait for the update to complete
  • >
>
Zipped Archive (.zip)
    ->
  • Download the zipped archive (.zip) from the latest release page
  • +>
  • Download the zipped archive (.zip) from the latest release page
  • >
  • Extract the archive. This is now your new Firmware folder
  • >
  • Open qFlipper, head to SD/update and simply move the firmware folder there
  • >
  • On the Flipper, hit the Arrow Down button, this will get you to the file menu. In there simply search for your updates folder
  • @@ -180,13 +164,10 @@ There are 3 methods to install Xtreme, we recommend you use the **Web Updater**,

    Build it yourself:

    -> **Warning** -> We will not give basic support for compiling in our server. This is intended for people that already *know* what they are doing! - ```bash -To download the needed tools: -$ git clone --recursive --jobs 8 https://github.com/Flipper-XFW/Xtreme-Firmware.git -$ cd Xtreme-Firmware/ +To download the repository: +$ git clone --recursive --jobs 8 https://github.com/Next-Flip/Momentum-Firmware.git +$ cd Momentum-Firmware/ To flash directly to the Flipper (Needs to be connected via USB, qFlipper closed) $ ./fbt flash_usb_full @@ -201,25 +182,32 @@ $ ./fbt launch APPSRC=your_appid ----

    Stargazers over time

    -[![Stargazers over time](https://starchart.cc/Flipper-XFW/Xtreme-Firmware.svg)](https://starchart.cc/Flipper-XFW/Xtreme-Firmware) +[![Stargazers over time](https://starchart.cc/Next-Flip/Momentum-Firmware.svg)](https://starchart.cc/Next-Flip/Momentum-Firmware) ----- + ## ❤️ Support -If you like what you're seeing, **please consider donating to us**. We won't ever put this behind a paywall, but we'd still appreciate a few bucks! +If you enjoy the firmware, please consider donating to the team, or sharing it with others! :D -- **[Patreon](https://patreon.com/crazyco)**: ❤️ Account needed, subscription with perks across my entire org. -- **[Wire-transfer](https://bunq.me/ClaraK)**: No account needed, one-time -- **[Paypal](https://paypal.me/ClaraCrazy)**: Account needed, one-time -- **[ko-fi](https://ko-fi.com/cynthialabs)**: No account needed, one-time -- **Monero**: `41kyWeeoVdK4quzQ4M9ikVGs6tCQCLfdx8jLExTNsAu2SF1QAyDqRdjfGM6EL8L9NpXwt89HJeAoGf1aoArk7nDr4AMMV4T` +> **[Ko-fi](https://ko-fi.com/willyjl)**: One-off or Recurring, No signup required -**Thanks for all your support <3** +> **[Bank transfer](https://bunq.me/WillyJL)**: One-off, No signup required ----- -

    "What we do for ourselves dies with us. What we do for others and the world remains and is immortal.” ― Albert Pine

    +> **[PayPal](https://paypal.me/willyjl1)**: One-off, Signup required + +> **BCH**: `1EnCi1HF8Jw6m2dWSUwHLbCRbVBCQSyDKm` + +> **ETH**: `0x90b8284c3eba44108427e3148ff8efa0ae7a61a8` + +> **BTC**: `1EnCi1HF8Jw6m2dWSUwHLbCRbVBCQSyDKm` + +> **SHIB**: `0x90b8284c3eba44108427e3148ff8efa0ae7a61a8` + +> **DOGE**: `DNUdUqtmWaAiJ6yoV6hRNEh6Nn1Tg4Aorr` + +**Thank you <3** diff --git a/applications/drivers/subghz/cc1101_ext/cc1101_ext.c b/applications/drivers/subghz/cc1101_ext/cc1101_ext.c index 75d6c2b1b..9dc333a7e 100644 --- a/applications/drivers/subghz/cc1101_ext/cc1101_ext.c +++ b/applications/drivers/subghz/cc1101_ext/cc1101_ext.c @@ -225,15 +225,15 @@ bool subghz_device_cc1101_ext_alloc(SubGhzDeviceConf* conf) { subghz_device_cc1101_ext->async_rx.capture_delta_duration = 0; subghz_device_cc1101_ext->spi_bus_handle = - (xtreme_settings.spi_cc1101_handle == SpiDefault ? + (momentum_settings.spi_cc1101_handle == SpiDefault ? &furi_hal_spi_bus_handle_external : &furi_hal_spi_bus_handle_external_extra); // this is needed if multiple SPI devices are connected to the same bus but with different CS pins - if(xtreme_settings.spi_cc1101_handle == SpiDefault && !furi_hal_subghz_get_ext_power_amp()) { + if(momentum_settings.spi_cc1101_handle == SpiDefault && !furi_hal_subghz_get_ext_power_amp()) { furi_hal_gpio_init_simple(&gpio_ext_pc3, GpioModeOutputPushPull); furi_hal_gpio_write(&gpio_ext_pc3, true); - } else if(xtreme_settings.spi_cc1101_handle == SpiExtra) { + } else if(momentum_settings.spi_cc1101_handle == SpiExtra) { furi_hal_gpio_init_simple(&gpio_ext_pa4, GpioModeOutputPushPull); furi_hal_gpio_write(&gpio_ext_pa4, true); } @@ -254,9 +254,9 @@ void subghz_device_cc1101_ext_free() { furi_hal_spi_bus_handle_deinit(subghz_device_cc1101_ext->spi_bus_handle); // resetting the CS pins to floating - if(xtreme_settings.spi_nrf24_handle == SpiDefault || subghz_device_cc1101_ext->power_amp) { + if(momentum_settings.spi_nrf24_handle == SpiDefault || subghz_device_cc1101_ext->power_amp) { furi_hal_gpio_init_simple(&gpio_ext_pc3, GpioModeAnalog); - } else if(xtreme_settings.spi_nrf24_handle == SpiExtra) { + } else if(momentum_settings.spi_nrf24_handle == SpiExtra) { furi_hal_gpio_init_simple(&gpio_ext_pa4, GpioModeAnalog); } diff --git a/applications/drivers/subghz/cc1101_ext/cc1101_ext.h b/applications/drivers/subghz/cc1101_ext/cc1101_ext.h index 9cd3ba346..31e740189 100644 --- a/applications/drivers/subghz/cc1101_ext/cc1101_ext.h +++ b/applications/drivers/subghz/cc1101_ext/cc1101_ext.h @@ -11,7 +11,7 @@ #include #include #include -#include +#include #ifdef __cplusplus extern "C" { diff --git a/applications/external b/applications/external index 58b9cb176..dae7906c1 160000 --- a/applications/external +++ b/applications/external @@ -1 +1 @@ -Subproject commit 58b9cb17697233b71a762fcdcd877c9e90b83173 +Subproject commit dae7906c1abb4fd6d4198669a84d92dd1902032b diff --git a/applications/main/application.fam b/applications/main/application.fam index 6514692f7..fdcb80735 100644 --- a/applications/main/application.fam +++ b/applications/main/application.fam @@ -11,7 +11,7 @@ App( "subghz", "bad_kb", "u2f", - "xtreme_app", + "momentum_app", "archive", "main_apps_on_start", ], diff --git a/applications/main/archive/helpers/archive_browser.c b/applications/main/archive/helpers/archive_browser.c index 6bf479ea3..dd9a323eb 100644 --- a/applications/main/archive/helpers/archive_browser.c +++ b/applications/main/archive/helpers/archive_browser.c @@ -553,7 +553,7 @@ void archive_switch_tab(ArchiveBrowserView* browser, InputKey key) { } else { tab = (tab + 1) % ArchiveTabTotal; } - if(tab == ArchiveTabInternal && !xtreme_settings.show_internal_tab) continue; + if(tab == ArchiveTabInternal && !momentum_settings.show_internal_tab) continue; break; } @@ -587,7 +587,7 @@ void archive_switch_tab(ArchiveBrowserView* browser, InputKey key) { // Hide dot files everywhere except Browser if in debug mode bool hide_dot_files = !is_browser ? true : tab == ArchiveTabInternal ? false : - !xtreme_settings.show_hidden_files; + !momentum_settings.show_hidden_files; archive_file_browser_set_path( browser, browser->path, archive_get_tab_ext(tab), skip_assets, hide_dot_files); tab_empty = false; // Empty check will be performed later diff --git a/applications/main/archive/helpers/archive_favorites.h b/applications/main/archive/helpers/archive_favorites.h index dfeb18e76..308355899 100644 --- a/applications/main/archive/helpers/archive_favorites.h +++ b/applications/main/archive/helpers/archive_favorites.h @@ -2,9 +2,8 @@ #include -#define ARCHIVE_FAV_OLD_PATH EXT_PATH("favorites.txt") -#define ARCHIVE_FAV_PATH CFG_PATH("favorites.txt") -#define ARCHIVE_FAV_TEMP_PATH CFG_PATH("favorites.tmp") +#define ARCHIVE_FAV_PATH ANY_PATH("favorites.txt") +#define ARCHIVE_FAV_TEMP_PATH ANY_PATH("favorites.tmp") uint16_t archive_favorites_count(); bool archive_favorites_read(void* context); diff --git a/applications/main/archive/helpers/archive_files.h b/applications/main/archive/helpers/archive_files.h index 0bcf66d65..61232f943 100644 --- a/applications/main/archive/helpers/archive_files.h +++ b/applications/main/archive/helpers/archive_files.h @@ -5,7 +5,7 @@ #include #include #include "toolbox/path.h" -#include +#include #define FAP_MANIFEST_MAX_ICON_SIZE 32 @@ -87,7 +87,7 @@ static void ArchiveFile_t_clear(ArchiveFile_t* obj) { } static int ArchiveFile_t_cmp(const ArchiveFile_t* a, const ArchiveFile_t* b) { - if(xtreme_settings.sort_dirs_first) { + if(momentum_settings.sort_dirs_first) { if(a->type == ArchiveFileTypeFolder && b->type != ArchiveFileTypeFolder) { return -1; } diff --git a/applications/main/archive/helpers/favorite_timeout.c b/applications/main/archive/helpers/favorite_timeout.c index 66bd363e9..4df9dbd46 100644 --- a/applications/main/archive/helpers/favorite_timeout.c +++ b/applications/main/archive/helpers/favorite_timeout.c @@ -1,5 +1,5 @@ #include "archive_helpers_ext.h" -#include +#include bool process_favorite_launch(char** args) { if(*args && strlen(*args) > 4 && strncmp(*args, "fav/", 4) == 0) { @@ -17,7 +17,7 @@ void favorite_timeout_callback(void* _ctx) { } void favorite_timeout_run(ViewDispatcher* view_dispatcher, SceneManager* scene_manager) { - uint32_t timeout = xtreme_settings.favorite_timeout; + uint32_t timeout = momentum_settings.favorite_timeout; if(timeout == 0) { view_dispatcher_run(view_dispatcher); return; diff --git a/applications/main/archive/scenes/archive_scene_search.c b/applications/main/archive/scenes/archive_scene_search.c index 1d821f684..637bee39e 100644 --- a/applications/main/archive/scenes/archive_scene_search.c +++ b/applications/main/archive/scenes/archive_scene_search.c @@ -41,7 +41,7 @@ uint32_t archive_scene_search_dirwalk(void* context) { uint32_t count = 1; DirWalk* dir_walk = dir_walk_alloc(furi_record_open(RECORD_STORAGE)); const char* ignore[] = { - XTREME_ASSETS_PATH, + ASSET_PACKS_PATH, BASE_ANIMATION_DIR, }; dir_walk_set_recurse_filter(dir_walk, ignore, COUNT_OF(ignore)); diff --git a/applications/main/bad_kb/bad_kb_app.c b/applications/main/bad_kb/bad_kb_app.c index d18ac09c2..081a5dfe8 100644 --- a/applications/main/bad_kb/bad_kb_app.c +++ b/applications/main/bad_kb/bad_kb_app.c @@ -3,7 +3,7 @@ #include #include #include -#include +#include #include #include #include "helpers/ducky_script_i.h" @@ -267,11 +267,11 @@ void bad_kb_config_refresh(BadKbApp* app) { scene_manager_previous_scene(app->scene_manager); // Update settings - if(xtreme_settings.bad_bt != app->is_bt || - xtreme_settings.bad_bt_remember != app->bt_remember) { - xtreme_settings.bad_bt = app->is_bt; - xtreme_settings.bad_bt_remember = app->bt_remember; - xtreme_settings_save(); + if(momentum_settings.bad_bt != app->is_bt || + momentum_settings.bad_bt_remember != app->bt_remember) { + momentum_settings.bad_bt = app->is_bt; + momentum_settings.bad_bt_remember = app->bt_remember; + momentum_settings_save(); } } @@ -308,8 +308,8 @@ BadKbApp* bad_kb_app_alloc(char* arg) { Bt* bt = furi_record_open(RECORD_BT); app->bt = bt; app->bt->suppress_pin_screen = true; - app->is_bt = xtreme_settings.bad_bt; - app->bt_remember = xtreme_settings.bad_bt_remember; + app->is_bt = momentum_settings.bad_bt; + app->bt_remember = momentum_settings.bad_bt_remember; bad_kb_config_adjust(&app->config); // Save prev config diff --git a/applications/main/bad_kb/resources/badkb/demo_android.txt b/applications/main/bad_kb/resources/badkb/demo_android.txt index 3cad57454..b79c93dca 100644 --- a/applications/main/bad_kb/resources/badkb/demo_android.txt +++ b/applications/main/bad_kb/resources/badkb/demo_android.txt @@ -6,7 +6,7 @@ ENTER DELAY 1000 CTRL l DELAY 100 -STRING https://github.com/Flipper-XFW/Xtreme-Firmware +STRING https://github.com/Next-Flip/Momentum-Firmware DELAY 100 ENTER DELAY 500 diff --git a/applications/main/bad_kb/resources/badkb/demo_ios.txt b/applications/main/bad_kb/resources/badkb/demo_ios.txt index c6beb2f4e..169b769e7 100644 --- a/applications/main/bad_kb/resources/badkb/demo_ios.txt +++ b/applications/main/bad_kb/resources/badkb/demo_ios.txt @@ -4,7 +4,7 @@ GUI h DELAY 1000 GUI SPACE DELAY 250 -STRING https://github.com/Flipper-XFW/Xtreme-Firmware +STRING https://github.com/Next-Flip/Momentum-Firmware DELAY 75 TAB DELAY 75 diff --git a/applications/main/bad_kb/scenes/bad_kb_scene_config.c b/applications/main/bad_kb/scenes/bad_kb_scene_config.c index c3dabf0b8..ca5ec6400 100644 --- a/applications/main/bad_kb/scenes/bad_kb_scene_config.c +++ b/applications/main/bad_kb/scenes/bad_kb_scene_config.c @@ -1,7 +1,7 @@ #include "../bad_kb_app_i.h" #include "furi_hal_power.h" #include "furi_hal_usb.h" -#include +#include enum VarItemListIndex { VarItemListIndexKeyboardLayout, diff --git a/applications/main/bad_kb/scenes/bad_kb_scene_file_select.c b/applications/main/bad_kb/scenes/bad_kb_scene_file_select.c index de68d2260..884682685 100644 --- a/applications/main/bad_kb/scenes/bad_kb_scene_file_select.c +++ b/applications/main/bad_kb/scenes/bad_kb_scene_file_select.c @@ -15,7 +15,7 @@ static bool bad_kb_file_select(BadKbApp* bad_kb) { dialog_message_set_text( message, "A badusb folder was found!\n" - "XFW uses the badkb folder.\n" + "Momentum uses the badkb folder.\n" "Want to transfer the files?", 64, 32, diff --git a/applications/main/bad_kb/views/bad_kb_view.c b/applications/main/bad_kb/views/bad_kb_view.c index 11cf32aee..5f1a8bdda 100644 --- a/applications/main/bad_kb/views/bad_kb_view.c +++ b/applications/main/bad_kb/views/bad_kb_view.c @@ -4,7 +4,7 @@ #include #include #include -#include +#include #include #define MAX_NAME_LEN 64 @@ -57,11 +57,7 @@ static void bad_kb_draw_callback(Canvas* canvas, void* _model) { if((state == BadKbStateIdle) || (state == BadKbStateDone) || (state == BadKbStateNotConnected)) { - if(xtreme_assets.is_nsfw) { - elements_button_center(canvas, "Cum"); - } else { - elements_button_center(canvas, "Run"); - } + elements_button_center(canvas, "Run"); elements_button_left(canvas, "Config"); } else if((state == BadKbStateRunning) || (state == BadKbStateDelay)) { elements_button_center(canvas, "Stop"); @@ -80,21 +76,12 @@ static void bad_kb_draw_callback(Canvas* canvas, void* _model) { if(state == BadKbStateNotConnected) { canvas_draw_icon(canvas, 4, 26, &I_Clock_18x18); canvas_set_font(canvas, FontPrimary); - if(xtreme_assets.is_nsfw) { - canvas_draw_str_aligned(canvas, 127, 31, AlignRight, AlignBottom, "Plug me"); - canvas_draw_str_aligned(canvas, 127, 43, AlignRight, AlignBottom, "in, Daddy"); - } else { - canvas_draw_str_aligned(canvas, 127, 31, AlignRight, AlignBottom, "Connect to"); - canvas_draw_str_aligned(canvas, 127, 43, AlignRight, AlignBottom, "a device"); - } + canvas_draw_str_aligned(canvas, 127, 31, AlignRight, AlignBottom, "Connect to"); + canvas_draw_str_aligned(canvas, 127, 43, AlignRight, AlignBottom, "a device"); } else if(state == BadKbStateWillRun) { canvas_draw_icon(canvas, 4, 26, &I_Clock_18x18); canvas_set_font(canvas, FontPrimary); - if(xtreme_assets.is_nsfw) { - canvas_draw_str_aligned(canvas, 127, 31, AlignRight, AlignBottom, "Will cum"); - } else { - canvas_draw_str_aligned(canvas, 127, 31, AlignRight, AlignBottom, "Will run"); - } + canvas_draw_str_aligned(canvas, 127, 31, AlignRight, AlignBottom, "Will run"); canvas_draw_str_aligned(canvas, 127, 43, AlignRight, AlignBottom, "on connect"); } else if(state == BadKbStateFileError) { canvas_draw_icon(canvas, 4, 26, &I_Error_18x18); diff --git a/applications/main/lfrfid/scenes/lfrfid_scene_emulate.c b/applications/main/lfrfid/scenes/lfrfid_scene_emulate.c index c87ebc1c9..dc5b0e01f 100644 --- a/applications/main/lfrfid/scenes/lfrfid_scene_emulate.c +++ b/applications/main/lfrfid/scenes/lfrfid_scene_emulate.c @@ -1,6 +1,6 @@ #include "../lfrfid_i.h" -#include +#include FuriTimer* timer_auto_exit = NULL; @@ -35,7 +35,8 @@ void lfrfid_scene_emulate_on_enter(void* context) { timer_auto_exit = furi_timer_alloc(lfrfid_scene_emulate_popup_callback, FuriTimerTypeOnce, app); furi_timer_start( - timer_auto_exit, xtreme_settings.favorite_timeout * furi_kernel_get_tick_frequency()); + timer_auto_exit, + momentum_settings.favorite_timeout * furi_kernel_get_tick_frequency()); } view_dispatcher_switch_to_view(app->view_dispatcher, LfRfidViewPopup); diff --git a/applications/main/xtreme_app/application.fam b/applications/main/momentum_app/application.fam similarity index 61% rename from applications/main/xtreme_app/application.fam rename to applications/main/momentum_app/application.fam index cffd382b6..e4b228396 100644 --- a/applications/main/xtreme_app/application.fam +++ b/applications/main/momentum_app/application.fam @@ -1,11 +1,11 @@ App( - appid="xtreme_app", - name="Xtreme", + appid="momentum_app", + name="Momentum", apptype=FlipperAppType.MENUEXTERNAL, - entry_point="xtreme_app", + entry_point="momentum_app", stack_size=2 * 1024, flags=["InsomniaSafe"], - icon="A_Xtreme_14", + icon="A_Momentum_14", order=90, fap_icon="icon.png", fap_category="assets", diff --git a/applications/main/xtreme_app/icon.png b/applications/main/momentum_app/icon.png similarity index 100% rename from applications/main/xtreme_app/icon.png rename to applications/main/momentum_app/icon.png diff --git a/applications/main/xtreme_app/xtreme_app.c b/applications/main/momentum_app/momentum_app.c similarity index 78% rename from applications/main/xtreme_app/xtreme_app.c rename to applications/main/momentum_app/momentum_app.c index 5e0ce4c08..3692b08ae 100644 --- a/applications/main/xtreme_app/xtreme_app.c +++ b/applications/main/momentum_app/momentum_app.c @@ -1,8 +1,8 @@ -#include "xtreme_app.h" +#include "momentum_app.h" -static bool xtreme_app_custom_event_callback(void* context, uint32_t event) { +static bool momentum_app_custom_event_callback(void* context, uint32_t event) { furi_assert(context); - XtremeApp* app = context; + MomentumApp* app = context; return scene_manager_handle_custom_event(app->scene_manager, event); } @@ -11,12 +11,12 @@ void callback_reboot(void* context) { power_reboot(PowerBootModeNormal); } -bool xtreme_app_apply(XtremeApp* app) { +bool momentum_app_apply(MomentumApp* app) { Storage* storage = furi_record_open(RECORD_STORAGE); if(app->save_mainmenu_apps) { Stream* stream = file_stream_alloc(storage); - if(file_stream_open(stream, XTREME_MENU_PATH, FSAM_READ_WRITE, FSOM_CREATE_ALWAYS)) { + if(file_stream_open(stream, MAINMENU_APPS_PATH, FSAM_READ_WRITE, FSOM_CREATE_ALWAYS)) { stream_write_format(stream, "MenuAppList Version %u\n", 0); CharList_it_t it; CharList_it(it, app->mainmenu_app_exes); @@ -116,7 +116,7 @@ bool xtreme_app_apply(XtremeApp* app) { } if(app->save_settings) { - xtreme_settings_save(); + momentum_settings_save(); } if(app->show_slideshow) { @@ -128,30 +128,30 @@ bool xtreme_app_apply(XtremeApp* app) { popup_set_context(app->popup, app); popup_set_timeout(app->popup, 1000); popup_enable_timeout(app->popup); - view_dispatcher_switch_to_view(app->view_dispatcher, XtremeAppViewPopup); + view_dispatcher_switch_to_view(app->view_dispatcher, MomentumAppViewPopup); return true; } else if(app->apply_pack) { - xtreme_assets_free(); + asset_packs_free(); popup_set_header(app->popup, "Reloading...", 64, 26, AlignCenter, AlignCenter); popup_set_text(app->popup, "Applying asset pack...", 64, 40, AlignCenter, AlignCenter); popup_set_callback(app->popup, NULL); popup_set_context(app->popup, NULL); popup_set_timeout(app->popup, 0); popup_disable_timeout(app->popup); - view_dispatcher_switch_to_view(app->view_dispatcher, XtremeAppViewPopup); - xtreme_assets_init(); + view_dispatcher_switch_to_view(app->view_dispatcher, MomentumAppViewPopup); + asset_packs_init(); } furi_record_close(RECORD_STORAGE); return false; } -static bool xtreme_app_back_event_callback(void* context) { +static bool momentum_app_back_event_callback(void* context) { furi_assert(context); - XtremeApp* app = context; + MomentumApp* app = context; - if(!scene_manager_has_previous_scene(app->scene_manager, XtremeAppSceneStart)) { - if(xtreme_app_apply(app)) { + if(!scene_manager_has_previous_scene(app->scene_manager, MomentumAppSceneStart)) { + if(momentum_app_apply(app)) { return true; } } @@ -159,22 +159,22 @@ static bool xtreme_app_back_event_callback(void* context) { return scene_manager_handle_back_event(app->scene_manager); } -XtremeApp* xtreme_app_alloc() { - XtremeApp* app = malloc(sizeof(XtremeApp)); +MomentumApp* momentum_app_alloc() { + MomentumApp* app = malloc(sizeof(MomentumApp)); app->gui = furi_record_open(RECORD_GUI); app->dialogs = furi_record_open(RECORD_DIALOGS); app->notification = furi_record_open(RECORD_NOTIFICATION); // View Dispatcher and Scene Manager app->view_dispatcher = view_dispatcher_alloc(); - app->scene_manager = scene_manager_alloc(&xtreme_app_scene_handlers, app); + app->scene_manager = scene_manager_alloc(&momentum_app_scene_handlers, app); view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_set_event_callback_context(app->view_dispatcher, app); view_dispatcher_set_custom_event_callback( - app->view_dispatcher, xtreme_app_custom_event_callback); + app->view_dispatcher, momentum_app_custom_event_callback); view_dispatcher_set_navigation_event_callback( - app->view_dispatcher, xtreme_app_back_event_callback); + app->view_dispatcher, momentum_app_back_event_callback); view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); @@ -182,27 +182,28 @@ XtremeApp* xtreme_app_alloc() { app->var_item_list = variable_item_list_alloc(); view_dispatcher_add_view( app->view_dispatcher, - XtremeAppViewVarItemList, + MomentumAppViewVarItemList, variable_item_list_get_view(app->var_item_list)); app->submenu = submenu_alloc(); view_dispatcher_add_view( - app->view_dispatcher, XtremeAppViewSubmenu, submenu_get_view(app->submenu)); + app->view_dispatcher, MomentumAppViewSubmenu, submenu_get_view(app->submenu)); app->text_input = text_input_alloc(); view_dispatcher_add_view( - app->view_dispatcher, XtremeAppViewTextInput, text_input_get_view(app->text_input)); + app->view_dispatcher, MomentumAppViewTextInput, text_input_get_view(app->text_input)); app->byte_input = byte_input_alloc(); view_dispatcher_add_view( - app->view_dispatcher, XtremeAppViewByteInput, byte_input_get_view(app->byte_input)); + app->view_dispatcher, MomentumAppViewByteInput, byte_input_get_view(app->byte_input)); app->popup = popup_alloc(); - view_dispatcher_add_view(app->view_dispatcher, XtremeAppViewPopup, popup_get_view(app->popup)); + view_dispatcher_add_view( + app->view_dispatcher, MomentumAppViewPopup, popup_get_view(app->popup)); app->dialog_ex = dialog_ex_alloc(); view_dispatcher_add_view( - app->view_dispatcher, XtremeAppViewDialogEx, dialog_ex_get_view(app->dialog_ex)); + app->view_dispatcher, MomentumAppViewDialogEx, dialog_ex_get_view(app->dialog_ex)); // Settings init @@ -211,9 +212,9 @@ XtremeApp* xtreme_app_alloc() { Storage* storage = furi_record_open(RECORD_STORAGE); File* folder = storage_file_alloc(storage); FileInfo info; - char* name = malloc(XTREME_ASSETS_PACK_NAME_LEN); - if(storage_dir_open(folder, XTREME_ASSETS_PATH)) { - while(storage_dir_read(folder, &info, name, XTREME_ASSETS_PACK_NAME_LEN)) { + char* name = malloc(ASSET_PACKS_NAME_LEN); + if(storage_dir_open(folder, ASSET_PACKS_PATH)) { + while(storage_dir_read(folder, &info, name, ASSET_PACKS_NAME_LEN)) { if(info.flags & FSF_DIRECTORY) { char* copy = strdup(name); size_t idx = 0; @@ -227,7 +228,7 @@ XtremeApp* xtreme_app_alloc() { if(app->asset_pack_index != 0) { if(idx < app->asset_pack_index) app->asset_pack_index++; } else { - if(strcmp(copy, xtreme_settings.asset_pack) == 0) + if(strcmp(copy, momentum_settings.asset_pack) == 0) app->asset_pack_index = idx + 1; } } @@ -240,7 +241,7 @@ XtremeApp* xtreme_app_alloc() { CharList_init(app->mainmenu_app_exes); Stream* stream = file_stream_alloc(storage); FuriString* line = furi_string_alloc(); - if(file_stream_open(stream, XTREME_MENU_PATH, FSAM_READ, FSOM_OPEN_EXISTING)) { + if(file_stream_open(stream, MAINMENU_APPS_PATH, FSAM_READ, FSOM_OPEN_EXISTING)) { stream_read_line(stream, line); while(stream_read_line(stream, line)) { furi_string_replace_all(line, "\r", ""); @@ -301,27 +302,35 @@ XtremeApp* xtreme_app_alloc() { app->dolphin_angry = stats.butthurt; furi_record_close(RECORD_DOLPHIN); - app->version_tag = - furi_string_alloc_printf("%s %s", version_get_version(NULL), version_get_builddate(NULL)); + if(strcmp(version_get_version(NULL), "MNTM-DEV") == 0) { + app->version_tag = furi_string_alloc_printf("%s ", version_get_version(NULL)); + const char* sha = version_get_githash(NULL); + for(size_t i = 0; i < strlen(sha); ++i) { + furi_string_push_back(app->version_tag, toupper(sha[i])); + } + } else { + app->version_tag = furi_string_alloc_printf( + "%s %s", version_get_version(NULL), version_get_builddate(NULL)); + } return app; } -void xtreme_app_free(XtremeApp* app) { +void momentum_app_free(MomentumApp* app) { furi_assert(app); // Gui modules - view_dispatcher_remove_view(app->view_dispatcher, XtremeAppViewVarItemList); + view_dispatcher_remove_view(app->view_dispatcher, MomentumAppViewVarItemList); variable_item_list_free(app->var_item_list); - view_dispatcher_remove_view(app->view_dispatcher, XtremeAppViewSubmenu); + view_dispatcher_remove_view(app->view_dispatcher, MomentumAppViewSubmenu); submenu_free(app->submenu); - view_dispatcher_remove_view(app->view_dispatcher, XtremeAppViewTextInput); + view_dispatcher_remove_view(app->view_dispatcher, MomentumAppViewTextInput); text_input_free(app->text_input); - view_dispatcher_remove_view(app->view_dispatcher, XtremeAppViewByteInput); + view_dispatcher_remove_view(app->view_dispatcher, MomentumAppViewByteInput); byte_input_free(app->byte_input); - view_dispatcher_remove_view(app->view_dispatcher, XtremeAppViewPopup); + view_dispatcher_remove_view(app->view_dispatcher, MomentumAppViewPopup); popup_free(app->popup); - view_dispatcher_remove_view(app->view_dispatcher, XtremeAppViewDialogEx); + view_dispatcher_remove_view(app->view_dispatcher, MomentumAppViewDialogEx); dialog_ex_free(app->dialog_ex); // View Dispatcher and Scene Manager @@ -357,11 +366,11 @@ void xtreme_app_free(XtremeApp* app) { free(app); } -extern int32_t xtreme_app(void* p) { +extern int32_t momentum_app(void* p) { UNUSED(p); - XtremeApp* app = xtreme_app_alloc(); - scene_manager_next_scene(app->scene_manager, XtremeAppSceneStart); + MomentumApp* app = momentum_app_alloc(); + scene_manager_next_scene(app->scene_manager, MomentumAppSceneStart); view_dispatcher_run(app->view_dispatcher); - xtreme_app_free(app); + momentum_app_free(app); return 0; } diff --git a/applications/main/xtreme_app/xtreme_app.h b/applications/main/momentum_app/momentum_app.h similarity index 82% rename from applications/main/xtreme_app/xtreme_app.h rename to applications/main/momentum_app/momentum_app.h index fecda9696..67981177a 100644 --- a/applications/main/xtreme_app/xtreme_app.h +++ b/applications/main/momentum_app/momentum_app.h @@ -16,7 +16,7 @@ #include #include #include -#include "scenes/xtreme_app_scene.h" +#include "scenes/momentum_app_scene.h" #include "dolphin/helpers/dolphin_state.h" #include "dolphin/dolphin.h" #include "dolphin/dolphin_i.h" @@ -27,10 +27,8 @@ #include #include #include -#include -#include - -#define XTREME_SUBGHZ_FREQ_BUFFER_SIZE 7 +#include +#include ARRAY_DEF(CharList, char*) @@ -57,7 +55,7 @@ typedef struct { uint8_t subghz_static_index; FrequencyList_t subghz_hopper_freqs; uint8_t subghz_hopper_index; - char subghz_freq_buffer[XTREME_SUBGHZ_FREQ_BUFFER_SIZE]; + char subghz_freq_buffer[7]; bool subghz_extend; RgbColor lcd_color; char device_name[FURI_HAL_VERSION_ARRAY_NAME_LENGTH]; @@ -76,15 +74,15 @@ typedef struct { bool apply_pack; bool show_slideshow; bool require_reboot; -} XtremeApp; +} MomentumApp; typedef enum { - XtremeAppViewVarItemList, - XtremeAppViewSubmenu, - XtremeAppViewTextInput, - XtremeAppViewByteInput, - XtremeAppViewPopup, - XtremeAppViewDialogEx, -} XtremeAppView; + MomentumAppViewVarItemList, + MomentumAppViewSubmenu, + MomentumAppViewTextInput, + MomentumAppViewByteInput, + MomentumAppViewPopup, + MomentumAppViewDialogEx, +} MomentumAppView; -bool xtreme_app_apply(XtremeApp* app); +bool momentum_app_apply(MomentumApp* app); diff --git a/applications/main/momentum_app/scenes/momentum_app_scene.c b/applications/main/momentum_app/scenes/momentum_app_scene.c new file mode 100644 index 000000000..26645612c --- /dev/null +++ b/applications/main/momentum_app/scenes/momentum_app_scene.c @@ -0,0 +1,30 @@ +#include "momentum_app_scene.h" + +// Generate scene on_enter handlers array +#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_enter, +void (*const momentum_app_on_enter_handlers[])(void*) = { +#include "momentum_app_scene_config.h" +}; +#undef ADD_SCENE + +// Generate scene on_event handlers array +#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_event, +bool (*const momentum_app_on_event_handlers[])(void* context, SceneManagerEvent event) = { +#include "momentum_app_scene_config.h" +}; +#undef ADD_SCENE + +// Generate scene on_exit handlers array +#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_exit, +void (*const momentum_app_on_exit_handlers[])(void* context) = { +#include "momentum_app_scene_config.h" +}; +#undef ADD_SCENE + +// Initialize scene handlers configuration structure +const SceneManagerHandlers momentum_app_scene_handlers = { + .on_enter_handlers = momentum_app_on_enter_handlers, + .on_event_handlers = momentum_app_on_event_handlers, + .on_exit_handlers = momentum_app_on_exit_handlers, + .scene_num = MomentumAppSceneNum, +}; diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene.h b/applications/main/momentum_app/scenes/momentum_app_scene.h similarity index 65% rename from applications/main/xtreme_app/scenes/xtreme_app_scene.h rename to applications/main/momentum_app/scenes/momentum_app_scene.h index d7f19abac..e24005873 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene.h +++ b/applications/main/momentum_app/scenes/momentum_app_scene.h @@ -3,27 +3,27 @@ #include // Generate scene id and total number -#define ADD_SCENE(prefix, name, id) XtremeAppScene##id, +#define ADD_SCENE(prefix, name, id) MomentumAppScene##id, typedef enum { -#include "xtreme_app_scene_config.h" - XtremeAppSceneNum, -} XtremeAppScene; +#include "momentum_app_scene_config.h" + MomentumAppSceneNum, +} MomentumAppScene; #undef ADD_SCENE -extern const SceneManagerHandlers xtreme_app_scene_handlers; +extern const SceneManagerHandlers momentum_app_scene_handlers; // Generate scene on_enter handlers declaration #define ADD_SCENE(prefix, name, id) void prefix##_scene_##name##_on_enter(void*); -#include "xtreme_app_scene_config.h" +#include "momentum_app_scene_config.h" #undef ADD_SCENE // Generate scene on_event handlers declaration #define ADD_SCENE(prefix, name, id) \ bool prefix##_scene_##name##_on_event(void* context, SceneManagerEvent event); -#include "xtreme_app_scene_config.h" +#include "momentum_app_scene_config.h" #undef ADD_SCENE // Generate scene on_exit handlers declaration #define ADD_SCENE(prefix, name, id) void prefix##_scene_##name##_on_exit(void* context); -#include "xtreme_app_scene_config.h" +#include "momentum_app_scene_config.h" #undef ADD_SCENE diff --git a/applications/main/momentum_app/scenes/momentum_app_scene_config.h b/applications/main/momentum_app/scenes/momentum_app_scene_config.h new file mode 100644 index 000000000..edf216614 --- /dev/null +++ b/applications/main/momentum_app/scenes/momentum_app_scene_config.h @@ -0,0 +1,21 @@ +ADD_SCENE(momentum_app, start, Start) +ADD_SCENE(momentum_app, interface, Interface) +ADD_SCENE(momentum_app, interface_graphics, InterfaceGraphics) +ADD_SCENE(momentum_app, interface_mainmenu, InterfaceMainmenu) +ADD_SCENE(momentum_app, interface_mainmenu_add, InterfaceMainmenuAdd) +ADD_SCENE(momentum_app, interface_mainmenu_add_main, InterfaceMainmenuAddMain) +ADD_SCENE(momentum_app, interface_mainmenu_reset, InterfaceMainmenuReset) +ADD_SCENE(momentum_app, interface_lockscreen, InterfaceLockscreen) +ADD_SCENE(momentum_app, interface_statusbar, InterfaceStatusbar) +ADD_SCENE(momentum_app, interface_filebrowser, InterfaceFilebrowser) +ADD_SCENE(momentum_app, protocols, Protocols) +ADD_SCENE(momentum_app, protocols_freqs, ProtocolsFreqs) +ADD_SCENE(momentum_app, protocols_freqs_static, ProtocolsFreqsStatic) +ADD_SCENE(momentum_app, protocols_freqs_hopper, ProtocolsFreqsHopper) +ADD_SCENE(momentum_app, protocols_freqs_add, ProtocolsFreqsAdd) +ADD_SCENE(momentum_app, protocols_gpio, ProtocolsGpio) +ADD_SCENE(momentum_app, misc, Misc) +ADD_SCENE(momentum_app, misc_screen, MiscScreen) +ADD_SCENE(momentum_app, misc_screen_color, MiscScreenColor) +ADD_SCENE(momentum_app, misc_dolphin, MiscDolphin) +ADD_SCENE(momentum_app, misc_rename, MiscRename) diff --git a/applications/main/momentum_app/scenes/momentum_app_scene_interface.c b/applications/main/momentum_app/scenes/momentum_app_scene_interface.c new file mode 100644 index 000000000..c6877ab48 --- /dev/null +++ b/applications/main/momentum_app/scenes/momentum_app_scene_interface.c @@ -0,0 +1,90 @@ +#include "../momentum_app.h" + +enum VarItemListIndex { + VarItemListIndexGraphics, + VarItemListIndexMainmenu, + VarItemListIndexLockscreen, + VarItemListIndexStatusbar, + VarItemListIndexFileBrowser, +}; + +void momentum_app_scene_interface_var_item_list_callback(void* context, uint32_t index) { + MomentumApp* app = context; + view_dispatcher_send_custom_event(app->view_dispatcher, index); +} + +void momentum_app_scene_interface_on_enter(void* context) { + MomentumApp* app = context; + VariableItemList* var_item_list = app->var_item_list; + VariableItem* item; + + item = variable_item_list_add(var_item_list, "Graphics", 0, NULL, app); + variable_item_set_current_value_text(item, ">"); + + item = variable_item_list_add(var_item_list, "Mainmenu", 0, NULL, app); + variable_item_set_current_value_text(item, ">"); + + item = variable_item_list_add(var_item_list, "Lockscreen", 0, NULL, app); + variable_item_set_current_value_text(item, ">"); + + item = variable_item_list_add(var_item_list, "Statusbar", 0, NULL, app); + variable_item_set_current_value_text(item, ">"); + + item = variable_item_list_add(var_item_list, "File Browser", 0, NULL, app); + variable_item_set_current_value_text(item, ">"); + + variable_item_list_set_enter_callback( + var_item_list, momentum_app_scene_interface_var_item_list_callback, app); + + variable_item_list_set_selected_item( + var_item_list, + scene_manager_get_scene_state(app->scene_manager, MomentumAppSceneInterface)); + + view_dispatcher_switch_to_view(app->view_dispatcher, MomentumAppViewVarItemList); +} + +bool momentum_app_scene_interface_on_event(void* context, SceneManagerEvent event) { + MomentumApp* app = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + scene_manager_set_scene_state(app->scene_manager, MomentumAppSceneInterface, event.event); + consumed = true; + switch(event.event) { + case VarItemListIndexGraphics: + scene_manager_set_scene_state( + app->scene_manager, MomentumAppSceneInterfaceGraphics, 0); + scene_manager_next_scene(app->scene_manager, MomentumAppSceneInterfaceGraphics); + break; + case VarItemListIndexMainmenu: + scene_manager_set_scene_state( + app->scene_manager, MomentumAppSceneInterfaceMainmenu, 0); + scene_manager_next_scene(app->scene_manager, MomentumAppSceneInterfaceMainmenu); + break; + case VarItemListIndexLockscreen: + scene_manager_set_scene_state( + app->scene_manager, MomentumAppSceneInterfaceLockscreen, 0); + scene_manager_next_scene(app->scene_manager, MomentumAppSceneInterfaceLockscreen); + break; + case VarItemListIndexStatusbar: + scene_manager_set_scene_state( + app->scene_manager, MomentumAppSceneInterfaceStatusbar, 0); + scene_manager_next_scene(app->scene_manager, MomentumAppSceneInterfaceStatusbar); + break; + case VarItemListIndexFileBrowser: + scene_manager_set_scene_state( + app->scene_manager, MomentumAppSceneInterfaceFilebrowser, 0); + scene_manager_next_scene(app->scene_manager, MomentumAppSceneInterfaceFilebrowser); + break; + default: + break; + } + } + + return consumed; +} + +void momentum_app_scene_interface_on_exit(void* context) { + MomentumApp* app = context; + variable_item_list_reset(app->var_item_list); +} diff --git a/applications/main/momentum_app/scenes/momentum_app_scene_interface_filebrowser.c b/applications/main/momentum_app/scenes/momentum_app_scene_interface_filebrowser.c new file mode 100644 index 000000000..0a3f98b12 --- /dev/null +++ b/applications/main/momentum_app/scenes/momentum_app_scene_interface_filebrowser.c @@ -0,0 +1,124 @@ +#include "../momentum_app.h" + +enum VarItemListIndex { + VarItemListIndexSortDirsFirst, + VarItemListIndexShowHiddenFiles, + VarItemListIndexShowInternalTab, + VarItemListIndexFavoriteTimeout, +}; + +void momentum_app_scene_interface_filebrowser_var_item_list_callback(void* context, uint32_t index) { + MomentumApp* app = context; + view_dispatcher_send_custom_event(app->view_dispatcher, index); +} + +static void momentum_app_scene_interface_filebrowser_sort_dirs_first_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "ON" : "OFF"); + momentum_settings.sort_dirs_first = value; + app->save_settings = true; +} + +static void + momentum_app_scene_interface_filebrowser_show_hidden_files_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "ON" : "OFF"); + momentum_settings.show_hidden_files = value; + app->save_settings = true; +} + +static void + momentum_app_scene_interface_filebrowser_show_internal_tab_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "ON" : "OFF"); + momentum_settings.show_internal_tab = value; + app->save_settings = true; +} + +static void momentum_app_scene_interface_filebrowser_favorite_timeout_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); + uint32_t value = variable_item_get_current_value_index(item); + char text[6]; + snprintf(text, sizeof(text), "%lu S", value); + variable_item_set_current_value_text(item, value ? text : "OFF"); + momentum_settings.favorite_timeout = value; + app->save_settings = true; +} + +void momentum_app_scene_interface_filebrowser_on_enter(void* context) { + MomentumApp* app = context; + VariableItemList* var_item_list = app->var_item_list; + VariableItem* item; + + item = variable_item_list_add( + var_item_list, + "Folders Above Files", + 2, + momentum_app_scene_interface_filebrowser_sort_dirs_first_changed, + app); + variable_item_set_current_value_index(item, momentum_settings.sort_dirs_first); + variable_item_set_current_value_text(item, momentum_settings.sort_dirs_first ? "ON" : "OFF"); + + item = variable_item_list_add( + var_item_list, + "Show Hidden Files", + 2, + momentum_app_scene_interface_filebrowser_show_hidden_files_changed, + app); + variable_item_set_current_value_index(item, momentum_settings.show_hidden_files); + variable_item_set_current_value_text(item, momentum_settings.show_hidden_files ? "ON" : "OFF"); + + item = variable_item_list_add( + var_item_list, + "Show Internal Tab", + 2, + momentum_app_scene_interface_filebrowser_show_internal_tab_changed, + app); + variable_item_set_current_value_index(item, momentum_settings.show_internal_tab); + variable_item_set_current_value_text(item, momentum_settings.show_internal_tab ? "ON" : "OFF"); + + item = variable_item_list_add( + var_item_list, + "Favorite Timeout", + 61, + momentum_app_scene_interface_filebrowser_favorite_timeout_changed, + app); + variable_item_set_current_value_index(item, momentum_settings.favorite_timeout); + char text[4]; + snprintf(text, sizeof(text), "%lu S", momentum_settings.favorite_timeout); + variable_item_set_current_value_text(item, momentum_settings.favorite_timeout ? text : "OFF"); + + variable_item_list_set_enter_callback( + var_item_list, momentum_app_scene_interface_filebrowser_var_item_list_callback, app); + + variable_item_list_set_selected_item( + var_item_list, + scene_manager_get_scene_state(app->scene_manager, MomentumAppSceneInterfaceFilebrowser)); + + view_dispatcher_switch_to_view(app->view_dispatcher, MomentumAppViewVarItemList); +} + +bool momentum_app_scene_interface_filebrowser_on_event(void* context, SceneManagerEvent event) { + MomentumApp* app = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + scene_manager_set_scene_state( + app->scene_manager, MomentumAppSceneInterfaceFilebrowser, event.event); + consumed = true; + switch(event.event) { + default: + break; + } + } + + return consumed; +} + +void momentum_app_scene_interface_filebrowser_on_exit(void* context) { + MomentumApp* app = context; + variable_item_list_reset(app->var_item_list); +} diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_graphics.c b/applications/main/momentum_app/scenes/momentum_app_scene_interface_graphics.c similarity index 53% rename from applications/main/xtreme_app/scenes/xtreme_app_scene_interface_graphics.c rename to applications/main/momentum_app/scenes/momentum_app_scene_interface_graphics.c index f0f77b9f5..a1492a855 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_graphics.c +++ b/applications/main/momentum_app/scenes/momentum_app_scene_interface_graphics.c @@ -1,31 +1,26 @@ -#include "../xtreme_app.h" +#include "../momentum_app.h" enum VarItemListIndex { VarItemListIndexAssetPack, VarItemListIndexAnimSpeed, VarItemListIndexCycleAnims, VarItemListIndexUnlockAnims, - VarItemListIndexCreditsAnim, }; -void xtreme_app_scene_interface_graphics_var_item_list_callback(void* context, uint32_t index) { - XtremeApp* app = context; +void momentum_app_scene_interface_graphics_var_item_list_callback(void* context, uint32_t index) { + MomentumApp* app = context; view_dispatcher_send_custom_event(app->view_dispatcher, index); } -static void xtreme_app_scene_interface_graphics_asset_pack_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); +static void momentum_app_scene_interface_graphics_asset_pack_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); uint8_t index = variable_item_get_current_value_index(item); variable_item_set_current_value_text( item, index == 0 ? "Default" : *CharList_get(app->asset_pack_names, index - 1)); - variable_item_set_locked( - variable_item_list_get(app->var_item_list, VarItemListIndexCreditsAnim), - index != 0, - "Credits\nare in\ndefault pack!"); strlcpy( - xtreme_settings.asset_pack, + momentum_settings.asset_pack, index == 0 ? "" : *CharList_get(app->asset_pack_names, index - 1), - XTREME_ASSETS_PACK_NAME_LEN); + ASSET_PACKS_NAME_LEN); app->asset_pack_index = index; app->save_settings = true; app->apply_pack = true; @@ -59,11 +54,11 @@ const uint32_t anim_speed_values[COUNT_OF(anim_speed_names)] = { 275, 300, }; -static void xtreme_app_scene_interface_graphics_anim_speed_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); +static void momentum_app_scene_interface_graphics_anim_speed_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); uint8_t index = variable_item_get_current_value_index(item); variable_item_set_current_value_text(item, anim_speed_names[index]); - xtreme_settings.anim_speed = anim_speed_values[index]; + momentum_settings.anim_speed = anim_speed_values[index]; app->save_settings = true; } @@ -101,32 +96,24 @@ const int32_t cycle_anims_values[COUNT_OF(cycle_anims_names)] = { 43200, 86400, }; -static void xtreme_app_scene_interface_graphics_cycle_anims_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); +static void momentum_app_scene_interface_graphics_cycle_anims_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); uint8_t index = variable_item_get_current_value_index(item); variable_item_set_current_value_text(item, cycle_anims_names[index]); - xtreme_settings.cycle_anims = cycle_anims_values[index]; + momentum_settings.cycle_anims = cycle_anims_values[index]; app->save_settings = true; } -static void xtreme_app_scene_interface_graphics_unlock_anims_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); +static void momentum_app_scene_interface_graphics_unlock_anims_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); bool value = variable_item_get_current_value_index(item); variable_item_set_current_value_text(item, value ? "ON" : "OFF"); - xtreme_settings.unlock_anims = value; + momentum_settings.unlock_anims = value; app->save_settings = true; } -static void xtreme_app_scene_interface_graphics_credits_anim_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); - bool value = variable_item_get_current_value_index(item); - variable_item_set_current_value_text(item, value ? "ON" : "OFF"); - xtreme_settings.credits_anim = value; - app->save_settings = true; -} - -void xtreme_app_scene_interface_graphics_on_enter(void* context) { - XtremeApp* app = context; +void momentum_app_scene_interface_graphics_on_enter(void* context) { + MomentumApp* app = context; VariableItemList* var_item_list = app->var_item_list; VariableItem* item; uint8_t value_index; @@ -135,7 +122,7 @@ void xtreme_app_scene_interface_graphics_on_enter(void* context) { var_item_list, "Asset Pack", CharList_size(app->asset_pack_names) + 1, - xtreme_app_scene_interface_graphics_asset_pack_changed, + momentum_app_scene_interface_graphics_asset_pack_changed, app); variable_item_set_current_value_index(item, app->asset_pack_index); variable_item_set_current_value_text( @@ -148,10 +135,10 @@ void xtreme_app_scene_interface_graphics_on_enter(void* context) { var_item_list, "Anim Speed", COUNT_OF(anim_speed_names), - xtreme_app_scene_interface_graphics_anim_speed_changed, + momentum_app_scene_interface_graphics_anim_speed_changed, app); value_index = value_index_uint32( - xtreme_settings.anim_speed, anim_speed_values, COUNT_OF(anim_speed_values)); + momentum_settings.anim_speed, anim_speed_values, COUNT_OF(anim_speed_values)); variable_item_set_current_value_index(item, value_index); variable_item_set_current_value_text(item, anim_speed_names[value_index]); @@ -159,10 +146,10 @@ void xtreme_app_scene_interface_graphics_on_enter(void* context) { var_item_list, "Cycle Anims", COUNT_OF(cycle_anims_names), - xtreme_app_scene_interface_graphics_cycle_anims_changed, + momentum_app_scene_interface_graphics_cycle_anims_changed, app); value_index = value_index_int32( - xtreme_settings.cycle_anims, cycle_anims_values, COUNT_OF(cycle_anims_values)); + momentum_settings.cycle_anims, cycle_anims_values, COUNT_OF(cycle_anims_values)); variable_item_set_current_value_index(item, value_index); variable_item_set_current_value_text(item, cycle_anims_names[value_index]); @@ -170,38 +157,28 @@ void xtreme_app_scene_interface_graphics_on_enter(void* context) { var_item_list, "Unlock Anims", 2, - xtreme_app_scene_interface_graphics_unlock_anims_changed, + momentum_app_scene_interface_graphics_unlock_anims_changed, app); - variable_item_set_current_value_index(item, xtreme_settings.unlock_anims); - variable_item_set_current_value_text(item, xtreme_settings.unlock_anims ? "ON" : "OFF"); - - item = variable_item_list_add( - var_item_list, - "Credits Anim", - 2, - xtreme_app_scene_interface_graphics_credits_anim_changed, - app); - variable_item_set_current_value_index(item, xtreme_settings.credits_anim); - variable_item_set_current_value_text(item, xtreme_settings.credits_anim ? "ON" : "OFF"); - variable_item_set_locked(item, app->asset_pack_index != 0, "Credits\nare in\ndefault pack!"); + variable_item_set_current_value_index(item, momentum_settings.unlock_anims); + variable_item_set_current_value_text(item, momentum_settings.unlock_anims ? "ON" : "OFF"); variable_item_list_set_enter_callback( - var_item_list, xtreme_app_scene_interface_graphics_var_item_list_callback, app); + var_item_list, momentum_app_scene_interface_graphics_var_item_list_callback, app); variable_item_list_set_selected_item( var_item_list, - scene_manager_get_scene_state(app->scene_manager, XtremeAppSceneInterfaceGraphics)); + scene_manager_get_scene_state(app->scene_manager, MomentumAppSceneInterfaceGraphics)); - view_dispatcher_switch_to_view(app->view_dispatcher, XtremeAppViewVarItemList); + view_dispatcher_switch_to_view(app->view_dispatcher, MomentumAppViewVarItemList); } -bool xtreme_app_scene_interface_graphics_on_event(void* context, SceneManagerEvent event) { - XtremeApp* app = context; +bool momentum_app_scene_interface_graphics_on_event(void* context, SceneManagerEvent event) { + MomentumApp* app = context; bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { scene_manager_set_scene_state( - app->scene_manager, XtremeAppSceneInterfaceGraphics, event.event); + app->scene_manager, MomentumAppSceneInterfaceGraphics, event.event); consumed = true; switch(event.event) { default: @@ -212,7 +189,7 @@ bool xtreme_app_scene_interface_graphics_on_event(void* context, SceneManagerEve return consumed; } -void xtreme_app_scene_interface_graphics_on_exit(void* context) { - XtremeApp* app = context; +void momentum_app_scene_interface_graphics_on_exit(void* context) { + MomentumApp* app = context; variable_item_list_reset(app->var_item_list); } diff --git a/applications/main/momentum_app/scenes/momentum_app_scene_interface_lockscreen.c b/applications/main/momentum_app/scenes/momentum_app_scene_interface_lockscreen.c new file mode 100644 index 000000000..ff39fbfe6 --- /dev/null +++ b/applications/main/momentum_app/scenes/momentum_app_scene_interface_lockscreen.c @@ -0,0 +1,234 @@ +#include "../momentum_app.h" + +enum VarItemListIndex { + VarItemListIndexLockOnBoot, + VarItemListIndexFormatOn10BadPins, + VarItemListIndexPinUnlockFromApp, + VarItemListIndexShowTime, + VarItemListIndexShowSeconds, + VarItemListIndexShowDate, + VarItemListIndexShowStatusbar, + VarItemListIndexUnlockPrompt, +}; + +void momentum_app_scene_interface_lockscreen_var_item_list_callback(void* context, uint32_t index) { + MomentumApp* app = context; + view_dispatcher_send_custom_event(app->view_dispatcher, index); +} + +static void momentum_app_scene_interface_lockscreen_lock_on_boot_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "ON" : "OFF"); + momentum_settings.lock_on_boot = value; + app->save_settings = true; +} + +static void momentum_app_scene_interface_lockscreen_bad_pins_format_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "ON" : "OFF"); + momentum_settings.bad_pins_format = value; + app->save_settings = true; +} + +static void + momentum_app_scene_interface_lockscreen_allow_locked_rpc_commands_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "ON" : "OFF"); + momentum_settings.allow_locked_rpc_commands = value; + app->save_settings = true; +} + +static void + momentum_app_scene_interface_lockscreen_lockscreen_poweroff_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "ON" : "OFF"); + momentum_settings.lockscreen_poweroff = value; + app->save_settings = true; +} + +static void momentum_app_scene_interface_lockscreen_lockscreen_time_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "ON" : "OFF"); + momentum_settings.lockscreen_time = value; + app->save_settings = true; +} + +static void + momentum_app_scene_interface_lockscreen_lockscreen_seconds_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "ON" : "OFF"); + momentum_settings.lockscreen_seconds = value; + app->save_settings = true; +} + +static void momentum_app_scene_interface_lockscreen_lockscreen_date_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "ON" : "OFF"); + momentum_settings.lockscreen_date = value; + app->save_settings = true; +} + +static void + momentum_app_scene_interface_lockscreen_lockscreen_statusbar_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "ON" : "OFF"); + momentum_settings.lockscreen_statusbar = value; + app->save_settings = true; +} + +static void momentum_app_scene_interface_lockscreen_lockscreen_prompt_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "ON" : "OFF"); + momentum_settings.lockscreen_prompt = value; + app->save_settings = true; +} + +static void + momentum_app_scene_interface_lockscreen_lockscreen_transparent_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "ON" : "OFF"); + momentum_settings.lockscreen_transparent = value; + app->save_settings = true; +} + +void momentum_app_scene_interface_lockscreen_on_enter(void* context) { + MomentumApp* app = context; + VariableItemList* var_item_list = app->var_item_list; + VariableItem* item; + + item = variable_item_list_add( + var_item_list, + "Lock on Boot", + 2, + momentum_app_scene_interface_lockscreen_lock_on_boot_changed, + app); + variable_item_set_current_value_index(item, momentum_settings.lock_on_boot); + variable_item_set_current_value_text(item, momentum_settings.lock_on_boot ? "ON" : "OFF"); + + item = variable_item_list_add( + var_item_list, + "Format on 10 Bad PINs", + 2, + momentum_app_scene_interface_lockscreen_bad_pins_format_changed, + app); + variable_item_set_current_value_index(item, momentum_settings.bad_pins_format); + variable_item_set_current_value_text(item, momentum_settings.bad_pins_format ? "ON" : "OFF"); + + item = variable_item_list_add( + var_item_list, + "Allow RPC While Locked", + 2, + momentum_app_scene_interface_lockscreen_allow_locked_rpc_commands_changed, + app); + variable_item_set_current_value_index(item, momentum_settings.allow_locked_rpc_commands); + variable_item_set_current_value_text( + item, momentum_settings.allow_locked_rpc_commands ? "ON" : "OFF"); + + item = variable_item_list_add( + var_item_list, + "Allow Poweroff", + 2, + momentum_app_scene_interface_lockscreen_lockscreen_poweroff_changed, + app); + variable_item_set_current_value_index(item, momentum_settings.lockscreen_poweroff); + variable_item_set_current_value_text( + item, momentum_settings.lockscreen_poweroff ? "ON" : "OFF"); + + item = variable_item_list_add( + var_item_list, + "Show Time", + 2, + momentum_app_scene_interface_lockscreen_lockscreen_time_changed, + app); + variable_item_set_current_value_index(item, momentum_settings.lockscreen_time); + variable_item_set_current_value_text(item, momentum_settings.lockscreen_time ? "ON" : "OFF"); + + item = variable_item_list_add( + var_item_list, + "Show Seconds", + 2, + momentum_app_scene_interface_lockscreen_lockscreen_seconds_changed, + app); + variable_item_set_current_value_index(item, momentum_settings.lockscreen_seconds); + variable_item_set_current_value_text( + item, momentum_settings.lockscreen_seconds ? "ON" : "OFF"); + + item = variable_item_list_add( + var_item_list, + "Show Date", + 2, + momentum_app_scene_interface_lockscreen_lockscreen_date_changed, + app); + variable_item_set_current_value_index(item, momentum_settings.lockscreen_date); + variable_item_set_current_value_text(item, momentum_settings.lockscreen_date ? "ON" : "OFF"); + + item = variable_item_list_add( + var_item_list, + "Show Statusbar", + 2, + momentum_app_scene_interface_lockscreen_lockscreen_statusbar_changed, + app); + variable_item_set_current_value_index(item, momentum_settings.lockscreen_statusbar); + variable_item_set_current_value_text( + item, momentum_settings.lockscreen_statusbar ? "ON" : "OFF"); + + item = variable_item_list_add( + var_item_list, + "Unlock Prompt", + 2, + momentum_app_scene_interface_lockscreen_lockscreen_prompt_changed, + app); + variable_item_set_current_value_index(item, momentum_settings.lockscreen_prompt); + variable_item_set_current_value_text(item, momentum_settings.lockscreen_prompt ? "ON" : "OFF"); + + item = variable_item_list_add( + var_item_list, + "Transparent (see animation)", + 2, + momentum_app_scene_interface_lockscreen_lockscreen_transparent_changed, + app); + variable_item_set_current_value_index(item, momentum_settings.lockscreen_transparent); + variable_item_set_current_value_text( + item, momentum_settings.lockscreen_transparent ? "ON" : "OFF"); + + variable_item_list_set_enter_callback( + var_item_list, momentum_app_scene_interface_lockscreen_var_item_list_callback, app); + + variable_item_list_set_selected_item( + var_item_list, + scene_manager_get_scene_state(app->scene_manager, MomentumAppSceneInterfaceLockscreen)); + + view_dispatcher_switch_to_view(app->view_dispatcher, MomentumAppViewVarItemList); +} + +bool momentum_app_scene_interface_lockscreen_on_event(void* context, SceneManagerEvent event) { + MomentumApp* app = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + scene_manager_set_scene_state( + app->scene_manager, MomentumAppSceneInterfaceLockscreen, event.event); + consumed = true; + switch(event.event) { + default: + break; + } + } + + return consumed; +} + +void momentum_app_scene_interface_lockscreen_on_exit(void* context) { + MomentumApp* app = context; + variable_item_list_reset(app->var_item_list); +} diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_mainmenu.c b/applications/main/momentum_app/scenes/momentum_app_scene_interface_mainmenu.c similarity index 74% rename from applications/main/xtreme_app/scenes/xtreme_app_scene_interface_mainmenu.c rename to applications/main/momentum_app/scenes/momentum_app_scene_interface_mainmenu.c index 1e8551f6b..628ca60bb 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_mainmenu.c +++ b/applications/main/momentum_app/scenes/momentum_app_scene_interface_mainmenu.c @@ -1,4 +1,4 @@ -#include "../xtreme_app.h" +#include "../momentum_app.h" enum VarItemListIndex { VarItemListIndexMenuStyle, @@ -9,8 +9,8 @@ enum VarItemListIndex { VarItemListIndexRemoveApp, }; -void xtreme_app_scene_interface_mainmenu_var_item_list_callback(void* context, uint32_t index) { - XtremeApp* app = context; +void momentum_app_scene_interface_mainmenu_var_item_list_callback(void* context, uint32_t index) { + MomentumApp* app = context; view_dispatcher_send_custom_event(app->view_dispatcher, index); } @@ -24,16 +24,16 @@ const char* const menu_style_names[MenuStyleCount] = { "Compact", "Terminal", }; -static void xtreme_app_scene_interface_mainmenu_menu_style_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); +static void momentum_app_scene_interface_mainmenu_menu_style_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); uint8_t index = variable_item_get_current_value_index(item); variable_item_set_current_value_text(item, menu_style_names[index]); - xtreme_settings.menu_style = index; + momentum_settings.menu_style = index; app->save_settings = true; } -static void xtreme_app_scene_interface_mainmenu_app_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); +static void momentum_app_scene_interface_mainmenu_app_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); app->mainmenu_app_index = variable_item_get_current_value_index(item); variable_item_set_current_value_text( item, *CharList_get(app->mainmenu_app_labels, app->mainmenu_app_index)); @@ -43,8 +43,8 @@ static void xtreme_app_scene_interface_mainmenu_app_changed(VariableItem* item) variable_item_set_item_label(item, label); } -static void xtreme_app_scene_interface_mainmenu_move_app_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); +static void momentum_app_scene_interface_mainmenu_move_app_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); uint8_t idx = app->mainmenu_app_index; size_t size = CharList_size(app->mainmenu_app_labels); uint8_t dir = variable_item_get_current_value_index(item); @@ -65,8 +65,8 @@ static void xtreme_app_scene_interface_mainmenu_move_app_changed(VariableItem* i variable_item_set_current_value_index(item, 1); } -void xtreme_app_scene_interface_mainmenu_on_enter(void* context) { - XtremeApp* app = context; +void momentum_app_scene_interface_mainmenu_on_enter(void* context) { + MomentumApp* app = context; VariableItemList* var_item_list = app->var_item_list; VariableItem* item; @@ -74,16 +74,16 @@ void xtreme_app_scene_interface_mainmenu_on_enter(void* context) { var_item_list, "Menu Style", MenuStyleCount, - xtreme_app_scene_interface_mainmenu_menu_style_changed, + momentum_app_scene_interface_mainmenu_menu_style_changed, app); - variable_item_set_current_value_index(item, xtreme_settings.menu_style); - variable_item_set_current_value_text(item, menu_style_names[xtreme_settings.menu_style]); + variable_item_set_current_value_index(item, momentum_settings.menu_style); + variable_item_set_current_value_text(item, menu_style_names[momentum_settings.menu_style]); variable_item_list_add(var_item_list, "Reset Menu", 0, NULL, app); size_t count = CharList_size(app->mainmenu_app_labels); item = variable_item_list_add( - var_item_list, "App", count, xtreme_app_scene_interface_mainmenu_app_changed, app); + var_item_list, "App", count, momentum_app_scene_interface_mainmenu_app_changed, app); if(count) { app->mainmenu_app_index = CLAMP(app->mainmenu_app_index, count - 1, 0U); char label[20]; @@ -100,7 +100,7 @@ void xtreme_app_scene_interface_mainmenu_on_enter(void* context) { variable_item_list_add(var_item_list, "Add App", 0, NULL, app); item = variable_item_list_add( - var_item_list, "Move App", 3, xtreme_app_scene_interface_mainmenu_move_app_changed, app); + var_item_list, "Move App", 3, momentum_app_scene_interface_mainmenu_move_app_changed, app); variable_item_set_current_value_text(item, ""); variable_item_set_current_value_index(item, 1); variable_item_set_locked(item, count < 2, "Can't move\nwith less\nthan 2 apps!"); @@ -108,26 +108,26 @@ void xtreme_app_scene_interface_mainmenu_on_enter(void* context) { variable_item_list_add(var_item_list, "Remove App", 0, NULL, app); variable_item_list_set_enter_callback( - var_item_list, xtreme_app_scene_interface_mainmenu_var_item_list_callback, app); + var_item_list, momentum_app_scene_interface_mainmenu_var_item_list_callback, app); variable_item_list_set_selected_item( var_item_list, - scene_manager_get_scene_state(app->scene_manager, XtremeAppSceneInterfaceMainmenu)); + scene_manager_get_scene_state(app->scene_manager, MomentumAppSceneInterfaceMainmenu)); - view_dispatcher_switch_to_view(app->view_dispatcher, XtremeAppViewVarItemList); + view_dispatcher_switch_to_view(app->view_dispatcher, MomentumAppViewVarItemList); } -bool xtreme_app_scene_interface_mainmenu_on_event(void* context, SceneManagerEvent event) { - XtremeApp* app = context; +bool momentum_app_scene_interface_mainmenu_on_event(void* context, SceneManagerEvent event) { + MomentumApp* app = context; bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { scene_manager_set_scene_state( - app->scene_manager, XtremeAppSceneInterfaceMainmenu, event.event); + app->scene_manager, MomentumAppSceneInterfaceMainmenu, event.event); consumed = true; switch(event.event) { case VarItemListIndexResetMenu: - scene_manager_next_scene(app->scene_manager, XtremeAppSceneInterfaceMainmenuReset); + scene_manager_next_scene(app->scene_manager, MomentumAppSceneInterfaceMainmenuReset); break; case VarItemListIndexRemoveApp: if(!CharList_size(app->mainmenu_app_labels)) break; @@ -161,7 +161,7 @@ bool xtreme_app_scene_interface_mainmenu_on_event(void* context, SceneManagerEve break; } case VarItemListIndexAddApp: - scene_manager_next_scene(app->scene_manager, XtremeAppSceneInterfaceMainmenuAdd); + scene_manager_next_scene(app->scene_manager, MomentumAppSceneInterfaceMainmenuAdd); break; default: break; @@ -171,7 +171,7 @@ bool xtreme_app_scene_interface_mainmenu_on_event(void* context, SceneManagerEve return consumed; } -void xtreme_app_scene_interface_mainmenu_on_exit(void* context) { - XtremeApp* app = context; +void momentum_app_scene_interface_mainmenu_on_exit(void* context) { + MomentumApp* app = context; variable_item_list_reset(app->var_item_list); } diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_mainmenu_add.c b/applications/main/momentum_app/scenes/momentum_app_scene_interface_mainmenu_add.c similarity index 73% rename from applications/main/xtreme_app/scenes/xtreme_app_scene_interface_mainmenu_add.c rename to applications/main/momentum_app/scenes/momentum_app_scene_interface_mainmenu_add.c index b45163ead..7c5ccaf17 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_mainmenu_add.c +++ b/applications/main/momentum_app/scenes/momentum_app_scene_interface_mainmenu_add.c @@ -1,4 +1,4 @@ -#include "../xtreme_app.h" +#include "../momentum_app.h" enum SubmenuIndex { SubmenuIndexMainApp, @@ -18,13 +18,13 @@ static bool fap_selector_item_callback( } static void - xtreme_app_scene_interface_mainmenu_add_submenu_callback(void* context, uint32_t index) { - XtremeApp* app = context; - scene_manager_set_scene_state(app->scene_manager, XtremeAppSceneInterfaceMainmenuAdd, index); + momentum_app_scene_interface_mainmenu_add_submenu_callback(void* context, uint32_t index) { + MomentumApp* app = context; + scene_manager_set_scene_state(app->scene_manager, MomentumAppSceneInterfaceMainmenuAdd, index); switch(index) { case SubmenuIndexMainApp: - scene_manager_next_scene(app->scene_manager, XtremeAppSceneInterfaceMainmenuAddMain); + scene_manager_next_scene(app->scene_manager, MomentumAppSceneInterfaceMainmenuAddMain); break; case SubmenuIndexExternalApp: { const DialogsFileBrowserOptions browser_options = { @@ -53,7 +53,7 @@ static void app->save_mainmenu_apps = true; app->require_reboot = true; scene_manager_search_and_switch_to_previous_scene( - app->scene_manager, XtremeAppSceneInterfaceMainmenu); + app->scene_manager, MomentumAppSceneInterfaceMainmenu); } furi_string_free(temp_path); break; @@ -63,8 +63,8 @@ static void } } -void xtreme_app_scene_interface_mainmenu_add_on_enter(void* context) { - XtremeApp* app = context; +void momentum_app_scene_interface_mainmenu_add_on_enter(void* context) { + MomentumApp* app = context; Submenu* submenu = app->submenu; submenu_set_header(submenu, "Add Menu App:"); @@ -73,20 +73,20 @@ void xtreme_app_scene_interface_mainmenu_add_on_enter(void* context) { submenu, "Main App", SubmenuIndexMainApp, - xtreme_app_scene_interface_mainmenu_add_submenu_callback, + momentum_app_scene_interface_mainmenu_add_submenu_callback, app); submenu_add_item( submenu, "External App", SubmenuIndexExternalApp, - xtreme_app_scene_interface_mainmenu_add_submenu_callback, + momentum_app_scene_interface_mainmenu_add_submenu_callback, app); - view_dispatcher_switch_to_view(app->view_dispatcher, XtremeAppViewSubmenu); + view_dispatcher_switch_to_view(app->view_dispatcher, MomentumAppViewSubmenu); } -bool xtreme_app_scene_interface_mainmenu_add_on_event(void* context, SceneManagerEvent event) { +bool momentum_app_scene_interface_mainmenu_add_on_event(void* context, SceneManagerEvent event) { UNUSED(context); bool consumed = false; @@ -97,7 +97,7 @@ bool xtreme_app_scene_interface_mainmenu_add_on_event(void* context, SceneManage return consumed; } -void xtreme_app_scene_interface_mainmenu_add_on_exit(void* context) { - XtremeApp* app = context; +void momentum_app_scene_interface_mainmenu_add_on_exit(void* context) { + MomentumApp* app = context; submenu_reset(app->submenu); } diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_mainmenu_add_main.c b/applications/main/momentum_app/scenes/momentum_app_scene_interface_mainmenu_add_main.c similarity index 57% rename from applications/main/xtreme_app/scenes/xtreme_app_scene_interface_mainmenu_add_main.c rename to applications/main/momentum_app/scenes/momentum_app_scene_interface_mainmenu_add_main.c index 93aa15ec5..3a8772ee3 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_mainmenu_add_main.c +++ b/applications/main/momentum_app/scenes/momentum_app_scene_interface_mainmenu_add_main.c @@ -1,8 +1,8 @@ -#include "../xtreme_app.h" +#include "../momentum_app.h" static void - xtreme_app_scene_interface_mainmenu_add_main_submenu_callback(void* context, uint32_t index) { - XtremeApp* app = context; + momentum_app_scene_interface_mainmenu_add_main_submenu_callback(void* context, uint32_t index) { + MomentumApp* app = context; const char* name = (const char*)index; CharList_push_back(app->mainmenu_app_exes, strdup(name)); @@ -11,11 +11,11 @@ static void app->save_mainmenu_apps = true; app->require_reboot = true; scene_manager_search_and_switch_to_previous_scene( - app->scene_manager, XtremeAppSceneInterfaceMainmenu); + app->scene_manager, MomentumAppSceneInterfaceMainmenu); } -void xtreme_app_scene_interface_mainmenu_add_main_on_enter(void* context) { - XtremeApp* app = context; +void momentum_app_scene_interface_mainmenu_add_main_on_enter(void* context) { + MomentumApp* app = context; Submenu* submenu = app->submenu; for(size_t i = 0; i < FLIPPER_APPS_COUNT; i++) { @@ -23,7 +23,7 @@ void xtreme_app_scene_interface_mainmenu_add_main_on_enter(void* context) { submenu, FLIPPER_APPS[i].name, (uint32_t)FLIPPER_APPS[i].name, - xtreme_app_scene_interface_mainmenu_add_main_submenu_callback, + momentum_app_scene_interface_mainmenu_add_main_submenu_callback, app); } for(size_t i = 0; i < FLIPPER_EXTERNAL_APPS_COUNT - 1; i++) { @@ -31,14 +31,16 @@ void xtreme_app_scene_interface_mainmenu_add_main_on_enter(void* context) { submenu, FLIPPER_EXTERNAL_APPS[i].name, (uint32_t)FLIPPER_EXTERNAL_APPS[i].name, - xtreme_app_scene_interface_mainmenu_add_main_submenu_callback, + momentum_app_scene_interface_mainmenu_add_main_submenu_callback, app); } - view_dispatcher_switch_to_view(app->view_dispatcher, XtremeAppViewSubmenu); + view_dispatcher_switch_to_view(app->view_dispatcher, MomentumAppViewSubmenu); } -bool xtreme_app_scene_interface_mainmenu_add_main_on_event(void* context, SceneManagerEvent event) { +bool momentum_app_scene_interface_mainmenu_add_main_on_event( + void* context, + SceneManagerEvent event) { UNUSED(context); bool consumed = false; @@ -49,7 +51,7 @@ bool xtreme_app_scene_interface_mainmenu_add_main_on_event(void* context, SceneM return consumed; } -void xtreme_app_scene_interface_mainmenu_add_main_on_exit(void* context) { - XtremeApp* app = context; +void momentum_app_scene_interface_mainmenu_add_main_on_exit(void* context) { + MomentumApp* app = context; submenu_reset(app->submenu); } diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_mainmenu_reset.c b/applications/main/momentum_app/scenes/momentum_app_scene_interface_mainmenu_reset.c similarity index 64% rename from applications/main/xtreme_app/scenes/xtreme_app_scene_interface_mainmenu_reset.c rename to applications/main/momentum_app/scenes/momentum_app_scene_interface_mainmenu_reset.c index c797ff288..8c7cef91f 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_mainmenu_reset.c +++ b/applications/main/momentum_app/scenes/momentum_app_scene_interface_mainmenu_reset.c @@ -1,15 +1,15 @@ -#include "../xtreme_app.h" +#include "../momentum_app.h" -static void xtreme_app_scene_interface_mainmenu_reset_dialog_callback( +static void momentum_app_scene_interface_mainmenu_reset_dialog_callback( DialogExResult result, void* context) { - XtremeApp* app = context; + MomentumApp* app = context; view_dispatcher_send_custom_event(app->view_dispatcher, result); } -void xtreme_app_scene_interface_mainmenu_reset_on_enter(void* context) { - XtremeApp* app = context; +void momentum_app_scene_interface_mainmenu_reset_on_enter(void* context) { + MomentumApp* app = context; DialogEx* dialog_ex = app->dialog_ex; dialog_ex_set_header(dialog_ex, "Reset Menu Apps?", 64, 10, AlignCenter, AlignCenter); @@ -19,23 +19,23 @@ void xtreme_app_scene_interface_mainmenu_reset_on_enter(void* context) { dialog_ex_set_context(dialog_ex, app); dialog_ex_set_result_callback( - dialog_ex, xtreme_app_scene_interface_mainmenu_reset_dialog_callback); + dialog_ex, momentum_app_scene_interface_mainmenu_reset_dialog_callback); - view_dispatcher_switch_to_view(app->view_dispatcher, XtremeAppViewDialogEx); + view_dispatcher_switch_to_view(app->view_dispatcher, MomentumAppViewDialogEx); } -bool xtreme_app_scene_interface_mainmenu_reset_on_event(void* context, SceneManagerEvent event) { - XtremeApp* app = context; +bool momentum_app_scene_interface_mainmenu_reset_on_event(void* context, SceneManagerEvent event) { + MomentumApp* app = context; bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { switch(event.event) { case DialogExResultRight: - storage_common_remove(furi_record_open(RECORD_STORAGE), XTREME_MENU_PATH); + storage_common_remove(furi_record_open(RECORD_STORAGE), MAINMENU_APPS_PATH); furi_record_close(RECORD_STORAGE); app->save_mainmenu_apps = false; app->require_reboot = true; - xtreme_app_apply(app); + momentum_app_apply(app); break; case DialogExResultLeft: scene_manager_previous_scene(app->scene_manager); @@ -50,8 +50,8 @@ bool xtreme_app_scene_interface_mainmenu_reset_on_event(void* context, SceneMana return consumed; } -void xtreme_app_scene_interface_mainmenu_reset_on_exit(void* context) { - XtremeApp* app = context; +void momentum_app_scene_interface_mainmenu_reset_on_exit(void* context) { + MomentumApp* app = context; DialogEx* dialog_ex = app->dialog_ex; dialog_ex_reset(dialog_ex); diff --git a/applications/main/momentum_app/scenes/momentum_app_scene_interface_statusbar.c b/applications/main/momentum_app/scenes/momentum_app_scene_interface_statusbar.c new file mode 100644 index 000000000..618cc5f80 --- /dev/null +++ b/applications/main/momentum_app/scenes/momentum_app_scene_interface_statusbar.c @@ -0,0 +1,147 @@ +#include "../momentum_app.h" + +enum VarItemListIndex { + VarItemListIndexBatteryIcon, + VarItemListIndexShowClock, + VarItemListIndexStatusIcons, + VarItemListIndexBarBorders, + VarItemListIndexBarBackground, +}; + +void momentum_app_scene_interface_statusbar_var_item_list_callback(void* context, uint32_t index) { + MomentumApp* app = context; + view_dispatcher_send_custom_event(app->view_dispatcher, index); +} + +const char* const battery_icon_names[BatteryIconCount] = { + "OFF", + "Bar", + "%", + "Inv. %", + "Retro 3", + "Retro 5", + "Bar %", +}; +static void momentum_app_scene_interface_statusbar_battery_icon_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); + uint8_t index = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, battery_icon_names[index]); + momentum_settings.battery_icon = index; + app->save_settings = true; + power_set_battery_icon_enabled(furi_record_open(RECORD_POWER), index != BatteryIconOff); + furi_record_close(RECORD_POWER); +} + +static void momentum_app_scene_interface_statusbar_statusbar_clock_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "ON" : "OFF"); + momentum_settings.statusbar_clock = value; + app->save_settings = true; +} + +static void momentum_app_scene_interface_statusbar_status_icons_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "ON" : "OFF"); + momentum_settings.status_icons = value; + app->save_settings = true; +} + +static void momentum_app_scene_interface_statusbar_bar_borders_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "ON" : "OFF"); + momentum_settings.bar_borders = value; + app->save_settings = true; +} + +static void momentum_app_scene_interface_statusbar_bar_background_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "ON" : "OFF"); + momentum_settings.bar_background = value; + app->save_settings = true; +} + +void momentum_app_scene_interface_statusbar_on_enter(void* context) { + MomentumApp* app = context; + VariableItemList* var_item_list = app->var_item_list; + VariableItem* item; + + item = variable_item_list_add( + var_item_list, + "Battery Icon", + BatteryIconCount, + momentum_app_scene_interface_statusbar_battery_icon_changed, + app); + variable_item_set_current_value_index(item, momentum_settings.battery_icon); + variable_item_set_current_value_text(item, battery_icon_names[momentum_settings.battery_icon]); + + item = variable_item_list_add( + var_item_list, + "Show Clock", + 2, + momentum_app_scene_interface_statusbar_statusbar_clock_changed, + app); + variable_item_set_current_value_index(item, momentum_settings.statusbar_clock); + variable_item_set_current_value_text(item, momentum_settings.statusbar_clock ? "ON" : "OFF"); + + item = variable_item_list_add( + var_item_list, + "Status Icons", + 2, + momentum_app_scene_interface_statusbar_status_icons_changed, + app); + variable_item_set_current_value_index(item, momentum_settings.status_icons); + variable_item_set_current_value_text(item, momentum_settings.status_icons ? "ON" : "OFF"); + + item = variable_item_list_add( + var_item_list, + "Bar Borders", + 2, + momentum_app_scene_interface_statusbar_bar_borders_changed, + app); + variable_item_set_current_value_index(item, momentum_settings.bar_borders); + variable_item_set_current_value_text(item, momentum_settings.bar_borders ? "ON" : "OFF"); + + item = variable_item_list_add( + var_item_list, + "Bar Background", + 2, + momentum_app_scene_interface_statusbar_bar_background_changed, + app); + variable_item_set_current_value_index(item, momentum_settings.bar_background); + variable_item_set_current_value_text(item, momentum_settings.bar_background ? "ON" : "OFF"); + + variable_item_list_set_enter_callback( + var_item_list, momentum_app_scene_interface_statusbar_var_item_list_callback, app); + + variable_item_list_set_selected_item( + var_item_list, + scene_manager_get_scene_state(app->scene_manager, MomentumAppSceneInterfaceStatusbar)); + + view_dispatcher_switch_to_view(app->view_dispatcher, MomentumAppViewVarItemList); +} + +bool momentum_app_scene_interface_statusbar_on_event(void* context, SceneManagerEvent event) { + MomentumApp* app = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + scene_manager_set_scene_state( + app->scene_manager, MomentumAppSceneInterfaceStatusbar, event.event); + consumed = true; + switch(event.event) { + default: + break; + } + } + + return consumed; +} + +void momentum_app_scene_interface_statusbar_on_exit(void* context) { + MomentumApp* app = context; + variable_item_list_reset(app->var_item_list); +} diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_misc.c b/applications/main/momentum_app/scenes/momentum_app_scene_misc.c similarity index 54% rename from applications/main/xtreme_app/scenes/xtreme_app_scene_misc.c rename to applications/main/momentum_app/scenes/momentum_app_scene_misc.c index 8b74d2bb8..1cff3957f 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_misc.c +++ b/applications/main/momentum_app/scenes/momentum_app_scene_misc.c @@ -1,31 +1,31 @@ -#include "../xtreme_app.h" +#include "../momentum_app.h" enum VarItemListIndex { VarItemListIndexScreen, VarItemListIndexDolphin, VarItemListIndexChangeDeviceName, VarItemListIndexChargeCap, - VarItemListIndexShowXtremeIntro, + VarItemListIndexShowMomentumIntro, }; -void xtreme_app_scene_misc_var_item_list_callback(void* context, uint32_t index) { - XtremeApp* app = context; +void momentum_app_scene_misc_var_item_list_callback(void* context, uint32_t index) { + MomentumApp* app = context; view_dispatcher_send_custom_event(app->view_dispatcher, index); } #define CHARGE_CAP_INTV 5 -static void xtreme_app_scene_misc_charge_cap_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); +static void momentum_app_scene_misc_charge_cap_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); char cap_str[6]; uint32_t value = (variable_item_get_current_value_index(item) + 1) * CHARGE_CAP_INTV; snprintf(cap_str, 6, "%lu%%", value); variable_item_set_current_value_text(item, cap_str); - xtreme_settings.charge_cap = value; + momentum_settings.charge_cap = value; app->save_settings = true; } -void xtreme_app_scene_misc_on_enter(void* context) { - XtremeApp* app = context; +void momentum_app_scene_misc_on_enter(void* context) { + MomentumApp* app = context; VariableItemList* var_item_list = app->var_item_list; VariableItem* item; uint8_t value_index; @@ -39,56 +39,56 @@ void xtreme_app_scene_misc_on_enter(void* context) { variable_item_list_add(var_item_list, "Change Device Name", 0, NULL, app); char cap_str[6]; - value_index = xtreme_settings.charge_cap / CHARGE_CAP_INTV; + value_index = momentum_settings.charge_cap / CHARGE_CAP_INTV; snprintf(cap_str, 6, "%lu%%", (uint32_t)value_index * CHARGE_CAP_INTV); item = variable_item_list_add( var_item_list, "Charge Cap", 100 / CHARGE_CAP_INTV, - xtreme_app_scene_misc_charge_cap_changed, + momentum_app_scene_misc_charge_cap_changed, app); variable_item_set_current_value_index(item, value_index - 1); variable_item_set_current_value_text(item, cap_str); - variable_item_list_add(var_item_list, "Show Xtreme Intro", 0, NULL, app); + variable_item_list_add(var_item_list, "Show Momentum Intro", 0, NULL, app); variable_item_list_set_enter_callback( - var_item_list, xtreme_app_scene_misc_var_item_list_callback, app); + var_item_list, momentum_app_scene_misc_var_item_list_callback, app); variable_item_list_set_selected_item( - var_item_list, scene_manager_get_scene_state(app->scene_manager, XtremeAppSceneMisc)); + var_item_list, scene_manager_get_scene_state(app->scene_manager, MomentumAppSceneMisc)); - view_dispatcher_switch_to_view(app->view_dispatcher, XtremeAppViewVarItemList); + view_dispatcher_switch_to_view(app->view_dispatcher, MomentumAppViewVarItemList); } -bool xtreme_app_scene_misc_on_event(void* context, SceneManagerEvent event) { - XtremeApp* app = context; +bool momentum_app_scene_misc_on_event(void* context, SceneManagerEvent event) { + MomentumApp* app = context; bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { - scene_manager_set_scene_state(app->scene_manager, XtremeAppSceneMisc, event.event); + scene_manager_set_scene_state(app->scene_manager, MomentumAppSceneMisc, event.event); consumed = true; switch(event.event) { case VarItemListIndexScreen: - scene_manager_set_scene_state(app->scene_manager, XtremeAppSceneMiscScreen, 0); - scene_manager_next_scene(app->scene_manager, XtremeAppSceneMiscScreen); + scene_manager_set_scene_state(app->scene_manager, MomentumAppSceneMiscScreen, 0); + scene_manager_next_scene(app->scene_manager, MomentumAppSceneMiscScreen); break; case VarItemListIndexDolphin: - scene_manager_set_scene_state(app->scene_manager, XtremeAppSceneMiscDolphin, 0); - scene_manager_next_scene(app->scene_manager, XtremeAppSceneMiscDolphin); + scene_manager_set_scene_state(app->scene_manager, MomentumAppSceneMiscDolphin, 0); + scene_manager_next_scene(app->scene_manager, MomentumAppSceneMiscDolphin); break; case VarItemListIndexChangeDeviceName: - scene_manager_set_scene_state(app->scene_manager, XtremeAppSceneMiscRename, 0); - scene_manager_next_scene(app->scene_manager, XtremeAppSceneMiscRename); + scene_manager_set_scene_state(app->scene_manager, MomentumAppSceneMiscRename, 0); + scene_manager_next_scene(app->scene_manager, MomentumAppSceneMiscRename); break; - case VarItemListIndexShowXtremeIntro: { + case VarItemListIndexShowMomentumIntro: { for(int i = 0; i < 10; i++) { if(storage_common_copy( furi_record_open(RECORD_STORAGE), - EXT_PATH("dolphin/xfwfirstboot.bin"), + EXT_PATH("dolphin/firstboot.bin"), EXT_PATH(".slideshow"))) { app->show_slideshow = true; - xtreme_app_apply(app); + momentum_app_apply(app); break; } } @@ -102,7 +102,7 @@ bool xtreme_app_scene_misc_on_event(void* context, SceneManagerEvent event) { return consumed; } -void xtreme_app_scene_misc_on_exit(void* context) { - XtremeApp* app = context; +void momentum_app_scene_misc_on_exit(void* context) { + MomentumApp* app = context; variable_item_list_reset(app->var_item_list); } diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_misc_dolphin.c b/applications/main/momentum_app/scenes/momentum_app_scene_misc_dolphin.c similarity index 62% rename from applications/main/xtreme_app/scenes/xtreme_app_scene_misc_dolphin.c rename to applications/main/momentum_app/scenes/momentum_app_scene_misc_dolphin.c index 06881e629..49cbf0132 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_misc_dolphin.c +++ b/applications/main/momentum_app/scenes/momentum_app_scene_misc_dolphin.c @@ -1,4 +1,4 @@ -#include "../xtreme_app.h" +#include "../momentum_app.h" enum VarItemListIndex { VarItemListIndexDolphinLevel, @@ -6,13 +6,13 @@ enum VarItemListIndex { VarItemListIndexButthurtTimer, }; -void xtreme_app_scene_misc_dolphin_var_item_list_callback(void* context, uint32_t index) { - XtremeApp* app = context; +void momentum_app_scene_misc_dolphin_var_item_list_callback(void* context, uint32_t index) { + MomentumApp* app = context; view_dispatcher_send_custom_event(app->view_dispatcher, index); } -static void xtreme_app_scene_misc_dolphin_dolphin_level_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); +static void momentum_app_scene_misc_dolphin_dolphin_level_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); app->dolphin_level = variable_item_get_current_value_index(item) + 1; char level_str[4]; snprintf(level_str, 4, "%li", app->dolphin_level); @@ -20,8 +20,8 @@ static void xtreme_app_scene_misc_dolphin_dolphin_level_changed(VariableItem* it app->save_level = true; } -static void xtreme_app_scene_misc_dolphin_dolphin_angry_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); +static void momentum_app_scene_misc_dolphin_dolphin_angry_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); app->dolphin_angry = variable_item_get_current_value_index(item); char angry_str[4]; snprintf(angry_str, 4, "%li", app->dolphin_angry); @@ -53,17 +53,17 @@ const uint32_t butthurt_timer_values[COUNT_OF(butthurt_timer_names)] = { 86400, 172800, }; -static void xtreme_app_scene_misc_dolphin_butthurt_timer_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); +static void momentum_app_scene_misc_dolphin_butthurt_timer_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); uint8_t index = variable_item_get_current_value_index(item); variable_item_set_current_value_text(item, butthurt_timer_names[index]); - xtreme_settings.butthurt_timer = butthurt_timer_values[index]; + momentum_settings.butthurt_timer = butthurt_timer_values[index]; app->save_settings = true; app->require_reboot = true; } -void xtreme_app_scene_misc_dolphin_on_enter(void* context) { - XtremeApp* app = context; +void momentum_app_scene_misc_dolphin_on_enter(void* context) { + MomentumApp* app = context; VariableItemList* var_item_list = app->var_item_list; VariableItem* item; uint8_t value_index; @@ -74,7 +74,7 @@ void xtreme_app_scene_misc_dolphin_on_enter(void* context) { var_item_list, "Dolphin Level", DOLPHIN_LEVEL_COUNT + 1, - xtreme_app_scene_misc_dolphin_dolphin_level_changed, + momentum_app_scene_misc_dolphin_dolphin_level_changed, app); variable_item_set_current_value_index(item, app->dolphin_level - 1); variable_item_set_current_value_text(item, level_str); @@ -85,7 +85,7 @@ void xtreme_app_scene_misc_dolphin_on_enter(void* context) { var_item_list, "Dolphin Angry", BUTTHURT_MAX + 1, - xtreme_app_scene_misc_dolphin_dolphin_angry_changed, + momentum_app_scene_misc_dolphin_dolphin_angry_changed, app); variable_item_set_current_value_index(item, app->dolphin_angry); variable_item_set_current_value_text(item, angry_str); @@ -94,29 +94,30 @@ void xtreme_app_scene_misc_dolphin_on_enter(void* context) { var_item_list, "Butthurt Timer", COUNT_OF(butthurt_timer_names), - xtreme_app_scene_misc_dolphin_butthurt_timer_changed, + momentum_app_scene_misc_dolphin_butthurt_timer_changed, app); value_index = value_index_uint32( - xtreme_settings.butthurt_timer, butthurt_timer_values, COUNT_OF(butthurt_timer_values)); + momentum_settings.butthurt_timer, butthurt_timer_values, COUNT_OF(butthurt_timer_values)); variable_item_set_current_value_index(item, value_index); variable_item_set_current_value_text(item, butthurt_timer_names[value_index]); variable_item_list_set_enter_callback( - var_item_list, xtreme_app_scene_misc_dolphin_var_item_list_callback, app); + var_item_list, momentum_app_scene_misc_dolphin_var_item_list_callback, app); variable_item_list_set_selected_item( var_item_list, - scene_manager_get_scene_state(app->scene_manager, XtremeAppSceneMiscDolphin)); + scene_manager_get_scene_state(app->scene_manager, MomentumAppSceneMiscDolphin)); - view_dispatcher_switch_to_view(app->view_dispatcher, XtremeAppViewVarItemList); + view_dispatcher_switch_to_view(app->view_dispatcher, MomentumAppViewVarItemList); } -bool xtreme_app_scene_misc_dolphin_on_event(void* context, SceneManagerEvent event) { - XtremeApp* app = context; +bool momentum_app_scene_misc_dolphin_on_event(void* context, SceneManagerEvent event) { + MomentumApp* app = context; bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { - scene_manager_set_scene_state(app->scene_manager, XtremeAppSceneMiscDolphin, event.event); + scene_manager_set_scene_state( + app->scene_manager, MomentumAppSceneMiscDolphin, event.event); consumed = true; switch(event.event) { default: @@ -127,7 +128,7 @@ bool xtreme_app_scene_misc_dolphin_on_event(void* context, SceneManagerEvent eve return consumed; } -void xtreme_app_scene_misc_dolphin_on_exit(void* context) { - XtremeApp* app = context; +void momentum_app_scene_misc_dolphin_on_exit(void* context) { + MomentumApp* app = context; variable_item_list_reset(app->var_item_list); } diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_misc_rename.c b/applications/main/momentum_app/scenes/momentum_app_scene_misc_rename.c similarity index 60% rename from applications/main/xtreme_app/scenes/xtreme_app_scene_misc_rename.c rename to applications/main/momentum_app/scenes/momentum_app_scene_misc_rename.c index dd01a60ca..5f0127dfd 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_misc_rename.c +++ b/applications/main/momentum_app/scenes/momentum_app_scene_misc_rename.c @@ -1,11 +1,11 @@ -#include "../xtreme_app.h" +#include "../momentum_app.h" enum TextInputIndex { TextInputResultOk, }; -static void xtreme_app_scene_misc_rename_text_input_callback(void* context) { - XtremeApp* app = context; +static void momentum_app_scene_misc_rename_text_input_callback(void* context) { + MomentumApp* app = context; app->save_name = true; app->require_reboot = true; @@ -13,7 +13,7 @@ static void xtreme_app_scene_misc_rename_text_input_callback(void* context) { } static bool - xtreme_app_scene_misc_rename_validator(const char* text, FuriString* error, void* context) { + momentum_app_scene_misc_rename_validator(const char* text, FuriString* error, void* context) { UNUSED(context); for(; *text; ++text) { @@ -27,29 +27,29 @@ static bool return true; } -void xtreme_app_scene_misc_rename_on_enter(void* context) { - XtremeApp* app = context; +void momentum_app_scene_misc_rename_on_enter(void* context) { + MomentumApp* app = context; TextInput* text_input = app->text_input; text_input_set_header_text(text_input, "Leave empty for default"); - text_input_set_validator(text_input, xtreme_app_scene_misc_rename_validator, NULL); + text_input_set_validator(text_input, momentum_app_scene_misc_rename_validator, NULL); text_input_set_minimum_length(text_input, 0); text_input_set_result_callback( text_input, - xtreme_app_scene_misc_rename_text_input_callback, + momentum_app_scene_misc_rename_text_input_callback, app, app->device_name, FURI_HAL_VERSION_ARRAY_NAME_LENGTH, true); - view_dispatcher_switch_to_view(app->view_dispatcher, XtremeAppViewTextInput); + view_dispatcher_switch_to_view(app->view_dispatcher, MomentumAppViewTextInput); } -bool xtreme_app_scene_misc_rename_on_event(void* context, SceneManagerEvent event) { - XtremeApp* app = context; +bool momentum_app_scene_misc_rename_on_event(void* context, SceneManagerEvent event) { + MomentumApp* app = context; bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { @@ -66,7 +66,7 @@ bool xtreme_app_scene_misc_rename_on_event(void* context, SceneManagerEvent even return consumed; } -void xtreme_app_scene_misc_rename_on_exit(void* context) { - XtremeApp* app = context; +void momentum_app_scene_misc_rename_on_exit(void* context) { + MomentumApp* app = context; text_input_reset(app->text_input); } diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_misc_screen.c b/applications/main/momentum_app/scenes/momentum_app_scene_misc_screen.c similarity index 68% rename from applications/main/xtreme_app/scenes/xtreme_app_scene_misc_screen.c rename to applications/main/momentum_app/scenes/momentum_app_scene_misc_screen.c index ba5cae6d0..ef0d04468 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_misc_screen.c +++ b/applications/main/momentum_app/scenes/momentum_app_scene_misc_screen.c @@ -1,4 +1,4 @@ -#include "../xtreme_app.h" +#include "../momentum_app.h" enum VarItemListIndex { VarItemListIndexDarkMode, @@ -13,20 +13,20 @@ enum VarItemListIndex { VarItemListIndexRainbowSaturation, }; -void xtreme_app_scene_misc_screen_var_item_list_callback(void* context, uint32_t index) { - XtremeApp* app = context; +void momentum_app_scene_misc_screen_var_item_list_callback(void* context, uint32_t index) { + MomentumApp* app = context; view_dispatcher_send_custom_event(app->view_dispatcher, index); } -static void xtreme_app_scene_misc_screen_dark_mode_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); +static void momentum_app_scene_misc_screen_dark_mode_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); bool value = variable_item_get_current_value_index(item); variable_item_set_current_value_text(item, value ? "ON" : "OFF"); - xtreme_settings.dark_mode = value; + momentum_settings.dark_mode = value; app->save_settings = true; } -static void xtreme_app_scene_misc_screen_hand_orient_changed(VariableItem* item) { +static void momentum_app_scene_misc_screen_hand_orient_changed(VariableItem* item) { bool value = variable_item_get_current_value_index(item); variable_item_set_current_value_text(item, value ? "ON" : "OFF"); if(value) { @@ -49,29 +49,29 @@ static const struct { {"White", {255, 192, 203}}, }; static const size_t lcd_sz = COUNT_OF(lcd_colors); -static void xtreme_app_scene_misc_screen_lcd_color_changed(VariableItem* item, uint8_t led) { - XtremeApp* app = variable_item_get_context(item); +static void momentum_app_scene_misc_screen_lcd_color_changed(VariableItem* item, uint8_t led) { + MomentumApp* app = variable_item_get_context(item); uint8_t index = variable_item_get_current_value_index(item); variable_item_set_current_value_text(item, lcd_colors[index].name); rgb_backlight_set_color(led, &lcd_colors[index].color); app->save_backlight = true; } -static void xtreme_app_scene_misc_screen_lcd_color_0_changed(VariableItem* item) { - xtreme_app_scene_misc_screen_lcd_color_changed(item, 0); +static void momentum_app_scene_misc_screen_lcd_color_0_changed(VariableItem* item) { + momentum_app_scene_misc_screen_lcd_color_changed(item, 0); } -static void xtreme_app_scene_misc_screen_lcd_color_1_changed(VariableItem* item) { - xtreme_app_scene_misc_screen_lcd_color_changed(item, 1); +static void momentum_app_scene_misc_screen_lcd_color_1_changed(VariableItem* item) { + momentum_app_scene_misc_screen_lcd_color_changed(item, 1); } -static void xtreme_app_scene_misc_screen_lcd_color_2_changed(VariableItem* item) { - xtreme_app_scene_misc_screen_lcd_color_changed(item, 2); +static void momentum_app_scene_misc_screen_lcd_color_2_changed(VariableItem* item) { + momentum_app_scene_misc_screen_lcd_color_changed(item, 2); } static const struct { uint8_t led; VariableItemChangeCallback cb; } lcd_cols[] = { - {0, xtreme_app_scene_misc_screen_lcd_color_0_changed}, - {1, xtreme_app_scene_misc_screen_lcd_color_1_changed}, - {2, xtreme_app_scene_misc_screen_lcd_color_2_changed}, + {0, momentum_app_scene_misc_screen_lcd_color_0_changed}, + {1, momentum_app_scene_misc_screen_lcd_color_1_changed}, + {2, momentum_app_scene_misc_screen_lcd_color_2_changed}, }; const char* const rainbow_lcd_names[RGBBacklightRainbowModeCount] = { @@ -79,16 +79,16 @@ const char* const rainbow_lcd_names[RGBBacklightRainbowModeCount] = { "Wave", "Static", }; -static void xtreme_app_scene_misc_screen_rainbow_lcd_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); +static void momentum_app_scene_misc_screen_rainbow_lcd_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); uint8_t index = variable_item_get_current_value_index(item); variable_item_set_current_value_text(item, rainbow_lcd_names[index]); rgb_backlight_set_rainbow_mode(index); app->save_backlight = true; } -static void xtreme_app_scene_misc_screen_rainbow_speed_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); +static void momentum_app_scene_misc_screen_rainbow_speed_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); uint8_t index = variable_item_get_current_value_index(item) + 1; char str[4]; snprintf(str, sizeof(str), "%d", index); @@ -129,16 +129,16 @@ const uint32_t rainbow_interval_values[COUNT_OF(rainbow_interval_names)] = { 4000, 5000, }; -static void xtreme_app_scene_misc_screen_rainbow_interval_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); +static void momentum_app_scene_misc_screen_rainbow_interval_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); uint8_t index = variable_item_get_current_value_index(item); variable_item_set_current_value_text(item, rainbow_interval_names[index]); rgb_backlight_set_rainbow_interval(rainbow_interval_values[index]); app->save_backlight = true; } -static void xtreme_app_scene_misc_screen_rainbow_saturation_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); +static void momentum_app_scene_misc_screen_rainbow_saturation_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); uint8_t index = variable_item_get_current_value_index(item) + 1; char str[4]; snprintf(str, sizeof(str), "%d", index); @@ -147,25 +147,25 @@ static void xtreme_app_scene_misc_screen_rainbow_saturation_changed(VariableItem app->save_backlight = true; } -void xtreme_app_scene_misc_screen_on_enter(void* context) { - XtremeApp* app = context; +void momentum_app_scene_misc_screen_on_enter(void* context) { + MomentumApp* app = context; VariableItemList* var_item_list = app->var_item_list; VariableItem* item; uint8_t value_index; item = variable_item_list_add( - var_item_list, "Dark Mode", 2, xtreme_app_scene_misc_screen_dark_mode_changed, app); - variable_item_set_current_value_index(item, xtreme_settings.dark_mode); - variable_item_set_current_value_text(item, xtreme_settings.dark_mode ? "ON" : "OFF"); + var_item_list, "Dark Mode", 2, momentum_app_scene_misc_screen_dark_mode_changed, app); + variable_item_set_current_value_index(item, momentum_settings.dark_mode); + variable_item_set_current_value_text(item, momentum_settings.dark_mode ? "ON" : "OFF"); item = variable_item_list_add( - var_item_list, "Left Handed", 2, xtreme_app_scene_misc_screen_hand_orient_changed, app); + var_item_list, "Left Handed", 2, momentum_app_scene_misc_screen_hand_orient_changed, app); bool value = furi_hal_rtc_is_flag_set(FuriHalRtcFlagHandOrient); variable_item_set_current_value_index(item, value); variable_item_set_current_value_text(item, value ? "ON" : "OFF"); item = variable_item_list_add(var_item_list, "RGB Backlight", 1, NULL, app); - variable_item_set_current_value_text(item, xtreme_settings.rgb_backlight ? "ON" : "OFF"); + variable_item_set_current_value_text(item, momentum_settings.rgb_backlight ? "ON" : "OFF"); RgbColor color; for(size_t i = 0; i < COUNT_OF(lcd_cols); i++) { @@ -188,38 +188,38 @@ void xtreme_app_scene_misc_screen_on_enter(void* context) { snprintf(str, sizeof(str), "%02X%02X%02X", color.r, color.g, color.b); variable_item_set_current_value_text(item, str); } - variable_item_set_locked(item, !xtreme_settings.rgb_backlight, "Needs RGB\nBacklight!"); + variable_item_set_locked(item, !momentum_settings.rgb_backlight, "Needs RGB\nBacklight!"); } item = variable_item_list_add( var_item_list, "Rainbow LCD", RGBBacklightRainbowModeCount, - xtreme_app_scene_misc_screen_rainbow_lcd_changed, + momentum_app_scene_misc_screen_rainbow_lcd_changed, app); value_index = rgb_backlight_get_rainbow_mode(); variable_item_set_current_value_index(item, value_index); variable_item_set_current_value_text(item, rainbow_lcd_names[value_index]); - variable_item_set_locked(item, !xtreme_settings.rgb_backlight, "Needs RGB\nBacklight!"); + variable_item_set_locked(item, !momentum_settings.rgb_backlight, "Needs RGB\nBacklight!"); item = variable_item_list_add( var_item_list, "Rainbow Speed", 25, - xtreme_app_scene_misc_screen_rainbow_speed_changed, + momentum_app_scene_misc_screen_rainbow_speed_changed, app); value_index = rgb_backlight_get_rainbow_speed(); variable_item_set_current_value_index(item, value_index - 1); char speed_str[4]; snprintf(speed_str, sizeof(speed_str), "%d", value_index); variable_item_set_current_value_text(item, speed_str); - variable_item_set_locked(item, !xtreme_settings.rgb_backlight, "Needs RGB\nBacklight!"); + variable_item_set_locked(item, !momentum_settings.rgb_backlight, "Needs RGB\nBacklight!"); item = variable_item_list_add( var_item_list, "Rainbow Interval", COUNT_OF(rainbow_interval_values), - xtreme_app_scene_misc_screen_rainbow_interval_changed, + momentum_app_scene_misc_screen_rainbow_interval_changed, app); value_index = value_index_uint32( rgb_backlight_get_rainbow_interval(), @@ -227,41 +227,41 @@ void xtreme_app_scene_misc_screen_on_enter(void* context) { COUNT_OF(rainbow_interval_values)); variable_item_set_current_value_index(item, value_index); variable_item_set_current_value_text(item, rainbow_interval_names[value_index]); - variable_item_set_locked(item, !xtreme_settings.rgb_backlight, "Needs RGB\nBacklight!"); + variable_item_set_locked(item, !momentum_settings.rgb_backlight, "Needs RGB\nBacklight!"); item = variable_item_list_add( var_item_list, "Rainbow Saturation", 255, - xtreme_app_scene_misc_screen_rainbow_saturation_changed, + momentum_app_scene_misc_screen_rainbow_saturation_changed, app); value_index = rgb_backlight_get_rainbow_saturation(); variable_item_set_current_value_index(item, value_index - 1); char saturation_str[4]; snprintf(saturation_str, sizeof(saturation_str), "%d", value_index); variable_item_set_current_value_text(item, saturation_str); - variable_item_set_locked(item, !xtreme_settings.rgb_backlight, "Needs RGB\nBacklight!"); + variable_item_set_locked(item, !momentum_settings.rgb_backlight, "Needs RGB\nBacklight!"); variable_item_list_set_enter_callback( - var_item_list, xtreme_app_scene_misc_screen_var_item_list_callback, app); + var_item_list, momentum_app_scene_misc_screen_var_item_list_callback, app); variable_item_list_set_selected_item( var_item_list, - scene_manager_get_scene_state(app->scene_manager, XtremeAppSceneMiscScreen)); + scene_manager_get_scene_state(app->scene_manager, MomentumAppSceneMiscScreen)); - view_dispatcher_switch_to_view(app->view_dispatcher, XtremeAppViewVarItemList); + view_dispatcher_switch_to_view(app->view_dispatcher, MomentumAppViewVarItemList); } -bool xtreme_app_scene_misc_screen_on_event(void* context, SceneManagerEvent event) { - XtremeApp* app = context; +bool momentum_app_scene_misc_screen_on_event(void* context, SceneManagerEvent event) { + MomentumApp* app = context; bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { - scene_manager_set_scene_state(app->scene_manager, XtremeAppSceneMiscScreen, event.event); + scene_manager_set_scene_state(app->scene_manager, MomentumAppSceneMiscScreen, event.event); consumed = true; switch(event.event) { case VarItemListIndexRgbBacklight: { - bool change = xtreme_settings.rgb_backlight; + bool change = momentum_settings.rgb_backlight; if(!change) { DialogMessage* msg = dialog_message_alloc(); dialog_message_set_header(msg, "RGB Backlight", 64, 0, AlignCenter, AlignTop); @@ -279,35 +279,35 @@ bool xtreme_app_scene_misc_screen_on_event(void* context, SceneManagerEvent even dialog_message_free(msg); } if(change) { - xtreme_settings.rgb_backlight = !xtreme_settings.rgb_backlight; + momentum_settings.rgb_backlight = !momentum_settings.rgb_backlight; app->save_settings = true; app->save_backlight = true; notification_message(app->notification, &sequence_display_backlight_on); - rgb_backlight_reconfigure(xtreme_settings.rgb_backlight); + rgb_backlight_reconfigure(momentum_settings.rgb_backlight); variable_item_set_current_value_text( variable_item_list_get(app->var_item_list, VarItemListIndexRgbBacklight), - xtreme_settings.rgb_backlight ? "ON" : "OFF"); + momentum_settings.rgb_backlight ? "ON" : "OFF"); for(size_t i = 0; i < COUNT_OF(lcd_cols); i++) { variable_item_set_locked( variable_item_list_get(app->var_item_list, VarItemListIndexLcdColor0 + i), - !xtreme_settings.rgb_backlight, + !momentum_settings.rgb_backlight, "Needs RGB\nBacklight!"); } variable_item_set_locked( variable_item_list_get(app->var_item_list, VarItemListIndexRainbowLcd), - !xtreme_settings.rgb_backlight, + !momentum_settings.rgb_backlight, "Needs RGB\nBacklight!"); variable_item_set_locked( variable_item_list_get(app->var_item_list, VarItemListIndexRainbowSpeed), - !xtreme_settings.rgb_backlight, + !momentum_settings.rgb_backlight, "Needs RGB\nBacklight!"); variable_item_set_locked( variable_item_list_get(app->var_item_list, VarItemListIndexRainbowInterval), - !xtreme_settings.rgb_backlight, + !momentum_settings.rgb_backlight, "Needs RGB\nBacklight!"); variable_item_set_locked( variable_item_list_get(app->var_item_list, VarItemListIndexRainbowSaturation), - !xtreme_settings.rgb_backlight, + !momentum_settings.rgb_backlight, "Needs RGB\nBacklight!"); } break; @@ -317,9 +317,9 @@ bool xtreme_app_scene_misc_screen_on_event(void* context, SceneManagerEvent even case VarItemListIndexLcdColor2: scene_manager_set_scene_state( app->scene_manager, - XtremeAppSceneMiscScreenColor, + MomentumAppSceneMiscScreenColor, event.event - VarItemListIndexLcdColor0); - scene_manager_next_scene(app->scene_manager, XtremeAppSceneMiscScreenColor); + scene_manager_next_scene(app->scene_manager, MomentumAppSceneMiscScreenColor); break; default: break; @@ -329,7 +329,7 @@ bool xtreme_app_scene_misc_screen_on_event(void* context, SceneManagerEvent even return consumed; } -void xtreme_app_scene_misc_screen_on_exit(void* context) { - XtremeApp* app = context; +void momentum_app_scene_misc_screen_on_exit(void* context) { + MomentumApp* app = context; variable_item_list_reset(app->var_item_list); } diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_misc_screen_color.c b/applications/main/momentum_app/scenes/momentum_app_scene_misc_screen_color.c similarity index 59% rename from applications/main/xtreme_app/scenes/xtreme_app_scene_misc_screen_color.c rename to applications/main/momentum_app/scenes/momentum_app_scene_misc_screen_color.c index 91d2421a0..a62dfa888 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_misc_screen_color.c +++ b/applications/main/momentum_app/scenes/momentum_app_scene_misc_screen_color.c @@ -1,38 +1,38 @@ -#include "../xtreme_app.h" +#include "../momentum_app.h" enum ByteInputResult { ByteInputResultOk, }; -void xtreme_app_scene_misc_screen_color_byte_input_callback(void* context) { - XtremeApp* app = context; +void momentum_app_scene_misc_screen_color_byte_input_callback(void* context) { + MomentumApp* app = context; view_dispatcher_send_custom_event(app->view_dispatcher, ByteInputResultOk); } -void xtreme_app_scene_misc_screen_color_on_enter(void* context) { - XtremeApp* app = context; +void momentum_app_scene_misc_screen_color_on_enter(void* context) { + MomentumApp* app = context; ByteInput* byte_input = app->byte_input; byte_input_set_header_text(byte_input, "Set LCD Color (#RRGGBB)"); rgb_backlight_get_color( - scene_manager_get_scene_state(app->scene_manager, XtremeAppSceneMiscScreenColor), + scene_manager_get_scene_state(app->scene_manager, MomentumAppSceneMiscScreenColor), &app->lcd_color); byte_input_set_result_callback( byte_input, - xtreme_app_scene_misc_screen_color_byte_input_callback, + momentum_app_scene_misc_screen_color_byte_input_callback, NULL, app, (void*)&app->lcd_color, sizeof(app->lcd_color)); - view_dispatcher_switch_to_view(app->view_dispatcher, XtremeAppViewByteInput); + view_dispatcher_switch_to_view(app->view_dispatcher, MomentumAppViewByteInput); } -bool xtreme_app_scene_misc_screen_color_on_event(void* context, SceneManagerEvent event) { - XtremeApp* app = context; +bool momentum_app_scene_misc_screen_color_on_event(void* context, SceneManagerEvent event) { + MomentumApp* app = context; bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { @@ -40,7 +40,7 @@ bool xtreme_app_scene_misc_screen_color_on_event(void* context, SceneManagerEven switch(event.event) { case ByteInputResultOk: rgb_backlight_set_color( - scene_manager_get_scene_state(app->scene_manager, XtremeAppSceneMiscScreenColor), + scene_manager_get_scene_state(app->scene_manager, MomentumAppSceneMiscScreenColor), &app->lcd_color); app->save_backlight = true; scene_manager_previous_scene(app->scene_manager); @@ -53,8 +53,8 @@ bool xtreme_app_scene_misc_screen_color_on_event(void* context, SceneManagerEven return consumed; } -void xtreme_app_scene_misc_screen_color_on_exit(void* context) { - XtremeApp* app = context; +void momentum_app_scene_misc_screen_color_on_exit(void* context) { + MomentumApp* app = context; byte_input_set_result_callback(app->byte_input, NULL, NULL, NULL, NULL, 0); byte_input_set_header_text(app->byte_input, ""); } diff --git a/applications/main/momentum_app/scenes/momentum_app_scene_protocols.c b/applications/main/momentum_app/scenes/momentum_app_scene_protocols.c new file mode 100644 index 000000000..cbe69e46c --- /dev/null +++ b/applications/main/momentum_app/scenes/momentum_app_scene_protocols.c @@ -0,0 +1,124 @@ +#include "../momentum_app.h" + +enum VarItemListIndex { + VarItemListIndexBadkbMode, + VarItemListIndexBadbtRemember, + VarItemListIndexSubghzFreqs, + VarItemListIndexSubghzExtend, + VarItemListIndexGpioPins, +}; + +void momentum_app_scene_protocols_var_item_list_callback(void* context, uint32_t index) { + MomentumApp* app = context; + view_dispatcher_send_custom_event(app->view_dispatcher, index); +} + +static void momentum_app_scene_protocols_bad_bt_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "BT" : "USB"); + momentum_settings.bad_bt = value; + app->save_settings = true; +} + +static void momentum_app_scene_protocols_bad_bt_remember_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "ON" : "OFF"); + momentum_settings.bad_bt_remember = value; + app->save_settings = true; +} + +static void momentum_app_scene_protocols_subghz_extend_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); + app->subghz_extend = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, app->subghz_extend ? "ON" : "OFF"); + app->save_subghz = true; +} + +static void momentum_app_scene_protocols_file_naming_prefix_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "After" : "Before"); + momentum_settings.file_naming_prefix_after = value; + app->save_settings = true; +} + +void momentum_app_scene_protocols_on_enter(void* context) { + MomentumApp* app = context; + VariableItemList* var_item_list = app->var_item_list; + VariableItem* item; + + item = variable_item_list_add( + var_item_list, "BadKB Mode", 2, momentum_app_scene_protocols_bad_bt_changed, app); + variable_item_set_current_value_index(item, momentum_settings.bad_bt); + variable_item_set_current_value_text(item, momentum_settings.bad_bt ? "BT" : "USB"); + + item = variable_item_list_add( + var_item_list, + "BadBT Remember", + 2, + momentum_app_scene_protocols_bad_bt_remember_changed, + app); + variable_item_set_current_value_index(item, momentum_settings.bad_bt_remember); + variable_item_set_current_value_text(item, momentum_settings.bad_bt_remember ? "ON" : "OFF"); + + item = variable_item_list_add(var_item_list, "SubGHz Freqs", 0, NULL, app); + variable_item_set_current_value_text(item, ">"); + + item = variable_item_list_add( + var_item_list, "SubGHz Extend", 2, momentum_app_scene_protocols_subghz_extend_changed, app); + variable_item_set_current_value_index(item, app->subghz_extend); + variable_item_set_current_value_text(item, app->subghz_extend ? "ON" : "OFF"); + + item = variable_item_list_add(var_item_list, "GPIO Pins", 0, NULL, app); + variable_item_set_current_value_text(item, ">"); + + item = variable_item_list_add( + var_item_list, + "File Naming Prefix", + 2, + momentum_app_scene_protocols_file_naming_prefix_changed, + app); + variable_item_set_current_value_index(item, momentum_settings.file_naming_prefix_after); + variable_item_set_current_value_text( + item, momentum_settings.file_naming_prefix_after ? "After" : "Before"); + + variable_item_list_set_enter_callback( + var_item_list, momentum_app_scene_protocols_var_item_list_callback, app); + + variable_item_list_set_selected_item( + var_item_list, + scene_manager_get_scene_state(app->scene_manager, MomentumAppSceneProtocols)); + + view_dispatcher_switch_to_view(app->view_dispatcher, MomentumAppViewVarItemList); +} + +bool momentum_app_scene_protocols_on_event(void* context, SceneManagerEvent event) { + MomentumApp* app = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + scene_manager_set_scene_state(app->scene_manager, MomentumAppSceneProtocols, event.event); + consumed = true; + switch(event.event) { + case VarItemListIndexSubghzFreqs: + scene_manager_set_scene_state(app->scene_manager, MomentumAppSceneProtocolsFreqs, 0); + scene_manager_next_scene(app->scene_manager, MomentumAppSceneProtocolsFreqs); + break; + case VarItemListIndexGpioPins: + scene_manager_set_scene_state(app->scene_manager, MomentumAppSceneProtocolsGpio, 0); + scene_manager_next_scene(app->scene_manager, MomentumAppSceneProtocolsGpio); + break; + default: + break; + } + } + + return consumed; +} + +void momentum_app_scene_protocols_on_exit(void* context) { + MomentumApp* app = context; + variable_item_list_reset(app->var_item_list); +} diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols_freqs.c b/applications/main/momentum_app/scenes/momentum_app_scene_protocols_freqs.c similarity index 54% rename from applications/main/xtreme_app/scenes/xtreme_app_scene_protocols_freqs.c rename to applications/main/momentum_app/scenes/momentum_app_scene_protocols_freqs.c index dfe77d26c..c67e76ee0 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols_freqs.c +++ b/applications/main/momentum_app/scenes/momentum_app_scene_protocols_freqs.c @@ -1,4 +1,4 @@ -#include "../xtreme_app.h" +#include "../momentum_app.h" enum VarItemListIndex { VarItemListIndexUseDefaults, @@ -6,21 +6,21 @@ enum VarItemListIndex { VarItemListIndexHopperFreqs, }; -void xtreme_app_scene_protocols_freqs_var_item_list_callback(void* context, uint32_t index) { - XtremeApp* app = context; +void momentum_app_scene_protocols_freqs_var_item_list_callback(void* context, uint32_t index) { + MomentumApp* app = context; view_dispatcher_send_custom_event(app->view_dispatcher, index); } -static void xtreme_app_scene_protocols_freqs_use_defaults_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); +static void momentum_app_scene_protocols_freqs_use_defaults_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); bool value = variable_item_get_current_value_index(item); variable_item_set_current_value_text(item, value ? "ON" : "OFF"); app->subghz_use_defaults = value; app->save_subghz_freqs = true; } -void xtreme_app_scene_protocols_freqs_on_enter(void* context) { - XtremeApp* app = context; +void momentum_app_scene_protocols_freqs_on_enter(void* context) { + MomentumApp* app = context; VariableItemList* var_item_list = app->var_item_list; VariableItem* item; @@ -28,7 +28,7 @@ void xtreme_app_scene_protocols_freqs_on_enter(void* context) { var_item_list, "Use Defaults", 2, - xtreme_app_scene_protocols_freqs_use_defaults_changed, + momentum_app_scene_protocols_freqs_use_defaults_changed, app); variable_item_set_current_value_index(item, app->subghz_use_defaults); variable_item_set_current_value_text(item, app->subghz_use_defaults ? "ON" : "OFF"); @@ -40,33 +40,33 @@ void xtreme_app_scene_protocols_freqs_on_enter(void* context) { variable_item_set_current_value_text(item, ">"); variable_item_list_set_enter_callback( - var_item_list, xtreme_app_scene_protocols_freqs_var_item_list_callback, app); + var_item_list, momentum_app_scene_protocols_freqs_var_item_list_callback, app); variable_item_list_set_selected_item( var_item_list, - scene_manager_get_scene_state(app->scene_manager, XtremeAppSceneProtocolsFreqs)); + scene_manager_get_scene_state(app->scene_manager, MomentumAppSceneProtocolsFreqs)); - view_dispatcher_switch_to_view(app->view_dispatcher, XtremeAppViewVarItemList); + view_dispatcher_switch_to_view(app->view_dispatcher, MomentumAppViewVarItemList); } -bool xtreme_app_scene_protocols_freqs_on_event(void* context, SceneManagerEvent event) { - XtremeApp* app = context; +bool momentum_app_scene_protocols_freqs_on_event(void* context, SceneManagerEvent event) { + MomentumApp* app = context; bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { scene_manager_set_scene_state( - app->scene_manager, XtremeAppSceneProtocolsFreqs, event.event); + app->scene_manager, MomentumAppSceneProtocolsFreqs, event.event); consumed = true; switch(event.event) { case VarItemListIndexStaticFreqs: scene_manager_set_scene_state( - app->scene_manager, XtremeAppSceneProtocolsFreqsStatic, 0); - scene_manager_next_scene(app->scene_manager, XtremeAppSceneProtocolsFreqsStatic); + app->scene_manager, MomentumAppSceneProtocolsFreqsStatic, 0); + scene_manager_next_scene(app->scene_manager, MomentumAppSceneProtocolsFreqsStatic); break; case VarItemListIndexHopperFreqs: scene_manager_set_scene_state( - app->scene_manager, XtremeAppSceneProtocolsFreqsHopper, 0); - scene_manager_next_scene(app->scene_manager, XtremeAppSceneProtocolsFreqsHopper); + app->scene_manager, MomentumAppSceneProtocolsFreqsHopper, 0); + scene_manager_next_scene(app->scene_manager, MomentumAppSceneProtocolsFreqsHopper); break; default: break; @@ -76,7 +76,7 @@ bool xtreme_app_scene_protocols_freqs_on_event(void* context, SceneManagerEvent return consumed; } -void xtreme_app_scene_protocols_freqs_on_exit(void* context) { - XtremeApp* app = context; +void momentum_app_scene_protocols_freqs_on_exit(void* context) { + MomentumApp* app = context; variable_item_list_reset(app->var_item_list); } diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols_freqs_add.c b/applications/main/momentum_app/scenes/momentum_app_scene_protocols_freqs_add.c similarity index 67% rename from applications/main/xtreme_app/scenes/xtreme_app_scene_protocols_freqs_add.c rename to applications/main/momentum_app/scenes/momentum_app_scene_protocols_freqs_add.c index 314a69e1e..3481cb4fc 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols_freqs_add.c +++ b/applications/main/momentum_app/scenes/momentum_app_scene_protocols_freqs_add.c @@ -1,12 +1,12 @@ -#include "../xtreme_app.h" +#include "../momentum_app.h" enum TextInputResult { TextInputResultOk, TextInputResultError, }; -static void xtreme_app_scene_protocols_freqs_add_text_input_callback(void* context) { - XtremeApp* app = context; +static void momentum_app_scene_protocols_freqs_add_text_input_callback(void* context) { + MomentumApp* app = context; char* end; uint32_t value = strtol(app->subghz_freq_buffer, &end, 0) * 1000; @@ -15,7 +15,7 @@ static void xtreme_app_scene_protocols_freqs_add_text_input_callback(void* conte return; } bool is_hopper = - scene_manager_get_scene_state(app->scene_manager, XtremeAppSceneProtocolsFreqsAdd); + scene_manager_get_scene_state(app->scene_manager, MomentumAppSceneProtocolsFreqsAdd); if(is_hopper) { FrequencyList_push_back(app->subghz_hopper_freqs, value); } else { @@ -25,32 +25,32 @@ static void xtreme_app_scene_protocols_freqs_add_text_input_callback(void* conte view_dispatcher_send_custom_event(app->view_dispatcher, TextInputResultOk); } -void xtreme_app_scene_protocols_freqs_add_on_enter(void* context) { - XtremeApp* app = context; +void momentum_app_scene_protocols_freqs_add_on_enter(void* context) { + MomentumApp* app = context; TextInput* text_input = app->text_input; text_input_set_header_text(text_input, "Ex: 123456 for 123.456 MHz"); - strlcpy(app->subghz_freq_buffer, "", XTREME_SUBGHZ_FREQ_BUFFER_SIZE); + strlcpy(app->subghz_freq_buffer, "", sizeof(app->subghz_freq_buffer)); text_input_set_result_callback( text_input, - xtreme_app_scene_protocols_freqs_add_text_input_callback, + momentum_app_scene_protocols_freqs_add_text_input_callback, app, app->subghz_freq_buffer, - XTREME_SUBGHZ_FREQ_BUFFER_SIZE, + sizeof(app->subghz_freq_buffer), true); - view_dispatcher_switch_to_view(app->view_dispatcher, XtremeAppViewTextInput); + view_dispatcher_switch_to_view(app->view_dispatcher, MomentumAppViewTextInput); } void callback_return(void* context) { - XtremeApp* app = context; + MomentumApp* app = context; scene_manager_previous_scene(app->scene_manager); } -bool xtreme_app_scene_protocols_freqs_add_on_event(void* context, SceneManagerEvent event) { - XtremeApp* app = context; +bool momentum_app_scene_protocols_freqs_add_on_event(void* context, SceneManagerEvent event) { + MomentumApp* app = context; bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { @@ -67,7 +67,7 @@ bool xtreme_app_scene_protocols_freqs_add_on_event(void* context, SceneManagerEv popup_set_context(app->popup, app); popup_set_timeout(app->popup, 1000); popup_enable_timeout(app->popup); - view_dispatcher_switch_to_view(app->view_dispatcher, XtremeAppViewPopup); + view_dispatcher_switch_to_view(app->view_dispatcher, MomentumAppViewPopup); break; default: break; @@ -77,7 +77,7 @@ bool xtreme_app_scene_protocols_freqs_add_on_event(void* context, SceneManagerEv return consumed; } -void xtreme_app_scene_protocols_freqs_add_on_exit(void* context) { - XtremeApp* app = context; +void momentum_app_scene_protocols_freqs_add_on_exit(void* context) { + MomentumApp* app = context; text_input_reset(app->text_input); } diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols_freqs_hopper.c b/applications/main/momentum_app/scenes/momentum_app_scene_protocols_freqs_hopper.c similarity index 74% rename from applications/main/xtreme_app/scenes/xtreme_app_scene_protocols_freqs_hopper.c rename to applications/main/momentum_app/scenes/momentum_app_scene_protocols_freqs_hopper.c index 4dabdbeeb..aada8de42 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols_freqs_hopper.c +++ b/applications/main/momentum_app/scenes/momentum_app_scene_protocols_freqs_hopper.c @@ -1,4 +1,4 @@ -#include "../xtreme_app.h" +#include "../momentum_app.h" enum VarItemListIndex { VarItemListIndexHopperFrequency, @@ -6,13 +6,15 @@ enum VarItemListIndex { VarItemListIndexAddHopperFreq, }; -void xtreme_app_scene_protocols_freqs_hopper_var_item_list_callback(void* context, uint32_t index) { - XtremeApp* app = context; +void momentum_app_scene_protocols_freqs_hopper_var_item_list_callback( + void* context, + uint32_t index) { + MomentumApp* app = context; view_dispatcher_send_custom_event(app->view_dispatcher, index); } -static void xtreme_app_scene_protocols_freqs_hopper_frequency_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); +static void momentum_app_scene_protocols_freqs_hopper_frequency_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); app->subghz_hopper_index = variable_item_get_current_value_index(item); uint32_t value = *FrequencyList_get(app->subghz_hopper_freqs, app->subghz_hopper_index); char text[10] = {0}; @@ -20,8 +22,8 @@ static void xtreme_app_scene_protocols_freqs_hopper_frequency_changed(VariableIt variable_item_set_current_value_text(item, text); } -void xtreme_app_scene_protocols_freqs_hopper_on_enter(void* context) { - XtremeApp* app = context; +void momentum_app_scene_protocols_freqs_hopper_on_enter(void* context) { + MomentumApp* app = context; VariableItemList* var_item_list = app->var_item_list; VariableItem* item; @@ -29,7 +31,7 @@ void xtreme_app_scene_protocols_freqs_hopper_on_enter(void* context) { var_item_list, "Hopper Freq", FrequencyList_size(app->subghz_hopper_freqs), - xtreme_app_scene_protocols_freqs_hopper_frequency_changed, + momentum_app_scene_protocols_freqs_hopper_frequency_changed, app); app->subghz_hopper_index = 0; variable_item_set_current_value_index(item, app->subghz_hopper_index); @@ -47,22 +49,22 @@ void xtreme_app_scene_protocols_freqs_hopper_on_enter(void* context) { variable_item_list_add(var_item_list, "Add Hopper Freq", 0, NULL, app); variable_item_list_set_enter_callback( - var_item_list, xtreme_app_scene_protocols_freqs_hopper_var_item_list_callback, app); + var_item_list, momentum_app_scene_protocols_freqs_hopper_var_item_list_callback, app); variable_item_list_set_selected_item( var_item_list, - scene_manager_get_scene_state(app->scene_manager, XtremeAppSceneProtocolsFreqsHopper)); + scene_manager_get_scene_state(app->scene_manager, MomentumAppSceneProtocolsFreqsHopper)); - view_dispatcher_switch_to_view(app->view_dispatcher, XtremeAppViewVarItemList); + view_dispatcher_switch_to_view(app->view_dispatcher, MomentumAppViewVarItemList); } -bool xtreme_app_scene_protocols_freqs_hopper_on_event(void* context, SceneManagerEvent event) { - XtremeApp* app = context; +bool momentum_app_scene_protocols_freqs_hopper_on_event(void* context, SceneManagerEvent event) { + MomentumApp* app = context; bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { scene_manager_set_scene_state( - app->scene_manager, XtremeAppSceneProtocolsFreqsHopper, event.event); + app->scene_manager, MomentumAppSceneProtocolsFreqsHopper, event.event); consumed = true; switch(event.event) { case VarItemListIndexRemoveHopperFreq: @@ -100,8 +102,8 @@ bool xtreme_app_scene_protocols_freqs_hopper_on_event(void* context, SceneManage break; case VarItemListIndexAddHopperFreq: scene_manager_set_scene_state( - app->scene_manager, XtremeAppSceneProtocolsFreqsAdd, true); - scene_manager_next_scene(app->scene_manager, XtremeAppSceneProtocolsFreqsAdd); + app->scene_manager, MomentumAppSceneProtocolsFreqsAdd, true); + scene_manager_next_scene(app->scene_manager, MomentumAppSceneProtocolsFreqsAdd); break; default: break; @@ -111,7 +113,7 @@ bool xtreme_app_scene_protocols_freqs_hopper_on_event(void* context, SceneManage return consumed; } -void xtreme_app_scene_protocols_freqs_hopper_on_exit(void* context) { - XtremeApp* app = context; +void momentum_app_scene_protocols_freqs_hopper_on_exit(void* context) { + MomentumApp* app = context; variable_item_list_reset(app->var_item_list); } diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols_freqs_static.c b/applications/main/momentum_app/scenes/momentum_app_scene_protocols_freqs_static.c similarity index 74% rename from applications/main/xtreme_app/scenes/xtreme_app_scene_protocols_freqs_static.c rename to applications/main/momentum_app/scenes/momentum_app_scene_protocols_freqs_static.c index fdfcde35a..bf8870d11 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols_freqs_static.c +++ b/applications/main/momentum_app/scenes/momentum_app_scene_protocols_freqs_static.c @@ -1,4 +1,4 @@ -#include "../xtreme_app.h" +#include "../momentum_app.h" enum VarItemListIndex { VarItemListIndexStaticFrequency, @@ -6,13 +6,15 @@ enum VarItemListIndex { VarItemListIndexAddStaticFreq, }; -void xtreme_app_scene_protocols_freqs_static_var_item_list_callback(void* context, uint32_t index) { - XtremeApp* app = context; +void momentum_app_scene_protocols_freqs_static_var_item_list_callback( + void* context, + uint32_t index) { + MomentumApp* app = context; view_dispatcher_send_custom_event(app->view_dispatcher, index); } -static void xtreme_app_scene_protocols_freqs_static_frequency_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); +static void momentum_app_scene_protocols_freqs_static_frequency_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); app->subghz_static_index = variable_item_get_current_value_index(item); uint32_t value = *FrequencyList_get(app->subghz_static_freqs, app->subghz_static_index); char text[10] = {0}; @@ -20,8 +22,8 @@ static void xtreme_app_scene_protocols_freqs_static_frequency_changed(VariableIt variable_item_set_current_value_text(item, text); } -void xtreme_app_scene_protocols_freqs_static_on_enter(void* context) { - XtremeApp* app = context; +void momentum_app_scene_protocols_freqs_static_on_enter(void* context) { + MomentumApp* app = context; VariableItemList* var_item_list = app->var_item_list; VariableItem* item; @@ -29,7 +31,7 @@ void xtreme_app_scene_protocols_freqs_static_on_enter(void* context) { var_item_list, "Static Freq", FrequencyList_size(app->subghz_static_freqs), - xtreme_app_scene_protocols_freqs_static_frequency_changed, + momentum_app_scene_protocols_freqs_static_frequency_changed, app); app->subghz_static_index = 0; variable_item_set_current_value_index(item, app->subghz_static_index); @@ -47,22 +49,22 @@ void xtreme_app_scene_protocols_freqs_static_on_enter(void* context) { variable_item_list_add(var_item_list, "Add Static Freq", 0, NULL, app); variable_item_list_set_enter_callback( - var_item_list, xtreme_app_scene_protocols_freqs_static_var_item_list_callback, app); + var_item_list, momentum_app_scene_protocols_freqs_static_var_item_list_callback, app); variable_item_list_set_selected_item( var_item_list, - scene_manager_get_scene_state(app->scene_manager, XtremeAppSceneProtocolsFreqsStatic)); + scene_manager_get_scene_state(app->scene_manager, MomentumAppSceneProtocolsFreqsStatic)); - view_dispatcher_switch_to_view(app->view_dispatcher, XtremeAppViewVarItemList); + view_dispatcher_switch_to_view(app->view_dispatcher, MomentumAppViewVarItemList); } -bool xtreme_app_scene_protocols_freqs_static_on_event(void* context, SceneManagerEvent event) { - XtremeApp* app = context; +bool momentum_app_scene_protocols_freqs_static_on_event(void* context, SceneManagerEvent event) { + MomentumApp* app = context; bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { scene_manager_set_scene_state( - app->scene_manager, XtremeAppSceneProtocolsFreqsStatic, event.event); + app->scene_manager, MomentumAppSceneProtocolsFreqsStatic, event.event); consumed = true; switch(event.event) { case VarItemListIndexRemoveStaticFreq: @@ -100,8 +102,8 @@ bool xtreme_app_scene_protocols_freqs_static_on_event(void* context, SceneManage break; case VarItemListIndexAddStaticFreq: scene_manager_set_scene_state( - app->scene_manager, XtremeAppSceneProtocolsFreqsAdd, false); - scene_manager_next_scene(app->scene_manager, XtremeAppSceneProtocolsFreqsAdd); + app->scene_manager, MomentumAppSceneProtocolsFreqsAdd, false); + scene_manager_next_scene(app->scene_manager, MomentumAppSceneProtocolsFreqsAdd); break; default: break; @@ -111,7 +113,7 @@ bool xtreme_app_scene_protocols_freqs_static_on_event(void* context, SceneManage return consumed; } -void xtreme_app_scene_protocols_freqs_static_on_exit(void* context) { - XtremeApp* app = context; +void momentum_app_scene_protocols_freqs_static_on_exit(void* context) { + MomentumApp* app = context; variable_item_list_reset(app->var_item_list); } diff --git a/applications/main/momentum_app/scenes/momentum_app_scene_protocols_gpio.c b/applications/main/momentum_app/scenes/momentum_app_scene_protocols_gpio.c new file mode 100644 index 000000000..061a2b364 --- /dev/null +++ b/applications/main/momentum_app/scenes/momentum_app_scene_protocols_gpio.c @@ -0,0 +1,158 @@ +#include "../momentum_app.h" + +enum VarItemListIndex { + VarItemListIndexSpiCc1101Handle, + VarItemListIndexSpiNrf24Handle, + VarItemListIndexUartEspChannel, + VarItemListIndexUartNmeaChannel, + VarItemListIndexUartGeneralChannel, +}; + +#define SPI_DEFAULT "Default 4" +#define SPI_EXTRA "Extra 7" +#define UART_DEFAULT "Default 13,14" +#define UART_EXTRA "Extra 15,16" + +void momentum_app_scene_protocols_gpio_var_item_list_callback(void* context, uint32_t index) { + MomentumApp* app = context; + view_dispatcher_send_custom_event(app->view_dispatcher, index); +} + +static void momentum_app_scene_protocols_gpio_cc1101_handle_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); + momentum_settings.spi_cc1101_handle = + variable_item_get_current_value_index(item) == 0 ? SpiDefault : SpiExtra; + variable_item_set_current_value_text( + item, momentum_settings.spi_cc1101_handle == SpiDefault ? SPI_DEFAULT : SPI_EXTRA); + app->save_settings = true; +} + +static void momentum_app_scene_protocols_gpio_nrf24_handle_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); + momentum_settings.spi_nrf24_handle = + variable_item_get_current_value_index(item) == 0 ? SpiDefault : SpiExtra; + variable_item_set_current_value_text( + item, momentum_settings.spi_nrf24_handle == SpiDefault ? SPI_DEFAULT : SPI_EXTRA); + app->save_settings = true; +} + +static void momentum_app_scene_protocols_gpio_esp32_channel_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); + momentum_settings.uart_esp_channel = variable_item_get_current_value_index(item) == 0 ? + FuriHalSerialIdUsart : + FuriHalSerialIdLpuart; + variable_item_set_current_value_text( + item, + momentum_settings.uart_esp_channel == FuriHalSerialIdUsart ? UART_DEFAULT : UART_EXTRA); + app->save_settings = true; +} + +static void momentum_app_scene_protocols_gpio_nmea_channel_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); + momentum_settings.uart_nmea_channel = variable_item_get_current_value_index(item) == 0 ? + FuriHalSerialIdUsart : + FuriHalSerialIdLpuart; + variable_item_set_current_value_text( + item, + momentum_settings.uart_nmea_channel == FuriHalSerialIdUsart ? UART_DEFAULT : UART_EXTRA); + app->save_settings = true; +} + +static void momentum_app_scene_protocols_gpio_general_channel_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); + momentum_settings.uart_general_channel = variable_item_get_current_value_index(item) == 0 ? + FuriHalSerialIdUsart : + FuriHalSerialIdLpuart; + variable_item_set_current_value_text( + item, + momentum_settings.uart_general_channel == FuriHalSerialIdUsart ? UART_DEFAULT : + UART_EXTRA); + app->save_settings = true; +} + +void momentum_app_scene_protocols_gpio_on_enter(void* context) { + MomentumApp* app = context; + VariableItemList* var_item_list = app->var_item_list; + VariableItem* item; + + item = variable_item_list_add( + var_item_list, + "CC1101 SPI", + 2, + momentum_app_scene_protocols_gpio_cc1101_handle_changed, + app); + variable_item_set_current_value_index(item, momentum_settings.spi_cc1101_handle); + variable_item_set_current_value_text( + item, momentum_settings.spi_cc1101_handle == SpiDefault ? SPI_DEFAULT : SPI_EXTRA); + + item = variable_item_list_add( + var_item_list, "NRF24 SPI", 2, momentum_app_scene_protocols_gpio_nrf24_handle_changed, app); + variable_item_set_current_value_index(item, momentum_settings.spi_nrf24_handle); + variable_item_set_current_value_text( + item, momentum_settings.spi_nrf24_handle == SpiDefault ? SPI_DEFAULT : SPI_EXTRA); + + item = variable_item_list_add( + var_item_list, + "ESP32/8266 UART", + 2, + momentum_app_scene_protocols_gpio_esp32_channel_changed, + app); + variable_item_set_current_value_index(item, momentum_settings.uart_esp_channel); + variable_item_set_current_value_text( + item, + momentum_settings.uart_esp_channel == FuriHalSerialIdUsart ? UART_DEFAULT : UART_EXTRA); + + item = variable_item_list_add( + var_item_list, + "NMEA GPS UART", + 2, + momentum_app_scene_protocols_gpio_nmea_channel_changed, + app); + variable_item_set_current_value_index(item, momentum_settings.uart_nmea_channel); + variable_item_set_current_value_text( + item, + momentum_settings.uart_nmea_channel == FuriHalSerialIdUsart ? UART_DEFAULT : UART_EXTRA); + + item = variable_item_list_add( + var_item_list, + "General UART", + 2, + momentum_app_scene_protocols_gpio_general_channel_changed, + app); + variable_item_set_current_value_index(item, momentum_settings.uart_general_channel); + variable_item_set_current_value_text( + item, + momentum_settings.uart_general_channel == FuriHalSerialIdUsart ? UART_DEFAULT : + UART_EXTRA); + + variable_item_list_set_enter_callback( + var_item_list, momentum_app_scene_protocols_gpio_var_item_list_callback, app); + + variable_item_list_set_selected_item( + var_item_list, + scene_manager_get_scene_state(app->scene_manager, MomentumAppSceneProtocolsGpio)); + + view_dispatcher_switch_to_view(app->view_dispatcher, MomentumAppViewVarItemList); +} + +bool momentum_app_scene_protocols_gpio_on_event(void* context, SceneManagerEvent event) { + MomentumApp* app = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + scene_manager_set_scene_state( + app->scene_manager, MomentumAppSceneProtocolsGpio, event.event); + consumed = true; + switch(event.event) { + default: + break; + } + } + + return consumed; +} + +void momentum_app_scene_protocols_gpio_on_exit(void* context) { + MomentumApp* app = context; + variable_item_list_reset(app->var_item_list); +} diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_start.c b/applications/main/momentum_app/scenes/momentum_app_scene_start.c similarity index 51% rename from applications/main/xtreme_app/scenes/xtreme_app_scene_start.c rename to applications/main/momentum_app/scenes/momentum_app_scene_start.c index 373902ff8..0e97acd4d 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_start.c +++ b/applications/main/momentum_app/scenes/momentum_app_scene_start.c @@ -1,4 +1,4 @@ -#include "../xtreme_app.h" +#include "../momentum_app.h" enum VarItemListIndex { VarItemListIndexInterface, @@ -6,13 +6,13 @@ enum VarItemListIndex { VarItemListIndexMisc, }; -void xtreme_app_scene_start_var_item_list_callback(void* context, uint32_t index) { - XtremeApp* app = context; +void momentum_app_scene_start_var_item_list_callback(void* context, uint32_t index) { + MomentumApp* app = context; view_dispatcher_send_custom_event(app->view_dispatcher, index); } -void xtreme_app_scene_start_on_enter(void* context) { - XtremeApp* app = context; +void momentum_app_scene_start_on_enter(void* context) { + MomentumApp* app = context; VariableItemList* var_item_list = app->var_item_list; VariableItem* item; @@ -28,33 +28,33 @@ void xtreme_app_scene_start_on_enter(void* context) { variable_item_list_set_header(var_item_list, furi_string_get_cstr(app->version_tag)); variable_item_list_set_enter_callback( - var_item_list, xtreme_app_scene_start_var_item_list_callback, app); + var_item_list, momentum_app_scene_start_var_item_list_callback, app); variable_item_list_set_selected_item( - var_item_list, scene_manager_get_scene_state(app->scene_manager, XtremeAppSceneStart)); + var_item_list, scene_manager_get_scene_state(app->scene_manager, MomentumAppSceneStart)); - view_dispatcher_switch_to_view(app->view_dispatcher, XtremeAppViewVarItemList); + view_dispatcher_switch_to_view(app->view_dispatcher, MomentumAppViewVarItemList); } -bool xtreme_app_scene_start_on_event(void* context, SceneManagerEvent event) { - XtremeApp* app = context; +bool momentum_app_scene_start_on_event(void* context, SceneManagerEvent event) { + MomentumApp* app = context; bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { - scene_manager_set_scene_state(app->scene_manager, XtremeAppSceneStart, event.event); + scene_manager_set_scene_state(app->scene_manager, MomentumAppSceneStart, event.event); consumed = true; switch(event.event) { case VarItemListIndexInterface: - scene_manager_set_scene_state(app->scene_manager, XtremeAppSceneInterface, 0); - scene_manager_next_scene(app->scene_manager, XtremeAppSceneInterface); + scene_manager_set_scene_state(app->scene_manager, MomentumAppSceneInterface, 0); + scene_manager_next_scene(app->scene_manager, MomentumAppSceneInterface); break; case VarItemListIndexProtocols: - scene_manager_set_scene_state(app->scene_manager, XtremeAppSceneProtocols, 0); - scene_manager_next_scene(app->scene_manager, XtremeAppSceneProtocols); + scene_manager_set_scene_state(app->scene_manager, MomentumAppSceneProtocols, 0); + scene_manager_next_scene(app->scene_manager, MomentumAppSceneProtocols); break; case VarItemListIndexMisc: - scene_manager_set_scene_state(app->scene_manager, XtremeAppSceneMisc, 0); - scene_manager_next_scene(app->scene_manager, XtremeAppSceneMisc); + scene_manager_set_scene_state(app->scene_manager, MomentumAppSceneMisc, 0); + scene_manager_next_scene(app->scene_manager, MomentumAppSceneMisc); break; default: break; @@ -64,7 +64,7 @@ bool xtreme_app_scene_start_on_event(void* context, SceneManagerEvent event) { return consumed; } -void xtreme_app_scene_start_on_exit(void* context) { - XtremeApp* app = context; +void momentum_app_scene_start_on_exit(void* context) { + MomentumApp* app = context; variable_item_list_reset(app->var_item_list); } diff --git a/applications/main/nfc/scenes/nfc_scene_emulate.c b/applications/main/nfc/scenes/nfc_scene_emulate.c index 009bf674e..3f39db211 100644 --- a/applications/main/nfc/scenes/nfc_scene_emulate.c +++ b/applications/main/nfc/scenes/nfc_scene_emulate.c @@ -2,7 +2,7 @@ #include "nfc_app_i.h" -#include +#include FuriTimer* timer_auto_exit = NULL; @@ -22,7 +22,8 @@ void nfc_scene_emulate_on_enter(void* context) { timer_auto_exit = furi_timer_alloc(nfc_scene_emulate_timer_callback, FuriTimerTypeOnce, instance); furi_timer_start( - timer_auto_exit, xtreme_settings.favorite_timeout * furi_kernel_get_tick_frequency()); + timer_auto_exit, + momentum_settings.favorite_timeout * furi_kernel_get_tick_frequency()); } } diff --git a/applications/main/subghz/helpers/subghz_gps.h b/applications/main/subghz/helpers/subghz_gps.h index 7475cd2c0..f28cecb5f 100644 --- a/applications/main/subghz/helpers/subghz_gps.h +++ b/applications/main/subghz/helpers/subghz_gps.h @@ -1,8 +1,8 @@ #include -#include +#include #include -#define UART_CH (xtreme_settings.uart_nmea_channel) +#define UART_CH (momentum_settings.uart_nmea_channel) #define RX_BUF_SIZE 1024 diff --git a/applications/main/subghz/resources/subghz/assets/README.md b/applications/main/subghz/resources/subghz/assets/README.md index e98ccba9c..ec58b8ef2 100644 --- a/applications/main/subghz/resources/subghz/assets/README.md +++ b/applications/main/subghz/resources/subghz/assets/README.md @@ -1,10 +1,10 @@ -#Sub-Ghz Frequencies in Xtreme +#Sub-Ghz Frequencies in Momentum Officially supported frequencies: 300-350 MHz, 387-467.75 MHz, and 779-928 MHz (from [CC1101 chip docs](https://www.ti.com/product/CC1101))
    Unofficially supported frequencies: 281-361 MHz, 378-481 MHz, and 749-962 MHz (from [YARD Stick One/CC1111 Docs](https://greatscottgadgets.com/yardstickone/)) Currently no other Flipper firmware allows anything outside of the officially supported CC1101 specs without editing files that get overwritten with every update. -Xtreme has these options easily togglable in the Xtreme Settings app. +Momentum has these options easily togglable in the Momentum Settings app. **NOTE: Operating outside supported frequencies can damage your amp and may not provide the same results as supported frequencies.
    Please understand what you're doing if you transmit on unsupported frequencies as medical devices are licensed to operate there.** diff --git a/applications/main/subghz/scenes/subghz_scene_transmitter.c b/applications/main/subghz/scenes/subghz_scene_transmitter.c index dc1c83303..451ebd0f2 100644 --- a/applications/main/subghz/scenes/subghz_scene_transmitter.c +++ b/applications/main/subghz/scenes/subghz_scene_transmitter.c @@ -1,7 +1,7 @@ #include "../subghz_i.h" #include "../views/transmitter.h" #include -#include +#include #include @@ -75,7 +75,7 @@ void subghz_scene_transmitter_on_enter(void* context) { scene_manager_handle_custom_event( subghz->scene_manager, SubGhzCustomEventViewTransmitterSendStart); furi_timer_start( - subghz->timer, xtreme_settings.favorite_timeout * furi_kernel_get_tick_frequency()); + subghz->timer, momentum_settings.favorite_timeout * furi_kernel_get_tick_frequency()); } } diff --git a/applications/main/subghz/subghz.c b/applications/main/subghz/subghz.c index c743f90d6..1f4910e1d 100644 --- a/applications/main/subghz/subghz.c +++ b/applications/main/subghz/subghz.c @@ -6,7 +6,7 @@ #include #include "subghz_i.h" #include -#include +#include #include "subghz_fap.h" @@ -380,7 +380,7 @@ int32_t subghz_app(char* p) { } // Check argument and run corresponding scene - bool is_favorite = process_favorite_launch(&p) && xtreme_settings.favorite_timeout; + bool is_favorite = process_favorite_launch(&p) && momentum_settings.favorite_timeout; if(p && strlen(p)) { uint32_t rpc_ctx = 0; diff --git a/applications/main/u2f/scenes/u2f_scene_error.c b/applications/main/u2f/scenes/u2f_scene_error.c index c48cf40da..f6e6413fe 100644 --- a/applications/main/u2f/scenes/u2f_scene_error.c +++ b/applications/main/u2f/scenes/u2f_scene_error.c @@ -1,5 +1,5 @@ #include "../u2f_app_i.h" -#include +#include static void u2f_scene_error_event_callback(GuiButtonType result, InputType type, void* context) { furi_assert(context); diff --git a/applications/main/u2f/u2f_data.h b/applications/main/u2f/u2f_data.h index 5c887ba1d..822357a33 100644 --- a/applications/main/u2f/u2f_data.h +++ b/applications/main/u2f/u2f_data.h @@ -9,8 +9,6 @@ extern "C" { #define U2F_DATA_FOLDER EXT_PATH("u2f/") #define U2F_CERT_FILE U2F_DATA_FOLDER "assets/cert.der" #define U2F_CERT_KEY_FILE U2F_DATA_FOLDER "assets/cert_key.u2f" -#define U2F_CNT_OLD_FILE INT_PATH(".cnt.u2f") -#define U2F_KEY_OLD_FILE U2F_DATA_FOLDER "key.u2f" #define U2F_CNT_FILE U2F_DATA_FOLDER "cnt.u2f" #define U2F_KEY_FILE INT_PATH(".key.u2f") diff --git a/applications/main/u2f/views/u2f_view.c b/applications/main/u2f/views/u2f_view.c index 6487ca5f8..c24730f29 100644 --- a/applications/main/u2f/views/u2f_view.c +++ b/applications/main/u2f/views/u2f_view.c @@ -1,7 +1,7 @@ #include "u2f_view.h" #include #include -#include +#include struct U2fView { View* view; @@ -21,56 +21,26 @@ static void u2f_view_draw_callback(Canvas* canvas, void* _model) { if(model->display_msg == U2fMsgNotConnected) { canvas_draw_icon(canvas, 22, 15, &I_Connect_me_62x31); - if(xtreme_assets.is_nsfw) { - canvas_draw_str_aligned( - canvas, 128 / 2, 3, AlignCenter, AlignTop, "Plug me in d-daddy"); - } else { - canvas_draw_str_aligned( - canvas, 128 / 2, 3, AlignCenter, AlignTop, "Connect to a device"); - } + canvas_draw_str_aligned(canvas, 128 / 2, 3, AlignCenter, AlignTop, "Connect to a device"); } else if(model->display_msg == U2fMsgIdle) { canvas_draw_icon(canvas, 22, 15, &I_Connected_62x31); canvas_draw_str_aligned(canvas, 128 / 2, 3, AlignCenter, AlignTop, "Connected!"); } else if(model->display_msg == U2fMsgRegister) { - if(xtreme_assets.is_nsfw) { - elements_button_center(canvas, "CUM"); - canvas_draw_icon(canvas, 22, 15, &I_Auth_62x31); - canvas_draw_str_aligned( - canvas, 128 / 2, 3, AlignCenter, AlignTop, "Press CUM to register"); - } else { - elements_button_center(canvas, "OK"); - canvas_draw_icon(canvas, 22, 15, &I_Auth_62x31); - canvas_draw_str_aligned( - canvas, 128 / 2, 3, AlignCenter, AlignTop, "Press OK to register"); - } + elements_button_center(canvas, "OK"); + canvas_draw_icon(canvas, 22, 15, &I_Auth_62x31); + canvas_draw_str_aligned(canvas, 128 / 2, 3, AlignCenter, AlignTop, "Press OK to register"); } else if(model->display_msg == U2fMsgAuth) { - if(xtreme_assets.is_nsfw) { - elements_button_center(canvas, "CUM"); - canvas_draw_icon(canvas, 22, 15, &I_Auth_62x31); - canvas_draw_str_aligned( - canvas, 128 / 2, 3, AlignCenter, AlignTop, "Press CUM to authenticate"); - } else { - elements_button_center(canvas, "OK"); - canvas_draw_icon(canvas, 22, 15, &I_Auth_62x31); - canvas_draw_str_aligned( - canvas, 128 / 2, 3, AlignCenter, AlignTop, "Press OK to authenticate"); - } + elements_button_center(canvas, "OK"); + canvas_draw_icon(canvas, 22, 15, &I_Auth_62x31); + canvas_draw_str_aligned( + canvas, 128 / 2, 3, AlignCenter, AlignTop, "Press OK to authenticate"); } else if(model->display_msg == U2fMsgSuccess) { canvas_draw_icon(canvas, 22, 15, &I_Connected_62x31); - if(xtreme_assets.is_nsfw) { - canvas_draw_str_aligned(canvas, 128 / 2, 3, AlignCenter, AlignTop, "Cum released~"); - } else { - canvas_draw_str_aligned( - canvas, 128 / 2, 3, AlignCenter, AlignTop, "Authentication successful!"); - } + canvas_draw_str_aligned( + canvas, 128 / 2, 3, AlignCenter, AlignTop, "Authentication successful!"); } else if(model->display_msg == U2fMsgError) { canvas_draw_icon(canvas, 22, 15, &I_Error_62x31); - if(xtreme_assets.is_nsfw) { - canvas_draw_str_aligned(canvas, 128 / 2, 3, AlignCenter, AlignTop, "Unable to cum"); - } else { - canvas_draw_str_aligned( - canvas, 128 / 2, 3, AlignCenter, AlignTop, "Certificate error"); - } + canvas_draw_str_aligned(canvas, 128 / 2, 3, AlignCenter, AlignTop, "Certificate error"); } } diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene.c b/applications/main/xtreme_app/scenes/xtreme_app_scene.c deleted file mode 100644 index 5448bb85a..000000000 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene.c +++ /dev/null @@ -1,30 +0,0 @@ -#include "xtreme_app_scene.h" - -// Generate scene on_enter handlers array -#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_enter, -void (*const xtreme_app_on_enter_handlers[])(void*) = { -#include "xtreme_app_scene_config.h" -}; -#undef ADD_SCENE - -// Generate scene on_event handlers array -#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_event, -bool (*const xtreme_app_on_event_handlers[])(void* context, SceneManagerEvent event) = { -#include "xtreme_app_scene_config.h" -}; -#undef ADD_SCENE - -// Generate scene on_exit handlers array -#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_exit, -void (*const xtreme_app_on_exit_handlers[])(void* context) = { -#include "xtreme_app_scene_config.h" -}; -#undef ADD_SCENE - -// Initialize scene handlers configuration structure -const SceneManagerHandlers xtreme_app_scene_handlers = { - .on_enter_handlers = xtreme_app_on_enter_handlers, - .on_event_handlers = xtreme_app_on_event_handlers, - .on_exit_handlers = xtreme_app_on_exit_handlers, - .scene_num = XtremeAppSceneNum, -}; diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_config.h b/applications/main/xtreme_app/scenes/xtreme_app_scene_config.h deleted file mode 100644 index 16a9436ad..000000000 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_config.h +++ /dev/null @@ -1,21 +0,0 @@ -ADD_SCENE(xtreme_app, start, Start) -ADD_SCENE(xtreme_app, interface, Interface) -ADD_SCENE(xtreme_app, interface_graphics, InterfaceGraphics) -ADD_SCENE(xtreme_app, interface_mainmenu, InterfaceMainmenu) -ADD_SCENE(xtreme_app, interface_mainmenu_add, InterfaceMainmenuAdd) -ADD_SCENE(xtreme_app, interface_mainmenu_add_main, InterfaceMainmenuAddMain) -ADD_SCENE(xtreme_app, interface_mainmenu_reset, InterfaceMainmenuReset) -ADD_SCENE(xtreme_app, interface_lockscreen, InterfaceLockscreen) -ADD_SCENE(xtreme_app, interface_statusbar, InterfaceStatusbar) -ADD_SCENE(xtreme_app, interface_filebrowser, InterfaceFilebrowser) -ADD_SCENE(xtreme_app, protocols, Protocols) -ADD_SCENE(xtreme_app, protocols_freqs, ProtocolsFreqs) -ADD_SCENE(xtreme_app, protocols_freqs_static, ProtocolsFreqsStatic) -ADD_SCENE(xtreme_app, protocols_freqs_hopper, ProtocolsFreqsHopper) -ADD_SCENE(xtreme_app, protocols_freqs_add, ProtocolsFreqsAdd) -ADD_SCENE(xtreme_app, protocols_gpio, ProtocolsGpio) -ADD_SCENE(xtreme_app, misc, Misc) -ADD_SCENE(xtreme_app, misc_screen, MiscScreen) -ADD_SCENE(xtreme_app, misc_screen_color, MiscScreenColor) -ADD_SCENE(xtreme_app, misc_dolphin, MiscDolphin) -ADD_SCENE(xtreme_app, misc_rename, MiscRename) diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_interface.c b/applications/main/xtreme_app/scenes/xtreme_app_scene_interface.c deleted file mode 100644 index a98ca56c5..000000000 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_interface.c +++ /dev/null @@ -1,86 +0,0 @@ -#include "../xtreme_app.h" - -enum VarItemListIndex { - VarItemListIndexGraphics, - VarItemListIndexMainmenu, - VarItemListIndexLockscreen, - VarItemListIndexStatusbar, - VarItemListIndexFileBrowser, -}; - -void xtreme_app_scene_interface_var_item_list_callback(void* context, uint32_t index) { - XtremeApp* app = context; - view_dispatcher_send_custom_event(app->view_dispatcher, index); -} - -void xtreme_app_scene_interface_on_enter(void* context) { - XtremeApp* app = context; - VariableItemList* var_item_list = app->var_item_list; - VariableItem* item; - - item = variable_item_list_add(var_item_list, "Graphics", 0, NULL, app); - variable_item_set_current_value_text(item, ">"); - - item = variable_item_list_add(var_item_list, "Mainmenu", 0, NULL, app); - variable_item_set_current_value_text(item, ">"); - - item = variable_item_list_add(var_item_list, "Lockscreen", 0, NULL, app); - variable_item_set_current_value_text(item, ">"); - - item = variable_item_list_add(var_item_list, "Statusbar", 0, NULL, app); - variable_item_set_current_value_text(item, ">"); - - item = variable_item_list_add(var_item_list, "File Browser", 0, NULL, app); - variable_item_set_current_value_text(item, ">"); - - variable_item_list_set_enter_callback( - var_item_list, xtreme_app_scene_interface_var_item_list_callback, app); - - variable_item_list_set_selected_item( - var_item_list, scene_manager_get_scene_state(app->scene_manager, XtremeAppSceneInterface)); - - view_dispatcher_switch_to_view(app->view_dispatcher, XtremeAppViewVarItemList); -} - -bool xtreme_app_scene_interface_on_event(void* context, SceneManagerEvent event) { - XtremeApp* app = context; - bool consumed = false; - - if(event.type == SceneManagerEventTypeCustom) { - scene_manager_set_scene_state(app->scene_manager, XtremeAppSceneInterface, event.event); - consumed = true; - switch(event.event) { - case VarItemListIndexGraphics: - scene_manager_set_scene_state(app->scene_manager, XtremeAppSceneInterfaceGraphics, 0); - scene_manager_next_scene(app->scene_manager, XtremeAppSceneInterfaceGraphics); - break; - case VarItemListIndexMainmenu: - scene_manager_set_scene_state(app->scene_manager, XtremeAppSceneInterfaceMainmenu, 0); - scene_manager_next_scene(app->scene_manager, XtremeAppSceneInterfaceMainmenu); - break; - case VarItemListIndexLockscreen: - scene_manager_set_scene_state( - app->scene_manager, XtremeAppSceneInterfaceLockscreen, 0); - scene_manager_next_scene(app->scene_manager, XtremeAppSceneInterfaceLockscreen); - break; - case VarItemListIndexStatusbar: - scene_manager_set_scene_state(app->scene_manager, XtremeAppSceneInterfaceStatusbar, 0); - scene_manager_next_scene(app->scene_manager, XtremeAppSceneInterfaceStatusbar); - break; - case VarItemListIndexFileBrowser: - scene_manager_set_scene_state( - app->scene_manager, XtremeAppSceneInterfaceFilebrowser, 0); - scene_manager_next_scene(app->scene_manager, XtremeAppSceneInterfaceFilebrowser); - break; - default: - break; - } - } - - return consumed; -} - -void xtreme_app_scene_interface_on_exit(void* context) { - XtremeApp* app = context; - variable_item_list_reset(app->var_item_list); -} diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_filebrowser.c b/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_filebrowser.c deleted file mode 100644 index 99e2a19a5..000000000 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_filebrowser.c +++ /dev/null @@ -1,122 +0,0 @@ -#include "../xtreme_app.h" - -enum VarItemListIndex { - VarItemListIndexSortDirsFirst, - VarItemListIndexShowHiddenFiles, - VarItemListIndexShowInternalTab, - VarItemListIndexFavoriteTimeout, -}; - -void xtreme_app_scene_interface_filebrowser_var_item_list_callback(void* context, uint32_t index) { - XtremeApp* app = context; - view_dispatcher_send_custom_event(app->view_dispatcher, index); -} - -static void xtreme_app_scene_interface_filebrowser_sort_dirs_first_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); - bool value = variable_item_get_current_value_index(item); - variable_item_set_current_value_text(item, value ? "ON" : "OFF"); - xtreme_settings.sort_dirs_first = value; - app->save_settings = true; -} - -static void xtreme_app_scene_interface_filebrowser_show_hidden_files_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); - bool value = variable_item_get_current_value_index(item); - variable_item_set_current_value_text(item, value ? "ON" : "OFF"); - xtreme_settings.show_hidden_files = value; - app->save_settings = true; -} - -static void xtreme_app_scene_interface_filebrowser_show_internal_tab_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); - bool value = variable_item_get_current_value_index(item); - variable_item_set_current_value_text(item, value ? "ON" : "OFF"); - xtreme_settings.show_internal_tab = value; - app->save_settings = true; -} - -static void xtreme_app_scene_interface_filebrowser_favorite_timeout_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); - uint32_t value = variable_item_get_current_value_index(item); - char text[6]; - snprintf(text, sizeof(text), "%lu S", value); - variable_item_set_current_value_text(item, value ? text : "OFF"); - xtreme_settings.favorite_timeout = value; - app->save_settings = true; -} - -void xtreme_app_scene_interface_filebrowser_on_enter(void* context) { - XtremeApp* app = context; - VariableItemList* var_item_list = app->var_item_list; - VariableItem* item; - - item = variable_item_list_add( - var_item_list, - "Folders Above Files", - 2, - xtreme_app_scene_interface_filebrowser_sort_dirs_first_changed, - app); - variable_item_set_current_value_index(item, xtreme_settings.sort_dirs_first); - variable_item_set_current_value_text(item, xtreme_settings.sort_dirs_first ? "ON" : "OFF"); - - item = variable_item_list_add( - var_item_list, - "Show Hidden Files", - 2, - xtreme_app_scene_interface_filebrowser_show_hidden_files_changed, - app); - variable_item_set_current_value_index(item, xtreme_settings.show_hidden_files); - variable_item_set_current_value_text(item, xtreme_settings.show_hidden_files ? "ON" : "OFF"); - - item = variable_item_list_add( - var_item_list, - "Show Internal Tab", - 2, - xtreme_app_scene_interface_filebrowser_show_internal_tab_changed, - app); - variable_item_set_current_value_index(item, xtreme_settings.show_internal_tab); - variable_item_set_current_value_text(item, xtreme_settings.show_internal_tab ? "ON" : "OFF"); - - item = variable_item_list_add( - var_item_list, - "Favorite Timeout", - 61, - xtreme_app_scene_interface_filebrowser_favorite_timeout_changed, - app); - variable_item_set_current_value_index(item, xtreme_settings.favorite_timeout); - char text[4]; - snprintf(text, sizeof(text), "%lu S", xtreme_settings.favorite_timeout); - variable_item_set_current_value_text(item, xtreme_settings.favorite_timeout ? text : "OFF"); - - variable_item_list_set_enter_callback( - var_item_list, xtreme_app_scene_interface_filebrowser_var_item_list_callback, app); - - variable_item_list_set_selected_item( - var_item_list, - scene_manager_get_scene_state(app->scene_manager, XtremeAppSceneInterfaceFilebrowser)); - - view_dispatcher_switch_to_view(app->view_dispatcher, XtremeAppViewVarItemList); -} - -bool xtreme_app_scene_interface_filebrowser_on_event(void* context, SceneManagerEvent event) { - XtremeApp* app = context; - bool consumed = false; - - if(event.type == SceneManagerEventTypeCustom) { - scene_manager_set_scene_state( - app->scene_manager, XtremeAppSceneInterfaceFilebrowser, event.event); - consumed = true; - switch(event.event) { - default: - break; - } - } - - return consumed; -} - -void xtreme_app_scene_interface_filebrowser_on_exit(void* context) { - XtremeApp* app = context; - variable_item_list_reset(app->var_item_list); -} diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_lockscreen.c b/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_lockscreen.c deleted file mode 100644 index 670feb186..000000000 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_lockscreen.c +++ /dev/null @@ -1,230 +0,0 @@ -#include "../xtreme_app.h" - -enum VarItemListIndex { - VarItemListIndexLockOnBoot, - VarItemListIndexFormatOn10BadPins, - VarItemListIndexPinUnlockFromApp, - VarItemListIndexShowTime, - VarItemListIndexShowSeconds, - VarItemListIndexShowDate, - VarItemListIndexShowStatusbar, - VarItemListIndexUnlockPrompt, -}; - -void xtreme_app_scene_interface_lockscreen_var_item_list_callback(void* context, uint32_t index) { - XtremeApp* app = context; - view_dispatcher_send_custom_event(app->view_dispatcher, index); -} - -static void xtreme_app_scene_interface_lockscreen_lock_on_boot_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); - bool value = variable_item_get_current_value_index(item); - variable_item_set_current_value_text(item, value ? "ON" : "OFF"); - xtreme_settings.lock_on_boot = value; - app->save_settings = true; -} - -static void xtreme_app_scene_interface_lockscreen_bad_pins_format_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); - bool value = variable_item_get_current_value_index(item); - variable_item_set_current_value_text(item, value ? "ON" : "OFF"); - xtreme_settings.bad_pins_format = value; - app->save_settings = true; -} - -static void - xtreme_app_scene_interface_lockscreen_allow_locked_rpc_commands_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); - bool value = variable_item_get_current_value_index(item); - variable_item_set_current_value_text(item, value ? "ON" : "OFF"); - xtreme_settings.allow_locked_rpc_commands = value; - app->save_settings = true; -} - -static void xtreme_app_scene_interface_lockscreen_lockscreen_poweroff_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); - bool value = variable_item_get_current_value_index(item); - variable_item_set_current_value_text(item, value ? "ON" : "OFF"); - xtreme_settings.lockscreen_poweroff = value; - app->save_settings = true; -} - -static void xtreme_app_scene_interface_lockscreen_lockscreen_time_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); - bool value = variable_item_get_current_value_index(item); - variable_item_set_current_value_text(item, value ? "ON" : "OFF"); - xtreme_settings.lockscreen_time = value; - app->save_settings = true; -} - -static void xtreme_app_scene_interface_lockscreen_lockscreen_seconds_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); - bool value = variable_item_get_current_value_index(item); - variable_item_set_current_value_text(item, value ? "ON" : "OFF"); - xtreme_settings.lockscreen_seconds = value; - app->save_settings = true; -} - -static void xtreme_app_scene_interface_lockscreen_lockscreen_date_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); - bool value = variable_item_get_current_value_index(item); - variable_item_set_current_value_text(item, value ? "ON" : "OFF"); - xtreme_settings.lockscreen_date = value; - app->save_settings = true; -} - -static void - xtreme_app_scene_interface_lockscreen_lockscreen_statusbar_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); - bool value = variable_item_get_current_value_index(item); - variable_item_set_current_value_text(item, value ? "ON" : "OFF"); - xtreme_settings.lockscreen_statusbar = value; - app->save_settings = true; -} - -static void xtreme_app_scene_interface_lockscreen_lockscreen_prompt_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); - bool value = variable_item_get_current_value_index(item); - variable_item_set_current_value_text(item, value ? "ON" : "OFF"); - xtreme_settings.lockscreen_prompt = value; - app->save_settings = true; -} - -static void - xtreme_app_scene_interface_lockscreen_lockscreen_transparent_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); - bool value = variable_item_get_current_value_index(item); - variable_item_set_current_value_text(item, value ? "ON" : "OFF"); - xtreme_settings.lockscreen_transparent = value; - app->save_settings = true; -} - -void xtreme_app_scene_interface_lockscreen_on_enter(void* context) { - XtremeApp* app = context; - VariableItemList* var_item_list = app->var_item_list; - VariableItem* item; - - item = variable_item_list_add( - var_item_list, - "Lock on Boot", - 2, - xtreme_app_scene_interface_lockscreen_lock_on_boot_changed, - app); - variable_item_set_current_value_index(item, xtreme_settings.lock_on_boot); - variable_item_set_current_value_text(item, xtreme_settings.lock_on_boot ? "ON" : "OFF"); - - item = variable_item_list_add( - var_item_list, - "Format on 10 Bad PINs", - 2, - xtreme_app_scene_interface_lockscreen_bad_pins_format_changed, - app); - variable_item_set_current_value_index(item, xtreme_settings.bad_pins_format); - variable_item_set_current_value_text(item, xtreme_settings.bad_pins_format ? "ON" : "OFF"); - - item = variable_item_list_add( - var_item_list, - "Allow RPC While Locked", - 2, - xtreme_app_scene_interface_lockscreen_allow_locked_rpc_commands_changed, - app); - variable_item_set_current_value_index(item, xtreme_settings.allow_locked_rpc_commands); - variable_item_set_current_value_text( - item, xtreme_settings.allow_locked_rpc_commands ? "ON" : "OFF"); - - item = variable_item_list_add( - var_item_list, - "Allow Poweroff", - 2, - xtreme_app_scene_interface_lockscreen_lockscreen_poweroff_changed, - app); - variable_item_set_current_value_index(item, xtreme_settings.lockscreen_poweroff); - variable_item_set_current_value_text(item, xtreme_settings.lockscreen_poweroff ? "ON" : "OFF"); - - item = variable_item_list_add( - var_item_list, - "Show Time", - 2, - xtreme_app_scene_interface_lockscreen_lockscreen_time_changed, - app); - variable_item_set_current_value_index(item, xtreme_settings.lockscreen_time); - variable_item_set_current_value_text(item, xtreme_settings.lockscreen_time ? "ON" : "OFF"); - - item = variable_item_list_add( - var_item_list, - "Show Seconds", - 2, - xtreme_app_scene_interface_lockscreen_lockscreen_seconds_changed, - app); - variable_item_set_current_value_index(item, xtreme_settings.lockscreen_seconds); - variable_item_set_current_value_text(item, xtreme_settings.lockscreen_seconds ? "ON" : "OFF"); - - item = variable_item_list_add( - var_item_list, - "Show Date", - 2, - xtreme_app_scene_interface_lockscreen_lockscreen_date_changed, - app); - variable_item_set_current_value_index(item, xtreme_settings.lockscreen_date); - variable_item_set_current_value_text(item, xtreme_settings.lockscreen_date ? "ON" : "OFF"); - - item = variable_item_list_add( - var_item_list, - "Show Statusbar", - 2, - xtreme_app_scene_interface_lockscreen_lockscreen_statusbar_changed, - app); - variable_item_set_current_value_index(item, xtreme_settings.lockscreen_statusbar); - variable_item_set_current_value_text( - item, xtreme_settings.lockscreen_statusbar ? "ON" : "OFF"); - - item = variable_item_list_add( - var_item_list, - "Unlock Prompt", - 2, - xtreme_app_scene_interface_lockscreen_lockscreen_prompt_changed, - app); - variable_item_set_current_value_index(item, xtreme_settings.lockscreen_prompt); - variable_item_set_current_value_text(item, xtreme_settings.lockscreen_prompt ? "ON" : "OFF"); - - item = variable_item_list_add( - var_item_list, - "Transparent (see animation)", - 2, - xtreme_app_scene_interface_lockscreen_lockscreen_transparent_changed, - app); - variable_item_set_current_value_index(item, xtreme_settings.lockscreen_transparent); - variable_item_set_current_value_text( - item, xtreme_settings.lockscreen_transparent ? "ON" : "OFF"); - - variable_item_list_set_enter_callback( - var_item_list, xtreme_app_scene_interface_lockscreen_var_item_list_callback, app); - - variable_item_list_set_selected_item( - var_item_list, - scene_manager_get_scene_state(app->scene_manager, XtremeAppSceneInterfaceLockscreen)); - - view_dispatcher_switch_to_view(app->view_dispatcher, XtremeAppViewVarItemList); -} - -bool xtreme_app_scene_interface_lockscreen_on_event(void* context, SceneManagerEvent event) { - XtremeApp* app = context; - bool consumed = false; - - if(event.type == SceneManagerEventTypeCustom) { - scene_manager_set_scene_state( - app->scene_manager, XtremeAppSceneInterfaceLockscreen, event.event); - consumed = true; - switch(event.event) { - default: - break; - } - } - - return consumed; -} - -void xtreme_app_scene_interface_lockscreen_on_exit(void* context) { - XtremeApp* app = context; - variable_item_list_reset(app->var_item_list); -} diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_statusbar.c b/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_statusbar.c deleted file mode 100644 index b29269631..000000000 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_statusbar.c +++ /dev/null @@ -1,147 +0,0 @@ -#include "../xtreme_app.h" - -enum VarItemListIndex { - VarItemListIndexBatteryIcon, - VarItemListIndexShowClock, - VarItemListIndexStatusIcons, - VarItemListIndexBarBorders, - VarItemListIndexBarBackground, -}; - -void xtreme_app_scene_interface_statusbar_var_item_list_callback(void* context, uint32_t index) { - XtremeApp* app = context; - view_dispatcher_send_custom_event(app->view_dispatcher, index); -} - -const char* const battery_icon_names[BatteryIconCount] = { - "OFF", - "Bar", - "%", - "Inv. %", - "Retro 3", - "Retro 5", - "Bar %", -}; -static void xtreme_app_scene_interface_statusbar_battery_icon_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); - uint8_t index = variable_item_get_current_value_index(item); - variable_item_set_current_value_text(item, battery_icon_names[index]); - xtreme_settings.battery_icon = index; - app->save_settings = true; - power_set_battery_icon_enabled(furi_record_open(RECORD_POWER), index != BatteryIconOff); - furi_record_close(RECORD_POWER); -} - -static void xtreme_app_scene_interface_statusbar_statusbar_clock_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); - bool value = variable_item_get_current_value_index(item); - variable_item_set_current_value_text(item, value ? "ON" : "OFF"); - xtreme_settings.statusbar_clock = value; - app->save_settings = true; -} - -static void xtreme_app_scene_interface_statusbar_status_icons_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); - bool value = variable_item_get_current_value_index(item); - variable_item_set_current_value_text(item, value ? "ON" : "OFF"); - xtreme_settings.status_icons = value; - app->save_settings = true; -} - -static void xtreme_app_scene_interface_statusbar_bar_borders_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); - bool value = variable_item_get_current_value_index(item); - variable_item_set_current_value_text(item, value ? "ON" : "OFF"); - xtreme_settings.bar_borders = value; - app->save_settings = true; -} - -static void xtreme_app_scene_interface_statusbar_bar_background_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); - bool value = variable_item_get_current_value_index(item); - variable_item_set_current_value_text(item, value ? "ON" : "OFF"); - xtreme_settings.bar_background = value; - app->save_settings = true; -} - -void xtreme_app_scene_interface_statusbar_on_enter(void* context) { - XtremeApp* app = context; - VariableItemList* var_item_list = app->var_item_list; - VariableItem* item; - - item = variable_item_list_add( - var_item_list, - "Battery Icon", - BatteryIconCount, - xtreme_app_scene_interface_statusbar_battery_icon_changed, - app); - variable_item_set_current_value_index(item, xtreme_settings.battery_icon); - variable_item_set_current_value_text(item, battery_icon_names[xtreme_settings.battery_icon]); - - item = variable_item_list_add( - var_item_list, - "Show Clock", - 2, - xtreme_app_scene_interface_statusbar_statusbar_clock_changed, - app); - variable_item_set_current_value_index(item, xtreme_settings.statusbar_clock); - variable_item_set_current_value_text(item, xtreme_settings.statusbar_clock ? "ON" : "OFF"); - - item = variable_item_list_add( - var_item_list, - "Status Icons", - 2, - xtreme_app_scene_interface_statusbar_status_icons_changed, - app); - variable_item_set_current_value_index(item, xtreme_settings.status_icons); - variable_item_set_current_value_text(item, xtreme_settings.status_icons ? "ON" : "OFF"); - - item = variable_item_list_add( - var_item_list, - "Bar Borders", - 2, - xtreme_app_scene_interface_statusbar_bar_borders_changed, - app); - variable_item_set_current_value_index(item, xtreme_settings.bar_borders); - variable_item_set_current_value_text(item, xtreme_settings.bar_borders ? "ON" : "OFF"); - - item = variable_item_list_add( - var_item_list, - "Bar Background", - 2, - xtreme_app_scene_interface_statusbar_bar_background_changed, - app); - variable_item_set_current_value_index(item, xtreme_settings.bar_background); - variable_item_set_current_value_text(item, xtreme_settings.bar_background ? "ON" : "OFF"); - - variable_item_list_set_enter_callback( - var_item_list, xtreme_app_scene_interface_statusbar_var_item_list_callback, app); - - variable_item_list_set_selected_item( - var_item_list, - scene_manager_get_scene_state(app->scene_manager, XtremeAppSceneInterfaceStatusbar)); - - view_dispatcher_switch_to_view(app->view_dispatcher, XtremeAppViewVarItemList); -} - -bool xtreme_app_scene_interface_statusbar_on_event(void* context, SceneManagerEvent event) { - XtremeApp* app = context; - bool consumed = false; - - if(event.type == SceneManagerEventTypeCustom) { - scene_manager_set_scene_state( - app->scene_manager, XtremeAppSceneInterfaceStatusbar, event.event); - consumed = true; - switch(event.event) { - default: - break; - } - } - - return consumed; -} - -void xtreme_app_scene_interface_statusbar_on_exit(void* context) { - XtremeApp* app = context; - variable_item_list_reset(app->var_item_list); -} diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols.c b/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols.c deleted file mode 100644 index 1aa8ddb6d..000000000 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols.c +++ /dev/null @@ -1,123 +0,0 @@ -#include "../xtreme_app.h" - -enum VarItemListIndex { - VarItemListIndexBadkbMode, - VarItemListIndexBadbtRemember, - VarItemListIndexSubghzFreqs, - VarItemListIndexSubghzExtend, - VarItemListIndexGpioPins, -}; - -void xtreme_app_scene_protocols_var_item_list_callback(void* context, uint32_t index) { - XtremeApp* app = context; - view_dispatcher_send_custom_event(app->view_dispatcher, index); -} - -static void xtreme_app_scene_protocols_bad_bt_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); - bool value = variable_item_get_current_value_index(item); - variable_item_set_current_value_text(item, value ? "BT" : "USB"); - xtreme_settings.bad_bt = value; - app->save_settings = true; -} - -static void xtreme_app_scene_protocols_bad_bt_remember_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); - bool value = variable_item_get_current_value_index(item); - variable_item_set_current_value_text(item, value ? "ON" : "OFF"); - xtreme_settings.bad_bt_remember = value; - app->save_settings = true; -} - -static void xtreme_app_scene_protocols_subghz_extend_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); - app->subghz_extend = variable_item_get_current_value_index(item); - variable_item_set_current_value_text(item, app->subghz_extend ? "ON" : "OFF"); - app->save_subghz = true; -} - -static void xtreme_app_scene_protocols_file_naming_prefix_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); - bool value = variable_item_get_current_value_index(item); - variable_item_set_current_value_text(item, value ? "After" : "Before"); - xtreme_settings.file_naming_prefix_after = value; - app->save_settings = true; -} - -void xtreme_app_scene_protocols_on_enter(void* context) { - XtremeApp* app = context; - VariableItemList* var_item_list = app->var_item_list; - VariableItem* item; - - item = variable_item_list_add( - var_item_list, "BadKB Mode", 2, xtreme_app_scene_protocols_bad_bt_changed, app); - variable_item_set_current_value_index(item, xtreme_settings.bad_bt); - variable_item_set_current_value_text(item, xtreme_settings.bad_bt ? "BT" : "USB"); - - item = variable_item_list_add( - var_item_list, - "BadBT Remember", - 2, - xtreme_app_scene_protocols_bad_bt_remember_changed, - app); - variable_item_set_current_value_index(item, xtreme_settings.bad_bt_remember); - variable_item_set_current_value_text(item, xtreme_settings.bad_bt_remember ? "ON" : "OFF"); - - item = variable_item_list_add(var_item_list, "SubGHz Freqs", 0, NULL, app); - variable_item_set_current_value_text(item, ">"); - - item = variable_item_list_add( - var_item_list, "SubGHz Extend", 2, xtreme_app_scene_protocols_subghz_extend_changed, app); - variable_item_set_current_value_index(item, app->subghz_extend); - variable_item_set_current_value_text(item, app->subghz_extend ? "ON" : "OFF"); - - item = variable_item_list_add(var_item_list, "GPIO Pins", 0, NULL, app); - variable_item_set_current_value_text(item, ">"); - - item = variable_item_list_add( - var_item_list, - "File Naming Prefix", - 2, - xtreme_app_scene_protocols_file_naming_prefix_changed, - app); - variable_item_set_current_value_index(item, xtreme_settings.file_naming_prefix_after); - variable_item_set_current_value_text( - item, xtreme_settings.file_naming_prefix_after ? "After" : "Before"); - - variable_item_list_set_enter_callback( - var_item_list, xtreme_app_scene_protocols_var_item_list_callback, app); - - variable_item_list_set_selected_item( - var_item_list, scene_manager_get_scene_state(app->scene_manager, XtremeAppSceneProtocols)); - - view_dispatcher_switch_to_view(app->view_dispatcher, XtremeAppViewVarItemList); -} - -bool xtreme_app_scene_protocols_on_event(void* context, SceneManagerEvent event) { - XtremeApp* app = context; - bool consumed = false; - - if(event.type == SceneManagerEventTypeCustom) { - scene_manager_set_scene_state(app->scene_manager, XtremeAppSceneProtocols, event.event); - consumed = true; - switch(event.event) { - case VarItemListIndexSubghzFreqs: - scene_manager_set_scene_state(app->scene_manager, XtremeAppSceneProtocolsFreqs, 0); - scene_manager_next_scene(app->scene_manager, XtremeAppSceneProtocolsFreqs); - break; - case VarItemListIndexGpioPins: - scene_manager_set_scene_state(app->scene_manager, XtremeAppSceneProtocolsGpio, 0); - scene_manager_next_scene(app->scene_manager, XtremeAppSceneProtocolsGpio); - break; - default: - break; - } - } - - return consumed; -} - -void xtreme_app_scene_protocols_on_exit(void* context) { - XtremeApp* app = context; - variable_item_list_reset(app->var_item_list); -} diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols_gpio.c b/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols_gpio.c deleted file mode 100644 index 8f498011a..000000000 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols_gpio.c +++ /dev/null @@ -1,152 +0,0 @@ -#include "../xtreme_app.h" - -enum VarItemListIndex { - VarItemListIndexSpiCc1101Handle, - VarItemListIndexSpiNrf24Handle, - VarItemListIndexUartEspChannel, - VarItemListIndexUartNmeaChannel, - VarItemListIndexUartGeneralChannel, -}; - -#define SPI_DEFAULT "Default 4" -#define SPI_EXTRA "Extra 7" -#define UART_DEFAULT "Default 13,14" -#define UART_EXTRA "Extra 15,16" - -void xtreme_app_scene_protocols_gpio_var_item_list_callback(void* context, uint32_t index) { - XtremeApp* app = context; - view_dispatcher_send_custom_event(app->view_dispatcher, index); -} - -static void xtreme_app_scene_protocols_gpio_cc1101_handle_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); - xtreme_settings.spi_cc1101_handle = - variable_item_get_current_value_index(item) == 0 ? SpiDefault : SpiExtra; - variable_item_set_current_value_text( - item, xtreme_settings.spi_cc1101_handle == SpiDefault ? SPI_DEFAULT : SPI_EXTRA); - app->save_settings = true; -} - -static void xtreme_app_scene_protocols_gpio_nrf24_handle_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); - xtreme_settings.spi_nrf24_handle = - variable_item_get_current_value_index(item) == 0 ? SpiDefault : SpiExtra; - variable_item_set_current_value_text( - item, xtreme_settings.spi_nrf24_handle == SpiDefault ? SPI_DEFAULT : SPI_EXTRA); - app->save_settings = true; -} - -static void xtreme_app_scene_protocols_gpio_esp32_channel_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); - xtreme_settings.uart_esp_channel = variable_item_get_current_value_index(item) == 0 ? - FuriHalSerialIdUsart : - FuriHalSerialIdLpuart; - variable_item_set_current_value_text( - item, - xtreme_settings.uart_esp_channel == FuriHalSerialIdUsart ? UART_DEFAULT : UART_EXTRA); - app->save_settings = true; -} - -static void xtreme_app_scene_protocols_gpio_nmea_channel_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); - xtreme_settings.uart_nmea_channel = variable_item_get_current_value_index(item) == 0 ? - FuriHalSerialIdUsart : - FuriHalSerialIdLpuart; - variable_item_set_current_value_text( - item, - xtreme_settings.uart_nmea_channel == FuriHalSerialIdUsart ? UART_DEFAULT : UART_EXTRA); - app->save_settings = true; -} - -static void xtreme_app_scene_protocols_gpio_general_channel_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); - xtreme_settings.uart_general_channel = variable_item_get_current_value_index(item) == 0 ? - FuriHalSerialIdUsart : - FuriHalSerialIdLpuart; - variable_item_set_current_value_text( - item, - xtreme_settings.uart_general_channel == FuriHalSerialIdUsart ? UART_DEFAULT : UART_EXTRA); - app->save_settings = true; -} - -void xtreme_app_scene_protocols_gpio_on_enter(void* context) { - XtremeApp* app = context; - VariableItemList* var_item_list = app->var_item_list; - VariableItem* item; - - item = variable_item_list_add( - var_item_list, "CC1101 SPI", 2, xtreme_app_scene_protocols_gpio_cc1101_handle_changed, app); - variable_item_set_current_value_index(item, xtreme_settings.spi_cc1101_handle); - variable_item_set_current_value_text( - item, xtreme_settings.spi_cc1101_handle == SpiDefault ? SPI_DEFAULT : SPI_EXTRA); - - item = variable_item_list_add( - var_item_list, "NRF24 SPI", 2, xtreme_app_scene_protocols_gpio_nrf24_handle_changed, app); - variable_item_set_current_value_index(item, xtreme_settings.spi_nrf24_handle); - variable_item_set_current_value_text( - item, xtreme_settings.spi_nrf24_handle == SpiDefault ? SPI_DEFAULT : SPI_EXTRA); - - item = variable_item_list_add( - var_item_list, - "ESP32/8266 UART", - 2, - xtreme_app_scene_protocols_gpio_esp32_channel_changed, - app); - variable_item_set_current_value_index(item, xtreme_settings.uart_esp_channel); - variable_item_set_current_value_text( - item, - xtreme_settings.uart_esp_channel == FuriHalSerialIdUsart ? UART_DEFAULT : UART_EXTRA); - - item = variable_item_list_add( - var_item_list, - "NMEA GPS UART", - 2, - xtreme_app_scene_protocols_gpio_nmea_channel_changed, - app); - variable_item_set_current_value_index(item, xtreme_settings.uart_nmea_channel); - variable_item_set_current_value_text( - item, - xtreme_settings.uart_nmea_channel == FuriHalSerialIdUsart ? UART_DEFAULT : UART_EXTRA); - - item = variable_item_list_add( - var_item_list, - "General UART", - 2, - xtreme_app_scene_protocols_gpio_general_channel_changed, - app); - variable_item_set_current_value_index(item, xtreme_settings.uart_general_channel); - variable_item_set_current_value_text( - item, - xtreme_settings.uart_general_channel == FuriHalSerialIdUsart ? UART_DEFAULT : UART_EXTRA); - - variable_item_list_set_enter_callback( - var_item_list, xtreme_app_scene_protocols_gpio_var_item_list_callback, app); - - variable_item_list_set_selected_item( - var_item_list, - scene_manager_get_scene_state(app->scene_manager, XtremeAppSceneProtocolsGpio)); - - view_dispatcher_switch_to_view(app->view_dispatcher, XtremeAppViewVarItemList); -} - -bool xtreme_app_scene_protocols_gpio_on_event(void* context, SceneManagerEvent event) { - XtremeApp* app = context; - bool consumed = false; - - if(event.type == SceneManagerEventTypeCustom) { - scene_manager_set_scene_state( - app->scene_manager, XtremeAppSceneProtocolsGpio, event.event); - consumed = true; - switch(event.event) { - default: - break; - } - } - - return consumed; -} - -void xtreme_app_scene_protocols_gpio_on_exit(void* context) { - XtremeApp* app = context; - variable_item_list_reset(app->var_item_list); -} diff --git a/applications/services/bt/bt_service/bt.h b/applications/services/bt/bt_service/bt.h index d49b0b3ba..84e0e573c 100644 --- a/applications/services/bt/bt_service/bt.h +++ b/applications/services/bt/bt_service/bt.h @@ -86,17 +86,16 @@ void bt_keys_storage_set_default_path(Bt* bt); bool bt_remote_rssi(Bt* bt, uint8_t* rssi); -/** - * - * (Probably bad) way of opening the RPC connection, everywhereTM -*/ - +/** Open a new RPC connection + * + * @param bt Bt instance + */ void bt_open_rpc_connection(Bt* bt); -/** - * - * Closing the RPC connection, everywhereTM -*/ +/** Close the active RPC connection + * + * @param bt Bt instance + */ void bt_close_rpc_connection(Bt* bt); #ifdef __cplusplus diff --git a/applications/services/bt/bt_service/bt_i.h b/applications/services/bt/bt_service/bt_i.h index 4fcc02aa1..933d493a9 100644 --- a/applications/services/bt/bt_service/bt_i.h +++ b/applications/services/bt/bt_service/bt_i.h @@ -19,7 +19,6 @@ #include #include -#define BT_KEYS_STORAGE_OLD_PATH INT_PATH(".bt.keys") #define BT_KEYS_STORAGE_PATH CFG_PATH("bt.keys") typedef enum { diff --git a/applications/services/bt/bt_settings.h b/applications/services/bt/bt_settings.h index cd6be60c4..380a0962e 100644 --- a/applications/services/bt/bt_settings.h +++ b/applications/services/bt/bt_settings.h @@ -7,7 +7,6 @@ extern "C" { #endif -#define BT_SETTINGS_OLD_PATH INT_PATH(".bt.settings") #define BT_SETTINGS_PATH CFG_PATH("bt.settings") typedef struct { diff --git a/applications/services/cli/cli.c b/applications/services/cli/cli.c index 1fe979e0c..e1e32222a 100644 --- a/applications/services/cli/cli.c +++ b/applications/services/cli/cli.c @@ -103,18 +103,26 @@ void cli_print_usage(const char* cmd, const char* usage, const char* arg) { } void cli_motd() { - printf( - "\033[0m\r\n" - " ,-' \\_/ `\\\r\n" - "\033[1;31m__\033[0m \033[1;31m__\033[37m_\033[0m ___ ___ ___ ( , |\r\n" - "\033[1;31m\\\033[0m \033[1;31m\\/\033[0m \033[1;31m/\033[0m \033[1m|_ _ __ ___ _ __ ___ ___\033[0m / ___| | |_ _| `-.-'`-.-'/|_|\r\n" - " \033[1;31m\\\033[0m \033[1;31m/\033[37m| __| \'__/ _ \\ \'_ ` _ \\ / _ \\\033[0m | | | | | | \\ / | |\r\n" - " \033[1;31m/\033[0m \033[1;31m\\\033[37m| |_| | | __/ | | | | | __/\033[0m | |___| |___ | | |=[]=: / ,'\r\n" - "\033[1;31m/_/\\_\\\033[37m\\__|_| \\___|_| |_| |_|\\___|\033[0m \\____|_____|___| / `\\ '\r\n" - " : \\/ )\r\n" - "Welcome to the \033[1;31mX\033[37mtreme\033[0m Command Line Interface! | / ;\r\n" - "Visit \033[1;31mhttps://flipper-xtre.me/\033[0m for even more fun | / /" - "\r\n"); + printf("\r\n" + " _.-------.._ -,\r\n" + " .-\"```\"--..,,_/ /`-, -, \\ \r\n" + " .:\" /:/ /'\\ \\ ,_..., `. | |\r\n" + " / ,----/:/ /`\\ _\\~`_-\"` _;\r\n" + " ' / /`\"\"\"'\\ \\ \\.~`_-' ,-\"'/ \r\n" + " | | | 0 | | .-' ,/` /\r\n" + " | ,..\\ \\ ,.-\"` ,/` /\r\n" + " ; : `/`\"\"\\` ,/--==,/-----,\r\n" + " | `-...| -.___-Z:_______J...---;\r\n" + " : ` _-'\r\n" + " _L_ _ ___ ___ ___ ___ ____--\"`___ _ ___\r\n" + "| __|| | |_ _|| _ \\| _ \\| __|| _ \\ / __|| | |_ _|\r\n" + "| _| | |__ | | | _/| _/| _| | / | (__ | |__ | |\r\n" + "|_| |____||___||_| |_| |___||_|_\\ \\___||____||___|\r\n" + "\r\n" + "Welcome to Flipper Zero Command Line Interface!\r\n" + "Read the manual: https://docs.flipper.net/development/cli\r\n" + "Run `help` or `?` to list available commands\r\n" + "\r\n"); const Version* firmware_version = furi_hal_version_get_firmware_version(); if(firmware_version) { diff --git a/applications/services/cli/cli_commands.c b/applications/services/cli/cli_commands.c index dd3d92db0..8c22fb542 100644 --- a/applications/services/cli/cli_commands.c +++ b/applications/services/cli/cli_commands.c @@ -174,7 +174,7 @@ void cli_command_src(Cli* cli, FuriString* args, void* context) { UNUSED(args); UNUSED(context); - printf("https://github.com/Flipper-XFW/Xtreme-Firmware"); + printf("https://github.com/Next-Flip/Momentum-Firmware"); } #define CLI_COMMAND_LOG_RING_SIZE 2048 diff --git a/applications/services/desktop/animations/animation_manager.c b/applications/services/desktop/animations/animation_manager.c index 2130f4f82..2358dd8b6 100644 --- a/applications/services/desktop/animations/animation_manager.c +++ b/applications/services/desktop/animations/animation_manager.c @@ -13,14 +13,13 @@ #include "animation_storage.h" #include "animation_manager.h" -#include +#include #define TAG "AnimationManager" #define HARDCODED_ANIMATION_NAME "L1_AnimationError_128x64" #define NO_SD_ANIMATION_NAME "L1_NoSd_128x49" #define BAD_BATTERY_ANIMATION_NAME "L1_BadBattery_128x47" -#define CREDITS_ANIMATION_NAME "Credits_128x64" #define NO_DB_ANIMATION_NAME "L0_NoDb_128x51" #define BAD_SD_ANIMATION_NAME "L0_SdBad_128x51" @@ -148,7 +147,7 @@ void animation_manager_check_blocking_process(AnimationManager* animation_manage const StorageAnimationManifestInfo* manifest_info = animation_storage_get_meta(animation_manager->current_animation); bool valid = animation_manager_is_valid_idle_animation( - manifest_info, &stats, xtreme_settings.unlock_anims); + manifest_info, &stats, momentum_settings.unlock_anims); if(!valid) { animation_manager_start_new_idle(animation_manager); @@ -203,8 +202,8 @@ static void animation_manager_start_new_idle(AnimationManager* animation_manager const BubbleAnimation* bubble_animation = animation_storage_get_bubble_animation(animation_manager->current_animation); animation_manager->state = AnimationManagerStateIdle; - int32_t duration = (xtreme_settings.cycle_anims == 0) ? (bubble_animation->duration) : - (xtreme_settings.cycle_anims); + int32_t duration = (momentum_settings.cycle_anims == 0) ? (bubble_animation->duration) : + (momentum_settings.cycle_anims); furi_timer_start( animation_manager->idle_animation_timer, (duration > 0) ? (duration * 1000) : 0); } @@ -389,8 +388,7 @@ static StorageAnimation* uint32_t whole_weight = 0; // Filter valid animations - bool skip_credits = !xtreme_settings.credits_anim && xtreme_settings.asset_pack[0] == '\0'; - bool unlock = xtreme_settings.unlock_anims; + bool unlock = momentum_settings.unlock_anims; StorageAnimationList_it_t it; for(StorageAnimationList_it(it, animation_list); !StorageAnimationList_end_p(it);) { StorageAnimation* storage_animation = *StorageAnimationList_ref(it); @@ -401,9 +399,6 @@ static StorageAnimation* if(strcmp(manifest_info->name, HARDCODED_ANIMATION_NAME) == 0) { // Dont pick error anim randomly valid = false; - } else if(skip_credits && strcmp(manifest_info->name, CREDITS_ANIMATION_NAME) == 0) { - // Dont pick credits anim if disabled - valid = false; } if(valid) { @@ -546,7 +541,7 @@ void animation_manager_load_and_continue_animation(AnimationManager* animation_m const StorageAnimationManifestInfo* manifest_info = animation_storage_get_meta(restore_animation); bool valid = animation_manager_is_valid_idle_animation( - manifest_info, &stats, xtreme_settings.unlock_anims); + manifest_info, &stats, momentum_settings.unlock_anims); // Restore only if anim is valid and not the error anim if(valid && strcmp(manifest_info->name, HARDCODED_ANIMATION_NAME) != 0) { animation_manager_replace_current_animation( @@ -561,9 +556,9 @@ void animation_manager_load_and_continue_animation(AnimationManager* animation_m const BubbleAnimation* bubble_animation = animation_storage_get_bubble_animation( animation_manager->current_animation); - int32_t duration = (xtreme_settings.cycle_anims == 0) ? + int32_t duration = (momentum_settings.cycle_anims == 0) ? (bubble_animation->duration) : - (xtreme_settings.cycle_anims); + (momentum_settings.cycle_anims); furi_timer_start( animation_manager->idle_animation_timer, (duration > 0) ? (duration * 1000) : 0); diff --git a/applications/services/desktop/animations/animation_storage.c b/applications/services/desktop/animations/animation_storage.c index b96bef752..0c0fcad25 100644 --- a/applications/services/desktop/animations/animation_storage.c +++ b/applications/services/desktop/animations/animation_storage.c @@ -11,10 +11,10 @@ #include "animation_storage_i.h" #include #include -#include +#include #define ANIMATION_META_FILE "meta.txt" #define TAG "AnimationStorage" -char ANIMATION_DIR[23 /*"/ext/asset_packs//Anims"*/ + XTREME_ASSETS_PACK_NAME_LEN + 1]; +char ANIMATION_DIR[23 /* /ext/asset_packs//Anims */ + ASSET_PACKS_NAME_LEN + 1]; char ANIMATION_MANIFEST_FILE[sizeof(ANIMATION_DIR) + 13 /*"/manifest.txt"*/]; static void animation_storage_free_bubbles(BubbleAnimation* animation); @@ -25,10 +25,10 @@ static BubbleAnimation* animation_storage_load_animation(const char* name); void animation_handler_select_manifest() { FuriString* anim_dir = furi_string_alloc(); FuriString* manifest = furi_string_alloc(); - bool use_asset_pack = xtreme_settings.asset_pack[0] != '\0'; + bool use_asset_pack = momentum_settings.asset_pack[0] != '\0'; if(use_asset_pack) { furi_string_printf( - anim_dir, "%s/%s/Anims", XTREME_ASSETS_PATH, xtreme_settings.asset_pack); + anim_dir, "%s/%s/Anims", ASSET_PACKS_PATH, momentum_settings.asset_pack); furi_string_printf(manifest, "%s/manifest.txt", furi_string_get_cstr(anim_dir)); Storage* storage = furi_record_open(RECORD_STORAGE); if(storage_common_stat(storage, furi_string_get_cstr(manifest), NULL) == FSE_OK) { @@ -513,7 +513,7 @@ static BubbleAnimation* animation_storage_load_animation(const char* name) { if(!flipper_format_read_uint32(ff, "Active cycles", &u32value, 1)) break; //-V779 animation->active_cycles = u32value; if(!flipper_format_read_uint32(ff, "Frame rate", &u32value, 1)) break; - uint32_t anim_speed = xtreme_settings.anim_speed; + uint32_t anim_speed = momentum_settings.anim_speed; u32value = (u32value * anim_speed) / 100; FURI_CONST_ASSIGN(animation->icon_animation.frame_rate, u32value < 1 ? 1 : u32value); if(!flipper_format_read_uint32(ff, "Duration", &u32value, 1)) break; diff --git a/applications/services/desktop/desktop.c b/applications/services/desktop/desktop.c index 5fcf4dd34..7fc52bd6b 100644 --- a/applications/services/desktop/desktop.c +++ b/applications/services/desktop/desktop.c @@ -11,7 +11,7 @@ #include #include #include -#include +#include #include "animations/animation_manager.h" #include "desktop/scenes/desktop_scene.h" @@ -66,13 +66,13 @@ static void desktop_clock_reconfigure(Desktop* desktop) { desktop_clock_update(desktop); - if(xtreme_settings.statusbar_clock) { + if(momentum_settings.statusbar_clock) { furi_timer_start(desktop->update_clock_timer, furi_ms_to_ticks(1000)); } else { furi_timer_stop(desktop->update_clock_timer); } - view_port_enabled_set(desktop->clock_viewport, xtreme_settings.statusbar_clock); + view_port_enabled_set(desktop->clock_viewport, momentum_settings.statusbar_clock); } static void desktop_clock_draw_callback(Canvas* canvas, void* context) { @@ -217,7 +217,7 @@ void desktop_lock(Desktop* desktop, bool pin_lock) { Cli* cli = furi_record_open(RECORD_CLI); cli_session_close(cli); furi_record_close(RECORD_CLI); - if(!xtreme_settings.allow_locked_rpc_commands) { + if(!momentum_settings.allow_locked_rpc_commands) { Bt* bt = furi_record_open(RECORD_BT); bt_close_rpc_connection(bt); furi_record_close(RECORD_BT); @@ -491,7 +491,7 @@ int32_t desktop_srv(void* p) { scene_manager_next_scene(desktop->scene_manager, DesktopSceneMain); - if(xtreme_settings.lock_on_boot || furi_hal_rtc_is_flag_set(FuriHalRtcFlagLock)) { + if(momentum_settings.lock_on_boot || furi_hal_rtc_is_flag_set(FuriHalRtcFlagLock)) { desktop_lock(desktop, true); } else { if(!loader_is_locked(desktop->loader)) { diff --git a/applications/services/desktop/desktop_settings.h b/applications/services/desktop/desktop_settings.h index 918cf81da..5f3581bf7 100644 --- a/applications/services/desktop/desktop_settings.h +++ b/applications/services/desktop/desktop_settings.h @@ -6,12 +6,10 @@ #include #include -#define DESKTOP_SETTINGS_OLD_PATH CFG_PATH("desktop.settings") #define DESKTOP_SETTINGS_PATH INT_PATH(".desktop.settings") #define DESKTOP_SETTINGS_MAGIC (0x17) #define DESKTOP_SETTINGS_VER (11) -#define DESKTOP_KEYBINDS_OLD_PATH CFG_PATH(".desktop.keybinds") #define DESKTOP_KEYBINDS_PATH CFG_PATH("desktop.keybinds") #define DESKTOP_KEYBINDS_MAGIC (0x14) #define DESKTOP_KEYBINDS_VER (1) diff --git a/applications/services/desktop/scenes/desktop_scene_fault.c b/applications/services/desktop/scenes/desktop_scene_fault.c index 65f9425d4..a0ecefaab 100644 --- a/applications/services/desktop/scenes/desktop_scene_fault.c +++ b/applications/services/desktop/scenes/desktop_scene_fault.c @@ -1,7 +1,7 @@ #include #include "../desktop_i.h" -#include +#include #define DesktopFaultEventExit 0x00FF00FF @@ -15,23 +15,13 @@ void desktop_scene_fault_on_enter(void* context) { Popup* popup = desktop->hw_mismatch_popup; popup_set_context(popup, desktop); - if(xtreme_assets.is_nsfw) { - popup_set_header( - popup, - "Slut passed out\n but is now back", - 60, - 14 + STATUS_BAR_Y_SHIFT, - AlignCenter, - AlignCenter); - } else { - popup_set_header( - popup, - "Flipper crashed\n but has been rebooted", - 60, - 14 + STATUS_BAR_Y_SHIFT, - AlignCenter, - AlignCenter); - } + popup_set_header( + popup, + "Flipper crashed\n but has been rebooted", + 60, + 14 + STATUS_BAR_Y_SHIFT, + AlignCenter, + AlignCenter); char* message = (char*)furi_hal_rtc_get_fault_data(); popup_set_text(popup, message, 60, 37 + STATUS_BAR_Y_SHIFT, AlignCenter, AlignCenter); diff --git a/applications/services/desktop/scenes/desktop_scene_lock_menu.c b/applications/services/desktop/scenes/desktop_scene_lock_menu.c index 8684d3d1e..df898a8f3 100644 --- a/applications/services/desktop/scenes/desktop_scene_lock_menu.c +++ b/applications/services/desktop/scenes/desktop_scene_lock_menu.c @@ -4,7 +4,7 @@ #include #include #include -#include +#include #include "../desktop_i.h" #include @@ -43,9 +43,9 @@ void desktop_scene_lock_menu_save_settings(Desktop* desktop) { notification_message_save_settings(desktop->lock_menu->notification); desktop->lock_menu->save_notification = false; } - if(desktop->lock_menu->save_xtreme) { - xtreme_settings_save(); - desktop->lock_menu->save_xtreme = false; + if(desktop->lock_menu->save_momentum) { + momentum_settings_save(); + desktop->lock_menu->save_momentum = false; } if(desktop->lock_menu->save_bt) { bt_settings_save(&desktop->lock_menu->bt->bt_settings); @@ -120,9 +120,9 @@ bool desktop_scene_lock_menu_on_event(void* context, SceneManagerEvent event) { } consumed = true; break; - case DesktopLockMenuEventXtreme: + case DesktopLockMenuEventMomentum: desktop_scene_lock_menu_save_settings(desktop); - loader_start_detached_with_gui_error(desktop->loader, "Xtreme", NULL); + loader_start_detached_with_gui_error(desktop->loader, "Momentum", NULL); consumed = true; break; case DesktopLockMenuEventStealthModeOn: diff --git a/applications/services/desktop/scenes/desktop_scene_locked.c b/applications/services/desktop/scenes/desktop_scene_locked.c index 1f1384276..9d512bed0 100644 --- a/applications/services/desktop/scenes/desktop_scene_locked.c +++ b/applications/services/desktop/scenes/desktop_scene_locked.c @@ -13,7 +13,7 @@ #include "../views/desktop_view_locked.h" #include "desktop_scene.h" #include "desktop_scene_i.h" -#include +#include #define TAG "DesktopSrv" @@ -85,7 +85,7 @@ bool desktop_scene_locked_on_event(void* context, SceneManagerEvent event) { if(event.type == SceneManagerEventTypeCustom) { switch(event.event) { case DesktopLockedEventOpenPowerOff: { - if(xtreme_settings.lockscreen_poweroff) { + if(momentum_settings.lockscreen_poweroff) { loader_start(desktop->loader, "Power", "off", NULL); } consumed = true; diff --git a/applications/services/desktop/scenes/desktop_scene_pin_input.c b/applications/services/desktop/scenes/desktop_scene_pin_input.c index c4b3f421d..45394643f 100644 --- a/applications/services/desktop/scenes/desktop_scene_pin_input.c +++ b/applications/services/desktop/scenes/desktop_scene_pin_input.c @@ -5,7 +5,7 @@ #include #include #include -#include +#include #include "../desktop.h" #include "../desktop_i.h" @@ -57,7 +57,7 @@ static void desktop_scene_pin_input_done_callback(const PinCode* pin_code, void* view_dispatcher_send_custom_event(desktop->view_dispatcher, DesktopPinInputEventUnlocked); } else { uint32_t pin_fails = furi_hal_rtc_get_pin_fails() + 1; - if(pin_fails >= 10 && xtreme_settings.bad_pins_format) { + if(pin_fails >= 10 && momentum_settings.bad_pins_format) { furi_hal_rtc_reset_registers(); furi_hal_rtc_set_flag(FuriHalRtcFlagStorageFormatInternal); storage_sd_format(furi_record_open(RECORD_STORAGE)); diff --git a/applications/services/desktop/views/desktop_events.h b/applications/services/desktop/views/desktop_events.h index 8409ea56a..13d92341b 100644 --- a/applications/services/desktop/views/desktop_events.h +++ b/applications/services/desktop/views/desktop_events.h @@ -58,5 +58,5 @@ typedef enum { DesktopLockMenuEventSettings, DesktopLockMenuEventLockKeypad, DesktopLockMenuEventLockPinOff, - DesktopLockMenuEventXtreme, + DesktopLockMenuEventMomentum, } DesktopEvent; diff --git a/applications/services/desktop/views/desktop_view_lock_menu.c b/applications/services/desktop/views/desktop_view_lock_menu.c index d65e3e1ef..bf6643292 100644 --- a/applications/services/desktop/views/desktop_view_lock_menu.c +++ b/applications/services/desktop/views/desktop_view_lock_menu.c @@ -1,7 +1,7 @@ #include #include #include -#include +#include #include #include "../desktop_i.h" @@ -20,7 +20,7 @@ typedef enum { DesktopLockMenuIndexDarkMode, DesktopLockMenuIndexLock, DesktopLockMenuIndexBluetooth, - DesktopLockMenuIndexXtreme, + DesktopLockMenuIndexMomentum, DesktopLockMenuIndexBrightness, DesktopLockMenuIndexVolume, @@ -101,7 +101,7 @@ void desktop_lock_menu_draw_callback(Canvas* canvas, void* model) { break; case DesktopLockMenuIndexDarkMode: icon = &I_CC_DarkMode_16x16; - enabled = xtreme_settings.dark_mode; + enabled = momentum_settings.dark_mode; break; case DesktopLockMenuIndexLock: icon = &I_CC_Lock_16x16; @@ -110,8 +110,8 @@ void desktop_lock_menu_draw_callback(Canvas* canvas, void* model) { icon = &I_CC_Bluetooth_16x16; enabled = m->lock_menu->bt->bt_settings.enabled; break; - case DesktopLockMenuIndexXtreme: - icon = &I_CC_Xtreme_16x16; + case DesktopLockMenuIndexMomentum: + icon = &I_CC_Momentum_16x16; break; case DesktopLockMenuIndexBrightness: icon = &I_Pin_star_7x7; @@ -287,8 +287,8 @@ bool desktop_lock_menu_input_callback(InputEvent* event, void* context) { desktop_event = DesktopLockMenuEventSettings; break; case DesktopLockMenuIndexDarkMode: - xtreme_settings.dark_mode = !xtreme_settings.dark_mode; - lock_menu->save_xtreme = true; + momentum_settings.dark_mode = !momentum_settings.dark_mode; + lock_menu->save_momentum = true; break; case DesktopLockMenuIndexBluetooth: lock_menu->bt->bt_settings.enabled = !lock_menu->bt->bt_settings.enabled; @@ -299,8 +299,8 @@ bool desktop_lock_menu_input_callback(InputEvent* event, void* context) { } lock_menu->save_bt = true; break; - case DesktopLockMenuIndexXtreme: - desktop_event = DesktopLockMenuEventXtreme; + case DesktopLockMenuIndexMomentum: + desktop_event = DesktopLockMenuEventMomentum; break; case DesktopLockMenuIndexVolume: desktop_event = stealth_mode ? DesktopLockMenuEventStealthModeOff : diff --git a/applications/services/desktop/views/desktop_view_lock_menu.h b/applications/services/desktop/views/desktop_view_lock_menu.h index 78b981c50..0f8082021 100644 --- a/applications/services/desktop/views/desktop_view_lock_menu.h +++ b/applications/services/desktop/views/desktop_view_lock_menu.h @@ -19,7 +19,7 @@ struct DesktopLockMenuView { NotificationApp* notification; Bt* bt; bool save_notification; - bool save_xtreme; + bool save_momentum; bool save_bt; }; diff --git a/applications/services/desktop/views/desktop_view_locked.c b/applications/services/desktop/views/desktop_view_locked.c index 24ebd760b..0b2ebb692 100644 --- a/applications/services/desktop/views/desktop_view_locked.c +++ b/applications/services/desktop/views/desktop_view_locked.c @@ -6,7 +6,7 @@ #include #include #include -#include +#include #include #include "../desktop_i.h" @@ -92,14 +92,14 @@ void desktop_view_locked_draw_lockscreen(Canvas* canvas, void* m) { snprintf(date_str, 14, "%.2d-%.2d-%.4d", datetime.day, datetime.month, datetime.year); } - if(!xtreme_settings.lockscreen_transparent) { + if(!momentum_settings.lockscreen_transparent) { canvas_draw_icon(canvas, 0, 0 + y, &I_Lockscreen); } - if(xtreme_settings.lockscreen_time) { + if(momentum_settings.lockscreen_time) { canvas_set_font(canvas, FontBigNumbers); canvas_draw_str(canvas, 0, 64 + y, time_str); int offset = canvas_string_width(canvas, time_str) + 2; - if(xtreme_settings.lockscreen_seconds) { + if(momentum_settings.lockscreen_seconds) { canvas_set_font(canvas, FontSecondary); canvas_draw_str(canvas, 0 + offset, 64 + y, second_str); offset += canvas_string_width(canvas, ":00") + 2; @@ -109,12 +109,12 @@ void desktop_view_locked_draw_lockscreen(Canvas* canvas, void* m) { canvas_draw_str(canvas, 0 + offset, 64 + y, meridian_str); } } - if(xtreme_settings.lockscreen_date) { + if(momentum_settings.lockscreen_date) { canvas_set_font(canvas, FontSecondary); - canvas_draw_str(canvas, 0, 48 + y + 16 * !xtreme_settings.lockscreen_time, date_str); + canvas_draw_str(canvas, 0, 48 + y + 16 * !momentum_settings.lockscreen_time, date_str); } if(model->view_state == DesktopViewLockedStateLockedHintShown && - xtreme_settings.lockscreen_prompt) { + momentum_settings.lockscreen_prompt) { canvas_set_font(canvas, FontSecondary); if(model->pin_locked) { elements_bubble_str( diff --git a/applications/services/dolphin/dolphin.c b/applications/services/dolphin/dolphin.c index d30c2ba02..e9ac4dc97 100644 --- a/applications/services/dolphin/dolphin.c +++ b/applications/services/dolphin/dolphin.c @@ -5,7 +5,7 @@ #include #include #include -#include +#include #define DOLPHIN_LOCK_EVENT_FLAG (0x1) #define TAG "Dolphin" @@ -156,7 +156,7 @@ int32_t dolphin_srv(void* p) { furi_record_create(RECORD_DOLPHIN, dolphin); dolphin_state_load(dolphin->state); - uint32_t butthurt_interval = xtreme_settings.butthurt_timer * 1000; + uint32_t butthurt_interval = momentum_settings.butthurt_timer * 1000; if(butthurt_interval) furi_timer_restart(dolphin->butthurt_timer, butthurt_interval); dolphin_update_clear_limits_timer_period(dolphin); furi_timer_restart(dolphin->clear_limits_timer, HOURS_IN_TICKS(24)); diff --git a/applications/services/dolphin/helpers/dolphin_state.h b/applications/services/dolphin/helpers/dolphin_state.h index 949f49ce0..8c4219861 100644 --- a/applications/services/dolphin/helpers/dolphin_state.h +++ b/applications/services/dolphin/helpers/dolphin_state.h @@ -9,7 +9,6 @@ extern "C" { #endif -#define DOLPHIN_STATE_OLD_PATH INT_PATH(".dolphin.state") #define DOLPHIN_STATE_PATH CFG_PATH("dolphin.state") extern const uint32_t DOLPHIN_LEVELS[]; diff --git a/applications/services/expansion/expansion_settings_filename.h b/applications/services/expansion/expansion_settings_filename.h index 2ce48cf42..586f775c6 100644 --- a/applications/services/expansion/expansion_settings_filename.h +++ b/applications/services/expansion/expansion_settings_filename.h @@ -6,5 +6,4 @@ /** * @brief File name used for expansion settings. */ -#define EXPANSION_SETTINGS_OLD_PATH INT_PATH(".expansion.settings") #define EXPANSION_SETTINGS_PATH CFG_PATH("expansion.settings") diff --git a/applications/services/gui/canvas.c b/applications/services/gui/canvas.c index ff52c6090..5d2148785 100644 --- a/applications/services/gui/canvas.c +++ b/applications/services/gui/canvas.c @@ -5,7 +5,7 @@ #include #include #include -#include +#include const CanvasFontParameters canvas_font_params[FontTotalNumber] = { [FontPrimary] = {.leading_default = 12, .leading_min = 11, .height = 8, .descender = 2}, @@ -137,15 +137,15 @@ uint8_t canvas_current_font_width(const Canvas* canvas) { const CanvasFontParameters* canvas_get_font_params(const Canvas* canvas, Font font) { furi_assert(canvas); furi_assert(font < FontTotalNumber); - if(xtreme_assets.font_params[font]) { - return xtreme_assets.font_params[font]; + if(asset_packs.font_params[font]) { + return asset_packs.font_params[font]; } return &canvas_font_params[font]; } void canvas_clear(Canvas* canvas) { furi_assert(canvas); - if(xtreme_settings.dark_mode) { + if(momentum_settings.dark_mode) { u8g2_FillBuffer(&canvas->fb); } else { u8g2_ClearBuffer(&canvas->fb); @@ -154,7 +154,7 @@ void canvas_clear(Canvas* canvas) { void canvas_set_color(Canvas* canvas, Color color) { furi_assert(canvas); - if(xtreme_settings.dark_mode) { + if(momentum_settings.dark_mode) { if(color == ColorBlack) { color = ColorWhite; } else if(color == ColorWhite) { @@ -176,8 +176,8 @@ void canvas_invert_color(Canvas* canvas) { void canvas_set_font(Canvas* canvas, Font font) { furi_assert(canvas); u8g2_SetFontMode(&canvas->fb, 1); - if(xtreme_assets.fonts[font]) { - u8g2_SetFont(&canvas->fb, xtreme_assets.fonts[font]); + if(asset_packs.fonts[font]) { + u8g2_SetFont(&canvas->fb, asset_packs.fonts[font]); return; } switch(font) { diff --git a/applications/services/gui/gui.c b/applications/services/gui/gui.c index 3359a9bc9..b17adc8e7 100644 --- a/applications/services/gui/gui.c +++ b/applications/services/gui/gui.c @@ -1,4 +1,4 @@ -#include +#include #include "gui_i.h" #include #include @@ -97,7 +97,7 @@ static void gui_redraw_status_bar(Gui* gui, bool need_attention) { /* for support black theme - paint white area and * draw icon with transparent white color */ - if(xtreme_settings.bar_background) { + if(momentum_settings.bar_background) { canvas_set_color(gui->canvas, ColorWhite); canvas_draw_box(gui->canvas, 1, 1, 9, 7); canvas_draw_box(gui->canvas, 7, 3, 58, 6); @@ -130,7 +130,7 @@ static void gui_redraw_status_bar(Gui* gui, bool need_attention) { width + 2, GUI_STATUS_BAR_WORKAREA_HEIGHT + 2); // Hide battery background - if(xtreme_settings.bar_borders) { + if(momentum_settings.bar_borders) { canvas_set_color(gui->canvas, ColorWhite); canvas_draw_box( gui->canvas, -1, 0, canvas_width(gui->canvas) + 1, canvas_height(gui->canvas)); @@ -139,7 +139,7 @@ static void gui_redraw_status_bar(Gui* gui, bool need_attention) { // ViewPort draw canvas_frame_set( gui->canvas, - x - xtreme_settings.bar_borders, + x - momentum_settings.bar_borders, GUI_STATUS_BAR_Y + 2, width, GUI_STATUS_BAR_WORKAREA_HEIGHT); @@ -156,7 +156,7 @@ static void gui_redraw_status_bar(Gui* gui, bool need_attention) { right_used + 4, GUI_STATUS_BAR_HEIGHT); // Disable battery border - if(xtreme_settings.bar_borders) { + if(momentum_settings.bar_borders) { canvas_set_color(gui->canvas, ColorBlack); canvas_draw_rframe( gui->canvas, 0, 0, canvas_width(gui->canvas), canvas_height(gui->canvas), 1); @@ -176,7 +176,7 @@ static void gui_redraw_status_bar(Gui* gui, bool need_attention) { } // Left side - if(xtreme_settings.status_icons) { + if(momentum_settings.status_icons) { x = 2; ViewPortArray_it(it, gui->layers[GuiLayerStatusBarLeft]); while(!ViewPortArray_end_p(it) && (right_used + left_used) < GUI_STATUS_BAR_WIDTH) { @@ -191,7 +191,7 @@ static void gui_redraw_status_bar(Gui* gui, bool need_attention) { GUI_STATUS_BAR_Y + 1, width + 2, GUI_STATUS_BAR_WORKAREA_HEIGHT + 2); - if(xtreme_settings.bar_borders) { + if(momentum_settings.bar_borders) { canvas_set_color(gui->canvas, ColorWhite); canvas_draw_box( gui->canvas, 0, 0, canvas_width(gui->canvas), canvas_height(gui->canvas)); @@ -217,7 +217,7 @@ static void gui_redraw_status_bar(Gui* gui, bool need_attention) { GUI_STATUS_BAR_Y + 1, width + 2, GUI_STATUS_BAR_WORKAREA_HEIGHT + 2); - if(xtreme_settings.bar_borders) { + if(momentum_settings.bar_borders) { canvas_set_color(gui->canvas, ColorWhite); canvas_draw_box( gui->canvas, 0, 0, canvas_width(gui->canvas), canvas_height(gui->canvas)); @@ -234,7 +234,7 @@ static void gui_redraw_status_bar(Gui* gui, bool need_attention) { // Draw frame around icons on the left if(left_used) { canvas_frame_set(gui->canvas, 0, 0, left_used + 3, GUI_STATUS_BAR_HEIGHT); - if(xtreme_settings.bar_borders) { + if(momentum_settings.bar_borders) { canvas_draw_rframe( gui->canvas, 0, 0, canvas_width(gui->canvas), canvas_height(gui->canvas), 1); canvas_draw_line( @@ -291,7 +291,7 @@ static void gui_redraw(Gui* gui) { bool need_attention = (gui_view_port_find_enabled(gui->layers[GuiLayerWindow]) != 0 || gui_view_port_find_enabled(gui->layers[GuiLayerFullscreen]) != 0); - if(xtreme_settings.lockscreen_statusbar) { + if(momentum_settings.lockscreen_statusbar) { gui_redraw_status_bar(gui, need_attention); } } else { diff --git a/applications/services/gui/modules/file_browser.c b/applications/services/gui/modules/file_browser.c index bae35ab46..5c780730e 100644 --- a/applications/services/gui/modules/file_browser.c +++ b/applications/services/gui/modules/file_browser.c @@ -13,7 +13,7 @@ #include #include "m-algo.h" #include -#include +#include #define LIST_ITEMS 5u #define MAX_LEN_PX 110 @@ -85,7 +85,7 @@ static int BrowserItem_t_cmp(const BrowserItem_t* a, const BrowserItem_t* b) { if(b->type == BrowserItemTypeBack) { return 1; } - if(xtreme_settings.sort_dirs_first) { + if(momentum_settings.sort_dirs_first) { if(a->type == BrowserItemTypeFolder && b->type != BrowserItemTypeFolder) { return -1; } diff --git a/applications/services/gui/modules/menu.c b/applications/services/gui/modules/menu.c index 99a589d2d..4fac392d8 100644 --- a/applications/services/gui/modules/menu.c +++ b/applications/services/gui/modules/menu.c @@ -9,7 +9,7 @@ #include #include #include -#include +#include #include struct Menu { @@ -90,7 +90,7 @@ static void menu_draw_callback(Canvas* canvas, void* _model) { MenuItem* item; size_t shift_position; FuriString* name = furi_string_alloc(); - switch(xtreme_settings.menu_style) { + switch(momentum_settings.menu_style) { case MenuStyleList: { for(uint8_t i = 0; i < 3; i++) { canvas_set_font(canvas, i == 1 ? FontPrimary : FontSecondary); @@ -403,7 +403,7 @@ static void menu_draw_callback(Canvas* canvas, void* _model) { static bool menu_input_callback(InputEvent* event, void* context) { Menu* menu = context; bool consumed = true; - if(xtreme_settings.menu_style == MenuStyleVertical && + if(momentum_settings.menu_style == MenuStyleVertical && furi_hal_rtc_is_flag_set(FuriHalRtcFlagHandOrient)) { if(event->key == InputKeyLeft) { event->key = InputKeyRight; @@ -612,7 +612,7 @@ static void menu_process_up(Menu* menu) { size_t count = MenuItemArray_size(model->items); size_t vertical_offset = model->vertical_offset; - switch(xtreme_settings.menu_style) { + switch(momentum_settings.menu_style) { case MenuStyleList: case MenuStyleTerminal: if(position > 0) { @@ -663,7 +663,7 @@ static void menu_process_down(Menu* menu) { size_t count = MenuItemArray_size(model->items); size_t vertical_offset = model->vertical_offset; - switch(xtreme_settings.menu_style) { + switch(momentum_settings.menu_style) { case MenuStyleList: case MenuStyleTerminal: if(position < count - 1) { @@ -714,7 +714,7 @@ static void menu_process_left(Menu* menu) { size_t count = MenuItemArray_size(model->items); size_t vertical_offset = model->vertical_offset; - switch(xtreme_settings.menu_style) { + switch(momentum_settings.menu_style) { case MenuStyleWii: if(position < 2) { if(count % 2) { @@ -777,7 +777,7 @@ static void menu_process_right(Menu* menu) { size_t count = MenuItemArray_size(model->items); size_t vertical_offset = model->vertical_offset; - switch(xtreme_settings.menu_style) { + switch(momentum_settings.menu_style) { case MenuStyleWii: if(count % 2) { if(position == count - 1) { diff --git a/applications/services/loader/loader.c b/applications/services/loader/loader.c index d512fbce1..7c6369feb 100644 --- a/applications/services/loader/loader.c +++ b/applications/services/loader/loader.c @@ -3,7 +3,7 @@ #include #include #include -#include +#include #include #include @@ -206,8 +206,8 @@ bool loader_menu_load_fap_meta( static void loader_make_menu_file(Storage* storage) { Stream* new = file_stream_alloc(storage); - if(!storage_file_exists(storage, XTREME_MENU_PATH)) { - if(file_stream_open(new, XTREME_MENU_PATH, FSAM_WRITE, FSOM_CREATE_ALWAYS)) { + if(!storage_file_exists(storage, MAINMENU_APPS_PATH)) { + if(file_stream_open(new, MAINMENU_APPS_PATH, FSAM_WRITE, FSOM_CREATE_ALWAYS)) { stream_write_format(new, "MenuAppList Version %u\n", 0); for(size_t i = 0; i < FLIPPER_APPS_COUNT; i++) { stream_write_format(new, "%s\n", FLIPPER_APPS[i].name); @@ -215,13 +215,14 @@ static void loader_make_menu_file(Storage* storage) { for(size_t i = 0; i < FLIPPER_EXTERNAL_APPS_COUNT - 1; i++) { stream_write_format(new, "%s\n", FLIPPER_EXTERNAL_APPS[i].name); } + // Old additional external apps Stream* old = file_stream_alloc(storage); - if(file_stream_open(old, XTREME_MENU_OLD_PATH, FSAM_READ, FSOM_OPEN_EXISTING)) { + if(file_stream_open(old, CFG_PATH("xtreme_apps.txt"), FSAM_READ, FSOM_OPEN_EXISTING)) { stream_copy(old, new, stream_size(old)); } file_stream_close(old); stream_free(old); - storage_common_remove(storage, XTREME_MENU_OLD_PATH); + storage_common_remove(storage, CFG_PATH("xtreme_apps.txt")); } file_stream_close(new); } @@ -247,10 +248,10 @@ static Loader* loader_alloc() { FuriString* line = furi_string_alloc(); FuriString* name = furi_string_alloc(); do { - if(!file_stream_open(stream, XTREME_MENU_PATH, FSAM_READ_WRITE, FSOM_OPEN_EXISTING)) { + if(!file_stream_open(stream, MAINMENU_APPS_PATH, FSAM_READ_WRITE, FSOM_OPEN_EXISTING)) { file_stream_close(stream); loader_make_menu_file(storage); - if(!file_stream_open(stream, XTREME_MENU_PATH, FSAM_READ_WRITE, FSOM_OPEN_EXISTING)) + if(!file_stream_open(stream, MAINMENU_APPS_PATH, FSAM_READ_WRITE, FSOM_OPEN_EXISTING)) break; } @@ -259,9 +260,9 @@ static Loader* loader_alloc() { sscanf(furi_string_get_cstr(line), "MenuAppList Version %lu", &version) != 1 || version > 0) { file_stream_close(stream); - storage_common_remove(storage, XTREME_MENU_PATH); + storage_common_remove(storage, MAINMENU_APPS_PATH); loader_make_menu_file(storage); - if(!file_stream_open(stream, XTREME_MENU_PATH, FSAM_READ_WRITE, FSOM_OPEN_EXISTING)) + if(!file_stream_open(stream, MAINMENU_APPS_PATH, FSAM_READ_WRITE, FSOM_OPEN_EXISTING)) break; if(!stream_read_line(stream, line) || sscanf(furi_string_get_cstr(line), "MenuAppList Version %lu", &version) != 1 || diff --git a/applications/services/notification/notification_app.h b/applications/services/notification/notification_app.h index 71369e1c4..e6e0ec5cd 100644 --- a/applications/services/notification/notification_app.h +++ b/applications/services/notification/notification_app.h @@ -33,7 +33,6 @@ typedef struct { #define NOTIFICATION_SETTINGS_VERSION 0x02 #define NOTIFICATION_SETTINGS_MAGIC 0x16 -#define NOTIFICATION_SETTINGS_OLD_PATH INT_PATH(".notification.settings") #define NOTIFICATION_SETTINGS_PATH CFG_PATH("notification.settings") typedef struct { diff --git a/applications/services/power/power_service/power.c b/applications/services/power/power_service/power.c index 991a102a6..6e5b5601c 100644 --- a/applications/services/power/power_service/power.c +++ b/applications/services/power/power_service/power.c @@ -2,7 +2,7 @@ #include #include -#include +#include #define POWER_OFF_TIMEOUT 90 #define TAG "Power" @@ -16,7 +16,7 @@ void power_set_battery_icon_enabled(Power* power, bool is_enabled) { void power_draw_battery_callback(Canvas* canvas, void* context) { furi_assert(context); Power* power = context; - BatteryIcon battery_icon = xtreme_settings.battery_icon; + BatteryIcon battery_icon = momentum_settings.battery_icon; if(battery_icon == BatteryIconOff) return; canvas_draw_icon(canvas, 0, 0, &I_Battery_25x8); @@ -367,7 +367,7 @@ Power* power_alloc() { // Battery view port power->battery_view_port = power_battery_view_port_alloc(power); - power_set_battery_icon_enabled(power, xtreme_settings.battery_icon != BatteryIconOff); + power_set_battery_icon_enabled(power, momentum_settings.battery_icon != BatteryIconOff); power->show_low_bat_level_message = true; //Auto shutdown timer @@ -486,7 +486,7 @@ static void power_check_battery_level_change(Power* power) { } static void power_check_charge_cap(Power* power) { - uint32_t cap = xtreme_settings.charge_cap; + uint32_t cap = momentum_settings.charge_cap; if(power->info.charge >= cap && cap < 100) { if(!power->info.is_charge_capped) { // Suppress charging if charge reaches custom cap power->info.is_charge_capped = true; diff --git a/applications/services/power/power_settings.h b/applications/services/power/power_settings.h index 78782e0e0..94bd5895c 100644 --- a/applications/services/power/power_settings.h +++ b/applications/services/power/power_settings.h @@ -3,7 +3,6 @@ #define POWER_SETTINGS_VER (1) -#define POWER_SETTINGS_OLD_PATH INT_PATH(".power.settings") #define POWER_SETTINGS_PATH CFG_PATH("power.settings") #define POWER_SETTINGS_MAGIC (0x21) diff --git a/applications/services/rpc/rpc.c b/applications/services/rpc/rpc.c index 8cd3f69a8..9f9a2a8dd 100644 --- a/applications/services/rpc/rpc.c +++ b/applications/services/rpc/rpc.c @@ -15,7 +15,7 @@ #include #include #include -#include +#include #include @@ -386,7 +386,8 @@ static void rpc_session_thread_state_callback(FuriThreadState thread_state, void } RpcSession* rpc_session_open(Rpc* rpc, RpcOwner owner) { - if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagLock) && !xtreme_settings.allow_locked_rpc_commands) + if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagLock) && + !momentum_settings.allow_locked_rpc_commands) return NULL; furi_assert(rpc); diff --git a/applications/settings/about/about.c b/applications/settings/about/about.c index 38a3d5fe2..97f575ab6 100644 --- a/applications/settings/about/about.c +++ b/applications/settings/about/about.c @@ -173,7 +173,7 @@ static DialogMessageButton about_screen_fw_version(DialogsApp* dialogs, DialogMe furi_hal_info_get_api_version(&api_major, &api_minor); furi_string_cat_printf( buffer, - "%s %s\n%s F%d:%d.%d %s\nhttps://flipper-xtre.me/", + "%s %s\n%s F%d:%d.%d %s\nhttps://momentum-fw.dev/", version_get_version(ver), version_get_builddate(ver), version_get_githash(ver), diff --git a/applications/settings/desktop_settings/scenes/desktop_settings_scene_keybinds_action_type.c b/applications/settings/desktop_settings/scenes/desktop_settings_scene_keybinds_action_type.c index c4ac5ec56..3de7de546 100644 --- a/applications/settings/desktop_settings/scenes/desktop_settings_scene_keybinds_action_type.c +++ b/applications/settings/desktop_settings/scenes/desktop_settings_scene_keybinds_action_type.c @@ -4,7 +4,7 @@ #include #include #include -#include +#include static bool keybinds_fap_selector_item_callback( FuriString* file_path, @@ -47,7 +47,7 @@ static void const DialogsFileBrowserOptions browser_options = { .extension = extension, .icon = &I_unknown_10px, - .hide_dot_files = !xtreme_settings.show_hidden_files, + .hide_dot_files = !momentum_settings.show_hidden_files, .skip_assets = true, .hide_ext = hide_ext, .item_loader_callback = keybinds_fap_selector_item_callback, diff --git a/applications/settings/dolphin_passport/passport.c b/applications/settings/dolphin_passport/passport.c index 4954318e7..abcc12fa5 100644 --- a/applications/settings/dolphin_passport/passport.c +++ b/applications/settings/dolphin_passport/passport.c @@ -6,7 +6,7 @@ #include #include #include "dolphin/dolphin.h" -#include +#include #include "math.h" typedef struct { @@ -38,28 +38,15 @@ static void render_callback(Canvas* canvas, void* _ctx) { const char* mood_str = NULL; const Icon* portrait = NULL; - if(xtreme_assets.is_nsfw) { - if(stats->butthurt <= 4) { - portrait = &I_passport_happy_46x49; - mood_str = "Status: Wet"; - } else if(stats->butthurt <= 9) { - portrait = &I_passport_okay_46x49; - mood_str = "Status: Horny"; - } else { - portrait = &I_passport_bad_46x49; - mood_str = "Status: Desperate"; - } + if(stats->butthurt <= 4) { + portrait = &I_passport_happy_46x49; + mood_str = "Mood: Happy"; + } else if(stats->butthurt <= 9) { + portrait = &I_passport_okay_46x49; + mood_str = "Mood: Okay"; } else { - if(stats->butthurt <= 4) { - portrait = &I_passport_happy_46x49; - mood_str = "Mood: Happy"; - } else if(stats->butthurt <= 9) { - portrait = &I_passport_okay_46x49; - mood_str = "Mood: Okay"; - } else { - portrait = &I_passport_bad_46x49; - mood_str = "Mood: Angry"; - } + portrait = &I_passport_bad_46x49; + mood_str = "Mood: Angry"; } uint32_t xp_progress = 0; uint32_t xp_need = dolphin_state_xp_to_levelup(stats->icounter); diff --git a/applications/settings/power_settings_app/scenes/power_settings_scene_power_off.c b/applications/settings/power_settings_app/scenes/power_settings_scene_power_off.c index 8e1b20b83..805ae96ed 100644 --- a/applications/settings/power_settings_app/scenes/power_settings_scene_power_off.c +++ b/applications/settings/power_settings_app/scenes/power_settings_scene_power_off.c @@ -1,5 +1,5 @@ #include "../power_settings_app.h" -#include +#include void power_settings_scene_power_off_dialog_callback(DialogExResult result, void* context) { furi_assert(context); @@ -12,13 +12,8 @@ void power_settings_scene_power_off_on_enter(void* context) { DialogEx* dialog = app->dialog; dialog_ex_set_header(dialog, "Turn Off Device?", 64, 2, AlignCenter, AlignTop); - if(xtreme_assets.is_nsfw) { - dialog_ex_set_text( - dialog, " I will be\nwaiting for\n you master", 78, 16, AlignLeft, AlignTop); - } else { - dialog_ex_set_text( - dialog, " I will be\nwaiting for\n you here", 78, 16, AlignLeft, AlignTop); - } + dialog_ex_set_text( + dialog, " I will be\nwaiting for\n you here", 78, 16, AlignLeft, AlignTop); dialog_ex_set_icon(dialog, 21, 13, &I_Cry_dolph_55x52); dialog_ex_set_left_button_text(dialog, "Battery"); dialog_ex_set_right_button_text(dialog, "OFF"); diff --git a/applications/system/updater/util/update_task_worker_backup.c b/applications/system/updater/util/update_task_worker_backup.c index c0a7624c4..07914a8ec 100644 --- a/applications/system/updater/util/update_task_worker_backup.c +++ b/applications/system/updater/util/update_task_worker_backup.c @@ -13,7 +13,7 @@ #include #include -#define XFWFIRSTBOOT_FLAG_PATH CFG_PATH("xfwfirstboot.flag") +#define FIRSTBOOT_FLAG_PATH CFG_PATH("firstboot.flag") #define TAG "UpdWorkerBackup" @@ -205,15 +205,14 @@ static bool update_task_post_update(UpdateTask* update_task) { update_task_set_progress(update_task, UpdateTaskStageSplashscreenInstall, 0); FuriString* tmp_path; tmp_path = furi_string_alloc_set(update_task->update_path); - if(storage_common_stat(update_task->storage, XFWFIRSTBOOT_FLAG_PATH, NULL) == + if(storage_common_stat(update_task->storage, FIRSTBOOT_FLAG_PATH, NULL) == FSE_NOT_EXIST) { File* file = storage_file_alloc(update_task->storage); - if(storage_file_open( - file, XFWFIRSTBOOT_FLAG_PATH, FSAM_WRITE, FSOM_CREATE_ALWAYS)) { + if(storage_file_open(file, FIRSTBOOT_FLAG_PATH, FSAM_WRITE, FSOM_CREATE_ALWAYS)) { storage_file_close(file); } storage_file_free(file); - path_append(tmp_path, "xfwfirstboot.bin"); + path_append(tmp_path, "firstboot.bin"); if(storage_common_stat( update_task->storage, furi_string_get_cstr(tmp_path), NULL) != FSE_OK) { furi_string_set(tmp_path, update_task->update_path); diff --git a/applications/system/updater/views/updater_main.c b/applications/system/updater/views/updater_main.c index 923168281..a3e5309f1 100644 --- a/applications/system/updater/views/updater_main.c +++ b/applications/system/updater/views/updater_main.c @@ -93,13 +93,13 @@ static void updater_main_draw_callback(Canvas* canvas, void* _model) { canvas_draw_icon(canvas, 7, 54, &I_Ok_btn_9x9); canvas_draw_icon(canvas, 75, 55, &I_Pin_back_arrow_10x8); } else { - canvas_draw_str_aligned(canvas, 82, 16, AlignCenter, AlignTop, "Xtreme FW"); canvas_set_font(canvas, FontSecondary); - canvas_draw_str_aligned(canvas, 82, 6, AlignCenter, AlignTop, "Installing"); + canvas_draw_str_aligned(canvas, 82, 5, AlignCenter, AlignTop, "Installing"); canvas_draw_str_aligned( canvas, 64, 51, AlignCenter, AlignTop, furi_string_get_cstr(model->status)); canvas_draw_icon(canvas, 4, 5, &I_Updating_32x40); - elements_progress_bar(canvas, 42, 29, 80, (float)model->progress / 100); + canvas_draw_icon(canvas, 50, 16, &I_Updating_Logo_62x15); + elements_progress_bar(canvas, 42, 36, 80, (float)model->progress / 100); } } diff --git a/assets/dolphin/external/Credits_128x64/meta.txt b/assets/dolphin/external/Credits_128x64/meta.txt deleted file mode 100644 index db8407dac..000000000 --- a/assets/dolphin/external/Credits_128x64/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 6 -Active frames: 0 -Frames order: 0 1 2 3 4 5 -Active cycles: 0 -Frame rate: 1 -Duration: 360 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/dolphin/external/manifest.txt b/assets/dolphin/external/manifest.txt index 4e9f9dffb..05a52b172 100644 --- a/assets/dolphin/external/manifest.txt +++ b/assets/dolphin/external/manifest.txt @@ -182,10 +182,3 @@ Max butthurt: 14 Min level: 26 Max level: 30 Weight: 4 - -Name: Credits_128x64 -Min butthurt: 0 -Max butthurt: 14 -Min level: 6 -Max level: 30 -Weight: 1 diff --git a/assets/icons/Common/DFU_128x50.png b/assets/icons/Common/DFU_128x50.png index 12dcb112aa648f4d3cc1e7dfdcdc91fd864a36e9..951cdc198dc0247e34557f2c249466478456981d 100644 GIT binary patch literal 3177 zcmb7H2~-nV7A-)LMf)fs(AcBtfGyLK6~dAsKp-r!i9r$+ki}4`gpwo`lL7*`AS1LW z>V!cAR0PF#0mTgg6=WP0)KPG01hK(gaD&z;f(lbf0I{X#IOn92{D0rO|GoR)e?Q3z zUJx+F%+?G5fGO-iRtWZ)hCNghL+pKKH0wS97`MaxFf@!4L@wwW`j`+TEkdFY$)vI7@;C%VlyQiBG@{RZM&U0U zQCRdR>u8ZL%rW`KUqL01k7vx`{BLuq^s_XSs9z!`#IUHJr7*I9lAkPxNFk6CNl<{0 zUm_$!?Q}|Lb)owr5=6nnN&{lxDW9f;VHG3^W5H5Lro=?YFsj=h(C{%RjjRJlRnyaQ z5Fy6u^aqIT>l>^hN21aJ+7u-T+8PO!!I&si-NHI3>=VYoyHc_0)K-oT3Lh83wvFzqfCMO_;3J5H zfoEz@6E1k9YH(C4k%n_v49kQ_lJc)QI;{@}I}<_yDqsmvEIlfjN+FQl2vjFN)rpS1 zC~ot}PIR(CwrMc5wov1V>)nz0&%$+S$q5>HRjkv?3?oR$+;m%dSSnm)>#*4zujV7eVLNtQN z1r!mSgw7NKwx?u*hztr{Ko=L9Kt$6WXq*QYxHc6?0VhI2e+42PKE~Qv;W!C?74;Yn zc$_T1ii4zWI3w`|!b)uSlXX-2F2sYD>qq*b1lFyoZ9v+{1)#R{7t zJ!w%TB0`e{3WzDjb`L8jkqE|$G+AF!I0}(M9xlpJkEA#VWBa^>D6VueZMcN=!45ab z(O7g1;ZI}HqyJAVdXMp98C%Z7v3QWQ&3Qy750YM(F+%DM#&mN`PyHNrOJLUxY4pCq z2BS9?B*U&L1$H0hy476;0E0C!)tiJKq=BM)Y2vy!?E#KVD6q@#4WZKhHouEIN4U z$zbKl^Q9$eyZu#R*EFYltK}+MMfhpL^HA#Ve)o9yWKl$i74hAs+hQCSw10q(%-XOi z{n*0Rt%K*YV#a4TfKbRI(>uK^U_m}<_ z)0YGXtDx7fo1HfV+)Y`#A<}(yKVaPHN6M|-w6a%H-v)*M^t`_RhvS}c%Nfx*k@v6i z&7!%*0;|G9C5as`+nPKZ`lc?~T5&S{H%3>^>!J+AGD%!tUQx`!epr~w1H+X7U_M>@ z7yyOaZ2-V%FPp{WtG2%gZ_9Z=Hp#7eHFV~Aa${Z#vw7J!{f&;?EIR{Pu+gOxJ*n?W z2c_+q){cfxD}B0o4^0LvJL{@lEZRvP25g7U_A>eV+rYlIsC7|W4)jb;^XqyPa9`C;y`U?x$z`!7{e9{#2mY$=7_=+Wji;>RM z`Moc|q4^i;w+*&bWL*2W&miw!HpALn;99=1axNgY?~GBuVlwl0fIgdcf6K5NxMCc8 z`xxj|*4!86=lCK$HZgQ?+NJ(>lM4g8P99w`)qMM`%;E|6?daK2MbBE^R7wDSfl(N-gI%%NA zDO9rH1djQ`VjG`qpI4vjcg1W}`cWlVA0r_hyy8?>|!i>`F#+)tYr_v*sBe z0nT+4)4cLmh7yq>ZJ99?}Xj;8OZSq%ho>5{V|{xKF{SEXxOt2eOl~~_`yG3 zTHco^;a%-+`q%eyJ0A(UP3xP@S3hjenvpSU!fhI`a;C-V5A?)64NZ^cdUt)7QE0Z@ zLY6kEbWyhoqb@{?_00009a7bBm000id z000id0mpBsWB>pWsYygZRCwC$oO^uD^&iJM81q9vO`!~#yOAiDVddV+wpfKqDc4+Q z(&*wAvKZ#F+`>qWcW>{ouA_aEQK z=X}oReD^)?*Zci?zuuqk_ssOC!))5MYu7e!-t6h=Id0sz^XJe1$GUau)TvRUMvWUc z9x`M|baeEI6DLleKAn=1lA4;Do}QkTmX@5H%#oGMoIH7wG4Gm+ILxNGxVXIc-h1!9 z`)_jrcX#(TZQ5|0F=NJ#9XpmRS+ZfnhM1TbywBp6En6Nq zaG-SQ(#47u%gxQba^;GXlanBN{rYt#WyS%3Et@uN8ZP_r!w(xYXu!*P^X9c}+xC#z ze*E#rpMLr&K0cmfKtR9;AAF!bMaC>#xX{bXt4EI>HEY(~yLWGyGG*{JPQQBfDhn8Z zfwQyo<;#~H09ZBLO=$P++qX`gI=qB}@Ox}*EFQ<9%(&mMp+kp`7%_rD&z?Plf`Y#L z?mIU(w~&yKW5&Ykfr zGtfHx10=GbdiCnKn?X`iQba@qsEiyr@`oROfT?gjAx}=Yy1J495WTOj@A~!Yw{6?T zdR#Agz`$fO6)jrS0e}UgctZ3wYSbW#aV|t(xpL*;;9%_zcMB%ZuYu6SpUYtDOnCE(v>5o7DZ~$Pz9(w2@NFy^d zGc+`m3;+N^Tf3l2l`60ef&A1{Pbu$fk zvB&_JhYaB3j2!@2HZ%<42d`DESTQOpN=RR)^qIuf6tK z?b@|Fbm*{i=T44sadEwS_oe`F!m(!Cv}qGB1p|`60f1H8vuDqvk3PD4_im#2l~-P2 z1{jz;dh{rM6g~6!V?Ni8Zv+y3m35%09ZiOKk>v9=uXbov17+6Q>OIq-(Pab z0f1%0%i5Qu0!cuaSEx{-Ns}fZ;pgWkq?DMLNUjVUHVhZzcZdi800V@WA@&iYWX97^ zKTWlO^T`;f3GKwE8~|80>L;x%5?-4G*p@9@&YU@e>j`RLVCLMpb1PS_1P^&hP=EE+ zS4gJj&6`6nXdbv8Y+xi72ocdwKxGgVdGpIJzc>KU+y4Fg-+AX9oTX+U{c6>!$@uv3 z;|U1~#4kwjk{IvPrw`5rBueXJk3Gf_hM`-g8$iy|!A+Ysjm$_*O-)Hj0U>8+XJFu* za2gfc0YDM_@^6i`Yu7F&CPu|Ro}%GOPEN*~GRaHiKR7XFzE-VT3}~APbNoJi`gG}d zWxoN}Kk&chO!jzYb${$A}1#& z#1ehL>C>l?p#ugCKmq|a<=Vx?Kgs}oBDzqS$!r8HQCzNEIh{5ID)aLP#l zKyal4pw!bGNFOk3)+|I3#oWuw>n{Lw_d@Rx491NcM@1D`qIHD~kTeuh5jM)88X3gK z#&Ue=rI*^bZ~yx1ughIC&V$Uy^;8sm9T5>hPH6qf0%}I5PMt*H{slnMo2{_E;hl`= zH{X0i@yyK3BrqlF5hvmb@&1SrBWBK=DfeWIMstgNqOqd1{>yB*p7~OxO3CeC-dehJ zDU(t{5dP}3UAlB(o|^GLr=Wr%di93g4tTfxptP@)M=nnmtF2A&2nYxe?{n0ikera0 zl+b|#2NM2tZJ&SsIYLvUl={9%ReD{{FZxyB5vx;0z8n>tq>HfpefQl*V~o}$(y7L%9n`0iQs^r>07?s}$PC!1GxOO8AAArkbng~n z>3bPK7edX(j8Va^eG34N9Xm!vrFw7Mwk<3yY|oxOw7V@^wp_b*?VLGt6aaL~ELQi+ zaQcD;3)Fe2;gn*NE?Be?Cj;AYREX8$@3(}6gyiI8@=WJ_8Oxr5c3zybbLURjANq#J zp`iEQf4^V9eq;a+ef8B>X#%8{(DX7;I#nP?da6^^tXUI~OzKbST&erpccnoNq6=Ys z`LarY%1e20K^tmOQBnT>{=ED0%P)@_HHw;%o}P{$$pD&LG!?}_8tK)mSLR6MHeQUpp;g;jK)X%Ge+dl zn$ZBWa@DF;8#iv;zJ0s)kItPt_tdFVO3MPk`Sa&*0>H<|C(3L(pNbSw?pB$hQuY5a z{P*qK2gS?xB4CZIs|1)lPY9*Z-!gz?ARh=lBO?PxBQ&YK==%0%BM-m{b*s*)H9W2| zfNlWbZvr4XI=awxr*Uj8nF?Ho3Y-MuVsy)uD_69CMXP<~0Ul@yM^jD*4H`rSFiDuM zTeq%t>(3bC@)l&hb?a7|URnp7-n41cZr!?d?b`LNx852$ zbZEtj73~#10%dFlo{xI$;S$ZHuJ4D%p%<{cpehHekR23aOu; zU+vnpp&-2J?CgxYX$3^=r=_Ja&dSQ7CTmYsqehMK;0Wh5{#5b`2rzzqr` zv#91BI&`R2s}|UBE(BJiMvb0*_E`Y`?6c3{IF`v4d49vt*jVWbi3&h13D`b^k+N*l zofz~@qx8ZHFYtAQ5R~$f5XmFx8!Bkcnl+6ZH^w3O9dF>Mq@*NrA~rS_R{#%ggrHbM zdqwwKsZu5F6@K~Umn_r82RP;ZIUGHD^ytXQNV*9=Nn!#uvA=oq=E;*MlVuPbxG{tN z<%$On9?T?72iF1RRj5z_)PpPQSD(}nb}>E*d(`pq@lZ59Nb0jq#Z?XK)38WoBmHbiW~AJ1U5+88c=;ofLf_p#jO%7|xwN zdp1M~p`nPWE95m71o)uHTQn~nJ9cc?upxN^JfKJriK-(Di6h!ezI?te$w*lRs|^I! z^5x5M9AO931_T5UOk>83nKf$`dCyl14-Y?h@F01>)yBlc5KqJe5sOWfc2)-s9 zA!j-RCV5Nc0RWR&uCA`casB|X#>GaXx9-)e*VL&~A);Nob{#!>lrE8+D1K zP{AamDWrk6A-Pfdi~(ubuwf|Ck3RZ{u8Pd&6=BjI3n|CnTsjRXwv&4#{1RrjSx~ zQHE5w&Ye4h4J?m~i3|dWvvJM*T_WAX!-GP&fB*i=W`k#7X0FGWvVbSQx54)A-TM~+ zy0T_14~%hVaj}i|${J>*Cza#PH{YZrQW)W)lP6EYn*tA(kdW~4#~;IQZQ8VfOi6Zp z0blX8sZ5XtMGFE^@Zb@WiN%C1G=fl3ce0E|r6pO329EN;2!Dc8A^gc{ut$1=irO?K zIfx8@e}68UTqksT_wLO#FtdLBdd@)J@F`;-Aa^uL0@W3pj2mz^g2m2GSldz=Q7oA1 zuU4&Ej~+cJdXx%!l;q@OyswH7Xwmq<4~ROL5c0*RupiWn1SELdwrvY7NYlfBii(ye zr8p-d9TCA*;U;P52Hx6DLljRG?4bYf2&j2s~)(ufP5p z7?6qX?(P5}1Oi_}?l3rkFTdU*31AO=EjvXlA}Ilq&fVkwgn%aISa`Rn&^cBbzF+T&T&j4cu(@ol_b@p!){S7w~e0+Sg^oVS4 z+O#SBKrNyC5URASN*$n^rRTz-CM0Fz&sV$>}h*6SqR}! zeuTali1yP-Z8auEC?O0e5~N_^-x0I6S9;4X%wpqeafi<0OYQfBrtH7ql`B`mJorn> zJ_AG~1TCZ_Yw~_cVKT|?DHTE+lqySg~?4ZND`rSM?V{yUyic4#bl?^+!DXjr%#9FTeohFu)&G=SANqA z81yUT2UM2#!&39lONHo#qo@Z68;UvetdR#1wGSG>X==kCX$wx&7<4(s;7$QRw+U>| zzPGL)wnt3cHkhGr-@Z_a+{n$!%0m9r2_l^EChSE0lwUV;L~F_3GSMwr(!6o_xV;10?FiyPf`zAW&*w9fDjN6}7nSgTg8qG(esQMYiE zo10tSzt=FCsNSRqqLaVE3?&`cGo~b^h^N8Bi_mlE+dCWk-)l z7w>a~h~!a2F|;NPJl!0QLqy?a+75UhM*{|&L(!(yK-7wef?MRavnssOe33)&6=wh{ z26xZzgbQmwRe7JIx}{FFlpDMmX4B>hd?ov)_!n$w8lWarCN5Tw?us!<8xLS$6B-)I zy9^xvuEwfqA83HEK8U+4p6pZr!?I hoS2x1@Rc8f{1>eIpHkDG%>w`c002ovPDHLkV1fe3#|;1g diff --git a/assets/dolphin/external/Credits_128x64/frame_3.png b/assets/icons/ControlCenter/CC_Momentum_16x16.png similarity index 58% rename from assets/dolphin/external/Credits_128x64/frame_3.png rename to assets/icons/ControlCenter/CC_Momentum_16x16.png index 5f7c5ea7b533e217064eec53898f6ae457804b85..164a13b2d9315569f36e9f8dc73315a4cf0fd9d3 100644 GIT binary patch delta 1228 zcmZuxdr(wW7{9yhD;Sm)hA2zx(^7b0 zgD9?l*!Vh(eM_~nx0JesGM7_VUR+kB%i^a0AZj zFgnYCQ3e1IDe~qKB@zKmA3#V>{(E9yqqX(lR#Iu58RplCv6664TJ*&ia!nJBwJ}D6 zv%?Z*G(`{in>sWvzVTelwxqvn;{*A|x7(%)_WkPUnVp(G-Fc`}r>d%EQ`m$dbHnm8 z{-}KuyKw1DWz(7R>YQX^d^TK3{zT_Cd~)pb?nc{38qFwjaNXhKt}Fb`;Bzx`v66E) zE>;{}_NHdFHur^lG@6Fp$Aup*L|vF{`FQlzR`yC`@7C8Wo7`W?8?@f;ip9^oQ@ta^ zdAEVu9vvSRu;+9?wy`<#x6u98Z^|w|fyZ{97-UOsCzjk0hrzp(&mZ+#h+0`#kLyY5C|?O9&`t-&GJtW4Hu(lUiMbsD!wIMZb1*3Bw3DbH z&;TWA!Y*KLigh~~aa5ij!~hN>Xbu1luz;e)bqcN6C65q+Vq3`S_*pUf;q+|;Kx|S( z{jdJ1qFygJ?KJD61=QuX<0uJO1{DAaPzE?Df@Pg9j3UG$r74_50gmFV6_5ssFyI(8 zhQqx+S)5kb^&AZ-oFFLF4jk}iZqkL?8Pb8W7|l3XH$`(e<#P#Hb9v-=eIv>el?;C~=Qf;689hfhOU#%G(9ccjspAY{Ch85D~(8}=gkyfNL%eleb#?vLnH zB{!Fc&#HwweS~5_eA?C$YVOtR3J_J`_kS7d+cIBD9=em?m~Wh~85o*&e{IWbIv}^~ u;MFY!S>6=&l4flF=IgTiahaTR_<-LlY37*1%$ZZZSIL_!#_o*5+J698nsEaF delta 1775 zcmZuxdo-H~7XK27gjR@mRWvkM%@E^{AAzGa^apgK*Lcs-Y^Hwp1Hc zMGadWW;(1XyVR~S-t3Sz1nri#DAlRfW9OKT(#=2f-~4g!J?EZ#evfnRy_ZOHZc267 z!5}kJ2U7q5%y?W*xS?hnf{iscWZk$@X(&q>kpg*mTpCf9nk-E`B_YbwWfG!9kthWK z#j}D#vAAyH_KgMWFa5b)zc8C6x}?TgEn6_b(@51t%(2q3e=N+tPa;%2P2{pl>`fm3 zEzk2tu+@JrRmyvmIeP!BS9cnWb1mON|LN*uEDyBndy7B$bX+_<GGqW%(pTxM4P8I(Ads3ljaB;OczSeW~VWefhMOHXR!uPP9yUnwjPnX}#+&Q6H zn@_;sKNhs3vehJkgTM2|J@4z6+k;BxWJRQ_E>~5%a@{}im4a;9?XGqHhq&`2^A%6b zKdpJKBL`ofWnSYt4FLcmFLD3=Fy8+Ce^@sduE@IX%k2)c&I^qQxPCd8z#%}9_~t8@ znd5t`tNrV2V$P7$7k9yl+;E{Idg4OvzAI4}yW>X*LbTs9rbpk)dlJC^x3@?0rIoJP zEM-NS_Eq}^P<>2VrpFt>Q}hURYw2La<)eScim-^QaYAVc#hu6dZG6J_O!!nldWrJI zH~RbYUdAZSj6F5DT#>7gj?$SQtn!Z>I;_^J-GkeRE4wFbuDxK|32hb9$>7>~b$5@b zy5J^V8W6F&(yg$r?BGZLzWAGKw#Vz0LdkIEs+}tJ_aSH^(QJ24fS2C|EIO(&hfKCW{KV!xovQl@mpzAsZT_6kTGarPb&bp8f2t%cu|KVW|b zA2-bp*QXbbVu&G4{AmD_-*(nxfeMW<4jB2Yq>(m55$Nh(|jPB51Hag zrudM_E~Z2xQE^)46Ot@Wl%{jygpJebxju(qWAVhgak9c*QDazmB>dtj$fqW+0xOaq;4{{`R=37o|*f`gU5{QZhZS{ zwrEc%Y4N%J2xgL(Twh@9;kmQcF}^C~dHA9=qR+m59oNGBLSDf*Xc9U&74H6liUCZ= zmbcoMI@+RLYwS&)V+gs)YosgFu^sDYGy5%_=_~I!O-*Uqbl^l$ah0xI8C>iAKELwG z$uq*wHM7&q&fJKMZBg)?d~cxk)}#LKTPkWmM*;YcP(fth8WY&)Wh zgD64tzWn7b(1ImfeRu1f&1iJSBhDC18r7K(|9S~oq0Q5?fK{NE#Xf>!TU%HdB!Bf` z_xipxfLS<)xW=+8)a@e#MHiv$6vsiTzSYdJ5F>F^J9xYR4j4A3ThLsoB3jYUNu!;0ERdpSjx#Qg1 zn`JJAH47svBg@x_?8%tUp|y_drp6eVwKk^Vp=hK~z}con)IB+|5wh?u)Jy>PaQhKI z1R7qaAcXM}C@knKa~XGtlA}7yIz<F2cb?@jkkJM0f$i()sM*?_>S85OEaw1rJIyQrOB}*~30LyZEW(sSlD;F>&fa<0@hvOIb6aJLjPTT9Yp{M! z_ks=Nzj3Y}xQz)3d<{sTocjwv>ap_8y+?{0(6XAesO>{Sv*0{H*VYlb7+r%;2YNOJ zjM&+L1rZ>1S-S-y6c0tyC0Q8VUi8b4Y?}IApDX9_xZ<=Imsqn25Z5kxiSYgR3`-91 M0uFK-{J*~Ne<0c2l>h($ diff --git a/assets/icons/ControlCenter/CC_Xtreme_16x16.png b/assets/icons/ControlCenter/CC_Xtreme_16x16.png deleted file mode 100644 index 86dcb358c4ed1b11233c223a33da02f310d91533..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 631 zcmV--0*L*IP)EX>4Tx04R}tkv&MmKpe$iQ>7vm2MdZgWT=8*7Zq`=RVYG*P%E_RU~=gfG-*gu zTpR`0f`cE6RRAQH!!VcNtS#50?= z!FiuJ!b-AAd`>)J(glehxvqHp#<}RSz%wIeCOuCaAr^}rtaLCdnHuplaa7fG$``U8 ztDLtuYn2*n-IKpCoYz;DxlVHgNi1Rs5=1Ddp^OS_>Z=T$6botEPx$zUUB5&wg=bb^8^S!16O+6Uu^)hpQP8@ zTJ#9$-v%zO+nTZmT^7;|Wk9sO zHpJ#t%ZjKFHJcJww&e|!i;Uw`SPlMBjFZD<9J|Q6X!$g@sNv+>)R%rA;|}SeG#kF| RpIQI_002ovPDHLkV1lLD|EvH2 diff --git a/assets/dolphin/external/Credits_128x64/frame_0.png b/assets/icons/MainMenu/Momentum_14/frame_01.png similarity index 57% rename from assets/dolphin/external/Credits_128x64/frame_0.png rename to assets/icons/MainMenu/Momentum_14/frame_01.png index 596818f9c07778990d58411a79a0bbc07595b1ee..91973344f429010e7e8def80cba50c11c0724a74 100644 GIT binary patch delta 1137 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 Gcm4(B2T}?E delta 1901 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 literal 0 HcmV?d00001 diff --git a/assets/icons/MainMenu/Momentum_14/frame_04.png b/assets/icons/MainMenu/Momentum_14/frame_04.png new file mode 100644 index 0000000000000000000000000000000000000000..9044c637e35473aaa15a05be47f8a289294a0c25 GIT binary patch literal 4614 zcmeHLdyErB7~dXnzyTWJNQn4Y_6Yde?z_9)T*0$FxGIJ7XcS*~)7jZ$q3!nCy}KR| zK}3+q85AX=AQE4Q#)$EON-*RE(GbA9Xh=xZASf}427?d<@!M_hr6lGI_}8_a&dfKz z`OWv5nQm9r&YV7~?8-8VqDDn)B6Uz-=9XcD;rpGcV|PP!kj#mi(dZ4-Fz5i%H<a9?$ zm4&r-Lfd@}^WJI+Csp%E&2uCFUc^U7iFCnby1@QP3JWogg(mme2+#h(`;OL)T~<5c z%d$IOk*#e{j}Jdlw|LOkk!xRmh(0rNf7$*&Rb6{}_lT9}zs>AF|Mj9>jcfOoKf0*C zLp;4`Zb%c->Fw0~0%sf71DtnR;^WhQm9zK73&K zD}%R>TrW=8{309sBDe?N|HIlb*;!Q+W8+>`J7;{_wq?!Q1Dm&S9jW;z-+gVz&DV!p zXB;JCPVgt+ZasAV+}uC3*8=13`SqrK?OWe@KD!6!mn=W!lQ*GLA52Mn6FI<3w1~YX^S!G@af)sHOolhmxIXxd@JYF5z zu9#zJ58^BcF>@f!VLMA`*)RKfwmNS$i_DZVx-x5+dR=5%kpg-lW}f3@bdGCjY4Nv6 zemmR13Bh2H<3&ysSwOJ4*0h82Y&uurQWQ8MB!{zB#e@vMWc}r>~6P-KM<2nE$VzB@=Z2MOnLdPkTy-N5=ZU__8ORthx` zE|YHX2HdddU<^1Gxp@lAo*Zn^!&!nHI~%v{WQgfL6}yLHu$>I#pa^mZtk!)_#=FkR z8+l&m3wF75G25`r)_+60n}@ChJcPW)%E9`ro~W>+W|PK3uh30e-d3V%Z&T<97fi^Z zW@31H0#{)O&qL`30;fkYUAyGg1yVr_AXCu$Ne+mFSO3PI zvrVT3Wl2>7_z`>s>FM1d^mSeYukWi%%RJ(ShZiN57g>>y3qf6ybb&8AjJxzEA|oKG zL=Lc6mJ_Tj;Q*_-$%Uqu6C)G3}MUCRTFp$={W?mE1ovy8!5QRY3F$GPr`^M&r7# zv|?Jgm&YZ16?fDnTmh&D7U`FN2i!H_u6}u-U*Li48gN&?JkT%jKz3a;ca`-#6q7Xk zmTiGY-ei6GB6wUbN!&I)0{?QfRfy0Vo~gMjM^PijxWz|3vtb+vhdR+%_0Z!bSB)N4 zQE_l^5=2$eNL74XCq8?AlW%f8s;~c;8Tt9Hy-UO2FDWf8om5)6bok3Brk1ratHP7_ w&3}YlUGvz4{WDKaY&?AH&TXsDlw3otYrkT2-P^A(1TrdGJu~vgE%nR(0ubu}n*aa+ literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/Credits_128x64/frame_5.png b/assets/icons/MainMenu/Momentum_14/frame_05.png similarity index 56% rename from assets/dolphin/external/Credits_128x64/frame_5.png rename to assets/icons/MainMenu/Momentum_14/frame_05.png index c6352056561545878f63173f0180616c55182dc8..6f5ff6860709b6ecaf9a4174d41f7cf29a8b753b 100644 GIT binary patch delta 1092 zcmZuw4Qv!e7@fV|U5|rG;M(MDF+J$*__57tleL25h=w$ zNr|V3G)5ZG1p;!VG>X&`e-J@5wc6BHG^8bW(KM2Psnigo#$XCW!8%)M#Khfw``&zc z^LA$P?d7H4m8D-!)>akxi~RtA0;M`$NBI^9J~w?Ik4`*F>5TcXVkt^F@X-NvGH$>) z9t!3r?PBsk9<6Pom`}CiaZt>7rg=NnB{%dgs+Unu+A%njSjGhkC}$`*stYOiQZ%;z z^Ra%aoy#|UOD-_&nBgiVkqmJwShRx2bUxy61aT3Lgjf<`Q3OkL0nEXFm*gZpU!Rdc z8ZhC;SS+c;Vxi`iwN~TPCIGFO&Yef^8%!2%`|REa=6SluL$`6{WZ|mQ7wU?(Bo}_` zf9No7Ji50e_FCQMyz}wWw_XfgoipMe`AdqBy+gCxr+#Q2nL6J#u+BbJ_)1$tmb=o{ zIWY14*N;Cp*gfP;Y#8i06^WiXba``sHvRq|*%S4X>(d7gwWi|PkIOqg=-WE{!r1=Z z`^=*KA6-B9>ecAa!%I4bR*rX$eX-}4XGX)hi(lr>S!;IHXU_KbzBD@Pu>0hkecZzC zH(}x%d02nqCp*xxG8#?<-2Cv`4#pDza;uE}b~iclYhFO*I$Hz^~}ihnvQx zt_$^lk|SctW4|vyJ=lBvV9T)Hn%+9e;4XFYlO?MsuAFVM`kH?1T6@g}a>;eSy`gUe zVD4SV-g9kW><8WD_F^}()9#I7Q_y&XH3^y`Cqpc=CL~zapn!B@5zUZPBHG2C(lS*w zI9}CF$ZG-%F%dOLOzK9WX%LAMOkTBDd6tEBT^3AHmm#tw6=GJ`p^6Owni^|yEY>Zg zVSB(6ohu=k#XP~1EVDAp+w;7o_B)U@i=2rh!+t8ix`=}uO0jZ;=V^P<)CfY0D(rEu7FG?BlT0i^ z9b*k*UKb&8cA#Qa7YvnPOLHPBgBT*3LQ+VG&_^KuNihVOu0++KsXNEX8VC{%@sJe- zlNhXqc_cU~fti$>c6jXb{MEiE<9lis(I$6k_gBT~pVU#t(b25t>POZCFgxIY0k3C* zw3z>_lBmqT=vpw}UlB}}57APQ5|5^WIsMvH7qhfMYY6UM;8VbzBd+4@%lS%b07_+T K{M~yRw)_p>l|A?X delta 1964 zcmZuwSyWSp7QKN$5)ec|rWg|q3W`@VTrw#Ln3x1XLjVN~NT!RaG6x7MCP)>cMW8_( z@Chi078xFh15Xs8wN_LRWl)(^0$OFXf(%by`t!cJ&f0sgwbwfP{G9!oIOVL?3U+WU z%pA=C0I=Zm*g}J94Ddvo8o0evtv1NW!N6dpP@GJNjgNs92jm20O01k9S1DisP`%Fb ze`C>1STrAb;#9%(YuN!ygYX?qVuAjUSRqFcZoj|kUJgGlhzHT*k@^OjDmmbT@pZcoGta_h2 z!S30V%@Z4nmT;7}^Q2nnGgr12f#SEjSX~arZ+^R*&}8&u6uKYVkTJt7NZ7VzytTH; z{Ml^M)(OSg?*M=}rb8gC)v3Aeyk>#Tv7G^&+!N_IHjWaw=U1S(eWa2fB`nBUX{&SAc-HmH+WKJ}_PrZ=b`nF*XC=Q3u zcPuf6dT9aL+h_l%JP}rfmY@+oiA8We*_qG(*4gErDD35=rIjDclK1@ z0#&*SenDf5S!aa!@6xtvoqg*G6U44%+5HSVk*x~u_AMLIHvcLq&N@wlIRV6rYffD~ zzhlPxq4e|@+sF!${OO@dyW{b*k11UW3t}2)z1LB+Nl>2Pc$UiuYptzNxng=^as3gk z$n1_!#9*+eiKAN9wfH;ge&l|A*_wtD!SWA><1S<`DcWzh@8$C0x$ZbeXU}nm+wFV4 z`{2(0*QueieHGWUpB5X}+n(n>5RbA~QDgy0r37$gA*!$SLqUz_0@zkN^t2-7)C&~B zuhypzKxH)UORMQh?d$FJxTQXH{>vQVR!@A>n%J0P!(Sp)wPd3tgzmX9NmpjPPKQ7y zJIP?Vlt!VFK$4g$0U?Mk2bpd%GRUBl=?n&gPL)6;-326`C?kns62zo|h7CFhk*G9K zOoynTSW1VOVyT!Ug>`*M7k3g3B13Ml1Y|I!Vi2NA2F_N+Ro)m}39Y-(s5KM2E;yF_@9T#-I&`-kM6bbJ@Vc-&533rZYI0SYAj109ZEv4aDy; zS7inhrR4i@P{YPpB-W<((SB*1TNoCushAt z4gib=e70Ah>h(z2NM#dY5$@r%THlMOQ+cn|LXVN+C`l&6AwQ1cuB3)_CGHhRk8pze zrg8cQ^60f(&D_1JJfZK&W)MGY7vwyTTv1nDnHs^ceb&%QKk!%;o^W^u*HW;>%`ze!Q*s12-QD&c z2_EIGBu%9zITHYa}U149NTSFC&{r{DG(EvVR)azb!-WlrFnvRS^YJ1YNH+PCXCwez3mhK z=I?~Y%-d8dn;q(L%3ITEF5UH}v@qwe>6v9eZ5zFQ*^B=zdn+)SUzL9@Z2x6_@F%pD zPZ9Ox^@!n{S;jm?;Qi3;>T9&R#Ij7@o4iJUld7bD2Z#qR!F$Q)c<2oaFx5yW$Q?l~d`#wo&Zt$~W5^)HwyrH#e#UPKTK4ngh*V;~o=!H2u&HJ^29zT~4ApzCs>K79g zJB>KcP?~o@Ptqshz7-KI)38fwvGI@Rv_{?-B|JK6j^5;AhA!Zigdj7w?B0CKsiQRm s`S69;d~qWR@i>_7gI8m*;)w3AsD(yhN(?x2+R#IQ&)LDQ^o}_CKllMO)&Kwi diff --git a/assets/icons/MainMenu/Momentum_14/frame_06.png b/assets/icons/MainMenu/Momentum_14/frame_06.png new file mode 100644 index 0000000000000000000000000000000000000000..9044c637e35473aaa15a05be47f8a289294a0c25 GIT binary patch literal 4614 zcmeHLdyErB7~dXnzyTWJNQn4Y_6Yde?z_9)T*0$FxGIJ7XcS*~)7jZ$q3!nCy}KR| zK}3+q85AX=AQE4Q#)$EON-*RE(GbA9Xh=xZASf}427?d<@!M_hr6lGI_}8_a&dfKz z`OWv5nQm9r&YV7~?8-8VqDDn)B6Uz-=9XcD;rpGcV|PP!kj#mi(dZ4-Fz5i%H<a9?$ zm4&r-Lfd@}^WJI+Csp%E&2uCFUc^U7iFCnby1@QP3JWogg(mme2+#h(`;OL)T~<5c z%d$IOk*#e{j}Jdlw|LOkk!xRmh(0rNf7$*&Rb6{}_lT9}zs>AF|Mj9>jcfOoKf0*C zLp;4`Zb%c->Fw0~0%sf71DtnR;^WhQm9zK73&K zD}%R>TrW=8{309sBDe?N|HIlb*;!Q+W8+>`J7;{_wq?!Q1Dm&S9jW;z-+gVz&DV!p zXB;JCPVgt+ZasAV+}uC3*8=13`SqrK?OWe@KD!6!mn=W!lQ*GLA52Mn6FI<3w1~YX^S!G@af)sHOolhmxIXxd@JYF5z zu9#zJ58^BcF>@f!VLMA`*)RKfwmNS$i_DZVx-x5+dR=5%kpg-lW}f3@bdGCjY4Nv6 zemmR13Bh2H<3&ysSwOJ4*0h82Y&uurQWQ8MB!{zB#e@vMWc}r>~6P-KM<2nE$VzB@=Z2MOnLdPkTy-N5=ZU__8ORthx` zE|YHX2HdddU<^1Gxp@lAo*Zn^!&!nHI~%v{WQgfL6}yLHu$>I#pa^mZtk!)_#=FkR z8+l&m3wF75G25`r)_+60n}@ChJcPW)%E9`ro~W>+W|PK3uh30e-d3V%Z&T<97fi^Z zW@31H0#{)O&qL`30;fkYUAyGg1yVr_AXCu$Ne+mFSO3PI zvrVT3Wl2>7_z`>s>FM1d^mSeYukWi%%RJ(ShZiN57g>>y3qf6ybb&8AjJxzEA|oKG zL=Lc6mJ_Tj;Q*_-$%Uqu6C)G3}MUCRTFp$={W?mE1ovy8!5QRY3F$GPr`^M&r7# zv|?Jgm&YZ16?fDnTmh&D7U`FN2i!H_u6}u-U*Li48gN&?JkT%jKz3a;ca`-#6q7Xk zmTiGY-ei6GB6wUbN!&I)0{?QfRfy0Vo~gMjM^PijxWz|3vtb+vhdR+%_0Z!bSB)N4 zQE_l^5=2$eNL74XCq8?AlW%f8s;~c;8Tt9Hy-UO2FDWf8om5)6bok3Brk1ratHP7_ w&3}YlUGvz4{WDKaY&?AH&TXsDlw3otYrkT2-P^A(1TrdGJu~vgE%nR(0ubu}n*aa+ literal 0 HcmV?d00001 diff --git a/assets/icons/MainMenu/Momentum_14/frame_07.png b/assets/icons/MainMenu/Momentum_14/frame_07.png new file mode 100644 index 0000000000000000000000000000000000000000..6f5ff6860709b6ecaf9a4174d41f7cf29a8b753b GIT binary patch literal 4570 zcmeHLe{2&~9KQ~bF+d}XWC4svAqdFzezv_{R&ch1Ro78RgY(ziySsPWv9(v)+tvXQ zMT8hxg7PCELs%3+NQ@XkR01K$L_-GIq9GvxgJ6j9S1<@saDMOFbsLhH8St-ldwcJF z-{(HxpYOfiUX4`DA6qc7fFOvmp|W5l^!HjVe>nWzUvlYb=uYFRkQNHfBJyDZNXKx( zVPT*-`i=7(!-!!ZTMca-j4h1SCOSsg{aP4L%8oa{ct#duJ;OTkh_TSOLE~Ut2>l*t z`kIWc!!Wi!`Sy=DkFXKF{rpfkLUJyaaq$8?&v1goa1tkytSGUJBzQr;V@IDw7SoH> zZC zU0b&8=%sJJdhUf|?Z@v4Hyzu3LMl1E^Y`V4yFU1%>p=C@)QY!urlY~GPiD1#cxY9} zOJ}xj+=3@;{rKj&*RPlS*fG8J_<{@D&V0V8{w~D+l%-dSqsxrTiiu z|1)#tqn0y0H>>{?_j)Eh^V{r`$M)>sk?c^?D^^`~2;0%sPp8*kx^{N4c4+bU+l?D} zM0aG#uWu{O1aaRSJz8Z}h07(yh`Eqz$k>&RC9HrF#dFgMq|{@RlyR*d_d9?2?1+=p zRloB|cbEw$0=P~uTbjfRmsUiTrS*zWb6ZC(k+mY8;u zHpHy=JF6hi0V9b?!6mpDsx+-Pan3mfWN}i}q{`sDECtN`&N|afNHpEt-0W)RT}HB& zW_>;%&2TiwQGlRQEpZd2sd#FtMUmkM;*^rq6Q*v&NsAN7Mx*I>I$@pcwJ(+khjaAt zR5l6_4?2w!H0xsMSd8xfM9M5}0+Osjw|ycNZAoCd5~qyDq=HMEaNL~QpTer}9E0Uj ztsYC*PC@VnC{vXjF4355uraDa;|3f9(iGUo4#1nb))%Y+wplB-JN*p-bvgb4=w9D# zFrdO=DQGB-meNqr@3icdR725K$sS_2%rk=QrLc$dQG$=flqmRQ%FQUECd#T8iJpE` zp?JzfaRpmcKI>FndK+qO67 zUTZH{X_3Gg2rRPd6qs!}_#y?87@0;gY8VZEXYN$YEr(${smMe@WMa^kJ13*P=j6i- zBQY7jEV{6v>RQXcp{>nB76TqqUZ$r&e~T^3?5Kr!NoJOrHt6=m-FPu=Lg}x9IaD1n2k!5J(VJe(c`V=Al_^%0^vwA6fPZkIdAf~0=g(N w>o|xegn}i}qHg6z&vwT{HF8bS#>x31!rz%UaqVor6aYl1v?BQaqcto41}iM=LI3~& literal 0 HcmV?d00001 diff --git a/assets/icons/MainMenu/Momentum_14/frame_08.png b/assets/icons/MainMenu/Momentum_14/frame_08.png new file mode 100644 index 0000000000000000000000000000000000000000..6f5ff6860709b6ecaf9a4174d41f7cf29a8b753b GIT binary patch literal 4570 zcmeHLe{2&~9KQ~bF+d}XWC4svAqdFzezv_{R&ch1Ro78RgY(ziySsPWv9(v)+tvXQ zMT8hxg7PCELs%3+NQ@XkR01K$L_-GIq9GvxgJ6j9S1<@saDMOFbsLhH8St-ldwcJF z-{(HxpYOfiUX4`DA6qc7fFOvmp|W5l^!HjVe>nWzUvlYb=uYFRkQNHfBJyDZNXKx( zVPT*-`i=7(!-!!ZTMca-j4h1SCOSsg{aP4L%8oa{ct#duJ;OTkh_TSOLE~Ut2>l*t z`kIWc!!Wi!`Sy=DkFXKF{rpfkLUJyaaq$8?&v1goa1tkytSGUJBzQr;V@IDw7SoH> zZC zU0b&8=%sJJdhUf|?Z@v4Hyzu3LMl1E^Y`V4yFU1%>p=C@)QY!urlY~GPiD1#cxY9} zOJ}xj+=3@;{rKj&*RPlS*fG8J_<{@D&V0V8{w~D+l%-dSqsxrTiiu z|1)#tqn0y0H>>{?_j)Eh^V{r`$M)>sk?c^?D^^`~2;0%sPp8*kx^{N4c4+bU+l?D} zM0aG#uWu{O1aaRSJz8Z}h07(yh`Eqz$k>&RC9HrF#dFgMq|{@RlyR*d_d9?2?1+=p zRloB|cbEw$0=P~uTbjfRmsUiTrS*zWb6ZC(k+mY8;u zHpHy=JF6hi0V9b?!6mpDsx+-Pan3mfWN}i}q{`sDECtN`&N|afNHpEt-0W)RT}HB& zW_>;%&2TiwQGlRQEpZd2sd#FtMUmkM;*^rq6Q*v&NsAN7Mx*I>I$@pcwJ(+khjaAt zR5l6_4?2w!H0xsMSd8xfM9M5}0+Osjw|ycNZAoCd5~qyDq=HMEaNL~QpTer}9E0Uj ztsYC*PC@VnC{vXjF4355uraDa;|3f9(iGUo4#1nb))%Y+wplB-JN*p-bvgb4=w9D# zFrdO=DQGB-meNqr@3icdR725K$sS_2%rk=QrLc$dQG$=flqmRQ%FQUECd#T8iJpE` zp?JzfaRpmcKI>FndK+qO67 zUTZH{X_3Gg2rRPd6qs!}_#y?87@0;gY8VZEXYN$YEr(${smMe@WMa^kJ13*P=j6i- zBQY7jEV{6v>RQXcp{>nB76TqqUZ$r&e~T^3?5Kr!NoJOrHt6=m-FPu=Lg}x9IaD1n2k!5J(VJe(c`V=Al_^%0^vwA6fPZkIdAf~0=g(N w>o|xegn}i}qHg6z&vwT{HF8bS#>x31!rz%UaqVor6aYl1v?BQaqcto41}iM=LI3~& literal 0 HcmV?d00001 diff --git a/assets/icons/MainMenu/Momentum_14/frame_09.png b/assets/icons/MainMenu/Momentum_14/frame_09.png new file mode 100644 index 0000000000000000000000000000000000000000..7b0b82c5a8507437fea1464559a14ff36c421132 GIT binary patch literal 4599 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 literal 0 HcmV?d00001 diff --git a/assets/icons/MainMenu/Momentum_14/frame_11.png b/assets/icons/MainMenu/Momentum_14/frame_11.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0377c7d294344ef1fc951b77262f66d72e7dd9 GIT binary patch literal 4614 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 diff --git a/assets/icons/MainMenu/Xtreme_14/frame_02.png b/assets/icons/MainMenu/Xtreme_14/frame_02.png deleted file mode 100644 index 5ca6f65286f0b64672c3063f50dbcdf6c4fec349..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9296 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 diff --git a/assets/icons/MainMenu/Xtreme_14/frame_03.png b/assets/icons/MainMenu/Xtreme_14/frame_03.png deleted file mode 100644 index 99ac840a2689f48c469c71331f95da38728e11b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9034 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 diff --git a/assets/icons/MainMenu/Xtreme_14/frame_04.png b/assets/icons/MainMenu/Xtreme_14/frame_04.png deleted file mode 100644 index ec9d4d5b4ba6880d81e49f586fd893ee5bf281f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5701 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 diff --git a/assets/icons/MainMenu/Xtreme_14/frame_05.png b/assets/icons/MainMenu/Xtreme_14/frame_05.png deleted file mode 100644 index 39f2d29795b9d2a44e33138be7c8daa0b5065c36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6982 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 diff --git a/assets/icons/MainMenu/Xtreme_14/frame_06.png b/assets/icons/MainMenu/Xtreme_14/frame_06.png deleted file mode 100644 index 782fc285428f304ee9201f4165fd050792a95396..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6911 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 KmRC0U#s3!%1R*E@ diff --git a/assets/icons/MainMenu/Xtreme_14/frame_07.png b/assets/icons/MainMenu/Xtreme_14/frame_07.png deleted file mode 100644 index 5d56ce1fdcb0864bf6533acbffc529c308811fbe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7733 zcmeHLc{J4D`=>0CN+C2rSHbAIP@&hPu*=Y7umJ@-EMd0zKY6cs_inwr*qGmPt+#f}c7v~l4Z{rM1)#Z8i6l1yfZ;_VX((Gt|g+U2fO(Z zky^JuzSUMW>3o9q^oRWo?T^e0=i!z{wAAy#YspV1l^n06-so9jT;!Lq1Lkh7q&b&S z7CNV=2W0JDow;2lDB1e;W8ZQ|&~5Oj|BYV3~dyTU^~l<<;<@@w!WiwB*ftrR5C zS2Y&>u%yDi(wKPLtz?WV;7l@cm@T@AK$|<{x$wd9;DansO`f_vaSBt_FT$ZPy7WHl z%iJEiwv=3hvw{T6yn^GLUe#Ue}^Z-IP{1txuKM#$~|nScXoUQjByXFYBXoDP#n#FS_K&#HyDC%c+;ZMp+0Dfp zuc@!RFz=~bL4KfJS%*#-ibug_75U5)0z!nH6MW)q1v4uW?E-=YtnGYaEf=yKi@$&T z#(r)}yNi-O*~l=6d>}m*0y$t5c$VWVe*ex16rdrc;B4lDkFU7h1MkQOX$s0|b3Aqv z(&Ay;P*j$qHyI6I$p)+)q{w_eKKfxCn8jA(1YA2#xtFRev1c{%#Yb(^T+dV3*SX5e z28F&FHKhlQTw5ke&p0^g??6|0>_{^J=Uid$Tl7y}Li*p4zFkIyzjK8$a>#a$v6E)P z>tpwM`iVD(^=CSpV{RIDOuJ~G2MT+GuqQvxLI;na3S1AD#1so=YpXRUJgnBMPTcu!E4Ay{{`Y!P zXBM=j(-T^oD{P9i)x&~R)wx!)r9CWG>ofaJ2fiklMO7?b&+Hd{1Xs#95;-f1&M~;} z`<(wVKaptV(u8{#Cv}7~O|FqWZU47ZsAI&5vbpd?zP<)dNAa#}82Y5=OPnW61X_K& zCim_{0~;3Gx-ww6>sEZm`(#fafeXuWzV||gBV(5bca~95@w*QN5$ux2(0ta%TZJc1 zoVisjk>ffM=?LZO%X(|KP~CO?RtuMw8@h+(IZX6=f@8egd17?+IIti-?8SL$brWmFTDfcKqso`^Z!}Y@XQ5w2&qj|zfCaUcVr)&Kb@1L{~ zzXZ64a2>))+_)sHQj+q**RxOWvSg>0VIuCOkWayBYc2E*iCHfVd*gSKoBa|l85#D* z*GH?g=kT7Bl65+8-)ny1W~qdML(o!w?%pFwHcxbIh3<n(Iy+k`4I_czW{o%>UDl1tW!fyN^G>AqPZ zhVep{OAu5{K|4k&WiLc*wQLqkC-p;o@yHMCxYIX8R+LU3&*J2Pt^E-p&2AsqY~g6l zGMeaU{4&|?*}F)|o8Xt%Ct?6Q`(D;pkGaG{O)LEJk=-E$(JbsrFEU)h6l2FwXl#_q zXvrXtU3wV#*cY$8twX_E=wC9x<$DH&o>H>v(Uae{NZCl^u5NgKQjkoT zImS;qtp%&!hR))@oQBmpc09f>lpMq7#m#+}qoemtg)H?0Z|kdhjf&C>&2}mGf^^KQ zpMBX6Ix>#4Cn@xcgsB&J#PxLv@xkv$v!dto%Hu38R$1*{ifR~rQ@fcJQTm3fZZY_- zP8h#{8OybqeNh%Y@?o!aT&8ltM~7AKC?0x)Q_h2#GPh$KAu~t z#ZHJhcqB$8XWwfek-9K@%&Xr(e!t$$J|hY+H$4(I)5&#lH%!Pgw=)(V;H!o&HfVQ` zY4bQKI|JFYRr3I`YIHWWjucj`#4NlSO|f2@1q`nFIddMGdwDfkz~bEau1DSvpYuWD z{cfc6CZ9=hxj*k+rFZH1iUj@CxmkVx825dj*Pt8oytU}rCn;=So~GM8_+s-7P6P;` zuLN_zVnXCiy|PS39xhdjm}v3333t;E_#R_v;RkUg`ORlN2=jI1H;vf0788mZR{+K) zMaLL^6UgFW<)}%C$uI19xFf(#sWZ?tQsb=aes`m8!$tLIG6jEDlv7!IzEWg)RJZq< zb8$(9wFi${Zdm7=IdRBJACQ7+KQ1=l zWUBo!V5~7O@w@!0+vaB6HSS8yja^k615wXB*2ICk!W)Bx{fW&T8n@asEf)>m79Wr4 z(264;31zo#i{X%)kE%=8w0u9GF*Spv>c`jFQo`-3&=>p@u^gG3i5% z<>KR(_qcag2|5~l=6Bq`$=evo`R0g!L!Z8j*aYPPIJA7i?y7zHi3FX3y||#ZgY9%= z`zP*M?>W^jT&SwnjwyOz=aW|oFSt75o5kPe4N`BdH>UUJkx@4*9{WQ;m=jT%tF}l> zYYqRh0(9&j;h$F&-qf6Sy>byQziNAVDUwv@J-lDHZh>IH^|Lfd z>FayZt9w+xK>t>(_1iVPS}hZRMh!gD(UTVYE-E8pbZ1pVz){Qpl%7*m5|-wpnO&0I z;pkNBNMEw+?BZXym*#JJ9`#(?)0g93fvlXRK}Qf6nN~R!`^EC!!qEnEC%=!8YvT>y z7Ei2Z?WVl=&eeJQ@CCDc-^Qi9vtM>i3bL7~i~EEJr5GQ-aOJbOlw`y=J@TjgjyHm{ z>aFW08NNMGjbe)hM9WpD?4!t*N`uv%YJDV@bq%X!PY_4ypqtHK8L zMC(=)usqLC$>%U;E`qbyNU-s6@G5H61DVAiA(}>+?a0%bA}m0IW^t(YPyq%$SkhyK zlw{q1WdQ$DBB6dBWJYIn zy_D3_(f9Ka6T_AD+0@GVcQs$qR%!J^GFiKyhdYlu%%=Ksw22|PiXKz;hWeK~_RSo; z%XjgHwr?ACH#Yh@_YSrKo8DJ{w8+B=kU|OWeBQ1d_x+~XhOYNU@;RuU++bYF86T*l zPc_aY2ItWS3pHGnVlIzeuUqENfaIqD7X-OB63%QZGn$vt_psUU3Q-Kw&epYY-D>&^WS>ZKNY9lyE)X1LCb?D{b8 zViR1aF6^apP_>?FoEFlQVT3#L>FwG)e&k#&*IQ#M#W&c(TIYjlew~&N-}_x2VG)~UcL}()xwIpar%mHZt z$EoDRR3VmUrNRlNjJuj+3mNM-M4g5g_RLlkQG2?lTf4ts@3}yI6eds>mAnu7)&f?p z7sirv=Yz#PWAagI*jI$aQ@Jz7bzhsOJaC^^<0o4MdXr-ptL{FyyC--oxxh4GqqlE| z0qN#=K#Bx(<(n>QfT;}tEMnz;)B))E5FE4DO2a}!Mj>EQ~o`w86W-XvBLf{B1Kcxnmz9Pw^JFZ9gPpO z8%6}zrYtEodefeYY6mn!lcc(UA8&cXPl`7Yz2c8OSZwVZC8~GJccY!kuRP`2sdl)f zGd|knc`R}Ea39Wi){K{CjFLi!4%~IkoY1%EXn$*>cwk0(kIzewKqnBOri; zR|i@vp&@9R4#9`MTl|c%Y^Rx0*MS2|y+=FaU3|8-#l8WIfl z^74}RQjn**JAI7R$#P$&wWfuZ0CTTo1Jc@h%` zic^B%5K34OUIl>%DXPE~K?n#20fH()2@otoQBhF|_8Ww;JBeA97`NZO+JeF}p_E_* zh$0N91VUh$jwnLma1aIuQvhLLFck;_io+->DQ`pJaY%itI~l`FCy9)4CV*)a=k0+l z!jW1gD0LuA9`cvO#0|qBG7Z#$r%4nK@4p5tNMwRJ1GB{@R2i;}fH5Bxgd#*4qV$)N z6~Ud(ti&x$C`4Z2M>Jb$K{A735{ucYQzpQ+1v3_;jynOvpt@U7sc!1PEtddWmcNG4 z%;ki~Ffh6p27w6*fhiy%FeD6O0YxAc6_AQ>SqKCP`AwgSClP)AFYT?x15o>sazhfG zIls@g=*NmOC!GJ$`_XkHZ7(GNV0%#@F}NQg&@rBbANgit{TRZzU?|Q6=I-&cT>q4l z{zECKATTOKxUwP$11DfXiUbt|2#ZBPL3k`2#;h^~97=$1v+xU@P9-wDFzy5`XC{wK zu9)Sy%@sguJ5kbq*Yn%czxn*k#eZ`O0N~$A{t>_b()BN0|A>Kqr2KDn{Y%$BV&ESs z|65)EZ*+10b(|tlnE!&jn1`jfDpefwptS>g%0QQeB{xzW#_Vy?3~lKwEW7!(URIWb zL?Nb-lYv6(aZc~x=aYrVO*g(`iVRV@S{6cmu{WT5S;Tmn5<@pHBH#cHU-qzk%Kf&J zEV}4RP}2YtHgNiqXi#G{>m}4A diff --git a/assets/icons/MainMenu/Xtreme_14/frame_08.png b/assets/icons/MainMenu/Xtreme_14/frame_08.png deleted file mode 100644 index a21cbb27c36e9fca2c36b63ecf1c152a6c20b5a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8435 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 NtZ%MY`rEni{{p3kF53VA diff --git a/assets/icons/MainMenu/Xtreme_14/frame_09.png b/assets/icons/MainMenu/Xtreme_14/frame_09.png deleted file mode 100644 index e2f07516a179ddc8a0abad14d697fc124d2943c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8881 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 diff --git a/assets/icons/MainMenu/Xtreme_14/frame_10.png b/assets/icons/MainMenu/Xtreme_14/frame_10.png deleted file mode 100644 index a888dd8a7a13e2483b8d7fe4d0466db12a464958..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9296 zcmeHrcTkgE&@WP?_adDbKtW1ED1p!gq=qgXBn=2PKp+%BMFj-uQl$4PC?E*ZETD8m zs(>h9W_u*1z(2Z>Qx&sEE=QBW;oYah}S_`6l0^ z?V9)xj21$P3rBV$IkeWbC%FR@-P5DYK2dSDr3(!G175O1AGq7>f;bL_Rw8$wFQ|;B zA?lQWcvOBMwfb4zow8Hd$zxaQG2b}Xv@w+#ofl6Cdfo=ZyX2p?)41 zYr5K#qi6e*jJ=|H zxjPA-_UBWj^4;5+db+$MUju`(^>*}Mj_s|aj*lSKK{hE&T_W}0gv-YSbR1LjB+do# z6X=%52Pll0pY2i=NN~Jxoe1LFW{$aMQ_y+m7EM0Sia`hIMDP&vdwDmqdfh9YecJgB zsoY)xw%=78!-bpa<&Zo`dX&P#_nbu*74znu{$PRY+g;Ar!ssP`FkPl2jS`+%G~bqL z=QQiB7Rs>O6fI0M?Jh$nN#rj1c1o3G`if4~KJl3ux=X89Ry?s>ZYeu#W!6_GGgZHHTt4; z?s$^RGx4JgG$~puaVg~>`J*}B$Y1)zRYAD;K))xXep0c*Pgldk+Fd(OWao*dz!+Q7 z5ACX;(5HchVHSH`7>P-_IubYp1t z&T+g}Aa1Um(zG+x!1|01Ao}?B?uRJ!xLeqn>aFq#eAlNeEwCAV4l>VtTyXN|O#M)P z2Y*DDvL-H&H;Xglh;t}5rQmHGO_lu`n;z@oVE&-c$6Ka))k6;g#kmsK{ajhz>Zosk zGPqMm-M8~i>n-f>`*uYw0#_zD-_ILsGsVg%r^V{|8dS=SMGR)~;_#{=*(3DL`d_Cr z0^C)Q1L{p!GXA&?4BdLH6C4{L@6C>c6a!PIt~Bv_D+D^=r&u0xo~SGw0#rgDI_q!(DTX7j2iOC}` zzNGYs`|FU9wL8AWY0=)HcH+Z)^oOzA__+tQ(ATa=7Zp*ud}K@8>Y*|lgQWApdauL| zeO5~+vq~J6jeJwwK>aLkXmr$+F9twQ7G|{~rKG73m3OTPebSMjGw*p%MuW8awH>#Z zC$f(0Fp{L)-$5_^h|@Q#tQ~P=K=raRrt<1Wylr3(y=lAJ<{4{KvFFfS|M*XhYk2iN zVCmVLfSl=I)u1>lQYXib+m}7M7xgHg7no-rEa>**5N_a=Wv^v{MW>UUCT*o(=K)*tx_XVbIs~$oEYu zKKs2JBbi)(YTUlTqPHR70>FZ|xT zMp5>jDhqDXmUR>e7l$q>zK^X!*X>3BEbmAXZgce!tf(PX;&zt(NO`%uCRp-vLP~C3 zo|V3uF8fHATV8yOP`z%Cf+yh?GPc$G%sQ^eOlYPpK5{GO7HyJk<+@zGAk96{lbY+f zUkuUh1>q*HH;byJdZ~|i1Ou`}O3!w9?@mU06*ZS?zPraVD_ZM2nKilITa}WQ!C;qg zo+luR?o7>-GR+q=jFQd^gSWXdtaKuou1S}~_}zHwxHkQK>ZK4>EbY~~sus$-5$Rm- z(C{+Ki`NAVDWmV8UO&0_E^JXdsokjWSxwX}*T@qiT;=|nZ8vq5pGqbyE!o*8l9Sc) za)sDLzwrV~sZUnP6vGRhZ5;c}9nJ!0cy)ZF>0J?4_p&QU4UO-iR8~|$-KEU?5%Y7L!rtWa|}FB zy=a48*K|^zbzwPAN^zL6LjoDSYThVRAzyCu!ByJ5W~A#$Tn(rH3!ev^M}nfpl*SM2 zuaa1!PKpEeH*dnVfb|(;{;EZw zlqB*CODiF}v#Aq5gy;(O{R9nHI8+iup?kS1TVnUCOi?8sdNI--b5ha#`gPUtox*5) zR;(gHi*31^LrF)A%|Z*WP5;bN(Iq8J*xmRgm-I8q2As76zB-Gcti82oNs~FB$!|hM z02O>?JlCP~2J&ahH}UC(BJRMw56-yGmD{P4;;8EjL5XS;3v6Z0fd&bS!~IXJ9}Y9$ zjf_ux-&L#|o+yiM+iSJ#9c6bj=X-PQs`j;t@T-22DkWB?-xQy{-Tw00iiH$gqZ{mD zx#VRXSNiYc=JVfza}4a6Aw!nKDzy==DobZn-4f4D@Wh5gvWl_gZsQWt8mfhQ3l>|X_gPE zVL$Wxn}SR#nZeB7eHW3>x?`^eCaYBc-5=Z4AtuCXp}Hg*&qD@z5#xh=U(;O61*H z39`8LK)oT>@oe=Kj-Bb3WSt|`k^QkhY|_PzSzgxnqWnyjV1HgM zYF>l9ohzgO)Em&z!Dwa9b57%SdYCDfv+V7fYQn6%A(o%8G^~DU6R~-IYJ_c(RXtK* zQqN8tRTj*cr&EsO+f5kM?X)RX5hA~K^S#_9Adve~_+Z3?MVLNigvZ>8e4#tD0Cxs8 zscD`hBa%|lrSenrl3?#Q0IPWiO?2X=YgH5Wx%*b-tdLd9^O8~HMJ@>w`57X>CbhF( zgCpEpI8l7Q-m7-93}{1%{{^n4WtKzJ)F-B)Q6>rz!JQ74X-xUcv4dWTpEEc^s7(|~ z6$`eHKc|}PyQ~fj>#kky7ARR3vS^DQmNpdTQ%<_L)5{B}yC{ZOicU5b%+~q5w=dr? z{0Y8EJ3~&Occ8dw!%ge(B_gL`i6yq(XQD$hYmw!JzK7P5rlkFT*zI+EfS-|L&T>Hr z%lwE+^^n;v85>$N>cV)F43F#0p$IG4X=Puz+H+Ri>B%(ccq~QM79uGvuOnk3B*^Zr zW0C*GdraDVpvMhUE@sO&E*Ca3k!tq!RHtV0jPpuWFs7#~?w8OvC){{e%UH*9RtRyC zPGH}&njAuTex~GnCf`gAZm6zIx=t-qs#ao|v|UUj&krLJOwm*dC*>;9@|MmFUivh7 z+%Dht-Fs)|OWW2z@0l^v<#RmG_Y;ywa*Do=y=7FnB%zHcTwa}Mb}j^6H}9^6-p5m} zeIFY>JhB-1WVW@}Yj>n9d*dXvU9c{qkeGD=j`Nqy$Z$7rN)-26s)%? z6z`vF{Shl!eq$zjeKG%ZV94ky>L|)#1HPZYQ7jW!$tywDl{9eGitnnic$GQ{S!#pD zts8`fnS*(#9z!by#) zKY5w7N6Df3UPWpRHx)l;BR3WL{fJt;%H^~hnc-EO=526|)ZmIw#d$p)BVI%AzJ6Jr zXpJkn!i#*BZw8`2n}iy!Ny~if%$RY_z?OT<{PG*pc-gu$9xD2$R9-AZUH3qig*aB93OMOEO?FHJ!C~8JuM$u2c6)>FL9qbNa+EXAMDPgkH`ngB< z1+hEJAi1N3_ozP(2}XGzyOnC`u8xyLgBlsnX^;=ru3c};3{KGzyxqy0h3~;9-7_pB zZx%3G&|mI5lLWXVds{Ihq@l}ocO+~%JV7vn-1AxPURSWSU!zsuefG#eMk6J|tjtOk zEOWQ0b3)+wNopvA|F0!ncmAxR92pAxH zxGb;y|rUbeqsxs*(9oN%|Qdgi*D!+61QS%LgziieNH zHNf)Nw%C`q(CT}z{HcKN3Q}UF)-c|@FuUOj1RwIYcB!=63^jk@o_%qwIO(J9)kjR> z$CS4UTHPO>VBXp(*Y}$2e1u#h|GfP0aY7Vh%5K%;3J30{PZUf1fPJK>-(KY7Jh~)H zeTGJ~$m^c-X$>i_>ze5>B%?29+1NzFVfqlGF>JZW&z_>kZ}d98hZ->6@v!tU?=Y(o z*~z~B5O#i=c_>_v9WA7oYN)dL{yZaiep;_q2r>En@cGWeFj&i>D*~kKPA`7$(-zC# zQ*yOnxV}qmi7-d%l)F&oMZydt$I)h*Uem#{v zoXjW1Xq}$guK4R|q1DQSY=-8A%uCb+gWb%HeaOuUI-5BgRw36`e=4OqG8OJ|$3@{% z633e~ky@|hUK$ORwSEYwZ1~vg*3k2S%H=_WrXmNxJu8$`r=>2QD!|5OYN!6`xb^)* zCpjy=#CM^Fs$u<2H{R0;dFb76uta3CN#_zw$k++re!hEei1IUvEcjNWxL(wrPSCey z+UI{t$0H5wo(@?X>TuwmWb{}QqW+n?O8-c|F0eCmgBOyj z>T}%W$q(PkQeFC5YBTrcIFq81*6c-mP+!<=?1D&X`#tZkycBCk1zff5rk2q8Oo|YW zmGqutrWH2VK8)(UB7P^SvEkJuV_KMG9@@n}VqJ7xbd*ESzI(s2YPjgpr)53m4;$y6 zo2J%;R*3B^Tb-1j-o5;G%u*qG5L}iN#JX*47HX+%lMA^9?D4- zF-F9s8z*~x2nT=FLD}|98+P#I=iJB+Yqp<%FNM$8O^Tf@g;h*;c+2#08%y0Ws!K&L zP~w`gjNYN@^wIG_OQO0N3CS5CRzt&BS3~2E!%gCmW@c7=wccxEw(z$0eBkr(SpWl< zo#I5-%W@`i+G-0htVlPiLnvIR=*QXCdnyK$>Kp7+?3qVicpNzT9K*@mnaq>6y|6VQ zgiSpIps)ND-|mtANw;<2>tc-zjtq6H`H%s{qVLyRkz655+>hrQRR?_7QuFY6-LINU zUre0ao4@L5rM2KMqr{>bnI+N({GJp5)f0T}L`b_(yYY5t%1OCjvLAk}?sg9~nG)}t z-n2yH!DOdp-XWCHvMCeJNLK_NIg;U4JbT5wyX&j549k)nec+^DcFBWkrQ%HpHKA}* zCNS;f$l*Y~0$N$A#m}bx(Z=*c5;d_KhBK}?TQzxh+8iC#hd*>s-Wq_0p6SIJTdaLR zyAh9w1F*!SU@N!*4CUn^i9mZHF_HluIO0(;35k+w01kn2!{7l(j5F3#8Mxlm1_WTy z%0Nq5I2ex8z_?&_f_yM$L5Ak2AUBi(8mOv5qZ9xm0(fBX2ta^`yQeQKKpFT87e;(P z6@!3)Un+PvWuO(@7@*l4hyV#sU%^v|-!L>Wz9=6o4v+Qn1e{_b zkY0XxWgw6^5BS4B4;&o+C%mWc?<^4c00kg$ASp>O$ioBlcMD&Z%jX*$TQBbJ7?BAetJ$>;A zPZZ`9iU=-=CE_T^%c7weFhoKYiXcMBC`e1l%gQ)O$jV|M2&9Y@5`u#M4Z_F=ORP$S z``^7fg+dddq~svd5CjGzfrdB{p`3^=A)QcQ38V}L1wqRwK*3ZU>*a(eAbc?D&O{!GToKFj7gqq0Ux^a^r#8U_bD9MrVG_i8`-?E>?}UMV z4;XaXGyaHJ3G{z)qV!AQZ%u}1_nVB^yokLJ^k*~towL)n^S}7}Js1CrD-faoTjXEy z`yXBZ(ehz9b~Htf$u*lJrbYqL31=3)iAtAZ23}X9f*uY7<4Kx|-_doI^43 zx(qMCRP9P4CnuZR@x?UnVrX?ZIAh#NOnP3Vb<)$Y(k@M8Co#X&*HTGdt5$sye^9Ky v@XV~p%ec?3AI7DcS(7uzlWFpi;s(iX8ykOUXqhV!okUm5P_yc?W7z)zD!5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1i*Y5+M>g*-agACFH+ z#L2yY0u@N$1RxOR%fe>`#Q*^C19^CUbg)1C0k3ZW0swH;E+i7i;s1lWP$pLZAdvvz zA`<5d0gzGv$SzdK6adH=0I*ZDWC{S3003-xd_p1ssto|_^hrJi0NAOM+!p}Yq8zCR z0F40vnJ7mj0)Ife0AN*tQY-?%!T_MGKq4*#z^(y+S++7q0)V{*0CtX8kPkp$0Dzf7 zEX)8PI067e9uv(2AWQ?GFw(!^sb6q~xJUs2z{{1*mrK$!6u6bp8h7&W;Nl_T!fdfZ zVHYV7W(njXoR^y;6G-O+OwJ4d02=wx!TvZukmu&);eY04=WOrv#iIUe@NXhMA@Se- zyo>?_01!^k@7iDG<<6OvVTR07RgHDzHHZ48atvzz&?j9lXF70)Jr!L_iEAz&sE_2IPPo3ZWR5K^auQ zI@koYumc*P5t`u;w81er4d>tzT!HIw7Y1M$p28Tsh6w~g$Osc*Av%Z=Vvg7%&IlKo zjszlMNHmgwq#)^t6j36@$a16tsX}UzT}UJHEpik&ja)$bklV;0GK&0)yhkyVfwEBp z)PDkXK)I+N8j8lCbJ27(4_$zkqHEC_v>rWxwxXxeOXziU0DX#%V}Q{y4rYwmVO)%d zMPP|o8YagUW93*iR*yAf9auMZ6&t{wVebee0*inX>cw#!SkbhW4tS0Uu9wDA3UMCI{Uz12A4#|?_P6{C< zkTOXNNoz>kNG+sOq(0IRX`DyT~9-sA|ffUF>wk++Z!kWZ5P$;0Hg6gtI-;!Fvm zBvPc55=u2?Kjj3apE5$3psG>Lsh-pbs)#zDT1jo7c2F-F4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH z1=E+A$W$=bG8>s^m=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-p zrbbn>P~)iy)E2ANsU20jsWz_8Qh#?+k5JE1U!%TX{et>q4YG!XMxcgBqf}$J#u<$v z7REAV@mNCEa#jQDENhreVq3EL>`ZnA`x|yIdrVV9bE;;nW|3x{=5fsd4#u(I@HyF> zO3oq94bFQl11&!-vDRv>X03j$H`;pIzS?5#a_tuF>)P*iaGgM%ES>c_ZGSrVbqTsQ zx>34?y4!Wn>ORwB>v`!3^~&`Q>D|#s^=g_pF#!K2~{F^;XxcN!DEJEbDF7S8PxlSDOr*I-AS3sI8l=#CDr)-xT5$k15hA z^;2%zG3@;83hbKf2JJcaVfH2VZT8O{%p4LO);n}Nd~$Sk%yw*WynpMY;WWdk#HqvS zS7#e%p>v({H5aB!kjoO6c9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i z`%NyJ8_8Y6J?}yE@b_5aam?eLr<wa1-k|>3_cY?3<(WcA99m#z!&lx`C~KOXDpi070L*m z6)zM_qyQL(qUN<5P0omQ3hINdvaL;7fjPeygdGYL;pD|wL_lDQ-E zO;$wK-mK5raoH_7l$?~Dqf!lNmb5F^Ft;eTPi8AClMUo~=55LwlZVRpy-IHSJr>wyfLop*ExT zdYyk=%U1oZtGB+{Cfe4&-FJKQ4uc&PJKpb5^_C@dOYIJXG+^@gCvI%WcHh+yCNIG!kn}BcHo9&u+wQyQ04#Gj@ z!6)CQe0$?i=%LQT+{4Y^nSZzS2IeD{>VLHUv1Pz* z;P_y`V9&!@5AO~Mho1hF|I>%z(nrik)qf*KBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y= zdFykl=imL}`%BMQ{Mhgd`HRoLu6e2Ra__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmW zADJlpK>kqk(fVV@r_fLLKIeS?{4e)}^ZS4~B@qAs02y>eSaefwW^{L9a%BKPWEO8? zWgtmyVP|DhWnpA_ami&o0009hlac~Y0U(p&0xd&9WN%_+AXrUMAVY6*Wgs^$F)d>- zFfbrDIW9S4V`DUAWjQk}ATlsAGA}SQFEKPNF*G_bH##yhARr(hARr(hB0iHQ145H( z10Ivh1Syk@11^&R1U*(Dcx`YxLvm$dbZ>H0Z*OcpB0*$tVr3vuXm50Hb7*gHATl#9 zGax8UVPk1-bZ>KLDIy?vZE#IZI!SJGbYX5|Wl2OmB6w|ZE@^3GIyW{kMnN|=Mw31W z8I$(}JQO}4Ja}zzO-(vPWpZhDWn@NjZ*7xX2t1P;2s}kEJ|H|Va%5&YL}hbha%pgM zX>V>mAUrQ}WM(>2L`FU!JTG`Ucx`ZPWprUaAUr>KaA9L>Wpp5AZe%?oaw0!IrK2qe zliv^(e}zdzK~#9!%#z^_fFKBjx%YqRRw023XRWpP;ih~t;7;TWWWn-qd6|U1?%4`B zeis1r%mB192>|OO2javJfcVhgBQTWmfKC*b;sC%J60d>V_DrQ4fMhaDv_!AH0i!!i zp(dzbz;*o)piS~I`J!IZqLP~%hFfmQwA}W;8wKj1z$U-|w%h_bH1{Ob00000NkvXX Hu0mjf_p|6O literal 4492 zcmeHLd2AGA6rZIn#d63YiU@I>VyNKk9D7f8Dc!4G>DJmVS~SMa&U{nG?#0ZsyAVK- z!-9$zDk>sqhzf{DOf@P}6(S~h#H)#7MKr+^f*PYzS>McVx2@KriT>AZzWv^O-+RCB zz2EoVYo{CP>#E0>O)tYRY<#H3-vBcXqry}K-#d?A{}D{@pr()%3eCaBzyoNSiZK&N zI1E!>t^j!y*yvX4VN3>D*U`sxQ;9L(0`diUc{9lR8T$Sx7>sEYHXi1!Fj$b!fq54U z`KH`iFN3Uq#uz^}AnBHUb9E?OkF#cmHe0MzJu#1xnffF6W&R4 z)?U41Vd-59_HPgQ?mTv^;`wuD^fv9`o_Bup_0c(FZoClRYp&a9Za9{`(|hx@vp1bS zb)x6<6ElxKdH0sTq;C>L4HdVcwE0Q)jLFd28nI_OX*Im22C7xmE4qE8iY> z!Q)@JmuzV|^xRWNUft9D*n!3alL8-9eELxPqR(DBxQJZX^!c{lbvyQSK6AM3eqV<$ zX~D#c<_Ajxo0~7XYAG3>*6t;yxz4R$U-rhSHQ85ACf+>q#o7nX z*=YKX>imrvSDaqG?1Rqzx5ZyvIjVTu>bXyRMRl*b@A7wdhe@UQ$5_#M-QjRgkvYBU z%-r?WWt{pNiqPMz5FVb2-Q zdtaU`y@gSpF8{$h6~iV3-VTvitmmbD5lk*J(k=FV^c5Jwu1XX3Gh%4Ix+fy;rc zFH;0=sA#Poq6reomsAjLHCxRz8OX@(EHSSPcPpaAHTZ*h2zc@ki#099QB*peHm5D- zq|!n$E|-g+>N360N?3AJ2@$YJ=ADkySFlamQt$K<2QHqAp2u#flo7f*%5 z1^9%TX94)2GJJ|+%rq5`Qv)qjEzk}id54CyP$NrIh-yG;vP}_CpdBT&^1%=ds6VEE z0RifR0Q4FxxS(^=BF9q(E5QCBZ$+V?mugdDhK?vuD2C$Tl?nkegY-37`U}tW9fOa7 zk-%{U{2}8oltC*T=KM*aO+Pf`_YkmR7G;rh*qLCJ!$JG3J}bind|sD>_S*awi^FO0 z(pA9$=AneD@d*L-naf}vGEea3sFQ5fVfq zP@W*kDF}9}jdV(qle99dh2&iVPud(#hs6@L(=MysfYQ0=s_H`?f;H#Bjg|TsuSrQI z?jdUBL|dj`H6q7RqsHq*F?N^BX<=QA&Cbv^o26grN~EZer8=h3SdAS~;DUh2L$=9r zz6DXKM2oSZUj+xj0GYg=+<pDDoQb=QRYU6}oq% zuY1p>X^t+C#)XrjEG_*fZN1`fckY^NWEIX|YAof-un{fEJ>?!_vQd9HZd4M-3%L+f zz8#5%pMaIy5*G7`76dIPpQ3&1@(`)u6loC&G)vlOmksXEE|PF*QPNJ^cwTae5-qWV z(bc4+rFjKawE&O66_k+idkwEJZt#-9+UdnezaAirWEhfR|40~>517&$O<%-r>d&0y zY4RgQhJb@gGH%eJYEa~y_?IYl zJh?UK#L(EOLTAt4rQSpT$4@>-{>KvldgPE{@jF7-2wlTsU|7l{*)>AfuoxJY@?x;39DwT e4fdA0X81A8J}1({IlcD)G8PKd`S*I8Z~Pr_eC@&j diff --git a/assets/dolphin/external/Credits_128x64/frame_4.png b/assets/icons/Update/Updating_Logo_62x15.png similarity index 56% rename from assets/dolphin/external/Credits_128x64/frame_4.png rename to assets/icons/Update/Updating_Logo_62x15.png index 926ec78053b5ad840cd920e502a0e70e10018d5e..50a749368ca4bed2d586ab1cff4cab1dd19574b9 100644 GIT binary patch delta 1479 zcmZuwYfuwc7~RDL0tKOHQ4l0WKtUIFH=FEkL>`(5iy9Fq4;`v`>|$yHf>Bej2Js2C zYG;K(rGu?v6%dv9D8l%t3Kg+6rRt!qGN@F6B2G)|o8BOd{&07`J?H!Gch5aL_ui+I zTLLXb3948(7atc0g4~!mMIyjR5bh#J@NN8a&0GN2*ffS?m{3Rr63__?AQ&)vA3V(6 z0e65$L8Aa}0^td`y~iFtuy6>s0zP4w?*x1b=&{%v?2|Cq0dfOa4gv>!EWj!d`ps_^ zI|I1=5e>Zt;LZ7#b!azrEU+(KzxV&F` zth=MLrh0v~ShTi)nofnBjw>3R%ihd}&Tw9!R z#KYq}l=tC|U2H3p=y~Q|&qVmlolEA@!TPA!irv=n77vf2%w6hR7bje7+jH{#=M_|I zab5fxRRs5|u*ko@*8H-mzN7A(A5Z z2cgUE@MqDTZKzKefU~KY&ncgzZ@$UU;akjO;H%Ik856TU>AG+>qE&S2a z9T`zi{a;%8ZnVr-nVD~?YtK3<|4Gp|!>%2qfBx^-JwjE`Az5B|>Sc)>{hP@kXdAc$r|J;Mo=s&uj4)n&y?4B9v-dJHH*>&d^?ajQ}bGUwco0E86Mo@Oa`dLek zN4NJxKJLqU{MTK{)z@nw;hx<5=^Ji?T^y~`C#RXxtX78{m`@gj@__<$6l>P=>jdLO z0J(514CQkK8v->_QbMa)3ek~j8X-tphR`&PA{@?P7*0tzja15e3;ie2G^M3*nnQ4% zRD%!_LWZa%It{`R9FFPKIvK0w7YU~X>L^MhVKp?usbxTr(~<}!#ngz5)esb>lgUUH zyx5sSrd zhtuB~1~Po8-&VsAViE z({h+pjY;`TC*>FdK|vEWB8=OG&pJ)Bh$Ds!eX@ehot13_c1@9Xm*R+A9Vd@53}5s`@S_pD^?c8V5R zN(vu2gS+RbnG>t9UqT3aHmkt`zo*k_JPc_H6Nf6mXy_ zwKpu|VpaaXt{q=_Te$suf^?e}^j1agtF^j3U)g#i?)zJks1~d3_4Ts67vGh&uaeGZ zvdNOZ%hBnv4u@*euY}y+A5q<8x?LQl!n=yU*jS@#3QR2*ngbsCwHICP?|C>_c|F{- z|7Q9P@8C)PvlDZUY#At YKfanRa9!yM?hOPnN|mB^=90qy0Yn1!ApigX delta 1968 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 diff --git a/assets/slideshow/xfwfirstboot/frame_05.png b/assets/slideshow/firstboot/frame_05.png similarity index 59% rename from assets/slideshow/xfwfirstboot/frame_05.png rename to assets/slideshow/firstboot/frame_05.png index aeb0c2ebf82feb7083fe1ce5651c6494bfdbb436..fdb1604ae68ba1a33fa99a8d6c54ee45c047dfad 100644 GIT binary patch delta 1749 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 B_1ORb diff --git a/assets/slideshow/xfwfirstboot/frame_06.png b/assets/slideshow/firstboot/frame_06.png similarity index 60% rename from assets/slideshow/xfwfirstboot/frame_06.png rename to assets/slideshow/firstboot/frame_06.png index 9966385fb5191a46dd584514d14c01ca867e6d56..76ae4cdda0e024ba66ec9629c1435a081cfa5861 100644 GIT binary patch delta 1926 zcmY+Fc~p~E8pgkb1OgU_64{Jw6*OS*BMI;&vV@(m1duecl(HpZ6G3rd8At#DNmbAQ z1;hr_2*c(eK?KplfP*3+yDe+Pu^m7_Lc0fEs-J(_I*z-g+ccGtiVw zfdfDig$9ynBuI~BMkB*ah8sYX|JBlV(xhlG3~umTl!Jpe!@)r>{$w04>KGRQ63bFA zTf27B@sEOiod$&&{JoAeP8Cz#(FxzAC0PyMI>TeTdvQuc<(pvhdBlSNx=27<3zp?EsQ@ z=9h4L8AouUx>JvBq)grsoPVVH<%)RhN>N{dXvSujem2u3p=qIpX z_-IiJlbnH4Z$K#;;8;HPS{7l_`I~;OgK3l9wy!@Ko+SL+IQ?=sVs~VIknOte#?n}i z7c-Gj0r3Yu&O*9h)1R9TR8jla8eUSE0vS18(!5bf16LWzbrPpM!RJ`nY^#Kj(*8;X ze8+iw>$RI*slAPAn|RQYo8A#v9?`c@*OE7^pywH67$?Yd2$9l%S+H4NI=;L(L+<;W z2B5E=OgVgRLLLBAZK7Cyr~EuUXyI|OrlFk1LS!UDL_`^jHswIkQB>=`P#zQtlEN&A zRETUwq(GcdB9%*}5J{mRk4hy|xI7+5WRCV0{fM?wwFIeV<`y7@OtBlNyBxl87Ye|58#gF&Oog zX}J&ZT*`;JyEp<{+q?WhrAV}a)#3jKiQjD?ce3=eA^^yZFdXeziQ|hw6DPa$Fm+m6 zTR$v1L`+-&Zi@78yNG(B#!p&rC z?0KW=G?uER-|1BCR-dFUUH;#_rcwd-$jqJ!T0rN1)!1Eq){!d(qvu5Iv{ydAKH2ju z#Zy+r@$pLVSV0Zey$H@DR9pojCGT-w;(((AnDVUsM}E=Sc+4KoRsTkM0=g3IKE^ao z;CDv_J(Z=rRlz6_g`?c%S8bGy8*@)QWWKkOy35)Rw&p!WEm^EL&heQI`@vmy2z>w% zmxVu=c&1*w^LjSW*4x=E)$nake{s$5*-j*u8Pa}iM@JpoV9PGRUs*S#bIvXRA(dqT z_<39J`+0$EdSlK3!n^XK?56dxHEpYR{y*I96J6`B>6XpRoCqF>d{ejB+@D@Ysgpgi zT|$kymsDMl8r64H^5+MwUXHH~Ni(n`?*FXY6H@dZaVBUgMl0l*P7YfqOYNQj>-x-j zQJ&<57*f%n&t#aWLR!eu`Hh#XI%AV4`qnEc#SgT!H>FsQU}eYY1)b;9r?fxkX@3$@20VKj~ZV zb(lM^UELd3{M27y`KVJT;`muf2$6m*;u3+*R#}oAV7R+v3t1D_(TQ&VHFWN?aq+%` zIvki@Fq8+B{oGPn*Iqx&F_z#sSJ-m}V{W~@_ZFdb368cCS22@f?@+Ax)$N%$ApS9_~`^nM3{3ijEJ_ zpIrM~)=OKZVzK{pg1s#0yXLztsS!TUFH4;B4f83%;aX6|0uiSZ+bF$QT))C^6DL=^ zJWUjfHfiaPlQd5>L6>kM$wduB=5>L<6@|vj&(P1R%^plhgg+(#U^p=y>+M4_eg|3g B5sm-= delta 1731 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 delta 1034 zcmV+l1oiuaCzJ?~8Gix*003RI=qLaH010qNS#tmY4#NNd4#NS*Z>VGd00YKJL_t(| z+U=bEa^fHmz{!W^I%6l-+R;((=6r*D0pI_%a;ednA+RivEXx6ZbSjNN_Q$dxKt-2J z&?2%3tVQ-Lx7#fPpe{vGNH7=y5VR%8+(%Xh06;Gh;vRL~m4BiL40@!Z1gRG|# zw{6zlyah4Be1DdpF}2_u(DDQTxS>pp@Hp!i$m%$?kaQrn_{gPH9mWHU9sqs-H0iwF zq98~6P;ScixB3%aK$s`VW{FV=f&s8?!Kzu{;a(!55KPo@?%IXX0A)7OGsUQUzMSo! zti6|D>k|e506Ut>IKUmiBw0_knWKx~SOWka^BG1p@qaSO03ajNBmj(+Rc{BD0{}M_ zB>-o+n^&Q`611XO3V_j_Z<_vZ%&fK*x6b=&~R(#7+3s-k|8FG{5bRL^>2c0Eb}4n3N+WSr5a z`TLT7(|=&rpLs%eVF1Joocr4CcJOMZbP#mujq*FiAr9{c z-x0G~@uz2`Gk^f9u-5$soevQ9IvjDiUa!NO{=S#X<Z{h+#xAGtXAnRiRfWKemvm+$%FqPt) ze}9C(4g=unBk6uh@>S;j?@4P=b?_0nQ7x2n+4w&2w>U6>)fD&>#$cdq01^OFfdBwJ z1BF#LGc3Fy;3M7!NNXZn8?e#<6zd8;4zRKTQ3J^P0Wqa0G5}Hl*uy6HL+V-FR*tyR z_3TXlPQ?rW<9B8NIsiJ+VUEaU0KNd=sDIOVb{Yl1HtmB9fPE4hX=#9!bd;;%vH)n# zS~Ic%__PlO04Az1Hu%4JK|UIQ5vy%tgDrry;s75T;2_p`HDFx;_?ZrW3uB_)a;ua! zfHW5b%gYLY(f0ZSh%pap&W7efpNq}_7+}sK2wVOE;jl-5l%Oa800000NkvXXt^-0~ Ef&$3j{Qv*} diff --git a/assets/slideshow/xfwfirstboot/frame_00.png b/assets/slideshow/xfwfirstboot/frame_00.png deleted file mode 100644 index 3dee7c7e03bc1fa94d5895d6088f5da5a650430c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6224 zcmeHLc~leGvu-dVi!37U1Y=MTFbg4sBoKs2*p#pa1xA!krz259A_*j@U}O_f5p@(5 z7sMHcQ2}LB1Q!ZhSeC&is4j8XEj~NI&yT*(kH{^meG4X+oyqTlTW;fx$>l~(%0h_zwDtg zfD67*b&lw}ZI|;lbf87etYgwevw!L_+LAu@;X$u=sL71gbgjF$rjOeCR;b@&*Xww^ zOu282=d5yPU^xK}$F zUt8nvVliWyeTuZ+=jcE-HmyY4CD&kG(h9UEek|Th*CTbu$(~^GAaw3o&x13k6Ha3^ z;}jPzQY|jJZy#T-jpI5{U(}Uv+FdSF+&DwJ{>%e79Fcj5ZW2iYtDDE~-J6m|h@c4A^gHq=Q zZuwRwS2p0wmJBwh9J<~--7V#s-z=+;=EfXX2ez@l?a{xIj?`K9;aY-AS~^D_5~j|2 zwI9yEwG*4JV$Gcyi#K)kb&Yjh z8rzi9^{0NaQDi=*c+m&|==~@_3M`QANryy2JjfGqVZ2-@Mk)^g9G1$(AhaHqVz}^H zK?DQ)viu4bBj7QxD{a|CwwMWr3EVeE!u}h*IMBxR5RHdj>Zt7?ry~GDSPEj~!te+Q zUCzL&aOudsQcS>NR4UT-3~V6V2g4La!Wc51j3?q; z7$qji6-7xISS&J*`Q)Ea%w~UvkC1$10pWun2gL+yJdq$2627#MNL`{4kdF@iM+*rD z=~IFqED=RTLa<9T93eIR5`qVPwiic5hO5HiK?FD)79y$=WLE31rgZaQ`+T-gQm|Ga z6sxQdvcJ-l3i$t!^_6eR5mh)}I)a#g#{EkBQ|u~bM2pR)vqVso(mf9r1FM{$&J#fb z9$j@y;eilH;gfJ=K1jilA&7#bS=;e&HZ~L*1i~~b3_@Q(c|=I0U<3p!p%8Gq0Koyt zFqg}taB(oqgK=aM-xf#Z+JZP+8lMaCKt6>=Ufuh(zFwvIG z#o5tdF5;3MgahrYi8vnLhDxP?6k8sbrh?)@bXQTN5Jb``5Q1xAf;eKWYCuUi-Py;3 zfhFOI|44koK`9?GU|>B35mEAg1~>vC>@NkCY+6&OMC7m|k!@_P?T8Z-sqj|7krJd5 zm6+B2F=M51s8RtbSoT7Dj8BkjZkr63EG z!U!mlWJ4#~&`DH|wKd(AL?@E1h}LxC7y2TefFJX}X)But<1mqOcYy?%KSm{*=qP`9 z!^G3XW4J)oN*Ii)Dd-?H5rPDah9{DRU`-4`VPM2s7+F0&mg^_E;6Idt4T%eZR0maYO=P&QEjOpjz=c)xMT{=ng&mh_ZeLx;!9;f2)a)AvzG0%i^b`IuQOx+9wpgSVs|RCS=I^j4bzr&+Gk1&JdFS z&EsRa{hL!@FyANnCVs!u^_{M7V&I#UzgO3Hy1t2lZ&LnVUH@-%Y5%ihgd>nYdNO1` zczgB(0YW z%l%|`3yUzSTF(`y{w+m!N2U2LA^b(CM~R)>>!Pfo14*FSItFbX(cq%3QSt4f0d^=2Dx#Lo1=IPzpOwh zkKCQ(^yEfrI5WSgw)E+mp5iFml{v9k4tGI;9S~oy!QV5ZuJ3Jlz3IPD3xctpl$h~4%XgxA*>noVBwg9 z@6zaq@q`{b?W~wId11mE`xbIA`p~3br`K86Y;ch27MKtJHoUp5{ID^(^UO=Ue(+LT z5MwoP_0o#>p_P=2y8|+&jHV1dlm%03M>z~>wm!Nje#EqUMOXA`lj68_KaGq8U)K$C zU$9_K0aWDicuh!%8sKy|$0s0wnUV3Xu)#QkXk`<2E4A9KVX-T=-0L#XaN*P`jECVV zgR|lGs|||or5zQ#Q|pxN=Y(g(=iHoWfeQ5y?OiA#;<#BJ8>Z>zPSq@PQag@KxR^h# zqo|)1dUv2S@#^EAJ$M^wTl^b`HP}gb^>j2VVdI>G=eMJB(Cv#RZJw%Q8e)E0xAqpQ z)u^;>Gfeg)Mx|2z(rSuGt;+A2-#V6=rSPnGg&c*Rijv1$?W&V2)?}E8%yw&s^lK{Uou$tU zPBl`uWcBN(L&l_$9kq7hH-7FaV78|M=|fj`8RYLsZ>kdn()nqWcmY(kt{#eOHyO9I z3}k8CtNJ6@C@WRn@^yx@PwXyw_T{Lw0d?;~a~kQ7Yt7guAwQborFj91CArUZI{re- zn@Ypd8#6smsQ-S79MhNIbKDZZhYNg-e2kK2`osOQ`#RF6p`C~8I#Tu1;W@mZJ2hkY zv8|;?i}KM-bFVD++bM64z6c1I@i0bDa9I0LYTW4ZmXMX#=BQ)Las=8@AxvK*0BHO{ z5tg-{9u~T(t7jQt6l&QzoYWt4%x-Xz6{>#Q6O!>juYokozjs=7V_|slirXhFi*}}F zE6D7=XHD4nWyg+I;DZw|%-wDovVx~3>^v;M5{qcHf)WsGz3JI+!=lBKOQM8SKuEBcpE94Kp)W1iAqa z2M#6MUFfZ6qWsH6_O0Ee8kq-Der=#@&A$he=iU@HUY#r~s8bIMt_j|{ zkfdf=zVFGpvke=oDR(TFX(_x1;nTS6=RK_Um{E;Aec0Nk-Bxq$2TA&&%Qf>03NnX# zd!Y+uWkF7;Od3Gq^bZ@o@-fpg?Hwx`IR7j^pg1xvuA90N`C8KnX@}5~FL|RDJZI|t zcmOs)sqJ@mHn=)6a=vX?PhUUd)V_Nis2`&Ir{)7smN6XPR$I2Vww^65<=;NBY11Z7 z$H<1kl+p&*j42kV6MDrvd=%&VS}QBJZuqskySwVqqhD^N-`IAxP`8dwYLgz;$TqHO zXwVuM7`Xc84aFFZuB@$1F3ITV>Pp(NV@Hzl)>ibNR`Y>1i<*MLy59?Zvd;*D~tXVN({NsFpkHAOLv#_N`)UES73-58WJn z|32~c>nQoAO$iM=_1>Y`$BrEZ}|R<^e4 zXS6(hY7rh0Q8hNk2p0+~dwWk7n&EUTpA6XiY!58lm{!6eIvPzKEPtgVyU8+5)YsR) z*@_j87kVv#@`8Bq2hR`Z6=nKHq6E!u?FDxfzQ%Qp)s>b=TCX!Qe;IP5Ze5~L^kFQq zX|Wgj7^dxS^@9109kXYcH$O`DO?ekX%&Q1Dsak0?Sn_^SU}Bk}UUJnDpIGf6~2RCwC$oPln{AP9#0{ttaywq!|X6n+#HxuEl>Ng_xpONlH4$a0^oU`-|L3{M3O`7XC!5hD9>BrXn#igO#lStmH#W1UAtPN zxBQMax?A^ZjG_MO^uq&}tspk=h0Q8ZX;e{1)x{Xw7G^S^6n0F-V-L7H(|BeG}O zZjE?P0CxF6;e7yYglI}dpWg$aHvl_)i6f!_Wc`$80k0)MTDx0DMrNs9>wh=^P7kS0 zlMFfZPBeo;n)#S+j@IyCbgm*8yOS)sdKgB$v<= z^AiAr=RX2~rhF|8EyeLYnL+{(Xa+#P+mpc~0F&cq4<7*CvFq8=uqIU>Xi@O^fMobARWuf( zSVr5;^?yhD0Hd{jUPY+h07UU6p7%MiNKpWqeM6TE#1FW={x2i|sbcPkso?UoC}Ei6 z`-H6rXaPVNk^q_&07UK;R|o*ua<<>!2k-*m->*(IvSyux0#_O%W|eKeGEq035} z(dlkR7#IzJbelmdYU6h00W5wC0oVw@jDnEW^?(F`01yCcJ-{dsQe`j!*iaWI9T2f7 zX4LrBVw2Ei;U0$#b{q_;^?PJ=ASaGSb{oSU4DkeD< #include #include -#include -#include +#include +#include void flipper_migrate_files() { Storage* storage = furi_record_open(RECORD_STORAGE); @@ -51,44 +51,49 @@ void flipper_migrate_files() { // Revert cringe FURI_LOG_I(TAG, "Migrate: Remove unused files"); storage_common_remove(storage, INT_PATH(".passport.settings")); - storage_common_remove(storage, INT_PATH(".region_data")); - // Migrate files (use copy+remove to not overwrite dst but still delete src) - FURI_LOG_I(TAG, "Migrate: Renames on external"); - storage_common_copy(storage, ARCHIVE_FAV_OLD_PATH, ARCHIVE_FAV_PATH); - storage_common_remove(storage, ARCHIVE_FAV_OLD_PATH); - storage_common_copy(storage, DESKTOP_KEYBINDS_OLD_PATH, DESKTOP_KEYBINDS_PATH); - storage_common_remove(storage, DESKTOP_KEYBINDS_OLD_PATH); - // Int -> Ext - FURI_LOG_I(TAG, "Migrate: Internal to External"); - storage_common_copy(storage, BT_SETTINGS_OLD_PATH, BT_SETTINGS_PATH); - storage_common_remove(storage, BT_SETTINGS_OLD_PATH); - storage_common_copy(storage, DOLPHIN_STATE_OLD_PATH, DOLPHIN_STATE_PATH); - storage_common_remove(storage, DOLPHIN_STATE_OLD_PATH); - storage_common_copy(storage, POWER_SETTINGS_OLD_PATH, POWER_SETTINGS_PATH); - storage_common_remove(storage, POWER_SETTINGS_OLD_PATH); - storage_common_copy(storage, BT_KEYS_STORAGE_OLD_PATH, BT_KEYS_STORAGE_PATH); - storage_common_remove(storage, BT_KEYS_STORAGE_OLD_PATH); - storage_common_copy(storage, EXPANSION_SETTINGS_OLD_PATH, EXPANSION_SETTINGS_PATH); - storage_common_remove(storage, EXPANSION_SETTINGS_OLD_PATH); - // storage_common_copy(storage, NOTIFICATION_SETTINGS_OLD_PATH, NOTIFICATION_SETTINGS_PATH); // Not compatible anyway - storage_common_remove(storage, NOTIFICATION_SETTINGS_OLD_PATH); - // Ext -> Int - FURI_LOG_I(TAG, "Migrate: External to Internal"); - storage_common_copy(storage, DESKTOP_SETTINGS_OLD_PATH, DESKTOP_SETTINGS_PATH); - storage_common_remove(storage, DESKTOP_SETTINGS_OLD_PATH); + // Migrate files + FURI_LOG_I(TAG, "Migrate: Rename old paths"); + const struct { + const char* src; + const char* dst; + bool delete; + } renames[] = { + // Renames on ext + {CFG_PATH("favorites.txt"), ARCHIVE_FAV_PATH, true}, // Adapt to OFW/UL + {CFG_PATH(".desktop.keybinds"), DESKTOP_KEYBINDS_PATH, true}, // Old naming + {CFG_PATH("xtreme_menu.txt"), MAINMENU_APPS_PATH, false}, // Keep both + {CFG_PATH("xtreme_settings.txt"), MOMENTUM_SETTINGS_PATH, false}, // Keep both + // Int -> Ext + {INT_PATH(".bt.settings"), BT_SETTINGS_PATH, true}, + {INT_PATH(".dolphin.state"), DOLPHIN_STATE_PATH, true}, + {INT_PATH(".power.settings"), POWER_SETTINGS_PATH, true}, + {INT_PATH(".bt.keys"), BT_KEYS_STORAGE_PATH, true}, + {INT_PATH(".expansion.settings"), EXPANSION_SETTINGS_PATH, true}, + {INT_PATH(".notification.settings"), NOTIFICATION_SETTINGS_PATH, true}, + // Ext -> Int + {CFG_PATH("desktop.settings"), DESKTOP_SETTINGS_PATH, true}, + }; + for(size_t i = 0; i < COUNT_OF(renames); ++i) { + // Use copy+remove to not overwrite dst but still delete src + storage_common_copy(storage, renames[i].src, renames[i].dst); + if(renames[i].delete) { + storage_common_remove(storage, renames[i].src); + } + } // Special care for U2F FURI_LOG_I(TAG, "Migrate: U2F"); FileInfo file_info; - if(storage_common_stat(storage, U2F_CNT_OLD_FILE, &file_info) == FSE_OK && + if(storage_common_stat(storage, INT_PATH(".cnt.u2f"), &file_info) == FSE_OK && file_info.size > 200) { // Is on Int and has content - storage_common_rename(storage, U2F_CNT_OLD_FILE, U2F_CNT_FILE); // Int -> Ext + storage_common_rename(storage, INT_PATH(".cnt.u2f"), U2F_CNT_FILE); // Int -> Ext } - storage_common_copy(storage, U2F_KEY_OLD_FILE, U2F_KEY_FILE); // Ext -> Int + storage_common_copy(storage, U2F_DATA_FOLDER "key.u2f", U2F_KEY_FILE); // Ext -> Int + // Asset packs migrate, merges together FURI_LOG_I(TAG, "Migrate: Asset Packs"); - storage_common_migrate(storage, XTREME_ASSETS_OLD_PATH, XTREME_ASSETS_PATH); + storage_common_migrate(storage, EXT_PATH("dolphin_custom"), ASSET_PACKS_PATH); furi_record_close(RECORD_STORAGE); } @@ -98,7 +103,7 @@ static void flipper_boot_status(Canvas* canvas, const char* text) { canvas_reset(canvas); canvas_draw_str_aligned(canvas, 64, 40, AlignCenter, AlignCenter, text); canvas_set_font(canvas, FontPrimary); - canvas_draw_str_aligned(canvas, 64, 24, AlignCenter, AlignCenter, "Xtreme is Booting"); + canvas_draw_str_aligned(canvas, 64, 24, AlignCenter, AlignCenter, "Momentum is Booting"); canvas_commit(canvas); } #endif @@ -138,12 +143,12 @@ void flipper_init() { flipper_boot_status(canvas, "Starting Namespoof"); namespoof_init(); - flipper_boot_status(canvas, "Loading Xtreme Settings"); - xtreme_settings_load(); + flipper_boot_status(canvas, "Loading Momentum Settings"); + momentum_settings_load(); furi_hal_light_sequence("rgb RB"); - flipper_boot_status(canvas, "Loading Xtreme Assets"); - xtreme_assets_init(); + flipper_boot_status(canvas, "Loading Asset Packs"); + asset_packs_init(); } else { FURI_LOG_I(TAG, "Special boot, skipping optional components"); } diff --git a/lib/SConscript b/lib/SConscript index 8bd714637..84247d53c 100644 --- a/lib/SConscript +++ b/lib/SConscript @@ -42,7 +42,7 @@ libs = env.BuildModules( "mjs", "nanopb", "update_util", - "xtreme", + "momentum", "heatshrink", "ble_profile", "bit_lib", diff --git a/lib/xtreme/SConscript b/lib/momentum/SConscript similarity index 81% rename from lib/xtreme/SConscript rename to lib/momentum/SConscript index cbbab2f3f..19b880412 100644 --- a/lib/xtreme/SConscript +++ b/lib/momentum/SConscript @@ -3,14 +3,14 @@ Import("env") env.Append( SDK_HEADERS=[ File("../../icons/assets_icons.h"), - File("xtreme.h"), + File("momentum.h"), ], LINT_SOURCES=[ Dir("."), ], ) -libenv = env.Clone(FW_LIB_NAME="xtreme") +libenv = env.Clone(FW_LIB_NAME="momentum") libenv.ApplyLibFlags() sources = libenv.GlobRecursive("*.c") diff --git a/lib/xtreme/assets.c b/lib/momentum/assets.c similarity index 86% rename from lib/xtreme/assets.c rename to lib/momentum/assets.c index f566d3b74..f17104780 100644 --- a/lib/xtreme/assets.c +++ b/lib/momentum/assets.c @@ -1,27 +1,26 @@ -#include "xtreme.h" +#include "momentum.h" #include #include #include #include #include -#define TAG "XtremeAssets" +#define TAG "AssetPacks" -#define ICONS_FMT XTREME_ASSETS_PATH "/%s/Icons/%s" -#define FONTS_FMT XTREME_ASSETS_PATH "/%s/Fonts/%s.u8f" +#define ICONS_FMT ASSET_PACKS_PATH "/%s/Icons/%s" +#define FONTS_FMT ASSET_PACKS_PATH "/%s/Fonts/%s.u8f" // See lib/u8g2/u8g2_font.c #define U8G2_FONT_DATA_STRUCT_SIZE 23 -XtremeAssets xtreme_assets = { - .is_nsfw = false, +AssetPacks asset_packs = { .fonts = {NULL}, .font_params = {NULL}, }; static void load_icon_animated(const Icon* replace, const char* name, FuriString* path, File* file) { - const char* pack = xtreme_settings.asset_pack; + const char* pack = momentum_settings.asset_pack; furi_string_printf(path, ICONS_FMT "/meta", pack, name); if(storage_file_open(file, furi_string_get_cstr(path), FSAM_READ, FSOM_OPEN_EXISTING)) { int32_t icon_width, icon_height, frame_rate, frame_count; @@ -72,7 +71,7 @@ static void } static void load_icon_static(const Icon* replace, const char* name, FuriString* path, File* file) { - furi_string_printf(path, ICONS_FMT ".bmx", xtreme_settings.asset_pack, name); + furi_string_printf(path, ICONS_FMT ".bmx", momentum_settings.asset_pack, name); if(storage_file_open(file, furi_string_get_cstr(path), FSAM_READ, FSOM_OPEN_EXISTING)) { uint64_t size = storage_file_size(file) - 8; uint8_t* frame = malloc(size); @@ -113,20 +112,20 @@ static void free_icon(const Icon* icon) { } static void load_font(Font font, const char* name, FuriString* path, File* file) { - furi_string_printf(path, FONTS_FMT, xtreme_settings.asset_pack, name); + furi_string_printf(path, FONTS_FMT, momentum_settings.asset_pack, name); if(storage_file_open(file, furi_string_get_cstr(path), FSAM_READ, FSOM_OPEN_EXISTING)) { uint64_t size = storage_file_size(file); uint8_t* swap = malloc(size); if(size > U8G2_FONT_DATA_STRUCT_SIZE && storage_file_read(file, swap, size) == size) { - xtreme_assets.fonts[font] = swap; + asset_packs.fonts[font] = swap; CanvasFontParameters* params = malloc(sizeof(CanvasFontParameters)); // See lib/u8g2/u8g2_font.c params->leading_default = swap[10]; // max_char_height params->leading_min = params->leading_default - 2; // good enough params->height = MAX((int8_t)swap[15], 0); // ascent_para params->descender = MAX((int8_t)swap[16], 0); // descent_para - xtreme_assets.font_params[font] = params; + asset_packs.font_params[font] = params; } else { free(swap); } @@ -135,10 +134,10 @@ static void load_font(Font font, const char* name, FuriString* path, File* file) } static void free_font(Font font) { - free(xtreme_assets.fonts[font]); - xtreme_assets.fonts[font] = NULL; - free(xtreme_assets.font_params[font]); - xtreme_assets.font_params[font] = NULL; + free(asset_packs.fonts[font]); + asset_packs.fonts[font] = NULL; + free(asset_packs.font_params[font]); + asset_packs.font_params[font] = NULL; } static const char* font_names[] = { @@ -149,15 +148,14 @@ static const char* font_names[] = { [FontBatteryPercent] = "BatteryPercent", }; -void xtreme_assets_init() { - const char* pack = xtreme_settings.asset_pack; - xtreme_assets.is_nsfw = !strncmp(pack, "NSFW", strlen("NSFW")); +void asset_packs_init() { + const char* pack = momentum_settings.asset_pack; if(pack[0] == '\0') return; Storage* storage = furi_record_open(RECORD_STORAGE); FuriString* p = furi_string_alloc(); FileInfo info; - furi_string_printf(p, XTREME_ASSETS_PATH "/%s", pack); + furi_string_printf(p, ASSET_PACKS_PATH "/%s", pack); if(storage_common_stat(storage, furi_string_get_cstr(p), &info) == FSE_OK && info.flags & FSF_DIRECTORY) { File* f = storage_file_alloc(storage); @@ -182,7 +180,7 @@ void xtreme_assets_init() { furi_record_close(RECORD_STORAGE); } -void xtreme_assets_free() { +void asset_packs_free() { for(size_t i = 0; i < ICON_PATHS_COUNT; i++) { if(ICON_PATHS[i].icon->original != NULL) { free_icon(ICON_PATHS[i].icon); @@ -190,7 +188,7 @@ void xtreme_assets_free() { } for(Font font = 0; font < FontTotalNumber; font++) { - if(xtreme_assets.fonts[font] != NULL) { + if(asset_packs.fonts[font] != NULL) { free_font(font); } } diff --git a/lib/xtreme/xtreme.h b/lib/momentum/momentum.h similarity index 76% rename from lib/xtreme/xtreme.h rename to lib/momentum/momentum.h index 512b393cd..de5c21ae0 100644 --- a/lib/xtreme/xtreme.h +++ b/lib/momentum/momentum.h @@ -9,12 +9,10 @@ extern "C" { #endif -#define XTREME_SETTINGS_PATH CFG_PATH("xtreme_settings.txt") -#define XTREME_ASSETS_OLD_PATH EXT_PATH("dolphin_custom") -#define XTREME_ASSETS_PATH EXT_PATH("asset_packs") -#define XTREME_MENU_OLD_PATH CFG_PATH("xtreme_apps.txt") -#define XTREME_MENU_PATH CFG_PATH("xtreme_menu.txt") -#define XTREME_ASSETS_PACK_NAME_LEN 32 +#define MOMENTUM_SETTINGS_PATH CFG_PATH("momentum_settings.txt") +#define ASSET_PACKS_PATH EXT_PATH("asset_packs") +#define MAINMENU_APPS_PATH CFG_PATH("mainmenu_apps.txt") +#define ASSET_PACKS_NAME_LEN 32 typedef enum { BatteryIconOff, @@ -51,11 +49,10 @@ _Static_assert(sizeof(SpiHandle) == sizeof(uint8_t), "enum too big, fix load/sav _Static_assert(sizeof(FuriHalSerialId) == sizeof(uint8_t), "enum too big, fix load/save"); typedef struct { - char asset_pack[XTREME_ASSETS_PACK_NAME_LEN]; + char asset_pack[ASSET_PACKS_NAME_LEN]; uint32_t anim_speed; int32_t cycle_anims; bool unlock_anims; - bool credits_anim; MenuStyle menu_style; bool lock_on_boot; bool bad_pins_format; @@ -88,21 +85,20 @@ typedef struct { FuriHalSerialId uart_nmea_channel; FuriHalSerialId uart_general_channel; bool file_naming_prefix_after; -} XtremeSettings; +} MomentumSettings; typedef struct { - bool is_nsfw; // TODO: replace with packs text support uint8_t* fonts[FontTotalNumber]; CanvasFontParameters* font_params[FontTotalNumber]; -} XtremeAssets; +} AssetPacks; -void xtreme_settings_load(); -void xtreme_settings_save(); -extern XtremeSettings xtreme_settings; +void momentum_settings_load(); +void momentum_settings_save(); +extern MomentumSettings momentum_settings; -void xtreme_assets_init(); -void xtreme_assets_free(); -extern XtremeAssets xtreme_assets; +void asset_packs_init(); +void asset_packs_free(); +extern AssetPacks asset_packs; #ifdef __cplusplus } diff --git a/lib/xtreme/namespoof.c b/lib/momentum/namespoof.c similarity index 100% rename from lib/xtreme/namespoof.c rename to lib/momentum/namespoof.c diff --git a/lib/xtreme/namespoof.h b/lib/momentum/namespoof.h similarity index 100% rename from lib/xtreme/namespoof.h rename to lib/momentum/namespoof.h diff --git a/lib/xtreme/settings.c b/lib/momentum/settings.c similarity index 79% rename from lib/xtreme/settings.c rename to lib/momentum/settings.c index 623ef2ff9..375bafc5d 100644 --- a/lib/xtreme/settings.c +++ b/lib/momentum/settings.c @@ -1,17 +1,16 @@ -#include "xtreme.h" +#include "momentum.h" #include #include #include -#define TAG "XtremeSettings" +#define TAG "MomentumSettings" -XtremeSettings xtreme_settings = { +MomentumSettings momentum_settings = { .asset_pack = "", // Default .anim_speed = 100, // 100% .cycle_anims = 0, // Meta.txt .unlock_anims = false, // OFF - .credits_anim = true, // ON - .menu_style = MenuStyleWii, // Wii + .menu_style = MenuStyleDsi, // DSi .lock_on_boot = false, // OFF .bad_pins_format = false, // OFF .allow_locked_rpc_commands = false, // OFF @@ -46,15 +45,15 @@ XtremeSettings xtreme_settings = { }; typedef enum { - xtreme_settings_type_str, - xtreme_settings_type_int, - xtreme_settings_type_uint, - xtreme_settings_type_enum, - xtreme_settings_type_bool, -} xtreme_settings_type; + momentum_settings_type_str, + momentum_settings_type_int, + momentum_settings_type_uint, + momentum_settings_type_enum, + momentum_settings_type_bool, +} momentum_settings_type; static const struct { - xtreme_settings_type type; + momentum_settings_type type; const char* key; void* val; union { @@ -70,18 +69,17 @@ static const struct { uint8_t e_cnt; }; #define clamp(t, min, max) .t##_min = min, .t##_max = max -#define setting(t, n) .type = xtreme_settings_type##t, .key = #n, .val = &xtreme_settings.n -#define setting_str(n) setting(_str, n), .str_len = sizeof(xtreme_settings.n) +#define setting(t, n) .type = momentum_settings_type##t, .key = #n, .val = &momentum_settings.n +#define setting_str(n) setting(_str, n), .str_len = sizeof(momentum_settings.n) #define setting_int(n, min, max) setting(_int, n), clamp(i, min, max) #define setting_uint(n, min, max) setting(_uint, n), clamp(u, min, max) #define setting_enum(n, cnt) setting(_enum, n), .e_cnt = cnt #define setting_bool(n) setting(_bool, n) -} xtreme_settings_entries[] = { +} momentum_settings_entries[] = { {setting_str(asset_pack)}, {setting_uint(anim_speed, 25, 300)}, {setting_int(cycle_anims, -1, 86400)}, {setting_bool(unlock_anims)}, - {setting_bool(credits_anim)}, {setting_enum(menu_style, MenuStyleCount)}, {setting_bool(bad_pins_format)}, {setting_bool(allow_locked_rpc_commands)}, @@ -116,36 +114,36 @@ static const struct { {setting_bool(file_naming_prefix_after)}, }; -void xtreme_settings_load() { +void momentum_settings_load() { Storage* storage = furi_record_open(RECORD_STORAGE); FlipperFormat* file = flipper_format_file_alloc(storage); - if(flipper_format_file_open_existing(file, XTREME_SETTINGS_PATH)) { + if(flipper_format_file_open_existing(file, MOMENTUM_SETTINGS_PATH)) { FuriString* val_str = furi_string_alloc(); int32_t val_int; uint32_t val_uint; bool val_bool; bool ok; - for(size_t entry_i = 0; entry_i < COUNT_OF(xtreme_settings_entries); entry_i++) { -#define entry xtreme_settings_entries[entry_i] + for(size_t entry_i = 0; entry_i < COUNT_OF(momentum_settings_entries); entry_i++) { +#define entry momentum_settings_entries[entry_i] switch(entry.type) { - case xtreme_settings_type_str: + case momentum_settings_type_str: ok = flipper_format_read_string(file, entry.key, val_str); if(ok) strlcpy((char*)entry.val, furi_string_get_cstr(val_str), entry.str_len); break; - case xtreme_settings_type_int: + case momentum_settings_type_int: ok = flipper_format_read_int32(file, entry.key, &val_int, 1); if(ok) *(int32_t*)entry.val = CLAMP(val_int, entry.i_max, entry.i_min); break; - case xtreme_settings_type_uint: + case momentum_settings_type_uint: ok = flipper_format_read_uint32(file, entry.key, &val_uint, 1); if(ok) *(uint32_t*)entry.val = CLAMP(val_uint, entry.u_max, entry.u_min); break; - case xtreme_settings_type_enum: + case momentum_settings_type_enum: ok = flipper_format_read_uint32(file, entry.key, &val_uint, 1); if(ok) *(uint8_t*)entry.val = CLAMP(val_uint, entry.e_cnt - 1U, 0U); break; - case xtreme_settings_type_bool: + case momentum_settings_type_bool: ok = flipper_format_read_bool(file, entry.key, &val_bool, 1); if(ok) *(bool*)entry.val = val_bool; break; @@ -160,32 +158,32 @@ void xtreme_settings_load() { flipper_format_free(file); furi_record_close(RECORD_STORAGE); - rgb_backlight_load_settings(xtreme_settings.rgb_backlight); + rgb_backlight_load_settings(momentum_settings.rgb_backlight); } -void xtreme_settings_save() { +void momentum_settings_save() { Storage* storage = furi_record_open(RECORD_STORAGE); FlipperFormat* file = flipper_format_file_alloc(storage); - if(flipper_format_file_open_always(file, XTREME_SETTINGS_PATH)) { + if(flipper_format_file_open_always(file, MOMENTUM_SETTINGS_PATH)) { uint32_t tmp_enum; - for(size_t entry_i = 0; entry_i < COUNT_OF(xtreme_settings_entries); entry_i++) { -#define entry xtreme_settings_entries[entry_i] + for(size_t entry_i = 0; entry_i < COUNT_OF(momentum_settings_entries); entry_i++) { +#define entry momentum_settings_entries[entry_i] switch(entry.type) { - case xtreme_settings_type_str: + case momentum_settings_type_str: flipper_format_write_string_cstr(file, entry.key, (char*)entry.val); break; - case xtreme_settings_type_int: + case momentum_settings_type_int: flipper_format_write_int32(file, entry.key, (int32_t*)entry.val, 1); break; - case xtreme_settings_type_uint: + case momentum_settings_type_uint: flipper_format_write_uint32(file, entry.key, (uint32_t*)entry.val, 1); break; - case xtreme_settings_type_enum: + case momentum_settings_type_enum: tmp_enum = *(uint8_t*)entry.val; flipper_format_write_uint32(file, entry.key, &tmp_enum, 1); break; - case xtreme_settings_type_bool: + case momentum_settings_type_bool: flipper_format_write_bool(file, entry.key, (bool*)entry.val, 1); break; default: diff --git a/lib/toolbox/name_generator.c b/lib/toolbox/name_generator.c index dee6ac089..b676fe372 100644 --- a/lib/toolbox/name_generator.c +++ b/lib/toolbox/name_generator.c @@ -6,7 +6,7 @@ #include #include #include -#include +#include const char* const name_generator_left[] = { "super", @@ -52,10 +52,10 @@ void name_generator_make_auto_datetime( DateTime* custom_time) { if(!furi_hal_rtc_is_flag_set(FuriHalRtcFlagRandomFilename)) { name_generator_make_detailed_datetime( - name, max_name_size, prefix, custom_time, xtreme_settings.file_naming_prefix_after); + name, max_name_size, prefix, custom_time, momentum_settings.file_naming_prefix_after); } else { name_generator_make_random_prefixed( - name, max_name_size, prefix, xtreme_settings.file_naming_prefix_after); + name, max_name_size, prefix, momentum_settings.file_naming_prefix_after); } } @@ -100,7 +100,7 @@ void name_generator_make_random_prefixed( void name_generator_make_random(char* name, size_t max_name_size) { name_generator_make_random_prefixed( - name, max_name_size, NULL, xtreme_settings.file_naming_prefix_after); + name, max_name_size, NULL, momentum_settings.file_naming_prefix_after); } void name_generator_make_detailed_datetime( @@ -152,5 +152,5 @@ void name_generator_make_detailed_datetime( void name_generator_make_detailed(char* name, size_t max_name_size, const char* prefix) { name_generator_make_detailed_datetime( - name, max_name_size, prefix, NULL, xtreme_settings.file_naming_prefix_after); + name, max_name_size, prefix, NULL, momentum_settings.file_naming_prefix_after); } diff --git a/scripts/update.py b/scripts/update.py index c0beee2b6..0cdf3459d 100755 --- a/scripts/update.py +++ b/scripts/update.py @@ -148,10 +148,10 @@ class Main(App): "-i", str( pathlib.Path(self.args.resources) - / "../../../assets/slideshow/xfwfirstboot" + / "../../../assets/slideshow/firstboot" ), "-o", - str(pathlib.Path(self.args.resources) / "dolphin/xfwfirstboot.bin"), + str(pathlib.Path(self.args.resources) / "dolphin/firstboot.bin"), ] ) if not self.package_resources( @@ -169,9 +169,9 @@ class Main(App): SlideshowMain(no_exit=True)( [ "-i", - str(pathlib.Path(self.args.splash).parent / "xfwfirstboot"), + str(pathlib.Path(self.args.splash).parent / "firstboot"), "-o", - join(self.args.directory, "xfwfirstboot.bin"), + join(self.args.directory, "firstboot.bin"), ] ) splash_args = [ diff --git a/sonar-project.properties b/sonar-project.properties index 72add4236..a937a997a 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -1,8 +1,8 @@ -sonar.projectKey=Flipper-XFW_Xtreme-Firmware -sonar.organization=Flipper-XFW +sonar.projectKey=Next-Flip_Momentum-Firmware +sonar.organization=Next-Flip # This is the name and version displayed in the SonarCloud UI. -#sonar.projectName=Xtreme-Firmware +#sonar.projectName=Momentum-Firmware #sonar.projectVersion=1.0 # Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows. diff --git a/targets/f7/api_symbols.csv b/targets/f7/api_symbols.csv index f51e6fd22..0f538b0dd 100644 --- a/targets/f7/api_symbols.csv +++ b/targets/f7/api_symbols.csv @@ -131,6 +131,7 @@ Header,+,lib/mlib/m-list.h,, Header,+,lib/mlib/m-rbtree.h,, Header,+,lib/mlib/m-tuple.h,, Header,+,lib/mlib/m-variant.h,, +Header,+,lib/momentum/momentum.h,, Header,+,lib/music_worker/music_worker.h,, Header,+,lib/nanopb/pb.h,, Header,+,lib/nanopb/pb_decode.h,, @@ -247,7 +248,6 @@ Header,+,lib/toolbox/stream/string_stream.h,, Header,+,lib/toolbox/tar/tar_archive.h,, Header,+,lib/toolbox/value_index.h,, Header,+,lib/toolbox/version.h,, -Header,+,lib/xtreme/xtreme.h,, Header,+,targets/f7/ble_glue/furi_ble/event_dispatcher.h,, Header,+,targets/f7/ble_glue/furi_ble/gatt.h,, Header,+,targets/f7/ble_glue/furi_ble/profile_interface.h,, @@ -632,6 +632,8 @@ Function,-,asiprintf,int,"char**, const char*, ..." Function,-,asniprintf,char*,"char*, size_t*, const char*, ..." Function,-,asnprintf,char*,"char*, size_t*, const char*, ..." Function,-,asprintf,int,"char**, const char*, ..." +Function,+,asset_packs_free,void, +Function,+,asset_packs_init,void, Function,-,at_quick_exit,int,void (*)() Function,-,atan,double,double Function,-,atan2,double,"double, double" @@ -2688,6 +2690,8 @@ Function,-,mktemp,char*,char* Function,-,modf,double,"double, double*" Function,-,modff,float,"float, float*" Function,-,modfl,long double,"long double, long double*" +Function,-,momentum_settings_load,void, +Function,+,momentum_settings_save,void, Function,-,mrand48,long, Function,-,music_worker_alloc,MusicWorker*, Function,-,music_worker_clear,void,MusicWorker* @@ -3664,10 +3668,6 @@ Function,+,widget_alloc,Widget*, Function,+,widget_free,void,Widget* Function,+,widget_get_view,View*,Widget* Function,+,widget_reset,void,Widget* -Function,+,xtreme_assets_free,void, -Function,+,xtreme_assets_init,void, -Function,-,xtreme_settings_load,void, -Function,+,xtreme_settings_save,void, Function,-,y0,double,double Function,-,y0f,float,float Function,-,y1,double,double @@ -3682,13 +3682,13 @@ Variable,+,A_GPIO_14,Icon, Variable,+,A_Infrared_14,Icon, Variable,+,A_Levelup_128x64,Icon, Variable,+,A_Loading_24,Icon, +Variable,+,A_Momentum_14,Icon, Variable,+,A_NFC_14,Icon, Variable,+,A_Plugins_14,Icon, Variable,+,A_Round_loader_8x8,Icon, Variable,+,A_Settings_14,Icon, Variable,+,A_Sub1ghz_14,Icon, Variable,+,A_U2F_14,Icon, -Variable,+,A_Xtreme_14,Icon, Variable,+,A_iButton_14,Icon, Variable,+,DOLPHIN_LEVELS,const uint32_t[], Variable,+,DOLPHIN_LEVEL_COUNT,const size_t, @@ -3740,8 +3740,8 @@ Variable,+,I_CC_Bluetooth_16x16,Icon, Variable,+,I_CC_DarkMode_16x16,Icon, Variable,+,I_CC_LefthandedMode_16x16,Icon, Variable,+,I_CC_Lock_16x16,Icon, +Variable,+,I_CC_Momentum_16x16,Icon, Variable,+,I_CC_Settings_16x16,Icon, -Variable,+,I_CC_Xtreme_16x16,Icon, Variable,+,I_Certification1_103x56,Icon, Variable,+,I_Certification2_46x33,Icon, Variable,+,I_CertificationChina0_121x41,Icon, @@ -3837,6 +3837,7 @@ Variable,+,I_Unlock_7x8,Icon, Variable,+,I_Unplug_bg_bottom_128x10,Icon, Variable,+,I_Unplug_bg_top_128x14,Icon, Variable,+,I_Updating_32x40,Icon, +Variable,+,I_Updating_Logo_62x15,Icon, Variable,+,I_UsbTree_48x22,Icon, Variable,+,I_Voldwn_6x6,Icon, Variable,+,I_Voltage_16x16,Icon, @@ -3958,6 +3959,7 @@ Variable,+,_impure_data,_reent, Variable,+,_impure_ptr,_reent*, Variable,-,_sys_errlist,const char*[], Variable,-,_sys_nerr,int, +Variable,-,asset_packs,AssetPacks, Variable,-,ble_profile_hid,const FuriHalBleProfileTemplate*, Variable,-,ble_profile_serial,const FuriHalBleProfileTemplate*, Variable,+,cli_vcp,CliSession, @@ -4178,6 +4180,7 @@ Variable,+,message_red_255,const NotificationMessage, Variable,+,message_sound_off,const NotificationMessage, Variable,+,message_vibro_off,const NotificationMessage, Variable,+,message_vibro_on,const NotificationMessage, +Variable,+,momentum_settings,MomentumSettings, Variable,-,nfc_device_emv,const NfcDeviceBase, Variable,-,nfc_device_mf_classic,const NfcDeviceBase, Variable,-,nfc_device_mf_desfire,const NfcDeviceBase, @@ -4252,5 +4255,3 @@ Variable,+,usb_cdc_single,FuriHalUsbInterface, Variable,+,usb_hid,FuriHalUsbInterface, Variable,+,usb_hid_u2f,FuriHalUsbInterface, Variable,+,usbd_devfs,const usbd_driver, -Variable,+,xtreme_assets,XtremeAssets, -Variable,+,xtreme_settings,XtremeSettings, diff --git a/targets/f7/furi_hal/furi_hal_light.c b/targets/f7/furi_hal/furi_hal_light.c index d7807f88e..8bd8cc1e9 100644 --- a/targets/f7/furi_hal/furi_hal_light.c +++ b/targets/f7/furi_hal/furi_hal_light.c @@ -3,7 +3,7 @@ #include #include #include -#include +#include #include #define LED_CURRENT_RED 50 @@ -44,7 +44,7 @@ void furi_hal_light_set(Light light, uint8_t value) { lp5562_set_channel_value(&furi_hal_i2c_handle_power, LP5562ChannelBlue, value); } if(light & LightBacklight) { - if(xtreme_settings.rgb_backlight) { + if(momentum_settings.rgb_backlight) { rgb_backlight_update(value, false); } else { uint8_t prev = diff --git a/targets/f7/target.json b/targets/f7/target.json index 4dbb5b3a2..fc1a57583 100644 --- a/targets/f7/target.json +++ b/targets/f7/target.json @@ -49,11 +49,11 @@ "u8g2", "nanopb", "update_util", - "xtreme", + "momentum", "heatshrink", "flipperformat", "flipper7", "bit_lib", "datetime" ] -} +} \ No newline at end of file diff --git a/targets/furi_hal_include/furi_hal_usb_hid.h b/targets/furi_hal_include/furi_hal_usb_hid.h index 887f81617..1187bcaa6 100644 --- a/targets/furi_hal_include/furi_hal_usb_hid.h +++ b/targets/furi_hal_include/furi_hal_usb_hid.h @@ -166,7 +166,7 @@ static const uint16_t hid_asciimap[] = { }; typedef struct { - // Good job knobheads, these should be uint16_t + // Note: vid/pid should be uint16_t and are treated as such uint32_t vid; uint32_t pid; char manuf[HID_MANUF_PRODUCT_NAME_LEN];