From cb5c5c08f6d23111471f97ae448f2c764b7c5b6b Mon Sep 17 00:00:00 2001 From: gid9798 <30450294+gid9798@users.noreply.github.com> Date: Tue, 29 Aug 2023 13:37:15 +0300 Subject: [PATCH 1/7] SubGHz Remote: submodule --- .gitmodules | 4 + applications/main/subghz_remote/.gitignore | 4 + applications/main/subghz_remote/LICENSE | 21 +++ .../main/subghz_remote/application.fam | 32 ++++- .../subghz_remote/catalog/docs/Changelog.md | 25 ++++ .../main/subghz_remote/catalog/docs/Readme.md | 24 ++++ .../catalog/screenshots/Editor_main.png | Bin 0 -> 2361 bytes .../catalog/screenshots/Editor_submenu.png | Bin 0 -> 1381 bytes .../catalog/screenshots/Remote_idle.png | Bin 0 -> 2026 bytes .../catalog/screenshots/Remote_send.png | Bin 0 -> 1730 bytes .../helpers/subrem_custom_event.h | 7 + .../subghz_remote/helpers/subrem_presets.c | 2 + .../subghz_remote/helpers/txrx/subghz_txrx.c | 6 +- .../subghz_remote/helpers/txrx/subghz_txrx.h | 4 +- .../subghz_remote/icons/DolphinNice_96x59.png | Bin 0 -> 2459 bytes .../icons/remote_scene/ButtonDown_7x4.png | Bin 0 -> 102 bytes .../icons/remote_scene/ButtonLeft_4x7.png | Bin 0 -> 1415 bytes .../icons/remote_scene/ButtonRight_4x7.png | Bin 0 -> 1839 bytes .../icons/remote_scene/ButtonUp_7x4.png | Bin 0 -> 102 bytes .../icons/remote_scene/Ok_btn_9x9.png | Bin 0 -> 3605 bytes .../icons/remote_scene/Pin_arrow_up_7x9.png | Bin 0 -> 3603 bytes .../icons/remote_scene/Pin_cell_13x13.png | Bin 0 -> 3593 bytes .../icons/remote_scene/Pin_star_7x7.png | Bin 0 -> 3600 bytes .../icons/remote_scene/back_10px.png | Bin 0 -> 154 bytes .../main/subghz_remote/icons/sub1_10px.png | Bin 0 -> 299 bytes .../main/subghz_remote/icons/subrem_10px.png | Bin 0 -> 5000 bytes .../scenes/subrem_scene_config.h | 5 +- .../scenes/subrem_scene_edit_label.c | 4 +- .../scenes/subrem_scene_fw_warning.c | 129 ++++++++++++++++++ .../main/subghz_remote/subghz_remote_app.c | 16 ++- .../main/subghz_remote/subghz_remote_app_i.c | 15 +- .../main/subghz_remote/subghz_remote_app_i.h | 2 +- 32 files changed, 280 insertions(+), 20 deletions(-) create mode 100644 applications/main/subghz_remote/.gitignore create mode 100644 applications/main/subghz_remote/LICENSE create mode 100644 applications/main/subghz_remote/catalog/docs/Changelog.md create mode 100644 applications/main/subghz_remote/catalog/docs/Readme.md create mode 100644 applications/main/subghz_remote/catalog/screenshots/Editor_main.png create mode 100644 applications/main/subghz_remote/catalog/screenshots/Editor_submenu.png create mode 100644 applications/main/subghz_remote/catalog/screenshots/Remote_idle.png create mode 100644 applications/main/subghz_remote/catalog/screenshots/Remote_send.png create mode 100644 applications/main/subghz_remote/icons/DolphinNice_96x59.png create mode 100644 applications/main/subghz_remote/icons/remote_scene/ButtonDown_7x4.png create mode 100644 applications/main/subghz_remote/icons/remote_scene/ButtonLeft_4x7.png create mode 100644 applications/main/subghz_remote/icons/remote_scene/ButtonRight_4x7.png create mode 100644 applications/main/subghz_remote/icons/remote_scene/ButtonUp_7x4.png create mode 100644 applications/main/subghz_remote/icons/remote_scene/Ok_btn_9x9.png create mode 100644 applications/main/subghz_remote/icons/remote_scene/Pin_arrow_up_7x9.png create mode 100644 applications/main/subghz_remote/icons/remote_scene/Pin_cell_13x13.png create mode 100644 applications/main/subghz_remote/icons/remote_scene/Pin_star_7x7.png create mode 100644 applications/main/subghz_remote/icons/remote_scene/back_10px.png create mode 100644 applications/main/subghz_remote/icons/sub1_10px.png create mode 100644 applications/main/subghz_remote/icons/subrem_10px.png create mode 100644 applications/main/subghz_remote/scenes/subrem_scene_fw_warning.c diff --git a/.gitmodules b/.gitmodules index 52cf4a207..e68c05465 100644 --- a/.gitmodules +++ b/.gitmodules @@ -38,3 +38,7 @@ [submodule "lib/stm32wb_copro"] path = lib/stm32wb_copro url = https://github.com/flipperdevices/stm32wb_copro.git +[submodule "subghz_remote"] + path = applications/main/subghz_remote + url = https://github.com/DarkFlippers/SubGHz_Remote + branch = ufw_main_app diff --git a/applications/main/subghz_remote/.gitignore b/applications/main/subghz_remote/.gitignore new file mode 100644 index 000000000..e2a15a10a --- /dev/null +++ b/applications/main/subghz_remote/.gitignore @@ -0,0 +1,4 @@ +dist/* +.vscode +.clang-format +.editorconfig \ No newline at end of file diff --git a/applications/main/subghz_remote/LICENSE b/applications/main/subghz_remote/LICENSE new file mode 100644 index 000000000..6f55e3b0d --- /dev/null +++ b/applications/main/subghz_remote/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 DarkFlippers @gid9798 @xMasterX + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/applications/main/subghz_remote/application.fam b/applications/main/subghz_remote/application.fam index 7d11e153e..34fb390ab 100644 --- a/applications/main/subghz_remote/application.fam +++ b/applications/main/subghz_remote/application.fam @@ -1,17 +1,43 @@ +# App( +# appid="subghz_remote_ofw", +# name="Sub-GHz Remote", +# apptype=FlipperAppType.EXTERNAL, +# entry_point="subghz_remote_app", +# requires=[ +# "gui", +# "dialogs", +# ], +# stack_size=2 * 1024, +# targets=["f7"], +# fap_icon="icon.png", +# fap_author="gid9798 xMasterX", +# fap_description="SubGhz Remote, uses up to 5 .sub files", +# fap_category="Sub-GHz", +# fap_icon_assets="icons", +# fap_icon_assets_symbol="subghz_remote", +# fap_version="1.2", +# fap_weburl="https://github.com/DarkFlippers/SubGHz_Remote", +# ) + App( appid="subghz_remote", name="Sub-GHz Remote", apptype=FlipperAppType.MENUEXTERNAL, entry_point="subghz_remote_app", icon="A_SubGHzRemote_14", + order=11, requires=[ "gui", "dialogs", ], stack_size=2 * 1024, - order=11, - fap_libs=["assets",], + targets=["f7"], fap_icon="icon.png", + fap_author="gid9798 xMasterX", fap_description="SubGhz Remote, uses up to 5 .sub files", fap_category="Sub-GHz", -) \ No newline at end of file + fap_icon_assets="icons", + fap_icon_assets_symbol="subghz_remote", + fap_version="1.2", + fap_weburl="https://github.com/DarkFlippers/SubGHz_Remote", +) diff --git a/applications/main/subghz_remote/catalog/docs/Changelog.md b/applications/main/subghz_remote/catalog/docs/Changelog.md new file mode 100644 index 000000000..31ed245e8 --- /dev/null +++ b/applications/main/subghz_remote/catalog/docs/Changelog.md @@ -0,0 +1,25 @@ +## v1.2 +- **Official FirmWare Support** +- Add warning screen on CustomFW + - The .sub file format may differ from the official one and may be broken + +## v1.1 +- **Was combined with a configuration plugin** + - Editing/Creating map file +- Support for starting arguments + +## v1.0 + +**Initial implementation:** +- Transmission +- GUI +- All .sub files for which transfer is available are supported +- Signal types: + - Static + - Dynamic + - RAW + - BinRAW + +*Custom modulations are not supported yet* + +**Map File Format** - FlipperFormat .txt file \ No newline at end of file diff --git a/applications/main/subghz_remote/catalog/docs/Readme.md b/applications/main/subghz_remote/catalog/docs/Readme.md new file mode 100644 index 000000000..1da170e19 --- /dev/null +++ b/applications/main/subghz_remote/catalog/docs/Readme.md @@ -0,0 +1,24 @@ +With this application, you can combine up to 5 .sub files into one remote, and use flipper as a remote with multiple buttons. +## What is "Map" Files? +"Map" is short for mapping +A Map Files is a .txt files that the application uses to store information about remotes +# How to use +## First screen +After launching the application, you will see the MAP file selection screen (file browser). +- Select map file or press "back" to go Main menu +## Main menu +- Open map file - switching to remote + - Select map file + - On remote screen, use the navigation buttons(D-pad) to send a signal +- Edit Map File - map file editor + - Select map file + - Up/Down - slot nafigation + - Ok - edit menu + - Left - preview/save +- New Map File - Creating a new map file + - Enter a name + - The rest is similar to map file editor +# About map file +Map file - FlipperFormat .txt file. + +Stores custom names, and paths to used .sub files. \ No newline at end of file diff --git a/applications/main/subghz_remote/catalog/screenshots/Editor_main.png b/applications/main/subghz_remote/catalog/screenshots/Editor_main.png new file mode 100644 index 0000000000000000000000000000000000000000..9498c94514411bd81fd4f7c474bb3286b0ec6c8f GIT binary patch literal 2361 zcma)8YgAL&6+Rf>3iPFph~TuNj8GOz1PEg$Z$g@kajmOse)Pv(=bn4d-uv78 zeBVCjk4Xu!o?Csk0suVYPR4u+z&huv2iWWyPQA)J4 z*2cyBCZ(uxNpYs;8_`cU^e*-J4XE|+mtt50D~v1o)lvHx@dqcA8y4G`YG|cvT`vX+Dw5WLeSdLUh6y&V+^H|zVB0mHfeX618_POENH9nP zEaPO{*V|vOad{VHAu6ud7caBd8j`jtzx5BT_W)Oa2Egt0;G+-8Am%+;H*vW+o6pzz zwtSIXQa)VT@gi~viFl1|i!f6q#hS&?RemwUR!T0$=mokeV1Lg zG9Q%QueUE-(DWjC?OJKuUeI;YS(_hzj!)#M>P#c$f%FXGq|jT4s5szC$r(t)d+2un z9F@YV@QK7bCsjy)f?602C=lF!NL7t>+L_ZG`0piYtS#m{7)}l>a1Gz1loWia64S{b zo4RC}Z2G4AT5}Mr`U1hme6nxL4kz1EG?prXUeaR2kjWbzYP>cKn0wxRH zl!#Nww4v6;|8U3>$||Wvp7X%IlOGD(o@6o*j<+{m<|aa#&hrTh3T{k_k_OF`g;=)Z z#Q`wTVP_FZ?Y7iHR))7ZwGw@kF!O5r*LC>?^WSsZTRK)}WuaSXcP^ zYTDb=j!;%*#-op6jId`Q*dhj`_ET0p z$mr|jl4&hd9mT8DDti{4PpqM7bVQ7ps~0h&MuO*7#7v@BAPhZwmI8PNfvlu5Xc^_l zVHZN8O6oac2xCM=mSstE8-1n~MwE};!L--{3bWJ=7SGZ@!DK;d+m%!pyf}_RU^p1e z6N`OoL8l}!aB7BjufaCW8P%HNVI%NCyh4P&`O%vKg}GINLr zqTwnWkb^Xn>c+F5H~$@qqO1m(;_gi*=Mj6ZSJ}0(CvItx&^T#ETBi$Y`N+wG!4g9 zeJ5_FOy3~Fcyr2$SNjFZFh5<3yq}zi{l{@8wIv^8H8IIlF1lsS4}w?Xl^PHlxgoVR z$@Ep`+-05xV%yS1^WsLIJ_3N9B%8X@d2F0A<9JWou!>147tYOG zQhG`6u9)8O3>k48hzrs1e0_g-y7^AoPqW$ms7ci6|t7+{z!Qr>Pb-hk2S~`)Y3ZrWreeorPk<RK$`+_f81*v|;P)gVI_ITO@%C3y?@)2C zM%M`=>iv!2vwEG@1JyGNL;7DIXQzdsG#DU+*^z&?fm6gd*b^Ea+4q)X(MRf=_okM` z)t+x{CY}sbx&t$#>MJZtaXp{5UVbSOOz8W9K*tuJV?bGd}ZMxWEHBjMdVzW^cI zJPhwFB(7Ul>CxdW280R^-zFoJnIW@dsegeV~!F%-$9`0y0`B&p#X@ zGITtF-%3`Cu_#l341Xe*L`Q}tD6Mq1`9hT8ng2l4rC)&7U%A_2c0oi%*k01899bM1 no&i5z-OgQ?jUSQo+BW2_eUVyER*ds51mZqUh-p2R^ZEY(w3puR literal 0 HcmV?d00001 diff --git a/applications/main/subghz_remote/catalog/screenshots/Editor_submenu.png b/applications/main/subghz_remote/catalog/screenshots/Editor_submenu.png new file mode 100644 index 0000000000000000000000000000000000000000..f5f7cd8495aef5c0e33c4594679670b40eff387e GIT binary patch literal 1381 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 D{V;BS literal 0 HcmV?d00001 diff --git a/applications/main/subghz_remote/helpers/subrem_custom_event.h b/applications/main/subghz_remote/helpers/subrem_custom_event.h index e6b9e8ac6..810df6a89 100644 --- a/applications/main/subghz_remote/helpers/subrem_custom_event.h +++ b/applications/main/subghz_remote/helpers/subrem_custom_event.h @@ -48,4 +48,11 @@ typedef enum { SubRemCustomEventSceneEditPreviewSaved, SubRemCustomEventSceneNewName, + +#ifdef FW_ORIGIN_Official + SubRemCustomEventSceneFwWarningExit, + SubRemCustomEventSceneFwWarningNext, + SubRemCustomEventSceneFwWarningContinue, +#endif + } SubRemCustomEvent; \ No newline at end of file diff --git a/applications/main/subghz_remote/helpers/subrem_presets.c b/applications/main/subghz_remote/helpers/subrem_presets.c index ca91ccbaf..bca888b96 100644 --- a/applications/main/subghz_remote/helpers/subrem_presets.c +++ b/applications/main/subghz_remote/helpers/subrem_presets.c @@ -149,7 +149,9 @@ SubRemLoadSubState subrem_sub_preset_load( if(protocol->flag & SubGhzProtocolFlag_Send) { if((protocol->type == SubGhzProtocolTypeStatic) || (protocol->type == SubGhzProtocolTypeDynamic) || +#ifndef FW_ORIGIN_Official (protocol->type == SubGhzProtocolTypeBinRAW) || +#endif (protocol->type == SubGhzProtocolTypeRAW)) { sub_preset->type = protocol->type; } else { diff --git a/applications/main/subghz_remote/helpers/txrx/subghz_txrx.c b/applications/main/subghz_remote/helpers/txrx/subghz_txrx.c index aa713c7a8..8c8c3b56d 100644 --- a/applications/main/subghz_remote/helpers/txrx/subghz_txrx.c +++ b/applications/main/subghz_remote/helpers/txrx/subghz_txrx.c @@ -1,10 +1,12 @@ #include "subghz_txrx_i.h" -#include +#include #include #include +#ifndef FW_ORIGIN_Official #include +#endif #define TAG "SubGhz" @@ -657,12 +659,14 @@ bool subghz_txrx_get_debug_pin_state(SubGhzTxRx* instance) { return instance->debug_pin_state; } +#ifndef FW_ORIGIN_Official void subghz_txrx_reset_dynamic_and_custom_btns(SubGhzTxRx* instance) { furi_assert(instance); subghz_environment_reset_keeloq(instance->environment); subghz_custom_btns_reset(); } +#endif SubGhzReceiver* subghz_txrx_get_receiver(SubGhzTxRx* instance) { furi_assert(instance); diff --git a/applications/main/subghz_remote/helpers/txrx/subghz_txrx.h b/applications/main/subghz_remote/helpers/txrx/subghz_txrx.h index 4593ea20c..93c4a2276 100644 --- a/applications/main/subghz_remote/helpers/txrx/subghz_txrx.h +++ b/applications/main/subghz_remote/helpers/txrx/subghz_txrx.h @@ -369,7 +369,7 @@ bool subghz_txrx_radio_device_is_tx_allowed(SubGhzTxRx* instance, uint32_t frequ void subghz_txrx_set_debug_pin_state(SubGhzTxRx* instance, bool state); bool subghz_txrx_get_debug_pin_state(SubGhzTxRx* instance); - +#ifndef FW_ORIGIN_Official void subghz_txrx_reset_dynamic_and_custom_btns(SubGhzTxRx* instance); - +#endif SubGhzReceiver* subghz_txrx_get_receiver(SubGhzTxRx* instance); // TODO use only in DecodeRaw diff --git a/applications/main/subghz_remote/icons/DolphinNice_96x59.png b/applications/main/subghz_remote/icons/DolphinNice_96x59.png new file mode 100644 index 0000000000000000000000000000000000000000..a299d3630239b4486e249cc501872bed5996df3b GIT binary patch literal 2459 zcmbVO3s4i+8V(M(gEFORwSrA`4O0uPn|M|5y* zB*aMDxC&7(gP9JN;POOi-9khrC>Z9YJs2U!LnVcQEEC0fDtKo&ILlzb30%M}3J^;~ zv7RzcsilOs4Mq@tD*&R;!LMSk2A~{(`HK9|hQBqEX)3sQr9Je6SZU*F-^fD-p+~Hs; zHLkO%v?>ZoxEv+F#whudr%615FkA0DYR0tMEo}3OOY#xecLWe>xV?u5KtSmC^ z7)Fmj6gjfKstiEV-*Cxbbb+&rRWuI_rBJ)ybs_f1Rn&f2>q3pYwI^|J(hdn{j{0EZIm_F zpIyIWLsRUgOItR-dUbVd|6Zo=_BU_Tj4|{{jxO#=JH4o8er(5{!nZD_j4}MH&zh~9 zVLC~y(0-D6GO0ghZD8BYzP?o{>22~lT6^d@X{SwQ8vrNY-PPIMajIwC)`s14Ep72@ zeq7YOzM`?U{+W)ocXBr`eSOcpk?Rxc=ou5&)fWW|pD};-Z0mvk9}=&`Rb&y<77W~a z(>6YM;6Y5aIU~JKZ}mQZynKHiSTQ#Bczn@&jTiN^?vPJ(jhm7cXLx0oum5P$`TceG zU+wR;OO^)8CVlnM)5p$CO&e94KJt>HccCaHGusmW_b`T6m| z-R6V6Db1pErTot?^d22ojm+2>_)FbD`_+WbDGMx9f@hO27maS2`csiV(D&Fs`PS2& zvrq18du_&zXID(!KIxsU$)iuTYuZ?zmYiP&n&i@Be{IdbS-jA2c0QAlu5NXQv_0K< z3Hvs4eeu6B7yD&CNT~gIkMV&UkRU=V!iQ(+_(O&u^ah$+s{_yn(yBYeD40HeU{xGsIT6W Zfq!wOp!Q_E)I!3HFqj;YoHDIHH2#}J9|(o>FH3<^BV2haYO z-y5_sM4;GPjq%Ck6>60csmUj6EiNa>ORduPH4*)h!w|e3sE@(Z)z4*}Q$iC10Gods AV*mgE literal 0 HcmV?d00001 diff --git a/applications/main/subghz_remote/icons/remote_scene/ButtonLeft_4x7.png b/applications/main/subghz_remote/icons/remote_scene/ButtonLeft_4x7.png new file mode 100644 index 0000000000000000000000000000000000000000..0b4655d43247083aa705620e9836ac415b42ca46 GIT binary patch literal 1415 zcmbVM+iKK67*5rq)>aU2M7$VM1Vxif;vTv~W2u`S7ED{V3s&&L*<`XiG|9wd+THd> z5CnY!sdyuJtrvQyAo>KpiLcV|{Tkc)riAbluXfwSZCApL`ztB&p zx6LGKvks4K_4~)qD&oGa-YdJlW)hAKMNJd7<=t?6c^RI1>c$ifyjaM>^|&8!ey zB4!nh9u>5uen6Ve@<H5rru6h<2Ef#GQdQ*CmZOlQi~N!?9H`Rp;C% zU}CB21#?;r`&0|6C0}b-=jODa5|nEJ#ntxQ&{~jpgtwDta4hftr~G=#p@V36e4Zjh zq%J~{y26Jjn=1Nw-l*3%QW5YFE*v4z3gt0$&(*xf2en34c?JpH8+FYldo+Alvg8af-pG4(=!fyUi-Wsg z`g#n9VUcf(DFr{poMSNzw-lz>w+HV+n1ELr&SLA#LHUb0p(xWQ(1*vJ-i+1!`swxZ Z!O7;c$;lT_->m1Ovaz)0yuI`A$q$F8u*d)a literal 0 HcmV?d00001 diff --git a/applications/main/subghz_remote/icons/remote_scene/ButtonRight_4x7.png b/applications/main/subghz_remote/icons/remote_scene/ButtonRight_4x7.png new file mode 100644 index 0000000000000000000000000000000000000000..8e1c74c1c0038ea55172f19ac875003fc80c2d06 GIT binary patch literal 1839 zcmcIlO>f*p7#Yw)M6zw!O+@VZ{?d|D~WYi~8rHRY?X-&T}Yen`g$^+EJ;z+|RV zE@PoDvZ9%#+_}3bC_5Cj8jDGq541mi{7F+&KF}W65sr$Xn5H|YrMQ2(J7%Yc%;(zO z57ax000=TsQ+1Ke@+w#iw3au3cGGQWY740k2ijH>P(6tD)S)be>gX6Tj7`<`b>di- zgWp$8Y+?i31~CzF0&E4uRlA=C(Mp~K`{74jEchB|)4DDK!ZVhSwdFyw0YIZ1cDh0S{OvfO-U_~ zvmRF*m9sWDXNH)GOyqS1Skhxbr6}s*7t&@~kFM(NW5}qh?Lu@lJ}HE;FDiLdGO>LO z5pS*%E2grR)l^;|?O5b_?u0me&c1U}%jrk8*%=Wk%i)8yp2P|kuxmKg<=(u_`oQRI_0 zS`-DNysBx=#3&qSkgA@hJP>~D+ZM(s5jI6Owp`?yE=3e`YGUqkVOp#Cp=3wR3O4hX zX6BLsN3UBzV(vI5;|SZHgOb=HD0VFjpTyfFW}GnQuh>2*Q`k>*cAmA#iUT7EXSpo# zkPm5~#I-o^cpgfe#P$=4-Pi*SpT!-@nJgp8L347xe>5EKl`=_ZFc8XGy+_j=_R_7! z@vZZMowS1GJ?Zw)eetks%~G{BTR>T}9|jt0j3Btyb*C3-`C?fwY3EY`q*oYZ39DpM z&uJ;PCZPLs4QO1Jd_|A1PF)azZJ)RZ`^-VMWr6e#XUOA%3eLG_Ch@BDOHzMk*MF0G zCo7xMd?Mg*HMIXw%nNz?%60fZiZPlqb?GqUpXO`F&Yi!okZl(n>P@r1P2i)yk3DgRwbHeNn6e|;J^SK4TM LH~i+q&mR8;k>NTA literal 0 HcmV?d00001 diff --git a/applications/main/subghz_remote/icons/remote_scene/ButtonUp_7x4.png b/applications/main/subghz_remote/icons/remote_scene/ButtonUp_7x4.png new file mode 100644 index 0000000000000000000000000000000000000000..1be79328b40a93297a5609756328406565c437c0 GIT binary patch literal 102 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)I!3HFqj;YoHDIHH2#}J8d-yTOk1_O>mFaFD) zeWb+ZHz{mGZZ1QpXe09^4tcYT#4oe=UbmGC^A-KE*|F&zP#=S*tDnm{r-UX30HgpM AM*si- literal 0 HcmV?d00001 diff --git a/applications/main/subghz_remote/icons/remote_scene/Ok_btn_9x9.png b/applications/main/subghz_remote/icons/remote_scene/Ok_btn_9x9.png new file mode 100644 index 0000000000000000000000000000000000000000..9a1539da2049f12f7b25f96b11a9c40cd8227302 GIT binary patch literal 3605 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 LwKgd=cDwXHDN#*w literal 0 HcmV?d00001 diff --git a/applications/main/subghz_remote/icons/remote_scene/back_10px.png b/applications/main/subghz_remote/icons/remote_scene/back_10px.png new file mode 100644 index 0000000000000000000000000000000000000000..f9c615a99e69c0100b03a9ae7b2df903da4ecd66 GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2xGmzZ=C-xtZVk{1FcVbv~PUa<$!;&U>c zv7h@-A}f&37T^=&`v3obAT#vPO>_%)r1c48n{Iv*t(u1!X;5977~7Co?ed rv9U?Av01aVRT(gMJdt+jXk=uN>R^g!*w%ImsF1<>&pI=m5)cB{fFDGZlI8yr;B3<$MxhJ?+;A4eL&#) z0Ra}bue?07WhLz78x$BO|L3mq-MMxdP^D^#YeY#(Vo9o1a#1RfVlXl=GSoFN)ipE; zF*LF=Hn1|b&^9ozGB8+QQTzo(LvDUbW?CgwgE3G~h=HkCbE6;07#-3sX@sAxkg$U?hnu$6%_P+PX_Jv(ud zLf1xG|CwUz?7R1Up5OC4zxVgNce*W&4YheW_vK(1mglK+H=%$1JZE+m`hA@F<1zI2 zyA8fptqH{ONK}=TAjGw<2*hDRkufZBKGgVD-U({Lf_l{mhyV1gGrhn5dOvmG&rb;X|2#O* z`;Gdu`y8=lFC6>o;MdlzEhu;(gUPC_z|AEGi;B+`t?Ze5z3-kKC+@xe!rsi0?9s|K zy?-daKNrL9+N8K#jUJb4ydqS`GmmU@)cv;7aPpz%>TUZsFY*}}-;x*iZ59ty6_jpT zvujoMQ}z8jJ+AG;!%Gj}Yq-_gD;(ypTplW&z40q}pQ&N1scCq0d(~q_cR%sbwf8Sv zdVdlA`l;oI1plLZ-jYiT3faL`zr6A#=Lo=7=AJsu{N?^-b1q)%coKW)>T~u}qi^rn z-7>H`clPEJwEVR7TGqAGdqR;5OY#pr*E?^={1s1Y&f(g=vM=|qHywW9AEyugs9|9K z_qUv^T38l3y>(BG-D_BB`RVoV^}JI09`V|mBd`AW<~wBWyCXky1n0|1Nlg+*V)QGN;EdcVFdq|MubW(V_Tn9{lz<&(!Cf?0&8A zl@E$Ck9Ky~46J|Y$whnDXUy8sU3Tos>?t>Un9|+}sNpj`p?cz$4F;W6I^yu1td=)j zwphHBH{ybAO5KJiY~Ik|6F0PrHpy5~o?}l42p|MCfG0x1a7;)zj7eMpo$JG-5l@?` zHXBJXB*PHMf{1m6HIN{}u@W63h2e%VF{(r~MGfORCh)5rn!{*B^Z0mvp@`R;h7ZTa zSU`M`2@oM^6GetXP{HeN+v@{V%k5_5e+8G zkwg*(VF;PVP*i$K$XbuLG3}vK5Kuyqq!%K4ie;ot)zny<8cCZ^NiaQ~ENpU0nj%lI zJjF+!xy>BKy>oC09YBCl_0@MKq5HSOc8#H zHxrPt@G@uPXxUw}=@F^kKtO1=<+RE`fZLx72 zM^h}%PZ&K2qcJ389h0U^tT{O|!J$hHs!^{hL5Gn|PU-6=pgIxrK<@yAog7DH3a%&w z8g!!r!BMD#C>udrd^9VVErOXZqga7TC7!lcqdrv)I*fX4xSm29%!}Gu0vbreA!k;g z%|4nF%vOQs$|!0w97;_$K_%JJIG$`y z0f?!B#blXMGE;<>npEzfp3l7GX_S~MYjF^T&H&=qVRY(yC*C;TeK^CKEcntEB`m4& z*s`e!#M_|0il0b3`57vUflm0by2LgR4nVX&k8KG5wO*Mw+x#3L%ravoDAo)K9*8VK z`z@R#$`oXol=A*h>SY-g(0){rAj zX|i`eX-Qc`CULv;$ClJi>UW`W?b^xP)oq_>=<%(|iFP_&{;^5&uL6OoA}L2u$;}G@ zRN$B(Zj5Yq}83M;=f=r9w8MiVD2l{4`U z0fy0oX&k*FI5pSMi{36|`Ri-l*r@*9d2H`fXk<>LZgmX9OeOkpSK|4KPBfUUdA!xx z?`7r}mffile_name_tmp, 25, false); - +#ifndef FW_ORIGIN_Official text_input_set_minimum_length(app->text_input, 0); - +#endif widget_add_string_element( app->widget, 63, 12, AlignCenter, AlignCenter, FontPrimary, "Empty Label Name"); widget_add_string_element( diff --git a/applications/main/subghz_remote/scenes/subrem_scene_fw_warning.c b/applications/main/subghz_remote/scenes/subrem_scene_fw_warning.c new file mode 100644 index 000000000..de473b72c --- /dev/null +++ b/applications/main/subghz_remote/scenes/subrem_scene_fw_warning.c @@ -0,0 +1,129 @@ +#include "../subghz_remote_app_i.h" +#include "../helpers/subrem_custom_event.h" +#ifdef FW_ORIGIN_Official +typedef enum { + SceneFwWarningStateAttention, + SceneFwWarningStateAccept, +} SceneFwWarningState; + +static void subrem_scene_fw_warning_widget_render(SubGhzRemoteApp* app, SceneFwWarningState state); + +static void + subrem_scene_fw_warning_widget_callback(GuiButtonType result, InputType type, void* context) { + furi_assert(context); + SubGhzRemoteApp* app = context; + + if(type == InputTypeShort) { + SubRemCustomEvent event = SubRemCustomEventSceneFwWarningExit; + + switch(scene_manager_get_scene_state(app->scene_manager, SubRemSceneFwWarning)) { + case SceneFwWarningStateAttention: + if(result == GuiButtonTypeRight) { + event = SubRemCustomEventSceneFwWarningNext; + } + break; + + case SceneFwWarningStateAccept: + if(result == GuiButtonTypeRight) { + event = SubRemCustomEventSceneFwWarningContinue; + } + + break; + } + + view_dispatcher_send_custom_event(app->view_dispatcher, event); + } +} + +static void + subrem_scene_fw_warning_widget_render(SubGhzRemoteApp* app, SceneFwWarningState state) { + furi_assert(app); + Widget* widget = app->widget; + + widget_reset(widget); + + switch(state) { + case SceneFwWarningStateAttention: + widget_add_button_element( + widget, GuiButtonTypeLeft, "Exit", subrem_scene_fw_warning_widget_callback, app); + widget_add_button_element( + widget, GuiButtonTypeRight, "Continue", subrem_scene_fw_warning_widget_callback, app); + widget_add_string_element( + widget, 64, 12, AlignCenter, AlignBottom, FontPrimary, "Not official FW"); + widget_add_string_multiline_element( + widget, + 64, + 32, + AlignCenter, + AlignCenter, + FontSecondary, + "You are using custom firmware\nPlease download a compatible\nversion of the application"); + break; + + case SceneFwWarningStateAccept: + widget_add_button_element( + widget, GuiButtonTypeLeft, "Exit", subrem_scene_fw_warning_widget_callback, app); + widget_add_button_element( + widget, GuiButtonTypeRight, "Accept", subrem_scene_fw_warning_widget_callback, app); + widget_add_string_element( + widget, 64, 12, AlignCenter, AlignBottom, FontPrimary, "Not official FW"); + widget_add_string_multiline_element( + widget, + 64, + 32, + AlignCenter, + AlignCenter, + FontSecondary, + "Yes, I understand that\nthe application can\nbreak my subghz key file"); + break; + } +} + +void subrem_scene_fw_warning_on_enter(void* context) { + furi_assert(context); + + SubGhzRemoteApp* app = context; + + scene_manager_set_scene_state( + app->scene_manager, SubRemSceneFwWarning, SceneFwWarningStateAttention); + + subrem_scene_fw_warning_widget_render(app, SceneFwWarningStateAttention); + + view_dispatcher_switch_to_view(app->view_dispatcher, SubRemViewIDWidget); +} + +bool subrem_scene_fw_warning_on_event(void* context, SceneManagerEvent event) { + furi_assert(context); + + SubGhzRemoteApp* app = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeBack) { + consumed = true; + } else if(event.type == SceneManagerEventTypeCustom) { + if(event.event == SubRemCustomEventSceneFwWarningExit) { + scene_manager_stop(app->scene_manager); + view_dispatcher_stop(app->view_dispatcher); + consumed = true; + } else if(event.event == SubRemCustomEventSceneFwWarningNext) { + scene_manager_set_scene_state( + app->scene_manager, SubRemSceneFwWarning, SceneFwWarningStateAccept); + subrem_scene_fw_warning_widget_render(app, SceneFwWarningStateAccept); + view_dispatcher_switch_to_view(app->view_dispatcher, SubRemViewIDWidget); + consumed = true; + } else if(event.event == SubRemCustomEventSceneFwWarningContinue) { + scene_manager_previous_scene(app->scene_manager); + consumed = true; + } + } + + return consumed; +} + +void subrem_scene_fw_warning_on_exit(void* context) { + furi_assert(context); + + SubGhzRemoteApp* app = context; + widget_reset(app->widget); +} +#endif \ No newline at end of file diff --git a/applications/main/subghz_remote/subghz_remote_app.c b/applications/main/subghz_remote/subghz_remote_app.c index 1af39f57d..473e3c012 100644 --- a/applications/main/subghz_remote/subghz_remote_app.c +++ b/applications/main/subghz_remote/subghz_remote_app.c @@ -1,4 +1,5 @@ #include "subghz_remote_app_i.h" +#include static bool subghz_remote_app_custom_event_callback(void* context, uint32_t event) { furi_assert(context); @@ -174,7 +175,9 @@ int32_t subghz_remote_app(void* arg) { subghz_remote_make_app_folder(subghz_remote_app); bool map_loaded = false; - +#ifdef FW_ORIGIN_Official + const bool fw_ofw = strcmp(version_get_firmware_origin(version_get()), "Official") == 0; +#endif if((arg != NULL) && (strlen(arg) != 0)) { furi_string_set(subghz_remote_app->file_path, (const char*)arg); SubRemLoadMapState load_state = subrem_map_file_load( @@ -193,8 +196,19 @@ int32_t subghz_remote_app(void* arg) { } else { furi_string_set(subghz_remote_app->file_path, SUBREM_APP_FOLDER); scene_manager_next_scene(subghz_remote_app->scene_manager, SubRemSceneStart); +#ifdef FW_ORIGIN_Official + if(fw_ofw) { + scene_manager_next_scene(subghz_remote_app->scene_manager, SubRemSceneOpenMapFile); + } + } + + if(!fw_ofw) { + scene_manager_next_scene(subghz_remote_app->scene_manager, SubRemSceneFwWarning); + } +#else scene_manager_next_scene(subghz_remote_app->scene_manager, SubRemSceneOpenMapFile); } +#endif view_dispatcher_run(subghz_remote_app->view_dispatcher); diff --git a/applications/main/subghz_remote/subghz_remote_app_i.c b/applications/main/subghz_remote/subghz_remote_app_i.c index 82e762c2a..ca54a997b 100644 --- a/applications/main/subghz_remote/subghz_remote_app_i.c +++ b/applications/main/subghz_remote/subghz_remote_app_i.c @@ -3,12 +3,9 @@ #include #include "helpers/txrx/subghz_txrx.h" - -// #include -// #include - -#include +#ifndef FW_ORIGIN_Official #include +#endif #define TAG "SubGhzRemote" @@ -225,9 +222,9 @@ bool subrem_tx_start_sub(SubGhzRemoteApp* app, SubRemSubFilePreset* sub_preset) sub_preset->freq_preset.frequency, NULL, 0); - +#ifndef FW_ORIGIN_Official subghz_custom_btns_reset(); - +#endif if(subghz_txrx_tx_start(app->txrx, sub_preset->fff_data) == SubGhzTxRxStartTxStateOk) { ret = true; } @@ -242,12 +239,12 @@ bool subrem_tx_stop_sub(SubGhzRemoteApp* app, bool forced) { if(forced || (sub_preset->type != SubGhzProtocolTypeRAW)) { subghz_txrx_stop(app->txrx); - +#ifndef FW_ORIGIN_Official if(sub_preset->type == SubGhzProtocolTypeDynamic) { subghz_txrx_reset_dynamic_and_custom_btns(app->txrx); } subghz_custom_btns_reset(); - +#endif return true; } diff --git a/applications/main/subghz_remote/subghz_remote_app_i.h b/applications/main/subghz_remote/subghz_remote_app_i.h index d200bdf96..2300b3e52 100644 --- a/applications/main/subghz_remote/subghz_remote_app_i.h +++ b/applications/main/subghz_remote/subghz_remote_app_i.h @@ -6,7 +6,7 @@ #include "helpers/txrx/subghz_txrx.h" -#include +#include "subghz_remote_icons.h" #include "views/remote.h" #include "views/edit_menu.h" From ce89240f6f41ce725421794ad71b99471be0a4d1 Mon Sep 17 00:00:00 2001 From: Linn Dahlgren Date: Mon, 4 Sep 2023 05:37:12 +0200 Subject: [PATCH 2/7] [DOC] Remove defunct link in ReadMe.md (#3036) --- ReadMe.md | 1 - 1 file changed, 1 deletion(-) diff --git a/ReadMe.md b/ReadMe.md index dcf39c3ae..387ac2de7 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -95,7 +95,6 @@ Make sure your Flipper is on, and your firmware is functioning. Connect your Fli - [Hardware combos and Un-bricking](/documentation/KeyCombo.md) - recovering your Flipper from the most nasty situations - [Flipper File Formats](/documentation/file_formats) - everything about how Flipper stores your data and how you can work with it - [Universal Remotes](/documentation/UniversalRemotes.md) - contributing your infrared remote to the universal remote database -- [Firmware Roadmap](/documentation/RoadMap.md) - And much more in the [documentation](/documentation) folder # Project structure From 0b806c23600ebe3c179f92e0883448e4e46950bd Mon Sep 17 00:00:00 2001 From: Sergey Gavrilov Date: Mon, 4 Sep 2023 08:10:07 +0300 Subject: [PATCH 3/7] Storage: force mount (#3033) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Storage: count opened files * Storage: sd mount * Storage: prompt to mount SD card if not mounted * F18: update API * F18: update API version * Fix logger naming scheme * Storage: storage_files_count -> storage_open_files_count Co-authored-by: あく --- .../debug/unit_tests/subghz/subghz_test.c | 2 +- .../drivers/subghz/cc1101_ext/cc1101_ext.c | 2 +- .../cc1101_ext/cc1101_ext_interconnect.c | 2 +- .../example_apps_assets/example_apps_assets.c | 2 +- .../example_apps_data/example_apps_data.c | 2 +- .../example_plugins/example_plugins.c | 2 +- .../example_plugins/example_plugins_multi.c | 2 +- .../example_advanced_plugins.c | 2 +- .../main/bad_usb/helpers/ducky_script.c | 2 +- .../bad_usb/helpers/ducky_script_commands.c | 2 +- applications/main/ibutton/ibutton.c | 2 +- .../subghz/scenes/subghz_scene_read_raw.c | 2 +- applications/main/subghz/subghz_cli.c | 2 +- .../main/subghz/views/subghz_read_raw.c | 2 +- applications/main/u2f/u2f.c | 2 +- applications/main/u2f/u2f_data.c | 2 +- applications/main/u2f/u2f_hid.c | 2 +- applications/services/storage/storage.c | 2 +- applications/services/storage/storage.h | 10 +++- .../services/storage/storage_external_api.c | 10 +++- applications/services/storage/storage_glue.c | 7 +++ applications/services/storage/storage_glue.h | 2 + .../services/storage/storage_message.h | 1 + .../services/storage/storage_processing.c | 41 +++++++++++++--- .../services/storage/storages/storage_ext.c | 47 +++++++++++-------- .../services/storage/storages/storage_ext.h | 1 + .../scenes/storage_settings_scene_start.c | 24 +++++++--- .../storage_settings_scene_unmount_confirm.c | 14 ++++-- .../scenes/storage_settings_scene_unmounted.c | 41 +++++++++++----- .../updater/util/update_task_worker_flasher.c | 2 +- firmware/targets/f18/api_symbols.csv | 3 +- firmware/targets/f7/api_symbols.csv | 3 +- firmware/targets/f7/furi_hal/furi_hal_i2c.c | 2 +- .../api_hashtable/api_hashtable.cpp | 2 +- lib/flipper_application/application_assets.c | 2 +- lib/flipper_application/elf/elf_file.c | 2 +- .../plugins/plugin_manager.c | 2 +- lib/lfrfid/lfrfid_raw_file.c | 2 +- lib/lfrfid/lfrfid_raw_worker.c | 2 +- lib/lfrfid/lfrfid_worker_modes.c | 2 +- lib/nfc/protocols/slix.c | 2 +- .../cc1101_int/cc1101_int_interconnect.c | 2 +- lib/subghz/protocols/alutech_at_4n.c | 2 +- lib/subghz/protocols/bett.c | 2 +- lib/subghz/protocols/bin_raw.c | 2 +- lib/subghz/protocols/came.c | 2 +- lib/subghz/protocols/came_twee.c | 2 +- lib/subghz/protocols/chamberlain_code.c | 2 +- lib/subghz/protocols/faac_slh.c | 2 +- lib/subghz/protocols/holtek_ht12x.c | 2 +- lib/subghz/protocols/honeywell_wdb.c | 2 +- lib/subghz/protocols/hormann.c | 2 +- lib/subghz/protocols/ido.c | 2 +- lib/subghz/protocols/kia.c | 2 +- lib/subghz/protocols/kinggates_stylo_4k.c | 2 +- lib/subghz/protocols/nice_flo.c | 2 +- lib/subghz/protocols/phoenix_v2.c | 2 +- lib/subghz/protocols/raw.c | 2 +- lib/subghz/protocols/secplus_v1.c | 2 +- lib/subghz/protocols/secplus_v2.c | 2 +- lib/subghz/protocols/smc5326.c | 2 +- 61 files changed, 201 insertions(+), 99 deletions(-) diff --git a/applications/debug/unit_tests/subghz/subghz_test.c b/applications/debug/unit_tests/subghz/subghz_test.c index e32a57482..1900f2045 100644 --- a/applications/debug/unit_tests/subghz/subghz_test.c +++ b/applications/debug/unit_tests/subghz/subghz_test.c @@ -10,7 +10,7 @@ #include #include -#define TAG "SubGhz TEST" +#define TAG "SubGhzTest" #define KEYSTORE_DIR_NAME EXT_PATH("subghz/assets/keeloq_mfcodes") #define CAME_ATOMO_DIR_NAME EXT_PATH("subghz/assets/came_atomo") #define NICE_FLOR_S_DIR_NAME EXT_PATH("subghz/assets/nice_flor_s") diff --git a/applications/drivers/subghz/cc1101_ext/cc1101_ext.c b/applications/drivers/subghz/cc1101_ext/cc1101_ext.c index 0a9599d03..4fb249c6d 100644 --- a/applications/drivers/subghz/cc1101_ext/cc1101_ext.c +++ b/applications/drivers/subghz/cc1101_ext/cc1101_ext.c @@ -16,7 +16,7 @@ #include #include -#define TAG "SubGhz_Device_CC1101_Ext" +#define TAG "SubGhzDeviceCc1101Ext" #define SUBGHZ_DEVICE_CC1101_EXT_TX_GPIO &gpio_ext_pb2 diff --git a/applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.c b/applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.c index 51f5a0d1d..1f1193154 100644 --- a/applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.c +++ b/applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.c @@ -2,7 +2,7 @@ #include "cc1101_ext.h" #include -#define TAG "SubGhzDeviceCC1101Ext" +#define TAG "SubGhzDeviceCc1101Ext" static bool subghz_device_cc1101_ext_interconnect_is_frequency_valid(uint32_t frequency) { bool ret = subghz_device_cc1101_ext_is_frequency_valid(frequency); diff --git a/applications/examples/example_apps_assets/example_apps_assets.c b/applications/examples/example_apps_assets/example_apps_assets.c index f2d0272f0..2c2cc8a87 100644 --- a/applications/examples/example_apps_assets/example_apps_assets.c +++ b/applications/examples/example_apps_assets/example_apps_assets.c @@ -4,7 +4,7 @@ #include // Define log tag -#define TAG "example_apps_assets" +#define TAG "ExampleAppsAssets" static void example_apps_data_print_file_content(Storage* storage, const char* path) { Stream* stream = file_stream_alloc(storage); diff --git a/applications/examples/example_apps_data/example_apps_data.c b/applications/examples/example_apps_data/example_apps_data.c index d6104c137..7a297b01c 100644 --- a/applications/examples/example_apps_data/example_apps_data.c +++ b/applications/examples/example_apps_data/example_apps_data.c @@ -2,7 +2,7 @@ #include // Define log tag -#define TAG "example_apps_data" +#define TAG "ExampleAppsData" // Application entry point int32_t example_apps_data_main(void* p) { diff --git a/applications/examples/example_plugins/example_plugins.c b/applications/examples/example_plugins/example_plugins.c index acc5903ad..7e71e0d2e 100644 --- a/applications/examples/example_plugins/example_plugins.c +++ b/applications/examples/example_plugins/example_plugins.c @@ -11,7 +11,7 @@ #include #include -#define TAG "example_plugins" +#define TAG "ExamplePlugins" int32_t example_plugins_app(void* p) { UNUSED(p); diff --git a/applications/examples/example_plugins/example_plugins_multi.c b/applications/examples/example_plugins/example_plugins_multi.c index 12eba01c1..3525b39ea 100644 --- a/applications/examples/example_plugins/example_plugins_multi.c +++ b/applications/examples/example_plugins/example_plugins_multi.c @@ -11,7 +11,7 @@ #include -#define TAG "example_plugins" +#define TAG "ExamplePlugins" int32_t example_plugins_multi_app(void* p) { UNUSED(p); diff --git a/applications/examples/example_plugins_advanced/example_advanced_plugins.c b/applications/examples/example_plugins_advanced/example_advanced_plugins.c index f27b0a084..2b137e1d4 100644 --- a/applications/examples/example_plugins_advanced/example_advanced_plugins.c +++ b/applications/examples/example_plugins_advanced/example_advanced_plugins.c @@ -8,7 +8,7 @@ #include -#define TAG "example_advanced_plugins" +#define TAG "ExampleAdvancedPlugins" int32_t example_advanced_plugins_app(void* p) { UNUSED(p); diff --git a/applications/main/bad_usb/helpers/ducky_script.c b/applications/main/bad_usb/helpers/ducky_script.c index f194178a0..11c74c010 100644 --- a/applications/main/bad_usb/helpers/ducky_script.c +++ b/applications/main/bad_usb/helpers/ducky_script.c @@ -9,7 +9,7 @@ #include "ducky_script_i.h" #include -#define TAG "BadUSB" +#define TAG "BadUsb" #define WORKER_TAG TAG "Worker" #define BADUSB_ASCII_TO_KEY(script, x) \ diff --git a/applications/main/bad_usb/helpers/ducky_script_commands.c b/applications/main/bad_usb/helpers/ducky_script_commands.c index d073b4c8d..cc713135e 100644 --- a/applications/main/bad_usb/helpers/ducky_script_commands.c +++ b/applications/main/bad_usb/helpers/ducky_script_commands.c @@ -171,7 +171,7 @@ static const DuckyCmd ducky_commands[] = { {"WAIT_FOR_BUTTON_PRESS", ducky_fnc_waitforbutton, -1}, }; -#define TAG "BadUSB" +#define TAG "BadUsb" #define WORKER_TAG TAG "Worker" int32_t ducky_execute_cmd(BadUsbScript* bad_usb, const char* line) { diff --git a/applications/main/ibutton/ibutton.c b/applications/main/ibutton/ibutton.c index 67873690c..0e4c621b2 100644 --- a/applications/main/ibutton/ibutton.c +++ b/applications/main/ibutton/ibutton.c @@ -3,7 +3,7 @@ #include #include -#define TAG "iButtonApp" +#define TAG "IButtonApp" static const NotificationSequence sequence_blink_set_yellow = { &message_blink_set_color_yellow, diff --git a/applications/main/subghz/scenes/subghz_scene_read_raw.c b/applications/main/subghz/scenes/subghz_scene_read_raw.c index bbcc43256..f2ab65770 100644 --- a/applications/main/subghz/scenes/subghz_scene_read_raw.c +++ b/applications/main/subghz/scenes/subghz_scene_read_raw.c @@ -5,7 +5,7 @@ #include #define RAW_FILE_NAME "Raw_signal_" -#define TAG "SubGhzSceneReadRAW" +#define TAG "SubGhzSceneReadRaw" bool subghz_scene_read_raw_update_filename(SubGhz* subghz) { bool ret = false; diff --git a/applications/main/subghz/subghz_cli.c b/applications/main/subghz/subghz_cli.c index fe97c8a06..f7d6b3a1c 100644 --- a/applications/main/subghz/subghz_cli.c +++ b/applications/main/subghz/subghz_cli.c @@ -28,7 +28,7 @@ #define SUBGHZ_REGION_FILENAME "/int/.region_data" -#define TAG "SubGhz CLI" +#define TAG "SubGhzCli" static void subghz_cli_radio_device_power_on() { uint8_t attempts = 5; diff --git a/applications/main/subghz/views/subghz_read_raw.c b/applications/main/subghz/views/subghz_read_raw.c index 88ac129ca..b074cdc9f 100644 --- a/applications/main/subghz/views/subghz_read_raw.c +++ b/applications/main/subghz/views/subghz_read_raw.c @@ -9,7 +9,7 @@ #include #define SUBGHZ_READ_RAW_RSSI_HISTORY_SIZE 100 -#define TAG "SubGhzReadRAW" +#define TAG "SubGhzReadRaw" struct SubGhzReadRAW { View* view; diff --git a/applications/main/u2f/u2f.c b/applications/main/u2f/u2f.c index 0ed5ebb29..ce70212a9 100644 --- a/applications/main/u2f/u2f.c +++ b/applications/main/u2f/u2f.c @@ -10,7 +10,7 @@ #include "hmac_sha256.h" #include "micro-ecc/uECC.h" -#define TAG "U2F" +#define TAG "U2f" #define WORKER_TAG TAG "Worker" #define U2F_CMD_REGISTER 0x01 diff --git a/applications/main/u2f/u2f_data.c b/applications/main/u2f/u2f_data.c index 8489ed91e..34360f3d6 100644 --- a/applications/main/u2f/u2f_data.c +++ b/applications/main/u2f/u2f_data.c @@ -5,7 +5,7 @@ #include #include -#define TAG "U2F" +#define TAG "U2f" #define U2F_DATA_FOLDER EXT_PATH("u2f/") #define U2F_CERT_FILE U2F_DATA_FOLDER "assets/cert.der" diff --git a/applications/main/u2f/u2f_hid.c b/applications/main/u2f/u2f_hid.c index 9b625c1f3..d7d7e6cf4 100644 --- a/applications/main/u2f/u2f_hid.c +++ b/applications/main/u2f/u2f_hid.c @@ -10,7 +10,7 @@ #include -#define TAG "U2FHID" +#define TAG "U2fHid" #define WORKER_TAG TAG "Worker" #define U2F_HID_MAX_PAYLOAD_LEN ((HID_U2F_PACKET_LEN - 7) + 128 * (HID_U2F_PACKET_LEN - 5)) diff --git a/applications/services/storage/storage.c b/applications/services/storage/storage.c index 1816bf921..a6229af81 100644 --- a/applications/services/storage/storage.c +++ b/applications/services/storage/storage.c @@ -12,7 +12,7 @@ #define ICON_SD_MOUNTED &I_SDcardMounted_11x8 #define ICON_SD_ERROR &I_SDcardFail_11x8 -#define TAG RECORD_STORAGE +#define TAG "Storage" static void storage_app_sd_icon_draw_callback(Canvas* canvas, void* context) { furi_assert(canvas); diff --git a/applications/services/storage/storage.h b/applications/services/storage/storage.h index dccf29592..1abc8ed0e 100644 --- a/applications/services/storage/storage.h +++ b/applications/services/storage/storage.h @@ -334,12 +334,20 @@ const char* storage_file_get_error_desc(File* file); */ FS_Error storage_sd_format(Storage* api); -/** Will unmount the SD card +/** Will unmount the SD card. + * Will return FSE_NOT_READY if the SD card is not mounted. + * Will return FSE_DENIED if there are open files on the SD card. * @param api pointer to the api * @return FS_Error operation result */ FS_Error storage_sd_unmount(Storage* api); +/** Will mount the SD card + * @param api pointer to the api + * @return FS_Error operation result + */ +FS_Error storage_sd_mount(Storage* api); + /** Retrieves SD card information * @param api pointer to the api * @param info pointer to the info diff --git a/applications/services/storage/storage_external_api.c b/applications/services/storage/storage_external_api.c index 585ded414..2ba58f9c6 100644 --- a/applications/services/storage/storage_external_api.c +++ b/applications/services/storage/storage_external_api.c @@ -11,7 +11,7 @@ #define MAX_EXT_LEN 16 #define FILE_BUFFER_SIZE 512 -#define TAG "StorageAPI" +#define TAG "StorageApi" #define S_API_PROLOGUE FuriApiLock lock = api_lock_alloc_locked(); @@ -781,6 +781,14 @@ FS_Error storage_sd_unmount(Storage* storage) { return S_RETURN_ERROR; } +FS_Error storage_sd_mount(Storage* storage) { + S_API_PROLOGUE; + SAData data = {}; + S_API_MESSAGE(StorageCommandSDMount); + S_API_EPILOGUE; + return S_RETURN_ERROR; +} + FS_Error storage_sd_info(Storage* storage, SDInfo* info) { S_API_PROLOGUE; SAData data = { diff --git a/applications/services/storage/storage_glue.c b/applications/services/storage/storage_glue.c index 63e44c9d7..41da6c3f4 100644 --- a/applications/services/storage/storage_glue.c +++ b/applications/services/storage/storage_glue.c @@ -1,6 +1,8 @@ #include "storage_glue.h" #include +#define TAG "StorageGlue" + /****************** storage file ******************/ void storage_file_init(StorageFile* obj) { @@ -149,3 +151,8 @@ bool storage_pop_storage_file(File* file, StorageData* storage) { return result; } + +size_t storage_open_files_count(StorageData* storage) { + size_t count = StorageFileList_size(storage->files); + return count; +} diff --git a/applications/services/storage/storage_glue.h b/applications/services/storage/storage_glue.h index f10640345..4323296cf 100644 --- a/applications/services/storage/storage_glue.h +++ b/applications/services/storage/storage_glue.h @@ -68,6 +68,8 @@ void* storage_get_storage_file_data(const File* file, StorageData* storage); void storage_push_storage_file(File* file, FuriString* path, StorageData* storage); bool storage_pop_storage_file(File* file, StorageData* storage); +size_t storage_open_files_count(StorageData* storage); + #ifdef __cplusplus } #endif diff --git a/applications/services/storage/storage_message.h b/applications/services/storage/storage_message.h index 9e13bf83d..01bc20380 100644 --- a/applications/services/storage/storage_message.h +++ b/applications/services/storage/storage_message.h @@ -141,6 +141,7 @@ typedef enum { StorageCommandSDInfo, StorageCommandSDStatus, StorageCommandCommonResolvePath, + StorageCommandSDMount, } StorageCommand; typedef struct { diff --git a/applications/services/storage/storage_processing.c b/applications/services/storage/storage_processing.c index 70cb7b92f..00126af6f 100644 --- a/applications/services/storage/storage_processing.c +++ b/applications/services/storage/storage_processing.c @@ -418,12 +418,38 @@ static FS_Error storage_process_sd_format(Storage* app) { static FS_Error storage_process_sd_unmount(Storage* app) { FS_Error ret = FSE_OK; - if(storage_data_status(&app->storage[ST_EXT]) == StorageStatusNotReady) { - ret = FSE_NOT_READY; - } else { - sd_unmount_card(&app->storage[ST_EXT]); - storage_data_timestamp(&app->storage[ST_EXT]); - } + do { + StorageData* storage = &app->storage[ST_EXT]; + if(storage_data_status(storage) == StorageStatusNotReady) { + ret = FSE_NOT_READY; + break; + } + + if(storage_open_files_count(storage)) { + ret = FSE_DENIED; + break; + } + + sd_unmount_card(storage); + storage_data_timestamp(storage); + } while(false); + + return ret; +} + +static FS_Error storage_process_sd_mount(Storage* app) { + FS_Error ret = FSE_OK; + + do { + StorageData* storage = &app->storage[ST_EXT]; + if(storage_data_status(storage) != StorageStatusNotReady) { + ret = FSE_NOT_READY; + break; + } + + ret = sd_mount_card(storage, true); + storage_data_timestamp(storage); + } while(false); return ret; } @@ -630,6 +656,9 @@ void storage_process_message_internal(Storage* app, StorageMessage* message) { case StorageCommandSDUnmount: message->return_data->error_value = storage_process_sd_unmount(app); break; + case StorageCommandSDMount: + message->return_data->error_value = storage_process_sd_mount(app); + break; case StorageCommandSDInfo: message->return_data->error_value = storage_process_sd_info(app, message->data->sdinfo.info); diff --git a/applications/services/storage/storages/storage_ext.c b/applications/services/storage/storages/storage_ext.c index 35b3ee253..080ac4faf 100644 --- a/applications/services/storage/storages/storage_ext.c +++ b/applications/services/storage/storages/storage_ext.c @@ -24,7 +24,7 @@ static FS_Error storage_ext_parse_error(SDError error); /******************* Core Functions *******************/ -static bool sd_mount_card(StorageData* storage, bool notify) { +static bool sd_mount_card_internal(StorageData* storage, bool notify) { bool result = false; uint8_t counter = sd_max_mount_retry_count(); uint8_t bsp_result; @@ -106,6 +106,32 @@ FS_Error sd_unmount_card(StorageData* storage) { return storage_ext_parse_error(error); } +FS_Error sd_mount_card(StorageData* storage, bool notify) { + sd_mount_card_internal(storage, notify); + FS_Error error; + + if(storage->status != StorageStatusOK) { + FURI_LOG_E(TAG, "sd init error: %s", storage_data_status_text(storage)); + if(notify) { + NotificationApp* notification = furi_record_open(RECORD_NOTIFICATION); + sd_notify_error(notification); + furi_record_close(RECORD_NOTIFICATION); + } + error = FSE_INTERNAL; + } else { + FURI_LOG_I(TAG, "card mounted"); + if(notify) { + NotificationApp* notification = furi_record_open(RECORD_NOTIFICATION); + sd_notify_success(notification); + furi_record_close(RECORD_NOTIFICATION); + } + + error = FSE_OK; + } + + return error; +} + FS_Error sd_format_card(StorageData* storage) { #ifdef FURI_RAM_EXEC UNUSED(storage); @@ -222,25 +248,8 @@ static void storage_ext_tick_internal(StorageData* storage, bool notify) { if(sd_data->sd_was_present) { if(hal_sd_detect()) { FURI_LOG_I(TAG, "card detected"); - sd_mount_card(storage, notify); - - if(storage->status != StorageStatusOK) { - FURI_LOG_E(TAG, "sd init error: %s", storage_data_status_text(storage)); - if(notify) { - NotificationApp* notification = furi_record_open(RECORD_NOTIFICATION); - sd_notify_error(notification); - furi_record_close(RECORD_NOTIFICATION); - } - } else { - FURI_LOG_I(TAG, "card mounted"); - if(notify) { - NotificationApp* notification = furi_record_open(RECORD_NOTIFICATION); - sd_notify_success(notification); - furi_record_close(RECORD_NOTIFICATION); - } - } - sd_data->sd_was_present = false; + sd_mount_card(storage, notify); if(!hal_sd_detect()) { FURI_LOG_I(TAG, "card removed while mounting"); diff --git a/applications/services/storage/storages/storage_ext.h b/applications/services/storage/storages/storage_ext.h index 07ddbcf2f..18d1f7143 100644 --- a/applications/services/storage/storages/storage_ext.h +++ b/applications/services/storage/storages/storage_ext.h @@ -8,6 +8,7 @@ extern "C" { #endif void storage_ext_init(StorageData* storage); +FS_Error sd_mount_card(StorageData* storage, bool notify); FS_Error sd_unmount_card(StorageData* storage); FS_Error sd_format_card(StorageData* storage); FS_Error sd_card_info(StorageData* storage, SDInfo* sd_info); diff --git a/applications/settings/storage_settings/scenes/storage_settings_scene_start.c b/applications/settings/storage_settings/scenes/storage_settings_scene_start.c index 9f41061b8..0e667024f 100644 --- a/applications/settings/storage_settings/scenes/storage_settings_scene_start.c +++ b/applications/settings/storage_settings/scenes/storage_settings_scene_start.c @@ -31,12 +31,24 @@ void storage_settings_scene_start_on_enter(void* context) { StorageSettingsStartSubmenuIndexSDInfo, storage_settings_scene_start_submenu_callback, app); - submenu_add_item( - submenu, - "Unmount SD Card", - StorageSettingsStartSubmenuIndexUnmount, - storage_settings_scene_start_submenu_callback, - app); + + FS_Error sd_status = storage_sd_status(app->fs_api); + if(sd_status != FSE_OK) { + submenu_add_item( + submenu, + "Mount SD Card", + StorageSettingsStartSubmenuIndexUnmount, + storage_settings_scene_start_submenu_callback, + app); + } else { + submenu_add_item( + submenu, + "Unmount SD Card", + StorageSettingsStartSubmenuIndexUnmount, + storage_settings_scene_start_submenu_callback, + app); + } + submenu_add_item( submenu, "Format SD Card", diff --git a/applications/settings/storage_settings/scenes/storage_settings_scene_unmount_confirm.c b/applications/settings/storage_settings/scenes/storage_settings_scene_unmount_confirm.c index 0c15116be..1b9970f9f 100644 --- a/applications/settings/storage_settings/scenes/storage_settings_scene_unmount_confirm.c +++ b/applications/settings/storage_settings/scenes/storage_settings_scene_unmount_confirm.c @@ -12,13 +12,17 @@ void storage_settings_scene_unmount_confirm_on_enter(void* context) { DialogEx* dialog_ex = app->dialog_ex; FS_Error sd_status = storage_sd_status(app->fs_api); - if(sd_status == FSE_NOT_READY) { - dialog_ex_set_icon(dialog_ex, 72, 17, &I_DolphinCommon_56x48); - dialog_ex_set_header(dialog_ex, "SD Card Not Mounted", 64, 3, AlignCenter, AlignTop); + dialog_ex_set_header(dialog_ex, "Mount SD Card?", 64, 10, AlignCenter, AlignCenter); dialog_ex_set_text( - dialog_ex, "Try to reinsert\nor format SD\ncard.", 3, 19, AlignLeft, AlignTop); - dialog_ex_set_center_button_text(dialog_ex, "Ok"); + dialog_ex, + "This may turn off power\nfor external modules", + 64, + 32, + AlignCenter, + AlignCenter); + dialog_ex_set_left_button_text(dialog_ex, "Cancel"); + dialog_ex_set_right_button_text(dialog_ex, "Mount"); } else { dialog_ex_set_header(dialog_ex, "Unmount SD Card?", 64, 10, AlignCenter, AlignCenter); dialog_ex_set_text( diff --git a/applications/settings/storage_settings/scenes/storage_settings_scene_unmounted.c b/applications/settings/storage_settings/scenes/storage_settings_scene_unmounted.c index 486f07603..33bb95522 100644 --- a/applications/settings/storage_settings/scenes/storage_settings_scene_unmounted.c +++ b/applications/settings/storage_settings/scenes/storage_settings_scene_unmounted.c @@ -9,22 +9,41 @@ static void void storage_settings_scene_unmounted_on_enter(void* context) { StorageSettings* app = context; - FS_Error error = storage_sd_unmount(app->fs_api); DialogEx* dialog_ex = app->dialog_ex; + FS_Error sd_status = storage_sd_status(app->fs_api); + if(sd_status == FSE_NOT_READY) { + FS_Error error = storage_sd_mount(app->fs_api); + if(error == FSE_OK) { + dialog_ex_set_header(dialog_ex, "SD Card Mounted", 64, 3, AlignCenter, AlignTop); + dialog_ex_set_text( + dialog_ex, "Flipper can use\nSD card now.", 3, 22, AlignLeft, AlignTop); + notification_message(app->notification, &sequence_blink_green_100); + } else { + dialog_ex_set_header(dialog_ex, "Cannot Mount SD Card", 64, 3, AlignCenter, AlignTop); + dialog_ex_set_text( + dialog_ex, storage_error_get_desc(error), 3, 22, AlignLeft, AlignTop); + notification_message(app->notification, &sequence_blink_red_100); + } + } else { + FS_Error error = storage_sd_unmount(app->fs_api); + if(error == FSE_OK) { + dialog_ex_set_header(dialog_ex, "SD Card Unmounted", 64, 3, AlignCenter, AlignTop); + dialog_ex_set_text( + dialog_ex, "You can remove\nSD card now.", 3, 22, AlignLeft, AlignTop); + notification_message(app->notification, &sequence_blink_green_100); + } else { + dialog_ex_set_header( + dialog_ex, "Cannot Unmount SD Card", 64, 3, AlignCenter, AlignTop); + dialog_ex_set_text( + dialog_ex, storage_error_get_desc(error), 3, 22, AlignLeft, AlignTop); + notification_message(app->notification, &sequence_blink_red_100); + } + } + dialog_ex_set_center_button_text(dialog_ex, "OK"); dialog_ex_set_icon(dialog_ex, 72, 17, &I_DolphinCommon_56x48); - if(error == FSE_OK) { - dialog_ex_set_header(dialog_ex, "SD Card Unmounted", 64, 3, AlignCenter, AlignTop); - dialog_ex_set_text(dialog_ex, "You can remove\nSD card now.", 3, 22, AlignLeft, AlignTop); - notification_message(app->notification, &sequence_blink_green_100); - } else { - dialog_ex_set_header(dialog_ex, "Cannot Unmount SD Card", 64, 3, AlignCenter, AlignTop); - dialog_ex_set_text(dialog_ex, storage_error_get_desc(error), 3, 22, AlignLeft, AlignTop); - notification_message(app->notification, &sequence_blink_red_100); - } - dialog_ex_set_context(dialog_ex, app); dialog_ex_set_result_callback(dialog_ex, storage_settings_scene_unmounted_dialog_callback); diff --git a/applications/system/updater/util/update_task_worker_flasher.c b/applications/system/updater/util/update_task_worker_flasher.c index d6dc13e37..c56031992 100644 --- a/applications/system/updater/util/update_task_worker_flasher.c +++ b/applications/system/updater/util/update_task_worker_flasher.c @@ -11,7 +11,7 @@ #include #include -#define TAG "UpdWorkerRAM" +#define TAG "UpdWorkerRam" #define STM_DFU_VENDOR_ID 0x0483 #define STM_DFU_PRODUCT_ID 0xDF11 diff --git a/firmware/targets/f18/api_symbols.csv b/firmware/targets/f18/api_symbols.csv index a26db8823..52f9a4d90 100644 --- a/firmware/targets/f18/api_symbols.csv +++ b/firmware/targets/f18/api_symbols.csv @@ -1,5 +1,5 @@ entry,status,name,type,params -Version,+,36.0,, +Version,+,36.1,, Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/cli/cli.h,, Header,+,applications/services/cli/cli_vcp.h,, @@ -2002,6 +2002,7 @@ Function,+,storage_int_backup,FS_Error,"Storage*, const char*" Function,+,storage_int_restore,FS_Error,"Storage*, const char*, Storage_name_converter" Function,+,storage_sd_format,FS_Error,Storage* Function,+,storage_sd_info,FS_Error,"Storage*, SDInfo*" +Function,+,storage_sd_mount,FS_Error,Storage* Function,+,storage_sd_status,FS_Error,Storage* Function,+,storage_sd_unmount,FS_Error,Storage* Function,+,storage_simply_mkdir,_Bool,"Storage*, const char*" diff --git a/firmware/targets/f7/api_symbols.csv b/firmware/targets/f7/api_symbols.csv index 6ad88d9b8..2222d1702 100644 --- a/firmware/targets/f7/api_symbols.csv +++ b/firmware/targets/f7/api_symbols.csv @@ -1,5 +1,5 @@ entry,status,name,type,params -Version,+,36.0,, +Version,+,36.1,, Header,+,applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h,, Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/cli/cli.h,, @@ -2612,6 +2612,7 @@ Function,+,storage_int_backup,FS_Error,"Storage*, const char*" Function,+,storage_int_restore,FS_Error,"Storage*, const char*, Storage_name_converter" Function,+,storage_sd_format,FS_Error,Storage* Function,+,storage_sd_info,FS_Error,"Storage*, SDInfo*" +Function,+,storage_sd_mount,FS_Error,Storage* Function,+,storage_sd_status,FS_Error,Storage* Function,+,storage_sd_unmount,FS_Error,Storage* Function,+,storage_simply_mkdir,_Bool,"Storage*, const char*" diff --git a/firmware/targets/f7/furi_hal/furi_hal_i2c.c b/firmware/targets/f7/furi_hal/furi_hal_i2c.c index 6c17d6ade..bdfe0b0a3 100644 --- a/firmware/targets/f7/furi_hal/furi_hal_i2c.c +++ b/firmware/targets/f7/furi_hal/furi_hal_i2c.c @@ -8,7 +8,7 @@ #include #include -#define TAG "FuriHalI2C" +#define TAG "FuriHalI2c" void furi_hal_i2c_init_early() { furi_hal_i2c_bus_power.callback(&furi_hal_i2c_bus_power, FuriHalI2cBusEventInit); diff --git a/lib/flipper_application/api_hashtable/api_hashtable.cpp b/lib/flipper_application/api_hashtable/api_hashtable.cpp index 6db5fb5fd..ef22ee9ad 100644 --- a/lib/flipper_application/api_hashtable/api_hashtable.cpp +++ b/lib/flipper_application/api_hashtable/api_hashtable.cpp @@ -3,7 +3,7 @@ #include #include -#define TAG "hashtable_api" +#define TAG "ApiHashtable" bool elf_resolve_from_hashtable( const ElfApiInterface* interface, diff --git a/lib/flipper_application/application_assets.c b/lib/flipper_application/application_assets.c index 083c3ca19..ec3fc22ee 100644 --- a/lib/flipper_application/application_assets.c +++ b/lib/flipper_application/application_assets.c @@ -17,7 +17,7 @@ #define BUFFER_SIZE 512 -#define TAG "fap_assets" +#define TAG "FapAssets" #pragma pack(push, 1) diff --git a/lib/flipper_application/elf/elf_file.c b/lib/flipper_application/elf/elf_file.c index bea7c1231..7ac4c655d 100644 --- a/lib/flipper_application/elf/elf_file.c +++ b/lib/flipper_application/elf/elf_file.c @@ -5,7 +5,7 @@ #include "elf_api_interface.h" #include "../api_hashtable/api_hashtable.h" -#define TAG "elf" +#define TAG "Elf" #define ELF_NAME_BUFFER_LEN 32 #define SECTION_OFFSET(e, n) ((e)->section_table + (n) * sizeof(Elf32_Shdr)) diff --git a/lib/flipper_application/plugins/plugin_manager.c b/lib/flipper_application/plugins/plugin_manager.c index 101471dc5..e2a7b83f4 100644 --- a/lib/flipper_application/plugins/plugin_manager.c +++ b/lib/flipper_application/plugins/plugin_manager.c @@ -9,7 +9,7 @@ #include -#define TAG "libmgr" +#define TAG "PluginManager" ARRAY_DEF(FlipperApplicationList, FlipperApplication*, M_PTR_OPLIST) #define M_OPL_FlipperApplicationList_t() ARRAY_OPLIST(FlipperApplicationList, M_PTR_OPLIST) diff --git a/lib/lfrfid/lfrfid_raw_file.c b/lib/lfrfid/lfrfid_raw_file.c index 27c6f2475..ca29770f1 100644 --- a/lib/lfrfid/lfrfid_raw_file.c +++ b/lib/lfrfid/lfrfid_raw_file.c @@ -6,7 +6,7 @@ #define LFRFID_RAW_FILE_MAGIC 0x4C464952 #define LFRFID_RAW_FILE_VERSION 1 -#define TAG "RFID RAW File" +#define TAG "LfRfidRawFile" typedef struct { uint32_t magic; diff --git a/lib/lfrfid/lfrfid_raw_worker.c b/lib/lfrfid/lfrfid_raw_worker.c index aa962a47d..344c2afa2 100644 --- a/lib/lfrfid/lfrfid_raw_worker.c +++ b/lib/lfrfid/lfrfid_raw_worker.c @@ -10,7 +10,7 @@ #define RFID_DATA_BUFFER_SIZE 2048 #define READ_DATA_BUFFER_COUNT 4 -#define TAG_EMULATE "RAW EMULATE" +#define TAG_EMULATE "RawEmulate" // emulate mode typedef struct { diff --git a/lib/lfrfid/lfrfid_worker_modes.c b/lib/lfrfid/lfrfid_worker_modes.c index 8a2667774..32e253259 100644 --- a/lib/lfrfid/lfrfid_worker_modes.c +++ b/lib/lfrfid/lfrfid_worker_modes.c @@ -7,7 +7,7 @@ #include "tools/varint_pair.h" #include "tools/bit_lib.h" -#define TAG "LFRFIDWorker" +#define TAG "LfRfidWorker" /** * if READ_DEBUG_GPIO is defined: diff --git a/lib/nfc/protocols/slix.c b/lib/nfc/protocols/slix.c index 68937d161..dbff2f218 100644 --- a/lib/nfc/protocols/slix.c +++ b/lib/nfc/protocols/slix.c @@ -7,7 +7,7 @@ #include "furi_hal_nfc.h" #include -#define TAG "SLIX" +#define TAG "Slix" ReturnCode slix2_read_nxp_sysinfo(FuriHalNfcDevData* nfc_data, NfcVData* nfcv_data) { furi_assert(nfc_data); diff --git a/lib/subghz/devices/cc1101_int/cc1101_int_interconnect.c b/lib/subghz/devices/cc1101_int/cc1101_int_interconnect.c index 41a0609df..284c717fd 100644 --- a/lib/subghz/devices/cc1101_int/cc1101_int_interconnect.c +++ b/lib/subghz/devices/cc1101_int/cc1101_int_interconnect.c @@ -2,7 +2,7 @@ #include #include "../cc1101_configs.h" -#define TAG "SubGhzDeviceCC1101Int" +#define TAG "SubGhzDeviceCc1101Int" static bool subghz_device_cc1101_int_interconnect_is_frequency_valid(uint32_t frequency) { bool ret = furi_hal_subghz_is_frequency_valid(frequency); diff --git a/lib/subghz/protocols/alutech_at_4n.c b/lib/subghz/protocols/alutech_at_4n.c index e8bb87055..16c715f80 100644 --- a/lib/subghz/protocols/alutech_at_4n.c +++ b/lib/subghz/protocols/alutech_at_4n.c @@ -5,7 +5,7 @@ #include "../blocks/generic.h" #include "../blocks/math.h" -#define TAG "SubGhzProtocoAlutech_at_4n" +#define TAG "SubGhzProtocoAlutechAt4n" #define SUBGHZ_NO_ALUTECH_AT_4N_RAINBOW_TABLE 0xFFFFFFFF diff --git a/lib/subghz/protocols/bett.c b/lib/subghz/protocols/bett.c index de13472ac..7fce94448 100644 --- a/lib/subghz/protocols/bett.c +++ b/lib/subghz/protocols/bett.c @@ -7,7 +7,7 @@ #include "../blocks/math.h" // protocol BERNER / ELKA / TEDSEN / TELETASTER -#define TAG "SubGhzProtocolBETT" +#define TAG "SubGhzProtocolBett" #define DIP_P 0b11 //(+) #define DIP_O 0b10 //(0) diff --git a/lib/subghz/protocols/bin_raw.c b/lib/subghz/protocols/bin_raw.c index 9509280c2..03f4c5bd4 100644 --- a/lib/subghz/protocols/bin_raw.c +++ b/lib/subghz/protocols/bin_raw.c @@ -9,7 +9,7 @@ #include #include -#define TAG "SubGhzProtocolBinRAW" +#define TAG "SubGhzProtocolBinRaw" //change very carefully, RAM ends at the most inopportune moment #define BIN_RAW_BUF_RAW_SIZE 2048 diff --git a/lib/subghz/protocols/came.c b/lib/subghz/protocols/came.c index 14b2e0101..40ae05bad 100644 --- a/lib/subghz/protocols/came.c +++ b/lib/subghz/protocols/came.c @@ -12,7 +12,7 @@ * */ -#define TAG "SubGhzProtocolCAME" +#define TAG "SubGhzProtocolCame" #define CAME_12_COUNT_BIT 12 #define CAME_24_COUNT_BIT 24 #define PRASTEL_COUNT_BIT 25 diff --git a/lib/subghz/protocols/came_twee.c b/lib/subghz/protocols/came_twee.c index 6fe615813..1d79d2201 100644 --- a/lib/subghz/protocols/came_twee.c +++ b/lib/subghz/protocols/came_twee.c @@ -13,7 +13,7 @@ * */ -#define TAG "SubGhzProtocolCAME_Twee" +#define TAG "SubGhzProtocolCameTwee" #define DIP_PATTERN "%c%c%c%c%c%c%c%c%c%c" #define CNT_TO_DIP(dip) \ diff --git a/lib/subghz/protocols/chamberlain_code.c b/lib/subghz/protocols/chamberlain_code.c index be0877fb5..0dd0d2b0b 100644 --- a/lib/subghz/protocols/chamberlain_code.c +++ b/lib/subghz/protocols/chamberlain_code.c @@ -6,7 +6,7 @@ #include "../blocks/generic.h" #include "../blocks/math.h" -#define TAG "SubGhzProtocolChamb_Code" +#define TAG "SubGhzProtocolChambCode" #define CHAMBERLAIN_CODE_BIT_STOP 0b0001 #define CHAMBERLAIN_CODE_BIT_1 0b0011 diff --git a/lib/subghz/protocols/faac_slh.c b/lib/subghz/protocols/faac_slh.c index d9dd68408..cdee7cd9f 100644 --- a/lib/subghz/protocols/faac_slh.c +++ b/lib/subghz/protocols/faac_slh.c @@ -6,7 +6,7 @@ #include "../blocks/generic.h" #include "../blocks/math.h" -#define TAG "SubGhzProtocolFaacSHL" +#define TAG "SubGhzProtocolFaacShl" static const SubGhzBlockConst subghz_protocol_faac_slh_const = { .te_short = 255, diff --git a/lib/subghz/protocols/holtek_ht12x.c b/lib/subghz/protocols/holtek_ht12x.c index 831f824dd..302b78598 100644 --- a/lib/subghz/protocols/holtek_ht12x.c +++ b/lib/subghz/protocols/holtek_ht12x.c @@ -12,7 +12,7 @@ * */ -#define TAG "SubGhzProtocolHoltek_HT12X" +#define TAG "SubGhzProtocolHoltekHt12x" #define DIP_PATTERN "%c%c%c%c%c%c%c%c" #define CNT_TO_DIP(dip) \ diff --git a/lib/subghz/protocols/honeywell_wdb.c b/lib/subghz/protocols/honeywell_wdb.c index 7fd8d66d6..fcf282201 100644 --- a/lib/subghz/protocols/honeywell_wdb.c +++ b/lib/subghz/protocols/honeywell_wdb.c @@ -6,7 +6,7 @@ #include "../blocks/generic.h" #include "../blocks/math.h" -#define TAG "SubGhzProtocolHoneywellWDB" +#define TAG "SubGhzProtocolHoneywellWdb" /* * diff --git a/lib/subghz/protocols/hormann.c b/lib/subghz/protocols/hormann.c index 4c5c68cc4..fc490e9d1 100644 --- a/lib/subghz/protocols/hormann.c +++ b/lib/subghz/protocols/hormann.c @@ -6,7 +6,7 @@ #include "../blocks/generic.h" #include "../blocks/math.h" -#define TAG "SubGhzProtocolHormannHSM" +#define TAG "SubGhzProtocolHormannHsm" #define HORMANN_HSM_PATTERN 0xFF000000003 diff --git a/lib/subghz/protocols/ido.c b/lib/subghz/protocols/ido.c index 90c0fb0e3..e96e6566b 100644 --- a/lib/subghz/protocols/ido.c +++ b/lib/subghz/protocols/ido.c @@ -6,7 +6,7 @@ #include "../blocks/generic.h" #include "../blocks/math.h" -#define TAG "SubGhzProtocol_iDo_117/111" +#define TAG "SubGhzProtocolIdo117/111" static const SubGhzBlockConst subghz_protocol_ido_const = { .te_short = 450, diff --git a/lib/subghz/protocols/kia.c b/lib/subghz/protocols/kia.c index 1d134f7ba..9b63271b4 100644 --- a/lib/subghz/protocols/kia.c +++ b/lib/subghz/protocols/kia.c @@ -6,7 +6,7 @@ #include "../blocks/generic.h" #include "../blocks/math.h" -#define TAG "SubGhzProtocoKIA" +#define TAG "SubGhzProtocoKia" static const SubGhzBlockConst subghz_protocol_kia_const = { .te_short = 250, diff --git a/lib/subghz/protocols/kinggates_stylo_4k.c b/lib/subghz/protocols/kinggates_stylo_4k.c index cd027b99c..0b2a102c4 100644 --- a/lib/subghz/protocols/kinggates_stylo_4k.c +++ b/lib/subghz/protocols/kinggates_stylo_4k.c @@ -8,7 +8,7 @@ #include "../blocks/generic.h" #include "../blocks/math.h" -#define TAG "SubGhzProtocoKingGates_stylo_4k" +#define TAG "SubGhzProtocoKingGatesStylo4k" static const SubGhzBlockConst subghz_protocol_kinggates_stylo_4k_const = { .te_short = 400, diff --git a/lib/subghz/protocols/nice_flo.c b/lib/subghz/protocols/nice_flo.c index af81d9f90..f60e07fb8 100644 --- a/lib/subghz/protocols/nice_flo.c +++ b/lib/subghz/protocols/nice_flo.c @@ -5,7 +5,7 @@ #include "../blocks/generic.h" #include "../blocks/math.h" -#define TAG "SubGhzProtocolNiceFLO" +#define TAG "SubGhzProtocolNiceFlo" static const SubGhzBlockConst subghz_protocol_nice_flo_const = { .te_short = 700, diff --git a/lib/subghz/protocols/phoenix_v2.c b/lib/subghz/protocols/phoenix_v2.c index 4ed9766ef..2416a9d01 100644 --- a/lib/subghz/protocols/phoenix_v2.c +++ b/lib/subghz/protocols/phoenix_v2.c @@ -6,7 +6,7 @@ #include "../blocks/generic.h" #include "../blocks/math.h" -#define TAG "SubGhzProtocolPhoenix_V2" +#define TAG "SubGhzProtocolPhoenixV2" //transmission only static mode diff --git a/lib/subghz/protocols/raw.c b/lib/subghz/protocols/raw.c index 4a8ae1d5e..95dff3093 100644 --- a/lib/subghz/protocols/raw.c +++ b/lib/subghz/protocols/raw.c @@ -11,7 +11,7 @@ #include #include -#define TAG "SubGhzProtocolRAW" +#define TAG "SubGhzProtocolRaw" #define SUBGHZ_DOWNLOAD_MAX_SIZE 512 static const SubGhzBlockConst subghz_protocol_raw_const = { diff --git a/lib/subghz/protocols/secplus_v1.c b/lib/subghz/protocols/secplus_v1.c index 783351c6b..644b2fba9 100644 --- a/lib/subghz/protocols/secplus_v1.c +++ b/lib/subghz/protocols/secplus_v1.c @@ -11,7 +11,7 @@ * https://github.com/merbanan/rtl_433/blob/master/src/devices/secplus_v1.c */ -#define TAG "SubGhzProtocoSecPlus_v1" +#define TAG "SubGhzProtocoSecPlusV1" #define SECPLUS_V1_BIT_ERR -1 //0b0000 #define SECPLUS_V1_BIT_0 0 //0b0001 diff --git a/lib/subghz/protocols/secplus_v2.c b/lib/subghz/protocols/secplus_v2.c index 12d2fac74..374c407b0 100644 --- a/lib/subghz/protocols/secplus_v2.c +++ b/lib/subghz/protocols/secplus_v2.c @@ -13,7 +13,7 @@ * https://github.com/merbanan/rtl_433/blob/master/src/devices/secplus_v2.c */ -#define TAG "SubGhzProtocoSecPlus_v2" +#define TAG "SubGhzProtocoSecPlusV2" #define SECPLUS_V2_HEADER 0x3C0000000000 #define SECPLUS_V2_HEADER_MASK 0xFFFF3C0000000000 diff --git a/lib/subghz/protocols/smc5326.c b/lib/subghz/protocols/smc5326.c index bfb36b76a..0b9755b8c 100644 --- a/lib/subghz/protocols/smc5326.c +++ b/lib/subghz/protocols/smc5326.c @@ -12,7 +12,7 @@ * */ -#define TAG "SubGhzProtocolSMC5326" +#define TAG "SubGhzProtocolSmc5326" #define DIP_P 0b11 //(+) #define DIP_O 0b10 //(0) From 2b383ebcee19199988b2c26fed10906d3f3bdd47 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Mon, 4 Sep 2023 21:19:35 +0300 Subject: [PATCH 4/7] Keyboard ok to toggle select all in cursor mode by Willy-JL --- applications/services/gui/modules/text_input.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/applications/services/gui/modules/text_input.c b/applications/services/gui/modules/text_input.c index 446730e95..ab5bc5b41 100644 --- a/applications/services/gui/modules/text_input.c +++ b/applications/services/gui/modules/text_input.c @@ -325,6 +325,7 @@ static void text_input_handle_down(TextInput* text_input, TextInputModel* model) static void text_input_handle_left(TextInput* text_input, TextInputModel* model) { UNUSED(text_input); if(model->cursor_select) { + model->clear_default_text = false; if(model->cursor_pos > 0) { model->cursor_pos = CLAMP(model->cursor_pos - 1, strlen(model->text_buffer), 0u); } @@ -338,6 +339,7 @@ static void text_input_handle_left(TextInput* text_input, TextInputModel* model) static void text_input_handle_right(TextInput* text_input, TextInputModel* model) { UNUSED(text_input); if(model->cursor_select) { + model->clear_default_text = false; model->cursor_pos = CLAMP(model->cursor_pos + 1, strlen(model->text_buffer), 0u); } else if(model->selected_column < get_row_size(model->selected_row) - 1) { model->selected_column++; @@ -347,7 +349,10 @@ static void text_input_handle_right(TextInput* text_input, TextInputModel* model } static void text_input_handle_ok(TextInput* text_input, TextInputModel* model, InputType type) { - if(model->cursor_select) return; + if(model->cursor_select) { + model->clear_default_text = !model->clear_default_text; + return; + } bool shift = type == InputTypeLong; bool repeat = type == InputTypeRepeat; char selected = get_selected_char(model); From 99eb10d6e70100d9a2939ec653cbb708df31578b Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Mon, 4 Sep 2023 23:11:40 +0300 Subject: [PATCH 5/7] fix module p1 --- applications/main/subghz_remote/.gitignore | 4 - applications/main/subghz_remote/LICENSE | 21 - .../main/subghz_remote/application.fam | 43 -- .../subghz_remote/catalog/docs/Changelog.md | 25 - .../main/subghz_remote/catalog/docs/Readme.md | 24 - .../catalog/screenshots/Editor_main.png | Bin 2361 -> 0 bytes .../catalog/screenshots/Editor_submenu.png | Bin 1381 -> 0 bytes .../catalog/screenshots/Remote_idle.png | Bin 2026 -> 0 bytes .../catalog/screenshots/Remote_send.png | Bin 1730 -> 0 bytes .../helpers/subrem_custom_event.h | 58 -- .../subghz_remote/helpers/subrem_presets.c | 183 ----- .../subghz_remote/helpers/subrem_presets.h | 39 - .../main/subghz_remote/helpers/subrem_types.h | 48 -- .../main/subghz_remote/helpers/txrx/Readme.md | 4 - .../subghz_remote/helpers/txrx/subghz_txrx.c | 674 ------------------ .../subghz_remote/helpers/txrx/subghz_txrx.h | 375 ---------- .../helpers/txrx/subghz_txrx_i.h | 31 - applications/main/subghz_remote/icon.png | Bin 5000 -> 0 bytes .../subghz_remote/icons/DolphinNice_96x59.png | Bin 2459 -> 0 bytes .../icons/remote_scene/ButtonDown_7x4.png | Bin 102 -> 0 bytes .../icons/remote_scene/ButtonLeft_4x7.png | Bin 1415 -> 0 bytes .../icons/remote_scene/ButtonRight_4x7.png | Bin 1839 -> 0 bytes .../icons/remote_scene/ButtonUp_7x4.png | Bin 102 -> 0 bytes .../icons/remote_scene/Ok_btn_9x9.png | Bin 3605 -> 0 bytes .../icons/remote_scene/Pin_arrow_up_7x9.png | Bin 3603 -> 0 bytes .../icons/remote_scene/Pin_cell_13x13.png | Bin 3593 -> 0 bytes .../icons/remote_scene/Pin_star_7x7.png | Bin 3600 -> 0 bytes .../icons/remote_scene/back_10px.png | Bin 154 -> 0 bytes .../main/subghz_remote/icons/sub1_10px.png | Bin 299 -> 0 bytes .../main/subghz_remote/icons/subrem_10px.png | Bin 5000 -> 0 bytes .../main/subghz_remote/scenes/subrem_scene.c | 30 - .../main/subghz_remote/scenes/subrem_scene.h | 29 - .../scenes/subrem_scene_config.h | 12 - .../scenes/subrem_scene_edit_label.c | 133 ---- .../scenes/subrem_scene_edit_menu.c | 123 ---- .../scenes/subrem_scene_edit_preview.c | 74 -- .../scenes/subrem_scene_edit_submenu.c | 54 -- .../scenes/subrem_scene_enter_new_name.c | 70 -- .../scenes/subrem_scene_fw_warning.c | 129 ---- .../scenes/subrem_scene_open_map_file.c | 29 - .../scenes/subrem_scene_open_sub_file.c | 119 ---- .../scenes/subrem_scene_remote.c | 118 --- .../subghz_remote/scenes/subrem_scene_start.c | 100 --- .../main/subghz_remote/subghz_remote_app.c | 218 ------ .../main/subghz_remote/subghz_remote_app_i.c | 317 -------- .../main/subghz_remote/subghz_remote_app_i.h | 68 -- .../main/subghz_remote/views/edit_menu.c | 290 -------- .../main/subghz_remote/views/edit_menu.h | 29 - .../main/subghz_remote/views/remote.c | 307 -------- .../main/subghz_remote/views/remote.h | 38 - 50 files changed, 3816 deletions(-) delete mode 100644 applications/main/subghz_remote/.gitignore delete mode 100644 applications/main/subghz_remote/LICENSE delete mode 100644 applications/main/subghz_remote/application.fam delete mode 100644 applications/main/subghz_remote/catalog/docs/Changelog.md delete mode 100644 applications/main/subghz_remote/catalog/docs/Readme.md delete mode 100644 applications/main/subghz_remote/catalog/screenshots/Editor_main.png delete mode 100644 applications/main/subghz_remote/catalog/screenshots/Editor_submenu.png delete mode 100644 applications/main/subghz_remote/catalog/screenshots/Remote_idle.png delete mode 100644 applications/main/subghz_remote/catalog/screenshots/Remote_send.png delete mode 100644 applications/main/subghz_remote/helpers/subrem_custom_event.h delete mode 100644 applications/main/subghz_remote/helpers/subrem_presets.c delete mode 100644 applications/main/subghz_remote/helpers/subrem_presets.h delete mode 100644 applications/main/subghz_remote/helpers/subrem_types.h delete mode 100644 applications/main/subghz_remote/helpers/txrx/Readme.md delete mode 100644 applications/main/subghz_remote/helpers/txrx/subghz_txrx.c delete mode 100644 applications/main/subghz_remote/helpers/txrx/subghz_txrx.h delete mode 100644 applications/main/subghz_remote/helpers/txrx/subghz_txrx_i.h delete mode 100644 applications/main/subghz_remote/icon.png delete mode 100644 applications/main/subghz_remote/icons/DolphinNice_96x59.png delete mode 100644 applications/main/subghz_remote/icons/remote_scene/ButtonDown_7x4.png delete mode 100644 applications/main/subghz_remote/icons/remote_scene/ButtonLeft_4x7.png delete mode 100644 applications/main/subghz_remote/icons/remote_scene/ButtonRight_4x7.png delete mode 100644 applications/main/subghz_remote/icons/remote_scene/ButtonUp_7x4.png delete mode 100644 applications/main/subghz_remote/icons/remote_scene/Ok_btn_9x9.png delete mode 100644 applications/main/subghz_remote/icons/remote_scene/Pin_arrow_up_7x9.png delete mode 100644 applications/main/subghz_remote/icons/remote_scene/Pin_cell_13x13.png delete mode 100644 applications/main/subghz_remote/icons/remote_scene/Pin_star_7x7.png delete mode 100644 applications/main/subghz_remote/icons/remote_scene/back_10px.png delete mode 100644 applications/main/subghz_remote/icons/sub1_10px.png delete mode 100644 applications/main/subghz_remote/icons/subrem_10px.png delete mode 100644 applications/main/subghz_remote/scenes/subrem_scene.c delete mode 100644 applications/main/subghz_remote/scenes/subrem_scene.h delete mode 100644 applications/main/subghz_remote/scenes/subrem_scene_config.h delete mode 100644 applications/main/subghz_remote/scenes/subrem_scene_edit_label.c delete mode 100644 applications/main/subghz_remote/scenes/subrem_scene_edit_menu.c delete mode 100644 applications/main/subghz_remote/scenes/subrem_scene_edit_preview.c delete mode 100644 applications/main/subghz_remote/scenes/subrem_scene_edit_submenu.c delete mode 100644 applications/main/subghz_remote/scenes/subrem_scene_enter_new_name.c delete mode 100644 applications/main/subghz_remote/scenes/subrem_scene_fw_warning.c delete mode 100644 applications/main/subghz_remote/scenes/subrem_scene_open_map_file.c delete mode 100644 applications/main/subghz_remote/scenes/subrem_scene_open_sub_file.c delete mode 100644 applications/main/subghz_remote/scenes/subrem_scene_remote.c delete mode 100644 applications/main/subghz_remote/scenes/subrem_scene_start.c delete mode 100644 applications/main/subghz_remote/subghz_remote_app.c delete mode 100644 applications/main/subghz_remote/subghz_remote_app_i.c delete mode 100644 applications/main/subghz_remote/subghz_remote_app_i.h delete mode 100644 applications/main/subghz_remote/views/edit_menu.c delete mode 100644 applications/main/subghz_remote/views/edit_menu.h delete mode 100644 applications/main/subghz_remote/views/remote.c delete mode 100644 applications/main/subghz_remote/views/remote.h diff --git a/applications/main/subghz_remote/.gitignore b/applications/main/subghz_remote/.gitignore deleted file mode 100644 index e2a15a10a..000000000 --- a/applications/main/subghz_remote/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -dist/* -.vscode -.clang-format -.editorconfig \ No newline at end of file diff --git a/applications/main/subghz_remote/LICENSE b/applications/main/subghz_remote/LICENSE deleted file mode 100644 index 6f55e3b0d..000000000 --- a/applications/main/subghz_remote/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2023 DarkFlippers @gid9798 @xMasterX - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/applications/main/subghz_remote/application.fam b/applications/main/subghz_remote/application.fam deleted file mode 100644 index 34fb390ab..000000000 --- a/applications/main/subghz_remote/application.fam +++ /dev/null @@ -1,43 +0,0 @@ -# App( -# appid="subghz_remote_ofw", -# name="Sub-GHz Remote", -# apptype=FlipperAppType.EXTERNAL, -# entry_point="subghz_remote_app", -# requires=[ -# "gui", -# "dialogs", -# ], -# stack_size=2 * 1024, -# targets=["f7"], -# fap_icon="icon.png", -# fap_author="gid9798 xMasterX", -# fap_description="SubGhz Remote, uses up to 5 .sub files", -# fap_category="Sub-GHz", -# fap_icon_assets="icons", -# fap_icon_assets_symbol="subghz_remote", -# fap_version="1.2", -# fap_weburl="https://github.com/DarkFlippers/SubGHz_Remote", -# ) - -App( - appid="subghz_remote", - name="Sub-GHz Remote", - apptype=FlipperAppType.MENUEXTERNAL, - entry_point="subghz_remote_app", - icon="A_SubGHzRemote_14", - order=11, - requires=[ - "gui", - "dialogs", - ], - stack_size=2 * 1024, - targets=["f7"], - fap_icon="icon.png", - fap_author="gid9798 xMasterX", - fap_description="SubGhz Remote, uses up to 5 .sub files", - fap_category="Sub-GHz", - fap_icon_assets="icons", - fap_icon_assets_symbol="subghz_remote", - fap_version="1.2", - fap_weburl="https://github.com/DarkFlippers/SubGHz_Remote", -) diff --git a/applications/main/subghz_remote/catalog/docs/Changelog.md b/applications/main/subghz_remote/catalog/docs/Changelog.md deleted file mode 100644 index 31ed245e8..000000000 --- a/applications/main/subghz_remote/catalog/docs/Changelog.md +++ /dev/null @@ -1,25 +0,0 @@ -## v1.2 -- **Official FirmWare Support** -- Add warning screen on CustomFW - - The .sub file format may differ from the official one and may be broken - -## v1.1 -- **Was combined with a configuration plugin** - - Editing/Creating map file -- Support for starting arguments - -## v1.0 - -**Initial implementation:** -- Transmission -- GUI -- All .sub files for which transfer is available are supported -- Signal types: - - Static - - Dynamic - - RAW - - BinRAW - -*Custom modulations are not supported yet* - -**Map File Format** - FlipperFormat .txt file \ No newline at end of file diff --git a/applications/main/subghz_remote/catalog/docs/Readme.md b/applications/main/subghz_remote/catalog/docs/Readme.md deleted file mode 100644 index 1da170e19..000000000 --- a/applications/main/subghz_remote/catalog/docs/Readme.md +++ /dev/null @@ -1,24 +0,0 @@ -With this application, you can combine up to 5 .sub files into one remote, and use flipper as a remote with multiple buttons. -## What is "Map" Files? -"Map" is short for mapping -A Map Files is a .txt files that the application uses to store information about remotes -# How to use -## First screen -After launching the application, you will see the MAP file selection screen (file browser). -- Select map file or press "back" to go Main menu -## Main menu -- Open map file - switching to remote - - Select map file - - On remote screen, use the navigation buttons(D-pad) to send a signal -- Edit Map File - map file editor - - Select map file - - Up/Down - slot nafigation - - Ok - edit menu - - Left - preview/save -- New Map File - Creating a new map file - - Enter a name - - The rest is similar to map file editor -# About map file -Map file - FlipperFormat .txt file. - -Stores custom names, and paths to used .sub files. \ No newline at end of file diff --git a/applications/main/subghz_remote/catalog/screenshots/Editor_main.png b/applications/main/subghz_remote/catalog/screenshots/Editor_main.png deleted file mode 100644 index 9498c94514411bd81fd4f7c474bb3286b0ec6c8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2361 zcma)8YgAL&6+Rf>3iPFph~TuNj8GOz1PEg$Z$g@kajmOse)Pv(=bn4d-uv78 zeBVCjk4Xu!o?Csk0suVYPR4u+z&huv2iWWyPQA)J4 z*2cyBCZ(uxNpYs;8_`cU^e*-J4XE|+mtt50D~v1o)lvHx@dqcA8y4G`YG|cvT`vX+Dw5WLeSdLUh6y&V+^H|zVB0mHfeX618_POENH9nP zEaPO{*V|vOad{VHAu6ud7caBd8j`jtzx5BT_W)Oa2Egt0;G+-8Am%+;H*vW+o6pzz zwtSIXQa)VT@gi~viFl1|i!f6q#hS&?RemwUR!T0$=mokeV1Lg zG9Q%QueUE-(DWjC?OJKuUeI;YS(_hzj!)#M>P#c$f%FXGq|jT4s5szC$r(t)d+2un z9F@YV@QK7bCsjy)f?602C=lF!NL7t>+L_ZG`0piYtS#m{7)}l>a1Gz1loWia64S{b zo4RC}Z2G4AT5}Mr`U1hme6nxL4kz1EG?prXUeaR2kjWbzYP>cKn0wxRH zl!#Nww4v6;|8U3>$||Wvp7X%IlOGD(o@6o*j<+{m<|aa#&hrTh3T{k_k_OF`g;=)Z z#Q`wTVP_FZ?Y7iHR))7ZwGw@kF!O5r*LC>?^WSsZTRK)}WuaSXcP^ zYTDb=j!;%*#-op6jId`Q*dhj`_ET0p z$mr|jl4&hd9mT8DDti{4PpqM7bVQ7ps~0h&MuO*7#7v@BAPhZwmI8PNfvlu5Xc^_l zVHZN8O6oac2xCM=mSstE8-1n~MwE};!L--{3bWJ=7SGZ@!DK;d+m%!pyf}_RU^p1e z6N`OoL8l}!aB7BjufaCW8P%HNVI%NCyh4P&`O%vKg}GINLr zqTwnWkb^Xn>c+F5H~$@qqO1m(;_gi*=Mj6ZSJ}0(CvItx&^T#ETBi$Y`N+wG!4g9 zeJ5_FOy3~Fcyr2$SNjFZFh5<3yq}zi{l{@8wIv^8H8IIlF1lsS4}w?Xl^PHlxgoVR z$@Ep`+-05xV%yS1^WsLIJ_3N9B%8X@d2F0A<9JWou!>147tYOG zQhG`6u9)8O3>k48hzrs1e0_g-y7^AoPqW$ms7ci6|t7+{z!Qr>Pb-hk2S~`)Y3ZrWreeorPk<RK$`+_f81*v|;P)gVI_ITO@%C3y?@)2C zM%M`=>iv!2vwEG@1JyGNL;7DIXQzdsG#DU+*^z&?fm6gd*b^Ea+4q)X(MRf=_okM` z)t+x{CY}sbx&t$#>MJZtaXp{5UVbSOOz8W9K*tuJV?bGd}ZMxWEHBjMdVzW^cI zJPhwFB(7Ul>CxdW280R^-zFoJnIW@dsegeV~!F%-$9`0y0`B&p#X@ zGITtF-%3`Cu_#l341Xe*L`Q}tD6Mq1`9hT8ng2l4rC)&7U%A_2c0oi%*k01899bM1 no&i5z-OgQ?jUSQo+BW2_eUVyER*ds51mZqUh-p2R^ZEY(w3puR diff --git a/applications/main/subghz_remote/catalog/screenshots/Editor_submenu.png b/applications/main/subghz_remote/catalog/screenshots/Editor_submenu.png deleted file mode 100644 index f5f7cd8495aef5c0e33c4594679670b40eff387e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1381 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 D{V;BS diff --git a/applications/main/subghz_remote/helpers/subrem_custom_event.h b/applications/main/subghz_remote/helpers/subrem_custom_event.h deleted file mode 100644 index 810df6a89..000000000 --- a/applications/main/subghz_remote/helpers/subrem_custom_event.h +++ /dev/null @@ -1,58 +0,0 @@ -#pragma once - -typedef enum { - SubRemEditMenuStateUP = 0, - SubRemEditMenuStateDOWN, - SubRemEditMenuStateLEFT, - SubRemEditMenuStateRIGHT, - SubRemEditMenuStateOK, -} SubRemEditMenuState; - -typedef enum { - // StartSubmenuIndex - SubmenuIndexSubRemOpenMapFile = 0, - SubmenuIndexSubRemEditMapFile, - SubmenuIndexSubRemNewMapFile, -#if FURI_DEBUG - SubmenuIndexSubRemRemoteView, -#endif - // SubmenuIndexSubRemAbout, - - // EditSubmenuIndex - EditSubmenuIndexEditLabel, - EditSubmenuIndexEditFile, - - // SubRemCustomEvent - SubRemCustomEventViewRemoteStartUP = 100, - SubRemCustomEventViewRemoteStartDOWN, - SubRemCustomEventViewRemoteStartLEFT, - SubRemCustomEventViewRemoteStartRIGHT, - SubRemCustomEventViewRemoteStartOK, - SubRemCustomEventViewRemoteBack, - SubRemCustomEventViewRemoteStop, - SubRemCustomEventViewRemoteForcedStop, - - SubRemCustomEventViewEditMenuBack, - SubRemCustomEventViewEditMenuUP, - SubRemCustomEventViewEditMenuDOWN, - SubRemCustomEventViewEditMenuEdit, - SubRemCustomEventViewEditMenuSave, - - SubRemCustomEventSceneEditsubmenu, - SubRemCustomEventSceneEditLabelInputDone, - SubRemCustomEventSceneEditLabelWidgetAcces, - SubRemCustomEventSceneEditLabelWidgetBack, - - SubRemCustomEventSceneEditOpenSubErrorPopup, - - SubRemCustomEventSceneEditPreviewSaved, - - SubRemCustomEventSceneNewName, - -#ifdef FW_ORIGIN_Official - SubRemCustomEventSceneFwWarningExit, - SubRemCustomEventSceneFwWarningNext, - SubRemCustomEventSceneFwWarningContinue, -#endif - -} SubRemCustomEvent; \ No newline at end of file diff --git a/applications/main/subghz_remote/helpers/subrem_presets.c b/applications/main/subghz_remote/helpers/subrem_presets.c deleted file mode 100644 index bca888b96..000000000 --- a/applications/main/subghz_remote/helpers/subrem_presets.c +++ /dev/null @@ -1,183 +0,0 @@ -#include "subrem_presets.h" - -#define TAG "SubRemPresets" - -SubRemSubFilePreset* subrem_sub_file_preset_alloc() { - SubRemSubFilePreset* sub_preset = malloc(sizeof(SubRemSubFilePreset)); - - sub_preset->fff_data = flipper_format_string_alloc(); - sub_preset->file_path = furi_string_alloc(); - sub_preset->protocaol_name = furi_string_alloc(); - sub_preset->label = furi_string_alloc(); - - sub_preset->freq_preset.name = furi_string_alloc(); - - sub_preset->type = SubGhzProtocolTypeUnknown; - sub_preset->load_state = SubRemLoadSubStateNotSet; - - return sub_preset; -} - -void subrem_sub_file_preset_free(SubRemSubFilePreset* sub_preset) { - furi_assert(sub_preset); - - furi_string_free(sub_preset->label); - furi_string_free(sub_preset->protocaol_name); - furi_string_free(sub_preset->file_path); - flipper_format_free(sub_preset->fff_data); - - furi_string_free(sub_preset->freq_preset.name); - - free(sub_preset); -} - -void subrem_sub_file_preset_reset(SubRemSubFilePreset* sub_preset) { - furi_assert(sub_preset); - - furi_string_set_str(sub_preset->label, ""); - furi_string_reset(sub_preset->protocaol_name); - furi_string_reset(sub_preset->file_path); - - Stream* fff_data_stream = flipper_format_get_raw_stream(sub_preset->fff_data); - stream_clean(fff_data_stream); - - sub_preset->type = SubGhzProtocolTypeUnknown; - sub_preset->load_state = SubRemLoadSubStateNotSet; -} - -SubRemLoadSubState subrem_sub_preset_load( - SubRemSubFilePreset* sub_preset, - SubGhzTxRx* txrx, - FlipperFormat* fff_data_file) { - furi_assert(sub_preset); - furi_assert(txrx); - furi_assert(fff_data_file); - - Stream* fff_data_stream = flipper_format_get_raw_stream(sub_preset->fff_data); - - SubRemLoadSubState ret; - FuriString* temp_str = furi_string_alloc(); - uint32_t temp_data32; - uint32_t repeat = 200; - - ret = SubRemLoadSubStateError; - - do { - stream_clean(fff_data_stream); - if(!flipper_format_read_header(fff_data_file, temp_str, &temp_data32)) { - FURI_LOG_E(TAG, "Missing or incorrect header"); - break; - } - - if(((!strcmp(furi_string_get_cstr(temp_str), SUBGHZ_KEY_FILE_TYPE)) || - (!strcmp(furi_string_get_cstr(temp_str), SUBGHZ_RAW_FILE_TYPE))) && - temp_data32 == SUBGHZ_KEY_FILE_VERSION) { - } else { - FURI_LOG_E(TAG, "Type or version mismatch"); - break; - } - - SubGhzSetting* setting = subghz_txrx_get_setting(txrx); - - //Load frequency or using default from settings - ret = SubRemLoadSubStateErrorFreq; - if(!flipper_format_read_uint32(fff_data_file, "Frequency", &temp_data32, 1)) { - FURI_LOG_W(TAG, "Cannot read frequency. Set default frequency"); - sub_preset->freq_preset.frequency = subghz_setting_get_default_frequency(setting); - } else if(!subghz_txrx_radio_device_is_frequency_valid(txrx, temp_data32)) { - FURI_LOG_E(TAG, "Frequency not supported on chosen radio module"); - break; - } - sub_preset->freq_preset.frequency = temp_data32; - - //Load preset - ret = SubRemLoadSubStateErrorMod; - if(!flipper_format_read_string(fff_data_file, "Preset", temp_str)) { - FURI_LOG_E(TAG, "Missing Preset"); - break; - } - - furi_string_set_str( - temp_str, subghz_txrx_get_preset_name(txrx, furi_string_get_cstr(temp_str))); - if(!strcmp(furi_string_get_cstr(temp_str), "")) { - break; - } - - if(!strcmp(furi_string_get_cstr(temp_str), "CUSTOM")) { - FURI_LOG_E(TAG, "CUSTOM preset is not supported"); - break; - // TODO Custom preset loading logic if need - // sub_preset->freq_preset.preset_index = - // subghz_setting_get_inx_preset_by_name(setting, furi_string_get_cstr(temp_str)); - } - - furi_string_set(sub_preset->freq_preset.name, temp_str); - - // Load protocol - ret = SubRemLoadSubStateErrorProtocol; - if(!flipper_format_read_string(fff_data_file, "Protocol", temp_str)) { - FURI_LOG_E(TAG, "Missing Protocol"); - break; - } - - FlipperFormat* fff_data = sub_preset->fff_data; - if(!strcmp(furi_string_get_cstr(temp_str), "RAW")) { - //if RAW - subghz_protocol_raw_gen_fff_data( - fff_data, - furi_string_get_cstr(sub_preset->file_path), - subghz_txrx_radio_device_get_name(txrx)); - } else { - stream_copy_full( - flipper_format_get_raw_stream(fff_data_file), - flipper_format_get_raw_stream(fff_data)); - } - - if(subghz_txrx_load_decoder_by_name_protocol(txrx, furi_string_get_cstr(temp_str))) { - SubGhzProtocolStatus status = - subghz_protocol_decoder_base_deserialize(subghz_txrx_get_decoder(txrx), fff_data); - if(status != SubGhzProtocolStatusOk) { - break; - } - } else { - FURI_LOG_E(TAG, "Protocol not found"); - break; - } - - const SubGhzProtocol* protocol = subghz_txrx_get_decoder(txrx)->protocol; - - if(protocol->flag & SubGhzProtocolFlag_Send) { - if((protocol->type == SubGhzProtocolTypeStatic) || - (protocol->type == SubGhzProtocolTypeDynamic) || -#ifndef FW_ORIGIN_Official - (protocol->type == SubGhzProtocolTypeBinRAW) || -#endif - (protocol->type == SubGhzProtocolTypeRAW)) { - sub_preset->type = protocol->type; - } else { - FURI_LOG_E(TAG, "Unsuported Protocol"); - break; - } - - furi_string_set(sub_preset->protocaol_name, temp_str); - } else { - FURI_LOG_E(TAG, "Protocol does not support transmission"); - break; - } - - if(!flipper_format_insert_or_update_uint32(fff_data, "Repeat", &repeat, 1)) { - FURI_LOG_E(TAG, "Unable Repeat"); - break; - } - - ret = SubRemLoadSubStateOK; - -#if FURI_DEBUG - FURI_LOG_I(TAG, "%-16s - protocol Loaded", furi_string_get_cstr(sub_preset->label)); -#endif - } while(false); - - furi_string_free(temp_str); - sub_preset->load_state = ret; - return ret; -} diff --git a/applications/main/subghz_remote/helpers/subrem_presets.h b/applications/main/subghz_remote/helpers/subrem_presets.h deleted file mode 100644 index d66181b90..000000000 --- a/applications/main/subghz_remote/helpers/subrem_presets.h +++ /dev/null @@ -1,39 +0,0 @@ -#pragma once - -#include "subrem_types.h" -#include "txrx/subghz_txrx.h" - -#include -#include - -typedef struct { - FuriString* name; - uint32_t frequency; - // size_t preset_index; // Need for custom preset -} FreqPreset; - -// Sub File preset -typedef struct { - FlipperFormat* fff_data; - FreqPreset freq_preset; - FuriString* file_path; - FuriString* protocaol_name; - FuriString* label; - SubGhzProtocolType type; - SubRemLoadSubState load_state; -} SubRemSubFilePreset; - -typedef struct { - SubRemSubFilePreset* subs_preset[SubRemSubKeyNameMaxCount]; -} SubRemMapPreset; - -SubRemSubFilePreset* subrem_sub_file_preset_alloc(); - -void subrem_sub_file_preset_free(SubRemSubFilePreset* sub_preset); - -void subrem_sub_file_preset_reset(SubRemSubFilePreset* sub_preset); - -SubRemLoadSubState subrem_sub_preset_load( - SubRemSubFilePreset* sub_preset, - SubGhzTxRx* txrx, - FlipperFormat* fff_data_file); diff --git a/applications/main/subghz_remote/helpers/subrem_types.h b/applications/main/subghz_remote/helpers/subrem_types.h deleted file mode 100644 index b43f8499d..000000000 --- a/applications/main/subghz_remote/helpers/subrem_types.h +++ /dev/null @@ -1,48 +0,0 @@ -#pragma once - -#include -#include - -#define SUBREM_APP_APP_FILE_VERSION 1 -#define SUBREM_APP_APP_FILE_TYPE "Flipper SubRem Map file" -#define SUBREM_APP_EXTENSION ".txt" - -typedef enum { - SubRemSubKeyNameUp = (0U), - SubRemSubKeyNameDown, - SubRemSubKeyNameLeft, - SubRemSubKeyNameRight, - SubRemSubKeyNameOk, - SubRemSubKeyNameMaxCount, -} SubRemSubKeyName; - -typedef enum { - SubRemViewIDSubmenu, - SubRemViewIDWidget, - SubRemViewIDPopup, - SubRemViewIDTextInput, - SubRemViewIDRemote, - SubRemViewIDEditMenu, -} SubRemViewID; - -typedef enum { - SubRemLoadSubStateNotSet = 0, - SubRemLoadSubStatePreloaded, - SubRemLoadSubStateError, - SubRemLoadSubStateErrorIncorectPath, - SubRemLoadSubStateErrorNoFile, - SubRemLoadSubStateErrorFreq, - SubRemLoadSubStateErrorMod, - SubRemLoadSubStateErrorProtocol, - SubRemLoadSubStateOK, -} SubRemLoadSubState; - -typedef enum { - SubRemLoadMapStateBack = 0, - SubRemLoadMapStateError, - SubRemLoadMapStateErrorOpenError, - SubRemLoadMapStateErrorStorage, - SubRemLoadMapStateErrorBrokenFile, - SubRemLoadMapStateNotAllOK, - SubRemLoadMapStateOK, -} SubRemLoadMapState; \ No newline at end of file diff --git a/applications/main/subghz_remote/helpers/txrx/Readme.md b/applications/main/subghz_remote/helpers/txrx/Readme.md deleted file mode 100644 index 918160198..000000000 --- a/applications/main/subghz_remote/helpers/txrx/Readme.md +++ /dev/null @@ -1,4 +0,0 @@ -This is part of the official `SubGhz` app from [flipperzero-firmware](https://github.com/flipperdevices/flipperzero-firmware/tree/3217f286f03da119398586daf94c0723d28b872a/applications/main/subghz) - -With changes from [unleashed-firmware -](https://github.com/DarkFlippers/unleashed-firmware/tree/3eac6ccd48a3851cf5d63bf7899b387a293e5319/applications/main/subghz) \ No newline at end of file diff --git a/applications/main/subghz_remote/helpers/txrx/subghz_txrx.c b/applications/main/subghz_remote/helpers/txrx/subghz_txrx.c deleted file mode 100644 index 8c8c3b56d..000000000 --- a/applications/main/subghz_remote/helpers/txrx/subghz_txrx.c +++ /dev/null @@ -1,674 +0,0 @@ -#include "subghz_txrx_i.h" - -#include -#include -#include - -#ifndef FW_ORIGIN_Official -#include -#endif - -#define TAG "SubGhz" - -static void subghz_txrx_radio_device_power_on(SubGhzTxRx* instance) { - UNUSED(instance); - uint8_t attempts = 0; - while(!furi_hal_power_is_otg_enabled() && attempts++ < 5) { - furi_hal_power_enable_otg(); - //CC1101 power-up time - furi_delay_ms(10); - } -} - -static void subghz_txrx_radio_device_power_off(SubGhzTxRx* instance) { - UNUSED(instance); - if(furi_hal_power_is_otg_enabled()) furi_hal_power_disable_otg(); -} - -SubGhzTxRx* subghz_txrx_alloc() { - SubGhzTxRx* instance = malloc(sizeof(SubGhzTxRx)); - instance->setting = subghz_setting_alloc(); - subghz_setting_load(instance->setting, EXT_PATH("subghz/assets/setting_user")); - - instance->preset = malloc(sizeof(SubGhzRadioPreset)); - instance->preset->name = furi_string_alloc(); - subghz_txrx_set_preset( - instance, "AM650", subghz_setting_get_default_frequency(instance->setting), NULL, 0); - - instance->txrx_state = SubGhzTxRxStateSleep; - - subghz_txrx_hopper_set_state(instance, SubGhzHopperStateOFF); - subghz_txrx_speaker_set_state(instance, SubGhzSpeakerStateDisable); - subghz_txrx_set_debug_pin_state(instance, false); - - instance->worker = subghz_worker_alloc(); - instance->fff_data = flipper_format_string_alloc(); - - instance->environment = subghz_environment_alloc(); - instance->is_database_loaded = - subghz_environment_load_keystore(instance->environment, SUBGHZ_KEYSTORE_DIR_NAME); - subghz_environment_load_keystore(instance->environment, SUBGHZ_KEYSTORE_DIR_USER_NAME); - subghz_environment_set_came_atomo_rainbow_table_file_name( - instance->environment, SUBGHZ_CAME_ATOMO_DIR_NAME); - subghz_environment_set_alutech_at_4n_rainbow_table_file_name( - instance->environment, SUBGHZ_ALUTECH_AT_4N_DIR_NAME); - subghz_environment_set_nice_flor_s_rainbow_table_file_name( - instance->environment, SUBGHZ_NICE_FLOR_S_DIR_NAME); - subghz_environment_set_protocol_registry( - instance->environment, (void*)&subghz_protocol_registry); - instance->receiver = subghz_receiver_alloc_init(instance->environment); - - subghz_worker_set_overrun_callback( - instance->worker, (SubGhzWorkerOverrunCallback)subghz_receiver_reset); - subghz_worker_set_pair_callback( - instance->worker, (SubGhzWorkerPairCallback)subghz_receiver_decode); - subghz_worker_set_context(instance->worker, instance->receiver); - - //set default device Internal - subghz_devices_init(); - instance->radio_device_type = SubGhzRadioDeviceTypeInternal; - instance->radio_device_type = - subghz_txrx_radio_device_set(instance, SubGhzRadioDeviceTypeExternalCC1101); - - return instance; -} - -void subghz_txrx_free(SubGhzTxRx* instance) { - furi_assert(instance); - - if(instance->radio_device_type != SubGhzRadioDeviceTypeInternal) { - subghz_txrx_radio_device_power_off(instance); - subghz_devices_end(instance->radio_device); - } - - subghz_devices_deinit(); - - subghz_worker_free(instance->worker); - subghz_receiver_free(instance->receiver); - subghz_environment_free(instance->environment); - flipper_format_free(instance->fff_data); - furi_string_free(instance->preset->name); - subghz_setting_free(instance->setting); - - free(instance->preset); - free(instance); -} - -bool subghz_txrx_is_database_loaded(SubGhzTxRx* instance) { - furi_assert(instance); - return instance->is_database_loaded; -} - -void subghz_txrx_set_preset( - SubGhzTxRx* instance, - const char* preset_name, - uint32_t frequency, - uint8_t* preset_data, - size_t preset_data_size) { - furi_assert(instance); - furi_string_set(instance->preset->name, preset_name); - SubGhzRadioPreset* preset = instance->preset; - preset->frequency = frequency; - preset->data = preset_data; - preset->data_size = preset_data_size; -} - -const char* subghz_txrx_get_preset_name(SubGhzTxRx* instance, const char* preset) { - UNUSED(instance); - const char* preset_name = ""; - if(!strcmp(preset, "FuriHalSubGhzPresetOok270Async")) { - preset_name = "AM270"; - } else if(!strcmp(preset, "FuriHalSubGhzPresetOok650Async")) { - preset_name = "AM650"; - } else if(!strcmp(preset, "FuriHalSubGhzPreset2FSKDev238Async")) { - preset_name = "FM238"; - } else if(!strcmp(preset, "FuriHalSubGhzPreset2FSKDev476Async")) { - preset_name = "FM476"; - } else if(!strcmp(preset, "FuriHalSubGhzPresetCustom")) { - preset_name = "CUSTOM"; - } else { - FURI_LOG_E(TAG, "Unknown preset"); - } - return preset_name; -} - -SubGhzRadioPreset subghz_txrx_get_preset(SubGhzTxRx* instance) { - furi_assert(instance); - return *instance->preset; -} - -void subghz_txrx_get_frequency_and_modulation( - SubGhzTxRx* instance, - FuriString* frequency, - FuriString* modulation, - bool long_name) { - furi_assert(instance); - SubGhzRadioPreset* preset = instance->preset; - if(frequency != NULL) { - furi_string_printf( - frequency, - "%03ld.%02ld", - preset->frequency / 1000000 % 1000, - preset->frequency / 10000 % 100); - } - if(modulation != NULL) { - if(long_name) { - furi_string_printf(modulation, "%s", furi_string_get_cstr(preset->name)); - } else { - furi_string_printf(modulation, "%.2s", furi_string_get_cstr(preset->name)); - } - } -} - -static void subghz_txrx_begin(SubGhzTxRx* instance, uint8_t* preset_data) { - furi_assert(instance); - subghz_devices_reset(instance->radio_device); - subghz_devices_idle(instance->radio_device); - subghz_devices_load_preset(instance->radio_device, FuriHalSubGhzPresetCustom, preset_data); - instance->txrx_state = SubGhzTxRxStateIDLE; -} - -static uint32_t subghz_txrx_rx(SubGhzTxRx* instance, uint32_t frequency) { - furi_assert(instance); - furi_assert( - instance->txrx_state != SubGhzTxRxStateRx && instance->txrx_state != SubGhzTxRxStateSleep); - - subghz_devices_idle(instance->radio_device); - - uint32_t value = subghz_devices_set_frequency(instance->radio_device, frequency); - subghz_devices_flush_rx(instance->radio_device); - subghz_txrx_speaker_on(instance); - - subghz_devices_start_async_rx( - instance->radio_device, subghz_worker_rx_callback, instance->worker); - subghz_worker_start(instance->worker); - instance->txrx_state = SubGhzTxRxStateRx; - return value; -} - -static void subghz_txrx_idle(SubGhzTxRx* instance) { - furi_assert(instance); - furi_assert(instance->txrx_state != SubGhzTxRxStateSleep); - subghz_devices_idle(instance->radio_device); - subghz_txrx_speaker_off(instance); - instance->txrx_state = SubGhzTxRxStateIDLE; -} - -static void subghz_txrx_rx_end(SubGhzTxRx* instance) { - furi_assert(instance); - furi_assert(instance->txrx_state == SubGhzTxRxStateRx); - - if(subghz_worker_is_running(instance->worker)) { - subghz_worker_stop(instance->worker); - subghz_devices_stop_async_rx(instance->radio_device); - } - subghz_devices_idle(instance->radio_device); - subghz_txrx_speaker_off(instance); - instance->txrx_state = SubGhzTxRxStateIDLE; -} - -void subghz_txrx_sleep(SubGhzTxRx* instance) { - furi_assert(instance); - subghz_devices_sleep(instance->radio_device); - instance->txrx_state = SubGhzTxRxStateSleep; -} - -static bool subghz_txrx_tx(SubGhzTxRx* instance, uint32_t frequency) { - furi_assert(instance); - furi_assert(instance->txrx_state != SubGhzTxRxStateSleep); - - subghz_devices_idle(instance->radio_device); - subghz_devices_set_frequency(instance->radio_device, frequency); - - bool ret = subghz_devices_set_tx(instance->radio_device); - if(ret) { - subghz_txrx_speaker_on(instance); - instance->txrx_state = SubGhzTxRxStateTx; - } - - return ret; -} - -SubGhzTxRxStartTxState subghz_txrx_tx_start(SubGhzTxRx* instance, FlipperFormat* flipper_format) { - furi_assert(instance); - furi_assert(flipper_format); - - subghz_txrx_stop(instance); - - SubGhzTxRxStartTxState ret = SubGhzTxRxStartTxStateErrorParserOthers; - FuriString* temp_str = furi_string_alloc(); - uint32_t repeat = 200; - do { - if(!flipper_format_rewind(flipper_format)) { - FURI_LOG_E(TAG, "Rewind error"); - break; - } - if(!flipper_format_read_string(flipper_format, "Protocol", temp_str)) { - FURI_LOG_E(TAG, "Missing Protocol"); - break; - } - if(!flipper_format_insert_or_update_uint32(flipper_format, "Repeat", &repeat, 1)) { - FURI_LOG_E(TAG, "Unable Repeat"); - break; - } - ret = SubGhzTxRxStartTxStateOk; - - SubGhzRadioPreset* preset = instance->preset; - instance->transmitter = - subghz_transmitter_alloc_init(instance->environment, furi_string_get_cstr(temp_str)); - - if(instance->transmitter) { - if(subghz_transmitter_deserialize(instance->transmitter, flipper_format) == - SubGhzProtocolStatusOk) { - if(strcmp(furi_string_get_cstr(preset->name), "") != 0) { - subghz_txrx_begin( - instance, - subghz_setting_get_preset_data_by_name( - instance->setting, furi_string_get_cstr(preset->name))); - if(preset->frequency) { - if(!subghz_txrx_tx(instance, preset->frequency)) { - FURI_LOG_E(TAG, "Only Rx"); - ret = SubGhzTxRxStartTxStateErrorOnlyRx; - } - } else { - ret = SubGhzTxRxStartTxStateErrorParserOthers; - } - - } else { - FURI_LOG_E( - TAG, "Unknown name preset \" %s \"", furi_string_get_cstr(preset->name)); - ret = SubGhzTxRxStartTxStateErrorParserOthers; - } - - if(ret == SubGhzTxRxStartTxStateOk) { - //Start TX - subghz_devices_start_async_tx( - instance->radio_device, subghz_transmitter_yield, instance->transmitter); - } - } else { - ret = SubGhzTxRxStartTxStateErrorParserOthers; - } - } else { - ret = SubGhzTxRxStartTxStateErrorParserOthers; - } - if(ret != SubGhzTxRxStartTxStateOk) { - subghz_transmitter_free(instance->transmitter); - if(instance->txrx_state != SubGhzTxRxStateIDLE) { - subghz_txrx_idle(instance); - } - } - - } while(false); - furi_string_free(temp_str); - return ret; -} - -void subghz_txrx_rx_start(SubGhzTxRx* instance) { - furi_assert(instance); - subghz_txrx_stop(instance); - subghz_txrx_begin( - instance, - subghz_setting_get_preset_data_by_name( - subghz_txrx_get_setting(instance), furi_string_get_cstr(instance->preset->name))); - subghz_txrx_rx(instance, instance->preset->frequency); -} - -void subghz_txrx_set_need_save_callback( - SubGhzTxRx* instance, - SubGhzTxRxNeedSaveCallback callback, - void* context) { - furi_assert(instance); - instance->need_save_callback = callback; - instance->need_save_context = context; -} - -static void subghz_txrx_tx_stop(SubGhzTxRx* instance) { - furi_assert(instance); - furi_assert(instance->txrx_state == SubGhzTxRxStateTx); - //Stop TX - subghz_devices_stop_async_tx(instance->radio_device); - subghz_transmitter_stop(instance->transmitter); - subghz_transmitter_free(instance->transmitter); - - //if protocol dynamic then we save the last upload - if(instance->decoder_result->protocol->type == SubGhzProtocolTypeDynamic) { - if(instance->need_save_callback) { - instance->need_save_callback(instance->need_save_context); - } - } - subghz_txrx_idle(instance); - subghz_txrx_speaker_off(instance); - //Todo: Show message -} - -FlipperFormat* subghz_txrx_get_fff_data(SubGhzTxRx* instance) { - furi_assert(instance); - return instance->fff_data; -} - -SubGhzSetting* subghz_txrx_get_setting(SubGhzTxRx* instance) { - furi_assert(instance); - return instance->setting; -} - -void subghz_txrx_stop(SubGhzTxRx* instance) { - furi_assert(instance); - - switch(instance->txrx_state) { - case SubGhzTxRxStateTx: - subghz_txrx_tx_stop(instance); - subghz_txrx_speaker_unmute(instance); - break; - case SubGhzTxRxStateRx: - subghz_txrx_rx_end(instance); - subghz_txrx_speaker_mute(instance); - break; - - default: - break; - } -} - -void subghz_txrx_hopper_update(SubGhzTxRx* instance) { - furi_assert(instance); - - switch(instance->hopper_state) { - case SubGhzHopperStateOFF: - case SubGhzHopperStatePause: - return; - case SubGhzHopperStateRSSITimeOut: - if(instance->hopper_timeout != 0) { - instance->hopper_timeout--; - return; - } - break; - default: - break; - } - float rssi = -127.0f; - if(instance->hopper_state != SubGhzHopperStateRSSITimeOut) { - // See RSSI Calculation timings in CC1101 17.3 RSSI - rssi = subghz_devices_get_rssi(instance->radio_device); - - // Stay if RSSI is high enough - if(rssi > -90.0f) { - instance->hopper_timeout = 10; - instance->hopper_state = SubGhzHopperStateRSSITimeOut; - return; - } - } else { - instance->hopper_state = SubGhzHopperStateRunning; - } - // Select next frequency - if(instance->hopper_idx_frequency < - subghz_setting_get_hopper_frequency_count(instance->setting) - 1) { - instance->hopper_idx_frequency++; - } else { - instance->hopper_idx_frequency = 0; - } - - if(instance->txrx_state == SubGhzTxRxStateRx) { - subghz_txrx_rx_end(instance); - }; - if(instance->txrx_state == SubGhzTxRxStateIDLE) { - subghz_receiver_reset(instance->receiver); - instance->preset->frequency = - subghz_setting_get_hopper_frequency(instance->setting, instance->hopper_idx_frequency); - subghz_txrx_rx(instance, instance->preset->frequency); - } -} - -SubGhzHopperState subghz_txrx_hopper_get_state(SubGhzTxRx* instance) { - furi_assert(instance); - return instance->hopper_state; -} - -void subghz_txrx_hopper_set_state(SubGhzTxRx* instance, SubGhzHopperState state) { - furi_assert(instance); - instance->hopper_state = state; -} - -void subghz_txrx_hopper_unpause(SubGhzTxRx* instance) { - furi_assert(instance); - if(instance->hopper_state == SubGhzHopperStatePause) { - instance->hopper_state = SubGhzHopperStateRunning; - } -} - -void subghz_txrx_hopper_pause(SubGhzTxRx* instance) { - furi_assert(instance); - if(instance->hopper_state == SubGhzHopperStateRunning) { - instance->hopper_state = SubGhzHopperStatePause; - } -} - -void subghz_txrx_speaker_on(SubGhzTxRx* instance) { - furi_assert(instance); - if(instance->debug_pin_state) { - subghz_devices_set_async_mirror_pin(instance->radio_device, &gpio_ibutton); - } - - if(instance->speaker_state == SubGhzSpeakerStateEnable) { - if(furi_hal_speaker_acquire(30)) { - if(!instance->debug_pin_state) { - subghz_devices_set_async_mirror_pin(instance->radio_device, &gpio_speaker); - } - } else { - instance->speaker_state = SubGhzSpeakerStateDisable; - } - } -} - -void subghz_txrx_speaker_off(SubGhzTxRx* instance) { - furi_assert(instance); - if(instance->debug_pin_state) { - subghz_devices_set_async_mirror_pin(instance->radio_device, NULL); - } - if(instance->speaker_state != SubGhzSpeakerStateDisable) { - if(furi_hal_speaker_is_mine()) { - if(!instance->debug_pin_state) { - subghz_devices_set_async_mirror_pin(instance->radio_device, NULL); - } - furi_hal_speaker_release(); - if(instance->speaker_state == SubGhzSpeakerStateShutdown) - instance->speaker_state = SubGhzSpeakerStateDisable; - } - } -} - -void subghz_txrx_speaker_mute(SubGhzTxRx* instance) { - furi_assert(instance); - if(instance->debug_pin_state) { - subghz_devices_set_async_mirror_pin(instance->radio_device, NULL); - } - if(instance->speaker_state == SubGhzSpeakerStateEnable) { - if(furi_hal_speaker_is_mine()) { - if(!instance->debug_pin_state) { - subghz_devices_set_async_mirror_pin(instance->radio_device, NULL); - } - } - } -} - -void subghz_txrx_speaker_unmute(SubGhzTxRx* instance) { - furi_assert(instance); - if(instance->debug_pin_state) { - subghz_devices_set_async_mirror_pin(instance->radio_device, &gpio_ibutton); - } - if(instance->speaker_state == SubGhzSpeakerStateEnable) { - if(furi_hal_speaker_is_mine()) { - if(!instance->debug_pin_state) { - subghz_devices_set_async_mirror_pin(instance->radio_device, &gpio_speaker); - } - } - } -} - -void subghz_txrx_speaker_set_state(SubGhzTxRx* instance, SubGhzSpeakerState state) { - furi_assert(instance); - instance->speaker_state = state; -} - -SubGhzSpeakerState subghz_txrx_speaker_get_state(SubGhzTxRx* instance) { - furi_assert(instance); - return instance->speaker_state; -} - -bool subghz_txrx_load_decoder_by_name_protocol(SubGhzTxRx* instance, const char* name_protocol) { - furi_assert(instance); - furi_assert(name_protocol); - bool res = false; - instance->decoder_result = - subghz_receiver_search_decoder_base_by_name(instance->receiver, name_protocol); - if(instance->decoder_result) { - res = true; - } - return res; -} - -SubGhzProtocolDecoderBase* subghz_txrx_get_decoder(SubGhzTxRx* instance) { - furi_assert(instance); - return instance->decoder_result; -} - -bool subghz_txrx_protocol_is_serializable(SubGhzTxRx* instance) { - furi_assert(instance); - return ( - (instance->decoder_result->protocol->flag & SubGhzProtocolFlag_Save) == - SubGhzProtocolFlag_Save); -} - -bool subghz_txrx_protocol_is_transmittable(SubGhzTxRx* instance, bool check_type) { - furi_assert(instance); - const SubGhzProtocol* protocol = instance->decoder_result->protocol; - if(check_type) { - return ( - ((protocol->flag & SubGhzProtocolFlag_Send) == SubGhzProtocolFlag_Send) && - protocol->encoder->deserialize && protocol->type == SubGhzProtocolTypeStatic); - } - return ( - ((protocol->flag & SubGhzProtocolFlag_Send) == SubGhzProtocolFlag_Send) && - protocol->encoder->deserialize); -} - -void subghz_txrx_receiver_set_filter(SubGhzTxRx* instance, SubGhzProtocolFlag filter) { - furi_assert(instance); - subghz_receiver_set_filter(instance->receiver, filter); -} - -void subghz_txrx_set_rx_calback( - SubGhzTxRx* instance, - SubGhzReceiverCallback callback, - void* context) { - subghz_receiver_set_rx_callback(instance->receiver, callback, context); -} - -void subghz_txrx_set_raw_file_encoder_worker_callback_end( - SubGhzTxRx* instance, - SubGhzProtocolEncoderRAWCallbackEnd callback, - void* context) { - subghz_protocol_raw_file_encoder_worker_set_callback_end( - (SubGhzProtocolEncoderRAW*)subghz_transmitter_get_protocol_instance(instance->transmitter), - callback, - context); -} - -bool subghz_txrx_radio_device_is_external_connected(SubGhzTxRx* instance, const char* name) { - furi_assert(instance); - - bool is_connect = false; - bool is_otg_enabled = furi_hal_power_is_otg_enabled(); - - if(!is_otg_enabled) { - subghz_txrx_radio_device_power_on(instance); - } - - const SubGhzDevice* device = subghz_devices_get_by_name(name); - if(device) { - is_connect = subghz_devices_is_connect(device); - } - - if(!is_otg_enabled) { - subghz_txrx_radio_device_power_off(instance); - } - return is_connect; -} - -SubGhzRadioDeviceType - subghz_txrx_radio_device_set(SubGhzTxRx* instance, SubGhzRadioDeviceType radio_device_type) { - furi_assert(instance); - - if(radio_device_type == SubGhzRadioDeviceTypeExternalCC1101 && - subghz_txrx_radio_device_is_external_connected(instance, SUBGHZ_DEVICE_CC1101_EXT_NAME)) { - subghz_txrx_radio_device_power_on(instance); - instance->radio_device = subghz_devices_get_by_name(SUBGHZ_DEVICE_CC1101_EXT_NAME); - subghz_devices_begin(instance->radio_device); - instance->radio_device_type = SubGhzRadioDeviceTypeExternalCC1101; - } else { - subghz_txrx_radio_device_power_off(instance); - if(instance->radio_device_type != SubGhzRadioDeviceTypeInternal) { - subghz_devices_end(instance->radio_device); - } - instance->radio_device = subghz_devices_get_by_name(SUBGHZ_DEVICE_CC1101_INT_NAME); - instance->radio_device_type = SubGhzRadioDeviceTypeInternal; - } - - return instance->radio_device_type; -} - -SubGhzRadioDeviceType subghz_txrx_radio_device_get(SubGhzTxRx* instance) { - furi_assert(instance); - return instance->radio_device_type; -} - -float subghz_txrx_radio_device_get_rssi(SubGhzTxRx* instance) { - furi_assert(instance); - return subghz_devices_get_rssi(instance->radio_device); -} - -const char* subghz_txrx_radio_device_get_name(SubGhzTxRx* instance) { - furi_assert(instance); - return subghz_devices_get_name(instance->radio_device); -} - -bool subghz_txrx_radio_device_is_frequency_valid(SubGhzTxRx* instance, uint32_t frequency) { - furi_assert(instance); - return subghz_devices_is_frequency_valid(instance->radio_device, frequency); -} - -bool subghz_txrx_radio_device_is_tx_allowed(SubGhzTxRx* instance, uint32_t frequency) { - furi_assert(instance); - furi_assert(instance->txrx_state != SubGhzTxRxStateSleep); - - subghz_devices_idle(instance->radio_device); - subghz_devices_set_frequency(instance->radio_device, frequency); - - bool ret = subghz_devices_set_tx(instance->radio_device); - subghz_devices_idle(instance->radio_device); - - return ret; -} - -void subghz_txrx_set_debug_pin_state(SubGhzTxRx* instance, bool state) { - furi_assert(instance); - instance->debug_pin_state = state; -} - -bool subghz_txrx_get_debug_pin_state(SubGhzTxRx* instance) { - furi_assert(instance); - return instance->debug_pin_state; -} - -#ifndef FW_ORIGIN_Official -void subghz_txrx_reset_dynamic_and_custom_btns(SubGhzTxRx* instance) { - furi_assert(instance); - subghz_environment_reset_keeloq(instance->environment); - - subghz_custom_btns_reset(); -} -#endif - -SubGhzReceiver* subghz_txrx_get_receiver(SubGhzTxRx* instance) { - furi_assert(instance); - return instance->receiver; -} \ No newline at end of file diff --git a/applications/main/subghz_remote/helpers/txrx/subghz_txrx.h b/applications/main/subghz_remote/helpers/txrx/subghz_txrx.h deleted file mode 100644 index 93c4a2276..000000000 --- a/applications/main/subghz_remote/helpers/txrx/subghz_txrx.h +++ /dev/null @@ -1,375 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include - -typedef struct SubGhzTxRx SubGhzTxRx; - -typedef void (*SubGhzTxRxNeedSaveCallback)(void* context); - -typedef enum { - SubGhzTxRxStartTxStateOk, - SubGhzTxRxStartTxStateErrorOnlyRx, - SubGhzTxRxStartTxStateErrorParserOthers, -} SubGhzTxRxStartTxState; - -// Type from subghz_types.h need for txrx working -/** SubGhzTxRx state */ -typedef enum { - SubGhzTxRxStateIDLE, - SubGhzTxRxStateRx, - SubGhzTxRxStateTx, - SubGhzTxRxStateSleep, -} SubGhzTxRxState; - -/** SubGhzHopperState state */ -typedef enum { - SubGhzHopperStateOFF, - SubGhzHopperStateRunning, - SubGhzHopperStatePause, - SubGhzHopperStateRSSITimeOut, -} SubGhzHopperState; - -/** SubGhzSpeakerState state */ -typedef enum { - SubGhzSpeakerStateDisable, - SubGhzSpeakerStateShutdown, - SubGhzSpeakerStateEnable, -} SubGhzSpeakerState; - -/** SubGhzRadioDeviceType */ -typedef enum { - SubGhzRadioDeviceTypeAuto, - SubGhzRadioDeviceTypeInternal, - SubGhzRadioDeviceTypeExternalCC1101, -} SubGhzRadioDeviceType; - -/** - * Allocate SubGhzTxRx - * - * @return SubGhzTxRx* pointer to SubGhzTxRx - */ -SubGhzTxRx* subghz_txrx_alloc(); - -/** - * Free SubGhzTxRx - * - * @param instance Pointer to a SubGhzTxRx - */ -void subghz_txrx_free(SubGhzTxRx* instance); - -/** - * Check if the database is loaded - * - * @param instance Pointer to a SubGhzTxRx - * @return bool True if the database is loaded - */ -bool subghz_txrx_is_database_loaded(SubGhzTxRx* instance); - -/** - * Set preset - * - * @param instance Pointer to a SubGhzTxRx - * @param preset_name Name of preset - * @param frequency Frequency in Hz - * @param preset_data Data of preset - * @param preset_data_size Size of preset data - */ -void subghz_txrx_set_preset( - SubGhzTxRx* instance, - const char* preset_name, - uint32_t frequency, - uint8_t* preset_data, - size_t preset_data_size); - -/** - * Get name of preset - * - * @param instance Pointer to a SubGhzTxRx - * @param preset String of preset - * @return const char* Name of preset - */ -const char* subghz_txrx_get_preset_name(SubGhzTxRx* instance, const char* preset); - -/** - * Get of preset - * - * @param instance Pointer to a SubGhzTxRx - * @return SubGhzRadioPreset Preset - */ -SubGhzRadioPreset subghz_txrx_get_preset(SubGhzTxRx* instance); - -/** - * Get string frequency and modulation - * - * @param instance Pointer to a SubGhzTxRx - * @param frequency Pointer to a string frequency - * @param modulation Pointer to a string modulation - */ -void subghz_txrx_get_frequency_and_modulation( - SubGhzTxRx* instance, - FuriString* frequency, - FuriString* modulation, - bool long_name); - -/** - * Start TX CC1101 - * - * @param instance Pointer to a SubGhzTxRx - * @param flipper_format Pointer to a FlipperFormat - * @return SubGhzTxRxStartTxState - */ -SubGhzTxRxStartTxState subghz_txrx_tx_start(SubGhzTxRx* instance, FlipperFormat* flipper_format); - -/** - * Start RX CC1101 - * - * @param instance Pointer to a SubGhzTxRx - */ -void subghz_txrx_rx_start(SubGhzTxRx* instance); - -/** - * Stop TX/RX CC1101 - * - * @param instance Pointer to a SubGhzTxRx - */ -void subghz_txrx_stop(SubGhzTxRx* instance); - -/** - * Set sleep mode CC1101 - * - * @param instance Pointer to a SubGhzTxRx - */ -void subghz_txrx_sleep(SubGhzTxRx* instance); - -/** - * Update frequency CC1101 in automatic mode (hopper) - * - * @param instance Pointer to a SubGhzTxRx - */ -void subghz_txrx_hopper_update(SubGhzTxRx* instance); - -/** - * Get state hopper - * - * @param instance Pointer to a SubGhzTxRx - * @return SubGhzHopperState - */ -SubGhzHopperState subghz_txrx_hopper_get_state(SubGhzTxRx* instance); - -/** - * Set state hopper - * - * @param instance Pointer to a SubGhzTxRx - * @param state State hopper - */ -void subghz_txrx_hopper_set_state(SubGhzTxRx* instance, SubGhzHopperState state); - -/** - * Unpause hopper - * - * @param instance Pointer to a SubGhzTxRx - */ -void subghz_txrx_hopper_unpause(SubGhzTxRx* instance); - -/** - * Set pause hopper - * - * @param instance Pointer to a SubGhzTxRx - */ -void subghz_txrx_hopper_pause(SubGhzTxRx* instance); - -/** - * Speaker on - * - * @param instance Pointer to a SubGhzTxRx - */ -void subghz_txrx_speaker_on(SubGhzTxRx* instance); - -/** - * Speaker off - * - * @param instance Pointer to a SubGhzTxRx - */ -void subghz_txrx_speaker_off(SubGhzTxRx* instance); - -/** - * Speaker mute - * - * @param instance Pointer to a SubGhzTxRx - */ -void subghz_txrx_speaker_mute(SubGhzTxRx* instance); - -/** - * Speaker unmute - * - * @param instance Pointer to a SubGhzTxRx - */ -void subghz_txrx_speaker_unmute(SubGhzTxRx* instance); - -/** - * Set state speaker - * - * @param instance Pointer to a SubGhzTxRx - * @param state State speaker - */ -void subghz_txrx_speaker_set_state(SubGhzTxRx* instance, SubGhzSpeakerState state); - -/** - * Get state speaker - * - * @param instance Pointer to a SubGhzTxRx - * @return SubGhzSpeakerState - */ -SubGhzSpeakerState subghz_txrx_speaker_get_state(SubGhzTxRx* instance); - -/** - * load decoder by name protocol - * - * @param instance Pointer to a SubGhzTxRx - * @param name_protocol Name protocol - * @return bool True if the decoder is loaded - */ -bool subghz_txrx_load_decoder_by_name_protocol(SubGhzTxRx* instance, const char* name_protocol); - -/** - * Get decoder - * - * @param instance Pointer to a SubGhzTxRx - * @return SubGhzProtocolDecoderBase* Pointer to a SubGhzProtocolDecoderBase - */ -SubGhzProtocolDecoderBase* subghz_txrx_get_decoder(SubGhzTxRx* instance); - -/** - * Set callback for save data - * - * @param instance Pointer to a SubGhzTxRx - * @param callback Callback for save data - * @param context Context for callback - */ -void subghz_txrx_set_need_save_callback( - SubGhzTxRx* instance, - SubGhzTxRxNeedSaveCallback callback, - void* context); - -/** - * Get pointer to a load data key - * - * @param instance Pointer to a SubGhzTxRx - * @return FlipperFormat* - */ -FlipperFormat* subghz_txrx_get_fff_data(SubGhzTxRx* instance); - -/** - * Get pointer to a SugGhzSetting - * - * @param instance Pointer to a SubGhzTxRx - * @return SubGhzSetting* - */ -SubGhzSetting* subghz_txrx_get_setting(SubGhzTxRx* instance); - -/** - * Is it possible to save this protocol - * - * @param instance Pointer to a SubGhzTxRx - * @return bool True if it is possible to save this protocol - */ -bool subghz_txrx_protocol_is_serializable(SubGhzTxRx* instance); - -/** - * Is it possible to send this protocol - * - * @param instance Pointer to a SubGhzTxRx - * @return bool True if it is possible to send this protocol - */ -bool subghz_txrx_protocol_is_transmittable(SubGhzTxRx* instance, bool check_type); - -/** - * Set filter, what types of decoder to use - * - * @param instance Pointer to a SubGhzTxRx - * @param filter Filter - */ -void subghz_txrx_receiver_set_filter(SubGhzTxRx* instance, SubGhzProtocolFlag filter); - -/** - * Set callback for receive data - * - * @param instance Pointer to a SubGhzTxRx - * @param callback Callback for receive data - * @param context Context for callback - */ -void subghz_txrx_set_rx_calback( - SubGhzTxRx* instance, - SubGhzReceiverCallback callback, - void* context); - -/** - * Set callback for Raw decoder, end of data transfer - * - * @param instance Pointer to a SubGhzTxRx - * @param callback Callback for Raw decoder, end of data transfer - * @param context Context for callback - */ -void subghz_txrx_set_raw_file_encoder_worker_callback_end( - SubGhzTxRx* instance, - SubGhzProtocolEncoderRAWCallbackEnd callback, - void* context); - -/* Checking if an external radio device is connected -* -* @param instance Pointer to a SubGhzTxRx -* @param name Name of external radio device -* @return bool True if is connected to the external radio device -*/ -bool subghz_txrx_radio_device_is_external_connected(SubGhzTxRx* instance, const char* name); - -/* Set the selected radio device to use -* -* @param instance Pointer to a SubGhzTxRx -* @param radio_device_type Radio device type -* @return SubGhzRadioDeviceType Type of installed radio device -*/ -SubGhzRadioDeviceType - subghz_txrx_radio_device_set(SubGhzTxRx* instance, SubGhzRadioDeviceType radio_device_type); - -/* Get the selected radio device to use -* -* @param instance Pointer to a SubGhzTxRx -* @return SubGhzRadioDeviceType Type of installed radio device -*/ -SubGhzRadioDeviceType subghz_txrx_radio_device_get(SubGhzTxRx* instance); - -/* Get RSSI the selected radio device to use -* -* @param instance Pointer to a SubGhzTxRx -* @return float RSSI -*/ -float subghz_txrx_radio_device_get_rssi(SubGhzTxRx* instance); - -/* Get name the selected radio device to use -* -* @param instance Pointer to a SubGhzTxRx -* @return const char* Name of installed radio device -*/ -const char* subghz_txrx_radio_device_get_name(SubGhzTxRx* instance); - -/* Get get intelligence whether frequency the selected radio device to use -* -* @param instance Pointer to a SubGhzTxRx -* @return bool True if the frequency is valid -*/ -bool subghz_txrx_radio_device_is_frequency_valid(SubGhzTxRx* instance, uint32_t frequency); - -bool subghz_txrx_radio_device_is_tx_allowed(SubGhzTxRx* instance, uint32_t frequency); - -void subghz_txrx_set_debug_pin_state(SubGhzTxRx* instance, bool state); -bool subghz_txrx_get_debug_pin_state(SubGhzTxRx* instance); -#ifndef FW_ORIGIN_Official -void subghz_txrx_reset_dynamic_and_custom_btns(SubGhzTxRx* instance); -#endif -SubGhzReceiver* subghz_txrx_get_receiver(SubGhzTxRx* instance); // TODO use only in DecodeRaw diff --git a/applications/main/subghz_remote/helpers/txrx/subghz_txrx_i.h b/applications/main/subghz_remote/helpers/txrx/subghz_txrx_i.h deleted file mode 100644 index f058c2282..000000000 --- a/applications/main/subghz_remote/helpers/txrx/subghz_txrx_i.h +++ /dev/null @@ -1,31 +0,0 @@ -#pragma once - -#include "subghz_txrx.h" - -struct SubGhzTxRx { - SubGhzWorker* worker; - - SubGhzEnvironment* environment; - SubGhzReceiver* receiver; - SubGhzTransmitter* transmitter; - SubGhzProtocolDecoderBase* decoder_result; - FlipperFormat* fff_data; - - SubGhzRadioPreset* preset; - SubGhzSetting* setting; - - uint8_t hopper_timeout; - uint8_t hopper_idx_frequency; - bool is_database_loaded; - SubGhzHopperState hopper_state; - - SubGhzTxRxState txrx_state; - SubGhzSpeakerState speaker_state; - const SubGhzDevice* radio_device; - SubGhzRadioDeviceType radio_device_type; - - SubGhzTxRxNeedSaveCallback need_save_callback; - void* need_save_context; - - bool debug_pin_state; -}; diff --git a/applications/main/subghz_remote/icon.png b/applications/main/subghz_remote/icon.png deleted file mode 100644 index c6b410f4c598d6b241b851826875a568c74f4d20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5000 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 AV*mgE diff --git a/applications/main/subghz_remote/icons/remote_scene/ButtonLeft_4x7.png b/applications/main/subghz_remote/icons/remote_scene/ButtonLeft_4x7.png deleted file mode 100644 index 0b4655d43247083aa705620e9836ac415b42ca46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1415 zcmbVM+iKK67*5rq)>aU2M7$VM1Vxif;vTv~W2u`S7ED{V3s&&L*<`XiG|9wd+THd> z5CnY!sdyuJtrvQyAo>KpiLcV|{Tkc)riAbluXfwSZCApL`ztB&p zx6LGKvks4K_4~)qD&oGa-YdJlW)hAKMNJd7<=t?6c^RI1>c$ifyjaM>^|&8!ey zB4!nh9u>5uen6Ve@<H5rru6h<2Ef#GQdQ*CmZOlQi~N!?9H`Rp;C% zU}CB21#?;r`&0|6C0}b-=jODa5|nEJ#ntxQ&{~jpgtwDta4hftr~G=#p@V36e4Zjh zq%J~{y26Jjn=1Nw-l*3%QW5YFE*v4z3gt0$&(*xf2en34c?JpH8+FYldo+Alvg8af-pG4(=!fyUi-Wsg z`g#n9VUcf(DFr{poMSNzw-lz>w+HV+n1ELr&SLA#LHUb0p(xWQ(1*vJ-i+1!`swxZ Z!O7;c$;lT_->m1Ovaz)0yuI`A$q$F8u*d)a diff --git a/applications/main/subghz_remote/icons/remote_scene/ButtonRight_4x7.png b/applications/main/subghz_remote/icons/remote_scene/ButtonRight_4x7.png deleted file mode 100644 index 8e1c74c1c0038ea55172f19ac875003fc80c2d06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1839 zcmcIlO>f*p7#Yw)M6zw!O+@VZ{?d|D~WYi~8rHRY?X-&T}Yen`g$^+EJ;z+|RV zE@PoDvZ9%#+_}3bC_5Cj8jDGq541mi{7F+&KF}W65sr$Xn5H|YrMQ2(J7%Yc%;(zO z57ax000=TsQ+1Ke@+w#iw3au3cGGQWY740k2ijH>P(6tD)S)be>gX6Tj7`<`b>di- zgWp$8Y+?i31~CzF0&E4uRlA=C(Mp~K`{74jEchB|)4DDK!ZVhSwdFyw0YIZ1cDh0S{OvfO-U_~ zvmRF*m9sWDXNH)GOyqS1Skhxbr6}s*7t&@~kFM(NW5}qh?Lu@lJ}HE;FDiLdGO>LO z5pS*%E2grR)l^;|?O5b_?u0me&c1U}%jrk8*%=Wk%i)8yp2P|kuxmKg<=(u_`oQRI_0 zS`-DNysBx=#3&qSkgA@hJP>~D+ZM(s5jI6Owp`?yE=3e`YGUqkVOp#Cp=3wR3O4hX zX6BLsN3UBzV(vI5;|SZHgOb=HD0VFjpTyfFW}GnQuh>2*Q`k>*cAmA#iUT7EXSpo# zkPm5~#I-o^cpgfe#P$=4-Pi*SpT!-@nJgp8L347xe>5EKl`=_ZFc8XGy+_j=_R_7! z@vZZMowS1GJ?Zw)eetks%~G{BTR>T}9|jt0j3Btyb*C3-`C?fwY3EY`q*oYZ39DpM z&uJ;PCZPLs4QO1Jd_|A1PF)azZJ)RZ`^-VMWr6e#XUOA%3eLG_Ch@BDOHzMk*MF0G zCo7xMd?Mg*HMIXw%nNz?%60fZiZPlqb?GqUpXO`F&Yi!okZl(n>P@r1P2i)yk3DgRwbHeNn6e|;J^SK4TM LH~i+q&mR8;k>NTA diff --git a/applications/main/subghz_remote/icons/remote_scene/ButtonUp_7x4.png b/applications/main/subghz_remote/icons/remote_scene/ButtonUp_7x4.png deleted file mode 100644 index 1be79328b40a93297a5609756328406565c437c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)I!3HFqj;YoHDIHH2#}J8d-yTOk1_O>mFaFD) zeWb+ZHz{mGZZ1QpXe09^4tcYT#4oe=UbmGC^A-KE*|F&zP#=S*tDnm{r-UX30HgpM AM*si- diff --git a/applications/main/subghz_remote/icons/remote_scene/Ok_btn_9x9.png b/applications/main/subghz_remote/icons/remote_scene/Ok_btn_9x9.png deleted file mode 100644 index 9a1539da2049f12f7b25f96b11a9c40cd8227302..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3605 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 LwKgd=cDwXHDN#*w diff --git a/applications/main/subghz_remote/icons/remote_scene/back_10px.png b/applications/main/subghz_remote/icons/remote_scene/back_10px.png deleted file mode 100644 index f9c615a99e69c0100b03a9ae7b2df903da4ecd66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2xGmzZ=C-xtZVk{1FcVbv~PUa<$!;&U>c zv7h@-A}f&37T^=&`v3obAT#vPO>_%)r1c48n{Iv*t(u1!X;5977~7Co?ed rv9U?Av01aVRT(gMJdt+jXk=uN>R^g!*w%ImsF1<>&pI=m5)cB{fFDGZlI8yr;B3<$MxhJ?+;A4eL&#) z0Ra}bue?07WhLz78x$BO|L3mq-MMxdP^D^#YeY#(Vo9o1a#1RfVlXl=GSoFN)ipE; zF*LF=Hn1|b&^9ozGB8+QQTzo(LvDUbW?CgwgE3G~h=HkCbE6;07#-3sX@sAxkg$U?hnu$6%_P+PX_Jv(ud zLf1xG|CwUz?7R1Up5OC4zxVgNce*W&4YheW_vK(1mglK+H=%$1JZE+m`hA@F<1zI2 zyA8fptqH{ONK}=TAjGw<2*hDRkufZBKGgVD-U({Lf_l{mhyV1gGrhn5dOvmG&rb;X|2#O* z`;Gdu`y8=lFC6>o;MdlzEhu;(gUPC_z|AEGi;B+`t?Ze5z3-kKC+@xe!rsi0?9s|K zy?-daKNrL9+N8K#jUJb4ydqS`GmmU@)cv;7aPpz%>TUZsFY*}}-;x*iZ59ty6_jpT zvujoMQ}z8jJ+AG;!%Gj}Yq-_gD;(ypTplW&z40q}pQ&N1scCq0d(~q_cR%sbwf8Sv zdVdlA`l;oI1plLZ-jYiT3faL`zr6A#=Lo=7=AJsu{N?^-b1q)%coKW)>T~u}qi^rn z-7>H`clPEJwEVR7TGqAGdqR;5OY#pr*E?^={1s1Y&f(g=vM=|qHywW9AEyugs9|9K z_qUv^T38l3y>(BG-D_BB`RVoV^}JI09`V|mBd`AW<~wBWyCXky1n0|1Nlg+*V)QGN;EdcVFdq|MubW(V_Tn9{lz<&(!Cf?0&8A zl@E$Ck9Ky~46J|Y$whnDXUy8sU3Tos>?t>Un9|+}sNpj`p?cz$4F;W6I^yu1td=)j zwphHBH{ybAO5KJiY~Ik|6F0PrHpy5~o?}l42p|MCfG0x1a7;)zj7eMpo$JG-5l@?` zHXBJXB*PHMf{1m6HIN{}u@W63h2e%VF{(r~MGfORCh)5rn!{*B^Z0mvp@`R;h7ZTa zSU`M`2@oM^6GetXP{HeN+v@{V%k5_5e+8G zkwg*(VF;PVP*i$K$XbuLG3}vK5Kuyqq!%K4ie;ot)zny<8cCZ^NiaQ~ENpU0nj%lI zJjF+!xy>BKy>oC09YBCl_0@MKq5HSOc8#H zHxrPt@G@uPXxUw}=@F^kKtO1=<+RE`fZLx72 zM^h}%PZ&K2qcJ389h0U^tT{O|!J$hHs!^{hL5Gn|PU-6=pgIxrK<@yAog7DH3a%&w z8g!!r!BMD#C>udrd^9VVErOXZqga7TC7!lcqdrv)I*fX4xSm29%!}Gu0vbreA!k;g z%|4nF%vOQs$|!0w97;_$K_%JJIG$`y z0f?!B#blXMGE;<>npEzfp3l7GX_S~MYjF^T&H&=qVRY(yC*C;TeK^CKEcntEB`m4& z*s`e!#M_|0il0b3`57vUflm0by2LgR4nVX&k8KG5wO*Mw+x#3L%ravoDAo)K9*8VK z`z@R#$`oXol=A*h>SY-g(0){rAj zX|i`eX-Qc`CULv;$ClJi>UW`W?b^xP)oq_>=<%(|iFP_&{;^5&uL6OoA}L2u$;}G@ zRN$B(Zj5Yq}83M;=f=r9w8MiVD2l{4`U z0fy0oX&k*FI5pSMi{36|`Ri-l*r@*9d2H`fXk<>LZgmX9OeOkpSK|4KPBfUUdA!xx z?`7r}mf - -// Generate scene id and total number -#define ADD_SCENE(prefix, name, id) SubRemScene##id, -typedef enum { -#include "subrem_scene_config.h" - SubRemSceneNum, -} SubRemScene; -#undef ADD_SCENE - -extern const SceneManagerHandlers subrem_scene_handlers; - -// Generate scene on_enter handlers declaration -#define ADD_SCENE(prefix, name, id) void prefix##_scene_##name##_on_enter(void*); -#include "subrem_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 "subrem_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 "subrem_scene_config.h" -#undef ADD_SCENE diff --git a/applications/main/subghz_remote/scenes/subrem_scene_config.h b/applications/main/subghz_remote/scenes/subrem_scene_config.h deleted file mode 100644 index 56fe641a6..000000000 --- a/applications/main/subghz_remote/scenes/subrem_scene_config.h +++ /dev/null @@ -1,12 +0,0 @@ -ADD_SCENE(subrem, start, Start) -ADD_SCENE(subrem, open_map_file, OpenMapFile) -ADD_SCENE(subrem, remote, Remote) -ADD_SCENE(subrem, edit_menu, EditMenu) -ADD_SCENE(subrem, edit_submenu, EditSubMenu) -ADD_SCENE(subrem, edit_label, EditLabel) -ADD_SCENE(subrem, open_sub_file, OpenSubFile) -ADD_SCENE(subrem, edit_preview, EditPreview) -ADD_SCENE(subrem, enter_new_name, EnterNewName) -#ifdef FW_ORIGIN_Official -ADD_SCENE(subrem, fw_warning, FwWarning) -#endif \ No newline at end of file diff --git a/applications/main/subghz_remote/scenes/subrem_scene_edit_label.c b/applications/main/subghz_remote/scenes/subrem_scene_edit_label.c deleted file mode 100644 index af4a33c1a..000000000 --- a/applications/main/subghz_remote/scenes/subrem_scene_edit_label.c +++ /dev/null @@ -1,133 +0,0 @@ -#include "../subghz_remote_app_i.h" - -#include - -typedef enum { - SubRemSceneEditLabelStateTextInput, - SubRemSceneEditLabelStateWidget, -} SubRemSceneEditLabelState; - -void subrem_scene_edit_label_text_input_callback(void* context) { - furi_assert(context); - SubGhzRemoteApp* app = context; - view_dispatcher_send_custom_event( - app->view_dispatcher, SubRemCustomEventSceneEditLabelInputDone); -} - -void subrem_scene_edit_label_widget_callback(GuiButtonType result, InputType type, void* context) { - furi_assert(context); - SubGhzRemoteApp* app = context; - if((result == GuiButtonTypeCenter) && (type == InputTypeShort)) { - view_dispatcher_send_custom_event( - app->view_dispatcher, SubRemCustomEventSceneEditLabelWidgetAcces); - } else if((result == GuiButtonTypeLeft) && (type == InputTypeShort)) { - view_dispatcher_send_custom_event( - app->view_dispatcher, SubRemCustomEventSceneEditLabelWidgetBack); - } -} - -void subrem_scene_edit_label_on_enter(void* context) { - SubGhzRemoteApp* app = context; - - SubRemSubFilePreset* sub_preset = app->map_preset->subs_preset[app->chusen_sub]; - - FuriString* temp_str = furi_string_alloc(); - - if(furi_string_empty(sub_preset->label)) { - if(furi_string_empty(sub_preset->file_path)) { - path_extract_filename(sub_preset->file_path, temp_str, true); - strcpy(app->file_name_tmp, furi_string_get_cstr(temp_str)); - } else { - strcpy(app->file_name_tmp, ""); - } - } else { - strcpy(app->file_name_tmp, furi_string_get_cstr(sub_preset->label)); - } - - TextInput* text_input = app->text_input; - text_input_set_header_text(text_input, "Label name"); - text_input_set_result_callback( - text_input, - subrem_scene_edit_label_text_input_callback, - app, - app->file_name_tmp, - 25, - false); -#ifndef FW_ORIGIN_Official - text_input_set_minimum_length(app->text_input, 0); -#endif - widget_add_string_element( - app->widget, 63, 12, AlignCenter, AlignCenter, FontPrimary, "Empty Label Name"); - widget_add_string_element( - app->widget, 63, 32, AlignCenter, AlignCenter, FontSecondary, "Continue?"); - - widget_add_button_element( - app->widget, GuiButtonTypeCenter, "Ok", subrem_scene_edit_label_widget_callback, app); - widget_add_button_element( - app->widget, GuiButtonTypeLeft, "Back", subrem_scene_edit_label_widget_callback, app); - - scene_manager_set_scene_state( - app->scene_manager, SubRemSceneEditLabel, SubRemSceneEditLabelStateTextInput); - view_dispatcher_switch_to_view(app->view_dispatcher, SubRemViewIDTextInput); - - furi_string_free(temp_str); -} - -bool subrem_scene_edit_label_on_event(void* context, SceneManagerEvent event) { - SubGhzRemoteApp* app = context; - - FuriString* label = app->map_preset->subs_preset[app->chusen_sub]->label; - - if(event.type == SceneManagerEventTypeBack) { - if(scene_manager_get_scene_state(app->scene_manager, SubRemSceneEditLabel) == - SubRemSceneEditLabelStateWidget) { - scene_manager_set_scene_state( - app->scene_manager, SubRemSceneEditLabel, SubRemSceneEditLabelStateTextInput); - view_dispatcher_switch_to_view(app->view_dispatcher, SubRemViewIDTextInput); - return true; - } else if( - scene_manager_get_scene_state(app->scene_manager, SubRemSceneEditLabel) == - SubRemSceneEditLabelStateTextInput) { - scene_manager_previous_scene(app->scene_manager); - return true; - } - - scene_manager_previous_scene(app->scene_manager); - return true; - } else if(event.type == SceneManagerEventTypeCustom) { - if(event.event == SubRemCustomEventSceneEditLabelInputDone) { - if(strcmp(app->file_name_tmp, "") == 0) { - scene_manager_set_scene_state( - app->scene_manager, SubRemSceneEditLabel, SubRemSceneEditLabelStateWidget); - view_dispatcher_switch_to_view(app->view_dispatcher, SubRemViewIDWidget); - - } else { - furi_string_set(label, app->file_name_tmp); - app->map_not_saved = true; - scene_manager_previous_scene(app->scene_manager); - } - return true; - } else if(event.event == SubRemCustomEventSceneEditLabelWidgetAcces) { - furi_string_set(label, app->file_name_tmp); - app->map_not_saved = true; - scene_manager_previous_scene(app->scene_manager); - - return true; - } else if(event.event == SubRemCustomEventSceneEditLabelWidgetBack) { - scene_manager_set_scene_state( - app->scene_manager, SubRemSceneEditLabel, SubRemSceneEditLabelStateTextInput); - view_dispatcher_switch_to_view(app->view_dispatcher, SubRemViewIDTextInput); - - return true; - } - } - return false; -} - -void subrem_scene_edit_label_on_exit(void* context) { - SubGhzRemoteApp* app = context; - - // Clear view - text_input_reset(app->text_input); - widget_reset(app->widget); -} diff --git a/applications/main/subghz_remote/scenes/subrem_scene_edit_menu.c b/applications/main/subghz_remote/scenes/subrem_scene_edit_menu.c deleted file mode 100644 index a8882009a..000000000 --- a/applications/main/subghz_remote/scenes/subrem_scene_edit_menu.c +++ /dev/null @@ -1,123 +0,0 @@ -#include "../subghz_remote_app_i.h" - -void subrem_scene_edit_menu_callback(SubRemCustomEvent event, void* context) { - furi_assert(context); - SubGhzRemoteApp* app = context; - view_dispatcher_send_custom_event(app->view_dispatcher, event); -} - -void subrem_scene_edit_menu_widget_callback(GuiButtonType result, InputType type, void* context) { - furi_assert(context); - SubGhzRemoteApp* app = context; - if((result == GuiButtonTypeRight) && (type == InputTypeShort)) { - app->map_not_saved = false; - view_dispatcher_send_custom_event(app->view_dispatcher, SubRemCustomEventViewEditMenuBack); - } else if((result == GuiButtonTypeLeft) && (type == InputTypeShort)) { - view_dispatcher_switch_to_view(app->view_dispatcher, SubRemViewIDEditMenu); - } -} - -static uint8_t subrem_scene_edit_menu_state_to_index(SubRemEditMenuState event_id) { - uint8_t ret = 0; - - if(event_id == SubRemEditMenuStateUP) { - ret = SubRemSubKeyNameUp; - } else if(event_id == SubRemEditMenuStateDOWN) { - ret = SubRemSubKeyNameDown; - } else if(event_id == SubRemEditMenuStateLEFT) { - ret = SubRemSubKeyNameLeft; - } else if(event_id == SubRemEditMenuStateRIGHT) { - ret = SubRemSubKeyNameRight; - } else if(event_id == SubRemEditMenuStateOK) { - ret = SubRemSubKeyNameOk; - } - - return ret; -} - -static void subrem_scene_edit_menu_update_data(SubGhzRemoteApp* app) { - furi_assert(app); - uint8_t index = subrem_scene_edit_menu_state_to_index( - scene_manager_get_scene_state(app->scene_manager, SubRemSceneEditMenu)); - - subrem_view_edit_menu_add_data_to_show( - app->subrem_edit_menu, - index, - app->map_preset->subs_preset[index]->label, - app->map_preset->subs_preset[index]->file_path, - app->map_preset->subs_preset[index]->load_state); -} - -void subrem_scene_edit_menu_on_enter(void* context) { - SubGhzRemoteApp* app = context; - - subrem_view_edit_menu_set_callback( - app->subrem_edit_menu, subrem_scene_edit_menu_callback, app); - - subrem_scene_edit_menu_update_data(app); - - view_dispatcher_switch_to_view(app->view_dispatcher, SubRemViewIDEditMenu); - - Widget* widget = app->widget; - - widget_add_string_element( - widget, 63, 12, AlignCenter, AlignBottom, FontPrimary, "Changes are not saved"); - widget_add_string_element( - widget, 63, 32, AlignCenter, AlignBottom, FontPrimary, "do you want to exit?"); - - widget_add_button_element( - widget, GuiButtonTypeRight, "Yes", subrem_scene_edit_menu_widget_callback, app); - widget_add_button_element( - widget, GuiButtonTypeLeft, "No", subrem_scene_edit_menu_widget_callback, app); -} - -bool subrem_scene_edit_menu_on_event(void* context, SceneManagerEvent event) { - SubGhzRemoteApp* app = context; - - if(event.type == SceneManagerEventTypeBack) { - // Catch widget backEvent - return true; - } - - if(event.type == SceneManagerEventTypeCustom) { - if(event.event == SubRemCustomEventViewEditMenuBack) { - if(app->map_not_saved) { - view_dispatcher_switch_to_view(app->view_dispatcher, SubRemViewIDWidget); - } else if(!scene_manager_search_and_switch_to_previous_scene( - app->scene_manager, SubRemSceneStart)) { - scene_manager_stop(app->scene_manager); - view_dispatcher_stop(app->view_dispatcher); - } - - return true; - } else if( - event.event == SubRemCustomEventViewEditMenuUP || - event.event == SubRemCustomEventViewEditMenuDOWN) { - scene_manager_set_scene_state( - app->scene_manager, - SubRemSceneEditMenu, - subrem_view_edit_menu_get_index(app->subrem_edit_menu)); - subrem_scene_edit_menu_update_data(app); - - return true; - } else if(event.event == SubRemCustomEventViewEditMenuEdit) { - app->chusen_sub = subrem_view_edit_menu_get_index(app->subrem_edit_menu); - scene_manager_set_scene_state( - app->scene_manager, SubRemSceneEditSubMenu, EditSubmenuIndexEditLabel); - scene_manager_next_scene(app->scene_manager, SubRemSceneEditSubMenu); - - return true; - } else if(event.event == SubRemCustomEventViewEditMenuSave) { - scene_manager_next_scene(app->scene_manager, SubRemSceneEditPreview); - - return true; - } - } - - return false; -} - -void subrem_scene_edit_menu_on_exit(void* context) { - SubGhzRemoteApp* app = context; - widget_reset(app->widget); -} diff --git a/applications/main/subghz_remote/scenes/subrem_scene_edit_preview.c b/applications/main/subghz_remote/scenes/subrem_scene_edit_preview.c deleted file mode 100644 index 98a423202..000000000 --- a/applications/main/subghz_remote/scenes/subrem_scene_edit_preview.c +++ /dev/null @@ -1,74 +0,0 @@ -#include "../subghz_remote_app_i.h" -#include "../views/remote.h" - -#define TAG "SubRemScenRemote" - -void subghz_scene_edit_preview_save_popup_callback(void* context) { - SubGhzRemoteApp* app = context; - view_dispatcher_send_custom_event( - app->view_dispatcher, SubRemCustomEventSceneEditPreviewSaved); -} - -void subrem_scene_edit_preview_callback(SubRemCustomEvent event, void* context) { - furi_assert(context); - SubGhzRemoteApp* app = context; - view_dispatcher_send_custom_event(app->view_dispatcher, event); -} - -void subrem_scene_edit_preview_on_enter(void* context) { - SubGhzRemoteApp* app = context; - - // Setup view - Popup* popup = app->popup; - popup_set_icon(popup, 32, 5, &I_DolphinNice_96x59); - popup_set_header(popup, "Saved!", 13, 22, AlignLeft, AlignBottom); - popup_set_timeout(popup, 1500); - popup_set_context(popup, app); - popup_set_callback(popup, subghz_scene_edit_preview_save_popup_callback); - popup_enable_timeout(popup); - - subrem_view_remote_update_data_labels(app->subrem_remote_view, app->map_preset->subs_preset); - subrem_view_remote_set_state(app->subrem_remote_view, SubRemViewRemoteStateOFF, 0); - - subrem_view_remote_set_callback( - app->subrem_remote_view, subrem_scene_edit_preview_callback, app); - - view_dispatcher_switch_to_view(app->view_dispatcher, SubRemViewIDRemote); -} - -bool subrem_scene_edit_preview_on_event(void* context, SceneManagerEvent event) { - SubGhzRemoteApp* app = context; - - if(event.type == SceneManagerEventTypeBack || - (event.type == SceneManagerEventTypeCustom && - (event.event == SubRemCustomEventViewRemoteStartLEFT || - event.event == SubRemCustomEventViewRemoteForcedStop))) { - scene_manager_previous_scene(app->scene_manager); - return true; - } else if( - event.type == SceneManagerEventTypeCustom && - (event.event == SubRemCustomEventViewRemoteStartRIGHT || - event.event == SubRemCustomEventViewRemoteStartOK)) { - if(subrem_save_map_to_file(app)) { - view_dispatcher_switch_to_view(app->view_dispatcher, SubRemViewIDPopup); - app->map_not_saved = false; - return true; - } - // TODO error screen - return true; - } else if( - event.type == SceneManagerEventTypeCustom && - event.event == SubRemCustomEventSceneEditPreviewSaved) { - scene_manager_search_and_switch_to_previous_scene(app->scene_manager, SubRemSceneEditMenu); - } - // } else if(event.type == SceneManagerEventTypeTick) { - // } - return false; -} - -void subrem_scene_edit_preview_on_exit(void* context) { - SubGhzRemoteApp* app = context; - - subrem_view_remote_set_state(app->subrem_remote_view, SubRemViewRemoteStateIdle, 0); - popup_reset(app->popup); -} diff --git a/applications/main/subghz_remote/scenes/subrem_scene_edit_submenu.c b/applications/main/subghz_remote/scenes/subrem_scene_edit_submenu.c deleted file mode 100644 index 447beb96d..000000000 --- a/applications/main/subghz_remote/scenes/subrem_scene_edit_submenu.c +++ /dev/null @@ -1,54 +0,0 @@ -#include "../subghz_remote_app_i.h" -#include "../helpers/subrem_custom_event.h" - -void subrem_scene_edit_submenu_text_input_callback(void* context) { - furi_assert(context); - SubGhzRemoteApp* app = context; - view_dispatcher_send_custom_event(app->view_dispatcher, SubRemCustomEventSceneEditsubmenu); -} - -void subrem_scene_edit_submenu_callback(void* context, uint32_t index) { - furi_assert(context); - SubGhzRemoteApp* app = context; - - view_dispatcher_send_custom_event(app->view_dispatcher, index); -} - -void subrem_scene_edit_submenu_on_enter(void* context) { - furi_assert(context); - - SubGhzRemoteApp* app = context; - Submenu* submenu = app->submenu; - submenu_add_item( - submenu, "Edit Label", EditSubmenuIndexEditLabel, subrem_scene_edit_submenu_callback, app); - submenu_add_item( - submenu, "Edit File", EditSubmenuIndexEditFile, subrem_scene_edit_submenu_callback, app); - - view_dispatcher_switch_to_view(app->view_dispatcher, SubRemViewIDSubmenu); -} - -bool subrem_scene_edit_submenu_on_event(void* context, SceneManagerEvent event) { - furi_assert(context); - - SubGhzRemoteApp* app = context; - bool consumed = false; - - if(event.type == SceneManagerEventTypeCustom) { - if(event.event == EditSubmenuIndexEditLabel) { - scene_manager_next_scene(app->scene_manager, SubRemSceneEditLabel); - consumed = true; - } else if(event.event == EditSubmenuIndexEditFile) { - scene_manager_next_scene(app->scene_manager, SubRemSceneOpenSubFile); - consumed = true; - } - } - - return consumed; -} - -void subrem_scene_edit_submenu_on_exit(void* context) { - furi_assert(context); - - SubGhzRemoteApp* app = context; - submenu_reset(app->submenu); -} diff --git a/applications/main/subghz_remote/scenes/subrem_scene_enter_new_name.c b/applications/main/subghz_remote/scenes/subrem_scene_enter_new_name.c deleted file mode 100644 index b829723a3..000000000 --- a/applications/main/subghz_remote/scenes/subrem_scene_enter_new_name.c +++ /dev/null @@ -1,70 +0,0 @@ -#include "../subghz_remote_app_i.h" -#include "../helpers/subrem_custom_event.h" - -#include - -void subrem_scene_enter_new_name_text_input_callback(void* context) { - furi_assert(context); - SubGhzRemoteApp* app = context; - view_dispatcher_send_custom_event(app->view_dispatcher, SubRemCustomEventSceneNewName); -} - -void subrem_scene_enter_new_name_on_enter(void* context) { - SubGhzRemoteApp* app = context; - - // Setup view - TextInput* text_input = app->text_input; - - //strncpy(app->file_name_tmp, "subrem_", SUBREM_MAX_LEN_NAME); - text_input_set_header_text(text_input, "Map file Name"); - text_input_set_result_callback( - text_input, - subrem_scene_enter_new_name_text_input_callback, - app, - app->file_name_tmp, - 25, - false); - - ValidatorIsFile* validator_is_file = validator_is_file_alloc_init( - furi_string_get_cstr(app->file_path), SUBREM_APP_EXTENSION, ""); - text_input_set_validator(text_input, validator_is_file_callback, validator_is_file); - - view_dispatcher_switch_to_view(app->view_dispatcher, SubRemViewIDTextInput); -} - -bool subrem_scene_enter_new_name_on_event(void* context, SceneManagerEvent event) { - furi_assert(context); - - SubGhzRemoteApp* app = context; - bool consumed = false; - - if(event.type == SceneManagerEventTypeCustom) { - if(event.event == SubRemCustomEventSceneNewName) { - if(strcmp(app->file_name_tmp, "") != 0) { - furi_string_set(app->file_path, SUBREM_APP_FOLDER); - furi_string_cat_printf( - app->file_path, "/%s%s", app->file_name_tmp, SUBREM_APP_EXTENSION); - - subrem_map_preset_reset(app->map_preset); - scene_manager_next_scene(app->scene_manager, SubRemSceneEditMenu); - } else { //error - } - consumed = true; - } - } - - return consumed; -} - -void subrem_scene_enter_new_name_on_exit(void* context) { - furi_assert(context); - - SubGhzRemoteApp* app = context; - submenu_reset(app->submenu); - - // Clear validator & view - void* validator_context = text_input_get_validator_callback_context(app->text_input); - text_input_set_validator(app->text_input, NULL, NULL); - validator_is_file_free(validator_context); - text_input_reset(app->text_input); -} diff --git a/applications/main/subghz_remote/scenes/subrem_scene_fw_warning.c b/applications/main/subghz_remote/scenes/subrem_scene_fw_warning.c deleted file mode 100644 index de473b72c..000000000 --- a/applications/main/subghz_remote/scenes/subrem_scene_fw_warning.c +++ /dev/null @@ -1,129 +0,0 @@ -#include "../subghz_remote_app_i.h" -#include "../helpers/subrem_custom_event.h" -#ifdef FW_ORIGIN_Official -typedef enum { - SceneFwWarningStateAttention, - SceneFwWarningStateAccept, -} SceneFwWarningState; - -static void subrem_scene_fw_warning_widget_render(SubGhzRemoteApp* app, SceneFwWarningState state); - -static void - subrem_scene_fw_warning_widget_callback(GuiButtonType result, InputType type, void* context) { - furi_assert(context); - SubGhzRemoteApp* app = context; - - if(type == InputTypeShort) { - SubRemCustomEvent event = SubRemCustomEventSceneFwWarningExit; - - switch(scene_manager_get_scene_state(app->scene_manager, SubRemSceneFwWarning)) { - case SceneFwWarningStateAttention: - if(result == GuiButtonTypeRight) { - event = SubRemCustomEventSceneFwWarningNext; - } - break; - - case SceneFwWarningStateAccept: - if(result == GuiButtonTypeRight) { - event = SubRemCustomEventSceneFwWarningContinue; - } - - break; - } - - view_dispatcher_send_custom_event(app->view_dispatcher, event); - } -} - -static void - subrem_scene_fw_warning_widget_render(SubGhzRemoteApp* app, SceneFwWarningState state) { - furi_assert(app); - Widget* widget = app->widget; - - widget_reset(widget); - - switch(state) { - case SceneFwWarningStateAttention: - widget_add_button_element( - widget, GuiButtonTypeLeft, "Exit", subrem_scene_fw_warning_widget_callback, app); - widget_add_button_element( - widget, GuiButtonTypeRight, "Continue", subrem_scene_fw_warning_widget_callback, app); - widget_add_string_element( - widget, 64, 12, AlignCenter, AlignBottom, FontPrimary, "Not official FW"); - widget_add_string_multiline_element( - widget, - 64, - 32, - AlignCenter, - AlignCenter, - FontSecondary, - "You are using custom firmware\nPlease download a compatible\nversion of the application"); - break; - - case SceneFwWarningStateAccept: - widget_add_button_element( - widget, GuiButtonTypeLeft, "Exit", subrem_scene_fw_warning_widget_callback, app); - widget_add_button_element( - widget, GuiButtonTypeRight, "Accept", subrem_scene_fw_warning_widget_callback, app); - widget_add_string_element( - widget, 64, 12, AlignCenter, AlignBottom, FontPrimary, "Not official FW"); - widget_add_string_multiline_element( - widget, - 64, - 32, - AlignCenter, - AlignCenter, - FontSecondary, - "Yes, I understand that\nthe application can\nbreak my subghz key file"); - break; - } -} - -void subrem_scene_fw_warning_on_enter(void* context) { - furi_assert(context); - - SubGhzRemoteApp* app = context; - - scene_manager_set_scene_state( - app->scene_manager, SubRemSceneFwWarning, SceneFwWarningStateAttention); - - subrem_scene_fw_warning_widget_render(app, SceneFwWarningStateAttention); - - view_dispatcher_switch_to_view(app->view_dispatcher, SubRemViewIDWidget); -} - -bool subrem_scene_fw_warning_on_event(void* context, SceneManagerEvent event) { - furi_assert(context); - - SubGhzRemoteApp* app = context; - bool consumed = false; - - if(event.type == SceneManagerEventTypeBack) { - consumed = true; - } else if(event.type == SceneManagerEventTypeCustom) { - if(event.event == SubRemCustomEventSceneFwWarningExit) { - scene_manager_stop(app->scene_manager); - view_dispatcher_stop(app->view_dispatcher); - consumed = true; - } else if(event.event == SubRemCustomEventSceneFwWarningNext) { - scene_manager_set_scene_state( - app->scene_manager, SubRemSceneFwWarning, SceneFwWarningStateAccept); - subrem_scene_fw_warning_widget_render(app, SceneFwWarningStateAccept); - view_dispatcher_switch_to_view(app->view_dispatcher, SubRemViewIDWidget); - consumed = true; - } else if(event.event == SubRemCustomEventSceneFwWarningContinue) { - scene_manager_previous_scene(app->scene_manager); - consumed = true; - } - } - - return consumed; -} - -void subrem_scene_fw_warning_on_exit(void* context) { - furi_assert(context); - - SubGhzRemoteApp* app = context; - widget_reset(app->widget); -} -#endif \ No newline at end of file diff --git a/applications/main/subghz_remote/scenes/subrem_scene_open_map_file.c b/applications/main/subghz_remote/scenes/subrem_scene_open_map_file.c deleted file mode 100644 index b91a35129..000000000 --- a/applications/main/subghz_remote/scenes/subrem_scene_open_map_file.c +++ /dev/null @@ -1,29 +0,0 @@ -#include "../subghz_remote_app_i.h" - -void subrem_scene_open_map_file_on_enter(void* context) { - furi_assert(context); - SubGhzRemoteApp* app = context; - - SubRemLoadMapState load_state = subrem_load_from_file(app); - uint32_t start_scene_state = - scene_manager_get_scene_state(app->scene_manager, SubRemSceneStart); - - if(load_state == SubRemLoadMapStateBack) { - scene_manager_previous_scene(app->scene_manager); - } else if(start_scene_state == SubmenuIndexSubRemEditMapFile) { - scene_manager_set_scene_state(app->scene_manager, SubRemSceneEditMenu, SubRemSubKeyNameUp); - scene_manager_next_scene(app->scene_manager, SubRemSceneEditMenu); - } else if(start_scene_state == SubmenuIndexSubRemOpenMapFile) { - scene_manager_next_scene(app->scene_manager, SubRemSceneRemote); - } -} - -bool subrem_scene_open_map_file_on_event(void* context, SceneManagerEvent event) { - UNUSED(context); - UNUSED(event); - return false; -} - -void subrem_scene_open_map_file_on_exit(void* context) { - UNUSED(context); -} diff --git a/applications/main/subghz_remote/scenes/subrem_scene_open_sub_file.c b/applications/main/subghz_remote/scenes/subrem_scene_open_sub_file.c deleted file mode 100644 index 663e80ba7..000000000 --- a/applications/main/subghz_remote/scenes/subrem_scene_open_sub_file.c +++ /dev/null @@ -1,119 +0,0 @@ -#include "../subghz_remote_app_i.h" - -void subrem_scene_open_sub_file_error_popup_callback(void* context) { - SubGhzRemoteApp* app = context; - view_dispatcher_send_custom_event( - app->view_dispatcher, SubRemCustomEventSceneEditOpenSubErrorPopup); -} - -SubRemLoadSubState subrem_scene_open_sub_file_dialog(SubGhzRemoteApp* app) { - furi_assert(app); - - SubRemSubFilePreset* sub = app->map_preset->subs_preset[app->chusen_sub]; - - FuriString* temp_file_path = furi_string_alloc(); - - if(furi_string_empty(sub->file_path)) { - furi_string_set(temp_file_path, SUBGHZ_RAW_FOLDER); - } else { - furi_string_set(temp_file_path, sub->file_path); - } - - SubRemLoadSubState ret = SubRemLoadSubStateNotSet; - - DialogsFileBrowserOptions browser_options; - - dialog_file_browser_set_basic_options( - &browser_options, SUBGHZ_APP_FILENAME_EXTENSION, &I_sub1_10px); - browser_options.base_path = SUBGHZ_RAW_FOLDER; - - // Input events and views are managed by file_select - if(!dialog_file_browser_show(app->dialogs, temp_file_path, temp_file_path, &browser_options)) { - } else { - // Check sub file - SubRemSubFilePreset* sub_candidate = subrem_sub_file_preset_alloc(); - furi_string_set(sub_candidate->label, sub->label); - furi_string_set(sub_candidate->file_path, temp_file_path); - - Storage* storage = furi_record_open(RECORD_STORAGE); - FlipperFormat* fff_file = flipper_format_file_alloc(storage); - - if(flipper_format_file_open_existing( - fff_file, furi_string_get_cstr(sub_candidate->file_path))) { - ret = subrem_sub_preset_load(sub_candidate, app->txrx, fff_file); - } - - flipper_format_file_close(fff_file); - flipper_format_free(fff_file); - furi_record_close(RECORD_STORAGE); - - if(ret == SubRemLoadSubStateOK) { - subrem_sub_file_preset_free(app->map_preset->subs_preset[app->chusen_sub]); - app->map_preset->subs_preset[app->chusen_sub] = sub_candidate; - app->map_not_saved = true; - } else { - subrem_sub_file_preset_free(sub_candidate); - } - } - - furi_string_free(temp_file_path); - - return ret; -} - -void subrem_scene_open_sub_file_on_enter(void* context) { - furi_assert(context); - SubGhzRemoteApp* app = context; - - SubRemLoadSubState load_state = subrem_scene_open_sub_file_dialog(app); - - Popup* popup = app->popup; - // popup_set_icon(); - popup_set_header(popup, "ERROR", 63, 16, AlignCenter, AlignBottom); - popup_set_timeout(popup, 1500); - popup_set_context(popup, app); - popup_set_callback(popup, subrem_scene_open_sub_file_error_popup_callback); - popup_enable_timeout(popup); - - if(load_state == SubRemLoadSubStateOK) { - scene_manager_previous_scene(app->scene_manager); - } else if(load_state == SubRemLoadSubStateNotSet) { - scene_manager_previous_scene(app->scene_manager); - } else { - switch(load_state) { - case SubRemLoadSubStateErrorFreq: - - popup_set_text(popup, "Bad frequency", 63, 30, AlignCenter, AlignBottom); - break; - case SubRemLoadSubStateErrorMod: - - popup_set_text(popup, "Bad modulation", 63, 30, AlignCenter, AlignBottom); - break; - case SubRemLoadSubStateErrorProtocol: - - popup_set_text(popup, "Unsupported protocol", 63, 30, AlignCenter, AlignBottom); - break; - - default: - break; - } - view_dispatcher_switch_to_view(app->view_dispatcher, SubRemViewIDPopup); - } -} - -bool subrem_scene_open_sub_file_on_event(void* context, SceneManagerEvent event) { - SubGhzRemoteApp* app = context; - - if(event.type == SceneManagerEventTypeCustom && - event.event == SubRemCustomEventSceneEditOpenSubErrorPopup) { - scene_manager_previous_scene(app->scene_manager); - return true; - } - return false; -} - -void subrem_scene_open_sub_file_on_exit(void* context) { - SubGhzRemoteApp* app = context; - - popup_reset(app->popup); -} diff --git a/applications/main/subghz_remote/scenes/subrem_scene_remote.c b/applications/main/subghz_remote/scenes/subrem_scene_remote.c deleted file mode 100644 index e8d57dae7..000000000 --- a/applications/main/subghz_remote/scenes/subrem_scene_remote.c +++ /dev/null @@ -1,118 +0,0 @@ -#include "../subghz_remote_app_i.h" -#include "../views/remote.h" - -#include - -#define TAG "SubRemScenRemote" - -void subrem_scene_remote_callback(SubRemCustomEvent event, void* context) { - furi_assert(context); - SubGhzRemoteApp* app = context; - view_dispatcher_send_custom_event(app->view_dispatcher, event); -} - -void subrem_scene_remote_raw_callback_end_tx(void* context) { - furi_assert(context); - SubGhzRemoteApp* app = context; - view_dispatcher_send_custom_event(app->view_dispatcher, SubRemCustomEventViewRemoteForcedStop); -} - -static uint8_t subrem_scene_remote_event_to_index(SubRemCustomEvent event_id) { - uint8_t ret = 0; - - if(event_id == SubRemCustomEventViewRemoteStartUP) { - ret = SubRemSubKeyNameUp; - } else if(event_id == SubRemCustomEventViewRemoteStartDOWN) { - ret = SubRemSubKeyNameDown; - } else if(event_id == SubRemCustomEventViewRemoteStartLEFT) { - ret = SubRemSubKeyNameLeft; - } else if(event_id == SubRemCustomEventViewRemoteStartRIGHT) { - ret = SubRemSubKeyNameRight; - } else if(event_id == SubRemCustomEventViewRemoteStartOK) { - ret = SubRemSubKeyNameOk; - } - - return ret; -} - -void subrem_scene_remote_on_enter(void* context) { - SubGhzRemoteApp* app = context; - - subrem_view_remote_update_data_labels(app->subrem_remote_view, app->map_preset->subs_preset); - subrem_view_remote_set_radio( - app->subrem_remote_view, - subghz_txrx_radio_device_get(app->txrx) != SubGhzRadioDeviceTypeInternal); - - subrem_view_remote_set_callback(app->subrem_remote_view, subrem_scene_remote_callback, app); - - view_dispatcher_switch_to_view(app->view_dispatcher, SubRemViewIDRemote); -} - -bool subrem_scene_remote_on_event(void* context, SceneManagerEvent event) { - SubGhzRemoteApp* app = context; - if(event.type == SceneManagerEventTypeCustom) { - if(event.event == SubRemCustomEventViewRemoteBack) { - if(!scene_manager_previous_scene(app->scene_manager)) { - scene_manager_stop(app->scene_manager); - view_dispatcher_stop(app->view_dispatcher); - } - return true; - } else if( - event.event == SubRemCustomEventViewRemoteStartUP || - event.event == SubRemCustomEventViewRemoteStartDOWN || - event.event == SubRemCustomEventViewRemoteStartLEFT || - event.event == SubRemCustomEventViewRemoteStartRIGHT || - event.event == SubRemCustomEventViewRemoteStartOK) { - // Start sending sub - subrem_tx_stop_sub(app, true); - - uint8_t chusen_sub = subrem_scene_remote_event_to_index(event.event); - app->chusen_sub = chusen_sub; - - subrem_view_remote_set_state( - app->subrem_remote_view, SubRemViewRemoteStateLoading, chusen_sub); - - if(subrem_tx_start_sub(app, app->map_preset->subs_preset[chusen_sub])) { - if(app->map_preset->subs_preset[chusen_sub]->type == SubGhzProtocolTypeRAW) { - subghz_txrx_set_raw_file_encoder_worker_callback_end( - app->txrx, subrem_scene_remote_raw_callback_end_tx, app); - } - subrem_view_remote_set_state( - app->subrem_remote_view, SubRemViewRemoteStateSending, chusen_sub); - notification_message(app->notifications, &sequence_blink_start_magenta); - } else { - subrem_view_remote_set_state( - app->subrem_remote_view, SubRemViewRemoteStateIdle, 0); - notification_message(app->notifications, &sequence_blink_red_100); - } - return true; - } else if(event.event == SubRemCustomEventViewRemoteForcedStop) { - subrem_tx_stop_sub(app, true); - subrem_view_remote_set_state(app->subrem_remote_view, SubRemViewRemoteStateIdle, 0); - - notification_message(app->notifications, &sequence_blink_stop); - return true; - } else if(event.event == SubRemCustomEventViewRemoteStop) { - if(subrem_tx_stop_sub(app, false)) { - subrem_view_remote_set_state( - app->subrem_remote_view, SubRemViewRemoteStateIdle, 0); - - notification_message(app->notifications, &sequence_blink_stop); - } - return true; - } - } - // } else if(event.type == SceneManagerEventTypeTick) { - // } - return false; -} - -void subrem_scene_remote_on_exit(void* context) { - SubGhzRemoteApp* app = context; - - subrem_tx_stop_sub(app, true); - - subrem_view_remote_set_state(app->subrem_remote_view, SubRemViewRemoteStateIdle, 0); - - notification_message(app->notifications, &sequence_blink_stop); -} diff --git a/applications/main/subghz_remote/scenes/subrem_scene_start.c b/applications/main/subghz_remote/scenes/subrem_scene_start.c deleted file mode 100644 index 0f3399b7c..000000000 --- a/applications/main/subghz_remote/scenes/subrem_scene_start.c +++ /dev/null @@ -1,100 +0,0 @@ -#include "../subghz_remote_app_i.h" -#include "../helpers/subrem_custom_event.h" - -void subrem_scene_start_submenu_callback(void* context, uint32_t index) { - furi_assert(context); - SubGhzRemoteApp* app = context; - - view_dispatcher_send_custom_event(app->view_dispatcher, index); -} - -void subrem_scene_start_on_enter(void* context) { - furi_assert(context); - - SubGhzRemoteApp* app = context; - Submenu* submenu = app->submenu; - submenu_add_item( - submenu, - "Open Map File", - SubmenuIndexSubRemOpenMapFile, - subrem_scene_start_submenu_callback, - app); -#if FURI_DEBUG - submenu_add_item( - submenu, - "Remote_Debug", - SubmenuIndexSubRemRemoteView, - subrem_scene_start_submenu_callback, - app); -#endif - submenu_add_item( - submenu, - "Edit Map File", - SubmenuIndexSubRemEditMapFile, - subrem_scene_start_submenu_callback, - app); - submenu_add_item( - submenu, - "New Map File", - SubmenuIndexSubRemNewMapFile, - subrem_scene_start_submenu_callback, - app); - // submenu_add_item( - // submenu, - // "About", - // SubmenuIndexSubGhzRemoteAbout, - // subrem_scene_start_submenu_callback, - // app); - - submenu_set_selected_item( - submenu, scene_manager_get_scene_state(app->scene_manager, SubRemSceneStart)); - - view_dispatcher_switch_to_view(app->view_dispatcher, SubRemViewIDSubmenu); -} - -bool subrem_scene_start_on_event(void* context, SceneManagerEvent event) { - furi_assert(context); - - SubGhzRemoteApp* app = context; - bool consumed = false; - - if(event.type == SceneManagerEventTypeCustom) { - if(event.event == SubmenuIndexSubRemOpenMapFile) { - scene_manager_set_scene_state( - app->scene_manager, SubRemSceneStart, SubmenuIndexSubRemOpenMapFile); - - scene_manager_next_scene(app->scene_manager, SubRemSceneOpenMapFile); - consumed = true; - } -#if FURI_DEBUG - else if(event.event == SubmenuIndexSubRemRemoteView) { - scene_manager_next_scene(app->scene_manager, SubRemSceneRemote); - consumed = true; - } -#endif - else if(event.event == SubmenuIndexSubRemEditMapFile) { - scene_manager_set_scene_state( - app->scene_manager, SubRemSceneStart, SubmenuIndexSubRemEditMapFile); - scene_manager_next_scene(app->scene_manager, SubRemSceneOpenMapFile); - consumed = true; - } else if(event.event == SubmenuIndexSubRemNewMapFile) { - scene_manager_set_scene_state( - app->scene_manager, SubRemSceneStart, SubmenuIndexSubRemNewMapFile); - scene_manager_next_scene(app->scene_manager, SubRemSceneEnterNewName); - consumed = true; - } - // } else if(event.event == SubmenuIndexSubRemAbout) { - // scene_manager_next_scene(app->scene_manager, SubRemSceneAbout); - // consumed = true; - // } - } - - return consumed; -} - -void subrem_scene_start_on_exit(void* context) { - furi_assert(context); - - SubGhzRemoteApp* app = context; - submenu_reset(app->submenu); -} diff --git a/applications/main/subghz_remote/subghz_remote_app.c b/applications/main/subghz_remote/subghz_remote_app.c deleted file mode 100644 index 473e3c012..000000000 --- a/applications/main/subghz_remote/subghz_remote_app.c +++ /dev/null @@ -1,218 +0,0 @@ -#include "subghz_remote_app_i.h" -#include - -static bool subghz_remote_app_custom_event_callback(void* context, uint32_t event) { - furi_assert(context); - SubGhzRemoteApp* app = context; - return scene_manager_handle_custom_event(app->scene_manager, event); -} - -static bool subghz_remote_app_back_event_callback(void* context) { - furi_assert(context); - SubGhzRemoteApp* app = context; - return scene_manager_handle_back_event(app->scene_manager); -} - -static void subghz_remote_app_tick_event_callback(void* context) { - furi_assert(context); - SubGhzRemoteApp* app = context; - scene_manager_handle_tick_event(app->scene_manager); -} - -static void subghz_remote_make_app_folder(SubGhzRemoteApp* app) { - furi_assert(app); - - Storage* storage = furi_record_open(RECORD_STORAGE); - - // Migrate old users data - storage_common_migrate(storage, EXT_PATH("unirf"), SUBREM_APP_FOLDER); - - if(!storage_simply_mkdir(storage, SUBREM_APP_FOLDER)) { - // FURI_LOG_E(TAG, "Could not create folder %s", SUBREM_APP_FOLDER); - dialog_message_show_storage_error(app->dialogs, "Cannot create\napp folder"); - } - furi_record_close(RECORD_STORAGE); -} - -SubGhzRemoteApp* subghz_remote_app_alloc() { - SubGhzRemoteApp* app = malloc(sizeof(SubGhzRemoteApp)); - - furi_hal_power_suppress_charge_enter(); - - app->file_path = furi_string_alloc(); - furi_string_set(app->file_path, SUBREM_APP_FOLDER); - - // GUI - app->gui = furi_record_open(RECORD_GUI); - - // View Dispatcher - app->view_dispatcher = view_dispatcher_alloc(); - - app->scene_manager = scene_manager_alloc(&subrem_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, subghz_remote_app_custom_event_callback); - view_dispatcher_set_navigation_event_callback( - app->view_dispatcher, subghz_remote_app_back_event_callback); - view_dispatcher_set_tick_event_callback( - app->view_dispatcher, subghz_remote_app_tick_event_callback, 100); - - view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); - - // Open Notification record - app->notifications = furi_record_open(RECORD_NOTIFICATION); - - // SubMenu - app->submenu = submenu_alloc(); - view_dispatcher_add_view( - app->view_dispatcher, SubRemViewIDSubmenu, submenu_get_view(app->submenu)); - - // Dialog - app->dialogs = furi_record_open(RECORD_DIALOGS); - - // TextInput - app->text_input = text_input_alloc(); - view_dispatcher_add_view( - app->view_dispatcher, SubRemViewIDTextInput, text_input_get_view(app->text_input)); - - // Widget - app->widget = widget_alloc(); - view_dispatcher_add_view( - app->view_dispatcher, SubRemViewIDWidget, widget_get_view(app->widget)); - - // Popup - app->popup = popup_alloc(); - view_dispatcher_add_view(app->view_dispatcher, SubRemViewIDPopup, popup_get_view(app->popup)); - - // Remote view - app->subrem_remote_view = subrem_view_remote_alloc(); - view_dispatcher_add_view( - app->view_dispatcher, - SubRemViewIDRemote, - subrem_view_remote_get_view(app->subrem_remote_view)); - - // Edit Menu view - app->subrem_edit_menu = subrem_view_edit_menu_alloc(); - view_dispatcher_add_view( - app->view_dispatcher, - SubRemViewIDEditMenu, - subrem_view_edit_menu_get_view(app->subrem_edit_menu)); - - app->map_preset = malloc(sizeof(SubRemMapPreset)); - for(uint8_t i = 0; i < SubRemSubKeyNameMaxCount; i++) { - app->map_preset->subs_preset[i] = subrem_sub_file_preset_alloc(); - } - - app->txrx = subghz_txrx_alloc(); - - subghz_txrx_set_need_save_callback(app->txrx, subrem_save_active_sub, app); - - app->map_not_saved = false; - - return app; -} - -void subghz_remote_app_free(SubGhzRemoteApp* app) { - furi_assert(app); - - furi_hal_power_suppress_charge_exit(); - - // Submenu - view_dispatcher_remove_view(app->view_dispatcher, SubRemViewIDSubmenu); - submenu_free(app->submenu); - - // Dialog - furi_record_close(RECORD_DIALOGS); - - // TextInput - view_dispatcher_remove_view(app->view_dispatcher, SubRemViewIDTextInput); - text_input_free(app->text_input); - - // Widget - view_dispatcher_remove_view(app->view_dispatcher, SubRemViewIDWidget); - widget_free(app->widget); - - // Popup - view_dispatcher_remove_view(app->view_dispatcher, SubRemViewIDPopup); - popup_free(app->popup); - - // Remote view - view_dispatcher_remove_view(app->view_dispatcher, SubRemViewIDRemote); - subrem_view_remote_free(app->subrem_remote_view); - - // Edit view - view_dispatcher_remove_view(app->view_dispatcher, SubRemViewIDEditMenu); - subrem_view_edit_menu_free(app->subrem_edit_menu); - - scene_manager_free(app->scene_manager); - view_dispatcher_free(app->view_dispatcher); - - subghz_txrx_free(app->txrx); - - for(uint8_t i = 0; i < SubRemSubKeyNameMaxCount; i++) { - subrem_sub_file_preset_free(app->map_preset->subs_preset[i]); - } - free(app->map_preset); - - // Notifications - furi_record_close(RECORD_NOTIFICATION); - app->notifications = NULL; - - // Close records - furi_record_close(RECORD_GUI); - - // Path strings - furi_string_free(app->file_path); - - free(app); -} - -int32_t subghz_remote_app(void* arg) { - SubGhzRemoteApp* subghz_remote_app = subghz_remote_app_alloc(); - - subghz_remote_make_app_folder(subghz_remote_app); - - bool map_loaded = false; -#ifdef FW_ORIGIN_Official - const bool fw_ofw = strcmp(version_get_firmware_origin(version_get()), "Official") == 0; -#endif - if((arg != NULL) && (strlen(arg) != 0)) { - furi_string_set(subghz_remote_app->file_path, (const char*)arg); - SubRemLoadMapState load_state = subrem_map_file_load( - subghz_remote_app, furi_string_get_cstr(subghz_remote_app->file_path)); - - if(load_state == SubRemLoadMapStateOK || load_state == SubRemLoadMapStateNotAllOK) { - map_loaded = true; - } else { - // TODO Replace - dialog_message_show_storage_error(subghz_remote_app->dialogs, "Cannot load\nmap file"); - } - } - - if(map_loaded) { - scene_manager_next_scene(subghz_remote_app->scene_manager, SubRemSceneRemote); - } else { - furi_string_set(subghz_remote_app->file_path, SUBREM_APP_FOLDER); - scene_manager_next_scene(subghz_remote_app->scene_manager, SubRemSceneStart); -#ifdef FW_ORIGIN_Official - if(fw_ofw) { - scene_manager_next_scene(subghz_remote_app->scene_manager, SubRemSceneOpenMapFile); - } - } - - if(!fw_ofw) { - scene_manager_next_scene(subghz_remote_app->scene_manager, SubRemSceneFwWarning); - } -#else - scene_manager_next_scene(subghz_remote_app->scene_manager, SubRemSceneOpenMapFile); - } -#endif - - view_dispatcher_run(subghz_remote_app->view_dispatcher); - - subghz_remote_app_free(subghz_remote_app); - - return 0; -} diff --git a/applications/main/subghz_remote/subghz_remote_app_i.c b/applications/main/subghz_remote/subghz_remote_app_i.c deleted file mode 100644 index ca54a997b..000000000 --- a/applications/main/subghz_remote/subghz_remote_app_i.c +++ /dev/null @@ -1,317 +0,0 @@ -#include "subghz_remote_app_i.h" -#include -#include - -#include "helpers/txrx/subghz_txrx.h" -#ifndef FW_ORIGIN_Official -#include -#endif - -#define TAG "SubGhzRemote" - -static const char* map_file_labels[SubRemSubKeyNameMaxCount][2] = { - [SubRemSubKeyNameUp] = {"UP", "ULABEL"}, - [SubRemSubKeyNameDown] = {"DOWN", "DLABEL"}, - [SubRemSubKeyNameLeft] = {"LEFT", "LLABEL"}, - [SubRemSubKeyNameRight] = {"RIGHT", "RLABEL"}, - [SubRemSubKeyNameOk] = {"OK", "OKLABEL"}, -}; - -void subrem_map_preset_reset(SubRemMapPreset* map_preset) { - furi_assert(map_preset); - - for(uint8_t i = 0; i < SubRemSubKeyNameMaxCount; i++) { - subrem_sub_file_preset_reset(map_preset->subs_preset[i]); - } -} - -static SubRemLoadMapState subrem_map_preset_check( - SubRemMapPreset* map_preset, - SubGhzTxRx* txrx, - FlipperFormat* fff_data_file) { - furi_assert(map_preset); - furi_assert(txrx); - - bool all_loaded = true; - SubRemLoadMapState ret = SubRemLoadMapStateErrorBrokenFile; - - SubRemLoadSubState sub_loadig_state; - SubRemSubFilePreset* sub_preset; - - for(uint8_t i = 0; i < SubRemSubKeyNameMaxCount; i++) { - sub_preset = map_preset->subs_preset[i]; - - sub_loadig_state = SubRemLoadSubStateErrorNoFile; - - if(furi_string_empty(sub_preset->file_path)) { - // FURI_LOG_I(TAG, "Empty file path"); - } else if(!flipper_format_file_open_existing( - fff_data_file, furi_string_get_cstr(sub_preset->file_path))) { - sub_preset->load_state = SubRemLoadSubStateErrorNoFile; - FURI_LOG_W(TAG, "Error open file %s", furi_string_get_cstr(sub_preset->file_path)); - } else { - sub_loadig_state = subrem_sub_preset_load(sub_preset, txrx, fff_data_file); - } - - if(sub_loadig_state != SubRemLoadSubStateOK) { - all_loaded = false; - } else { - ret = SubRemLoadMapStateNotAllOK; - } - - if(ret != SubRemLoadMapStateErrorBrokenFile && all_loaded) { - ret = SubRemLoadMapStateOK; - } - - flipper_format_file_close(fff_data_file); - } - - return ret; -} - -static bool subrem_map_preset_load(SubRemMapPreset* map_preset, FlipperFormat* fff_data_file) { - furi_assert(map_preset); - bool ret = false; - SubRemSubFilePreset* sub_preset; - for(uint8_t i = 0; i < SubRemSubKeyNameMaxCount; i++) { - sub_preset = map_preset->subs_preset[i]; - if(!flipper_format_read_string( - fff_data_file, map_file_labels[i][0], sub_preset->file_path)) { -#if FURI_DEBUG - FURI_LOG_W(TAG, "No file patch for %s", map_file_labels[i][0]); -#endif - sub_preset->type = SubGhzProtocolTypeUnknown; - } else if(!path_contains_only_ascii(furi_string_get_cstr(sub_preset->file_path))) { - FURI_LOG_E(TAG, "Incorrect characters in [%s] file path", map_file_labels[i][0]); - sub_preset->type = SubGhzProtocolTypeUnknown; - } else if(!flipper_format_rewind(fff_data_file)) { - // Rewind error - } else if(!flipper_format_read_string( - fff_data_file, map_file_labels[i][1], sub_preset->label)) { -#if FURI_DEBUG - FURI_LOG_W(TAG, "No Label for %s", map_file_labels[i][0]); -#endif - ret = true; - } else { - ret = true; - } - if(ret) { - // Preload seccesful - FURI_LOG_I( - TAG, - "%-5s: %s %s", - map_file_labels[i][0], - furi_string_get_cstr(sub_preset->label), - furi_string_get_cstr(sub_preset->file_path)); - sub_preset->load_state = SubRemLoadSubStatePreloaded; - } - - flipper_format_rewind(fff_data_file); - } - return ret; -} - -SubRemLoadMapState subrem_map_file_load(SubGhzRemoteApp* app, const char* file_path) { - furi_assert(app); - furi_assert(file_path); -#if FURI_DEBUG - FURI_LOG_I(TAG, "Load Map File Start"); -#endif - Storage* storage = furi_record_open(RECORD_STORAGE); - FlipperFormat* fff_data_file = flipper_format_file_alloc(storage); - SubRemLoadMapState ret = SubRemLoadMapStateErrorOpenError; -#if FURI_DEBUG - FURI_LOG_I(TAG, "Open Map File.."); -#endif - subrem_map_preset_reset(app->map_preset); - - if(!flipper_format_file_open_existing(fff_data_file, file_path)) { - FURI_LOG_E(TAG, "Could not open MAP file %s", file_path); - ret = SubRemLoadMapStateErrorOpenError; - } else { - if(!subrem_map_preset_load(app->map_preset, fff_data_file)) { - FURI_LOG_E(TAG, "Could no Sub file path in MAP file"); - // ret = // error for popup - } else if(!flipper_format_file_close(fff_data_file)) { - ret = SubRemLoadMapStateErrorOpenError; - } else { - ret = subrem_map_preset_check(app->map_preset, app->txrx, fff_data_file); - } - } - - if(ret == SubRemLoadMapStateOK) { - FURI_LOG_I(TAG, "Load Map File Seccesful"); - } else if(ret == SubRemLoadMapStateNotAllOK) { - FURI_LOG_I(TAG, "Load Map File Seccesful [Not all files]"); - } else { - FURI_LOG_E(TAG, "Broken Map File"); - } - - flipper_format_file_close(fff_data_file); - flipper_format_free(fff_data_file); - - furi_record_close(RECORD_STORAGE); - return ret; -} - -bool subrem_save_protocol_to_file(FlipperFormat* flipper_format, const char* sub_file_name) { - furi_assert(flipper_format); - furi_assert(sub_file_name); - - Storage* storage = furi_record_open(RECORD_STORAGE); - Stream* flipper_format_stream = flipper_format_get_raw_stream(flipper_format); - - bool saved = false; - uint32_t repeat = 200; - FuriString* file_dir = furi_string_alloc(); - - path_extract_dirname(sub_file_name, file_dir); - do { - // removing additional fields - flipper_format_delete_key(flipper_format, "Repeat"); - // flipper_format_delete_key(flipper_format, "Manufacture"); - - if(!storage_simply_remove(storage, sub_file_name)) { - break; - } - - //ToDo check Write - stream_seek(flipper_format_stream, 0, StreamOffsetFromStart); - stream_save_to_file(flipper_format_stream, storage, sub_file_name, FSOM_CREATE_ALWAYS); - - if(!flipper_format_insert_or_update_uint32(flipper_format, "Repeat", &repeat, 1)) { - FURI_LOG_E(TAG, "Unable Repeat"); - break; - } - - saved = true; - } while(0); - - furi_string_free(file_dir); - furi_record_close(RECORD_STORAGE); - return saved; -} - -void subrem_save_active_sub(void* context) { - furi_assert(context); - SubGhzRemoteApp* app = context; - - SubRemSubFilePreset* sub_preset = app->map_preset->subs_preset[app->chusen_sub]; - subrem_save_protocol_to_file( - sub_preset->fff_data, furi_string_get_cstr(sub_preset->file_path)); -} - -bool subrem_tx_start_sub(SubGhzRemoteApp* app, SubRemSubFilePreset* sub_preset) { - furi_assert(app); - furi_assert(sub_preset); - bool ret = false; - - subrem_tx_stop_sub(app, true); - - if(sub_preset->type == SubGhzProtocolTypeUnknown) { - ret = false; - } else { - FURI_LOG_I(TAG, "Send %s", furi_string_get_cstr(sub_preset->label)); - - subghz_txrx_load_decoder_by_name_protocol( - app->txrx, furi_string_get_cstr(sub_preset->protocaol_name)); - - subghz_txrx_set_preset( - app->txrx, - furi_string_get_cstr(sub_preset->freq_preset.name), - sub_preset->freq_preset.frequency, - NULL, - 0); -#ifndef FW_ORIGIN_Official - subghz_custom_btns_reset(); -#endif - if(subghz_txrx_tx_start(app->txrx, sub_preset->fff_data) == SubGhzTxRxStartTxStateOk) { - ret = true; - } - } - - return ret; -} - -bool subrem_tx_stop_sub(SubGhzRemoteApp* app, bool forced) { - furi_assert(app); - SubRemSubFilePreset* sub_preset = app->map_preset->subs_preset[app->chusen_sub]; - - if(forced || (sub_preset->type != SubGhzProtocolTypeRAW)) { - subghz_txrx_stop(app->txrx); -#ifndef FW_ORIGIN_Official - if(sub_preset->type == SubGhzProtocolTypeDynamic) { - subghz_txrx_reset_dynamic_and_custom_btns(app->txrx); - } - subghz_custom_btns_reset(); -#endif - return true; - } - - return false; -} - -SubRemLoadMapState subrem_load_from_file(SubGhzRemoteApp* app) { - furi_assert(app); - - FuriString* file_path = furi_string_alloc(); - SubRemLoadMapState ret = SubRemLoadMapStateBack; - - DialogsFileBrowserOptions browser_options; - dialog_file_browser_set_basic_options(&browser_options, SUBREM_APP_EXTENSION, &I_subrem_10px); - browser_options.base_path = SUBREM_APP_FOLDER; - - // Input events and views are managed by file_select - if(!dialog_file_browser_show(app->dialogs, app->file_path, app->file_path, &browser_options)) { - } else { - ret = subrem_map_file_load(app, furi_string_get_cstr(app->file_path)); - } - - furi_string_free(file_path); - - return ret; -} - -bool subrem_save_map_to_file(SubGhzRemoteApp* app) { - furi_assert(app); - - const char* file_name = furi_string_get_cstr(app->file_path); - bool saved = false; - FlipperFormat* fff_data = flipper_format_string_alloc(); - - SubRemSubFilePreset* sub_preset; - - flipper_format_write_header_cstr( - fff_data, SUBREM_APP_APP_FILE_TYPE, SUBREM_APP_APP_FILE_VERSION); - for(uint8_t i = 0; i < SubRemSubKeyNameMaxCount; i++) { - sub_preset = app->map_preset->subs_preset[i]; - if(!furi_string_empty(sub_preset->file_path)) { - flipper_format_write_string(fff_data, map_file_labels[i][0], sub_preset->file_path); - } - } - for(uint8_t i = 0; i < SubRemSubKeyNameMaxCount; i++) { - sub_preset = app->map_preset->subs_preset[i]; - if(!furi_string_empty(sub_preset->file_path)) { - flipper_format_write_string(fff_data, map_file_labels[i][1], sub_preset->label); - } - } - - Storage* storage = furi_record_open(RECORD_STORAGE); - Stream* flipper_format_stream = flipper_format_get_raw_stream(fff_data); - - do { - if(!storage_simply_remove(storage, file_name)) { - break; - } - //ToDo check Write - stream_seek(flipper_format_stream, 0, StreamOffsetFromStart); - stream_save_to_file(flipper_format_stream, storage, file_name, FSOM_CREATE_ALWAYS); - - saved = true; - } while(0); - - furi_record_close(RECORD_STORAGE); - flipper_format_free(fff_data); - - return saved; -} \ No newline at end of file diff --git a/applications/main/subghz_remote/subghz_remote_app_i.h b/applications/main/subghz_remote/subghz_remote_app_i.h deleted file mode 100644 index 2300b3e52..000000000 --- a/applications/main/subghz_remote/subghz_remote_app_i.h +++ /dev/null @@ -1,68 +0,0 @@ -#pragma once - -#include "helpers/subrem_types.h" -#include "helpers/subrem_presets.h" -#include "scenes/subrem_scene.h" - -#include "helpers/txrx/subghz_txrx.h" - -#include "subghz_remote_icons.h" - -#include "views/remote.h" -#include "views/edit_menu.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#define SUBREM_APP_FOLDER EXT_PATH("subghz_remote") -#define SUBREM_MAX_LEN_NAME 64 - -typedef struct { - Gui* gui; - ViewDispatcher* view_dispatcher; - SceneManager* scene_manager; - NotificationApp* notifications; - DialogsApp* dialogs; - Widget* widget; - Popup* popup; - TextInput* text_input; - Submenu* submenu; - - FuriString* file_path; - char file_name_tmp[SUBREM_MAX_LEN_NAME]; - - SubRemViewRemote* subrem_remote_view; - SubRemViewEditMenu* subrem_edit_menu; - - SubRemMapPreset* map_preset; - - SubGhzTxRx* txrx; - - bool map_not_saved; - - uint8_t chusen_sub; -} SubGhzRemoteApp; - -SubRemLoadMapState subrem_load_from_file(SubGhzRemoteApp* app); - -bool subrem_tx_start_sub(SubGhzRemoteApp* app, SubRemSubFilePreset* sub_preset); - -bool subrem_tx_stop_sub(SubGhzRemoteApp* app, bool forced); - -SubRemLoadMapState subrem_map_file_load(SubGhzRemoteApp* app, const char* file_path); - -void subrem_map_preset_reset(SubRemMapPreset* map_preset); - -bool subrem_save_map_to_file(SubGhzRemoteApp* app); - -void subrem_save_active_sub(void* context); \ No newline at end of file diff --git a/applications/main/subghz_remote/views/edit_menu.c b/applications/main/subghz_remote/views/edit_menu.c deleted file mode 100644 index 9b88182b5..000000000 --- a/applications/main/subghz_remote/views/edit_menu.c +++ /dev/null @@ -1,290 +0,0 @@ -#include "edit_menu.h" -#include "../subghz_remote_app_i.h" - -#include -#include - -#define subrem_view_edit_menu_MAX_LABEL_LENGTH 12 - -#define FRAME_HEIGHT 12 - -struct SubRemViewEditMenu { - View* view; - SubRemViewEditMenuCallback callback; - void* context; -}; - -typedef struct { - FuriString* label; - FuriString* file_path; - SubRemLoadSubState sub_state; - - uint8_t chusen; -} SubRemViewEditMenuModel; - -void subrem_view_edit_menu_set_callback( - SubRemViewEditMenu* subrem_view_edit_menu, - SubRemViewEditMenuCallback callback, - void* context) { - furi_assert(subrem_view_edit_menu); - - subrem_view_edit_menu->callback = callback; - subrem_view_edit_menu->context = context; -} - -void subrem_view_edit_menu_add_data_to_show( - SubRemViewEditMenu* subrem_view_edit_remote, - uint8_t index, - FuriString* label, - FuriString* path, - SubRemLoadSubState state) { - furi_assert(subrem_view_edit_remote); - - with_view_model( - subrem_view_edit_remote->view, - SubRemViewEditMenuModel * model, - { - model->chusen = index; - if(!furi_string_empty(label)) { - furi_string_set(model->label, label); - } else { - furi_string_set(model->label, "Empty label"); - } - furi_string_set(model->file_path, path); - model->sub_state = state; - }, - true); -} - -uint8_t subrem_view_edit_menu_get_index(SubRemViewEditMenu* subrem_view_edit_remote) { - furi_assert(subrem_view_edit_remote); - uint8_t index; - - with_view_model( - subrem_view_edit_remote->view, - SubRemViewEditMenuModel * model, - { index = model->chusen; }, - true); - return index; -} - -void subrem_view_edit_menu_draw(Canvas* canvas, SubRemViewEditMenuModel* model) { - canvas_clear(canvas); - canvas_set_color(canvas, ColorBlack); - - canvas_clear(canvas); - - // Draw bottom btn - canvas_set_font(canvas, FontSecondary); - elements_button_left(canvas, "Back"); - elements_button_center(canvas, "Edit"); - elements_button_right(canvas, "Save"); - - // Draw top frame - canvas_draw_line(canvas, 1, 0, 125, 0); - canvas_draw_box(canvas, 0, 1, 127, FRAME_HEIGHT - 2); - canvas_draw_line(canvas, 1, FRAME_HEIGHT - 1, 125, FRAME_HEIGHT - 1); - - canvas_set_color(canvas, ColorWhite); - - // Draw btn name - canvas_set_font(canvas, FontPrimary); - switch(model->chusen) { - case SubRemSubKeyNameUp: - canvas_draw_str(canvas, 3, FRAME_HEIGHT - 2, "UP"); - break; - - case SubRemSubKeyNameDown: - canvas_draw_str(canvas, 3, FRAME_HEIGHT - 2, "DOWN"); - break; - - case SubRemSubKeyNameLeft: - canvas_draw_str(canvas, 3, FRAME_HEIGHT - 2, "LEFT"); - break; - - case SubRemSubKeyNameRight: - canvas_draw_str(canvas, 3, FRAME_HEIGHT - 2, "RIGHT"); - break; - - case SubRemSubKeyNameOk: - canvas_draw_str(canvas, 3, FRAME_HEIGHT - 2, "OK"); - break; - - default: - break; - } - - // Draw Label - canvas_set_font(canvas, FontSecondary); - elements_text_box( - canvas, - 38, - 2, - 127 - 38, - FRAME_HEIGHT, - AlignCenter, - AlignBottom, - furi_string_empty(model->label) ? "Empty label" : furi_string_get_cstr(model->label), - true); - - // Draw arrow - canvas_set_color(canvas, ColorBlack); - if(model->chusen != 0) { - canvas_draw_icon(canvas, 119, 13, &I_Pin_arrow_up_7x9); - } - if(model->chusen != 4) { - canvas_draw_icon_ex(canvas, 119, 42, &I_Pin_arrow_up_7x9, IconRotation180); - } - - // Draw file_path - if(model->sub_state == SubRemLoadSubStateOK) { - canvas_set_font(canvas, FontSecondary); - elements_text_box( - canvas, - 1, - FRAME_HEIGHT + 1, - 118, - (63 - FRAME_HEIGHT * 2), - AlignLeft, - AlignTop, - furi_string_get_cstr(model->file_path), - false); - } else if(furi_string_empty(model->file_path)) { - canvas_set_font(canvas, FontPrimary); - canvas_draw_str(canvas, 1, FRAME_HEIGHT * 2 - 2, "Button not set"); - } else { - canvas_set_font(canvas, FontPrimary); - canvas_draw_str(canvas, 1, FRAME_HEIGHT * 2 - 2, "ERR:"); - canvas_set_font(canvas, FontSecondary); - switch(model->sub_state) { - case SubRemLoadSubStateErrorNoFile: - canvas_draw_str(canvas, 26, FRAME_HEIGHT * 2 - 2, "File not found"); - break; - case SubRemLoadSubStateErrorFreq: - canvas_draw_str(canvas, 26, FRAME_HEIGHT * 2 - 2, "Bad frequency"); - break; - case SubRemLoadSubStateErrorMod: - canvas_draw_str(canvas, 26, FRAME_HEIGHT * 2 - 2, "Bad modulation"); - break; - case SubRemLoadSubStateErrorProtocol: - canvas_draw_str(canvas, 26, FRAME_HEIGHT * 2 - 2, "Unsupported protocol"); - break; - - default: - break; - } - elements_text_box( - canvas, - 1, - FRAME_HEIGHT * 2, - 118, - 30, - AlignLeft, - AlignTop, - furi_string_get_cstr(model->file_path), - false); - } -} - -bool subrem_view_edit_menu_input(InputEvent* event, void* context) { - furi_assert(context); - SubRemViewEditMenu* subrem_view_edit_menu = context; - - if((event->key == InputKeyBack || event->key == InputKeyLeft) && - event->type == InputTypeShort) { - subrem_view_edit_menu->callback( - SubRemCustomEventViewEditMenuBack, subrem_view_edit_menu->context); - return true; - } else if(event->key == InputKeyUp && event->type == InputTypeShort) { - with_view_model( - subrem_view_edit_menu->view, - SubRemViewEditMenuModel * model, - { - if(model->chusen > 0) { - model->chusen -= 1; - }; - }, - true); - subrem_view_edit_menu->callback( - SubRemCustomEventViewEditMenuUP, subrem_view_edit_menu->context); - return true; - } else if(event->key == InputKeyDown && event->type == InputTypeShort) { - with_view_model( - subrem_view_edit_menu->view, - SubRemViewEditMenuModel * model, - { - if(model->chusen < 4) { - model->chusen += 1; - }; - }, - true); - subrem_view_edit_menu->callback( - SubRemCustomEventViewEditMenuDOWN, subrem_view_edit_menu->context); - return true; - } else if(event->key == InputKeyOk && event->type == InputTypeShort) { - subrem_view_edit_menu->callback( - SubRemCustomEventViewEditMenuEdit, subrem_view_edit_menu->context); - return true; - } else if(event->key == InputKeyRight && event->type == InputTypeShort) { - subrem_view_edit_menu->callback( - SubRemCustomEventViewEditMenuSave, subrem_view_edit_menu->context); - return true; - } - - return true; -} - -void subrem_view_edit_menu_enter(void* context) { - furi_assert(context); -} - -void subrem_view_edit_menu_exit(void* context) { - furi_assert(context); -} - -SubRemViewEditMenu* subrem_view_edit_menu_alloc() { - SubRemViewEditMenu* subrem_view_edit_menu = malloc(sizeof(SubRemViewEditMenu)); - - // View allocation and configuration - subrem_view_edit_menu->view = view_alloc(); - view_allocate_model( - subrem_view_edit_menu->view, ViewModelTypeLocking, sizeof(SubRemViewEditMenuModel)); - view_set_context(subrem_view_edit_menu->view, subrem_view_edit_menu); - view_set_draw_callback( - subrem_view_edit_menu->view, (ViewDrawCallback)subrem_view_edit_menu_draw); - view_set_input_callback(subrem_view_edit_menu->view, subrem_view_edit_menu_input); - view_set_enter_callback(subrem_view_edit_menu->view, subrem_view_edit_menu_enter); - view_set_exit_callback(subrem_view_edit_menu->view, subrem_view_edit_menu_exit); - - with_view_model( - subrem_view_edit_menu->view, - SubRemViewEditMenuModel * model, - { - model->label = furi_string_alloc(); // furi_string_alloc_set_str("LABEL"); - model->file_path = furi_string_alloc(); // furi_string_alloc_set_str("FILE_PATH"); - - model->chusen = 0; - }, - true); - return subrem_view_edit_menu; -} - -void subrem_view_edit_menu_free(SubRemViewEditMenu* subghz_edit_menu) { - furi_assert(subghz_edit_menu); - - with_view_model( - subghz_edit_menu->view, - SubRemViewEditMenuModel * model, - { - furi_string_free(model->label); - furi_string_free(model->file_path); - }, - true); - view_free(subghz_edit_menu->view); - free(subghz_edit_menu); -} - -View* subrem_view_edit_menu_get_view(SubRemViewEditMenu* subrem_view_edit_menu) { - furi_assert(subrem_view_edit_menu); - return subrem_view_edit_menu->view; -} \ No newline at end of file diff --git a/applications/main/subghz_remote/views/edit_menu.h b/applications/main/subghz_remote/views/edit_menu.h deleted file mode 100644 index 7ceb7fac0..000000000 --- a/applications/main/subghz_remote/views/edit_menu.h +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once - -#include -#include "../helpers/subrem_custom_event.h" -#include "../helpers/subrem_presets.h" - -typedef struct SubRemViewEditMenu SubRemViewEditMenu; - -typedef void (*SubRemViewEditMenuCallback)(SubRemCustomEvent event, void* context); - -void subrem_view_edit_menu_set_callback( - SubRemViewEditMenu* subrem_view_edit_menu, - SubRemViewEditMenuCallback callback, - void* context); - -SubRemViewEditMenu* subrem_view_edit_menu_alloc(); - -void subrem_view_edit_menu_free(SubRemViewEditMenu* subrem_view_edit_menu); - -View* subrem_view_edit_menu_get_view(SubRemViewEditMenu* subrem_view_edit_menu); - -void subrem_view_edit_menu_add_data_to_show( - SubRemViewEditMenu* subrem_view_edit_remote, - uint8_t index, - FuriString* label, - FuriString* path, - SubRemLoadSubState state); - -uint8_t subrem_view_edit_menu_get_index(SubRemViewEditMenu* subrem_view_edit_remote); \ No newline at end of file diff --git a/applications/main/subghz_remote/views/remote.c b/applications/main/subghz_remote/views/remote.c deleted file mode 100644 index fc7608624..000000000 --- a/applications/main/subghz_remote/views/remote.c +++ /dev/null @@ -1,307 +0,0 @@ -#include "remote.h" -#include "../subghz_remote_app_i.h" - -#include -#include - -#include - -#define SUBREM_VIEW_REMOTE_MAX_LABEL_LENGTH 30 -#define SUBREM_VIEW_REMOTE_LEFT_OFFSET 10 -#define SUBREM_VIEW_REMOTE_RIGHT_OFFSET 22 - -struct SubRemViewRemote { - View* view; - SubRemViewRemoteCallback callback; - void* context; -}; - -typedef struct { - char* labels[SubRemSubKeyNameMaxCount]; - - SubRemViewRemoteState state; - - uint8_t pressed_btn; - bool is_external; -} SubRemViewRemoteModel; - -void subrem_view_remote_set_callback( - SubRemViewRemote* subrem_view_remote, - SubRemViewRemoteCallback callback, - void* context) { - furi_assert(subrem_view_remote); - - subrem_view_remote->callback = callback; - subrem_view_remote->context = context; -} - -void subrem_view_remote_update_data_labels( - SubRemViewRemote* subrem_view_remote, - SubRemSubFilePreset** subs_presets) { - furi_assert(subrem_view_remote); - furi_assert(subs_presets); - - FuriString* labels[SubRemSubKeyNameMaxCount]; - SubRemSubFilePreset* sub_preset; - - for(uint8_t i = 0; i < SubRemSubKeyNameMaxCount; i++) { - sub_preset = subs_presets[i]; - switch(sub_preset->load_state) { - case SubRemLoadSubStateOK: - if(!furi_string_empty(sub_preset->label)) { - labels[i] = furi_string_alloc_set(sub_preset->label); - } else if(!furi_string_empty(sub_preset->file_path)) { - labels[i] = furi_string_alloc(); - path_extract_filename(sub_preset->file_path, labels[i], true); - } else { - labels[i] = furi_string_alloc_set("Empty Label"); - } - break; - - case SubRemLoadSubStateErrorNoFile: - labels[i] = furi_string_alloc_set("[X] Can't open file"); - break; - - case SubRemLoadSubStateErrorFreq: - case SubRemLoadSubStateErrorMod: - case SubRemLoadSubStateErrorProtocol: - labels[i] = furi_string_alloc_set("[X] Error in .sub file"); - break; - - default: - labels[i] = furi_string_alloc_set(""); - break; - } - } - - with_view_model( - subrem_view_remote->view, - SubRemViewRemoteModel * model, - { - for(uint8_t i = 0; i < SubRemSubKeyNameMaxCount; i++) { - strncpy( - model->labels[i], - furi_string_get_cstr(labels[i]), - SUBREM_VIEW_REMOTE_MAX_LABEL_LENGTH); - } - }, - true); - - for(uint8_t i = 0; i < SubRemSubKeyNameMaxCount; i++) { - furi_string_free(labels[i]); - } -} - -void subrem_view_remote_set_state( - SubRemViewRemote* subrem_view_remote, - SubRemViewRemoteState state, - uint8_t presed_btn) { - furi_assert(subrem_view_remote); - with_view_model( - subrem_view_remote->view, - SubRemViewRemoteModel * model, - { - model->state = state; - model->pressed_btn = presed_btn; - }, - true); -} - -void subrem_view_remote_set_radio(SubRemViewRemote* subrem_view_remote, bool external) { - furi_assert(subrem_view_remote); - with_view_model( - subrem_view_remote->view, - SubRemViewRemoteModel * model, - { model->is_external = external; }, - true); -} - -void subrem_view_remote_draw(Canvas* canvas, SubRemViewRemoteModel* model) { - canvas_clear(canvas); - canvas_set_color(canvas, ColorBlack); - - canvas_clear(canvas); - - //Icons for Labels - //canvas_draw_icon(canvas, 0, 0, &I_SubGHzRemote_LeftAlignedButtons_9x64); - canvas_draw_icon(canvas, 1, 5, &I_ButtonUp_7x4); - canvas_draw_icon(canvas, 1, 15, &I_ButtonDown_7x4); - canvas_draw_icon(canvas, 2, 23, &I_ButtonLeft_4x7); - canvas_draw_icon(canvas, 2, 33, &I_ButtonRight_4x7); - canvas_draw_icon(canvas, 0, 42, &I_Ok_btn_9x9); - canvas_draw_icon(canvas, 0, 53, &I_back_10px); - - //Labels - canvas_set_font(canvas, FontSecondary); - uint8_t y = 0; - for(uint8_t i = 0; i < SubRemSubKeyNameMaxCount; i++) { - elements_text_box( - canvas, - SUBREM_VIEW_REMOTE_LEFT_OFFSET, - y + 2, - 126 - SUBREM_VIEW_REMOTE_LEFT_OFFSET - SUBREM_VIEW_REMOTE_RIGHT_OFFSET, - 12, - AlignLeft, - AlignBottom, - model->labels[i], - false); - y += 10; - } - - if(model->state == SubRemViewRemoteStateOFF) { - elements_button_left(canvas, "Back"); - elements_button_right(canvas, "Save"); - } else { - canvas_draw_str_aligned(canvas, 11, 62, AlignLeft, AlignBottom, "Hold=Exit."); - canvas_draw_str_aligned( - canvas, 126, 62, AlignRight, AlignBottom, ((model->is_external) ? "Ext" : "Int")); - } - - //Status text and indicator - canvas_draw_icon(canvas, 113, 15, &I_Pin_cell_13x13); - - if(model->state == SubRemViewRemoteStateIdle || model->state == SubRemViewRemoteStateOFF) { - canvas_draw_str_aligned(canvas, 126, 10, AlignRight, AlignBottom, "Idle"); - } else { - switch(model->state) { - case SubRemViewRemoteStateSending: - canvas_draw_str_aligned(canvas, 126, 10, AlignRight, AlignBottom, "Send"); - break; - case SubRemViewRemoteStateLoading: - canvas_draw_str_aligned(canvas, 126, 10, AlignRight, AlignBottom, "Load"); - break; - default: -#if FURI_DEBUG - canvas_draw_str_aligned(canvas, 126, 10, AlignRight, AlignBottom, "Wrong_state"); -#endif - break; - } - - switch(model->pressed_btn) { - case SubRemSubKeyNameUp: - canvas_draw_icon(canvas, 116, 17, &I_Pin_arrow_up_7x9); - break; - case SubRemSubKeyNameDown: - canvas_draw_icon_ex(canvas, 116, 17, &I_Pin_arrow_up_7x9, IconRotation180); - break; - case SubRemSubKeyNameLeft: - canvas_draw_icon_ex(canvas, 115, 18, &I_Pin_arrow_up_7x9, IconRotation270); - break; - case SubRemSubKeyNameRight: - canvas_draw_icon_ex(canvas, 115, 18, &I_Pin_arrow_up_7x9, IconRotation90); - break; - case SubRemSubKeyNameOk: - canvas_draw_icon(canvas, 116, 18, &I_Pin_star_7x7); - break; - } - } -} - -bool subrem_view_remote_input(InputEvent* event, void* context) { - furi_assert(context); - SubRemViewRemote* subrem_view_remote = context; - - if(event->key == InputKeyBack && event->type == InputTypeLong) { - subrem_view_remote->callback(SubRemCustomEventViewRemoteBack, subrem_view_remote->context); - return true; - } else if(event->key == InputKeyBack && event->type == InputTypeShort) { - with_view_model( - subrem_view_remote->view, - SubRemViewRemoteModel * model, - { model->pressed_btn = 0; }, - true); - subrem_view_remote->callback( - SubRemCustomEventViewRemoteForcedStop, subrem_view_remote->context); - return true; - } else if(event->key == InputKeyBack) { - return true; - } - // BACK button processing end - - if(event->key == InputKeyUp && event->type == InputTypePress) { - subrem_view_remote->callback( - SubRemCustomEventViewRemoteStartUP, subrem_view_remote->context); - return true; - } else if(event->key == InputKeyDown && event->type == InputTypePress) { - subrem_view_remote->callback( - SubRemCustomEventViewRemoteStartDOWN, subrem_view_remote->context); - return true; - } else if(event->key == InputKeyLeft && event->type == InputTypePress) { - subrem_view_remote->callback( - SubRemCustomEventViewRemoteStartLEFT, subrem_view_remote->context); - return true; - } else if(event->key == InputKeyRight && event->type == InputTypePress) { - subrem_view_remote->callback( - SubRemCustomEventViewRemoteStartRIGHT, subrem_view_remote->context); - return true; - } else if(event->key == InputKeyOk && event->type == InputTypePress) { - subrem_view_remote->callback( - SubRemCustomEventViewRemoteStartOK, subrem_view_remote->context); - return true; - } else if(event->type == InputTypeRelease) { - subrem_view_remote->callback(SubRemCustomEventViewRemoteStop, subrem_view_remote->context); - return true; - } - - return true; -} - -void subrem_view_remote_enter(void* context) { - furi_assert(context); -} - -void subrem_view_remote_exit(void* context) { - furi_assert(context); -} - -SubRemViewRemote* subrem_view_remote_alloc() { - SubRemViewRemote* subrem_view_remote = malloc(sizeof(SubRemViewRemote)); - - // View allocation and configuration - subrem_view_remote->view = view_alloc(); - view_allocate_model( - subrem_view_remote->view, ViewModelTypeLocking, sizeof(SubRemViewRemoteModel)); - view_set_context(subrem_view_remote->view, subrem_view_remote); - view_set_draw_callback(subrem_view_remote->view, (ViewDrawCallback)subrem_view_remote_draw); - view_set_input_callback(subrem_view_remote->view, subrem_view_remote_input); - view_set_enter_callback(subrem_view_remote->view, subrem_view_remote_enter); - view_set_exit_callback(subrem_view_remote->view, subrem_view_remote_exit); - - with_view_model( - subrem_view_remote->view, - SubRemViewRemoteModel * model, - { - model->state = SubRemViewRemoteStateIdle; - - for(uint8_t i = 0; i < SubRemSubKeyNameMaxCount; i++) { - model->labels[i] = malloc(sizeof(char) * SUBREM_VIEW_REMOTE_MAX_LABEL_LENGTH + 1); - strcpy(model->labels[i], ""); - } - - model->pressed_btn = 0; - model->is_external = false; - }, - true); - return subrem_view_remote; -} - -void subrem_view_remote_free(SubRemViewRemote* subghz_remote) { - furi_assert(subghz_remote); - - with_view_model( - subghz_remote->view, - SubRemViewRemoteModel * model, - { - for(uint8_t i = 0; i < SubRemSubKeyNameMaxCount; i++) { - free(model->labels[i]); - } - }, - true); - view_free(subghz_remote->view); - free(subghz_remote); -} - -View* subrem_view_remote_get_view(SubRemViewRemote* subrem_view_remote) { - furi_assert(subrem_view_remote); - return subrem_view_remote->view; -} \ No newline at end of file diff --git a/applications/main/subghz_remote/views/remote.h b/applications/main/subghz_remote/views/remote.h deleted file mode 100644 index 39f9a007d..000000000 --- a/applications/main/subghz_remote/views/remote.h +++ /dev/null @@ -1,38 +0,0 @@ -#pragma once - -#include -#include "../helpers/subrem_custom_event.h" -#include "../helpers/subrem_presets.h" - -typedef enum { - SubRemViewRemoteStateIdle, - SubRemViewRemoteStateLoading, - SubRemViewRemoteStateSending, - SubRemViewRemoteStateOFF, -} SubRemViewRemoteState; - -typedef struct SubRemViewRemote SubRemViewRemote; - -typedef void (*SubRemViewRemoteCallback)(SubRemCustomEvent event, void* context); - -void subrem_view_remote_set_callback( - SubRemViewRemote* subrem_view_remote, - SubRemViewRemoteCallback callback, - void* context); - -SubRemViewRemote* subrem_view_remote_alloc(); - -void subrem_view_remote_free(SubRemViewRemote* subrem_view_remote); - -View* subrem_view_remote_get_view(SubRemViewRemote* subrem_view_remote); - -void subrem_view_remote_update_data_labels( - SubRemViewRemote* subrem_view_remote, - SubRemSubFilePreset** subs_presets); - -void subrem_view_remote_set_state( - SubRemViewRemote* subrem_view_remote, - SubRemViewRemoteState state, - uint8_t presed_btn); - -void subrem_view_remote_set_radio(SubRemViewRemote* subrem_view_remote, bool external); \ No newline at end of file From 654b3245c27537ff3ad105ed0dcd7605f0be24ee Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Mon, 4 Sep 2023 23:14:07 +0300 Subject: [PATCH 6/7] fix module p2 --- .gitmodules | 2 +- applications/main/subghz_remote | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 160000 applications/main/subghz_remote diff --git a/.gitmodules b/.gitmodules index e68c05465..6f73e125a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -40,5 +40,5 @@ url = https://github.com/flipperdevices/stm32wb_copro.git [submodule "subghz_remote"] path = applications/main/subghz_remote - url = https://github.com/DarkFlippers/SubGHz_Remote + url = https://github.com/DarkFlippers/SubGHz_Remote.git branch = ufw_main_app diff --git a/applications/main/subghz_remote b/applications/main/subghz_remote new file mode 160000 index 000000000..64a21d952 --- /dev/null +++ b/applications/main/subghz_remote @@ -0,0 +1 @@ +Subproject commit 64a21d9521161268407f44395302d15d5c37b89e From 1cafa9a46bad33ba323314bb2fabd36ddf29d7a9 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Mon, 4 Sep 2023 23:15:23 +0300 Subject: [PATCH 7/7] Fix naming var --- applications/main/subghz_remote | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/main/subghz_remote b/applications/main/subghz_remote index 64a21d952..208134409 160000 --- a/applications/main/subghz_remote +++ b/applications/main/subghz_remote @@ -1 +1 @@ -Subproject commit 64a21d9521161268407f44395302d15d5c37b89e +Subproject commit 2081344093ee4d1f72d2de6335884cc5e2d5952a