From f89983e2fa1593bedaa1bc810686eb6fd576b7bd Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Wed, 28 Dec 2022 21:04:01 +0300 Subject: [PATCH 001/506] SubGhz: fix encoder CAME by @Skorpionm | OFW PR 2210 --- lib/subghz/protocols/came.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/subghz/protocols/came.c b/lib/subghz/protocols/came.c index 1ac4ec053..bed26d7d2 100644 --- a/lib/subghz/protocols/came.c +++ b/lib/subghz/protocols/came.c @@ -119,7 +119,9 @@ static bool subghz_protocol_encoder_came_get_upload(SubGhzProtocolEncoderCame* i //Send header instance->encoder.upload[index++] = level_duration_make( false, - ((instance->generic.data_count_bit == CAME_24_COUNT_BIT) ? + (((instance->generic.data_count_bit == CAME_24_COUNT_BIT) || + (instance->generic.data_count_bit == + subghz_protocol_came_const.min_count_bit_for_found)) ? (uint32_t)subghz_protocol_came_const.te_short * 76 : (uint32_t)subghz_protocol_came_const.te_short * 39)); //Send start bit From dc6379a1ca0785a2c1f646140516652c8ad4fe99 Mon Sep 17 00:00:00 2001 From: amec0e <88857687+amec0e@users.noreply.github.com> Date: Wed, 28 Dec 2022 18:16:26 +0000 Subject: [PATCH 002/506] Updated tv.ir Added POWER only button support for Sony Bravia KDL40RD453 --- assets/resources/infrared/assets/tv.ir | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/assets/resources/infrared/assets/tv.ir b/assets/resources/infrared/assets/tv.ir index a4df4d4c4..e5bc0c101 100755 --- a/assets/resources/infrared/assets/tv.ir +++ b/assets/resources/infrared/assets/tv.ir @@ -1,7 +1,15 @@ Filetype: IR library file Version: 1 -# Last Updated 20th Dec, 2022 -# Last Checked 26th Dec, 2022 +# Last Updated 28th Dec, 2022 +# Last Checked 28th Dec, 2022 +# +# Sony KDL40RD453 +# +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 2445 582 1221 603 548 602 1191 609 572 602 1191 609 542 607 544 631 1172 603 568 606 545 605 566 608 543 26263 2414 611 1192 607 544 606 1197 602 569 606 1197 602 539 611 540 635 1168 606 565 610 541 608 563 587 564 # name: POWER type: parsed @@ -1773,4 +1781,4 @@ type: parsed protocol: NEC address: 00 00 00 00 command: 33 00 00 00 -# +# From a96eb74f91e8bf5b4c8a3232c6cf414ca02991d1 Mon Sep 17 00:00:00 2001 From: amec0e <88857687+amec0e@users.noreply.github.com> Date: Wed, 28 Dec 2022 18:22:34 +0000 Subject: [PATCH 003/506] Updated tv.ir Added POWER only button support for Sony Bravia KDL40RD453 --- assets/resources/infrared/assets/tv.ir | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/resources/infrared/assets/tv.ir b/assets/resources/infrared/assets/tv.ir index e5bc0c101..8c27461fe 100755 --- a/assets/resources/infrared/assets/tv.ir +++ b/assets/resources/infrared/assets/tv.ir @@ -8,7 +8,7 @@ Version: 1 name: POWER type: raw frequency: 38000 -duty_cycle: 0.330000 +duty_cycle: 0.33 data: 2445 582 1221 603 548 602 1191 609 572 602 1191 609 542 607 544 631 1172 603 568 606 545 605 566 608 543 26263 2414 611 1192 607 544 606 1197 602 569 606 1197 602 539 611 540 635 1168 606 565 610 541 608 563 587 564 # name: POWER From 984528d366d7d4af16607b2c3ccf22f5b0826359 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Thu, 29 Dec 2022 00:34:27 +0300 Subject: [PATCH 004/506] Remove wrong scene state set --- applications/services/desktop/scenes/desktop_scene_main.c | 1 - 1 file changed, 1 deletion(-) diff --git a/applications/services/desktop/scenes/desktop_scene_main.c b/applications/services/desktop/scenes/desktop_scene_main.c index c6a7ef450..a59e632bb 100644 --- a/applications/services/desktop/scenes/desktop_scene_main.c +++ b/applications/services/desktop/scenes/desktop_scene_main.c @@ -106,7 +106,6 @@ bool desktop_scene_main_on_event(void* context, SceneManagerEvent event) { case DesktopMainEventLock: if(desktop->settings.pin_code.length > 0) { - scene_manager_set_scene_state(desktop->scene_manager, DesktopSceneLockMenu, 1); desktop_pin_lock(&desktop->settings); desktop_lock(desktop); } else { From a850aa8f2c48ecc216b835f96fed53833610a020 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Thu, 29 Dec 2022 01:41:23 +0300 Subject: [PATCH 005/506] Force no dirty build status for multiple builds kostili and velosipedy --- scripts/version.py | 7 +++++++ site_scons/commandline.scons | 5 +++++ site_scons/environ.scons | 1 + 3 files changed, 13 insertions(+) diff --git a/scripts/version.py b/scripts/version.py index a51909233..53d39af1e 100644 --- a/scripts/version.py +++ b/scripts/version.py @@ -42,6 +42,13 @@ class GitVersion: or "" ) + force_no_dirty = ( + os.environ.get("FORCE_NO_DIRTY", None) + or "" + ) + if (force_no_dirty != ""): + dirty = False + if (custom_fz_name != "") and (len(custom_fz_name) <= 8) and (custom_fz_name.isalnum()) and (custom_fz_name.isascii()): return { "GIT_COMMIT": commit, diff --git a/site_scons/commandline.scons b/site_scons/commandline.scons index 3e6859b4e..3419c6934 100644 --- a/site_scons/commandline.scons +++ b/site_scons/commandline.scons @@ -106,6 +106,11 @@ vars.AddVariables( "Replaces OTP flipper name with custom string of 8 chars", "", ), + ( + "FORCE_NO_DIRTY", + "Force disable dirty status of the build", + "", + ), ( "COPRO_CUBE_VERSION", "Cube version", diff --git a/site_scons/environ.scons b/site_scons/environ.scons index 128a667f1..0ffc8a6a2 100644 --- a/site_scons/environ.scons +++ b/site_scons/environ.scons @@ -21,6 +21,7 @@ variables_to_forward = [ "WORKFLOW_BRANCH_OR_TAG", "DIST_SUFFIX", "CUSTOM_FLIPPER_NAME", + "FORCE_NO_DIRTY", # Python & other tools "HOME", "APPDATA", From 4e3506ab2e1a448a91b41cdade07e475e073168d Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Thu, 29 Dec 2022 01:43:24 +0300 Subject: [PATCH 006/506] Show OTP flipper region on debug and about screens but keep region zero for ble and usb hardware info report --- .../desktop/views/desktop_view_debug.c | 2 +- applications/settings/about/about.c | 2 +- firmware/targets/f7/api_symbols.csv | 2 ++ .../targets/f7/furi_hal/furi_hal_version.c | 10 +++++++++- .../furi_hal_include/furi_hal_version.h | 20 +++++++++++++++---- 5 files changed, 29 insertions(+), 7 deletions(-) diff --git a/applications/services/desktop/views/desktop_view_debug.c b/applications/services/desktop/views/desktop_view_debug.c index e679cf636..8c72001b4 100644 --- a/applications/services/desktop/views/desktop_view_debug.c +++ b/applications/services/desktop/views/desktop_view_debug.c @@ -42,7 +42,7 @@ void desktop_debug_render(Canvas* canvas, void* model) { furi_hal_version_get_hw_target(), furi_hal_version_get_hw_body(), furi_hal_version_get_hw_connect(), - furi_hal_version_get_hw_region_name(), + furi_hal_version_get_hw_region_name_otp(), furi_hal_region_get_name(), my_name ? my_name : "Unknown"); canvas_draw_str(canvas, 0, 19 + STATUS_BAR_Y_SHIFT, buffer); diff --git a/applications/settings/about/about.c b/applications/settings/about/about.c index 1444fc1e2..e0f8e1247 100644 --- a/applications/settings/about/about.c +++ b/applications/settings/about/about.c @@ -120,7 +120,7 @@ static DialogMessageButton hw_version_screen(DialogsApp* dialogs, DialogMessage* furi_hal_version_get_hw_target(), furi_hal_version_get_hw_body(), furi_hal_version_get_hw_connect(), - furi_hal_version_get_hw_region_name(), + furi_hal_version_get_hw_region_name_otp(), furi_hal_region_get_name(), my_name ? my_name : "Unknown"); diff --git a/firmware/targets/f7/api_symbols.csv b/firmware/targets/f7/api_symbols.csv index e495f66e9..e440a6dae 100644 --- a/firmware/targets/f7/api_symbols.csv +++ b/firmware/targets/f7/api_symbols.csv @@ -1391,6 +1391,8 @@ Function,+,furi_hal_version_get_hw_connect,uint8_t, Function,+,furi_hal_version_get_hw_display,FuriHalVersionDisplay, Function,+,furi_hal_version_get_hw_region,FuriHalVersionRegion, Function,+,furi_hal_version_get_hw_region_name,const char*, +Function,+,furi_hal_version_get_hw_region_name_otp,const char*, +Function,+,furi_hal_version_get_hw_region_otp,FuriHalVersionRegion, Function,+,furi_hal_version_get_hw_target,uint8_t, Function,+,furi_hal_version_get_hw_timestamp,uint32_t, Function,+,furi_hal_version_get_hw_version,uint8_t, diff --git a/firmware/targets/f7/furi_hal/furi_hal_version.c b/firmware/targets/f7/furi_hal/furi_hal_version.c index cfc005f85..641b93d07 100644 --- a/firmware/targets/f7/furi_hal/furi_hal_version.c +++ b/firmware/targets/f7/furi_hal/furi_hal_version.c @@ -266,8 +266,16 @@ FuriHalVersionRegion furi_hal_version_get_hw_region() { return FuriHalVersionRegionUnknown; } +FuriHalVersionRegion furi_hal_version_get_hw_region_otp() { + return furi_hal_version.board_region; +} + const char* furi_hal_version_get_hw_region_name() { - switch(furi_hal_version_get_hw_region()) { + return "R00"; +} + +const char* furi_hal_version_get_hw_region_name_otp() { + switch(furi_hal_version_get_hw_region_otp()) { case FuriHalVersionRegionUnknown: return "R00"; case FuriHalVersionRegionEuRu: diff --git a/firmware/targets/furi_hal_include/furi_hal_version.h b/firmware/targets/furi_hal_include/furi_hal_version.h index 720fdfd17..f12b6d7e7 100644 --- a/firmware/targets/furi_hal_include/furi_hal_version.h +++ b/firmware/targets/furi_hal_include/furi_hal_version.h @@ -103,17 +103,29 @@ FuriHalVersionColor furi_hal_version_get_hw_color(); */ uint8_t furi_hal_version_get_hw_connect(); -/** Get hardware region +/** Get hardware region (fake) = 0 * - * @return Hardware Region + * @return Hardware Region (fake) */ FuriHalVersionRegion furi_hal_version_get_hw_region(); -/** Get hardware region name +/** Get hardware region name (fake) = R00 + * + * @return Hardware Region name (fake) + */ +const char* furi_hal_version_get_hw_region_name(); + +/** Get hardware region (OTP) + * + * @return Hardware Region + */ +FuriHalVersionRegion furi_hal_version_get_hw_region_otp(); + +/** Get hardware region name (OTP) * * @return Hardware Region name */ -const char* furi_hal_version_get_hw_region_name(); +const char* furi_hal_version_get_hw_region_name_otp(); /** Get hardware display id * From cc30c0d01d589710f75c8db6babed13dfd65569c Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Thu, 29 Dec 2022 01:50:31 +0300 Subject: [PATCH 007/506] Builds with extra apps pack included many of you asked, now it will be done --- .drone.yml | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 54 insertions(+), 3 deletions(-) diff --git a/.drone.yml b/.drone.yml index defde9435..6d9c226cb 100644 --- a/.drone.yml +++ b/.drone.yml @@ -24,25 +24,50 @@ steps: - ls -laS artifacts-default/f7-update-${DRONE_TAG} - sed -i 's/(version)/'${DRONE_TAG}'/g' CHANGELOG.md - echo '# [Install via Web Updater](https://lab.flipper.net/?url=https://unleashedflip.com/fw/${DRONE_TAG}/flipper-z-f7-update-'${DRONE_TAG}'.tgz&channel=release-cfw&version='${DRONE_TAG}')' >> CHANGELOG.md + - echo '' >> CHANGELOG.md + - echo '### [Version without custom animations - Install via Web Updater](https://lab.flipper.net/?url=https://unleashedflip.com/fw_no_anim/flipper-z-f7-update-'${DRONE_TAG}'n.tgz&channel=release-cfw&version='${DRONE_TAG}'n)' >> CHANGELOG.md + - echo '' >> CHANGELOG.md + - echo '### [Version with extra apps - Install via Web Updater](https://lab.flipper.net/?url=https://unleashedflip.com/fw_extra_apps/flipper-z-f7-update-'${DRONE_TAG}'e.tgz&channel=release-cfw&version='${DRONE_TAG}'e)' >> CHANGELOG.md environment: FBT_TOOLS_CUSTOM_LINK: from_secret: fbt_link - - name: "Build no anims FW" + - name: "Build with extra apps" + image: hfdj/fztools + pull: never + commands: + - git clone https://github.com/xMasterX/unleashed-extra-pack.git + - cp -R unleashed-extra-pack/apps/ assets/resources/apps + - rm -rf unleashed-extra-pack + - export DIST_SUFFIX=${DRONE_TAG}e + - export WORKFLOW_BRANCH_OR_TAG=release-cfw + - export FORCE_NO_DIRTY=yes + - rm -f build/f7-firmware-C/toolbox/version.* + - ./fbt COMPACT=1 DEBUG=0 updater_package + - mkdir artifacts-extra-apps + - mv dist/f7-C/* artifacts-extra-apps/ + - ls -laS artifacts-extra-apps + - ls -laS artifacts-extra-apps/f7-update-${DRONE_TAG}e + environment: + FBT_TOOLS_CUSTOM_LINK: + from_secret: fbt_link + + - name: "Build with ofw anims" image: hfdj/fztools pull: never commands: - rm -f assets/dolphin/external/manifest.txt - cp .ci_files/anims_ofw.txt assets/dolphin/external/manifest.txt + - rm -rf assets/resources/apps/ - export DIST_SUFFIX=${DRONE_TAG}n - export WORKFLOW_BRANCH_OR_TAG=no-custom-anims + - export FORCE_NO_DIRTY=yes + - rm -f build/f7-firmware-C/toolbox/version.* - ./fbt COMPACT=1 DEBUG=0 updater_package - mkdir artifacts-ofw-anims - mv dist/f7-C/* artifacts-ofw-anims/ - ls -laS artifacts-ofw-anims - ls -laS artifacts-ofw-anims/f7-update-${DRONE_TAG}n - - echo '' >> CHANGELOG.md - - echo '### [Version without custom animations - Install via Web Updater](https://lab.flipper.net/?url=https://unleashedflip.com/fw_no_anim/flipper-z-f7-update-'${DRONE_TAG}'n.tgz&channel=release-cfw&version='${DRONE_TAG}'n)' >> CHANGELOG.md environment: FBT_TOOLS_CUSTOM_LINK: from_secret: fbt_link @@ -50,13 +75,17 @@ steps: - name: "Bundle self-update packages" image: kramos/alpine-zip commands: + - cp artifacts-extra-apps/flipper-z-f7-update-${DRONE_TAG}e.tgz . - cp artifacts-ofw-anims/flipper-z-f7-update-${DRONE_TAG}n.tgz . - cp artifacts-default/flipper-z-f7-update-${DRONE_TAG}.tgz . + - zip -r artifacts-extra-apps/flipper-z-f7-update-${DRONE_TAG}e.zip artifacts-extra-apps/f7-update-${DRONE_TAG}e - zip -r artifacts-ofw-anims/flipper-z-f7-update-${DRONE_TAG}n.zip artifacts-ofw-anims/f7-update-${DRONE_TAG}n - zip -r artifacts-default/flipper-z-f7-update-${DRONE_TAG}.zip artifacts-default/f7-update-${DRONE_TAG} - tar czpf artifacts-default/flipper-z-any-scripts-${DRONE_TAG}.tgz scripts debug + - rm -rf artifacts-extra-apps/f7-update-${DRONE_TAG} - rm -rf artifacts-ofw-anims/f7-update-${DRONE_TAG} - rm -rf artifacts-default/f7-update-${DRONE_TAG} + - ls -laS artifacts-extra-apps - ls -laS artifacts-ofw-anims - ls -laS artifacts-default - mv artifacts-default/ ${DRONE_TAG} @@ -98,6 +127,21 @@ steps: from_secret: dep_target_noanim source: flipper-z-f7-update-${DRONE_TAG}n.tgz + - name: "Upload extra apps version to updates srv" + image: appleboy/drone-scp + settings: + host: + from_secret: dep_host + username: + from_secret: dep_user + password: + from_secret: dep_passwd + port: + from_secret: dep_port + target: + from_secret: dep_target_extra + source: flipper-z-f7-update-${DRONE_TAG}e.tgz + - name: "Do Github release" image: ddplugins/github-release pull: never @@ -111,6 +155,7 @@ steps: - ${DRONE_TAG}/*.tgz - ${DRONE_TAG}/*.zip - artifacts-ofw-anims/*.tgz + - artifacts-extra-apps/*.tgz title: ${DRONE_TAG} note: CHANGELOG.md checksum: @@ -155,6 +200,9 @@ steps: [-Version without custom animations - Install via Web Updater-](https://lab.flipper.net/?url=https://unleashedflip.com/fw_no_anim/flipper-z-f7-update-${DRONE_TAG}n.tgz&channel=release-cfw&version=${DRONE_TAG}n) + [-Version with extra apps - Install via Web Updater-](https://lab.flipper.net/?url=https://unleashedflip.com/fw_extra_apps/flipper-z-f7-update-${DRONE_TAG}e.tgz&channel=release-cfw&version=${DRONE_TAG}e) + + [-Install via Web Updater-](https://lab.flipper.net/?url=https://unleashedflip.com/fw/${DRONE_TAG}/flipper-z-f7-update-${DRONE_TAG}.tgz&channel=release-cfw&version=${DRONE_TAG})" document: - ${DRONE_TAG}/flipper-z-f7-update-${DRONE_TAG}.tgz @@ -184,6 +232,9 @@ steps: [-Version without custom animations - Install via Web Updater-](https://lab.flipper.net/?url=https://unleashedflip.com/fw_no_anim/flipper-z-f7-update-${DRONE_TAG}n.tgz&channel=release-cfw&version=${DRONE_TAG}n) + [-Version with extra apps - Install via Web Updater-](https://lab.flipper.net/?url=https://unleashedflip.com/fw_extra_apps/flipper-z-f7-update-${DRONE_TAG}e.tgz&channel=release-cfw&version=${DRONE_TAG}e) + + [-Install via Web Updater-](https://lab.flipper.net/?url=https://unleashedflip.com/fw/${DRONE_TAG}/flipper-z-f7-update-${DRONE_TAG}.tgz&channel=release-cfw&version=${DRONE_TAG})" trigger: From 1c2f4da4eebb4c2404c6c5b8581e690d9ec23504 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Thu, 29 Dec 2022 02:05:04 +0300 Subject: [PATCH 008/506] New Year slideshow Preparing new release, pictures for slideshow by @Svaarich --- assets/slideshow/update_default/frame_00.png | Bin 3266 -> 4002 bytes assets/slideshow/update_default/frame_01.png | Bin 933 -> 3735 bytes assets/slideshow/update_default/frame_02.png | Bin 3415 -> 3266 bytes assets/slideshow/update_default/frame_03.png | Bin 0 -> 933 bytes assets/slideshow/update_default/frame_04.png | Bin 0 -> 3415 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/slideshow/update_default/frame_03.png create mode 100644 assets/slideshow/update_default/frame_04.png diff --git a/assets/slideshow/update_default/frame_00.png b/assets/slideshow/update_default/frame_00.png index 801267de010e409524ee592cf3d02a2cb11c1575..c01a8733fc65e39164ad68e2550da80c62d81760 100644 GIT binary patch literal 4002 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 IM6N<$f*nV`F#rGn literal 3266 zcmcIn3se->8D4}EUtkm;4QQP%N{u?Z^V->&g$4E{OJs3DjG{+ncIFO@usiGS!Y))T z(WV+SnnZ|(plI-MD4L+6#(LVSCt^-fs{~u4sBJU}8m&|@8a1(ZdBrwFJ?-h9Gp{@U z{r>O&|L?zZ_ceQZO2okEfeM8pBGqcngx6AdB=_$J&vP5vCcw)8w>8_VP^e;qM@V36 zQjtQ@|3fKjmT#6VO~=bl6(`6Jpb9wM&|0BLND8<)J|FlH2gsFNdgaZ7e^erppjXb+ z*f5*h1o9+ni3dzCNzdX-@_ANJCM6;X0UZQz0w0G2oCPkgE}&O-;_Bdia9FKGI!%1} zdZi)g5SeAOBPQ7c5L$(yJcbd7mQ~?2MKR1|gun<)jcL_5h7yDhqjee*>HaC9H;*9d zGR;%EeZeQaGSBC8>(pw$->>qMD%q2(##xqCV}zO@P-uaAi(Ni0fV#Y~JqTvtn`*ZbVe%hYES^2(98>o;k~Zhd9qLT=E*-2 zNAK(2XxuuJ2XH>wlO@XqJ%zIOpdbXH!jK6wC6^%ky)OnCbx#0h&Ij~LSTzF07?dEh z2vSGEs^OC`Qiow(rZ%Vpf%9>X8?z`*WMQ}tCw2J08_R+u7C(!r&8ACrd3~IV2dQSg z5|UC$lAvP=2d;JC460#72THM&7G*dFo+uFjQWQ8*i+A#Z^UX3}7))PqewS$#^>46uiT()4!M)X3%bRyVQl#w2MD!vV{pG)cja1xAr5 zBTzibilQLkg5bafETNM{f%G&i+MywNiUueP6@dZ)0y2ORQ4!Y?0uTrS(}TCYn+f>PyBz^8*dZRc*@zi3 z!m3b&)~A{cS%In>b3XMPMf#sffAnabJhn<#ZfiY6ZQOp|oWYh&mcCn*cvTrW|8!I! zUKMiq!?3W+!=7I?H5q&A!!PHVPiB|w-Fw#Fh?-h1wQs&vl^#==5nVI%>V*37H&$Tj zrSJLAH6FOW)=RI>lYZm7Fg*Rz$hfnsW5cNIt*>7VPl$4>V;5H>EnkN$Je5-F8+PZF zweb;P@7EVLv}Dhi+T6ewy)$A=7;<1_R5>$8+CL;RC)c0k685F9 z@nQIe-(Pqx`Gb$*uFb367Vdi3@a6T&{>kUY{_OZW%U)eyy;E3nK5R$xl8Sw0p>1!E zJA8LjP0i)0)q@8MFIcXfrH|zgNcNmOF!;SwOi0t->Wu{}igFC&9y0a+T+ou;5`J;l zx0CusoX%L%Zfo2c)_S6(xcO53){bR2R*yqg#C`mU?tz?owf%5X-R)&dto<_V;Wt^! zk(isM!?}(vGoAe^y?a}gna9=z3}t13er#s*cgXr$>z0`N!+gg=&Is`x zx57?r$eulW<5v-BVb|-2srM(0P`@5JIma}yHssdlZ=A0g9a%SE_Ccms}9KV9fK|(uRHtYP>`nJ5{juN9IuhqE z)m*3?;BkjWUJy z^Ov4Zv}U{y;`jJpyU@RC)50+}G7&6Yuy2j+PTELrc->pS!sCi_qVwi|LOwTY64;r2 z{4b%zH%M*HjF8OKu?Ir7mF&J>QBi(6^W-bm(#5qqj@H*n+@Zfm9gN&kU%r3PKNJkg zY`z`Q@zYK8olwL1=?#|^m-j8zAd8Lf{*7$ietZ6v$~_BOL)sVZs%b92n-se9zF|Z3 zrHO6Ulxn-ZJY2uM?9|FPA4REF%qBn2IhIzm-v06zuVzxFVJsl uGPE7tmNxpqqNe59k^W_-%A&f5Wn*1Cr&!|$oXZaW%Sg4Po8LF)Ed3WoXpVyb diff --git a/assets/slideshow/update_default/frame_01.png b/assets/slideshow/update_default/frame_01.png index 8a1b6585738886eee91d24c415ea17210706e004..901901fe4f0632d526964e909ab55bd155b2c096 100644 GIT binary patch literal 3735 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 BII92v delta 912 zcmV;B18@A79i<15BYyw^b5ch_0Itp)=>Px&Ur9tkRCt{2ob7JIAPhyrwD*5y_KPj@ zFupd1klII@)TV@bjWPa8O0BhCNm#y~79e?+RDj^50t6=&AULT2!AS)OPAWifQUQXK z3J{!BfZ(J81Sb_BIH>@^`5t{(N-<5^3XIbEv=G_Ga|Oy-d4H1sqy-4h&;m5j6~wJj zZlzn9l_&WFQh*3hWs#H?Q9|yVQp&PzNjtYn0nimrkJG)~%OYsyd4jtv?c$syUw8|E zu57BzlEW%}C$~6y^KxUjV;Z(7fVU6uDNu7w6{FVLJ$7Av%hFzJ2yX!>JC&1OVEWk( zmWF|)6zB&%ZGT_fNmByKE=3G$0VD@<Icwz@7iVy zX&joCeN(>RDbfN2r;MHvI|cgwF$Ldh*(F zuR_cTxPL|gXhS83)Od+{^_p?op1hu{Z&rfPKESAx=FJyXgQ^yQwo9S$yHp^tW)L+N zgKNxu`^rWM?E`3g@;;Ga9^l_#uwzF$51qG>IsbKp_5nP2yLE8!0qFSIY9AL3NOEy< zBs`&gfLUf%|L!}GI82#9YhM5zhptq#7GUvFEPvj<$A#Z%okss-XbYgZkRB`csjZ0% zb+2pjGlI}~9Ifi1c?N|0cfQ?`n;~Qr;CaEHb~I<(>Xtqu2)(mMTPv73{z(^~L*v(k zvj83!tyaI=*-I(Ef4$@P_w@CsZ5~zhBcBnZHEUYmz>?lwx!R=)q;wC#$Y+w|4jTom zynorkgWfi&l@}Se^%+64Ke*O%Ao+z;BY;tL5?R^l1Av^k`kP|ThT#ZHEdaVVqt!$X zZvK-^eB&+~_u4uRA-n~M&ZEx=qMxJP!q$AjDeUex%38o7+?~!>R0A8c!lEl1l|ySm mPO=EQBah4j9LPxu`2()=HiYe2d-MPR00{s|MNUMnLSTY5oV0rY diff --git a/assets/slideshow/update_default/frame_02.png b/assets/slideshow/update_default/frame_02.png index db971092250d8f86551d9914baea868a11d2a082..801267de010e409524ee592cf3d02a2cb11c1575 100644 GIT binary patch delta 1176 zcmcaEbx3l81rx`PjaD5@90r!UhDIR6AM#aOS9BO-PAM_LtP6CQ&U|FOM|pT z!{j8R6pQ4|{mivY_QV*eq)=SqT2^9Jo{^eot7K$gWTXpo<7RKRK*r54*rOQhrTIlY z7#Ns0c)B=-RLprBeY5DO0>@Rq|Np1w%g?cz;(O>q;bTa?d*u7NZi@zvb zVXen_a0d&^V|DtzL{KX)|ZjlR&rOw@4lGYjXq@-lgOpLFWGE_3-pz1r`oqqS17#T-cTa+ zwQ;gFZ|c@>cjsP-4E4UWCAn;-s4R=ZPBGyr7SWm8`S}vkou;duogeCY{neT{fh%>E zUf&Fb4Cn5>%kHrLh}x^TmCM-j{%om#{$>`3!!3EaGc%i8XUt!lQg@qW&851j+q#%v zOj9}deZk_zkG<#f@T5q(zPe#{Je$*@=-f`8MHeg>Pj8(+FQ=m{!BORp#fFbrS0b;l z-P`zAn~C>gVBH7bV@p}?oUN+7bbrIrFU@cJR1`YYPF%M7o$vYb!$JGipPTDEm;wXX z-donY9+H0FAd>iHNq8>Ptm3VAl!A^=uW;<@s$hEY^|Y4vceOx={y4>r?y)^wFV39a zGWG0{FlDVDsmjjBiWU?vHgOQHstj0G>F81TGhggNp6!%A|C>L4Ux?+OvC?CS^e>^3 zIXgEpDr(+qULTe>8-(#qnpS~D(9PYqpJ;c=?eooDHs5 zf)nET7DsL|T=|Pl#%mk5tm-s2vp+s_G}EP1f-)vq{ga$Bt2O1vvb+O%FPy$q*s|D3 zA9}*N)=2#Sr91xhP2Zb(cII1u;eLE(^^NB`_qrkswsg%nf6S)%_i|pg$+khw6AQ#` zkFSb2q*mTwdUqCQQ2{gGleGE9$Mnix@ohM>DO=U}-_=YPDMLR7trLMu7EZ`@=>PD# z|K7gSiT>H*8RZQZ?K}e4rCM(;@4U+~XF;K?ud!WfQ`WYA->*JmiS;6@C)FFORVGMf z#9uaM7uQZ*8+qm$v(Zn5l?kDYL7wtE8JAUU`Zaaxl#4;<8a*0nSFSm_VRdHWfrrAo z`Ic;$vYq=KgN3fe!q2>4Bo>%`Wp=zByyY>&<84i*3bjtN9~j?R{yF~1tj$?>7(di( zTzqNDcYEfwzZ~aE-Pd~I;XXegAb1L!?eeY*-4p){>vcpKKTSC9Q#KgTe~ HDWM4fcbov4 delta 1291 zcmX>kd0lFP1rsOBMyn1c4nqT71IrKtqsgb3lo6b-Od2XFiRMX0W|qdfrYQzyx+aDu z2D(W}rpdY{Mky(2DXFH(iK!-&9htRMEK*IAl1xm@bPY@mQgoBjOw4r?4Gc_mjm(YB z5)F(}43bSvHup2vGT9Sjq>@5$iECMjRe45go~@FRfsv6e%#EA9*#a3=%#)HVO^hs3 zfbL35)=e`sF#)>EFh$oQ$s{Q$)za9)%p_&<0d|eebJ(L8>xEapna;q#{L|CLF{EP7 z+o;>yRx9wZ-2MOmsOx#>>uHzoa0uvqHQ3MOyiT`r~Q|MrMqY zH*(JC@jZ}|!=#ohY#=$i;p7b#pJNcIj|EJ7zHi<=;oxM>5BJv3&pK1`ao4)fHmyvG zEsraVy7wOZrPosbVDI$3@8?*bzg+#lYVR8BZ8A|;d{%g`Z`gJ0TKxN~8G*(-^**j? zeZ^jUfis{<>TuiF#eG*lI6AztE7HqW+cB>>Lg;_ymOrjPlo_h!cg)`7>GX1?=$9<3 zmF;)>tsSq0MfDiJs24oFWdBA611CFHvyE& z$|w3a^t`QNNM>ToKkE93vxL9Iv_7x2`Dx)7E`b2^PbNItYvbnT86MGMkvO;8ghkKMV>j2|WR*2tU#idW4qmef#~;+cQ!lZD=K|Ja{CRx-0>f1P582wm-4%JiYn z?yT!9rP`x&OD&EI?Ob5Rw`_iksfI1*sbvsDYW^;qxH>Yv#;Y;;nqPBM+3oNb%zNIe2|f7c{d41rO2xy8)%%&g zv`2ogZ5Q|w=EM=Hd0A)8dXA+z6DMx_z3-_$|N7TTwY*KdzO$BQ3#Hv;sd%Px=f?X> z*Y!)kd0#GY{Z@TB?SHIp<-YeHpG~Sc@0S$$zTWz?{^NTcf7y<^9{$Ml;heaq05`PTK?`)rZQCqfm^7dz(>DTQGHko>qT@Cv9)vz;plEQ(b;R^u?r_YDH?RUMO zpkR~mF74Wh4HgkQ`8b%KE8IK5mZm362w~ZN!DMfsSHP>x`@Fh1Xf{PE)q`yVKG( zC2_ZNJ9A>*HP3)K+7*G1w#{0!V8zs>u_9%zdE#rsQhLSD2p+YJTh@Q#f8>Fb7%R`q zmQ!VC+iewCx>&EkZ}wxk-YE;*JmOs$=K8iz@nx8>dQ+fq6q7{l-B$`5*73(~>U6R@ z@Jc7DYf+i?TDf04E;Ki=ACR5H9A<3BSp1RyW!~ZX>IW;|G5~?6tDnm{r-UW|5Klw? diff --git a/assets/slideshow/update_default/frame_03.png b/assets/slideshow/update_default/frame_03.png new file mode 100644 index 0000000000000000000000000000000000000000..8a1b6585738886eee91d24c415ea17210706e004 GIT binary patch literal 933 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 O_0ef#BFZ%jmi`Amz22<= literal 0 HcmV?d00001 From f955864c0190d8ecc1c7398484bdc6af4b5c12ef Mon Sep 17 00:00:00 2001 From: Kavitate <79380289+Kavitate@users.noreply.github.com> Date: Thu, 29 Dec 2022 12:03:18 -0600 Subject: [PATCH 009/506] Updated ReadMe.md - Fixed minor spelling and grammatical errors. --- ReadMe.md | 50 +++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/ReadMe.md b/ReadMe.md index 12ae028df..1a86adb60 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -4,19 +4,19 @@ -### Welcome to Flipper Zero Unleashed Firmware repo! +### Welcome to the Flipper Zero Unleashed Firmware repo! **This firmware is a fork from** [flipperdevices/flipperzero-firmware](https://github.com/flipperdevices/flipperzero-firmware)
-Our goal is to make any features possible in this device without any limitations! +Our goal is to make all features possible on this device without any limitations! -Please help us implement emulation for all subghz dynamic (rolling code) protocols! +Please help us implement emulation for all Sub-GHz dynamic (rolling code) protocols!
-### This software is for experimental purposes only and is not meant for any illegal activity/purposes.
We do not condone illegal activity and strongly encourage keeping transmissions to legal/valid uses allowed by law.
Also this software is made without any support from Flipper Devices and in no way related to official devs. +### This software is for experimental purposes only and is not meant for any illegal activity/purposes.
We do not condone illegal activity and strongly encourage keeping transmissions to legal/valid uses allowed by law.
Also, this software is made without any support from Flipper Devices and is in no way related to the official devs.
Our Discord Community: @@ -34,27 +34,27 @@ Our Discord Community: - https://t.me/unleashed_fw # What's changed -* SubGHz regional TX restrictions removed -* SubGHz frequency range can be extended in settings file (Warning: It can damage flipper's hardware) +* Sub-GHz regional TX restrictions removed +* Sub-GHz frequency range can be extended in settings file (Warning: It can damage Flipper's hardware) * Many rolling code protocols now have the ability to save & send captured signals * FAAC SLH (Spa) & BFT Mitto (secure with seed) manual creation * Sub-GHz static code brute-force plugin * LFRFID Fuzzer plugin * Custom community plugins and games added -* Extra SubGHz frequencies + extra Mifare Classic keys +* Extra Sub-GHz frequencies + extra Mifare Classic keys * Picopass/iClass plugin included in releases * Recompiled IR TV Universal Remote for ALL buttons * Universal remote for Projectors, Fans, A/Cs and Audio(soundbars, etc.) * BadUSB keyboard layouts * Customizable Flipper name -* SubGHz -> Press OK in frequency analyzer to use detected frequency in Read modes -* SubGHz -> Long press OK button in SubGHz Frequency analyzer to switch to Read menu +* Sub-GHz -> Press OK in frequency analyzer to use detected frequency in Read modes +* Sub-GHz -> Long press OK button in Sub-GHz Frequency analyzer to switch to Read menu * Other small fixes and changes throughout * See other changes in changelog and in readme below -Also check changelog in releases for latest updates! +Also check the changelog in releases for latest updates! -### Current modified and new SubGHz protocols list: +### Current modified and new Sub-GHz protocols list: - Keeloq [Not ALL systems supported for decode or emulation yet!] - [Supported manufacturers list](https://0bin.net/paste/VwR2lNJY#WH9vnPgvcp7w6zVKucFCuNREKAcOij8KsJ6vqLfMn3b) - Keeloq: HCS101 - Keeloq: AN-Motors @@ -72,7 +72,7 @@ Also check changelog in releases for latest updates! - Security+ v1 & v2 - Star Line -## Please support development of the project +## Please support the development of the project The majority of this project is developed and maintained by me, @xMasterX. I'm unemployed because of the war, and the only income I receive is from your donations. Our team is small and the guys are working on this project as much as they can solely based on the enthusiasm they have for this project and the community. @@ -146,11 +146,11 @@ Games: ### Other changes - BadUSB -> Keyboard layouts [(by rien > dummy-decoy)](https://github.com/dummy-decoy/flipperzero-firmware/tree/dummy_decoy/bad_usb_keyboard_layout) -- SubGHz -> New frequency analyzer - [(by ClusterM)](https://github.com/DarkFlippers/unleashed-firmware/pull/43) -- SubGHz -> Detect RAW feature - [(by perspecdev)](https://github.com/RogueMaster/flipperzero-firmware-wPlugins/pull/152) -- SubGHz -> Save last used frequency [(by derskythe)](https://github.com/DarkFlippers/unleashed-firmware/pull/77) -- SubGHz -> Press OK in frequency analyzer to use detected frequency in Read modes [(by derskythe)](https://github.com/DarkFlippers/unleashed-firmware/pull/77) -- SubGHz -> Long press OK button in SubGHz Frequency analyzer to switch to Read menu [(by derskythe)](https://github.com/DarkFlippers/unleashed-firmware/pull/79) +- Sub-GHz -> New frequency analyzer - [(by ClusterM)](https://github.com/DarkFlippers/unleashed-firmware/pull/43) +- Sub-GHz -> Detect RAW feature - [(by perspecdev)](https://github.com/RogueMaster/flipperzero-firmware-wPlugins/pull/152) +- Sub-GHz -> Save last used frequency [(by derskythe)](https://github.com/DarkFlippers/unleashed-firmware/pull/77) +- Sub-GHz -> Press OK in frequency analyzer to use detected frequency in Read modes [(by derskythe)](https://github.com/DarkFlippers/unleashed-firmware/pull/77) +- Sub-GHz -> Long press OK button in Sub-GHz Frequency analyzer to switch to Read menu [(by derskythe)](https://github.com/DarkFlippers/unleashed-firmware/pull/79) - Lock device with pin(or regular lock if pin not set) by holding UP button on main screen [(by an4tur0r)](https://github.com/DarkFlippers/unleashed-firmware/pull/107) # Instructions @@ -176,7 +176,7 @@ Games: ## [- WAV Player sample files & how to convert](https://github.com/UberGuidoZ/Flipper/tree/main/Wav_Player#readme) -## [- SubGHz playlist generator script](https://github.com/darmiel/flipper-scripts/blob/main/playlist/playlist_creator_by_chunk.py) +## [- Sub-GHz playlist generator script](https://github.com/darmiel/flipper-scripts/blob/main/playlist/playlist_creator_by_chunk.py) ### **Plugins that works with external hardware** @@ -206,20 +206,20 @@ Games: ## [- How to use: [GPIO] SentrySafe plugin](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/SentrySafe.md) -### **SubGHz** +### **Sub-GHz** -## [- Transmission is blocked? - How to extend SubGHz frequency range](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/DangerousSettings.md) +## [- Transmission is blocked? - How to extend Sub-GHz frequency range](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/DangerousSettings.md) -## [- How to add extra SubGHz frequencies](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/SubGHzSettings.md) +## [- How to add extra Sub-GHz frequencies](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/SubGHzSettings.md)

-# Where I can find IR, SubGhz, ... files, DBs, and other stuff? +# Where I can find IR, Sub-GHz, ... files, DBs, and other stuff? ## [UberGuidoZ Playground - Large collection of files - Github](https://github.com/UberGuidoZ/Flipper) ## [Awesome Flipper Zero - Github](https://github.com/djsime1/awesome-flipperzero) -## [CAME-12bit, NICE-12bit, Linear-10bit, PT-2240 - SubGHz fixed code bruteforce](https://github.com/tobiabocchi/flipperzero-bruteforce) -## [SMC5326, UNILARM - SubGHz fixed code bruteforce](https://github.com/Hong5489/flipperzero-gate-bruteforce) +## [CAME-12bit, NICE-12bit, Linear-10bit, PT-2240 - Sub-GHz fixed code bruteforce](https://github.com/tobiabocchi/flipperzero-bruteforce) +## [SMC5326, UNILARM - Sub-GHz fixed code bruteforce](https://github.com/Hong5489/flipperzero-gate-bruteforce)

@@ -244,4 +244,4 @@ Games: - `site_scons` - Build helpers - `scripts` - Supplementary scripts and python libraries home -Also, pay attention to `ReadMe.md` files inside those directories. +Also, pay attention to the `ReadMe.md` files inside those directories. From 7fae0d50700f6944517d7575041819d4c5c28093 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Thu, 29 Dec 2022 23:24:40 +0300 Subject: [PATCH 010/506] Add arrow on new year slideshow by @Svaarich --- assets/slideshow/update_default/frame_00.png | Bin 4002 -> 4037 bytes assets/slideshow/update_default/frame_01.png | Bin 3735 -> 3766 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/slideshow/update_default/frame_00.png b/assets/slideshow/update_default/frame_00.png index c01a8733fc65e39164ad68e2550da80c62d81760..f65d3e813bd3cd47aae63a63072b8d903f12cff0 100644 GIT binary patch delta 1393 zcmV-%1&;cnAH^TAW(t2wNklRGO>ju zV3CCG(&IeO^R@9FIyO87cx{v@FREJJhpWGO2Bcn}~GI!WyNq);0w+6^89P^&l7cE@1K9p+* zgw9HR)&}EgAF+R-+0^EMgu&XT7njrkk(1epRO@4)ZE(+~Gk#$mV%hRi02>8{BS6GN zbikU3b+TsbYw}ls@g3i5X$8~GP~*z#1F+$(A`G(RnV~OpS{S=kx-vGj!gHtwU>R1$ z#H#SxqpxzqW^X>)sz7%QfJ~IdOOJEaiW&4TA2^uS^Tx!g_7l5gD|d!JT>x z(jKmXH@AP~t>Bf=7K_DIjtnDoU=-b%@@`Qr(5@^tc^|&+X%wvOz725B4Ub z?MrtbKt={EVpitdYOF49H6JoJi%@rO1dz^X%@j-415*H1$uv0+7}-`MT3fFUGYk0< z0$6`WEeF^Ize?uy;z_U?Y;VMCGO6!IBS2(4dbbjvR;y%)jj+a*bpqK%WUrXfCt4Mq zz)wNus-2zRC4U_1S@Poi8q7wJ2d#tUJ(quaD~QGDsUk4jb+o#AjVSFOMjuUwC4+jA z=+<-1pN20K(0*1J*HG0ovh-kIqPOz*BADgR9ic_7HwtJ!E1@yG$4*8MhV7_`(qz1A z7|P*TW`16pu;yeH&)ztEXZ~SG1TQ>!W8?y7?Dgo$>TN(`MR#y31+ec?CQ1R7P_KW1 zvqP9xxZuR2N;}fy6<4f}QT6VP{S++yMvw;WWcTRtWU4nPN&&Mm5-ElWFnX#oa5@V)VkZ2Nc>LITLDQbR>scVivG|0GK5rd3qoPr$5osN4g!2Jpfc)2H5> z{~OiofFEjA*nU^_yV?HzMjqH#@jjf&ewg&O8WW=%*z-~5mg7@~w?|RkCShq7fvm$> z+=FJ`?J90vlu~!B4oDVuK~e zmdnY>RDfTCiN^hShJAqQ5Odd@`oGDsKz+Xee?!@`%;m>?00000NkvXXu0mjflKZ)F delta 1358 zcmV-U1+n_YAEF^I=^E{XIU4iWY z|3D4*e!q|NJVVB8@|0J*gEO3)3H%Rk!1k;m+IEMno#p`OhBSYRk|W$NQI}xY0&3l4S?j1h@6M2 z@S4$AX|U18=VNKGqH$|)NEd+`!P4Ud^j|L``l<|u6lQ;;Aw>oX-ljSL%7x#7?3jhN z7bEwCJDA2hppodK2-I@NU6`#Wpz;d(%K^Mfp0*=}2#1y~v|@#hZ?*TzpwBHCtq`;3 z&@+BjTKh=>(cICV(NvLT!FWjHx!Y>*l|i3J*W%5gXZ%V)DZoNyT9Aq;Df%?o3K>3j z1W3U*yC8q`ZX*1!E~kQ5LUNc$6`ysQ(a_c)Me2_TFnWTB{-_K>{77{L5;Z({PQZ0r z5hw$cftBWS91Fe&KsGokqse+Q+zGOkbq^KG=TZq|4L>Qsn}Ap7tt3B=BOh5JtYHPL z(;9U;sxQ0$ziNO;?yv@(=?o~-w~E6+ZX*0<5FvlykQ*@*Lh;BB$2k2&7w%)W?E&3*h%xq{#6G=g*PQn+?ySEAyUt@){(gw>_7Bqiacj z70f-6|7r`^r~w*zT|HR`@Fw&vxca(!=U4Vc5KRTyn?kk@$jCG~3p}!YBf260=dCR# zKsJAIw#;$hPVlXmk^-)}iMv)QWCGDmM6a0M)vSUE+?Y%SYpKDjXr))Ko*r~8ZJx)0 zy{FGO;*}g#C4wp^U@=_$+GxEJ=KuHfpfZy4NmQ#gSH4!MAKEU-NQgKoZ>Mc45oDpA zB=kAeTj5xUo+<}MZWC?YT$VbG6rnU79#elvZ(b6$tQ`R9aQ)!|(r?A!5~@feO%G?t zvXy^?qet|wf)ur0TtND*gyi8V1}mV4hixmxX)-(|@jg_J_eIucr3r0KTJdc4<8A66 zhIp{TlhucAaAdrUo~Ygi?pT)bTf3G1yml_*rGQF^w}898)50OiYs)EUiE)& z^}P$0ei0-=I@uXLmQ1yQyc94RJ&~g1T>uKSkg~3Es2)!Tie5)V(o!aMRn=)}2k?rh zXuqgjw6MwmSxdxGwY1{NP@vI8OM@T!BqFGHa4ws@evOuCxKqx~+CW3u>tJh8G_SY* zvt-)b?h0h@Jxu$q8*AXE0Lt-8sGxN>awwtH zwOfFuw5kf<$fME*VhXU{ejz;dHvSm!ms%E38@#IcZj`^@h=Y?l7Kagine>tj9(nhz zA@eG8%i*chvXNJ}QK&^AI^ig;zPVSG^T@OaolF7q0NGT*QBBf3Ne<=rBY;MjKz<|G zx&C_~eiPV0LkWMwg%lg8b8NYo98CrMBN(sW$1~0YRELnxC5S6 Qi2wiq07*qoM6N<$g4#QlHvj+t diff --git a/assets/slideshow/update_default/frame_01.png b/assets/slideshow/update_default/frame_01.png index 901901fe4f0632d526964e909ab55bd155b2c096..2f21ef695f7ad96d6613978257b2634c30df0b98 100644 GIT binary patch delta 1120 zcmV-m1fTnt9kv~?W(t2hNkl&2(`=J|CPI6-Y^OZdPIBmB+E@(n2v;!aq#DZKG>#cu}c?N*@i^kFpkc}8w zute~hA$KePPzUhN=+>FE0=$DC9qls093T&7HjG74R7hSOEw-`Hv(WkN;v_Kke1GH2 z9tDqWkP`yt05jLT-B7c2_#WU4ek_ptA~gc^3@R0l(vaSBKJ-~@Php|YAPYQ&}#{iBY~zb>CM;o(f0pDfa|&*$q4#8+PI~S4L5?8AIJ_n%4j3#OL|j2 zEq3>e+s6T@V$v^SLs)}{$6GUm60A|ovjMawmL5w$@8*9=3t`^SW@+D(b1%^^oivbq zTI51Ux9e6YdYGL&Ks-vP4hh=$oJ`;gp$&4$Db#OT1V9OOFa~_scp^#qF7<;|1JCS_ zLuv5oJE;$U56uLQaDtgj%V^#!&|msS&`iv_pn--t4={>B6p(VDFKEofkYbRv@X-rT zRm)4)+opfk$1C3`-Mlh2IRF(LRc&j9SB_C~M(Ho{(P|33pY*0E=!ZJ}*9G%QQdV+n|i05wSG^KZc_x-Gj0(2knlfR%LH`brqm=+XM4 zWQW`cT4A|p0ZQ%}`lEP4E`+>s@KeH6@Mh^>lHH>d{7RVTA_c)QzL+e+KiCCNquV1o_95QQ^J4d-Yq(6&sKT8H5T|kh$um;-ScA+&qHwK zN;Ivsyt4MrWRF~uooaiH)*6c`0z|B17EiZs+IrSrKKuA@k1eA11RiItMu4cypp~{o zmL552-<2ztC3wcF>Hyxs=d;w(kM`lAjKY#Nv(l=8hyLCPfRf9~%Zlzy;G6RRDb-lz z@BKa!2;S!yxFKlNf&HV%H^L&fWroerzh{&C?-x-FdaDDZguR&@jaJ#|(gBG8Z`}i+ mNFCRgIRfse-0gx|5gQqUmS|7WvE8X{PmV18$X{IK?W5mdUC1S1- za(fX<0PBkOuA~`YefiPe?*F_|_W|gNc$8dWg+ySaZJ-2Laiy*ZBsqRj1FaJCz5t}H zAvwT#`LWREMVdCE2WWYzbYeP2?m3?)7Y})R3eET&xh$O~oRZ$&@ez9G`baY7+DOk~ zAwZf)GHgwmQhR^P_>#da78_g+}*R2;f<0YhtGnUNgrRLrgEdEjx;r2jHxU zFud0FYFuPbpvTYY&Evbp{?ty~GfHIml{!DqN}Z7?B{n&uFo^xIU?1L zw|{5{-k5$O62clhvF;1d5=(0zOBjEJfY#(ma$#22rfGlQa^_wdzqBHe^LXU4>;mY! z6q8ixB+z2ma}E%XmMtL#tQhnacf10$wpQ)HBoAQ4AwVop9v9{TP6&tt($>(Ez#b$R znP2ptdxqR;>Kj2LG3tUwG@1!8i-C}G}y&0`J$o{E!%mY2Zi%#~Fwa`1k&5_GiZ%bo9A`{v*d0f>tu2;;TL z!C$IWMB#0u-+Q39$8`~aSDaGv#Xzl_)|5y+D{_Bi2+-)3(z{I0J#MQGE&@oCs)`Q< zHh&Q)y$~KZhvtJID+5bxj+CP|7ELa_(5`Z=OwX9~dn>~JYnT_vY`tgVCXHQ^AHAoS z+M0F&ktbBqTQR;>>@mLP8G4RV+nSAEAt3U2a)k5gHRp_uR1<<;Az+p>>PMCbqh z7TtfQ%>ksX<`*!NZd+doi>@#tfs!3^BWQ+j;Q>nS5&EO%gj@(&@#Uw4so;&$za+aw zC-{{x%S8%=@q732wCDe#VIkzX69@)ByC2~lhI#-AwH1;3E!U^^-SVs^Z%Wv+ca4tH zcdfkE8VmdnM3f-a?)kQepF?ovN@HrrvdVwjx{@t& Date: Fri, 30 Dec 2022 13:53:08 +0300 Subject: [PATCH 011/506] plugin morse code: fixed memory leak fixed noise after exiting the app fixed displaying characters after a long input --- applications/plugins/morse_code/morse_code.c | 20 +++++++++---------- .../plugins/morse_code/morse_code_worker.c | 13 +++++++++--- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/applications/plugins/morse_code/morse_code.c b/applications/plugins/morse_code/morse_code.c index beb661222..3f96969e7 100644 --- a/applications/plugins/morse_code/morse_code.c +++ b/applications/plugins/morse_code/morse_code.c @@ -44,15 +44,10 @@ static void render_callback(Canvas* const canvas, void* ctx) { canvas_draw_frame(canvas, vol_bar_x_pos, vol_bar_y_pos, 4, 64); canvas_draw_box(canvas, vol_bar_x_pos, vol_bar_y_pos + (64 - volume_h), 4, volume_h); - //dit bpm - canvas_draw_str_aligned( - canvas, - 0, - 10, - AlignLeft, - AlignCenter, - furi_string_get_cstr( - furi_string_alloc_printf("Dit: %ld ms", morse_code->model->dit_delta))); + //dit bpms + FuriString* ditbpm = furi_string_alloc_printf("Dit: %ld ms", morse_code->model->dit_delta); + canvas_draw_str_aligned(canvas, 0, 10, AlignLeft, AlignCenter, furi_string_get_cstr(ditbpm)); + furi_string_free(ditbpm); //button info elements_button_center(canvas, "Press/Hold"); @@ -67,7 +62,7 @@ static void input_callback(InputEvent* input_event, void* ctx) { static void morse_code_worker_callback(FuriString* words, void* context) { MorseCode* morse_code = context; furi_check(furi_mutex_acquire(morse_code->model_mutex, FuriWaitForever) == FuriStatusOk); - morse_code->model->words = words; + furi_string_set(morse_code->model->words, words); furi_mutex_release(morse_code->model_mutex); view_port_update(morse_code->view_port); } @@ -109,6 +104,7 @@ void morse_code_free(MorseCode* instance) { furi_mutex_free(instance->model_mutex); + furi_string_free(instance->model->words); free(instance->model); free(instance); } @@ -116,10 +112,12 @@ void morse_code_free(MorseCode* instance) { int32_t morse_code_app() { MorseCode* morse_code = morse_code_alloc(); InputEvent input; + morse_code_worker_start(morse_code->worker); morse_code_worker_set_volume( morse_code->worker, MORSE_CODE_VOLUMES[morse_code->model->volume]); morse_code_worker_set_dit_delta(morse_code->worker, morse_code->model->dit_delta); + while(furi_message_queue_get(morse_code->input_queue, &input, FuriWaitForever) == FuriStatusOk) { furi_check(furi_mutex_acquire(morse_code->model_mutex, FuriWaitForever) == FuriStatusOk); @@ -128,6 +126,7 @@ int32_t morse_code_app() { break; } else if(input.key == InputKeyBack && input.type == InputTypeShort) { morse_code_worker_reset_text(morse_code->worker); + furi_string_reset(morse_code->model->words); } else if(input.key == InputKeyOk) { if(input.type == InputTypePress) morse_code_worker_play(morse_code->worker, true); @@ -160,6 +159,7 @@ int32_t morse_code_app() { furi_mutex_release(morse_code->model_mutex); view_port_update(morse_code->view_port); } + morse_code_worker_stop(morse_code->worker); morse_code_free(morse_code); return 0; diff --git a/applications/plugins/morse_code/morse_code_worker.c b/applications/plugins/morse_code/morse_code_worker.c index 142b427b6..47896b91a 100644 --- a/applications/plugins/morse_code/morse_code_worker.c +++ b/applications/plugins/morse_code/morse_code_worker.c @@ -35,6 +35,8 @@ void morse_code_worker_fill_buffer(MorseCodeWorker* instance, uint32_t duration) furi_string_push_back(instance->buffer, *DOT); else if(duration <= (instance->dit_delta * 3)) furi_string_push_back(instance->buffer, *LINE); + else + furi_string_reset(instance->buffer); if(furi_string_size(instance->buffer) > 5) furi_string_reset(instance->buffer); FURI_LOG_D("MorseCode: Buffer", "%s", furi_string_get_cstr(instance->buffer)); } @@ -87,9 +89,13 @@ static int32_t morse_code_worker_thread_callback(void* context) { if(!pushed) { if(end_tick + (instance->dit_delta * 3) < furi_get_tick()) { //NEW LETTER - morse_code_worker_fill_letter(instance); - if(instance->callback) - instance->callback(instance->words, instance->callback_context); + if(!furi_string_empty(instance->buffer)) { + morse_code_worker_fill_letter(instance); + if(instance->callback) + instance->callback(instance->words, instance->callback_context); + } else { + spaced = true; + } pushed = true; } } @@ -170,6 +176,7 @@ void morse_code_worker_start(MorseCodeWorker* instance) { void morse_code_worker_stop(MorseCodeWorker* instance) { furi_assert(instance); furi_assert(instance->is_running == true); + instance->play = false; instance->is_running = false; furi_thread_join(instance->thread); FURI_LOG_D("MorseCode: Stop", "Stop"); From 4ef23f3a587e4fb03eae0cdf1cf06c959b691ca4 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Fri, 30 Dec 2022 16:08:57 +0300 Subject: [PATCH 012/506] Fix links to readme support section --- ReadMe.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReadMe.md b/ReadMe.md index 1a86adb60..13c8cc53f 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -72,7 +72,7 @@ Also check the changelog in releases for latest updates! - Security+ v1 & v2 - Star Line -## Please support the development of the project +## Please support development of the project The majority of this project is developed and maintained by me, @xMasterX. I'm unemployed because of the war, and the only income I receive is from your donations. Our team is small and the guys are working on this project as much as they can solely based on the enthusiasm they have for this project and the community. From b5aede37c76e6e615d135b10a6983b346fe0abb6 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Fri, 30 Dec 2022 19:58:28 +0300 Subject: [PATCH 013/506] Update changelog --- CHANGELOG.md | 65 ++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 45 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 350235e41..748c0cee0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,23 +1,47 @@ ### New changes -* **Fixed sound issues with WAV Player, Metronome, Morse code, DTMF Dolphin** -* API: Version was changed due to breaking changes - from 10.x to 11.x - Extra pack was updated, download it by using link below ([- Download latest extra apps pack](https://download-directory.github.io/?url=https://github.com/xMasterX/unleashed-extra-pack/tree/main/apps)) -* Plugins: Add (UniTemp) Temp sensor reader (PR #216 | by @quen0n) [(plugin repo)](https://github.com/quen0n/unitemp-flipperzero) and Remove DHT Monitor and AM2320 plugins (unitemp has support for that sensors) -* Plugins -> SubGHz Bruteforcer: Add support for PT2260, SMC5326, UNILARM, Honeywell(file only) protocols -* Plugins: Add mouse jiggler to USB Keyboard&Mouse App -* Clock: Use system locale settings -* Infrared: Update universal remote assets (by @Amec0e) + (PR #215 | by @airs0urce) -* SubGHz: Removing duplicate code in subghz FAAC scenes. (PR #208 | by @gid9798) -* Plugins -> Weather Station: Fix display of temps lower than -9 -* Misc fixes -* OFW: Notification: fix recursive speaker acquire -* OFW: Locale settings -* OFW: Audio support for SubGhz **(Breaking API change)** -* OFW: Dolphin: add new animation (Happy holidays) -* OFW: SubGhz: add SMC5326, UNILARM protocol -* OFW: Added support for IDTECK cards -* OFW: WS: fix protocol and add new (Oregon_v1, TX8300) -* OFW: VSCode: add task 'Serial console' and group task with sequence calling -* OFW: Dictionary stuff: iClass keys +* CI/CD: Builds with extra apps pack included, see new option below +* SubGHz: Allow manual creation of Nice Flor S, Nice Smilo +* LF RFID: Allow removing password from T5577 to make it operational (PR #225 | by @TQMatvey & Tobirg (grvpvl)) +* Plugins -> Morse Code: Fixed crashes, fixed known issues (PR #249 | by @gid9798) +* Plugins -> USB Keyboard & Mouse: Added ESCAPE key (PR #243 | by @huuck) +* Plugins -> SubGHz Bruteforcer: Add holtek HT12X protocol support +* Plugins -> POCSAG Pager: Fix UI bug +* Plugins -> Barcode Generator: Add EAN-13 support (PR #234 | by @gid9798) +* Plugins -> Wifi Marauder: Enable +5volt on plugin start, to allow usage with custom boards +* Plugins: Add 2048 Game (PR #233 | by @eugene-kirzhanov) +* Plugins: Update TOTP, UniTemp, Wifi marauder to latest commits from their repo's +* Infrared: Universal remote assets updates (by @amec0e | PRs #246 #242) +* Readme fixes (PR #247 | by @Kavitate) +* New Year update slideshow (by @Svaarich) +* Show OTP flipper region on debug and about screens +* OFW: Add float_tools to SDK api +* OFW: Gui: change data ownership model in submenu, own text by default +* OFW: Gui: Direct Draw API +* OFW: Mifare dictionary attack performance improvements. +* OFW: SubGhz: CAME 12 bit encoder fix guard time +* OFW: Fix MFC bruteforce progress bar +* OFW: Docs and readme's updates +* OFW: Picopass read bug fixes +* OFW: OpenOCD scripts +* OFW: New MFC Bruteforce animation +* OFW: File browser: Empty folder label +* OFW: SubGhz: add Holtek_ht12x protocol +* OFW: USB/BLE HID Remote icon fix +* OFW: Fix quoted error for macOS bad-usb +* OFW: Modules: locking view model +* OFW: Fix PVS-Studio warnings +* OFW: Fix unit tests +* OFW: WeatherStation: fix incorrect history index increment +* OFW: File format docs: RFID, iButton, BadUSB +* OFW: SubGhz: fix start navigation +* OFW: iButton: fixed notification on successful read +* OFW: Archive browser delete fix +* OFW: Fixes: correct scrolling text +* OFW: SubGhz: fix Hormann HSM +* OFW: Rework BLE key storage +* OFW: Gui: scrollable long file names in FileBrowser and Archive Browser +* OFW: Untangle NFC_APP_FOLDER from nfc_device +* OFW: WS: add choice fahrenheit/celsius (can be set from flipper settings -> system) #### [🎲 Download latest extra apps pack](https://download-directory.github.io/?url=https://github.com/xMasterX/unleashed-extra-pack/tree/main/apps) @@ -48,7 +72,8 @@ and all other great people who supported our project and me (xMasterX), thanks t **Recommended option - Web Updater** -What means `n` in - `flipper-z-f7-update-(version)n.tgz` ? - that means this build comes without our custom animations, only official flipper animations +What means `n` or `e` in - `flipper-z-f7-update-(version)(n / e).tgz` ? - `n` means this build comes without our custom animations, only official flipper animations, +`e` means build has extra apps pack preinstalled Self-update package (update from microSD) - `flipper-z-f7-update-(version).zip` or download `.tgz` for mobile app / qFlipper From 6b30dc511460f243828b1bba230177d90b2b3074 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Fri, 30 Dec 2022 20:01:12 +0300 Subject: [PATCH 014/506] Update unitemp --- applications/plugins/unitemp/Sensors.c | 3 +-- applications/plugins/unitemp/unitemp.c | 3 +-- applications/plugins/unitemp/views/General_view.c | 4 +++- applications/plugins/unitemp/views/Popup_view.c | 1 - applications/plugins/unitemp/views/SensorsList_view.c | 3 ++- applications/plugins/unitemp/views/Widgets_view.c | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/applications/plugins/unitemp/Sensors.c b/applications/plugins/unitemp/Sensors.c index f202794f4..9740b9887 100644 --- a/applications/plugins/unitemp/Sensors.c +++ b/applications/plugins/unitemp/Sensors.c @@ -17,7 +17,6 @@ */ #include "Sensors.h" #include -#include //Порты ввода/вывода, которые не были обозначены в общем списке const GpioPin SWC_10 = {.pin = LL_GPIO_PIN_14, .port = GPIOA}; @@ -344,7 +343,7 @@ bool unitemp_sensors_load(void) { //Сколько байт до конца строки size_t line_end = 0; - while(line_end != STRING_FAILURE && line_end != (size_t)(file_size - 1)) { + while(line_end != ((size_t)-1) && line_end != (size_t)(file_size - 1)) { //Имя датчика char name[11] = {0}; //Тип датчика diff --git a/applications/plugins/unitemp/unitemp.c b/applications/plugins/unitemp/unitemp.c index ce1cd1dc9..9ff108395 100644 --- a/applications/plugins/unitemp/unitemp.c +++ b/applications/plugins/unitemp/unitemp.c @@ -21,7 +21,6 @@ #include "./views/UnitempViews.h" #include -#include /* Переменные */ //Данные приложения @@ -147,7 +146,7 @@ bool unitemp_loadSettings(void) { //Сколько байт до конца строки size_t line_end = 0; - while(line_end != STRING_FAILURE && line_end != (size_t)(file_size - 1)) { + while(line_end != ((size_t)-1) && line_end != (size_t)(file_size - 1)) { char buff[20] = {0}; sscanf(((char*)(file_buf + line_end)), "%s", buff); diff --git a/applications/plugins/unitemp/views/General_view.c b/applications/plugins/unitemp/views/General_view.c index fc1408b1a..2c0843ea4 100644 --- a/applications/plugins/unitemp/views/General_view.c +++ b/applications/plugins/unitemp/views/General_view.c @@ -18,7 +18,9 @@ #include "UnitempViews.h" #include "unitemp_icons.h" -#include +extern const Icon I_ButtonRight_4x7; +extern const Icon I_ButtonLeft_4x7; +extern const Icon I_Ok_btn_9x9; static View* view; diff --git a/applications/plugins/unitemp/views/Popup_view.c b/applications/plugins/unitemp/views/Popup_view.c index d495462b2..c24783870 100644 --- a/applications/plugins/unitemp/views/Popup_view.c +++ b/applications/plugins/unitemp/views/Popup_view.c @@ -18,7 +18,6 @@ #include "UnitempViews.h" #include #include -#include uint32_t _prev_view_id; diff --git a/applications/plugins/unitemp/views/SensorsList_view.c b/applications/plugins/unitemp/views/SensorsList_view.c index a7d3d5556..81afba4cd 100644 --- a/applications/plugins/unitemp/views/SensorsList_view.c +++ b/applications/plugins/unitemp/views/SensorsList_view.c @@ -18,7 +18,8 @@ #include "UnitempViews.h" #include #include -#include + +extern const Icon I_Cry_dolph_55x52; //Текущий вид static View* view; diff --git a/applications/plugins/unitemp/views/Widgets_view.c b/applications/plugins/unitemp/views/Widgets_view.c index 892b31f98..49a3faa1f 100644 --- a/applications/plugins/unitemp/views/Widgets_view.c +++ b/applications/plugins/unitemp/views/Widgets_view.c @@ -18,7 +18,7 @@ #include "UnitempViews.h" #include "unitemp_icons.h" -#include +extern const Icon I_DolphinCommon_56x48; void unitemp_widgets_alloc(void) { app->widget = widget_alloc(); From a35b536120fbf75801f447fdea41e4c9bf7d5aba Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Fri, 30 Dec 2022 23:31:21 +0300 Subject: [PATCH 015/506] Fix arkanoid bug --- CHANGELOG.md | 1 + applications/plugins/arkanoid/arkanoid_game.c | 1 + 2 files changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 748c0cee0..6a545a275 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ * CI/CD: Builds with extra apps pack included, see new option below * SubGHz: Allow manual creation of Nice Flor S, Nice Smilo * LF RFID: Allow removing password from T5577 to make it operational (PR #225 | by @TQMatvey & Tobirg (grvpvl)) +* Plugins -> Arkanoid: Fix bug with unability to continue game after first level * Plugins -> Morse Code: Fixed crashes, fixed known issues (PR #249 | by @gid9798) * Plugins -> USB Keyboard & Mouse: Added ESCAPE key (PR #243 | by @huuck) * Plugins -> SubGHz Bruteforcer: Add holtek HT12X protocol support diff --git a/applications/plugins/arkanoid/arkanoid_game.c b/applications/plugins/arkanoid/arkanoid_game.c index 0b0458424..af9976c98 100644 --- a/applications/plugins/arkanoid/arkanoid_game.c +++ b/applications/plugins/arkanoid/arkanoid_game.c @@ -276,6 +276,7 @@ void reset_level(Canvas* canvas, ArkanoidState* arkanoid_state) { arkanoid_state->ball_state.yb = 60; arkanoid_state->brickCount = 0; arkanoid_state->ball_state.released = false; + arkanoid_state->gameStarted = false; // Reset all brick hit states for(unsigned int row = 0; row < arkanoid_state->ROWS; row++) { From 00b49035764870851ae82b7a0aed9294fb1a1a3b Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sat, 31 Dec 2022 01:30:57 +0300 Subject: [PATCH 016/506] Add Delete key to usb keyboard --- CHANGELOG.md | 1 + .../plugins/usbkeyboard/views/usb_hid_keyboard.c | 11 +++++------ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a545a275..4e12b275d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ * Plugins -> Arkanoid: Fix bug with unability to continue game after first level * Plugins -> Morse Code: Fixed crashes, fixed known issues (PR #249 | by @gid9798) * Plugins -> USB Keyboard & Mouse: Added ESCAPE key (PR #243 | by @huuck) +* Plugins -> USB Keyboard & Mouse: Added Delete key * Plugins -> SubGHz Bruteforcer: Add holtek HT12X protocol support * Plugins -> POCSAG Pager: Fix UI bug * Plugins -> Barcode Generator: Add EAN-13 support (PR #234 | by @gid9798) diff --git a/applications/plugins/usbkeyboard/views/usb_hid_keyboard.c b/applications/plugins/usbkeyboard/views/usb_hid_keyboard.c index 9d5195a0b..8ca4f366a 100644 --- a/applications/plugins/usbkeyboard/views/usb_hid_keyboard.c +++ b/applications/plugins/usbkeyboard/views/usb_hid_keyboard.c @@ -123,8 +123,7 @@ const UsbHidKeyboardKey usb_hid_keyboard_keyset[ROW_COUNT][COLUMN_COUNT] = { {.width = 1, .icon = &I_ButtonRight_4x7, .value = HID_KEYBOARD_RIGHT_ARROW}, }, { - {.width = 3, .icon = NULL, .key = "Ctrl", .value = HID_KEYBOARD_L_CTRL}, - {.width = 0, .icon = NULL, .value = HID_KEYBOARD_L_CTRL}, + {.width = 2, .icon = NULL, .key = "Ctl", .value = HID_KEYBOARD_L_CTRL}, {.width = 0, .icon = NULL, .value = HID_KEYBOARD_L_CTRL}, {.width = 2, .icon = NULL, .key = "Alt", .value = HID_KEYBOARD_L_ALT}, {.width = 0, .icon = NULL, .value = HID_KEYBOARD_L_ALT}, @@ -132,9 +131,10 @@ const UsbHidKeyboardKey usb_hid_keyboard_keyset[ROW_COUNT][COLUMN_COUNT] = { {.width = 0, .icon = NULL, .value = HID_KEYBOARD_L_GUI}, {.width = 2, .icon = NULL, .key = "Tab", .value = HID_KEYBOARD_TAB}, {.width = 0, .icon = NULL, .value = HID_KEYBOARD_TAB}, - {.width = 3, .icon = NULL, .key = "Esc", .value = HID_KEYBOARD_ESCAPE}, - {.width = 0, .icon = NULL, .value = HID_KEYBOARD_ESCAPE}, + {.width = 2, .icon = NULL, .key = "Esc", .value = HID_KEYBOARD_ESCAPE}, {.width = 0, .icon = NULL, .value = HID_KEYBOARD_ESCAPE}, + {.width = 2, .icon = NULL, .key = "Del", .value = HID_KEYBOARD_DELETE_FORWARD}, + {.width = 0, .icon = NULL, .value = HID_KEYBOARD_DELETE_FORWARD}, }, { {.width = 1, .icon = NULL, .key = "1", .shift_key = "1", .value = HID_KEYBOARD_F1}, @@ -149,8 +149,7 @@ const UsbHidKeyboardKey usb_hid_keyboard_keyset[ROW_COUNT][COLUMN_COUNT] = { {.width = 1, .icon = NULL, .key = "0", .shift_key = "0", .value = HID_KEYBOARD_F10}, {.width = 1, .icon = NULL, .key = "1", .shift_key = "1", .value = HID_KEYBOARD_F11}, {.width = 1, .icon = NULL, .key = "2", .shift_key = "2", .value = HID_KEYBOARD_F12}, - } -}; + }}; static void usb_hid_keyboard_to_upper(char* str) { while(*str) { From a51a6914f4a9c4f1abd829f4bcc5d66795a89917 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sat, 31 Dec 2022 02:51:50 +0300 Subject: [PATCH 017/506] Barcode Generator: Save last barcode --- CHANGELOG.md | 3 +- .../barcode_generator/barcode_generator.c | 101 ++++++++++-------- .../barcode_generator/barcode_generator.h | 39 ++++++- 3 files changed, 95 insertions(+), 48 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e12b275d..4a4fd9f85 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,13 +2,14 @@ * CI/CD: Builds with extra apps pack included, see new option below * SubGHz: Allow manual creation of Nice Flor S, Nice Smilo * LF RFID: Allow removing password from T5577 to make it operational (PR #225 | by @TQMatvey & Tobirg (grvpvl)) +* Plugins -> Barcode Generator: Save last used barcode, and load on app start +* Plugins -> Barcode Generator: Add EAN-13 support (PR #234 | by @gid9798) * Plugins -> Arkanoid: Fix bug with unability to continue game after first level * Plugins -> Morse Code: Fixed crashes, fixed known issues (PR #249 | by @gid9798) * Plugins -> USB Keyboard & Mouse: Added ESCAPE key (PR #243 | by @huuck) * Plugins -> USB Keyboard & Mouse: Added Delete key * Plugins -> SubGHz Bruteforcer: Add holtek HT12X protocol support * Plugins -> POCSAG Pager: Fix UI bug -* Plugins -> Barcode Generator: Add EAN-13 support (PR #234 | by @gid9798) * Plugins -> Wifi Marauder: Enable +5volt on plugin start, to allow usage with custom boards * Plugins: Add 2048 Game (PR #233 | by @eugene-kirzhanov) * Plugins: Update TOTP, UniTemp, Wifi marauder to latest commits from their repo's diff --git a/applications/plugins/barcode_generator/barcode_generator.c b/applications/plugins/barcode_generator/barcode_generator.c index a07a12e6a..cbbb41671 100644 --- a/applications/plugins/barcode_generator/barcode_generator.c +++ b/applications/plugins/barcode_generator/barcode_generator.c @@ -1,8 +1,3 @@ -#include -#include -#include -#include - #include "barcode_generator.h" static BarcodeType* barcodeTypes[NUMBER_OF_BARCODE_TYPES]; @@ -103,9 +98,9 @@ int get_menu_text_location(int index) { } int get_barcode_max_index(PluginState* plugin_state) { - return plugin_state->doParityCalculation ? - barcodeTypes[plugin_state->barcodeTypeIndex]->numberOfDigits - 1 : - barcodeTypes[plugin_state->barcodeTypeIndex]->numberOfDigits; + return plugin_state->barcode_state.doParityCalculation ? + barcodeTypes[plugin_state->barcode_state.barcodeTypeIndex]->numberOfDigits - 1 : + barcodeTypes[plugin_state->barcode_state.barcodeTypeIndex]->numberOfDigits; } int calculate_check_digit(PluginState* plugin_state, BarcodeType* type) { @@ -114,12 +109,12 @@ int calculate_check_digit(PluginState* plugin_state, BarcodeType* type) { int checkDigitEven = 0; //add all odd positions. Confusing because 0index for(int i = 0; i < type->numberOfDigits - 1; i += 2) { - checkDigitOdd += plugin_state->barcodeNumeral[i]; + checkDigitOdd += plugin_state->barcode_state.barcodeNumeral[i]; } //add all even positions to above. Confusing because 0index for(int i = 1; i < type->numberOfDigits - 1; i += 2) { - checkDigitEven += plugin_state->barcodeNumeral[i]; + checkDigitEven += plugin_state->barcode_state.barcodeNumeral[i]; } if(type->bartype == BarTypeEAN13) { @@ -152,7 +147,7 @@ static void render_callback(Canvas* const canvas, void* ctx) { canvas, 64, get_menu_text_location(2), AlignCenter, AlignCenter, "Parity?"); canvas_draw_frame(canvas, 83, get_menu_text_location(2) - 3, 6, 6); - if(plugin_state->doParityCalculation == true) { + if(plugin_state->barcode_state.doParityCalculation == true) { canvas_draw_box(canvas, 85, get_menu_text_location(2) - 1, 2, 2); } canvas_draw_str_aligned( @@ -161,14 +156,14 @@ static void render_callback(Canvas* const canvas, void* ctx) { get_menu_text_location(3), AlignCenter, AlignCenter, - (barcodeTypes[plugin_state->barcodeTypeIndex])->name); + (barcodeTypes[plugin_state->barcode_state.barcodeTypeIndex])->name); canvas_draw_disc( canvas, 40, get_menu_text_location(plugin_state->menuIndex) - 1, 2); //draw menu cursor } else { - BarcodeType* type = barcodeTypes[plugin_state->barcodeTypeIndex]; + BarcodeType* type = barcodeTypes[plugin_state->barcode_state.barcodeTypeIndex]; //start saftey canvas_set_color(canvas, ColorBlack); @@ -181,13 +176,13 @@ static void render_callback(Canvas* const canvas, void* ctx) { startpos++; draw_digit( canvas, - plugin_state->barcodeNumeral[0], + plugin_state->barcode_state.barcodeNumeral[0], BarEncodingTypeRight, - get_digit_position(0, barcodeTypes[plugin_state->barcodeTypeIndex]), + get_digit_position(0, barcodeTypes[plugin_state->barcode_state.barcodeTypeIndex]), false); } - if(plugin_state->doParityCalculation) { //calculate the check digit - plugin_state->barcodeNumeral[type->numberOfDigits - 1] = + if(plugin_state->barcode_state.doParityCalculation) { //calculate the check digit + plugin_state->barcode_state.barcodeNumeral[type->numberOfDigits - 1] = calculate_check_digit(plugin_state, type); } for(int index = startpos; index < endpos; index++) { @@ -197,7 +192,9 @@ static void render_callback(Canvas* const canvas, void* ctx) { barEncodingType = BarEncodingTypeRight; } else { barEncodingType = - (FURI_BIT(EAN13ENCODE[plugin_state->barcodeNumeral[0]], index - 1)) ? + (FURI_BIT( + EAN13ENCODE[plugin_state->barcode_state.barcodeNumeral[0]], + index - 1)) ? BarEncodingTypeG : BarEncodingTypeLeft; } @@ -207,10 +204,14 @@ static void render_callback(Canvas* const canvas, void* ctx) { } } - int digitPosition = - get_digit_position(index, barcodeTypes[plugin_state->barcodeTypeIndex]); + int digitPosition = get_digit_position( + index, barcodeTypes[plugin_state->barcode_state.barcodeTypeIndex]); draw_digit( - canvas, plugin_state->barcodeNumeral[index], barEncodingType, digitPosition, true); + canvas, + plugin_state->barcode_state.barcodeNumeral[index], + barEncodingType, + digitPosition, + true); } //central separator @@ -223,7 +224,8 @@ static void render_callback(Canvas* const canvas, void* ctx) { canvas_draw_box( canvas, get_digit_position( - plugin_state->editingIndex, barcodeTypes[plugin_state->barcodeTypeIndex]) - + plugin_state->editingIndex, + barcodeTypes[plugin_state->barcode_state.barcodeTypeIndex]) - 1, 63, 7, @@ -247,15 +249,17 @@ static void input_callback(InputEvent* input_event, FuriMessageQueue* event_queu furi_message_queue_put(event_queue, &event, FuriWaitForever); } -static void barcode_generator_state_init(PluginState* const plugin_state) { - for(int i = 0; i < BARCODE_MAX_LENS; ++i) { - plugin_state->barcodeNumeral[i] = i % 10; - } +static void barcode_generator_state_init(PluginState* plugin_state) { plugin_state->editingIndex = 0; plugin_state->mode = ViewMode; - plugin_state->doParityCalculation = true; plugin_state->menuIndex = MENU_INDEX_VIEW; - plugin_state->barcodeTypeIndex = 0; + if(!LOAD_BARCODE_SETTINGS(&plugin_state->barcode_state)) { + for(int i = 0; i < BARCODE_MAX_LENS; ++i) { + plugin_state->barcode_state.barcodeNumeral[i] = i % 10; + } + plugin_state->barcode_state.doParityCalculation = true; + plugin_state->barcode_state.barcodeTypeIndex = 0; + } } static bool handle_key_press_view(InputKey key, PluginState* plugin_state) { @@ -277,15 +281,15 @@ static bool handle_key_press_edit(InputKey key, PluginState* plugin_state) { switch(key) { case InputKeyUp: - plugin_state->barcodeNumeral[plugin_state->editingIndex] = - (plugin_state->barcodeNumeral[plugin_state->editingIndex] + 1) % 10; + plugin_state->barcode_state.barcodeNumeral[plugin_state->editingIndex] = + (plugin_state->barcode_state.barcodeNumeral[plugin_state->editingIndex] + 1) % 10; break; case InputKeyDown: - plugin_state->barcodeNumeral[plugin_state->editingIndex] = - (plugin_state->barcodeNumeral[plugin_state->editingIndex] == 0) ? + plugin_state->barcode_state.barcodeNumeral[plugin_state->editingIndex] = + (plugin_state->barcode_state.barcodeNumeral[plugin_state->editingIndex] == 0) ? 9 : - plugin_state->barcodeNumeral[plugin_state->editingIndex] - 1; + plugin_state->barcode_state.barcodeNumeral[plugin_state->editingIndex] - 1; break; case InputKeyRight: @@ -324,21 +328,24 @@ static bool handle_key_press_menu(InputKey key, PluginState* plugin_state) { case InputKeyRight: if(plugin_state->menuIndex == MENU_INDEX_TYPE) { - plugin_state->barcodeTypeIndex = - (plugin_state->barcodeTypeIndex == NUMBER_OF_BARCODE_TYPES - 1) ? + plugin_state->barcode_state.barcodeTypeIndex = + (plugin_state->barcode_state.barcodeTypeIndex == NUMBER_OF_BARCODE_TYPES - 1) ? 0 : - plugin_state->barcodeTypeIndex + 1; + plugin_state->barcode_state.barcodeTypeIndex + 1; } else if(plugin_state->menuIndex == MENU_INDEX_PARITY) { - plugin_state->doParityCalculation = !plugin_state->doParityCalculation; + plugin_state->barcode_state.doParityCalculation = + !plugin_state->barcode_state.doParityCalculation; } break; case InputKeyLeft: if(plugin_state->menuIndex == MENU_INDEX_TYPE) { - plugin_state->barcodeTypeIndex = (plugin_state->barcodeTypeIndex == 0) ? - NUMBER_OF_BARCODE_TYPES - 1 : - plugin_state->barcodeTypeIndex - 1; + plugin_state->barcode_state.barcodeTypeIndex = + (plugin_state->barcode_state.barcodeTypeIndex == 0) ? + NUMBER_OF_BARCODE_TYPES - 1 : + plugin_state->barcode_state.barcodeTypeIndex - 1; } else if(plugin_state->menuIndex == MENU_INDEX_PARITY) { - plugin_state->doParityCalculation = !plugin_state->doParityCalculation; + plugin_state->barcode_state.doParityCalculation = + !plugin_state->barcode_state.doParityCalculation; } break; @@ -348,12 +355,13 @@ static bool handle_key_press_menu(InputKey key, PluginState* plugin_state) { } else if(plugin_state->menuIndex == MENU_INDEX_EDIT) { plugin_state->mode = EditMode; } else if(plugin_state->menuIndex == MENU_INDEX_PARITY) { - plugin_state->doParityCalculation = !plugin_state->doParityCalculation; + plugin_state->barcode_state.doParityCalculation = + !plugin_state->barcode_state.doParityCalculation; } else if(plugin_state->menuIndex == MENU_INDEX_TYPE) { - plugin_state->barcodeTypeIndex = - (plugin_state->barcodeTypeIndex == NUMBER_OF_BARCODE_TYPES - 1) ? + plugin_state->barcode_state.barcodeTypeIndex = + (plugin_state->barcode_state.barcodeTypeIndex == NUMBER_OF_BARCODE_TYPES - 1) ? 0 : - plugin_state->barcodeTypeIndex + 1; + plugin_state->barcode_state.barcodeTypeIndex + 1; } break; @@ -430,6 +438,9 @@ int32_t barcode_generator_app(void* p) { furi_record_close(RECORD_GUI); view_port_free(view_port); furi_message_queue_free(event_queue); + // save settings + SAVE_BARCODE_SETTINGS(&plugin_state->barcode_state); + free(plugin_state); return 0; } diff --git a/applications/plugins/barcode_generator/barcode_generator.h b/applications/plugins/barcode_generator/barcode_generator.h index 1b5ff9e15..b39e43320 100644 --- a/applications/plugins/barcode_generator/barcode_generator.h +++ b/applications/plugins/barcode_generator/barcode_generator.h @@ -1,3 +1,34 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +#define BARCODE_SETTINGS_FILE_NAME "apps/Misc/barcodegen.save" + +#define BARCODE_SETTINGS_VER (1) +#define BARCODE_SETTINGS_PATH EXT_PATH(BARCODE_SETTINGS_FILE_NAME) +#define BARCODE_SETTINGS_MAGIC (0xC2) + +#define SAVE_BARCODE_SETTINGS(x) \ + saved_struct_save( \ + BARCODE_SETTINGS_PATH, \ + (x), \ + sizeof(BarcodeState), \ + BARCODE_SETTINGS_MAGIC, \ + BARCODE_SETTINGS_VER) + +#define LOAD_BARCODE_SETTINGS(x) \ + saved_struct_load( \ + BARCODE_SETTINGS_PATH, \ + (x), \ + sizeof(BarcodeState), \ + BARCODE_SETTINGS_MAGIC, \ + BARCODE_SETTINGS_VER) + #define BARCODE_HEIGHT 50 #define BARCODE_Y_START 3 #define BARCODE_TEXT_OFFSET 9 @@ -45,11 +76,15 @@ typedef struct { typedef struct { int barcodeNumeral[BARCODE_MAX_LENS]; //The current barcode number + bool doParityCalculation; //Should do parity check? + int barcodeTypeIndex; +} BarcodeState; + +typedef struct { + BarcodeState barcode_state; int editingIndex; //The index of the editing symbol int menuIndex; //The index of the menu cursor Mode mode; //View, edit or menu - bool doParityCalculation; //Should do parity check? - int barcodeTypeIndex; } PluginState; static const int DIGITS[10][4] = { From 27bfe861d98e5ed0d645de23a08dfb6470c85145 Mon Sep 17 00:00:00 2001 From: Dimitry Date: Sat, 31 Dec 2022 02:10:21 +0200 Subject: [PATCH 018/506] cc1101 modem configurable preset introduced. Available to configure: datarate, bandwidth and manchester decoding flag log ability added to unit_test app (it's very helpful when writing a unit_tests) --- .../debug/unit_tests/subghz/subghz_test.c | 140 ++++++++ applications/debug/unit_tests/test_index.c | 105 +++++- .../main/subghz/helpers/subghz_custom_event.h | 1 + .../scenes/subghz_scene_receiver_config.c | 232 +++++++++++++ .../scenes/subghz_scene_show_error_sub.c | 12 +- applications/main/subghz/subghz.c | 6 + applications/main/subghz/subghz_i.c | 6 + applications/main/subghz/subghz_i.h | 15 + .../helpers/subghz_config_preset_custom.c | 326 ++++++++++++++++++ .../helpers/subghz_config_preset_custom.h | 193 +++++++++++ 10 files changed, 1032 insertions(+), 4 deletions(-) create mode 100644 lib/subghz/helpers/subghz_config_preset_custom.c create mode 100644 lib/subghz/helpers/subghz_config_preset_custom.h diff --git a/applications/debug/unit_tests/subghz/subghz_test.c b/applications/debug/unit_tests/subghz/subghz_test.c index cb89e1f02..8a8b3108c 100644 --- a/applications/debug/unit_tests/subghz/subghz_test.c +++ b/applications/debug/unit_tests/subghz/subghz_test.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #define TAG "SubGhz TEST" @@ -203,6 +204,132 @@ static bool subghz_encoder_test(const char* path) { return subghz_test_decoder_count ? true : false; } +static bool subghz_custom_preset_test(void) { + static const uint8_t preset_data[][2] = { + {CC1101_MDMCFG0, 0}, + {CC1101_MDMCFG1, 0}, + {CC1101_MDMCFG2, 0}, + {CC1101_MDMCFG3, 0}, + {CC1101_MDMCFG4, 0}, + }; + + static uint8_t test_data[sizeof(preset_data)] = {0}; + memcpy(test_data, preset_data, sizeof(preset_data)); + + uint8_t* test_data_ptr = &test_data[0]; + + { // CHEKING BANDWIDTH SET + for(uint32_t i = 0; i < CH_BANDWIDTH_NUM; ++i) { + uint8_t bw_value = subghz_preset_custom_bandwidth_values[i]; + + bool result = + subghz_preset_custom_set_bandwidth(test_data_ptr, sizeof(test_data), bw_value); + if(!result) { + FURI_LOG_E(TAG, "Failed to set BW value: %hhu", bw_value); + return false; + } + + uint8_t get_bw_value = + subghz_preset_custom_get_bandwidth(test_data_ptr, sizeof(test_data)); + if(get_bw_value != bw_value) { + FURI_LOG_E( + TAG, + "BW value from preset: %hhu is not equal expected value: %hhu", + get_bw_value, + bw_value); + return false; + } + + FURI_LOG_T(TAG, "Bandwidth check OK: %hhu", bw_value); + } + } + + { // CHEKING MACHESTER SET + bool result = + subghz_preset_custom_set_machester_enable(test_data_ptr, sizeof(test_data), false); + if(!result) { + FURI_LOG_E(TAG, "Failed to set manchester enable flag"); + return false; + } + bool flag = subghz_preset_custom_get_machester_enable(test_data_ptr, sizeof(test_data)); + if(flag != false) { + FURI_LOG_E(TAG, "Manchester disable flag setup failed!"); + return false; + } + + subghz_preset_custom_set_machester_enable(test_data_ptr, sizeof(test_data), true); + flag = subghz_preset_custom_get_machester_enable(test_data_ptr, sizeof(test_data)); + if(flag != true) { + FURI_LOG_E(TAG, "Manchester enable flag setup failed!"); + return false; + } + + FURI_LOG_T(TAG, "Manchester flag check OK"); + } + { // CHEKING DATARATE SET + const float datarateRoughMax = 1600000.0f; // bauds + const float datarateRoughStep = 5000.0f; + + const float datarateFineMax = 30000.0f; + const float datarateFineStep = 50.0f; + + bool result = false; + char datarate_set_str[16] = {0}; + char datarate_get_str[16] = {0}; + + float datarate_set = datarateRoughMax; + float datarate_get = -1.0f; + while(datarate_set > 0) { + subghz_preset_custom_printf_datarate( + datarate_set, datarate_set_str, sizeof(datarate_set_str)); + + result = + subghz_preset_custom_set_datarate(test_data_ptr, sizeof(test_data), datarate_set); + if(!result) { + FURI_LOG_E(TAG, "Failed to set datarate: %s!", datarate_set_str); + return false; + } + + datarate_get = subghz_preset_custom_get_datarate(test_data_ptr, sizeof(test_data)); + subghz_preset_custom_printf_datarate( + datarate_get, datarate_get_str, sizeof(datarate_get_str)); + + if(datarate_get < 0) { + FURI_LOG_E(TAG, "Failed to get datarate!"); + return false; + } + + if(datarate_set > datarateFineMax) { + result = fabsf(datarate_get - datarate_set) <= datarateRoughStep; + datarate_set -= datarateRoughStep; + } else { + result = fabsf(datarate_get - datarate_set) <= datarateFineStep; + datarate_set -= datarateFineStep; + } + + if(result) { + FURI_LOG_T( + TAG, + "Datarate check OK: Set: %s - Get: %s", + datarate_set_str, + datarate_get_str); + } else { + FURI_LOG_E( + TAG, + "Datarate check failed!: %s is way to diff %s! DRATE_E: %hhu DRATE_M: %hhu", + datarate_set_str, + datarate_get_str, + test_data[4 * 2 + 1] & 0b00001111, + test_data[3 * 2 + 1]); + return false; + } + } + } + + FURI_LOG_I(TAG, "Sub GHz custom preset test: OK"); + return true; +} + MU_TEST(subghz_keystore_test) { mu_assert( subghz_environment_load_keystore(environment_handler, KEYSTORE_DIR_NAME), @@ -734,6 +861,10 @@ MU_TEST(subghz_random_test) { mu_assert(subghz_decode_random_test(TEST_RANDOM_DIR_NAME), "Random test error\r\n"); } +MU_TEST(subghz_preset_test) { + mu_assert(subghz_custom_preset_test(), "Custom preset logic error\r\n"); +} + MU_TEST_SUITE(subghz) { subghz_test_init(); MU_RUN_TEST(subghz_keystore_test); @@ -802,7 +933,16 @@ MU_TEST_SUITE(subghz) { subghz_test_deinit(); } +MU_TEST_SUITE(subghz_app) { + MU_RUN_TEST(subghz_preset_test); +} + int run_minunit_test_subghz() { MU_RUN_SUITE(subghz); return MU_EXIT_CODE; } + +int run_minunit_test_subghz_app() { + MU_RUN_SUITE(subghz_app); + return MU_EXIT_CODE; +} diff --git a/applications/debug/unit_tests/test_index.c b/applications/debug/unit_tests/test_index.c index ccf471531..6f5072382 100644 --- a/applications/debug/unit_tests/test_index.c +++ b/applications/debug/unit_tests/test_index.c @@ -5,6 +5,7 @@ #include #include #include +#include #define TAG "UnitTests" @@ -18,6 +19,7 @@ int run_minunit_test_flipper_format_string(); int run_minunit_test_stream(); int run_minunit_test_storage(); int run_minunit_test_subghz(); +int run_minunit_test_subghz_app(); int run_minunit_test_dirwalk(); int run_minunit_test_power(); int run_minunit_test_protocol_dict(); @@ -45,6 +47,7 @@ const UnitTest unit_tests[] = { {.name = "flipper_format_string", .entry = run_minunit_test_flipper_format_string}, {.name = "rpc", .entry = run_minunit_test_rpc}, {.name = "subghz", .entry = run_minunit_test_subghz}, + {.name = "subghz_app", .entry = run_minunit_test_subghz_app}, {.name = "infrared", .entry = run_minunit_test_infrared}, {.name = "nfc", .entry = run_minunit_test_nfc}, {.name = "power", .entry = run_minunit_test_power}, @@ -71,6 +74,72 @@ void minunit_print_fail(const char* str) { printf(FURI_LOG_CLR_E "%s\r\n" FURI_LOG_CLR_RESET, str); } +void unit_tests_cli_logs_puts(const char* str) { + printf(str); +} + +// by default there is no output from unit tests +// you have to enable them with this function +void unit_tests_cli_enable_logs(FuriLogLevel logLevel) { + furi_log_init(); + furi_log_set_level(logLevel); + furi_log_set_puts(unit_tests_cli_logs_puts); +} + +void unit_tests_cli_print_help() { + printf( + "Usage:\r\n" + " unit_tests [log level] [test_suit_name]\r\n" + " Arguments:\r\n" + " [log level]: optional, enables printing output from FURI_LOG_* macro in unit_tests\r\n" + " [test_suit_name]: a specific test suit to run. If not specified runs all tests\r\n" + " Warning: supports only 1 test suit to launch\r\n" + " Example:\r\n" + " unit_tests - run ALL tests wihtout log printing\r\n" + " unit_tests bt - run bt tests wihtout log printing\r\n" + " unit_tests log debug subghz - run subghz tests with logs at debug level abd above\r\n\r\n" + " unit_tests help [?]\r\n" + " prints this help\r\n"); +} + +bool unit_tests_cli_parse_log_level(FuriString* args) { + bool result = true; + FuriString* level = furi_string_alloc(); + if(args_read_string_and_trim(args, level)) { + if(furi_string_cmpi_str(level, "default") == 0) { + unit_tests_cli_enable_logs(FuriLogLevelDefault); + } else if(furi_string_cmpi_str(level, "none") == 0) { + unit_tests_cli_enable_logs(FuriLogLevelNone); + } else if(furi_string_cmpi_str(level, "error") == 0) { + unit_tests_cli_enable_logs(FuriLogLevelError); + } else if(furi_string_cmpi_str(level, "warn") == 0) { + unit_tests_cli_enable_logs(FuriLogLevelWarn); + } else if(furi_string_cmpi_str(level, "info") == 0) { + unit_tests_cli_enable_logs(FuriLogLevelInfo); + } else if(furi_string_cmpi_str(level, "debug") == 0) { + unit_tests_cli_enable_logs(FuriLogLevelDebug); + } else if(furi_string_cmpi_str(level, "trace") == 0) { + unit_tests_cli_enable_logs(FuriLogLevelTrace); + } else { + printf("Error: Invalid log level: %s\r\n", furi_string_get_cstr(level)); + result = false; + } + } + furi_string_free(level); + return result; +} + +FuriString* unit_tests_cli_parse_test_suit(FuriString* args) { + FuriString* test_suit = furi_string_alloc(); + + if(!args_read_string_and_trim(args, test_suit)) { + furi_string_free(test_suit); + return NULL; + } + + return test_suit; +} + void unit_tests_cli(Cli* cli, FuriString* args, void* context) { UNUSED(cli); UNUSED(args); @@ -80,6 +149,34 @@ void unit_tests_cli(Cli* cli, FuriString* args, void* context) { minunit_fail = 0; minunit_status = 0; + if(furi_string_cmp_str(args, "help") == 0 || furi_string_cmp_str(args, "?") == 0) { + unit_tests_cli_print_help(); + return; + } + + FuriString* test_suit_to_run = NULL; + + if(furi_string_size(args)) { + FuriString* arg = furi_string_alloc(); + if(args_read_string_and_trim(args, arg)) { + if(furi_string_cmp_str(arg, "log") == 0) { + // read next argument - log level, if fail - show help and return + if(!unit_tests_cli_parse_log_level(args)) { + unit_tests_cli_print_help(); + furi_string_free(arg); + return; + } + + // next argument might be test suit + test_suit_to_run = unit_tests_cli_parse_test_suit(args); + } else { + // if first argument wasn't log - it was exact test suit to run + test_suit_to_run = unit_tests_cli_parse_test_suit(arg); + } + } + furi_string_free(arg); + } + Loader* loader = furi_record_open(RECORD_LOADER); NotificationApp* notification = furi_record_open(RECORD_NOTIFICATION); @@ -98,8 +195,8 @@ void unit_tests_cli(Cli* cli, FuriString* args, void* context) { break; } - if(furi_string_size(args)) { - if(furi_string_cmp_str(args, unit_tests[i].name) == 0) { + if(test_suit_to_run) { + if(furi_string_cmp_str(test_suit_to_run, unit_tests[i].name) == 0) { unit_tests[i].entry(); } else { printf("Skipping %s\r\n", unit_tests[i].name); @@ -132,6 +229,10 @@ void unit_tests_cli(Cli* cli, FuriString* args, void* context) { } } + if(test_suit_to_run) { + furi_string_free(test_suit_to_run); + } + furi_record_close(RECORD_NOTIFICATION); furi_record_close(RECORD_LOADER); } diff --git a/applications/main/subghz/helpers/subghz_custom_event.h b/applications/main/subghz/helpers/subghz_custom_event.h index 350e68ee6..0559ac67e 100644 --- a/applications/main/subghz/helpers/subghz_custom_event.h +++ b/applications/main/subghz/helpers/subghz_custom_event.h @@ -50,6 +50,7 @@ typedef enum { SubGhzCustomEventSceneAnalyzerLock, SubGhzCustomEventSceneAnalyzerUnlock, SubGhzCustomEventSceneSettingLock, + SubGhzCustomEventSceneSettingError, SubGhzCustomEventSceneExit, SubGhzCustomEventSceneStay, diff --git a/applications/main/subghz/scenes/subghz_scene_receiver_config.c b/applications/main/subghz/scenes/subghz_scene_receiver_config.c index 82debf4c0..c23d93496 100644 --- a/applications/main/subghz/scenes/subghz_scene_receiver_config.c +++ b/applications/main/subghz/scenes/subghz_scene_receiver_config.c @@ -45,6 +45,35 @@ const float raw_theshold_rssi_value[RAW_THRESHOLD_RSSI_COUNT] = { -40.0f, }; +#define BANDWIDTH_COUNT 16 +const char* const bandwidth_labels[BANDWIDTH_COUNT] = { + "58 kHz", + "68 kHz", + "81 kHz", + "102 kHz", + "116 kHz", + "135 kHz", + "162 kHz", + "203 kHz", + "232 kHz", + "270 kHz", + "325 kHz", + "406 kHz", + "464 kHz", + "541 kHz", + "650 kHz", + "812 kHz", +}; + +// Bandwidths values are ordered from F (58kHz) to 0 (812kHz) +#define BANDWIDTH_INDEX(value) ((uint8_t)15 - ((uint8_t)(value >> 4) & 0x0F)) + +#define MANCHESTER_FLAG_COUNT 2 +const char* const manchester_flag_text[MANCHESTER_FLAG_COUNT] = { + "OFF", + "ON", +}; + #define HOPPING_COUNT 2 const char* const hopping_text[HOPPING_COUNT] = { "OFF", @@ -99,6 +128,18 @@ const uint32_t speaker_value[SPEAKER_COUNT] = { SubGhzSpeakerStateEnable, }; +// Allow advanced edit only on specific preset +bool subghz_scene_receiver_config_can_edit_current_preset(SubGhz* subghz) { + SubGhzRadioPreset* preset = subghz->txrx->preset; + + bool preset_name_allow_edit = + !strcmp(furi_string_get_cstr(preset->name), ADVANCED_AM_PRESET_NAME) || + !strcmp(furi_string_get_cstr(preset->name), "CUSTOM"); + + return preset && preset_name_allow_edit && + subghz_preset_custom_is_ook_modulation(preset->data, preset->data_size); +} + uint8_t subghz_scene_receiver_config_next_frequency(const uint32_t value, void* context) { furi_assert(context); SubGhz* subghz = context; @@ -129,6 +170,52 @@ uint8_t subghz_scene_receiver_config_next_preset(const char* preset_name, void* return index; } +// Advanced settings of preset may change if preset was changed. +// In that case - update values +static void subghz_scene_receiver_config_update_advanced(SubGhz* subghz) { + uint8_t value_index; + + if(subghz->variable_item_bandwidth) { + value_index = BANDWIDTH_INDEX(subghz->txrx->raw_bandwidth); + variable_item_set_current_value_index(subghz->variable_item_bandwidth, value_index); + variable_item_set_current_value_text( + subghz->variable_item_bandwidth, bandwidth_labels[value_index]); + } + + if(subghz->variable_item_datarate) { + variable_item_set_current_value_index(subghz->variable_item_datarate, 0); + + char datarate_str[16] = {0}; + subghz_preset_custom_printf_datarate( + subghz->txrx->raw_datarate, datarate_str, sizeof(datarate_str)); + variable_item_set_current_value_text(subghz->variable_item_datarate, datarate_str); + } + + if(subghz->variable_item_manchester) { + value_index = subghz->txrx->raw_manchester_enabled ? 1 : 0; + + variable_item_set_current_value_index(subghz->variable_item_manchester, value_index); + variable_item_set_current_value_text( + subghz->variable_item_manchester, manchester_flag_text[value_index]); + } +} + +// Apply advanced configuration to advanced am preset +static void subghz_scene_receiver_config_apply_advanced(SubGhz* subghz) { + if(subghz_scene_receiver_config_can_edit_current_preset(subghz)) { + SubGhzRadioPreset* preset = subghz->txrx->preset; + + subghz_preset_custom_set_bandwidth( + preset->data, preset->data_size, subghz->txrx->raw_bandwidth); + + subghz_preset_custom_set_machester_enable( + preset->data, preset->data_size, subghz->txrx->raw_manchester_enabled); + + subghz_preset_custom_set_datarate( + preset->data, preset->data_size, subghz->txrx->raw_datarate); + } +} + uint8_t subghz_scene_receiver_config_hopper_value_index( const uint32_t value, const uint32_t values[], @@ -214,6 +301,8 @@ static void subghz_scene_receiver_config_set_preset(VariableItem* item) { subghz->txrx->preset->frequency, subghz_setting_get_preset_data(subghz->setting, index), subghz_setting_get_preset_data_size(subghz->setting, index)); + + subghz_scene_receiver_config_update_advanced(subghz); } static void subghz_scene_receiver_config_set_rssi_threshold(VariableItem* item) { @@ -307,6 +396,107 @@ static void subghz_scene_receiver_config_set_raw_threshold_rssi(VariableItem* it subghz->txrx->raw_threshold_rssi = raw_theshold_rssi_value[index]; } +static void subghz_scene_receiver_config_set_raw_ook_bandwidth(VariableItem* item) { + SubGhz* subghz = variable_item_get_context(item); + if(subghz_scene_receiver_config_can_edit_current_preset(subghz)) { + // update bandwidth value from selected index + uint8_t index = variable_item_get_current_value_index(item); + subghz->txrx->raw_bandwidth = subghz_preset_custom_bandwidth_values[index]; + + subghz_scene_receiver_config_update_advanced(subghz); + } else { + furi_string_set( + subghz->error_str, "Read-only\nsetting!\nUse '" ADVANCED_AM_PRESET_NAME "'\npreset."); + view_dispatcher_send_custom_event( + subghz->view_dispatcher, SubGhzCustomEventSceneSettingError); + } +} + +static void subghz_scene_receiver_config_set_manchester_flag(VariableItem* item) { + SubGhz* subghz = variable_item_get_context(item); + if(subghz_scene_receiver_config_can_edit_current_preset(subghz)) { + // update enable flag from view + uint8_t index = variable_item_get_current_value_index(item); + subghz->txrx->raw_manchester_enabled = index == 0 ? false : true; + + subghz_scene_receiver_config_update_advanced(subghz); + } else { + furi_string_set( + subghz->error_str, "Read-only\nsetting!\nUse '" ADVANCED_AM_PRESET_NAME "'\npreset."); + view_dispatcher_send_custom_event( + subghz->view_dispatcher, SubGhzCustomEventSceneSettingError); + } +} + +static void subghz_scene_receiver_config_datarate_input_callback(void* context) { + furi_assert(context); + SubGhz* subghz = context; + + float value = atoff(subghz->datarate_input_str); + if(value != 0 && value > 0) { + subghz->txrx->raw_datarate = value; + subghz_scene_receiver_config_update_advanced(subghz); + } + + // show list view + view_dispatcher_switch_to_view(subghz->view_dispatcher, SubGhzViewIdVariableItemList); +} + +static bool subghz_scene_receiver_config_datarate_input_validate( + const char* text, + FuriString* error, + void* context) { + UNUSED(context); + + float value = atoff(text); + if(value == 0) { + furi_string_printf(error, "Cannot parse\r\nvalue"); + } else if(value < 0) { + furi_string_printf(error, "Value\r\nshould be\r\ngreater\r\nthan 0"); + } else { + return true; + } + + return false; +} + +static void subghz_scene_receiver_config_show_datarate_input(SubGhz* subghz) { + TextInput* text_input = subghz->text_input; + + snprintf( + subghz->datarate_input_str, + sizeof(subghz->datarate_input_str), + "%.2f", + (double)subghz->txrx->raw_datarate); + + text_input_set_header_text(text_input, "Datarate bauds (not kBauds)"); + text_input_set_result_callback( + text_input, + subghz_scene_receiver_config_datarate_input_callback, + subghz, + subghz->datarate_input_str, + sizeof(subghz->datarate_input_str), + false); + + text_input_set_validator( + text_input, subghz_scene_receiver_config_datarate_input_validate, NULL); + view_dispatcher_switch_to_view(subghz->view_dispatcher, SubGhzViewIdTextInput); +} + +static void subghz_scene_receiver_config_set_datarate(VariableItem* item) { + SubGhz* subghz = variable_item_get_context(item); + if(subghz_scene_receiver_config_can_edit_current_preset(subghz)) { + // reset value index in order to show '>' symbol always + variable_item_set_current_value_index(item, 0); + subghz_scene_receiver_config_show_datarate_input(subghz); + } else { + furi_string_set( + subghz->error_str, "Read-only\nsetting!\nUse '" ADVANCED_AM_PRESET_NAME "'\npreset."); + view_dispatcher_send_custom_event( + subghz->view_dispatcher, SubGhzCustomEventSceneSettingError); + } +} + static void subghz_scene_receiver_config_var_list_enter_callback(void* context, uint32_t index) { furi_assert(context); SubGhz* subghz = context; @@ -437,6 +627,33 @@ void subghz_scene_receiver_config_on_enter(void* context) { subghz->txrx->raw_threshold_rssi, raw_theshold_rssi_value, RAW_THRESHOLD_RSSI_COUNT); variable_item_set_current_value_index(item, value_index); variable_item_set_current_value_text(item, raw_theshold_rssi_text[value_index]); + + // Advanced MODEM settings. RW only for ADVANCED_AM_PRESET_NAME + // Bandwidth + subghz->variable_item_bandwidth = variable_item_list_add( + subghz->variable_item_list, + "Bandwidth:", + BANDWIDTH_COUNT, + subghz_scene_receiver_config_set_raw_ook_bandwidth, + subghz); + + // Data rate (editable via OK click) + subghz->variable_item_datarate = variable_item_list_add( + subghz->variable_item_list, + "Data rate:", + 2, + subghz_scene_receiver_config_set_datarate, + subghz); + + // Manchester codec flag + subghz->variable_item_manchester = variable_item_list_add( + subghz->variable_item_list, + "Manch. Enc.:", + MANCHESTER_FLAG_COUNT, + subghz_scene_receiver_config_set_manchester_flag, + subghz); + + subghz_scene_receiver_config_update_advanced(subghz); } view_dispatcher_switch_to_view(subghz->view_dispatcher, SubGhzViewIdVariableItemList); } @@ -450,6 +667,11 @@ bool subghz_scene_receiver_config_on_event(void* context, SceneManagerEvent even subghz->lock = SubGhzLockOn; scene_manager_previous_scene(subghz->scene_manager); consumed = true; + } else if(event.event == SubGhzCustomEventSceneSettingError) { + scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowErrorSub); + scene_manager_set_scene_state( + subghz->scene_manager, SubGhzSceneShowErrorSub, event.event); + consumed = true; } } return consumed; @@ -457,6 +679,16 @@ bool subghz_scene_receiver_config_on_event(void* context, SceneManagerEvent even void subghz_scene_receiver_config_on_exit(void* context) { SubGhz* subghz = context; + + // reset UI variable list items (next scene may be not RAW config) + subghz->variable_item_bandwidth = NULL; + subghz->variable_item_datarate = NULL; + subghz->variable_item_manchester = NULL; + text_input_set_validator(subghz->text_input, NULL, NULL); + + // apply advanced preset variables (if applicable) + subghz_scene_receiver_config_apply_advanced(subghz); + variable_item_list_set_selected_item(subghz->variable_item_list, 0); variable_item_list_reset(subghz->variable_item_list); subghz_last_settings_save(subghz->last_settings); diff --git a/applications/main/subghz/scenes/subghz_scene_show_error_sub.c b/applications/main/subghz/scenes/subghz_scene_show_error_sub.c index 113e7ae74..2943c764a 100644 --- a/applications/main/subghz/scenes/subghz_scene_show_error_sub.c +++ b/applications/main/subghz/scenes/subghz_scene_show_error_sub.c @@ -26,8 +26,16 @@ bool subghz_scene_show_error_sub_on_event(void* context, SceneManagerEvent event SubGhz* subghz = context; if(event.type == SceneManagerEventTypeCustom) { if(event.event == SubGhzCustomEventSceneShowErrorSub) { - scene_manager_search_and_switch_to_previous_scene( - subghz->scene_manager, SubGhzSceneStart); + if(scene_manager_get_scene_state(subghz->scene_manager, SubGhzSceneShowErrorSub) == + SubGhzCustomEventSceneSettingError) { + scene_manager_set_scene_state( + subghz->scene_manager, SubGhzSceneReadRAW, SubGhzCustomEventManagerSet); + scene_manager_search_and_switch_to_previous_scene( + subghz->scene_manager, SubGhzSceneReceiverConfig); + } else { + scene_manager_search_and_switch_to_previous_scene( + subghz->scene_manager, SubGhzSceneStart); + } return true; } } diff --git a/applications/main/subghz/subghz.c b/applications/main/subghz/subghz.c index c39c35679..e6378e30f 100644 --- a/applications/main/subghz/subghz.c +++ b/applications/main/subghz/subghz.c @@ -185,6 +185,12 @@ SubGhz* subghz_alloc(bool alloc_for_tx_only) { subghz_setting_load(subghz->setting, EXT_PATH("subghz/assets/setting_user")); + // Load custom advanced AM preset with configurable CFGMDM settings + FlipperFormat* advanced_am_preset = subghz_preset_custom_advanced_am_preset_alloc(); + subghz_setting_load_custom_preset( + subghz->setting, ADVANCED_AM_PRESET_NAME, advanced_am_preset); + flipper_format_free(advanced_am_preset); + // Custom Presets load without using config file FlipperFormat* temp_fm_preset = flipper_format_string_alloc(); diff --git a/applications/main/subghz/subghz_i.c b/applications/main/subghz/subghz_i.c index 77ee7c950..bac25759a 100644 --- a/applications/main/subghz/subghz_i.c +++ b/applications/main/subghz/subghz_i.c @@ -30,6 +30,12 @@ void subghz_preset_init( subghz->txrx->preset->frequency = frequency; subghz->txrx->preset->data = preset_data; subghz->txrx->preset->data_size = preset_data_size; + + subghz->txrx->raw_bandwidth = + subghz_preset_custom_get_bandwidth(preset_data, preset_data_size); + subghz->txrx->raw_manchester_enabled = + subghz_preset_custom_get_machester_enable(preset_data, preset_data_size); + subghz->txrx->raw_datarate = subghz_preset_custom_get_datarate(preset_data, preset_data_size); } bool subghz_set_preset(SubGhz* subghz, const char* preset) { diff --git a/applications/main/subghz/subghz_i.h b/applications/main/subghz/subghz_i.h index d1111fb09..a6c96cb69 100644 --- a/applications/main/subghz/subghz_i.h +++ b/applications/main/subghz/subghz_i.h @@ -3,6 +3,7 @@ #include "helpers/subghz_types.h" #include "helpers/subghz_error_type.h" #include +#include #include "subghz.h" #include "views/receiver.h" #include "views/transmitter.h" @@ -78,6 +79,13 @@ struct SubGhzTxRx { float raw_threshold_rssi; uint8_t raw_threshold_rssi_low_count; + + // one of the 16 possible bandwidth values + uint8_t raw_bandwidth; + // datarate in bauds + float raw_datarate; + // flag if manchester encoding/decoding enabled + bool raw_manchester_enabled; }; typedef struct SubGhzTxRx SubGhzTxRx; @@ -106,6 +114,13 @@ struct SubGhz { SubGhzViewTransmitter* subghz_transmitter; VariableItemList* variable_item_list; + // Advanced config items + VariableItem* variable_item_bandwidth; // specific config list view item: bandwidth + VariableItem* variable_item_datarate; // specific config list view item: data rate + VariableItem* variable_item_manchester; // specific config list view item: manchester enc flag + // Advanced config strings + char datarate_input_str[16]; + SubGhzFrequencyAnalyzer* subghz_frequency_analyzer; SubGhzReadRAW* subghz_read_raw; bool raw_send_only; diff --git a/lib/subghz/helpers/subghz_config_preset_custom.c b/lib/subghz/helpers/subghz_config_preset_custom.c new file mode 100644 index 000000000..a7247afc1 --- /dev/null +++ b/lib/subghz/helpers/subghz_config_preset_custom.c @@ -0,0 +1,326 @@ +#include "subghz_config_preset_custom.h" + +#include +#include +#include // UNUSED() +#include // furi_assert() +#include // log2(), floor() + +#include + +// https://www.ti.com/lit/ds/symlink/cc1101.pdf?ts=1671943815135 +// page 35. +// 12 Data Rate Programming +// +#define DATARATE_FUNC_CHIP_FOSC 26000000.0 /* 26MHz */ +#define DATARATE_FUNC_DIVIDER (1 << 28) /* 2 pow 28 */ +#define DATARATE_FUNC_MULTIPLIER \ + (DATARATE_FUNC_CHIP_FOSC / DATARATE_FUNC_DIVIDER) /* should be 0.09685754 */ + +#define DATARATE_EXP_FORMULA_DIVISIBLE (1 << 20) /* 2 pow 20 */ +#define DATARATE_EXP_FORMULA_MULTIPLIER \ + (DATARATE_EXP_FORMULA_DIVISIBLE / DATARATE_FUNC_CHIP_FOSC) /* should be 0.04032984 */ + +#define DATARATE_MNT_FORMULA_DIVISIBLE (1 << 28) /* 2 pow 28 */ +#define DATARATE_MNT_FORMULA_MULTIPLIER \ + (DATARATE_MNT_FORMULA_DIVISIBLE / DATARATE_FUNC_CHIP_FOSC) /* should be 10.3244406 */ +// + +#define SUGHZ_CONFIG_TAG "SubGHz_Config" + +uint8_t furi_hal_subghz_preset_ook_custom_async_regs[PRESET_OOK_CUSTOM_ADVANCED_AM_SIZE] = {0}; + +/** Check if cursom preset is AM (OOK) modulation + * + * This will check MOD_FORMAT bits in CC1101_MDMCFG2 register + * If preset data doesn have this register - will return false. + * This function will not fail in any case + * + * @param preset_data Custom preset data (registers and patable) + * @param data_len Data length + */ +bool subghz_preset_custom_is_ook_modulation(const uint8_t* preset_data, uint8_t data_len) { + if(preset_data != NULL) { + for(uint8_t i = 2; i <= data_len; i += 2) { + if(preset_data[i - 2] == CC1101_MDMCFG2) { + return (preset_data[i - 1] & 0b01110000) == 0x30; + } + } + } + return false; +} + +/** Get bandwidth value from preset data. + * + * This will get HIGHER bits in CC1101_MDMCFG4 register + * If CC1101_MDMCFG4 is not found in preset data - will return + * CH_BANDWIDTH_INVALID (0xFF) + * If there is ANY low 4 bits in returned value - the value is invalid + * + * @param preset_data Custom preset data (registers and patable) + * @param data_len Data length + */ +uint8_t subghz_preset_custom_get_bandwidth(const uint8_t* preset_data, uint8_t data_len) { + if(preset_data != NULL) { + for(uint8_t i = 2; i <= data_len; i += 2) { + if(preset_data[i - 2] == CC1101_MDMCFG4) { + return (preset_data[i - 1] & 0b11110000); + } + } + } + return CH_BANDWIDTH_INVALID; +} + +/** Set bandwidth value to preset data. + * + * This will set HIGHER bits in CC1101_MDMCFG4 register + * If CC1101_MDMCFG4 is not found in preset data - will do nothing and return false + * If there are ANY low 4 bits in provided value - they will be ignored + * + * @param preset_data Custom preset data (registers and patable) + * @param data_len Data length + * @param value New bandwidth value. See macros definition for possible values + */ +bool subghz_preset_custom_set_bandwidth(uint8_t* preset_data, uint8_t data_len, uint8_t value) { + if(preset_data != NULL) { + for(uint8_t i = 2; i <= data_len; i += 2) { + if(preset_data[i - 2] == CC1101_MDMCFG4) { + preset_data[i - 1] = (preset_data[i - 1] & 0b00001111) | (0b11110000 & value); + return true; + } + } + } + return false; +} + +/** Get data rate value from preset data. + * + * This will get DRATE_M and DRATE_E bits from CC1101_MDMCFG3 and CC1101_MDMCFG4 registers + * and calculate the value for 26MHz chip oscillator by formula from datasheet. + * + * If CC1101_MDMCFG[3:4] are not found in preset data - will return `-1` + * + * @param preset_data Custom preset data (registers and patable) + * @param data_len Data length + */ +float subghz_preset_custom_get_datarate(const uint8_t* preset_data, uint8_t data_len) { + if(preset_data != NULL) { + uint8_t mantissa = 0xFF; + uint8_t exponent = 0xFF; // Invalid, only 4 lower bits are singificant + + uint8_t step = 0; + + for(uint8_t i = 2; i <= data_len && step < 2; i += 2) { + if(preset_data[i - 2] == CC1101_MDMCFG4) { + exponent = preset_data[i - 1] & 0b00001111; + step++; + } else if(preset_data[i - 2] == CC1101_MDMCFG3) { + mantissa = preset_data[i - 1]; + step++; + } + } + + if(step == 2) { + return (float)((256 + mantissa) * (1 << exponent) * DATARATE_FUNC_MULTIPLIER); + } + } + return -1; +} + +/** Set data rate value to preset data. + * + * This will update DRATE_M and DRATE_E bits from CC1101_MDMCFG3 and CC1101_MDMCFG4 registers + * with calculated values for 26MHz chip oscillator by formula from datasheet. + * + * If CC1101_MDMCFG[3:4] are not found in preset data - will return false + * + * @param preset_data Custom preset data (registers and patable) + * @param data_len Data length + * @param value value in kBaud + */ +bool subghz_preset_custom_set_datarate(uint8_t* preset_data, uint8_t data_len, float value) { + if(preset_data != NULL) { + uint8_t* pMantissa = NULL; + uint8_t* pExponent = NULL; + + uint8_t step = 0; + for(uint8_t i = 2; i <= data_len && step < 2; i += 2) { + if(preset_data[i - 2] == CC1101_MDMCFG4) { + pExponent = &preset_data[i - 1]; + step++; + } else if(preset_data[i - 2] == CC1101_MDMCFG3) { + pMantissa = &preset_data[i - 1]; + step++; + } + } + + // Has both registers in data - calculate values + if(step == 2) { + // │ value * 2^20 │ + // DRATE_E = │log2(──────────────)│ + // └ Fosc ┘ + + double exponent = floor(log2(value * DATARATE_EXP_FORMULA_MULTIPLIER)); + uint8_t datarate_e = (uint8_t)exponent; + + // value * 2^28 + // DRATE_M = (────────────────────) - 256 + // Fosc * 2^DRATE_E + double mantissa = + floor((value * DATARATE_MNT_FORMULA_MULTIPLIER) / (1 << datarate_e) + 0.5) - 256; + + // If DRATE_M is rounded to the nearest integer and becomes 256, increment DRATE_E and use DRATE_M = 0. + if(mantissa >= 256) { + mantissa = 0; + datarate_e += 1; + } + uint8_t datarate_m = (uint8_t)mantissa; + + *pExponent = (*pExponent & 0b11110000) | (datarate_e & 0b00001111); + *pMantissa = datarate_m; + + return true; + } + } + + return false; +} + +/** Print datarate value to string + * + * This is just convenience function + * + * @param datarate datarate obtained from `subghz_preset_custom_get_datarate` function + * @param string Target print buffer + * @param size Target print buffer size + */ +void subghz_preset_custom_printf_datarate(float datarate, char* string, uint8_t size) { + float kBaudRate = datarate / 1000.0f; + snprintf( + string, + size, + "%lu.%02lu kBd", + (uint32_t)(kBaudRate), // decimal part + (uint32_t)((kBaudRate - (uint32_t)kBaudRate) * 100) // fractional part multiplied by 100 + ); +} + +/** Get Manchester encoding/decoding flag value from preset data. + * + * This will get MANCHESTER_EN (3-rd) bit in CC1101_MDMCFG2 register + * If CC1101_MDMCFG2 is not found in preset data - will return false + * + * @param preset_data Custom preset data (registers and patable) + * @param data_len Data length + */ +bool subghz_preset_custom_get_machester_enable(const uint8_t* preset_data, uint8_t data_len) { + if(preset_data != NULL) { + for(uint8_t i = 2; i <= data_len; i += 2) { + if(preset_data[i - 2] == CC1101_MDMCFG2) { + return (preset_data[i - 1] & 0b00001000); + } + } + } + return false; +} + +/** Set Manchester encoding/decoding flag value to preset data. + * + * This will set MANCHESTER_EN (3-rd) bit in CC1101_MDMCFG2 register + * If CC1101_MDMCFG2 is not found in preset data - will return false + * + * @param preset_data Custom preset data (registers and patable) + * @param data_len Data length + */ +bool subghz_preset_custom_set_machester_enable(uint8_t* preset_data, uint8_t data_len, bool value) { + if(preset_data != NULL) { + for(uint8_t i = 2; i <= data_len; i += 2) { + if(preset_data[i - 2] == CC1101_MDMCFG2) { + preset_data[i - 1] = (preset_data[i - 1] & 0b11110111) | (0b00001000 * value); + return true; + } + } + } + return false; +} + +/** + * Initialize custom preset data + */ +void subghz_preset_custom_init_advanced_am_preset() { + FURI_LOG_D(SUGHZ_CONFIG_TAG, "Initializing AM preset with custom Modem configuration"); + + if(furi_hal_subghz_preset_ook_custom_async_regs[0]) { + // already initialized + FURI_LOG_D(SUGHZ_CONFIG_TAG, "Already initialized"); + return; + } + + // Copy default AM270 preset + memcpy( + &furi_hal_subghz_preset_ook_custom_async_regs, + &furi_hal_subghz_preset_ook_270khz_async_regs, + sizeof(furi_hal_subghz_preset_ook_270khz_async_regs)); + + const uint8_t ModemConfigStart = 4; + +#if FURI_DEBUG + const uint8_t ModemConfigEnd = ModemConfigStart + MODEM_CONFIG_REGISTERS_COUNT; + for(uint8_t i = ModemConfigStart; i < ModemConfigEnd; ++i) { + // Check we'll overwrite correct settings + furi_assert( + furi_hal_subghz_preset_ook_custom_async_regs[i * 2 + 0] == + furi_hal_subghz_custom_modulation_regs[i - ModemConfigStart][0]); + } +#endif + + // Copy CUSTOM Modem preset + memcpy( + &furi_hal_subghz_preset_ook_custom_async_regs[ModemConfigStart * 2], + &furi_hal_subghz_custom_modulation_regs, + sizeof(furi_hal_subghz_custom_modulation_regs)); + + // Copy default AM270 patable + memcpy( + &furi_hal_subghz_preset_ook_custom_async_regs[sizeof( + furi_hal_subghz_preset_ook_270khz_async_regs)], + &furi_hal_subghz_preset_ook_async_patable, + sizeof(furi_hal_subghz_preset_ook_async_patable)); + + // Here at the end we should have + // 00 00 + +#if FURI_DEBUG + FURI_LOG_D(SUGHZ_CONFIG_TAG, "Custom OOK preset created"); + + for(uint8_t i = 0; i < PRESET_OOK_CUSTOM_ADVANCED_AM_SIZE; i += 2) { + FURI_LOG_D( + SUGHZ_CONFIG_TAG, + "Register: 0x%hhX, Value: 0x%hhX", + furi_hal_subghz_preset_ook_custom_async_regs[i * 2 + 0], + furi_hal_subghz_preset_ook_custom_async_regs[i * 2 + 1]); + } +#endif + + FURI_LOG_D(SUGHZ_CONFIG_TAG, "Done"); +} + +/** + * Create subghz preset file with custom am preset + * this is used for preset initialization if subghz app + */ +FlipperFormat* subghz_preset_custom_advanced_am_preset_alloc() { + FlipperFormat* advanced_am_preset = flipper_format_string_alloc(); + + subghz_preset_custom_init_advanced_am_preset(); + + flipper_format_write_hex( + advanced_am_preset, + (const char*)"Custom_preset_data", + (const uint8_t*)&furi_hal_subghz_preset_ook_custom_async_regs[0], + sizeof(furi_hal_subghz_preset_ook_custom_async_regs)); + + flipper_format_rewind(advanced_am_preset); + + return advanced_am_preset; +} diff --git a/lib/subghz/helpers/subghz_config_preset_custom.h b/lib/subghz/helpers/subghz_config_preset_custom.h new file mode 100644 index 000000000..318197f5d --- /dev/null +++ b/lib/subghz/helpers/subghz_config_preset_custom.h @@ -0,0 +1,193 @@ +#pragma once + +#include +#include /* memcpy() */ + +#define ADVANCED_AM_PRESET_NAME "AM*" + +// Awailable bandwidth values +// Setup in MDMCFG4 register +#define CH_BANDWIDTH_058 0b11110000 +#define CH_BANDWIDTH_068 0b11100000 +#define CH_BANDWIDTH_081 0b11010000 +#define CH_BANDWIDTH_102 0b11000000 + +#define CH_BANDWIDTH_116 0b10110000 +#define CH_BANDWIDTH_135 0b10100000 +#define CH_BANDWIDTH_162 0b10010000 +#define CH_BANDWIDTH_203 0b10000000 + +#define CH_BANDWIDTH_232 0b01110000 +#define CH_BANDWIDTH_270 0b01100000 +#define CH_BANDWIDTH_325 0b01010000 +#define CH_BANDWIDTH_406 0b01000000 + +#define CH_BANDWIDTH_464 0b00110000 +#define CH_BANDWIDTH_541 0b00100000 +#define CH_BANDWIDTH_650 0b00010000 +#define CH_BANDWIDTH_812 0b00000000 + +#define CH_BANDWIDTH_INVALID 0xFF + +static const uint8_t subghz_preset_custom_bandwidth_values[] = { + CH_BANDWIDTH_058, + CH_BANDWIDTH_068, + CH_BANDWIDTH_081, + CH_BANDWIDTH_102, + + CH_BANDWIDTH_116, + CH_BANDWIDTH_135, + CH_BANDWIDTH_162, + CH_BANDWIDTH_203, + + CH_BANDWIDTH_232, + CH_BANDWIDTH_270, + CH_BANDWIDTH_325, + CH_BANDWIDTH_406, + + CH_BANDWIDTH_464, + CH_BANDWIDTH_541, + CH_BANDWIDTH_650, + CH_BANDWIDTH_812, +}; +#define CH_BANDWIDTH_NUM (sizeof(subghz_preset_custom_bandwidth_values) / sizeof(uint8_t)) + +#define DATARATE_EXPONENT_3_79_kBaud 0b00000111 // 7 +#define DATARATE_MANTISSA_3_79_kBaud 0x32 + +#define CHANNEL_SPACING_25_EXPONENT 0b00000000 /* last bit */ +#define CHANNEL_SPACING_25_MANTISSA 0x00 + +#define MODEM_CONFIG_REGISTERS_COUNT 5 +#define PRESET_OOK_CUSTOM_ADVANCED_AM_SIZE \ + sizeof(furi_hal_subghz_preset_ook_270khz_async_regs) + \ + sizeof(furi_hal_subghz_preset_ook_async_patable) + +extern uint8_t furi_hal_subghz_preset_ook_custom_async_regs[PRESET_OOK_CUSTOM_ADVANCED_AM_SIZE]; + +static const uint8_t furi_hal_subghz_custom_modulation_regs[MODEM_CONFIG_REGISTERS_COUNT][2] = { + // Channel spacing is 25kHz, no Forward Error Correction, 2 preamble bytes (will be ignored) + {CC1101_MDMCFG0, CHANNEL_SPACING_25_MANTISSA}, + {CC1101_MDMCFG1, 0x00 | CHANNEL_SPACING_25_EXPONENT}, + + // [0:2] SYNC_MODE = 00 // No preamble/sync + // [3:3] MANCHESTER_EN = 0 // Disable + // [4:6] MOD_FORMAT = 03 // Format ASK/OOK + // [7:7] DEM_DCFILT_OFF = 0 // Enable + {CC1101_MDMCFG2, 0x30}, + + // 3.79 kBaud data rate (mantissa in 3rd register) + {CC1101_MDMCFG3, DATARATE_MANTISSA_3_79_kBaud}, + + // 270.8333 kHz Rx BW filer (hi) and 3.79 kBaud data rate (exponent in 4th register) + {CC1101_MDMCFG4, DATARATE_EXPONENT_3_79_kBaud | CH_BANDWIDTH_270}, +}; + +#ifdef __cplusplus +extern "C" { +#endif + +/** Check if cursom preset is AM (OOK) modulation + * + * This will check MOD_FORMAT bits in CC1101_MDMCFG2 register + * If preset data doesn have this register - will return false. + * This function will not fail in any case + * + * @param preset_data Custom preset data (registers and patable) + * @param data_len Data length + */ +bool subghz_preset_custom_is_ook_modulation(const uint8_t* preset_data, uint8_t data_len); + +/** Get bandwidth value from preset data. + * + * This will get HIGHER bits in CC1101_MDMCFG4 register + * If CC1101_MDMCFG4 is not found in preset data - will return + * CH_BANDWIDTH_INVALID (0xFF) + * If there is ANY low 4 bits in returned value - the value is invalid + * + * @param preset_data Custom preset data (registers and patable) + * @param data_len Data length + */ +uint8_t subghz_preset_custom_get_bandwidth(const uint8_t* preset_data, uint8_t data_len); + +/** Set bandwidth value to preset data. + * + * This will set HIGHER bits in CC1101_MDMCFG4 register + * If CC1101_MDMCFG4 is not found in preset data - will do nothing and return false + * If there are ANY low 4 bits in provided value - they will be ignored + * + * @param preset_data Custom preset data (registers and patable) + * @param data_len Data length + * @param value New bandwidth value. See macros definition for possible values + */ +bool subghz_preset_custom_set_bandwidth(uint8_t* preset_data, uint8_t data_len, uint8_t value); + +/** Get data rate value from preset data. + * + * This will get DRATE_M and DRATE_E bits from CC1101_MDMCFG3 and CC1101_MDMCFG4 registers + * and calculate the value for 26MHz chip oscillator by formula from datasheet. + * + * If CC1101_MDMCFG[3:4] are not found in preset data - will return `-1` + * + * @param preset_data Custom preset data (registers and patable) + * @param data_len Data length + */ +float subghz_preset_custom_get_datarate(const uint8_t* preset_data, uint8_t data_len); + +/** Set data rate value to preset data. + * + * This will update DRATE_M and DRATE_E bits from CC1101_MDMCFG3 and CC1101_MDMCFG4 registers + * with calculated values for 26MHz chip oscillator by formula from datasheet. + * + * If CC1101_MDMCFG[3:4] are not found in preset data - will return false + * + * @param preset_data Custom preset data (registers and patable) + * @param data_len Data length + * @param value value in kBaud + */ +bool subghz_preset_custom_set_datarate(uint8_t* preset_data, uint8_t data_len, float value); + +/** Print datarate value to string + * + * This is just conviniece function + * + * @param datarate datarate obtained from `subghz_preset_custom_get_datarate` function + * @param string Target print buffer + * @param size Target print buffer size + */ +void subghz_preset_custom_printf_datarate(float datarate, char* string, uint8_t size); + +/** Get Manchester encoding/decoding flag value from preset data. + * + * This will get MANCHESTER_EN (3-rd) bit in CC1101_MDMCFG2 register + * If CC1101_MDMCFG2 is not found in preset data - will return false + * + * @param preset_data Custom preset data (registers and patable) + * @param data_len Data length + */ +bool subghz_preset_custom_get_machester_enable(const uint8_t* preset_data, uint8_t data_len); + +/** Set Manchester encoding/decoding flag value to preset data. + * + * This will set MANCHESTER_EN (3-rd) bit in CC1101_MDMCFG2 register + * If CC1101_MDMCFG2 is not found in preset data - will return false + * + * @param preset_data Custom preset data (registers and patable) + * @param data_len Data length + */ +bool subghz_preset_custom_set_machester_enable(uint8_t* preset_data, uint8_t data_len, bool value); + +/** + * Initialize advanced am custom preset + */ +void subghz_preset_custom_init_advanced_am_preset(); + +/** + * Create subghz preset file with custom am preset + * this is used for preset initialization if subghz app + */ +struct FlipperFormat* subghz_preset_custom_advanced_am_preset_alloc(); + +#ifdef __cplusplus +} +#endif \ No newline at end of file From f28307128f313a40a9be95e007503e45b0ea689b Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sat, 31 Dec 2022 03:20:59 +0300 Subject: [PATCH 019/506] Fix extra apps builds --- .drone.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index 6d9c226cb..938f81e57 100644 --- a/.drone.yml +++ b/.drone.yml @@ -37,7 +37,7 @@ steps: pull: never commands: - git clone https://github.com/xMasterX/unleashed-extra-pack.git - - cp -R unleashed-extra-pack/apps/ assets/resources/apps + - cp -R unleashed-extra-pack/apps/* assets/resources/apps/ - rm -rf unleashed-extra-pack - export DIST_SUFFIX=${DRONE_TAG}e - export WORKFLOW_BRANCH_OR_TAG=release-cfw From 27cc057573680a40deb7226697af689a0149ae3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tibor=20T=C3=A1losi?= Date: Sat, 31 Dec 2022 11:47:23 +0100 Subject: [PATCH 020/506] =?UTF-8?q?solitaire:=20fixed=20card=20placement?= =?UTF-8?q?=20to=20not=20allow=20placing=20=E2=99=A03=20on=20top=20row=20w?= =?UTF-8?q?hen=20there=20was=20no=20card=20there.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- applications/plugins/solitaire/solitaire.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/applications/plugins/solitaire/solitaire.c b/applications/plugins/solitaire/solitaire.c index e1fffbc8a..1b56e2150 100644 --- a/applications/plugins/solitaire/solitaire.c +++ b/applications/plugins/solitaire/solitaire.c @@ -255,6 +255,10 @@ bool place_on_top(Card* where, Card what) { int8_t b_letter = (int8_t)what.character; if(a_letter == 12) a_letter = -1; if(b_letter == 12) b_letter = -1; + + if(where->disabled && b_letter != -1) + return false; + if((a_letter + 1) == b_letter) { where->disabled = what.disabled; where->pip = what.pip; From 91c159e8239295c80b31d32f6532f8d103be2e2d Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sat, 31 Dec 2022 14:42:24 +0300 Subject: [PATCH 021/506] Update TOTP https://github.com/akopachov/flipper-zero_authenticator --- applications/plugins/totp/types/token_info.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/applications/plugins/totp/types/token_info.c b/applications/plugins/totp/types/token_info.c index c032c6d3f..b9d22808d 100644 --- a/applications/plugins/totp/types/token_info.c +++ b/applications/plugins/totp/types/token_info.c @@ -27,6 +27,8 @@ bool token_info_set_secret( const char* base32_token_secret, size_t token_secret_length, const uint8_t* iv) { + if(token_secret_length == 0) return false; + uint8_t* plain_secret = malloc(token_secret_length); furi_check(plain_secret != NULL); int plain_secret_length = From d3c5ccbfe6e287eefa003b797c2fb2d18bfacb65 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sat, 31 Dec 2022 15:14:32 +0300 Subject: [PATCH 022/506] Dev builds with extra pack included --- .drone.yml | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/.drone.yml b/.drone.yml index 938f81e57..26e31a4e3 100644 --- a/.drone.yml +++ b/.drone.yml @@ -273,9 +273,30 @@ steps: FBT_TOOLS_CUSTOM_LINK: from_secret: fbt_link + - name: "Build dev with extra apps" + image: hfdj/fztools + pull: never + commands: + - git clone https://github.com/xMasterX/unleashed-extra-pack.git + - cp -R unleashed-extra-pack/apps/* assets/resources/apps/ + - rm -rf unleashed-extra-pack + - export DIST_SUFFIX=${DRONE_BUILD_NUMBER}e + - export WORKFLOW_BRANCH_OR_TAG=dev-cfw + - export FORCE_NO_DIRTY=yes + - rm -f build/f7-firmware-C/toolbox/version.* + - ./fbt COMPACT=1 DEBUG=0 updater_package + - mkdir artifacts-extra-apps + - mv dist/f7-C/* artifacts-extra-apps/ + - ls -laS artifacts-extra-apps + - ls -laS artifacts-extra-apps/f7-update-${DRONE_BUILD_NUMBER}e + environment: + FBT_TOOLS_CUSTOM_LINK: + from_secret: fbt_link + - name: "Bundle self-update packages" image: kramos/alpine-zip commands: + - cp artifacts-extra-apps/flipper-z-f7-update-${DRONE_BUILD_NUMBER}.tgz . - cp artifacts-default/flipper-z-f7-update-${DRONE_BUILD_NUMBER}.tgz . - rm -rf artifacts-default/f7-update-${DRONE_BUILD_NUMBER} - ls -laS artifacts-default @@ -318,6 +339,21 @@ steps: - dev/*.dfu - dev/*.bin + - name: "Upload extra apps version to updates srv" + image: appleboy/drone-scp + settings: + host: + from_secret: dep_host + username: + from_secret: dep_user + password: + from_secret: dep_passwd + port: + from_secret: dep_port + target: + from_secret: dep_target_extra + source: flipper-z-f7-update-${DRONE_BUILD_NUMBER}e.tgz + - name: "Trigger update server reindex" image: hfdj/fztools pull: never @@ -348,6 +384,9 @@ steps: Commit: {{commit.message}} + [-Version with extra apps - Install via Web Updater-](https://lab.flipper.net/?url=https://unleashedflip.com/fw_extra_apps/flipper-z-f7-update-${DRONE_BUILD_NUMBER}e.tgz&channel=dev-cfw&version=${DRONE_BUILD_NUMBER}e) + + [-Install via Web Updater-](https://lab.flipper.net/?url=https://unleashedflip.com/fw/dev/flipper-z-f7-update-${DRONE_BUILD_NUMBER}.tgz&channel=dev-cfw&version=${DRONE_BUILD_NUMBER})" document: - dev/flipper-z-f7-update-${DRONE_BUILD_NUMBER}.tgz From 891d5845ddc4d1630bb61e3d2bc753f7bf035d97 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sat, 31 Dec 2022 15:27:47 +0300 Subject: [PATCH 023/506] Fix dev builds --- .drone.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index 26e31a4e3..862a83d2c 100644 --- a/.drone.yml +++ b/.drone.yml @@ -296,7 +296,7 @@ steps: - name: "Bundle self-update packages" image: kramos/alpine-zip commands: - - cp artifacts-extra-apps/flipper-z-f7-update-${DRONE_BUILD_NUMBER}.tgz . + - cp artifacts-extra-apps/flipper-z-f7-update-${DRONE_BUILD_NUMBER}e.tgz . - cp artifacts-default/flipper-z-f7-update-${DRONE_BUILD_NUMBER}.tgz . - rm -rf artifacts-default/f7-update-${DRONE_BUILD_NUMBER} - ls -laS artifacts-default From 84fbe6ad363d9751e3962c6130a5273bbf862a53 Mon Sep 17 00:00:00 2001 From: peoblouk Date: Sat, 31 Dec 2022 17:35:44 +0100 Subject: [PATCH 024/506] adding CZ layout support --- assets/resources/badusb/layouts/cz_CS.kl | Bin 0 -> 256 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/resources/badusb/layouts/cz_CS.kl diff --git a/assets/resources/badusb/layouts/cz_CS.kl b/assets/resources/badusb/layouts/cz_CS.kl new file mode 100644 index 0000000000000000000000000000000000000000..d42e9a4ab6dfd3418febaf747da5f6dda1600282 GIT binary patch literal 256 zcmaLL$xgxm7y#kPgce%XLRng%g5naDh(TM9|NB3cXD-g|8@TVC58m$Azxw3ItJ}E7 z*)+brc;OZeEjK#8e6{hxgGV2I^5nBGcK*`FnJ!wZ=$V+>cVK4j(2-*&PMujecVX$$ zm1{Rv)^6RqGmA3vIK<6U^hikQGaw^p$cQl$rpzdqv!G Date: Sun, 1 Jan 2023 23:14:32 +0300 Subject: [PATCH 025/506] Update UniTemp https://github.com/quen0n/unitemp-flipperzero/tree/dev --- applications/plugins/unitemp/README.md | 9 +- applications/plugins/unitemp/Sensors.c | 1 + applications/plugins/unitemp/Sensors.h | 1 + applications/plugins/unitemp/sensors/BMP180.c | 174 ++++++++++++++++++ applications/plugins/unitemp/sensors/BMP180.h | 62 +++++++ .../plugins/unitemp/sensors/Sensors.xlsx | Bin 12265 -> 12336 bytes 6 files changed, 245 insertions(+), 2 deletions(-) create mode 100644 applications/plugins/unitemp/sensors/BMP180.c create mode 100644 applications/plugins/unitemp/sensors/BMP180.h diff --git a/applications/plugins/unitemp/README.md b/applications/plugins/unitemp/README.md index 257e8a8ae..80a296e9b 100644 --- a/applications/plugins/unitemp/README.md +++ b/applications/plugins/unitemp/README.md @@ -1,9 +1,14 @@ ![Flipper usage](https://user-images.githubusercontent.com/10090793/206618263-c1e212e4-58dc-432e-87a8-5c19fd835b35.png) # Unitemp - Universal temperature sensor reader [![GitHub release](https://img.shields.io/github/release/quen0n/unitemp-flipperzero?include_prereleases=&sort=semver&color=blue)](https://github.com/quen0n/unitemp-flipperzero/releases/) -[![GitHub](https://img.shields.io/github/license/quen0n/unitemp-flipperzero)](https://github.com/quen0n/unitemp-flipperzero/blob/dev/LICENSE.md) +[![GitHub](https://img.shields.io/github/license/quen0n/unitemp-flipperzero)](https://github.com/quen0n/unitemp-flipperzero/blob/dev/LICENSE.md) +[![Build dev](https://github.com/quen0n/unitemp-flipperzero/actions/workflows/build_dev.yml/badge.svg?branch=dev)](https://github.com/quen0n/unitemp-flipperzero/actions/workflows/build_dev.yml) [Flipper Zero](https://flipperzero.one/) application for reading temperature, humidity and pressure sensors using Onewire, Singlewire, I2C protocols. ## List of supported sensors (supplemented) -![image](https://user-images.githubusercontent.com/10090793/209491886-f4c5ef6e-38b2-45b8-a8e7-4aeca9e155f2.png) +![image](https://user-images.githubusercontent.com/10090793/210119924-51119deb-f950-40ee-bc27-22b971243527.png) ## Installation Copy the contents of the repository to the `applications/plugins/unitemp` folder and build the project. Flash FZ along with resources. [More...](https://github.com/flipperdevices/flipperzero-firmware/blob/dev/documentation/fbt.md) +## Some community photos +![image](https://user-images.githubusercontent.com/10090793/210120132-7ddbc937-0a6b-4472-bd1c-7fbc3ecdf2ad.png) +![image](https://user-images.githubusercontent.com/10090793/210120135-12fc5810-77ff-49db-b799-e9479e1f57a7.png) +![image](https://user-images.githubusercontent.com/10090793/210120143-a2bae3ce-4190-421f-8c4f-c7c744903bd6.png) diff --git a/applications/plugins/unitemp/Sensors.c b/applications/plugins/unitemp/Sensors.c index 9740b9887..33f62b201 100644 --- a/applications/plugins/unitemp/Sensors.c +++ b/applications/plugins/unitemp/Sensors.c @@ -83,6 +83,7 @@ static const SensorType* sensorTypes[] = { &SHT30, &GXHT30, &LM75, + &BMP180, &BMP280, &BME280}; diff --git a/applications/plugins/unitemp/Sensors.h b/applications/plugins/unitemp/Sensors.h index 0643ffb1f..2193ce466 100644 --- a/applications/plugins/unitemp/Sensors.h +++ b/applications/plugins/unitemp/Sensors.h @@ -323,4 +323,5 @@ const GPIO* #include "./sensors/AM2320.h" #include "./sensors/DHT20.h" #include "./sensors/SHT30.h" +#include "./sensors/BMP180.h" #endif diff --git a/applications/plugins/unitemp/sensors/BMP180.c b/applications/plugins/unitemp/sensors/BMP180.c new file mode 100644 index 000000000..6fd5f2fa5 --- /dev/null +++ b/applications/plugins/unitemp/sensors/BMP180.c @@ -0,0 +1,174 @@ +/* + Unitemp - Universal temperature reader + Copyright (C) 2022 Victor Nikitchuk (https://github.com/quen0n) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +#include "BMP180.h" +#include "../interfaces/I2CSensor.h" + +typedef struct { + int16_t AC1; + int16_t AC2; + int16_t AC3; + uint16_t AC4; + uint16_t AC5; + uint16_t AC6; + int16_t B1; + int16_t B2; + int16_t MB; + int16_t MC; + int16_t MD; +} BMP180_cal; + +typedef struct { + //Калибровочные значения + BMP180_cal bmp180_cal; +} BMP180_instance; + +const SensorType BMP180 = { + .typename = "BMP180", + .interface = &I2C, + .datatype = UT_TEMPERATURE | UT_PRESSURE, + .pollingInterval = 1000, + .allocator = unitemp_BMP180_I2C_alloc, + .mem_releaser = unitemp_BMP180_I2C_free, + .initializer = unitemp_BMP180_init, + .deinitializer = unitemp_BMP180_I2C_deinit, + .updater = unitemp_BMP180_I2C_update}; + +bool unitemp_BMP180_I2C_alloc(Sensor* sensor, char* args) { + UNUSED(args); + I2CSensor* i2c_sensor = (I2CSensor*)sensor->instance; + + //Адреса на шине I2C (7 бит) + i2c_sensor->minI2CAdr = 0x77 << 1; + i2c_sensor->maxI2CAdr = 0x77 << 1; + + BMP180_instance* bmx280_instance = malloc(sizeof(BMP180_instance)); + i2c_sensor->sensorInstance = bmx280_instance; + return true; +} + +bool unitemp_BMP180_I2C_free(Sensor* sensor) { + UNUSED(sensor); + I2CSensor* i2c_sensor = (I2CSensor*)sensor->instance; + free(i2c_sensor->sensorInstance); + return true; +} + +bool unitemp_BMP180_init(Sensor* sensor) { + I2CSensor* i2c_sensor = (I2CSensor*)sensor->instance; + + //Перезагрузка + if(!unitemp_i2c_writeReg(i2c_sensor, 0xE0, 0xB6)) return false; + furi_delay_ms(100); + + //Проверка ID + uint8_t id = unitemp_i2c_readReg(i2c_sensor, 0xD0); + if(id != 0x55) { + FURI_LOG_E( + APP_NAME, "Sensor %s returned wrong ID 0x%02X, expected 0x55", sensor->name, id); + return false; + } + + BMP180_instance* bmp180_instance = i2c_sensor->sensorInstance; + + uint8_t buff[22] = {0}; + + //Чтение калибровочных значений + if(!unitemp_i2c_readRegArray(i2c_sensor, 0xAA, 22, buff)) return false; + bmp180_instance->bmp180_cal.AC1 = (buff[0] << 8) | buff[1]; + bmp180_instance->bmp180_cal.AC2 = (buff[2] << 8) | buff[3]; + bmp180_instance->bmp180_cal.AC3 = (buff[4] << 8) | buff[5]; + bmp180_instance->bmp180_cal.AC4 = (buff[6] << 8) | buff[7]; + bmp180_instance->bmp180_cal.AC5 = (buff[8] << 8) | buff[9]; + bmp180_instance->bmp180_cal.AC6 = (buff[10] << 8) | buff[11]; + bmp180_instance->bmp180_cal.B1 = (buff[12] << 8) | buff[13]; + bmp180_instance->bmp180_cal.B2 = (buff[14] << 8) | buff[15]; + bmp180_instance->bmp180_cal.MB = (buff[16] << 8) | buff[17]; + bmp180_instance->bmp180_cal.MC = (buff[18] << 8) | buff[19]; + bmp180_instance->bmp180_cal.MD = (buff[20] << 8) | buff[21]; + +#ifdef UNITEMP_DEBUG + FURI_LOG_D( + APP_NAME, + "Sensor BMP180 (0x%02X) calibration values: %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d", + i2c_sensor->currentI2CAdr, + bmp180_instance->bmp180_cal.AC1, + bmp180_instance->bmp180_cal.AC2, + bmp180_instance->bmp180_cal.AC3, + bmp180_instance->bmp180_cal.AC4, + bmp180_instance->bmp180_cal.AC5, + bmp180_instance->bmp180_cal.AC6, + bmp180_instance->bmp180_cal.B1, + bmp180_instance->bmp180_cal.B2, + bmp180_instance->bmp180_cal.MB, + bmp180_instance->bmp180_cal.MC, + bmp180_instance->bmp180_cal.MD); +#endif + return true; +} + +bool unitemp_BMP180_I2C_deinit(Sensor* sensor) { + //Нечего деинициализировать + UNUSED(sensor); + return true; +} + +UnitempStatus unitemp_BMP180_I2C_update(Sensor* sensor) { + I2CSensor* i2c_sensor = (I2CSensor*)sensor->instance; + BMP180_instance* bmp180_instance = i2c_sensor->sensorInstance; + + //Чтение температуры + if(!unitemp_i2c_writeReg(i2c_sensor, 0xF4, 0x2E)) return UT_SENSORSTATUS_TIMEOUT; + furi_delay_ms(5); + uint8_t buff[3] = {0}; + if(!unitemp_i2c_readRegArray(i2c_sensor, 0xF6, 2, buff)) return UT_SENSORSTATUS_TIMEOUT; + int32_t UT = ((uint16_t)buff[0] << 8) + buff[1]; + int32_t X1 = (UT - bmp180_instance->bmp180_cal.AC6) * bmp180_instance->bmp180_cal.AC5 >> 15; + int32_t X2 = (bmp180_instance->bmp180_cal.MC << 11) / (X1 + bmp180_instance->bmp180_cal.MD); + int32_t B5 = X1 + X2; + sensor->temp = ((B5 + 8) / 16) * 0.1f; + + //Чтение давления + if(!unitemp_i2c_writeReg(i2c_sensor, 0xF4, 0x34 + (0b11 << 6))) return UT_SENSORSTATUS_TIMEOUT; + furi_delay_ms(26); + if(!unitemp_i2c_readRegArray(i2c_sensor, 0xF6, 3, buff)) return UT_SENSORSTATUS_TIMEOUT; + uint32_t UP = ((buff[0] << 16) + (buff[1] << 8) + buff[2]) >> (8 - 0b11); + + int32_t B6, X3, B3, P; + uint32_t B4, B7; + B6 = B5 - 4000; + X1 = (bmp180_instance->bmp180_cal.B2 * ((B6 * B6) >> 12)) >> 11; + X2 = (bmp180_instance->bmp180_cal.AC2 * B6) >> 11; + X3 = X1 + X2; + B3 = (((bmp180_instance->bmp180_cal.AC1 * 4 + X3) << 0b11) + 2) >> 2; + X1 = (bmp180_instance->bmp180_cal.AC3 * B6) >> 13; + X2 = (bmp180_instance->bmp180_cal.B1 * ((B6 * B6) >> 12)) >> 16; + X3 = ((X1 + X2) + 2) >> 2; + B4 = (bmp180_instance->bmp180_cal.AC4 * (unsigned long)(X3 + 32768)) >> 15; + B7 = ((unsigned long)UP - B3) * (50000 >> 0b11); + if(B7 < 0x80000000) + P = (B7 * 2) / B4; + else + P = (B7 / B4) * 2; + X1 = (P >> 8) * (P >> 8); + X1 = (X1 * 3038) >> 16; + X2 = (-7357 * (P)) >> 16; + P = P + ((X1 + X2 + 3791) >> 4); + sensor->pressure = P; + + return UT_SENSORSTATUS_OK; +} diff --git a/applications/plugins/unitemp/sensors/BMP180.h b/applications/plugins/unitemp/sensors/BMP180.h new file mode 100644 index 000000000..4237fb57a --- /dev/null +++ b/applications/plugins/unitemp/sensors/BMP180.h @@ -0,0 +1,62 @@ +/* + Unitemp - Universal temperature reader + Copyright (C) 2022 Victor Nikitchuk (https://github.com/quen0n) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +#ifndef UNITEMP_BMP180 +#define UNITEMP_BMP180 + +#include "../unitemp.h" +#include "../Sensors.h" +extern const SensorType BMP180; +/** + * @brief Выделение памяти и установка начальных значений датчика BMP180 + * + * @param sensor Указатель на создаваемый датчик + * @return Истина при успехе + */ +bool unitemp_BMP180_I2C_alloc(Sensor* sensor, char* args); + +/** + * @brief Инициализации датчика BMP180 + * + * @param sensor Указатель на датчик + * @return Истина если инициализация упспешная + */ +bool unitemp_BMP180_init(Sensor* sensor); + +/** + * @brief Деинициализация датчика + * + * @param sensor Указатель на датчик + */ +bool unitemp_BMP180_I2C_deinit(Sensor* sensor); + +/** + * @brief Обновление значений из датчика + * + * @param sensor Указатель на датчик + * @return Статус обновления + */ +UnitempStatus unitemp_BMP180_I2C_update(Sensor* sensor); + +/** + * @brief Высвободить память датчика + * + * @param sensor Указатель на датчик + */ +bool unitemp_BMP180_I2C_free(Sensor* sensor); + +#endif \ No newline at end of file diff --git a/applications/plugins/unitemp/sensors/Sensors.xlsx b/applications/plugins/unitemp/sensors/Sensors.xlsx index b139b1b00722c1c505ebb46541ba194caeddd262..9983aeb6ea1201003aa27a9ca54218e19e5f20c7 100644 GIT binary patch delta 3980 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 W4TletR0hJ~_*O|i$^*pTZ~p;vEoOuO delta 3935 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 Date: Sun, 1 Jan 2023 23:47:47 +0300 Subject: [PATCH 026/506] Fix dev builds Drone ssh defaults to arm now.. so need to specify amd64 arch --- .drone.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index 862a83d2c..c4abce31e 100644 --- a/.drone.yml +++ b/.drone.yml @@ -2,6 +2,10 @@ kind: pipeline type: docker name: "Release firmware" +platform: + os: linux + arch: amd64 + steps: - name: "Update submodules" image: alpine/git @@ -249,6 +253,10 @@ kind: pipeline type: docker name: "Dev build" +platform: + os: linux + arch: amd64 + steps: - name: "Update submodules" image: alpine/git @@ -304,7 +312,7 @@ steps: - ls -laS dev - name: "Clean dev folder" - image: appleboy/drone-ssh + image: appleboy/drone-ssh:linux-amd64 settings: host: from_secret: dep_host From 1534bcf7cb7ba351a401b4d560a82bf2706418d5 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sun, 1 Jan 2023 23:59:09 +0300 Subject: [PATCH 027/506] Why?! appleboy broke 'latest' tag on dockerhub, its only for arm now so, applying hotfix for now --- .drone.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.drone.yml b/.drone.yml index c4abce31e..7d63ae1c4 100644 --- a/.drone.yml +++ b/.drone.yml @@ -96,7 +96,7 @@ steps: - ls -laS ${DRONE_TAG} - name: "Upload default to updates srv" - image: appleboy/drone-scp + image: appleboy/drone-scp:linux-amd64 settings: host: from_secret: dep_host @@ -117,7 +117,7 @@ steps: - ${DRONE_TAG}/*.bin - name: "Upload no-anims to updates srv" - image: appleboy/drone-scp + image: appleboy/drone-scp:linux-amd64 settings: host: from_secret: dep_host @@ -132,7 +132,7 @@ steps: source: flipper-z-f7-update-${DRONE_TAG}n.tgz - name: "Upload extra apps version to updates srv" - image: appleboy/drone-scp + image: appleboy/drone-scp:linux-amd64 settings: host: from_secret: dep_host @@ -327,7 +327,7 @@ steps: - cd web/unleashedflip.com/public_html/fw/dev && rm -f ./* - name: "Upload default to updates srv" - image: appleboy/drone-scp + image: appleboy/drone-scp:linux-amd64 settings: host: from_secret: dep_host @@ -348,7 +348,7 @@ steps: - dev/*.bin - name: "Upload extra apps version to updates srv" - image: appleboy/drone-scp + image: appleboy/drone-scp:linux-amd64 settings: host: from_secret: dep_host From df88a805a0270afa8aab1be193a49db3d7636ef8 Mon Sep 17 00:00:00 2001 From: Dimitry Date: Mon, 2 Jan 2023 23:54:04 +0200 Subject: [PATCH 028/506] Removing `AM*` preset if launching regular read mode --- .../main/subghz/scenes/subghz_scene_start.c | 21 +++++++++++++++++++ applications/main/subghz/subghz.c | 6 ------ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/applications/main/subghz/scenes/subghz_scene_start.c b/applications/main/subghz/scenes/subghz_scene_start.c index 03e2f9b06..c9a62c2fc 100644 --- a/applications/main/subghz/scenes/subghz_scene_start.c +++ b/applications/main/subghz/scenes/subghz_scene_start.c @@ -12,6 +12,25 @@ enum SubmenuIndex { SubmenuIndexReadRAW, }; +void subghz_scene_start_remove_advanced_preset(SubGhz* subghz) { + // delete operation is harmless + subghz_setting_delete_custom_preset(subghz->setting, ADVANCED_AM_PRESET_NAME); +} + +void subghz_scene_start_load_advanced_preset(SubGhz* subghz) { + for(uint8_t i = 0; i < subghz_setting_get_preset_count(subghz->setting); i++) { + if(!strcmp(subghz_setting_get_preset_name(subghz->setting, i), ADVANCED_AM_PRESET_NAME)) { + return; // already exists + } + } + + // Load custom advanced AM preset with configurable CFGMDM settings + FlipperFormat* advanced_am_preset = subghz_preset_custom_advanced_am_preset_alloc(); + subghz_setting_load_custom_preset( + subghz->setting, ADVANCED_AM_PRESET_NAME, advanced_am_preset); + flipper_format_free(advanced_am_preset); +} + void subghz_scene_start_submenu_callback(void* context, uint32_t index) { SubGhz* subghz = context; view_dispatcher_send_custom_event(subghz->view_dispatcher, index); @@ -73,12 +92,14 @@ bool subghz_scene_start_on_event(void* context, SceneManagerEvent event) { return true; } else if(event.type == SceneManagerEventTypeCustom) { if(event.event == SubmenuIndexReadRAW) { + subghz_scene_start_load_advanced_preset(subghz); scene_manager_set_scene_state( subghz->scene_manager, SubGhzSceneStart, SubmenuIndexReadRAW); subghz->txrx->rx_key_state = SubGhzRxKeyStateIDLE; scene_manager_next_scene(subghz->scene_manager, SubGhzSceneReadRAW); return true; } else if(event.event == SubmenuIndexRead) { + subghz_scene_start_remove_advanced_preset(subghz); scene_manager_set_scene_state( subghz->scene_manager, SubGhzSceneStart, SubmenuIndexRead); scene_manager_next_scene(subghz->scene_manager, SubGhzSceneReceiver); diff --git a/applications/main/subghz/subghz.c b/applications/main/subghz/subghz.c index e6378e30f..c39c35679 100644 --- a/applications/main/subghz/subghz.c +++ b/applications/main/subghz/subghz.c @@ -185,12 +185,6 @@ SubGhz* subghz_alloc(bool alloc_for_tx_only) { subghz_setting_load(subghz->setting, EXT_PATH("subghz/assets/setting_user")); - // Load custom advanced AM preset with configurable CFGMDM settings - FlipperFormat* advanced_am_preset = subghz_preset_custom_advanced_am_preset_alloc(); - subghz_setting_load_custom_preset( - subghz->setting, ADVANCED_AM_PRESET_NAME, advanced_am_preset); - flipper_format_free(advanced_am_preset); - // Custom Presets load without using config file FlipperFormat* temp_fm_preset = flipper_format_string_alloc(); From 82f8ad45403f29d132034bf368742023c1071f52 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Tue, 3 Jan 2023 18:40:03 +0300 Subject: [PATCH 029/506] Add 350Mhz to default range Actually this frequency is used by some part of home devices like ceiling fans --- .../subghz/views/subghz_frequency_analyzer.c | 8 ++-- documentation/DangerousSettings.md | 2 +- documentation/SubGHzSettings.md | 38 ++++++++++++++++++- .../targets/f7/furi_hal/furi_hal_subghz.c | 2 +- lib/subghz/subghz_setting.c | 1 + 5 files changed, 43 insertions(+), 8 deletions(-) diff --git a/applications/main/subghz/views/subghz_frequency_analyzer.c b/applications/main/subghz/views/subghz_frequency_analyzer.c index ff971fd3b..4ca2afed2 100644 --- a/applications/main/subghz/views/subghz_frequency_analyzer.c +++ b/applications/main/subghz/views/subghz_frequency_analyzer.c @@ -23,10 +23,10 @@ static const uint32_t subghz_frequency_list[] = { 300000000, 302757000, 303875000, 304250000, 307000000, 307500000, 307800000, 309000000, 310000000, 312000000, 312100000, 313000000, 313850000, 314000000, 314350000, 314980000, - 315000000, 318000000, 330000000, 345000000, 348000000, 387000000, 390000000, 418000000, - 433075000, 433220000, 433420000, 433657070, 433889000, 433920000, 434075000, 434176948, - 434390000, 434420000, 434775000, 438900000, 440175000, 464000000, 779000000, 868350000, - 868400000, 868800000, 868950000, 906400000, 915000000, 925000000, 928000000}; + 315000000, 318000000, 330000000, 345000000, 348000000, 350000000, 387000000, 390000000, + 418000000, 433075000, 433220000, 433420000, 433657070, 433889000, 433920000, 434075000, + 434176948, 434390000, 434420000, 434775000, 438900000, 440175000, 464000000, 779000000, + 868350000, 868400000, 868800000, 868950000, 906400000, 915000000, 925000000, 928000000}; typedef enum { SubGhzFrequencyAnalyzerStatusIDLE, diff --git a/documentation/DangerousSettings.md b/documentation/DangerousSettings.md index 780724644..1da2fc4ab 100644 --- a/documentation/DangerousSettings.md +++ b/documentation/DangerousSettings.md @@ -1,6 +1,6 @@ ## How to extend SubGHz supported frequency range -#### CC1101 Frequency range specs: 300-348 MHz, 386-464 MHz, and 778-928 MHz +#### CC1101 Frequency range specs: 300-348 MHz, 386-464 MHz, and 778-928 MHz (+ 350MHz was added to default range) #### This setting will extend to: 281-361 MHz, 378-481 MHz, and 749-962 MHz 1. Please do not do that unless you know what exactly you are doing diff --git a/documentation/SubGHzSettings.md b/documentation/SubGHzSettings.md index 2ab508ee1..906da27f2 100644 --- a/documentation/SubGHzSettings.md +++ b/documentation/SubGHzSettings.md @@ -1,6 +1,6 @@ ## How to add new SubGHz frequencies -#### CC1101 Frequency range specs: 300-348 MHz, 386-464 MHz, and 778-928 MHz +#### CC1101 Frequency range specs: 300-348 MHz, 386-464 MHz, and 778-928 MHz (+ 350MHz was added to default range) Edit user settings file located on your microSD card - `subghz/assets/setting_user` @@ -11,26 +11,60 @@ if you need your custom one, make sure it doesn't listed here ``` /* 300 - 348 */ 300000000, + 302757000, 303875000, 304250000, + 307000000, + 307500000, + 307800000, + 309000000, 310000000, + 312000000, + 312100000, + 312200000, + 313000000, + 313850000, + 314000000, + 314350000, + 314980000, 315000000, 318000000, + 330000000, + 345000000, + 348000000, + 350000000, /* 387 - 464 */ + 387000000, 390000000, 418000000, 433075000, /* LPD433 first */ + 433220000, 433420000, - 433920000 /* LPD433 mid */ + 433657070, + 433889000, + 433920000 | FREQUENCY_FLAG_DEFAULT, /* LPD433 mid */ + 434075000, + 434176948, + 434190000, + 434390000, 434420000, + 434620000, 434775000, /* LPD433 last channels */ 438900000, + 440175000, + 464000000, /* 779 - 928 */ + 779000000, 868350000, + 868400000, + 868800000, + 868950000, + 906400000, 915000000, 925000000, + 928000000, ``` ### User frequencies added AFTER that default list! You need to continue until you reach the end of that list diff --git a/firmware/targets/f7/furi_hal/furi_hal_subghz.c b/firmware/targets/f7/furi_hal/furi_hal_subghz.c index b32f171f1..4ea6f3524 100644 --- a/firmware/targets/f7/furi_hal/furi_hal_subghz.c +++ b/firmware/targets/f7/furi_hal/furi_hal_subghz.c @@ -338,7 +338,7 @@ bool furi_hal_subghz_is_tx_allowed(uint32_t value) { flipper_format_free(fff_data_file); furi_record_close(RECORD_STORAGE); - if(!(value >= 299999755 && value <= 348000335) && + if(!(value >= 299999755 && value <= 350000335) && !(value >= 386999938 && value <= 464000000) && !(value >= 778999847 && value <= 928000000) && !(is_extended)) { FURI_LOG_I(TAG, "Frequency blocked - outside default range"); diff --git a/lib/subghz/subghz_setting.c b/lib/subghz/subghz_setting.c index 733fc35b5..4261a5d39 100644 --- a/lib/subghz/subghz_setting.c +++ b/lib/subghz/subghz_setting.c @@ -39,6 +39,7 @@ static const uint32_t subghz_frequency_list[] = { 330000000, 345000000, 348000000, + 350000000, /* 387 - 464 */ 387000000, From 28345b2fbdb96c03c3f6d844b542da9c131b3276 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Tue, 3 Jan 2023 18:41:22 +0300 Subject: [PATCH 030/506] Update TOTP https://github.com/akopachov/flipper-zero_authenticator --- applications/plugins/totp/types/token_info.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/plugins/totp/types/token_info.c b/applications/plugins/totp/types/token_info.c index b9d22808d..b43293788 100644 --- a/applications/plugins/totp/types/token_info.c +++ b/applications/plugins/totp/types/token_info.c @@ -34,7 +34,7 @@ bool token_info_set_secret( int plain_secret_length = base32_decode((const uint8_t*)base32_token_secret, plain_secret, token_secret_length); bool result; - if(plain_secret_length >= 0) { + if(plain_secret_length > 0) { token_info->token = totp_crypto_encrypt(plain_secret, plain_secret_length, iv, &token_info->token_length); result = true; From f7dfe77aaf6fae5e385f1640c884973dff1eebcd Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Tue, 3 Jan 2023 19:07:58 +0300 Subject: [PATCH 031/506] Apply source code formatting ./fbt format --- applications/plugins/solitaire/solitaire.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/applications/plugins/solitaire/solitaire.c b/applications/plugins/solitaire/solitaire.c index 1b56e2150..56d60d629 100644 --- a/applications/plugins/solitaire/solitaire.c +++ b/applications/plugins/solitaire/solitaire.c @@ -256,8 +256,7 @@ bool place_on_top(Card* where, Card what) { if(a_letter == 12) a_letter = -1; if(b_letter == 12) b_letter = -1; - if(where->disabled && b_letter != -1) - return false; + if(where->disabled && b_letter != -1) return false; if((a_letter + 1) == b_letter) { where->disabled = what.disabled; From 9248de50d1b4f97abbb8aa2c28d25bee6007e327 Mon Sep 17 00:00:00 2001 From: amec0e <88857687+amec0e@users.noreply.github.com> Date: Thu, 5 Jan 2023 21:34:55 +0000 Subject: [PATCH 032/506] Updated tv.ir --- assets/resources/infrared/assets/tv.ir | 201 +++++++++++++------------ 1 file changed, 108 insertions(+), 93 deletions(-) diff --git a/assets/resources/infrared/assets/tv.ir b/assets/resources/infrared/assets/tv.ir index 8c27461fe..ff465dbc9 100755 --- a/assets/resources/infrared/assets/tv.ir +++ b/assets/resources/infrared/assets/tv.ir @@ -1,15 +1,115 @@ Filetype: IR library file Version: 1 -# Last Updated 28th Dec, 2022 -# Last Checked 28th Dec, 2022 -# -# Sony KDL40RD453 +# Last Updated 5th Jan, 2023 +# Last Checked 5th Jan, 2023 # name: POWER -type: raw -frequency: 38000 -duty_cycle: 0.33 -data: 2445 582 1221 603 548 602 1191 609 572 602 1191 609 542 607 544 631 1172 603 568 606 545 605 566 608 543 26263 2414 611 1192 607 544 606 1197 602 569 606 1197 602 539 611 540 635 1168 606 565 610 541 608 563 587 564 +type: parsed +protocol: SIRC +address: 01 00 00 00 +command: 15 00 00 00 +# +name: VOL+ +type: parsed +protocol: SIRC +address: 01 00 00 00 +command: 12 00 00 00 +# +name: VOL- +type: parsed +protocol: SIRC +address: 01 00 00 00 +command: 13 00 00 00 +# +name: CH+ +type: parsed +protocol: SIRC +address: 01 00 00 00 +command: 10 00 00 00 +# +name: CH- +type: parsed +protocol: SIRC +address: 01 00 00 00 +command: 11 00 00 00 +# +name: MUTE +type: parsed +protocol: SIRC +address: 01 00 00 00 +command: 14 00 00 00 +# +name: POWER +type: parsed +protocol: NEC +address: 40 00 00 00 +command: 0B 00 00 00 +# +name: CH+ +type: parsed +protocol: NEC +address: 40 00 00 00 +command: 11 00 00 00 +# +name: CH- +type: parsed +protocol: NEC +address: 40 00 00 00 +command: 10 00 00 00 +# +name: VOL+ +type: parsed +protocol: NEC +address: 40 00 00 00 +command: 13 00 00 00 +# +name: VOL- +type: parsed +protocol: NEC +address: 40 00 00 00 +command: 12 00 00 00 +# +name: MUTE +type: parsed +protocol: NEC +address: 40 00 00 00 +command: 14 00 00 00 +# +name: POWER +type: parsed +protocol: Kaseikyo +address: 80 02 20 00 +command: D0 03 00 00 +# +name: VOL+ +type: parsed +protocol: Kaseikyo +address: 80 02 20 00 +command: 00 02 00 00 +# +name: VOL- +type: parsed +protocol: Kaseikyo +address: 80 02 20 00 +command: 10 02 00 00 +# +name: MUTE +type: parsed +protocol: Kaseikyo +address: 80 02 20 00 +command: 20 03 00 00 +# +name: CH+ +type: parsed +protocol: Kaseikyo +address: 80 02 20 00 +command: 40 03 00 00 +# +name: CH- +type: parsed +protocol: Kaseikyo +address: 80 02 20 00 +command: 50 03 00 00 # name: POWER type: parsed @@ -59,42 +159,6 @@ protocol: NECext address: 00 7F 00 00 command: 18 E7 00 00 # -name: POWER -type: parsed -protocol: Kaseikyo -address: 80 02 20 00 -command: D0 03 00 00 -# -name: MUTE -type: parsed -protocol: Kaseikyo -address: 80 02 20 00 -command: 20 03 00 00 -# -name: VOL+ -type: parsed -protocol: Kaseikyo -address: 80 02 20 00 -command: 00 02 00 00 -# -name: VOL- -type: parsed -protocol: Kaseikyo -address: 80 02 20 00 -command: 10 02 00 00 -# -name: CH+ -type: parsed -protocol: Kaseikyo -address: 80 02 20 00 -command: 40 03 00 00 -# -name: CH- -type: parsed -protocol: Kaseikyo -address: 80 02 20 00 -command: 50 03 00 00 -# name: MUTE type: parsed protocol: NECext @@ -291,12 +355,6 @@ command: E9 16 00 00 name: POWER type: parsed protocol: SIRC -address: 01 00 00 00 -command: 15 00 00 00 -# -name: POWER -type: parsed -protocol: SIRC address: 10 00 00 00 command: 15 00 00 00 # @@ -428,12 +486,6 @@ command: 17 00 00 00 # name: POWER type: parsed -protocol: NEC -address: 40 00 00 00 -command: 12 00 00 00 -# -name: POWER -type: parsed protocol: NECext address: 31 49 00 00 command: 63 00 00 00 @@ -1116,36 +1168,6 @@ protocol: Samsung32 address: 07 00 00 00 command: 98 00 00 00 # -name: VOL+ -type: parsed -protocol: SIRC -address: 01 00 00 00 -command: 12 00 00 00 -# -name: VOL- -type: parsed -protocol: SIRC -address: 01 00 00 00 -command: 13 00 00 00 -# -name: CH+ -type: parsed -protocol: SIRC -address: 01 00 00 00 -command: 10 00 00 00 -# -name: CH- -type: parsed -protocol: SIRC -address: 01 00 00 00 -command: 11 00 00 00 -# -name: MUTE -type: parsed -protocol: SIRC -address: 01 00 00 00 -command: 14 00 00 00 -# name: POWER type: parsed protocol: SIRC @@ -1200,12 +1222,6 @@ protocol: NEC address: 40 00 00 00 command: 1E 00 00 00 # -name: MUTE -type: parsed -protocol: NEC -address: 40 00 00 00 -command: 10 00 00 00 -# name: CH+ type: parsed protocol: NEC @@ -1781,4 +1797,3 @@ type: parsed protocol: NEC address: 00 00 00 00 command: 33 00 00 00 -# From 23155f9891e3e29ac3723efec26ddbf19e7b911f Mon Sep 17 00:00:00 2001 From: amec0e <88857687+amec0e@users.noreply.github.com> Date: Thu, 5 Jan 2023 21:36:40 +0000 Subject: [PATCH 033/506] Updated ac.ir --- assets/resources/infrared/assets/ac.ir | 53 ++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 3 deletions(-) diff --git a/assets/resources/infrared/assets/ac.ir b/assets/resources/infrared/assets/ac.ir index 8cbba0b63..9d1ef95b4 100644 --- a/assets/resources/infrared/assets/ac.ir +++ b/assets/resources/infrared/assets/ac.ir @@ -1,7 +1,7 @@ Filetype: IR library file Version: 1 -# Last Updated 20th Dec, 2022 -# Last Checked 26th Dec, 2022 +# Last Updated 5th Jan, 2023 +# Last Checked 5th Jan, 2023 # # POWER_ON name: POWER @@ -112,7 +112,7 @@ type: raw frequency: 38000 duty_cycle: 0.330000 data: 473 397 473 397 473 397 472 371 472 397 473 25350 3523 1697 449 1292 449 422 474 397 473 397 473 1267 473 372 470 401 468 402 468 402 441 1300 441 402 468 1272 469 1272 469 402 468 1273 468 1273 468 1272 469 1273 468 1273 468 403 440 402 468 1273 468 402 468 402 468 375 468 402 468 402 468 402 441 402 468 402 468 402 468 376 467 1273 468 402 468 1273 468 402 468 402 441 402 468 1273 468 1273 468 402 468 403 467 376 467 403 467 403 467 376 467 403 467 403 467 403 440 403 467 403 467 403 467 376 467 403 467 403 467 403 440 1302 439 1302 439 1302 439 404 466 1274 467 403 467 1274 467 1275 466 34905 3520 1705 469 1273 468 402 441 402 468 402 468 1273 468 402 468 376 467 402 468 402 468 1273 468 402 441 1300 441 1300 441 403 467 1273 468 1273 468 1273 468 1273 468 1273 468 403 467 402 468 1273 468 376 467 402 468 402 468 402 441 403 467 403 468 402 441 403 467 403 467 403 467 376 467 1274 467 403 467 403 467 403 440 403 467 1274 467 403 467 403 467 376 467 1274 467 1274 467 1274 467 1274 467 403 467 404 466 1274 467 1274 467 404 439 1302 439 1302 439 404 466 404 466 404 439 1302 439 1302 439 404 466 1275 466 404 466 1275 466 404 466 1275 466 34906 3519 1705 468 1273 468 376 467 402 468 402 468 1273 468 402 441 402 468 402 468 402 468 1273 468 376 467 1273 468 1273 468 402 468 1273 468 1273 468 1273 468 1273 468 1273 468 402 468 376 467 1273 468 402 468 402 468 403 440 403 467 403 467 403 467 376 467 403 467 403 467 403 440 403 467 403 468 402 468 376 467 403 467 403 467 403 440 403 467 403 467 403 440 403 467 1274 467 1274 467 1274 467 403 467 404 466 376 467 1274 467 1275 466 404 466 1275 466 1275 466 404 466 404 439 404 466 404 467 404 466 377 466 404 466 404 466 404 439 404 466 404 466 405 438 405 465 404 466 405 465 1276 465 1299 442 378 465 406 464 405 465 406 437 405 465 428 442 428 442 401 442 428 442 428 442 428 415 429 441 428 442 429 414 429 441 429 441 428 442 401 442 1300 441 1299 442 429 441 429 441 429 414 429 441 429 441 429 441 402 441 429 441 429 441 429 414 1327 414 1327 414 429 441 429 441 429 441 402 441 429 441 429 441 402 441 429 441 429 441 429 414 429 441 429 441 429 441 402 441 429 441 429 441 429 414 1328 413 430 441 429 441 429 441 402 441 429 441 1300 441 1301 440 429 441 402 441 430 440 430 440 430 413 430 441 429 441 1301 440 430 440 403 440 430 440 430 440 430 413 430 440 430 440 430 440 1301 440 1301 440 1301 440 403 440 430 440 430 440 403 440 1301 440 -# +# name: TEMP- type: raw frequency: 38000 @@ -1441,3 +1441,50 @@ frequency: 38000 duty_cycle: 0.330000 data: 3821 1901 456 507 456 1424 430 490 484 1425 429 475 488 1420 434 471 482 1427 437 467 486 1420 434 486 457 1416 459 1432 432 487 456 1436 439 480 483 1425 439 1425 460 1420 455 1419 435 485 457 472 491 1417 458 1407 437 483 459 487 456 474 458 487 466 1432 432 471 461 485 457 472 491 1415 460 1378 466 480 483 1424 430 474 458 487 466 1424 461 1419 456 1426 438 465 457 489 464 466 456 489 464 1426 438 481 461 484 437 493 460 1429 435 482 460 485 458 1440 435 484 458 1438 437 467 465 480 462 467 465 481 461 468 464 481 461 469 463 481 461 468 485 1424 430 1434 462 1418 457 1425 439 465 457 489 464 465 457 489 464 466 456 490 463 467 465 480 463 467 465 480 463 467 486 1422 432 471 461 485 457 472 460 485 457 472 460 485 457 472 460 486 456 488 434 497 456 473 459 486 456 488 465 1414 461 1393 482 1423 462 1419 435 469 463 482 460 469 463 482 460 1436 439 1425 439 480 483 # +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 6149 7347 601 535 573 560 602 505 602 480 597 509 600 534 599 487 593 541 591 568 569 539 568 490 594 539 570 513 568 540 570 566 570 540 568 543 594 540 569 566 543 515 594 540 569 514 567 542 570 514 568 543 594 540 569 490 592 542 570 514 568 541 570 541 542 541 569 567 570 515 567 542 570 515 567 542 570 568 568 516 570 568 570 542 568 542 570 515 569 542 570 568 568 517 569 541 569 517 569 568 570 515 568 570 569 569 543 542 569 569 569 516 569 542 570 543 568 1640 570 516 568 543 570 569 543 1613 569 516 568 1613 570 569 543 570 569 542 543 543 569 543 542 544 569 516 569 544 570 543 570 570 570 543 543 544 569 1615 569 571 569 570 568 519 569 1615 569 544 569 1615 568 572 569 571 542 1642 569 571 568 1617 569 1642 542 1642 569 1589 568 545 569 1590 569 518 568 1617 569 545 568 7372 568 +# +name: MODE +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 6145 7375 572 534 598 535 574 532 576 507 598 507 601 508 599 484 595 565 569 567 568 541 566 541 567 543 567 513 569 540 569 568 568 513 569 567 569 541 568 513 568 568 569 542 568 540 568 543 568 569 567 541 568 543 568 542 541 541 569 542 567 515 569 542 568 514 568 572 567 570 567 515 569 571 567 514 569 544 567 569 568 542 568 1641 566 543 541 595 568 546 567 515 568 573 566 571 566 517 568 572 567 515 568 571 542 543 568 571 567 569 541 519 568 569 516 570 569 1639 541 518 568 570 515 544 568 1666 542 518 568 1666 542 543 568 571 542 516 568 571 542 517 567 598 542 517 568 572 542 544 567 572 542 517 569 571 542 1615 568 1669 542 544 568 572 542 1615 568 599 542 1615 567 572 542 518 569 1642 515 571 542 1615 569 598 542 518 569 598 543 1670 514 1644 542 1616 567 1670 542 545 568 7374 567 +# High +name: TEMP+ +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 6143 7350 600 533 572 507 573 532 575 508 597 507 600 535 572 510 569 539 569 593 542 541 566 540 568 569 541 513 569 540 568 542 567 513 568 570 567 594 542 569 540 541 568 567 542 513 568 571 567 544 564 542 567 569 542 514 569 568 568 568 542 514 567 570 542 514 568 569 569 568 542 514 570 568 542 514 568 570 542 595 515 542 568 1664 542 514 568 1639 542 595 515 569 542 595 543 542 568 597 542 596 542 542 568 597 543 596 540 518 569 596 542 542 568 571 542 1612 568 1640 541 516 568 571 542 596 515 1640 542 516 568 1641 542 596 516 570 542 516 569 571 542 517 568 571 542 516 569 598 543 597 515 571 542 517 568 571 543 1614 568 1642 542 517 569 571 542 1615 569 598 542 1615 568 571 542 544 569 1669 542 518 568 1668 542 1619 565 571 540 1643 543 1668 516 1643 541 1616 567 1670 542 545 568 7371 568 +# Low +name: TEMP- +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 6144 7375 572 534 572 533 574 559 575 507 598 507 600 508 598 484 595 539 568 567 568 513 568 540 568 541 567 513 567 542 568 541 541 540 568 568 568 514 593 515 569 541 568 540 568 543 567 542 567 515 568 569 567 514 569 567 569 542 568 514 568 569 569 542 567 515 569 569 568 515 567 543 567 542 567 516 569 543 567 515 568 543 568 1610 568 569 542 1612 540 542 568 544 566 516 568 596 542 516 567 572 567 596 541 517 568 569 542 543 567 597 542 597 540 518 568 1667 541 1587 567 570 541 544 567 598 541 1587 567 1641 540 1614 567 598 540 598 541 519 566 571 541 519 567 598 541 518 567 572 541 545 566 573 541 519 566 573 541 1617 565 1670 541 545 541 572 541 1642 541 599 541 1642 540 600 541 571 542 1671 539 545 541 1671 540 1617 566 600 540 1642 541 1643 541 1642 540 1644 540 545 541 1643 514 7370 566 +# +name: TIMER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 6199 7295 628 530 604 504 601 480 573 534 600 482 596 537 570 538 595 541 593 540 568 541 569 567 568 566 568 518 590 1636 569 540 568 1582 566 569 569 540 568 514 569 541 569 567 542 541 569 567 570 514 567 569 568 541 568 515 568 541 569 1610 568 541 569 541 568 516 568 1636 569 515 567 542 569 515 568 542 569 541 568 516 569 541 570 1611 567 543 569 568 568 517 569 1637 569 516 568 542 569 542 568 569 570 569 569 542 568 543 570 516 567 544 569 543 568 543 570 1639 542 1639 568 542 568 518 568 542 569 1588 569 1639 543 1613 569 570 568 517 569 543 543 543 569 570 569 544 569 543 570 517 569 570 569 517 568 572 569 544 568 1642 569 1615 567 571 569 517 569 1642 569 518 567 1616 569 517 569 544 569 1616 568 571 569 1616 568 571 569 1616 568 571 569 1616 568 1642 569 1616 568 1642 568 545 569 7371 568 +# +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 1299 412 1270 412 426 1225 1299 412 1244 438 399 1279 400 1254 451 1253 426 1253 426 1253 426 1254 1268 7130 1266 416 1266 416 421 1258 1267 416 1267 416 422 1258 421 1258 422 1258 421 1259 421 1258 422 1258 1266 7132 1266 417 1266 417 421 1259 1266 417 1266 417 421 1259 421 1259 421 1259 421 1259 421 1259 421 1259 1266 7133 1265 417 1266 417 421 1259 1266 418 1266 417 422 1259 421 1260 420 1259 421 1259 421 1259 420 1259 1266 7133 1265 418 1266 418 421 1260 1265 418 1266 418 421 1260 420 1260 420 1260 420 1260 420 1260 420 1260 1266 7135 1265 418 1266 419 420 1260 1266 419 1266 419 420 1261 420 1261 420 1261 420 1261 420 1261 420 1261 1265 7137 1264 420 1265 420 419 1262 1266 420 1265 420 420 1262 420 1262 419 1262 420 1262 419 1262 419 1262 1265 7139 1264 421 1265 421 419 1263 1265 421 1265 421 418 1264 418 1264 418 1263 419 1264 417 1264 418 1264 1264 7142 1263 423 1263 422 418 1288 1241 446 1240 446 394 1288 394 1289 393 1288 394 1288 394 1288 394 1288 1241 7168 1240 446 1241 446 394 1289 1241 447 1241 447 394 1289 394 1289 394 1289 394 1289 394 1289 394 1289 1241 7171 1239 447 1240 447 393 1290 1240 447 1241 447 393 1290 393 1290 393 1290 393 1290 393 1290 393 1290 1241 7174 1239 447 1241 448 392 1291 1240 448 1241 448 393 1291 393 1292 392 1292 392 1291 393 1292 392 1291 1240 7177 1239 449 1240 449 392 1292 1240 449 1240 449 392 1293 392 1293 392 1292 392 1293 391 1293 392 1293 1239 7179 1239 450 1239 450 391 1294 1239 450 1240 451 391 1294 391 1294 391 1295 390 1294 391 1295 390 1294 1239 7184 1237 452 1238 475 367 1319 1215 476 1215 476 366 1320 366 1320 366 1320 365 1320 365 1320 366 1320 1215 7211 1213 476 1190 501 366 1321 1215 477 1214 477 365 1322 364 1321 365 1322 364 1321 365 1321 365 1322 1213 7214 1213 478 1213 478 364 1322 1189 503 1189 503 364 1323 339 1348 338 1348 364 1323 363 1324 362 1323 1213 7218 1187 528 1164 529 313 1374 1163 529 1164 529 313 1375 313 1375 312 1375 312 1374 313 1374 313 1375 1163 7271 1162 530 1163 530 312 1376 1163 531 1162 530 312 1377 311 1378 310 1402 285 1378 310 1402 285 1403 1136 7300 1136 557 1136 557 285 1404 1136 558 1136 559 283 1404 285 1431 257 1405 284 1431 257 1431 257 1431 1109 7330 1108 585 1109 586 256 1432 1109 586 1109 638 177 1486 222 1468 221 1468 221 1468 221 1467 221 1495 1055 7413 1028 666 1029 2500 885 +# +name: SWING +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 1333 359 1331 358 482 1200 1279 411 1279 411 430 1255 430 1256 1279 411 430 1257 428 1257 428 1258 452 7993 1276 390 1300 415 402 1285 1276 415 1276 416 425 1262 425 1262 1275 417 425 1262 425 1262 425 1262 424 8000 1274 417 1275 417 425 1262 1276 417 1276 417 425 1263 424 1263 1275 417 425 1263 424 1263 425 1263 424 8003 1274 417 1276 417 425 1263 1275 418 1276 417 425 1263 425 1263 1276 417 425 1263 425 1263 425 1263 425 8006 1275 418 1276 418 425 1264 1276 418 1276 418 425 1264 425 1264 1276 418 425 1264 425 1264 425 1264 424 8009 1276 418 1276 418 425 1265 1276 418 1277 419 424 1265 425 1265 1276 419 424 1265 424 1265 425 1265 424 8013 1275 419 1277 419 424 1266 1276 419 1277 419 425 1266 424 1266 1276 419 424 1266 424 1266 424 1266 424 8016 1276 419 1277 420 424 1267 1276 420 1277 420 424 1267 424 1267 1276 420 424 1267 424 1267 424 1267 424 8019 1276 420 1277 420 424 1267 1277 420 1277 421 423 1268 423 1268 1277 421 423 1268 424 1268 423 1268 423 8023 1275 421 1276 421 423 1268 1277 421 1277 421 424 1269 423 1269 1277 422 423 1269 423 1269 423 1269 423 8025 1276 422 1276 422 423 1270 1276 422 1277 422 423 1270 422 1270 1277 422 423 1271 422 1271 421 1271 422 8029 1275 423 1276 423 422 1271 1276 423 1276 447 398 1273 421 1273 1275 424 421 1296 397 1296 397 1296 397 8056 1252 447 1253 447 398 1296 1252 448 1253 448 398 1296 398 1296 1252 448 398 1297 397 1296 398 1296 398 8059 1252 448 1253 448 398 1297 1252 448 1253 448 398 1297 397 1297 1252 449 397 1298 397 1297 397 1297 397 8062 1252 449 1253 449 397 1298 1252 449 1253 449 397 1298 397 1298 1253 450 396 1298 397 1298 397 1298 397 8065 1252 449 1252 450 397 1299 1252 450 1253 450 396 1299 397 1299 1253 450 396 1299 397 1299 396 1299 396 8069 1251 450 1253 450 396 1300 1252 450 1253 451 396 1300 396 1300 1253 451 396 1301 396 1300 396 1301 395 8072 1251 451 1253 451 396 1301 1252 452 1252 452 395 1302 395 1302 1227 477 395 1302 395 1302 394 1302 395 8076 1251 452 1227 478 394 1302 1252 453 1227 478 370 1328 369 1328 1251 454 394 1304 369 1329 369 1329 369 8129 1201 503 1202 503 344 1353 1202 503 1203 503 345 1354 344 1354 1202 504 344 1354 345 1354 344 1354 344 8132 1201 503 1202 504 344 1354 1202 504 1202 504 344 1355 344 1355 1202 504 344 1355 344 1355 344 1355 344 8135 1201 504 1202 505 343 1355 1202 505 1202 505 343 1357 343 1357 1201 506 343 1358 342 1383 316 1383 316 8166 1173 533 1174 559 288 1412 1147 560 1148 561 287 1439 261 1440 1120 588 260 1441 259 1467 227 1474 225 +# +name: TIMER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 1275 413 1305 384 457 1226 1308 385 1329 385 430 1228 457 1228 457 1229 1304 411 429 1257 428 1258 427 7993 1275 416 1275 416 425 1262 1274 416 1275 417 425 1262 425 1262 425 1261 1276 416 426 1262 424 1262 425 7999 1274 417 1275 417 425 1262 1276 417 1276 417 425 1263 424 1262 425 1262 1276 417 425 1263 425 1263 424 8003 1274 417 1276 417 425 1263 1275 417 1277 417 425 1263 425 1263 425 1263 1276 418 425 1264 424 1263 425 8006 1276 418 1276 418 425 1263 1277 418 1277 418 425 1264 425 1264 425 1264 1276 418 425 1264 425 1264 425 8010 1276 418 1276 418 425 1264 1277 418 1277 418 425 1265 425 1265 424 1265 1276 418 425 1265 425 1265 425 8012 1276 418 1277 418 425 1265 1277 419 1277 419 425 1266 424 1266 424 1266 1277 419 425 1266 424 1266 424 8016 1276 419 1277 419 425 1266 1277 419 1278 419 425 1267 424 1266 425 1267 1277 420 424 1267 424 1267 424 8020 1275 420 1277 420 424 1267 1277 420 1277 420 424 1268 424 1268 423 1267 1277 420 424 1268 424 1268 424 8023 1276 420 1277 421 424 1268 1277 421 1277 421 424 1269 423 1269 423 1268 1278 421 423 1269 424 1269 423 8026 1276 421 1277 422 423 1269 1277 422 1277 422 423 1270 423 1270 423 1270 1276 422 423 1270 423 1271 422 8029 1276 423 1276 447 398 1272 1276 446 1254 447 399 1295 398 1272 422 1295 1252 447 398 1295 398 1295 398 8056 1252 447 1252 447 398 1296 1252 447 1253 447 399 1296 398 1296 398 1296 1253 448 398 1296 398 1296 398 8059 1252 447 1253 447 399 1296 1253 448 1253 448 398 1297 397 1297 398 1297 1253 448 398 1297 398 1297 397 8062 1252 448 1253 448 398 1297 1253 448 1254 448 398 1298 397 1298 397 1298 1253 449 397 1298 397 1298 397 8065 1252 449 1253 449 397 1298 1253 449 1254 449 398 1299 397 1299 397 1299 1253 449 398 1299 397 1299 397 8069 1252 450 1252 450 397 1299 1253 450 1254 450 397 1300 396 1300 396 1300 1252 450 397 1300 397 1300 396 8072 1252 450 1253 451 396 1300 1253 451 1253 451 396 1301 396 1301 396 1301 1253 451 396 1301 396 1301 396 8075 1251 452 1252 452 396 1301 1253 452 1253 452 395 1303 395 1303 394 1302 1254 453 395 1303 395 1303 395 8081 1250 477 1228 455 393 1304 1252 478 1227 478 370 1329 369 1329 369 1328 1228 478 370 1329 369 1329 369 8107 1227 478 1227 478 370 1329 1227 479 1227 479 369 1329 370 1329 370 1329 1227 479 369 1330 369 1330 369 8111 1225 479 1227 479 369 1330 1227 479 1228 480 368 1331 368 1331 368 1331 1227 480 368 1332 367 1332 367 8114 1225 480 1227 481 367 1332 1226 506 1201 507 342 1358 317 1383 342 1358 1200 507 317 1384 316 1384 316 8168 1174 532 1175 532 316 1384 1175 533 1175 533 315 1385 315 1385 315 1384 1175 533 315 1386 315 1385 315 8171 1174 534 1174 559 289 1387 1174 559 1149 560 289 1413 288 1412 289 1413 1148 560 289 1413 288 1413 288 8203 1147 561 1148 562 287 1414 1148 562 1147 588 260 1416 286 1441 260 1440 1122 588 260 1442 260 1442 260 8232 1120 589 1120 615 228 1474 1095 616 1094 642 182 1494 226 1476 226 1503 1067 643 181 3224 182 8314 1066 671 1039 2427 986 From 11c6d2d0be471613f2ab9b9c305a65284df1e0b1 Mon Sep 17 00:00:00 2001 From: amec0e <88857687+amec0e@users.noreply.github.com> Date: Thu, 5 Jan 2023 21:37:26 +0000 Subject: [PATCH 034/506] Updated projectors.ir --- .../resources/infrared/assets/projectors.ir | 79 ++++++++++++++++++- 1 file changed, 75 insertions(+), 4 deletions(-) diff --git a/assets/resources/infrared/assets/projectors.ir b/assets/resources/infrared/assets/projectors.ir index f30ee402a..19e0fffb3 100644 --- a/assets/resources/infrared/assets/projectors.ir +++ b/assets/resources/infrared/assets/projectors.ir @@ -1,7 +1,7 @@ Filetype: IR library file Version: 1 -# Last Updated 26th Dec, 2022 -# Last Checked 26th Dec, 2022 +# Last Updated 5th Jan, 2023 +# Last Checked 5th Jan, 2023 # # ON name: POWER @@ -10,7 +10,7 @@ frequency: 38000 duty_cycle: 0.330000 data: 310 27591 171 27662 241 27731 307 27575 107 27749 306 27551 130 55520 243 27614 217 55584 129 27743 119 27756 115 27747 163 27712 308 27502 243 27650 217 27732 175 27693 167 27698 166 27689 171 27622 215 27712 133 27658 216 27716 129 27732 162 27698 305 27571 131 27753 310 27570 170 27707 162 27707 175 10960 9194 4518 618 542 618 543 725 434 672 1623 671 1647 646 514 592 568 592 568 592 1702 592 568 592 567 593 1702 592 568 618 1676 618 1676 618 1676 618 543 617 543 617 543 617 1677 617 544 616 544 616 544 616 544 616 1678 616 1678 616 1678 616 544 616 1678 616 1679 615 1678 616 1678 616 40239 9196 2250 617 # -name: VOL + +name: VOL+ type: parsed protocol: NEC address: 08 00 00 00 @@ -592,7 +592,7 @@ type: raw frequency: 38000 duty_cycle: 0.330000 data: 3523 1701 472 426 444 1269 472 426 444 426 442 429 443 427 443 426 444 426 444 426 443 427 442 429 440 430 439 432 438 1304 437 433 437 432 438 432 438 433 437 433 437 433 437 433 437 433 437 433 437 1304 437 433 437 433 437 433 437 1304 437 433 437 433 437 1304 437 433 437 434 436 433 437 434 436 434 436 434 436 433 437 433 437 434 436 1304 437 1305 436 1305 436 1305 436 1305 436 1305 436 434 436 434 436 1305 436 1305 436 1305 436 434 436 1305 436 1305 436 1306 435 1306 435 74393 3515 1736 437 433 437 1304 437 433 437 433 437 433 437 433 437 433 437 433 437 433 437 434 436 433 437 434 436 434 436 1304 437 434 436 434 436 434 436 434 436 434 436 434 436 434 436 434 436 434 436 1305 436 434 436 434 436 434 436 1305 436 434 436 434 436 1306 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 436 434 435 435 1307 434 1331 410 1307 434 1307 434 1330 411 1307 434 460 410 460 410 1331 410 1331 410 1331 410 460 410 1331 410 1331 410 1331 410 1331 410 74393 3515 1736 437 433 437 1304 437 433 437 433 437 433 437 433 437 433 437 433 437 433 437 434 436 434 436 433 437 433 437 1304 437 434 436 434 436 434 437 434 436 434 436 434 436 434 436 434 436 434 436 1305 436 434 436 434 436 434 436 1305 436 435 435 434 436 1305 436 434 436 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 1307 434 1306 435 1307 434 1307 434 1307 434 1331 410 460 410 460 410 1331 410 1331 410 1331 410 460 410 1331 410 1331 410 1331 410 1331 410 74393 3515 1736 437 433 437 1304 437 433 437 433 437 433 437 433 437 433 437 433 437 433 437 433 437 433 437 434 436 433 437 1304 437 433 437 434 436 434 436 434 436 434 436 434 436 434 436 434 436 434 437 1305 436 434 436 434 436 434 436 1305 436 434 436 434 436 1306 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 435 1307 434 1330 411 1330 411 1330 411 1330 411 1330 411 460 410 460 410 1331 410 1331 410 1331 410 460 410 1331 410 1331 410 1331 410 1331 410 -# Standby/Off +# OFF name: POWER type: raw frequency: 38000 @@ -641,3 +641,74 @@ protocol: NEC address: 02 00 00 00 command: 18 00 00 00 # +name: POWER +type: parsed +protocol: NECext +address: B8 57 00 00 +command: 0C F3 00 00 +# +name: MUTE +type: parsed +protocol: NECext +address: B8 57 00 00 +command: 0D F2 00 00 +# +name: VOL- +type: parsed +protocol: NECext +address: B8 57 00 00 +command: 1E E1 00 00 +# +name: VOL+ +type: parsed +protocol: NECext +address: B8 57 00 00 +command: 1F E0 00 00 +# +name: POWER +type: parsed +protocol: NEC +address: 32 00 00 00 +command: 81 00 00 00 +# +name: VOL- +type: parsed +protocol: NEC +address: 32 00 00 00 +command: 8F 00 00 00 +# +name: VOL+ +type: parsed +protocol: NEC +address: 32 00 00 00 +command: 8C 00 00 00 +# +name: MUTE +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 9066 4428 608 507 609 1622 609 507 609 507 609 1623 608 1623 609 507 609 506 610 1623 609 507 609 1622 610 1623 608 507 609 506 610 1622 609 1623 609 506 610 1622 610 506 610 1623 637 478 690 425 638 478 637 1594 637 1594 664 451 636 1594 610 506 610 1621 611 1621 610 1621 610 505 611 40183 9065 2156 637 95953 9037 2185 608 +# +name: POWER +type: parsed +protocol: NEC +address: 00 00 00 00 +command: A8 00 00 00 +# +name: MUTE +type: parsed +protocol: NEC +address: 00 00 00 00 +command: 88 00 00 00 +# +name: VOL- +type: parsed +protocol: NEC +address: 00 00 00 00 +command: 9C 00 00 00 +# +name: VOL+ +type: parsed +protocol: NEC +address: 00 00 00 00 +command: 8C 00 00 00 From c8fb64ce220a7f2b79f3957c639c7109f7d7eb2b Mon Sep 17 00:00:00 2001 From: amec0e <88857687+amec0e@users.noreply.github.com> Date: Thu, 5 Jan 2023 21:38:19 +0000 Subject: [PATCH 035/506] Updated fans.ir --- assets/resources/infrared/assets/fans.ir | 69 +++++++++++++++++++++++- 1 file changed, 67 insertions(+), 2 deletions(-) diff --git a/assets/resources/infrared/assets/fans.ir b/assets/resources/infrared/assets/fans.ir index 8b3310fb6..37fc3a3df 100644 --- a/assets/resources/infrared/assets/fans.ir +++ b/assets/resources/infrared/assets/fans.ir @@ -1,7 +1,7 @@ Filetype: IR library file Version: 1 -# Last Updated 21th Dec, 2022 -# Last Checked 26th Dec, 2022 +# Last Updated 5th Jan, 2023 +# Last Checked 5th Jan, 2023 # name: POWER type: raw @@ -1203,4 +1203,69 @@ type: raw frequency: 38000 duty_cycle: 0.330000 data: 1366 388 1295 387 446 1164 1368 387 1296 387 448 1164 518 1164 493 1189 517 1165 492 1189 493 1189 493 7851 1365 387 1270 388 446 1190 1365 387 1295 387 447 1192 490 1193 489 1193 489 1194 488 1194 488 1193 489 7855 1337 386 1296 386 448 1193 1338 386 1296 386 448 1193 489 1193 489 1193 489 1193 489 1193 489 1193 489 7855 1337 386 1297 386 448 1194 1337 386 1296 386 448 1194 488 1194 488 1194 488 1194 488 1194 488 1194 488 8160 1336 387 1296 387 447 1194 1337 387 1296 386 448 1194 488 1194 488 1194 488 1194 488 1194 488 1194 488 7855 1336 386 1297 387 447 1195 1336 386 1297 386 448 1195 486 1195 487 1195 487 1195 487 1196 486 1196 486 7881 1310 387 1272 397 436 1245 1286 397 1285 397 436 1246 436 1246 436 1247 435 1247 435 1248 434 1248 434 7934 1259 424 1259 424 408 1274 1258 424 1259 424 408 1274 408 1274 408 1274 408 1274 408 1274 408 1274 408 8239 1258 425 1258 424 408 1274 1258 424 1258 425 407 1273 408 1273 409 1273 408 1273 408 1274 408 1273 408 7907 1283 424 1258 424 409 1248 1283 399 1283 400 433 1247 434 1247 434 1247 434 1247 434 1247 434 1247 434 7905 1282 424 1258 425 407 1273 1257 425 1257 425 407 1273 407 1274 407 1274 407 1274 407 1275 406 1275 406 7958 1230 478 1204 478 353 1328 1204 478 1204 453 378 1327 353 1328 353 1302 379 1301 380 1301 380 1300 381 +# +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 1341 337 1339 338 496 1178 1395 305 1316 337 1339 338 496 1178 526 1151 526 1151 1366 335 1341 335 498 7888 1338 338 1337 339 495 1182 1336 340 1336 340 1336 340 494 1182 494 1182 494 1183 1336 340 1336 340 494 7892 1336 340 1336 340 494 1183 1336 340 1336 340 1336 340 494 1183 494 1183 494 1183 1335 341 1335 340 494 7893 1335 341 1335 341 493 1183 1336 341 1335 341 1335 341 493 1183 493 1183 494 1183 1335 341 1335 341 493 7893 1335 341 1335 341 493 1184 1334 341 1335 341 1335 341 493 1184 493 1184 493 1184 1335 341 1335 342 492 7894 1334 342 1334 342 492 1184 1334 342 1334 341 1335 342 492 1184 493 1184 492 1185 1334 342 1334 342 492 7894 1334 342 1334 342 492 1185 1333 343 1333 342 1334 342 492 1185 492 1185 492 1185 1333 343 1333 343 491 7895 1333 343 1333 343 491 1185 1333 343 1333 344 1332 344 490 1186 490 1186 491 1186 1333 344 1332 344 490 7897 1331 368 1308 368 466 1211 1308 368 1308 368 1308 368 466 1211 465 1211 466 1211 1307 368 1308 369 465 7921 1307 368 1308 368 466 1211 1308 368 1308 369 1307 368 466 1211 466 1211 465 1211 1308 369 1307 369 465 7921 1307 369 1307 369 465 1212 1307 369 1307 369 1307 369 465 1212 465 1212 465 1212 1307 369 1307 369 465 7922 1306 370 1306 370 464 1212 1307 370 1306 370 1306 370 464 1212 464 1213 464 1212 1306 370 1306 370 464 7922 1306 370 1306 371 463 1213 1306 370 1306 371 1305 371 463 1213 439 1238 439 1238 1305 371 1305 371 462 7924 1280 396 1280 396 438 1238 1281 396 1280 396 1280 396 438 1239 437 1239 438 1239 1280 396 1280 397 437 7949 1279 397 1279 397 437 1240 1279 398 1278 422 1254 422 412 1265 411 1265 412 1265 1254 422 1254 422 412 7974 1254 422 1254 422 412 1265 1254 423 1253 423 1253 449 384 1293 383 1293 383 1294 1225 451 1225 452 382 8056 1171 505 1171 532 188 1463 1169 # +name: MODE +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 1349 364 1321 363 490 1219 1324 364 1294 389 463 1245 1324 363 462 1219 491 1221 462 1223 461 1226 484 8019 1292 393 1292 420 433 1252 1292 393 1292 420 433 1252 1292 393 460 1252 433 1252 460 1226 459 1252 433 8021 1317 393 1292 394 459 1226 1318 393 1292 394 458 1226 1318 394 432 1253 459 1226 459 1253 432 1253 459 +# +name: TEMP+ +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 1355 364 1348 363 462 1189 1355 363 1322 389 436 1245 492 1192 1351 389 436 1221 490 1197 487 1249 434 8019 1319 393 1292 393 459 1252 1292 393 1292 393 459 1252 432 1252 1292 393 459 1252 433 1252 433 1252 460 8020 1291 393 1292 420 432 1252 1292 393 1292 420 432 1253 459 1226 1291 420 432 1253 459 1226 459 1252 432 +# +name: TEMP- +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 1354 363 1322 363 489 1219 1325 364 1295 389 463 1245 464 1219 466 1219 1324 416 435 1223 461 1249 461 8019 1292 393 1318 393 432 1252 1292 393 1318 393 433 1252 460 1225 460 1252 1292 393 460 1225 459 1252 433 8020 1318 393 1292 393 459 1253 1291 393 1291 394 459 1253 431 1253 432 1253 1291 420 432 1253 432 1253 458 +# +name: TIMER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 1376 337 1348 363 462 1219 1325 390 1295 388 1322 363 490 1218 466 1219 465 1220 490 1222 1319 369 1316 7187 1292 393 1292 393 460 1252 1292 370 1315 393 1292 420 433 1252 433 1252 460 1252 433 1252 1292 393 1292 7188 1291 393 1318 393 433 1252 1292 393 1319 393 1291 393 460 1226 459 1252 432 1253 459 1225 1319 393 1292 +# +name: POWER +type: parsed +protocol: NECext +address: 00 F3 00 00 +command: 91 6E 00 00 +# +name: TIMER +type: parsed +protocol: NECext +address: 00 F3 00 00 +command: 96 69 00 00 +# +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 9253 4427 684 486 656 486 656 486 682 461 681 1573 680 1575 678 464 677 491 651 1604 650 1604 650 1604 650 1604 650 491 651 491 651 1604 650 1604 651 491 651 491 651 1604 650 1604 650 491 651 491 651 491 652 1604 650 1604 651 1604 650 491 651 491 652 1604 650 1604 650 1604 651 491 651 39948 9250 2183 651 +# +name: SPEED+ +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 9226 4450 657 484 657 484 658 484 657 485 657 1596 658 1597 681 487 653 488 653 1602 652 1602 652 1602 652 1602 652 490 652 490 652 1602 652 1602 652 490 652 490 652 490 652 1603 652 490 652 490 652 490 652 1602 652 1602 652 1602 653 1602 652 490 652 1602 652 1602 652 1602 653 489 653 39949 9250 2179 653 +# OSC +name: ROTATE +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 9231 4449 657 484 658 483 659 483 659 483 659 1595 659 1595 659 485 681 461 680 1601 652 1602 653 1601 653 1601 653 488 654 488 654 1602 653 1601 653 488 654 488 654 1602 653 1602 652 1602 652 488 654 488 654 1602 653 1601 653 1602 652 488 654 488 654 488 654 1602 652 1602 653 488 654 39978 9229 2174 654 96468 9259 2146 679 +# +name: TIMER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 9384 4452 658 485 657 484 658 484 659 485 657 1597 658 1597 682 487 655 488 654 1603 652 1603 653 1603 653 1604 653 491 653 491 653 1603 653 1603 653 1603 653 491 653 1604 652 490 654 1603 652 490 653 490 653 1603 652 490 653 1603 652 490 653 1603 652 490 653 1603 652 1603 652 490 653 39953 9263 2181 652 From ecf7dfd8fd3af0ca5751bbf8230cd94b10365d4a Mon Sep 17 00:00:00 2001 From: amec0e <88857687+amec0e@users.noreply.github.com> Date: Thu, 5 Jan 2023 21:39:09 +0000 Subject: [PATCH 036/506] Updated audio.ir --- assets/resources/infrared/assets/audio.ir | 267 +++++++++++++++++----- 1 file changed, 205 insertions(+), 62 deletions(-) diff --git a/assets/resources/infrared/assets/audio.ir b/assets/resources/infrared/assets/audio.ir index 7a2d60b92..6f3ddeee4 100644 --- a/assets/resources/infrared/assets/audio.ir +++ b/assets/resources/infrared/assets/audio.ir @@ -1,7 +1,157 @@ Filetype: IR library file Version: 1 -# Last Updated 26th Dec, 2022 -# Last Checked 26th Dec, 2022 +# Last Updated 5th Jan, 2023 +# Last Checked 5th Jan, 2023 +# +name: POWER +type: parsed +protocol: NEC +address: 77 00 00 00 +command: F1 00 00 00 +# +name: MUTE +type: parsed +protocol: NEC +address: 77 00 00 00 +command: F3 00 00 00 +# +name: VOL+ +type: parsed +protocol: NEC +address: 77 00 00 00 +command: FB 00 00 00 +# +name: VOL- +type: parsed +protocol: NEC +address: 77 00 00 00 +command: FC 00 00 00 +# +name: POWER +type: parsed +protocol: NEC +address: 80 00 00 00 +command: 1A 00 00 00 +# +name: POWER +type: parsed +protocol: NECext +address: 10 E7 00 00 +command: 46 B9 00 00 +# +name: VOL+ +type: parsed +protocol: NECext +address: 10 E7 00 00 +command: 06 F9 00 00 +# +name: VOL- +type: parsed +protocol: NECext +address: 10 E7 00 00 +command: 47 B8 00 00 +# +name: MUTE +type: parsed +protocol: NECext +address: 10 E7 00 00 +command: 41 BE 00 00 +# +name: POWER +type: parsed +protocol: RC5 +address: 10 00 00 00 +command: 0C 00 00 00 +# +name: MUTE +type: parsed +protocol: RC5 +address: 10 00 00 00 +command: 0D 00 00 00 +# +name: VOL+ +type: parsed +protocol: RC5 +address: 10 00 00 00 +command: 10 00 00 00 +# +name: VOL- +type: parsed +protocol: RC5 +address: 10 00 00 00 +command: 11 00 00 00 +# +name: POWER +type: parsed +protocol: NEC +address: 00 00 00 00 +command: 40 00 00 00 +# +name: VOL+ +type: parsed +protocol: NEC +address: 00 00 00 00 +command: 41 00 00 00 +# +name: VOL- +type: parsed +protocol: NEC +address: 00 00 00 00 +command: 45 00 00 00 +# +name: MUTE +type: parsed +protocol: NEC +address: 00 00 00 00 +command: 48 00 00 00 +# +name: POWER +type: parsed +protocol: NECext +address: 2D D3 00 00 +command: 12 ED 00 00 +# +name: VOL+ +type: parsed +protocol: NECext +address: 2D D3 00 00 +command: 11 EE 00 00 +# +name: VOL- +type: parsed +protocol: NECext +address: 2D D3 00 00 +command: 10 EF 00 00 +# +name: MUTE +type: parsed +protocol: NECext +address: 2D D3 00 00 +command: 13 EC 00 00 +# +name: POWER +type: parsed +protocol: SIRC15 +address: 44 00 00 00 +command: 15 00 00 00 +# +name: VOL+ +type: parsed +protocol: SIRC15 +address: 44 00 00 00 +command: 12 00 00 00 +# +name: VOL- +type: parsed +protocol: SIRC15 +address: 44 00 00 00 +command: 13 00 00 00 +# +name: MUTE +type: parsed +protocol: SIRC15 +address: 44 00 00 00 +command: 14 00 00 00 # name: POWER type: parsed @@ -1270,30 +1420,6 @@ protocol: NECext address: EF 01 00 00 command: 28 D7 00 00 # -name: POWER -type: parsed -protocol: NEC -address: 00 00 00 00 -command: 40 00 00 00 -# -name: VOL+ -type: parsed -protocol: NEC -address: 00 00 00 00 -command: 41 00 00 00 -# -name: VOL- -type: parsed -protocol: NEC -address: 00 00 00 00 -command: 45 00 00 00 -# -name: MUTE -type: parsed -protocol: NEC -address: 00 00 00 00 -command: 48 00 00 00 -# name: VOL+ type: raw frequency: 38000 @@ -1462,24 +1588,6 @@ protocol: RC5 address: 14 00 00 00 command: 10 00 00 00 # -name: MUTE -type: parsed -protocol: RC5 -address: 10 00 00 00 -command: 0D 00 00 00 -# -name: VOL+ -type: parsed -protocol: RC5 -address: 10 00 00 00 -command: 10 00 00 00 -# -name: VOL- -type: parsed -protocol: RC5 -address: 10 00 00 00 -command: 11 00 00 00 -# name: POWER type: parsed protocol: SIRC15 @@ -1722,24 +1830,6 @@ command: 57 00 00 00 # name: VOL+ type: parsed -protocol: NECext -address: 10 E7 00 00 -command: 06 F9 00 00 -# -name: VOL- -type: parsed -protocol: NECext -address: 10 E7 00 00 -command: 47 B8 00 00 -# -name: MUTE -type: parsed -protocol: NECext -address: 10 E7 00 00 -command: 41 BE 00 00 -# -name: VOL+ -type: parsed protocol: NEC address: 4D 00 00 00 command: 04 00 00 00 @@ -1859,3 +1949,56 @@ protocol: Kaseikyo address: A0 02 20 00 command: 10 02 00 00 # +name: POWER +type: parsed +protocol: SIRC +address: 0F 00 00 00 +command: 15 00 00 00 +# +name: Power +type: parsed +protocol: Samsung32 +address: 10 00 00 00 +command: 1E 00 00 00 +# +name: VOL+ +type: parsed +protocol: Samsung32 +address: 10 00 00 00 +command: 17 00 00 00 +# +name: VOL- +type: parsed +protocol: Samsung32 +address: 10 00 00 00 +command: 16 00 00 00 +# +name: MUTE +type: parsed +protocol: Samsung32 +address: 10 00 00 00 +command: 1F 00 00 00 +# +name: POWER +type: parsed +protocol: Kaseikyo +address: 51 54 32 01 +command: 03 00 00 00 +# +name: VOL+ +type: parsed +protocol: Kaseikyo +address: 51 54 32 01 +command: 04 00 00 00 +# +name: VOL- +type: parsed +protocol: Kaseikyo +address: 51 54 32 01 +command: 05 00 00 00 +# +name: MUTE +type: parsed +protocol: Kaseikyo +address: 51 54 32 01 +command: 06 00 00 00 From 7d4d2e19a9292eb59814c3e61e89362264d08b93 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Fri, 6 Jan 2023 02:23:03 +0300 Subject: [PATCH 037/506] Infrared: Fix not enough signal repeats in brute --- applications/main/infrared/infrared_signal.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/main/infrared/infrared_signal.c b/applications/main/infrared/infrared_signal.c index 9154dfbf6..961f42709 100644 --- a/applications/main/infrared/infrared_signal.c +++ b/applications/main/infrared/infrared_signal.c @@ -295,6 +295,6 @@ void infrared_signal_transmit(InfraredSignal* signal) { raw_signal->duty_cycle); } else { InfraredMessage* message = &signal->payload.message; - infrared_send(message, 1); + infrared_send(message, 3); } } From 890419864c3320b31f287d396fa154a8723ad799 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Fri, 6 Jan 2023 06:55:09 +0300 Subject: [PATCH 038/506] Update links in readme --- CHANGELOG.md | 1 - ReadMe.md | 1 - 2 files changed, 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4a4fd9f85..285348b8b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -55,7 +55,6 @@ ## Please support development of the project * Boosty: https://boosty.to/mmxdev * Ko-Fi: https://ko-fi.com/masterx -* destream (100 EUR min): https://destream.net/live/MMX/donate * cloudtips (only RU payments accepted): https://pay.cloudtips.ru/p/7b3e9d65 * YooMoney (only RU payments accepted): https://yoomoney.ru/fundraise/XA49mgQLPA0.221209 * USDT(TRC20): `TSXcitMSnWXUFqiUfEXrTVpVewXy2cYhrs` diff --git a/ReadMe.md b/ReadMe.md index 13c8cc53f..93a0aceca 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -86,7 +86,6 @@ Also, regarding our releases, every build has and always will be free and open-s You can support us by using links or addresses below: * Boosty: https://boosty.to/mmxdev * Ko-Fi: https://ko-fi.com/masterx -* destream (100 EUR min): https://destream.net/live/MMX/donate * cloudtips (only RU payments accepted): https://pay.cloudtips.ru/p/7b3e9d65 * YooMoney (only RU payments accepted): https://yoomoney.ru/fundraise/XA49mgQLPA0.221209 * USDT(TRC20): `TSXcitMSnWXUFqiUfEXrTVpVewXy2cYhrs` From 109c34398fc2e20891be62e9d0b4e291fe3078a9 Mon Sep 17 00:00:00 2001 From: LTVA1 <87536432+LTVA1@users.noreply.github.com> Date: Fri, 6 Jan 2023 21:43:43 +0300 Subject: [PATCH 039/506] custom font set function --- applications/services/gui/canvas.c | 7 +++++++ applications/services/gui/canvas.h | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/applications/services/gui/canvas.c b/applications/services/gui/canvas.c index a2979d56b..ac0958748 100644 --- a/applications/services/gui/canvas.c +++ b/applications/services/gui/canvas.c @@ -137,6 +137,13 @@ void canvas_set_font(Canvas* canvas, Font font) { } } +void canvas_set_custom_font(Canvas* canvas, const uint8_t* font) +{ + furi_assert(canvas); + u8g2_SetFontMode(&canvas->fb, 1); + u8g2_SetFont(&canvas->fb, font); +} + void canvas_draw_str(Canvas* canvas, uint8_t x, uint8_t y, const char* str) { furi_assert(canvas); if(!str) return; diff --git a/applications/services/gui/canvas.h b/applications/services/gui/canvas.h index 0b0c7e658..7210c45df 100644 --- a/applications/services/gui/canvas.h +++ b/applications/services/gui/canvas.h @@ -146,6 +146,13 @@ void canvas_invert_color(Canvas* canvas); */ void canvas_set_font(Canvas* canvas, Font font); +/** Set custom drawing font + * + * @param canvas Canvas instance + * @param font Pointer to u8g2 const uint8_t* font array + */ +void canvas_set_custom_font(Canvas* canvas, const uint8_t* font); + /** Draw string at position of baseline defined by x, y. * * @param canvas Canvas instance From 1cdccbae23276a687518d0d0f9c17aa2e1630ef8 Mon Sep 17 00:00:00 2001 From: LTVA1 <87536432+LTVA1@users.noreply.github.com> Date: Fri, 6 Jan 2023 21:52:17 +0300 Subject: [PATCH 040/506] formatting --- applications/services/gui/canvas.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/applications/services/gui/canvas.c b/applications/services/gui/canvas.c index ac0958748..29d56f34a 100644 --- a/applications/services/gui/canvas.c +++ b/applications/services/gui/canvas.c @@ -137,8 +137,7 @@ void canvas_set_font(Canvas* canvas, Font font) { } } -void canvas_set_custom_font(Canvas* canvas, const uint8_t* font) -{ +void canvas_set_custom_font(Canvas* canvas, const uint8_t* font) { furi_assert(canvas); u8g2_SetFontMode(&canvas->fb, 1); u8g2_SetFont(&canvas->fb, font); From 50ee2eb8aaab4e32cdacbcf7e8b73426b06ae62b Mon Sep 17 00:00:00 2001 From: LTVA1 <87536432+LTVA1@users.noreply.github.com> Date: Fri, 6 Jan 2023 22:32:50 +0300 Subject: [PATCH 041/506] update API symbols --- firmware/targets/f7/api_symbols.csv | 1 + 1 file changed, 1 insertion(+) diff --git a/firmware/targets/f7/api_symbols.csv b/firmware/targets/f7/api_symbols.csv index ac7d1a0c5..a802d8706 100644 --- a/firmware/targets/f7/api_symbols.csv +++ b/firmware/targets/f7/api_symbols.csv @@ -620,6 +620,7 @@ Function,+,canvas_reset,void,Canvas* Function,+,canvas_set_bitmap_mode,void,"Canvas*, _Bool" Function,+,canvas_set_color,void,"Canvas*, Color" Function,+,canvas_set_font,void,"Canvas*, Font" +Function,+,canvas_set_custom_font,void,"Canvas*, const uint8_t*" Function,+,canvas_set_font_direction,void,"Canvas*, CanvasDirection" Function,+,canvas_string_width,uint16_t,"Canvas*, const char*" Function,+,canvas_width,uint8_t,Canvas* From a921a828e5fe3452d8bf71fd4e8ba24033981db8 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sat, 7 Jan 2023 02:00:39 +0300 Subject: [PATCH 042/506] Fix Dolphin animations manifests --- .ci_files/anims_ofw.txt | 7 +++++++ assets/dolphin/external/manifest.txt | 1 + 2 files changed, 8 insertions(+) diff --git a/.ci_files/anims_ofw.txt b/.ci_files/anims_ofw.txt index 362fba6a9..f9d5c2a64 100644 --- a/.ci_files/anims_ofw.txt +++ b/.ci_files/anims_ofw.txt @@ -140,3 +140,10 @@ Max butthurt: 10 Min level: 3 Max level: 3 Weight: 3 + +Name: L1_Sleigh_ride_128x64 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 3 +Weight: 4 diff --git a/assets/dolphin/external/manifest.txt b/assets/dolphin/external/manifest.txt index d4ee998d0..831591c97 100644 --- a/assets/dolphin/external/manifest.txt +++ b/assets/dolphin/external/manifest.txt @@ -147,6 +147,7 @@ Max butthurt: 14 Min level: 1 Max level: 3 Weight: 4 + Name: L1_New_year_128x64 Min butthurt: 0 Max butthurt: 10 From ddf4f268ea3101bfce33d328e57a90930258e3e6 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sat, 7 Jan 2023 02:07:26 +0300 Subject: [PATCH 043/506] Update TOTP https://github.com/akopachov/flipper-zero_authenticator --- applications/plugins/totp/cli/cli.c | 19 ++++++-- applications/plugins/totp/cli/cli.h | 10 ++++- applications/plugins/totp/cli/cli_helpers.c | 41 ++++++++++++++++++ applications/plugins/totp/cli/cli_helpers.h | 17 +++++++- .../plugins/totp/cli/commands/add/add.c | 43 +++---------------- .../plugins/totp/cli/commands/help/help.c | 3 ++ .../plugins/totp/cli/commands/reset/reset.c | 37 ++++++++++++++++ .../plugins/totp/cli/commands/reset/reset.h | 10 +++++ .../plugins/totp/services/config/config.c | 6 +++ .../plugins/totp/services/config/config.h | 7 ++- applications/plugins/totp/totp_app.c | 10 +++-- applications/plugins/totp/types/event_type.h | 5 +-- 12 files changed, 155 insertions(+), 53 deletions(-) create mode 100644 applications/plugins/totp/cli/commands/reset/reset.c create mode 100644 applications/plugins/totp/cli/commands/reset/reset.h diff --git a/applications/plugins/totp/cli/cli.c b/applications/plugins/totp/cli/cli.c index e61c67206..8f4708f4d 100644 --- a/applications/plugins/totp/cli/cli.c +++ b/applications/plugins/totp/cli/cli.c @@ -11,6 +11,7 @@ #include "commands/move/move.h" #include "commands/pin/pin.h" #include "commands/notification/notification.h" +#include "commands/reset/reset.h" static void totp_cli_print_unknown_command(const FuriString* unknown_command) { TOTP_CLI_PRINTF( @@ -20,7 +21,8 @@ static void totp_cli_print_unknown_command(const FuriString* unknown_command) { } static void totp_cli_handler(Cli* cli, FuriString* args, void* context) { - PluginState* plugin_state = (PluginState*)context; + TotpCliContext* cli_context = context; + PluginState* plugin_state = cli_context->plugin_state; FuriString* cmd = furi_string_alloc(); @@ -55,6 +57,8 @@ static void totp_cli_handler(Cli* cli, FuriString* args, void* context) { totp_cli_command_pin_handle(plugin_state, args, cli); } else if(furi_string_cmp_str(cmd, TOTP_CLI_COMMAND_NOTIFICATION) == 0) { totp_cli_command_notification_handle(plugin_state, args, cli); + } else if(furi_string_cmp_str(cmd, TOTP_CLI_COMMAND_RESET) == 0) { + totp_cli_command_reset_handle(cli, cli_context->event_queue); } else { totp_cli_print_unknown_command(cmd); } @@ -62,15 +66,22 @@ static void totp_cli_handler(Cli* cli, FuriString* args, void* context) { furi_string_free(cmd); } -void totp_cli_register_command_handler(PluginState* plugin_state) { +TotpCliContext* + totp_cli_register_command_handler(PluginState* plugin_state, FuriMessageQueue* event_queue) { Cli* cli = furi_record_open(RECORD_CLI); + TotpCliContext* context = malloc(sizeof(TotpCliContext)); + furi_check(context != NULL); + context->plugin_state = plugin_state; + context->event_queue = event_queue; cli_add_command( - cli, TOTP_CLI_COMMAND_NAME, CliCommandFlagParallelSafe, totp_cli_handler, plugin_state); + cli, TOTP_CLI_COMMAND_NAME, CliCommandFlagParallelSafe, totp_cli_handler, context); furi_record_close(RECORD_CLI); + return context; } -void totp_cli_unregister_command_handler() { +void totp_cli_unregister_command_handler(TotpCliContext* context) { Cli* cli = furi_record_open(RECORD_CLI); cli_delete_command(cli, TOTP_CLI_COMMAND_NAME); furi_record_close(RECORD_CLI); + free(context); } \ No newline at end of file diff --git a/applications/plugins/totp/cli/cli.h b/applications/plugins/totp/cli/cli.h index 3eb18172c..2e4b92db8 100644 --- a/applications/plugins/totp/cli/cli.h +++ b/applications/plugins/totp/cli/cli.h @@ -3,5 +3,11 @@ #include #include "../types/plugin_state.h" -void totp_cli_register_command_handler(PluginState* plugin_state); -void totp_cli_unregister_command_handler(); \ No newline at end of file +typedef struct { + PluginState* plugin_state; + FuriMessageQueue* event_queue; +} TotpCliContext; + +TotpCliContext* + totp_cli_register_command_handler(PluginState* plugin_state, FuriMessageQueue* event_queue); +void totp_cli_unregister_command_handler(TotpCliContext* context); \ No newline at end of file diff --git a/applications/plugins/totp/cli/cli_helpers.c b/applications/plugins/totp/cli/cli_helpers.c index 0bea6fd90..984637164 100644 --- a/applications/plugins/totp/cli/cli_helpers.c +++ b/applications/plugins/totp/cli/cli_helpers.c @@ -1,5 +1,6 @@ #include "cli_helpers.h" #include +#include "../types/plugin_event.h" bool totp_cli_ensure_authenticated(const PluginState* plugin_state, Cli* cli) { if(plugin_state->current_scene == TotpSceneAuthentication) { @@ -17,5 +18,45 @@ bool totp_cli_ensure_authenticated(const PluginState* plugin_state, Cli* cli) { } } + return true; +} + +void totp_cli_force_close_app(FuriMessageQueue* event_queue) { + PluginEvent event = {.type = EventForceCloseApp}; + furi_message_queue_put(event_queue, &event, FuriWaitForever); +} + +bool totp_cli_read_line(Cli* cli, FuriString* out_str, bool mask_user_input) { + uint8_t c; + while(cli_read(cli, &c, 1) == 1) { + if(c == CliSymbolAsciiEsc) { + // Some keys generating escape-sequences + // We need to ignore them as we care about alpha-numerics only + uint8_t c2; + cli_read_timeout(cli, &c2, 1, 0); + cli_read_timeout(cli, &c2, 1, 0); + } else if(c == CliSymbolAsciiETX) { + cli_nl(); + return false; + } else if((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) { + if(mask_user_input) { + putc('*', stdout); + } else { + putc(c, stdout); + } + fflush(stdout); + furi_string_push_back(out_str, c); + } else if(c == CliSymbolAsciiBackspace || c == CliSymbolAsciiDel) { + size_t out_str_size = furi_string_size(out_str); + if(out_str_size > 0) { + TOTP_CLI_DELETE_LAST_CHAR(); + furi_string_left(out_str, out_str_size - 1); + } + } else if(c == CliSymbolAsciiCR) { + cli_nl(); + break; + } + } + return true; } \ No newline at end of file diff --git a/applications/plugins/totp/cli/cli_helpers.h b/applications/plugins/totp/cli/cli_helpers.h index ae6fe6e0c..5027d7027 100644 --- a/applications/plugins/totp/cli/cli_helpers.h +++ b/applications/plugins/totp/cli/cli_helpers.h @@ -45,7 +45,22 @@ * @brief Checks whether user is authenticated and entered correct PIN. * If user is not authenticated it prompts user to enter correct PIN to authenticate. * @param plugin_state application state - * @param cli reference to the firmware CLI subsystem + * @param cli pointer to the firmware CLI subsystem * @return \c true if user is already authenticated or successfully authenticated; \c false otherwise */ bool totp_cli_ensure_authenticated(const PluginState* plugin_state, Cli* cli); + +/** + * @brief Forces application to be instantly closed + * @param event_queue main app queue + */ +void totp_cli_force_close_app(FuriMessageQueue* event_queue); + +/** + * @brief Reads line of characters from console + * @param cli pointer to the firmware CLI subsystem + * @param out_str pointer to an output string to put read line to + * @param mask_user_input whether to mask input characters in console or not + * @return \c true if line successfully read and confirmed; \c false otherwise + */ +bool totp_cli_read_line(Cli* cli, FuriString* out_str, bool mask_user_input); diff --git a/applications/plugins/totp/cli/commands/add/add.c b/applications/plugins/totp/cli/commands/add/add.c index e037546e2..ba36a973a 100644 --- a/applications/plugins/totp/cli/commands/add/add.c +++ b/applications/plugins/totp/cli/commands/add/add.c @@ -76,43 +76,6 @@ static void furi_string_secure_free(FuriString* str) { furi_string_free(str); } -static bool totp_cli_read_secret(Cli* cli, FuriString* out_str, bool mask_user_input) { - uint8_t c; - while(cli_read(cli, &c, 1) == 1) { - if(c == CliSymbolAsciiEsc) { - // Some keys generating escape-sequences - // We need to ignore them as we care about alpha-numerics only - uint8_t c2; - cli_read_timeout(cli, &c2, 1, 0); - cli_read_timeout(cli, &c2, 1, 0); - } else if(c == CliSymbolAsciiETX) { - TOTP_CLI_DELETE_CURRENT_LINE(); - TOTP_CLI_PRINTF("Cancelled by user\r\n"); - return false; - } else if((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) { - if(mask_user_input) { - putc('*', stdout); - } else { - putc(c, stdout); - } - fflush(stdout); - furi_string_push_back(out_str, c); - } else if(c == CliSymbolAsciiBackspace || c == CliSymbolAsciiDel) { - size_t out_str_size = furi_string_size(out_str); - if(out_str_size > 0) { - TOTP_CLI_DELETE_LAST_CHAR(); - furi_string_left(out_str, out_str_size - 1); - } - } else if(c == CliSymbolAsciiCR) { - cli_nl(); - break; - } - } - - TOTP_CLI_DELETE_LAST_LINE(); - return true; -} - void totp_cli_command_add_handle(PluginState* plugin_state, FuriString* args, Cli* cli) { FuriString* temp_str = furi_string_alloc(); TokenInfo* token_info = token_info_alloc(); @@ -178,13 +141,17 @@ void totp_cli_command_add_handle(PluginState* plugin_state, FuriString* args, Cl // Reading token secret furi_string_reset(temp_str); TOTP_CLI_PRINTF("Enter token secret and confirm with [ENTER]\r\n"); - if(!totp_cli_read_secret(cli, temp_str, mask_user_input) || + if(!totp_cli_read_line(cli, temp_str, mask_user_input) || !totp_cli_ensure_authenticated(plugin_state, cli)) { + TOTP_CLI_DELETE_LAST_LINE(); + TOTP_CLI_PRINTF("Cancelled by user\r\n"); furi_string_secure_free(temp_str); token_info_free(token_info); return; } + TOTP_CLI_DELETE_LAST_LINE(); + if(!token_info_set_secret( token_info, furi_string_get_cstr(temp_str), diff --git a/applications/plugins/totp/cli/commands/help/help.c b/applications/plugins/totp/cli/commands/help/help.c index 419964880..104b39e47 100644 --- a/applications/plugins/totp/cli/commands/help/help.c +++ b/applications/plugins/totp/cli/commands/help/help.c @@ -7,6 +7,7 @@ #include "../move/move.h" #include "../pin/pin.h" #include "../notification/notification.h" +#include "../reset/reset.h" void totp_cli_command_help_docopt_commands() { TOTP_CLI_PRINTF(" " TOTP_CLI_COMMAND_HELP ", " TOTP_CLI_COMMAND_HELP_ALT @@ -29,6 +30,7 @@ void totp_cli_command_help_handle() { totp_cli_command_move_docopt_usage(); totp_cli_command_pin_docopt_usage(); totp_cli_command_notification_docopt_usage(); + totp_cli_command_reset_docopt_usage(); cli_nl(); TOTP_CLI_PRINTF("Commands:\r\n"); totp_cli_command_help_docopt_commands(); @@ -39,6 +41,7 @@ void totp_cli_command_help_handle() { totp_cli_command_move_docopt_commands(); totp_cli_command_pin_docopt_commands(); totp_cli_command_notification_docopt_commands(); + totp_cli_command_reset_docopt_commands(); cli_nl(); TOTP_CLI_PRINTF("Arguments:\r\n"); totp_cli_command_add_docopt_arguments(); diff --git a/applications/plugins/totp/cli/commands/reset/reset.c b/applications/plugins/totp/cli/commands/reset/reset.c new file mode 100644 index 000000000..3f20dc8ad --- /dev/null +++ b/applications/plugins/totp/cli/commands/reset/reset.c @@ -0,0 +1,37 @@ +#include "reset.h" + +#include +#include +#include "../../cli_helpers.h" +#include "../../../services/config/config.h" + +#define TOTP_CLI_RESET_CONFIRMATION_KEYWORD "YES" + +void totp_cli_command_reset_docopt_commands() { + TOTP_CLI_PRINTF(" " TOTP_CLI_COMMAND_RESET + " Reset application to default settings\r\n"); +} + +void totp_cli_command_reset_docopt_usage() { + TOTP_CLI_PRINTF(" " TOTP_CLI_COMMAND_NAME " " TOTP_CLI_COMMAND_RESET "\r\n"); +} + +void totp_cli_command_reset_handle(Cli* cli, FuriMessageQueue* event_queue) { + TOTP_CLI_PRINTF( + "As a result of reset all the settings and tokens will be permanently lost.\r\n"); + TOTP_CLI_PRINTF("Do you really want to reset application?\r\n"); + TOTP_CLI_PRINTF("Type \"" TOTP_CLI_RESET_CONFIRMATION_KEYWORD + "\" and hit to confirm:\r\n"); + FuriString* temp_str = furi_string_alloc(); + bool is_confirmed = totp_cli_read_line(cli, temp_str, false) && + furi_string_cmpi_str(temp_str, TOTP_CLI_RESET_CONFIRMATION_KEYWORD) == 0; + furi_string_free(temp_str); + if(is_confirmed) { + totp_config_file_reset(); + TOTP_CLI_PRINTF("Application has been successfully reset to default.\r\n"); + TOTP_CLI_PRINTF("Now application will be closed to apply all the changes.\r\n"); + totp_cli_force_close_app(event_queue); + } else { + TOTP_CLI_PRINTF("Action was not confirmed by user\r\n"); + } +} \ No newline at end of file diff --git a/applications/plugins/totp/cli/commands/reset/reset.h b/applications/plugins/totp/cli/commands/reset/reset.h new file mode 100644 index 000000000..7c879e13e --- /dev/null +++ b/applications/plugins/totp/cli/commands/reset/reset.h @@ -0,0 +1,10 @@ +#pragma once + +#include +#include "../../../types/plugin_state.h" + +#define TOTP_CLI_COMMAND_RESET "reset" + +void totp_cli_command_reset_handle(Cli* cli, FuriMessageQueue* event_queue); +void totp_cli_command_reset_docopt_commands(); +void totp_cli_command_reset_docopt_usage(); \ No newline at end of file diff --git a/applications/plugins/totp/services/config/config.c b/applications/plugins/totp/services/config/config.c index b9f0e9d50..01af1992f 100644 --- a/applications/plugins/totp/services/config/config.c +++ b/applications/plugins/totp/services/config/config.c @@ -730,4 +730,10 @@ TotpConfigFileUpdateResult totp_close_storage(); return update_result; +} + +void totp_config_file_reset() { + Storage* storage = totp_open_storage(); + storage_simply_remove(storage, CONFIG_FILE_PATH); + totp_close_storage(); } \ No newline at end of file diff --git a/applications/plugins/totp/services/config/config.h b/applications/plugins/totp/services/config/config.h index bb48105f7..c630810a6 100644 --- a/applications/plugins/totp/services/config/config.h +++ b/applications/plugins/totp/services/config/config.h @@ -116,4 +116,9 @@ TotpConfigFileUpdateResult totp_config_file_update_user_settings(const PluginSta * @return Config file update result */ TotpConfigFileUpdateResult - totp_config_file_update_crypto_signatures(const PluginState* plugin_state); \ No newline at end of file + totp_config_file_update_crypto_signatures(const PluginState* plugin_state); + +/** + * @brief Reset all the settings to default + */ +void totp_config_file_reset(); \ No newline at end of file diff --git a/applications/plugins/totp/totp_app.c b/applications/plugins/totp/totp_app.c index 93acf8e4d..f10837814 100644 --- a/applications/plugins/totp/totp_app.c +++ b/applications/plugins/totp/totp_app.c @@ -143,7 +143,7 @@ int32_t totp_app() { return 255; } - totp_cli_register_command_handler(plugin_state); + TotpCliContext* cli_context = totp_cli_register_command_handler(plugin_state, event_queue); totp_scene_director_init_scenes(plugin_state); if(!totp_activate_initial_scene(plugin_state)) { FURI_LOG_E(LOGGING_TAG, "An error ocurred during activating initial scene\r\n"); @@ -172,7 +172,11 @@ int32_t totp_app() { last_user_interaction_time = furi_get_tick(); } - processing = totp_scene_director_handle_event(&event, plugin_state_m); + if(event.type == EventForceCloseApp) { + processing = false; + } else { + processing = totp_scene_director_handle_event(&event, plugin_state_m); + } } else if( plugin_state_m->pin_set && plugin_state_m->current_scene != TotpSceneAuthentication && furi_get_tick() - last_user_interaction_time > IDLE_TIMEOUT) { @@ -183,7 +187,7 @@ int32_t totp_app() { release_mutex(&state_mutex, plugin_state_m); } - totp_cli_unregister_command_handler(); + totp_cli_unregister_command_handler(cli_context); totp_scene_director_deactivate_active_scene(plugin_state); totp_scene_director_dispose(plugin_state); diff --git a/applications/plugins/totp/types/event_type.h b/applications/plugins/totp/types/event_type.h index 4fe916872..7bdf6981f 100644 --- a/applications/plugins/totp/types/event_type.h +++ b/applications/plugins/totp/types/event_type.h @@ -3,7 +3,4 @@ typedef uint8_t EventType; -enum EventTypes { - EventTypeTick, - EventTypeKey, -}; +enum EventTypes { EventTypeTick, EventTypeKey, EventForceCloseApp }; From 3fa11aa4a02e492fce8bcf223b84e2dade638ef1 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sat, 7 Jan 2023 02:08:15 +0300 Subject: [PATCH 044/506] Update UniTemp https://github.com/quen0n/unitemp-flipperzero/tree/dev --- applications/plugins/unitemp/interfaces/SingleWireSensor.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/plugins/unitemp/interfaces/SingleWireSensor.c b/applications/plugins/unitemp/interfaces/SingleWireSensor.c index e601e086e..d5343a7a8 100644 --- a/applications/plugins/unitemp/interfaces/SingleWireSensor.c +++ b/applications/plugins/unitemp/interfaces/SingleWireSensor.c @@ -262,7 +262,7 @@ UnitempStatus unitemp_singlewire_update(Sensor* sensor) { //Проверка на отрицательность температуры if(READ_BIT(raw, 1 << 15)) { //Проверка на способ кодирования данных - if(READ_BIT(raw, 0x60)) { + if(READ_BIT(raw, 0x6000)) { //Не оригинал sensor->temp = (float)((int16_t)raw) / 10; } else { From c3b8d3cef4be32cc1817ad7ee19c217b6365eab5 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sat, 7 Jan 2023 04:56:45 +0300 Subject: [PATCH 045/506] Testing 2 repeats in infrared --- applications/main/infrared/infrared_signal.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/main/infrared/infrared_signal.c b/applications/main/infrared/infrared_signal.c index 961f42709..80e1a6f92 100644 --- a/applications/main/infrared/infrared_signal.c +++ b/applications/main/infrared/infrared_signal.c @@ -295,6 +295,6 @@ void infrared_signal_transmit(InfraredSignal* signal) { raw_signal->duty_cycle); } else { InfraredMessage* message = &signal->payload.message; - infrared_send(message, 3); + infrared_send(message, 2); } } From b6442f2971aa1d17f5eee423c8e8b3c8181fdce2 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sat, 7 Jan 2023 18:40:47 +0300 Subject: [PATCH 046/506] Fix readme links --- ReadMe.md | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/ReadMe.md b/ReadMe.md index 93a0aceca..d81fbf48b 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -99,9 +99,9 @@ You can support us by using links or addresses below: ### Community apps included: -- RFID Fuzzer plugin [(by Ganapati & @xMasterX)](https://github.com/DarkFlippers/unleashed-firmware/pull/54) & New protocols by @mvanzanten +- **RFID Fuzzer** [(by Ganapati & @xMasterX)](https://github.com/DarkFlippers/unleashed-firmware/pull/54) & New protocols by @mvanzanten - Sub-GHz bruteforce plugin [(by @derskythe & xMasterX)](https://github.com/derskythe/flipperzero-subbrute) [(original by Ganapati & xMasterX)](https://github.com/DarkFlippers/unleashed-firmware/pull/57) -- Sub-GHz playlist plugin [(by darmiel)](https://github.com/DarkFlippers/unleashed-firmware/pull/62) +- **Sub-GHz playlist** [(by darmiel)](https://github.com/DarkFlippers/unleashed-firmware/pull/62) - ESP8266 Deauther plugin [(by SequoiaSan)](https://github.com/SequoiaSan/FlipperZero-Wifi-ESP8266-Deauther-Module) - WiFi Scanner plugin [(by SequoiaSan)](https://github.com/SequoiaSan/FlipperZero-WiFi-Scanner_Module) - MultiConverter plugin [(by theisolinearchip)](https://github.com/theisolinearchip/flipperzero_stuff) @@ -112,7 +112,7 @@ You can support us by using links or addresses below: - ESP32: WiFi Marauder companion plugin [(by 0xchocolate)](https://github.com/0xchocolate/flipperzero-firmware-with-wifi-marauder-companion) - NRF24: Sniffer & MouseJacker (with changes) [(by mothball187)](https://github.com/mothball187/flipperzero-nrf24/tree/main/mousejacker) - Simple Clock (timer by GMMan / settings by kowalski7cc) [(original by CompaqDisc)](https://gist.github.com/CompaqDisc/4e329c501bd03c1e801849b81f48ea61) -- UniversalRF Remix / Sub-GHz Remote [(by @darmiel & @xMasterX)](https://github.com/darmiel/flipper-playlist/tree/feat/unirf-protocols) (original by @ESurge) +- UniversalRF Remix / **Sub-GHz Remote** [(by @darmiel & @xMasterX)](https://github.com/darmiel/flipper-playlist/tree/feat/unirf-protocols) (original by @ESurge) - Spectrum Analyzer (with changes) [(by jolcese)](https://github.com/jolcese/flipperzero-firmware/tree/spectrum/applications/spectrum_analyzer) - [Ultra Narrow mode & scan channels non-consecutively](https://github.com/theY4Kman/flipperzero-firmware/commits?author=theY4Kman) - Metronome [(by panki27)](https://github.com/panki27/Metronome) - DTMF Dolphin [(by litui)](https://github.com/litui/dtmf_dolphin) @@ -122,9 +122,9 @@ You can support us by using links or addresses below: - Temperature Sensor Plugin - HTU2xD, SHT2x, SI702x, SI700x, SI701x, AM2320 [(by Mywk)](https://github.com/Mywk/FlipperTemperatureSensor) - [How to Connect](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/applications/plugins/htu21d_temp_sensor/Readme.md) - HC-SR04 Distance sensor - Ported and modified by @xMasterX [(original by Sanqui)](https://github.com/Sanqui/flipperzero-firmware/tree/hc_sr04) - How to connect -> (5V -> VCC) / (GND -> GND) / (13|TX -> Trig) / (14|RX -> Echo) - Morse Code [(by wh00hw)](https://github.com/wh00hw/MorseCodeFAP) -- (UniTemp) Temp sensor reader [(by quen0n)](https://github.com/quen0n/unitemp-flipperzero) +- **Unitemp - Temperature sensors reader** (DHT11/22, DS18B20, BMP280, HTU21x and more) [(by quen0n)](https://github.com/quen0n/unitemp-flipperzero) - BH1750 - Lightmeter [(by oleksiikutuzov)](https://github.com/oleksiikutuzov/flipperzero-lightmeter) -- iButton Fuzzer [(by xMasterX)](https://github.com/xMasterX/ibutton-fuzzer) +- **iButton Fuzzer** [(by xMasterX)](https://github.com/xMasterX/ibutton-fuzzer) - HEX Viewer [(by QtRoS)](https://github.com/QtRoS/flipper-zero-hex-viewer) - POCSAG Pager [(by xMasterX & Shmuma)](https://github.com/xMasterX/flipper-pager) @@ -181,9 +181,7 @@ Games: ## [- How to use: Temperature Sensor Plugin - HTU21D / SI7021](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/applications/plugins/htu21d_temp_sensor/Readme.md) -## [- How to use: DHT11/22 Temp. Sensor Monitor](https://github.com/quen0n/FipperZero-DHT-Monitor#readme) - -## [- How to use: AM2320/AM2321 Temp. Sensor plugin](https://github.com/xMasterX/AM2320_Flipper_Plugin) +## [- How to use: Unitemp - Temperature sensors reader](https://github.com/quen0n/unitemp-flipperzero#readme) ## [- How to use: [NMEA] GPS](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/applications/plugins/gps_nmea_uart/README.md) From bc99538ca82cee08260a4fb589de0693798e217a Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sat, 7 Jan 2023 18:42:38 +0300 Subject: [PATCH 047/506] Update UniTemp https://github.com/quen0n/unitemp-flipperzero --- applications/plugins/unitemp/README.md | 4 +- applications/plugins/unitemp/Sensors.c | 34 ++---- applications/plugins/unitemp/Sensors.h | 2 + .../unitemp/interfaces/OneWireSensor.c | 29 ++--- applications/plugins/unitemp/sensors/BMP180.c | 6 +- applications/plugins/unitemp/sensors/BMx280.c | 17 +-- .../plugins/unitemp/sensors/HDC1080.c | 94 ++++++++++++++++ .../plugins/unitemp/sensors/HDC1080.h | 62 +++++++++++ applications/plugins/unitemp/sensors/HTU21x.c | 105 ++++++++++++++++++ applications/plugins/unitemp/sensors/HTU21x.h | 62 +++++++++++ .../plugins/unitemp/sensors/Sensors.xlsx | Bin 12336 -> 12455 bytes applications/plugins/unitemp/unitemp.c | 4 +- applications/plugins/unitemp/unitemp.h | 12 +- .../plugins/unitemp/views/SensorEdit_view.c | 16 +-- 14 files changed, 368 insertions(+), 79 deletions(-) create mode 100644 applications/plugins/unitemp/sensors/HDC1080.c create mode 100644 applications/plugins/unitemp/sensors/HDC1080.h create mode 100644 applications/plugins/unitemp/sensors/HTU21x.c create mode 100644 applications/plugins/unitemp/sensors/HTU21x.h diff --git a/applications/plugins/unitemp/README.md b/applications/plugins/unitemp/README.md index 80a296e9b..817f6f481 100644 --- a/applications/plugins/unitemp/README.md +++ b/applications/plugins/unitemp/README.md @@ -3,9 +3,9 @@ [![GitHub release](https://img.shields.io/github/release/quen0n/unitemp-flipperzero?include_prereleases=&sort=semver&color=blue)](https://github.com/quen0n/unitemp-flipperzero/releases/) [![GitHub](https://img.shields.io/github/license/quen0n/unitemp-flipperzero)](https://github.com/quen0n/unitemp-flipperzero/blob/dev/LICENSE.md) [![Build dev](https://github.com/quen0n/unitemp-flipperzero/actions/workflows/build_dev.yml/badge.svg?branch=dev)](https://github.com/quen0n/unitemp-flipperzero/actions/workflows/build_dev.yml) -[Flipper Zero](https://flipperzero.one/) application for reading temperature, humidity and pressure sensors using Onewire, Singlewire, I2C protocols. +[Flipper Zero](https://flipperzero.one/) application for reading temperature, humidity and pressure sensors like a DHT11/22, DS18B20, BMP280, HTU21 and more. ## List of supported sensors (supplemented) -![image](https://user-images.githubusercontent.com/10090793/210119924-51119deb-f950-40ee-bc27-22b971243527.png) +![image](https://user-images.githubusercontent.com/10090793/211131502-c1560eb5-f59c-4cfa-86f7-27f037490a35.png) ## Installation Copy the contents of the repository to the `applications/plugins/unitemp` folder and build the project. Flash FZ along with resources. [More...](https://github.com/flipperdevices/flipperzero-firmware/blob/dev/documentation/fbt.md) ## Some community photos diff --git a/applications/plugins/unitemp/Sensors.c b/applications/plugins/unitemp/Sensors.c index 33f62b201..87a218fe0 100644 --- a/applications/plugins/unitemp/Sensors.c +++ b/applications/plugins/unitemp/Sensors.c @@ -79,10 +79,12 @@ static const SensorType* sensorTypes[] = { &Dallas, &AM2320_SW, &AM2320_I2C, + &HTU21x, &AHT10, &SHT30, &GXHT30, &LM75, + &HDC1080, &BMP180, &BMP280, &BME280}; @@ -281,9 +283,7 @@ void unitemp_sensors_add(Sensor* sensor) { } bool unitemp_sensors_load(void) { -#ifdef UNITEMP_DEBUG - FURI_LOG_D(APP_NAME, "Loading sensors..."); -#endif + UNITEMP_DEBUG("Loading sensors..."); //Выделение памяти на поток app->file_stream = file_stream_alloc(app->storage); @@ -392,9 +392,7 @@ bool unitemp_sensors_load(void) { } bool unitemp_sensors_save(void) { -#ifdef UNITEMP_DEBUG - FURI_LOG_D(APP_NAME, "Saving sensors..."); -#endif + UNITEMP_DEBUG("Saving sensors..."); //Выделение памяти для потока app->file_stream = file_stream_alloc(app->storage); @@ -540,15 +538,12 @@ void unitemp_sensor_free(Sensor* sensor) { bool status = false; //Высвобождение памяти под инстанс status = sensor->type->interface->mem_releaser(sensor); - UNUSED(status); -#ifdef UNITEMP_DEBUG if(status) { - FURI_LOG_D(APP_NAME, "Sensor %s memory successfully released", sensor->name); + UNITEMP_DEBUG("Sensor %s memory successfully released", sensor->name); } else { FURI_LOG_E(APP_NAME, "Sensor %s memory is not released", sensor->name); } -#endif free(sensor->name); //free(sensor); } @@ -569,9 +564,7 @@ bool unitemp_sensors_init(void) { //Может пропасть при отключении USB if(furi_hal_power_is_otg_enabled() != true) { furi_hal_power_enable_otg(); -#ifdef UNITEMP_DEBUG - FURI_LOG_D(APP_NAME, "OTG enabled"); -#endif + UNITEMP_DEBUG("OTG enabled"); } if(!(*app->sensors[i]->type->initializer)(app->sensors[i])) { FURI_LOG_E( @@ -580,9 +573,7 @@ bool unitemp_sensors_init(void) { app->sensors[i]->name); result = false; } -#ifdef UNITEMP_DEBUG - FURI_LOG_D(APP_NAME, "Sensor %s successfully initialized", app->sensors[i]->name); -#endif + UNITEMP_DEBUG("Sensor %s successfully initialized", app->sensors[i]->name); } app->sensors_ready = true; return result; @@ -593,9 +584,7 @@ bool unitemp_sensors_deInit(void) { //Выключение 5 В если до этого оно не было включено if(app->settings.lastOTGState != true) { furi_hal_power_disable_otg(); -#ifdef UNITEMP_DEBUG - FURI_LOG_D(APP_NAME, "OTG disabled"); -#endif + UNITEMP_DEBUG("OTG disabled"); } //Перебор датчиков из списка @@ -631,10 +620,9 @@ UnitempStatus unitemp_sensor_updateData(Sensor* sensor) { sensor->status = sensor->type->interface->updater(sensor); -#ifdef UNITEMP_DEBUG - if(sensor->status != UT_SENSORSTATUS_OK && sensor->status != UT_SENSORSTATUS_POLLING) - FURI_LOG_D(APP_NAME, "Sensor %s update status %d", sensor->name, sensor->status); -#endif + if(sensor->status != UT_SENSORSTATUS_OK && sensor->status != UT_SENSORSTATUS_POLLING) { + UNITEMP_DEBUG("Sensor %s update status %d", sensor->name, sensor->status); + } if(app->settings.temp_unit == UT_TEMP_FAHRENHEIT && sensor->status == UT_SENSORSTATUS_OK) uintemp_celsiumToFarengate(sensor); diff --git a/applications/plugins/unitemp/Sensors.h b/applications/plugins/unitemp/Sensors.h index 2193ce466..fcbb395fa 100644 --- a/applications/plugins/unitemp/Sensors.h +++ b/applications/plugins/unitemp/Sensors.h @@ -324,4 +324,6 @@ const GPIO* #include "./sensors/DHT20.h" #include "./sensors/SHT30.h" #include "./sensors/BMP180.h" +#include "./sensors/HTU21x.h" +#include "./sensors/HDC1080.h" #endif diff --git a/applications/plugins/unitemp/interfaces/OneWireSensor.c b/applications/plugins/unitemp/interfaces/OneWireSensor.c index 740ba3365..4d5db5d0e 100644 --- a/applications/plugins/unitemp/interfaces/OneWireSensor.c +++ b/applications/plugins/unitemp/interfaces/OneWireSensor.c @@ -58,9 +58,7 @@ OneWireBus* uintemp_onewire_bus_alloc(const GPIO* gpio) { bus->device_count = 0; bus->gpio = gpio; bus->powerMode = PWR_PASSIVE; -#ifdef UNITEMP_DEBUG - FURI_LOG_D(APP_NAME, "one wire bus (port %d) allocated", gpio->num); -#endif + UNITEMP_DEBUG("one wire bus (port %d) allocated", gpio->num); return bus; } @@ -84,9 +82,7 @@ bool unitemp_onewire_bus_init(OneWireBus* bus) { return true; } bool unitemp_onewire_bus_deinit(OneWireBus* bus) { -#ifdef UNITEMP_DEBUG - FURI_LOG_D(APP_NAME, "devices on wire %d: %d", bus->gpio->num, bus->device_count); -#endif + UNITEMP_DEBUG("devices on wire %d: %d", bus->gpio->num, bus->device_count); bus->device_count--; if(bus->device_count <= 0) { bus->device_count = 0; @@ -236,15 +232,11 @@ void unitemp_onewire_bus_enum_init(void) { uint8_t* unitemp_onewire_bus_enum_next(OneWireBus* bus) { furi_delay_ms(10); if(!onewire_enum_fork_bit) { // Если на предыдущем шаге уже не было разногласий -#ifdef UNITEMP_DEBUG - FURI_LOG_D(APP_NAME, "All devices on wire %d is found", unitemp_gpio_toInt(bus->gpio)); -#endif + UNITEMP_DEBUG("All devices on wire %d is found", unitemp_gpio_toInt(bus->gpio)); return 0; // то просто выходим ничего не возвращая } if(!unitemp_onewire_bus_start(bus)) { -#ifdef UNITEMP_DEBUG - FURI_LOG_D(APP_NAME, "Wire %d is empty", unitemp_gpio_toInt(bus->gpio)); -#endif + UNITEMP_DEBUG("Wire %d is empty", unitemp_gpio_toInt(bus->gpio)); return 0; } uint8_t bp = 8; @@ -278,9 +270,8 @@ uint8_t* unitemp_onewire_bus_enum_next(OneWireBus* bus) { if(!not1) { // Присутствует единица next |= 0x80; } else { // Нет ни нулей ни единиц - ошибочная ситуация -#ifdef UNITEMP_DEBUG - FURI_LOG_D(APP_NAME, "Wrong wire %d situation", unitemp_gpio_toInt(bus->gpio)); -#endif + + UNITEMP_DEBUG("Wrong wire %d situation", unitemp_gpio_toInt(bus->gpio)); return 0; } } @@ -421,9 +412,7 @@ UnitempStatus unitemp_onewire_sensor_update(Sensor* sensor) { unitemp_onewire_bus_send_byte(instance->bus, 0xBE); // Read Scratch-pad unitemp_onewire_bus_read_byteArray(instance->bus, buff, 9); if(!unitemp_onewire_CRC_check(buff, 9)) { -#ifdef UNITEMP_DEBUG - FURI_LOG_D(APP_NAME, "Sensor %s is not found", sensor->name); -#endif + UNITEMP_DEBUG("Sensor %s is not found", sensor->name); return UT_SENSORSTATUS_TIMEOUT; } } @@ -462,9 +451,7 @@ UnitempStatus unitemp_onewire_sensor_update(Sensor* sensor) { unitemp_onewire_bus_send_byte(instance->bus, 0xBE); // Read Scratch-pad unitemp_onewire_bus_read_byteArray(instance->bus, buff, 9); if(!unitemp_onewire_CRC_check(buff, 9)) { -#ifdef UNITEMP_DEBUG - FURI_LOG_D(APP_NAME, "Failed CRC check: %s", sensor->name); -#endif + UNITEMP_DEBUG("Failed CRC check: %s", sensor->name); return UT_SENSORSTATUS_BADCRC; } int16_t raw = buff[0] | ((int16_t)buff[1] << 8); diff --git a/applications/plugins/unitemp/sensors/BMP180.c b/applications/plugins/unitemp/sensors/BMP180.c index 6fd5f2fa5..d17e78c09 100644 --- a/applications/plugins/unitemp/sensors/BMP180.c +++ b/applications/plugins/unitemp/sensors/BMP180.c @@ -101,9 +101,8 @@ bool unitemp_BMP180_init(Sensor* sensor) { bmp180_instance->bmp180_cal.MC = (buff[18] << 8) | buff[19]; bmp180_instance->bmp180_cal.MD = (buff[20] << 8) | buff[21]; -#ifdef UNITEMP_DEBUG - FURI_LOG_D( - APP_NAME, + +UNITEMP_DEBUG( "Sensor BMP180 (0x%02X) calibration values: %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d", i2c_sensor->currentI2CAdr, bmp180_instance->bmp180_cal.AC1, @@ -117,7 +116,6 @@ bool unitemp_BMP180_init(Sensor* sensor) { bmp180_instance->bmp180_cal.MB, bmp180_instance->bmp180_cal.MC, bmp180_instance->bmp180_cal.MD); -#endif return true; } diff --git a/applications/plugins/unitemp/sensors/BMx280.c b/applications/plugins/unitemp/sensors/BMx280.c index a64daaa1d..d572f09c3 100644 --- a/applications/plugins/unitemp/sensors/BMx280.c +++ b/applications/plugins/unitemp/sensors/BMx280.c @@ -180,22 +180,19 @@ static bool bmx280_readCalValues(I2CSensor* i2c_sensor) { if(!unitemp_i2c_readRegArray( i2c_sensor, TEMP_CAL_START_ADDR, 6, (uint8_t*)&bmx280_instance->temp_cal)) return false; -#ifdef UNITEMP_DEBUG - FURI_LOG_D( - APP_NAME, + + UNITEMP_DEBUG( "Sensor BMx280 (0x%02X) T1-T3: %d, %d, %d", i2c_sensor->currentI2CAdr, bmx280_instance->temp_cal.dig_T1, bmx280_instance->temp_cal.dig_T2, bmx280_instance->temp_cal.dig_T3); -#endif if(!unitemp_i2c_readRegArray( i2c_sensor, PRESS_CAL_START_ADDR, 18, (uint8_t*)&bmx280_instance->press_cal)) return false; -#ifdef UNITEMP_DEBUG - FURI_LOG_D( - APP_NAME, + + UNITEMP_DEBUG( "Sensor BMx280 (0x%02X): P1-P9: %d, %d, %d, %d, %d, %d, %d, %d, %d", i2c_sensor->currentI2CAdr, bmx280_instance->press_cal.dig_P1, @@ -207,7 +204,6 @@ static bool bmx280_readCalValues(I2CSensor* i2c_sensor) { bmx280_instance->press_cal.dig_P7, bmx280_instance->press_cal.dig_P8, bmx280_instance->press_cal.dig_P9); -#endif if(bmx280_instance->chip_id == BME280_ID) { uint8_t buff[7] = {0}; @@ -221,9 +217,7 @@ static bool bmx280_readCalValues(I2CSensor* i2c_sensor) { bmx280_instance->hum_cal.dig_H5 = (buff[4] & 0x0F) | ((int16_t)buff[5] << 4); bmx280_instance->hum_cal.dig_H6 = buff[6]; -#ifdef UNITEMP_DEBUG - FURI_LOG_D( - APP_NAME, + UNITEMP_DEBUG( "Sensor BMx280 (0x%02X): H1-H6: %d, %d, %d, %d, %d, %d", i2c_sensor->currentI2CAdr, bmx280_instance->hum_cal.dig_H1, @@ -232,7 +226,6 @@ static bool bmx280_readCalValues(I2CSensor* i2c_sensor) { bmx280_instance->hum_cal.dig_H4, bmx280_instance->hum_cal.dig_H5, bmx280_instance->hum_cal.dig_H6); -#endif } bmx280_instance->last_cal_update_time = furi_get_tick(); diff --git a/applications/plugins/unitemp/sensors/HDC1080.c b/applications/plugins/unitemp/sensors/HDC1080.c new file mode 100644 index 000000000..5f2c59b24 --- /dev/null +++ b/applications/plugins/unitemp/sensors/HDC1080.c @@ -0,0 +1,94 @@ +/* + Unitemp - Universal temperature reader + Copyright (C) 2023 Victor Nikitchuk (https://github.com/quen0n) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +#include "HDC1080.h" +#include "../interfaces/I2CSensor.h" + +const SensorType HDC1080 = { + .typename = "HDC1080", + .interface = &I2C, + .datatype = UT_DATA_TYPE_TEMP_HUM, + .pollingInterval = 250, + .allocator = unitemp_HDC1080_alloc, + .mem_releaser = unitemp_HDC1080_free, + .initializer = unitemp_HDC1080_init, + .deinitializer = unitemp_HDC1080_deinit, + .updater = unitemp_HDC1080_update}; + +bool unitemp_HDC1080_alloc(Sensor* sensor, char* args) { + UNUSED(args); + I2CSensor* i2c_sensor = (I2CSensor*)sensor->instance; + + //Адреса на шине I2C (7 бит) + i2c_sensor->minI2CAdr = 0x40 << 1; + i2c_sensor->maxI2CAdr = 0x40 << 1; + return true; +} + +bool unitemp_HDC1080_free(Sensor* sensor) { + //Нечего высвобождать, так как ничего не было выделено + UNUSED(sensor); + return true; +} + +bool unitemp_HDC1080_init(Sensor* sensor) { + I2CSensor* i2c_sensor = (I2CSensor*)sensor->instance; + + uint8_t data[2]; + if(!unitemp_i2c_readRegArray(i2c_sensor, 0xFF, 2, data)) return UT_SENSORSTATUS_TIMEOUT; + uint16_t device_id = ((uint16_t)data[0] << 8) | data[1]; + if(device_id != 0x1050) { + FURI_LOG_E( + APP_NAME, + "Sensor %s returned wrong ID 0x%02X, expected 0x1050", + sensor->name, + device_id); + return false; + } + data[0] = 0b0001000; + data[1] = 0; + //Установка режима работы и разрядности измерений + if(!unitemp_i2c_writeRegArray(i2c_sensor, 0x02, 2, data)) return UT_SENSORSTATUS_TIMEOUT; + + return true; +} + +bool unitemp_HDC1080_deinit(Sensor* sensor) { + I2CSensor* i2c_sensor = (I2CSensor*)sensor->instance; + UNUSED(i2c_sensor); + return true; +} + +UnitempStatus unitemp_HDC1080_update(Sensor* sensor) { + I2CSensor* i2c_sensor = (I2CSensor*)sensor->instance; + + uint8_t data[2] = {0}; + //Запуск измерения + if(!unitemp_i2c_writeArray(i2c_sensor, 1, data)) return UT_SENSORSTATUS_TIMEOUT; + furi_delay_ms(10); + if(!unitemp_i2c_readArray(i2c_sensor, 2, data)) return UT_SENSORSTATUS_TIMEOUT; + + sensor->temp = ((float)(((uint16_t)data[0] << 8) | data[1]) / 65536) * 165 - 40; + + data[0] = 1; + if(!unitemp_i2c_writeArray(i2c_sensor, 1, data)) return UT_SENSORSTATUS_TIMEOUT; + furi_delay_ms(10); + if(!unitemp_i2c_readArray(i2c_sensor, 2, data)) return UT_SENSORSTATUS_TIMEOUT; + sensor->hum = ((float)(((uint16_t)data[0] << 8) | data[1]) / 65536) * 100; + + return UT_SENSORSTATUS_OK; +} diff --git a/applications/plugins/unitemp/sensors/HDC1080.h b/applications/plugins/unitemp/sensors/HDC1080.h new file mode 100644 index 000000000..59ba0673c --- /dev/null +++ b/applications/plugins/unitemp/sensors/HDC1080.h @@ -0,0 +1,62 @@ +/* + Unitemp - Universal temperature reader + Copyright (C) 2023 Victor Nikitchuk (https://github.com/quen0n) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +#ifndef UNITEMP_HDC1080 +#define UNITEMP_HDC1080 + +#include "../unitemp.h" +#include "../Sensors.h" +extern const SensorType HDC1080; +/** + * @brief Выделение памяти и установка начальных значений датчика HDC1080 + * + * @param sensor Указатель на создаваемый датчик + * @return Истина при успехе + */ +bool unitemp_HDC1080_alloc(Sensor* sensor, char* args); + +/** + * @brief Инициализации датчика HDC1080 + * + * @param sensor Указатель на датчик + * @return Истина если инициализация упспешная + */ +bool unitemp_HDC1080_init(Sensor* sensor); + +/** + * @brief Деинициализация датчика + * + * @param sensor Указатель на датчик + */ +bool unitemp_HDC1080_deinit(Sensor* sensor); + +/** + * @brief Обновление значений из датчика + * + * @param sensor Указатель на датчик + * @return Статус обновления + */ +UnitempStatus unitemp_HDC1080_update(Sensor* sensor); + +/** + * @brief Высвободить память датчика + * + * @param sensor Указатель на датчик + */ +bool unitemp_HDC1080_free(Sensor* sensor); + +#endif \ No newline at end of file diff --git a/applications/plugins/unitemp/sensors/HTU21x.c b/applications/plugins/unitemp/sensors/HTU21x.c new file mode 100644 index 000000000..74fc47d5d --- /dev/null +++ b/applications/plugins/unitemp/sensors/HTU21x.c @@ -0,0 +1,105 @@ +/* + Unitemp - Universal temperature reader + Copyright (C) 2023 Victor Nikitchuk (https://github.com/quen0n) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +#include "HTU21x.h" +#include "../interfaces/I2CSensor.h" + +const SensorType HTU21x = { + .typename = "HTU21x", + .interface = &I2C, + .datatype = UT_DATA_TYPE_TEMP_HUM, + .pollingInterval = 250, + .allocator = unitemp_HTU21x_alloc, + .mem_releaser = unitemp_HTU21x_free, + .initializer = unitemp_HTU21x_init, + .deinitializer = unitemp_HTU21x_deinit, + .updater = unitemp_HTU21x_update}; + +static uint8_t checkCRC(uint16_t data) { + for(uint8_t i = 0; i < 16; i++) { + if(data & 0x8000) + data = (data << 1) ^ 0x13100; + else + data <<= 1; + } + return (data >> 8); +} + +bool unitemp_HTU21x_alloc(Sensor* sensor, char* args) { + UNUSED(args); + I2CSensor* i2c_sensor = (I2CSensor*)sensor->instance; + + //Адреса на шине I2C (7 бит) + i2c_sensor->minI2CAdr = 0x40 << 1; + i2c_sensor->maxI2CAdr = 0x40 << 1; + return true; +} + +bool unitemp_HTU21x_free(Sensor* sensor) { + //Нечего высвобождать, так как ничего не было выделено + UNUSED(sensor); + return true; +} + +bool unitemp_HTU21x_init(Sensor* sensor) { + I2CSensor* i2c_sensor = (I2CSensor*)sensor->instance; + + UNUSED(i2c_sensor); + return true; +} + +bool unitemp_HTU21x_deinit(Sensor* sensor) { + I2CSensor* i2c_sensor = (I2CSensor*)sensor->instance; + UNUSED(i2c_sensor); + return true; +} + +UnitempStatus unitemp_HTU21x_update(Sensor* sensor) { + I2CSensor* i2c_sensor = (I2CSensor*)sensor->instance; + + //Датчик может быть всего один, так что норм + static bool temp_hum = false; + + uint8_t data[3]; + + if(sensor->status == UT_SENSORSTATUS_POLLING) { + if(!unitemp_i2c_readArray(i2c_sensor, 3, data)) return UT_SENSORSTATUS_TIMEOUT; + + uint16_t raw = ((uint16_t)data[0] << 8) | data[1]; + if(checkCRC(raw) != data[2]) return UT_SENSORSTATUS_BADCRC; + + if(temp_hum) { + sensor->temp = (0.002681f * raw - 46.85f); + } else { + sensor->hum = ((0.001907 * (raw ^ 0x02)) - 6); + } + temp_hum = !temp_hum; + return UT_SENSORSTATUS_OK; + } + + if(temp_hum) { + //Запрос температуры + data[0] = 0xF3; + if(!unitemp_i2c_writeArray(i2c_sensor, 1, data)) return UT_SENSORSTATUS_TIMEOUT; + } else { + //Запрос влажности + data[0] = 0xF5; + if(!unitemp_i2c_writeArray(i2c_sensor, 1, data)) return UT_SENSORSTATUS_TIMEOUT; + } + + return UT_SENSORSTATUS_POLLING; +} diff --git a/applications/plugins/unitemp/sensors/HTU21x.h b/applications/plugins/unitemp/sensors/HTU21x.h new file mode 100644 index 000000000..ffe062a24 --- /dev/null +++ b/applications/plugins/unitemp/sensors/HTU21x.h @@ -0,0 +1,62 @@ +/* + Unitemp - Universal temperature reader + Copyright (C) 2023 Victor Nikitchuk (https://github.com/quen0n) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +#ifndef UNITEMP_HTU21x +#define UNITEMP_HTU21x + +#include "../unitemp.h" +#include "../Sensors.h" +extern const SensorType HTU21x; +/** + * @brief Выделение памяти и установка начальных значений датчика HTU21x + * + * @param sensor Указатель на создаваемый датчик + * @return Истина при успехе + */ +bool unitemp_HTU21x_alloc(Sensor* sensor, char* args); + +/** + * @brief Инициализации датчика HTU21x + * + * @param sensor Указатель на датчик + * @return Истина если инициализация упспешная + */ +bool unitemp_HTU21x_init(Sensor* sensor); + +/** + * @brief Деинициализация датчика + * + * @param sensor Указатель на датчик + */ +bool unitemp_HTU21x_deinit(Sensor* sensor); + +/** + * @brief Обновление значений из датчика + * + * @param sensor Указатель на датчик + * @return Статус обновления + */ +UnitempStatus unitemp_HTU21x_update(Sensor* sensor); + +/** + * @brief Высвободить память датчика + * + * @param sensor Указатель на датчик + */ +bool unitemp_HTU21x_free(Sensor* sensor); + +#endif \ No newline at end of file diff --git a/applications/plugins/unitemp/sensors/Sensors.xlsx b/applications/plugins/unitemp/sensors/Sensors.xlsx index 9983aeb6ea1201003aa27a9ca54218e19e5f20c7..bd47d4948316b9b3797bc4a39106149a3724db2a 100644 GIT binary patch delta 4348 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 NI5&y=O=biD{11nn_*nn| delta 4251 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 DMKjj{ diff --git a/applications/plugins/unitemp/unitemp.c b/applications/plugins/unitemp/unitemp.c index 9ff108395..31ab057d6 100644 --- a/applications/plugins/unitemp/unitemp.c +++ b/applications/plugins/unitemp/unitemp.c @@ -78,9 +78,7 @@ bool unitemp_saveSettings(void) { } bool unitemp_loadSettings(void) { -#ifdef UNITEMP_DEBUG - FURI_LOG_D(APP_NAME, "Loading settings..."); -#endif + UNITEMP_DEBUG("Loading settings..."); //Выделение памяти на поток app->file_stream = file_stream_alloc(app->storage); diff --git a/applications/plugins/unitemp/unitemp.h b/applications/plugins/unitemp/unitemp.h index 144780968..5947a3e3c 100644 --- a/applications/plugins/unitemp/unitemp.h +++ b/applications/plugins/unitemp/unitemp.h @@ -39,19 +39,25 @@ /* Объявление макроподстановок */ //Имя приложения #define APP_NAME "Unitemp" +//Версия приложения +#define UNITEMP_APP_VER "1.1" //Путь хранения файлов плагина #define APP_PATH_FOLDER "/ext/unitemp" //Имя файла с настройками #define APP_FILENAME_SETTINGS "settings.cfg" //Имя файла с датчиками #define APP_FILENAME_SENSORS "sensors.cfg" -//Версия приложения -#define UNITEMP_APP_VER "1.0" //Размер буффера текста #define BUFF_SIZE 32 -#define UNITEMP_DEBUG +#define UNITEMP_D + +#ifdef FURI_DEBUG +#define UNITEMP_DEBUG(msg, ...) FURI_LOG_D(APP_NAME, msg, ##__VA_ARGS__) +#else +#define UNITEMP_DEBUG(msg, ...) +#endif /* Объявление перечислений */ //Единицы измерения температуры diff --git a/applications/plugins/unitemp/views/SensorEdit_view.c b/applications/plugins/unitemp/views/SensorEdit_view.c index d1660bc2e..f1de4ff11 100644 --- a/applications/plugins/unitemp/views/SensorEdit_view.c +++ b/applications/plugins/unitemp/views/SensorEdit_view.c @@ -63,13 +63,9 @@ bool _onewire_id_exist(uint8_t* id) { static void _onewire_scan(void) { OneWireSensor* ow_sensor = editable_sensor->instance; -#ifdef UNITEMP_DEBUG - FURI_LOG_D( - APP_NAME, - "devices on wire %d: %d", - ow_sensor->bus->gpio->num, - ow_sensor->bus->device_count); -#endif + + UNITEMP_DEBUG( + "devices on wire %d: %d", ow_sensor->bus->gpio->num, ow_sensor->bus->device_count); //Сканирование шины one wire unitemp_onewire_bus_init(ow_sensor->bus); @@ -101,9 +97,8 @@ static void _onewire_scan(void) { memcpy(ow_sensor->deviceID, id, 8); ow_sensor->familyCode = id[0]; -#ifdef UNITEMP_DEBUG - FURI_LOG_D( - APP_NAME, + + UNITEMP_DEBUG( "Found sensor's ID: %02X%02X%02X%02X%02X%02X%02X%02X", id[0], id[1], @@ -113,7 +108,6 @@ static void _onewire_scan(void) { id[5], id[6], id[7]); -#endif if(ow_sensor->familyCode != 0) { char id_buff[10]; From 797ddc0755e791ecd5d854de18a083c4d0bfb61b Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sat, 7 Jan 2023 20:05:37 +0300 Subject: [PATCH 048/506] Update Unitemp and remove old temp sensor app, unitemp now supports all sensors from that app --- ReadMe.md | 3 - .../plugins/htu21d_temp_sensor/Readme.md | 17 - .../htu21d_temp_sensor/application.fam | 14 - .../plugins/htu21d_temp_sensor/docs/App.png | Bin 2077 -> 0 bytes .../htu21d_temp_sensor/docs/Connection.png | Bin 280790 -> 0 bytes .../htu21d_temp_sensor/docs/Flipper.png | Bin 936112 -> 0 bytes .../htu21d_temp_sensor/temperature_sensor.c | 387 ------------------ .../htu21d_temp_sensor/temperature_sensor.png | Bin 181 -> 0 bytes applications/plugins/unitemp/sensors/HTU21x.c | 3 +- applications/plugins/unitemp/unitemp.h | 2 +- 10 files changed, 3 insertions(+), 423 deletions(-) delete mode 100644 applications/plugins/htu21d_temp_sensor/Readme.md delete mode 100644 applications/plugins/htu21d_temp_sensor/application.fam delete mode 100644 applications/plugins/htu21d_temp_sensor/docs/App.png delete mode 100644 applications/plugins/htu21d_temp_sensor/docs/Connection.png delete mode 100644 applications/plugins/htu21d_temp_sensor/docs/Flipper.png delete mode 100644 applications/plugins/htu21d_temp_sensor/temperature_sensor.c delete mode 100644 applications/plugins/htu21d_temp_sensor/temperature_sensor.png diff --git a/ReadMe.md b/ReadMe.md index d81fbf48b..88326c922 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -119,7 +119,6 @@ You can support us by using links or addresses below: - **TOTP (Authenticator)** [(by akopachov)](https://github.com/akopachov/flipper-zero_authenticator) - GPS [(by ezod)](https://github.com/ezod/flipperzero-gps) works with module `NMEA 0183` via UART (13TX, 14RX, GND pins on Flipper) - i2c Tools [(by NaejEL)](https://github.com/NaejEL/flipperzero-i2ctools) - C0 -> SCL / C1 -> SDA / GND -> GND | 3v3 logic levels only! -- Temperature Sensor Plugin - HTU2xD, SHT2x, SI702x, SI700x, SI701x, AM2320 [(by Mywk)](https://github.com/Mywk/FlipperTemperatureSensor) - [How to Connect](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/applications/plugins/htu21d_temp_sensor/Readme.md) - HC-SR04 Distance sensor - Ported and modified by @xMasterX [(original by Sanqui)](https://github.com/Sanqui/flipperzero-firmware/tree/hc_sr04) - How to connect -> (5V -> VCC) / (GND -> GND) / (13|TX -> Trig) / (14|RX -> Echo) - Morse Code [(by wh00hw)](https://github.com/wh00hw/MorseCodeFAP) - **Unitemp - Temperature sensors reader** (DHT11/22, DS18B20, BMP280, HTU21x and more) [(by quen0n)](https://github.com/quen0n/unitemp-flipperzero) @@ -179,8 +178,6 @@ Games: ### **Plugins that works with external hardware** -## [- How to use: Temperature Sensor Plugin - HTU21D / SI7021](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/applications/plugins/htu21d_temp_sensor/Readme.md) - ## [- How to use: Unitemp - Temperature sensors reader](https://github.com/quen0n/unitemp-flipperzero#readme) ## [- How to use: [NMEA] GPS](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/applications/plugins/gps_nmea_uart/README.md) diff --git a/applications/plugins/htu21d_temp_sensor/Readme.md b/applications/plugins/htu21d_temp_sensor/Readme.md deleted file mode 100644 index 0311294ea..000000000 --- a/applications/plugins/htu21d_temp_sensor/Readme.md +++ /dev/null @@ -1,17 +0,0 @@ -# Flipper Temperature Sensor - HTU21D / SI7021 - -[Original link](https://github.com/Mywk/FlipperTemperatureSensor) - -## What is this? - -A small app for the [Flipper Zero](https://flipperzero.one) that reads the [I2C](https://en.wikipedia.org/wiki/I%C2%B2C) signal from a HTU21D or Si7021 sensor and displays the current temperature and humidity. - -I'm using a [Sparkfun HTU21D sensor](https://learn.sparkfun.com/tutorials/htu21d-humidity-sensor-hookup-guide), also tested with a clone and with the Si7021 variant. - -![Flipper Temperature Sensor](docs/Flipper.png) - -![App](docs/App.png) - -## How to Connect the sensor -![Connection](docs/Connection.png) - diff --git a/applications/plugins/htu21d_temp_sensor/application.fam b/applications/plugins/htu21d_temp_sensor/application.fam deleted file mode 100644 index 0158be2ac..000000000 --- a/applications/plugins/htu21d_temp_sensor/application.fam +++ /dev/null @@ -1,14 +0,0 @@ -App( - appid="temperature_sensor", - name="[HTU/+] Temp. Sensor", - apptype=FlipperAppType.EXTERNAL, - entry_point="temperature_sensor_app", - cdefines=["APP_TEMPERATURE_SENSOR"], - requires=[ - "gui", - ], - stack_size=2 * 1024, - order=90, - fap_icon="temperature_sensor.png", - fap_category="GPIO", -) diff --git a/applications/plugins/htu21d_temp_sensor/docs/App.png b/applications/plugins/htu21d_temp_sensor/docs/App.png deleted file mode 100644 index a0373bdbd581e94055f5c425a7e454f281e0cf05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2077 zcmbtVYfO_@7(V49w@A$#CIZ5;3m^+BGQa|DK?KAx5Un5-EDi+& z+}d*4C=^OHLJQ>@6wPL#5Ghr;ZiTiKq}(f|w1cVPlV2wL@#TCc=RNOv-sgGGbACPR z>$O+kSRVke*ZcITa{y>;{lb9m_Hbq?=-Aev7k@ek4}js5?GIM?t)U43Iy~=FZkUwv zH)C#jBPaH04_9(PqT#?3rz&6QR(-OAs*OSP`j&UV33 z%>dx-1E5k1xLU!$zB2$2KYKT=jbo_aDuiNO);K4wLcGcl6g2#y0d&6s;G`bNKHG=L)~{DA@jb#dVDz!&!c(6x8bd4Ok>z4%&w#S1MT+<;S@veMF47y{Y-_`HWy z{dZB@aDxma=<;EM@j6<5R}`swe;!S2THvX@Ljf12>?IM@Qd`*^LFS@z%p87@1KA&n z);Y#0`hGS!9rF|3Gf~a?=Ou-;)=yt7XW<6iA$d?MU&4;py(j2B%nyA1&*>1GrUM+; z{}V|yOO=&*X)I%Q#Eg1n>RRvk+FiZk!=%>nBtF&DK@xR_Ta4`*dDLf;&$ogw9PFS| zFzTf##VE%X*b+y`ic^|R#b9D!+PufLP=k<%n?+<nSz?@AHUk0Ngj@4I6N{FSo0^^N@CVhq{=KP zw_E!bq(n-@?c^~g+4M2GZ}iqli;oZ)PKGi&2!hSmf7%jLA^Indns#$Je>;=%V#JxG zM!w2dme|vJy_!rFT3hC>6K%O?VLKfTN506^o4vJ+z{7K$)@8pyp(mSzZc=Qy`MI5V zD?HHjou7vBIE%7dkk~|qc7o7J05W_bvb(^+p3#Ad zGiQeO(9gjW>OzPDp?Gt!fc5iJ530>-s6kSn^=mSts)dvDN~<;)G@x63TO=5|}Xz_ZbrIx);u8`7T~5h~kcmFwOlIjqTtmctN%v_@~{e6Otih^i@ip)aO8bocsP zNH~pVnfbgFjr28vFCd_KGYu!3C@CK1>L!BLIJ5<~-6)D5?8+ys55H_+Yc^Ct$~RZ^ z4lwO?gy~O6ki#HWzsvczr+)>zg33>h-jz#=oke%5-XfYRr^Nd0X7$)S_toM!7YnAwx12GPS=8ubGHKO|qv5)SzcG#B|+{ zj@)vrV|bgj^E^=eDuSnCVM5rQcvP79Z6vGp9%4@t#6@c11kY?Ah-dA33|5aa`(b#v Te6DQky$9YNzNZ>bhTZ%Ztgt4n diff --git a/applications/plugins/htu21d_temp_sensor/docs/Connection.png b/applications/plugins/htu21d_temp_sensor/docs/Connection.png deleted file mode 100644 index b38f5c2504ec55b7e16de12006368c77caf2eeea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 280790 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ⅇ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�pbq1(mWF#|&*Fi&J?RS~odw72ixzI*c~=Xn?r zP{D+GBue9ce?GnB=|Y5nD57AHI6XaGK74q*WI)D5;XSF**hC%-gKD~IpUU+w-lvoR za%=kHmJHm4+^gY{N2^D}OgSi^t3jcyp-O-8_ddjy`B{i_jj(43Kn5_5BQcAehg8+W zHA6+!A6z7=WA91zSjYqrIC{D4j&JiNF zIeO8fu&{IOc3ZM;%C_{76)_M@gU}kVc#-=}(h;hnw?EJX)QP_OeyJd(lNJJnbM!{F7h`NpYT7MII3 z49Po_-7cAtH+w6|nHNNqz=uU9E%;a!h?08=YP>|_v*CWfud+r(1|%cotTWcIscq;R zGmGRVU2Tiel#-4oTq65#Bm%8u2{{A`J!#%SkBcj3vB0!nN1GeN$KY9?jQg0AM-5d^V5f)et7!ys47`>97n8`Xl%~C z4gfVkyPVH1`A#X_-rT6>?wMDde+Zp52oVik{%wRr$RcVYhnry-QkE<#(G5FK*+24} zeMY8gIP$n~fdLFOXHbJVU(V;V8kj++EZS}%t}0-?V_cpHglIjjdn+X>pDA4Nc*MJd z>*g?LL3B}i)ivO%!tQJy9pvWfZMZdSbu7@UoSVqe-DU%pF9uUt%1UvdapBOFboBvv zHhGhFzrTBX9EWt+!GK~qjJt8SL!xoNd-?dBPfvE9@wA`tTM>5y7|{^Lz$?-Ob1;Jw3lXKR+cRM4EF3ggMV6 z?a!CXk3YQ^fDs9RAWBx+SyWK2R;^r)izi>w`f$V>Yy#4_Qhn$4*)==9 zy(qgh2VGgDA(q|XoypYx2!pMUY$yVq|&`&AOYFzap@NPtWgj5rw%?r20c zLQtfHJ5zXidcHrYAb_Bo8!P$BiV@9^4lqzb^53jHd1c92G9UurY-*~+Tw4R@bX$dq z*h0sFhRG=^LBa|gspTA~33_(-k}_;2Ex#+^pnL&kztp;PPya3hCX8Ht!DX~$9%9bT z=jIPbYQD~^a;u&SlwEbXsKuoLY!*F zqA0RAwmo5YfX8YuBFeU7tgQmBn{IR}){Zz5p&$#-u!1L+23rjP5+h_&l|0YWI1VmN zxm-@mu%}#YS|_q1;*}zpY0hQ#Uz2T{OoGjv<|Ww|6rg4c;Li6gDJ2C##KbHbQ=6E1 z5Yb^69EHf70Bjt~g3b{gK53f0P}ZUjuX-LtB(8}Q75cfdW|g9!Q8b&)YQ~tFZm_#* zu{H^cl$W(=o`&1Cyr8v@>GevyXMC(5d=9(xNXgUZ!!(Uxo^Gkmp8M5p6sYe_@>b&#{g4?Ot%~ z31bf#Ke8>twN$ZTyWPIB{ohr8vX&%Cg@|@isBUZ@I;EEAdd1til6;hCPUsZa?Kh21 z%Lb3xsuvn&H_8ZO9Uo;Czk~#6tjG?>zepl!QQ@vnaE&ybI_4x|mYiEjt?19gmLFhP zIDrg;23koO;uhm|wqseRI4$PiIk_^OWa2O;hv1`Wo}yXYUTX{l}l*qro_i zZ{NQAH~;vr$Ne~+&i5Za{BQrC{|!M+1coA)&GU>cT8CNJ3mmt_o-Y?CHRpN$?DNn6 z!+-c+-oO9h|NKAx_y76yKm2?zQb~li4-9BE1xQ{3q;Y(6IJ|oO`tkn$bb5|%`^urH zI`@^So$9v-1ai@4;^aAI(=?Zxz3Ge)iD;T9A9)fcwd}*}5IJD(jL&nvTrO­ks} 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

%63lk@ifZue`IE9N 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 NgFSLZ32c<={+OEm{Fpu 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 z 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ⅇ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%0AJIc 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 diff --git a/applications/plugins/htu21d_temp_sensor/temperature_sensor.c b/applications/plugins/htu21d_temp_sensor/temperature_sensor.c deleted file mode 100644 index b04e40a7d..000000000 --- a/applications/plugins/htu21d_temp_sensor/temperature_sensor.c +++ /dev/null @@ -1,387 +0,0 @@ -/* Flipper App to read the values from a HTU2XD, SHT2X, SI702X, SI700X, SI701X or AM2320 Sensor */ -/* Created by Mywk - https://github.com/Mywk - https://mywk.net */ -#include -#include -#include -#include - -#include -#include - -#include - -#include - -#define TS_DEFAULT_VALUE 0xFFFF - -#define TS_AVAILABLE_SENSORS 2 - -// HTU2XD, SHT2X, SI702X, SI700X address -#define HTU2XD_SHT2X_SI702X_SI700X_ADDRESS (0x40 << 1) -// SI701X ADDRESS -#define SI701X_ADDRESS (0x41 << 1) - -// HTU2XD, SHT2X, SI702X, SI700X commands -#define HTU21D_CMD_TEMPERATURE 0xE3 -#define HTU21D_CMD_HUMIDITY 0xE5 - -// AM2320 address -#define AM2320_ADDRESS (0x5C << 1) - -// Used for the temperature and humidity buffers -#define DATA_BUFFER_SIZE 8 - -// External I2C BUS -#define I2C_BUS &furi_hal_i2c_handle_external - -// Typedef enums to make everything easier to read - -typedef enum { TSSCmdNone, TSSCmdTemperature, TSSCmdHumidity } TSSCmdType; - -typedef enum { - TSSInitializing, - TSSNoSensor, - TSSPendingUpdate, -} TSStatus; - -typedef enum { - TSEventTypeTick, - TSEventTypeInput, -} TSEventType; - -typedef struct { - TSEventType type; - InputEvent input; -} TSEvent; - -// Possible return values for sensor_cmd -typedef enum { - TSCmdRet_Error, - TSCmdRet_HTU2XD_SHT2X_SI702X_SI700X, - TSCmdRet_SI701X, - TSCmdRet_AM2320, -} TSCmdRet; - -// External NotificationSequence RGB -extern const NotificationSequence sequence_blink_red_100; -extern const NotificationSequence sequence_blink_green_100; -extern const NotificationSequence sequence_blink_blue_100; - -// Current status of the temperature sensor app -static TSStatus temperature_sensor_current_status = TSSInitializing; - -// We keep track of the last cmd return -static TSCmdRet temperature_sensor_last_cmd_ret = TSCmdRet_Error; - -// Temperature and Humidity data buffers, ready to print -char ts_data_buffer_temperature_c[DATA_BUFFER_SIZE]; -char ts_data_buffer_temperature_f[DATA_BUFFER_SIZE]; -char ts_data_buffer_relative_humidity[DATA_BUFFER_SIZE]; -char ts_data_buffer_absolute_humidity[DATA_BUFFER_SIZE]; - -// -// Executes an I2C cmd (trx) -// -// -// CRC -// -// -// true if fetch was successful, false otherwise -// -static TSCmdRet temperature_sensor_cmd(TSSCmdType cmd, uint8_t* buffer) { - uint32_t timeout = furi_ms_to_ticks(100); - TSCmdRet ret = TSCmdRet_Error; - - // Aquire I2C and check if device is ready, then release - furi_hal_i2c_acquire(I2C_BUS); - - // Check if HTU2XD, SHT2X, SI702X, SI700X sensor is available - uint8_t isAddress40 = - furi_hal_i2c_is_device_ready(I2C_BUS, HTU2XD_SHT2X_SI702X_SI700X_ADDRESS, timeout); - uint8_t isAddress41 = 0; - - // Check if SI701X sensor is available if necessary - if(!isAddress40) isAddress41 = furi_hal_i2c_is_device_ready(I2C_BUS, SI701X_ADDRESS, timeout); - - if(isAddress40 || isAddress41) { - uint8_t address = isAddress40 ? HTU2XD_SHT2X_SI702X_SI700X_ADDRESS : SI701X_ADDRESS; - - // Better safe than sorry delay - furi_delay_ms(15); - - // Extra delay for the SI70XX - if(isAddress41) furi_delay_ms(50); - - // Transmit either the temperature or the humidity command depending on TSSCmdType - uint8_t c = (cmd == TSSCmdTemperature) ? HTU21D_CMD_TEMPERATURE : HTU21D_CMD_HUMIDITY; - if(furi_hal_i2c_tx(I2C_BUS, address, &c, 1, timeout)) { - // Receive data (2 bytes) - if(furi_hal_i2c_rx(I2C_BUS, address, buffer, 2, timeout + 50)) - ret = isAddress40 ? TSCmdRet_HTU2XD_SHT2X_SI702X_SI700X : TSCmdRet_SI701X; - } - } else { - // The AM2320 goes to sleep after a period of inactivity, wake it up (check AM2320 datasheet for more info) - furi_hal_i2c_is_device_ready(I2C_BUS, AM2320_ADDRESS, timeout); - furi_delay_ms(30); - - // Check if it's really available - if(furi_hal_i2c_is_device_ready(I2C_BUS, AM2320_ADDRESS, timeout)) { - // {Address, Register, Len} - const uint8_t request[3] = {0x03, 0x00, 0x04}; - - if(furi_hal_i2c_tx(I2C_BUS, AM2320_ADDRESS, request, 3, timeout)) { - // 6 bytes - usually 8 but we currently don't check the CRC - if(furi_hal_i2c_rx(I2C_BUS, (uint8_t)AM2320_ADDRESS, buffer, 6, timeout)) - ret = TSCmdRet_AM2320; - } - } - } - - furi_hal_i2c_release(I2C_BUS); - - temperature_sensor_last_cmd_ret = ret; - return ret; -} - -// -// Fetches temperature and humidity from sensor -// -// -// temperature in C -// humidity in relative humidity -// -// -// Temperature and humidity must be preallocated -// -// -// CRC -// -// -// true if fetch was successful, false otherwise -// -static bool temperature_sensor_fetch_data(double* temperature, double* humidity) { - bool ret = false; - - uint16_t adc_raw; - - uint8_t buffer[DATA_BUFFER_SIZE] = {0x00}; - - // Check if the sensor is the HTU21D by attempting to fetch the temperature - TSCmdRet cmdRet = temperature_sensor_cmd(TSSCmdTemperature, buffer); - if(cmdRet == TSCmdRet_HTU2XD_SHT2X_SI702X_SI700X || cmdRet == TSCmdRet_SI701X) { - // Calculate temperature - adc_raw = ((uint16_t)(buffer[0] << 8) | (buffer[1])); - *temperature = (float)(adc_raw * 175.72 / 65536.00) - 46.85; - - // Fetch humidity - if(temperature_sensor_cmd(TSSCmdHumidity, buffer)) { - // Calculate humidity - adc_raw = ((uint16_t)(buffer[0] << 8) | (buffer[1])); - *humidity = (float)(adc_raw * 125.0 / 65536.00) - 6.0; - - ret = true; - } - } else if(cmdRet == TSCmdRet_AM2320) { - // The AM2320 returns all the data immediately so we just process it all - // Note: CRC isn't currently present in the buffer - - // Temperature - float temp = (((buffer[4] & 0x7F) << 8) + buffer[5]) / 10; - *temperature = ((buffer[4] & 0x80) >> 7) == 1 ? temp * (-1) : temp; - - // Humidity - temp = ((buffer[2] << 8) + buffer[3]) / 10; - *humidity = temp; - - ret = true; - } - - return ret; -} - -// -// Draw callback -// -static void temperature_sensor_draw_callback(Canvas* canvas, void* ctx) { - UNUSED(ctx); - - canvas_clear(canvas); - canvas_set_font(canvas, FontPrimary); - - // Update title accordingly (this could be improved by checking the hardware id) - switch(temperature_sensor_last_cmd_ret) { - case TSCmdRet_Error: - canvas_draw_str(canvas, 2, 10, "Temperature Sensor"); - break; - - case TSCmdRet_HTU2XD_SHT2X_SI702X_SI700X: - canvas_draw_str(canvas, 2, 10, "HTU/SHT/SI70 Sensor"); - break; - - case TSCmdRet_SI701X: - canvas_draw_str(canvas, 2, 10, "SI701X Sensor"); - break; - - case TSCmdRet_AM2320: - canvas_draw_str(canvas, 2, 10, "AM2320 Sensor"); - break; - - default: - break; - } - - canvas_set_font(canvas, FontSecondary); - canvas_draw_str(canvas, 2, 62, "Press back to exit."); - - switch(temperature_sensor_current_status) { - case TSSInitializing: - canvas_draw_str(canvas, 2, 30, "Initializing.."); - break; - case TSSNoSensor: - canvas_draw_str(canvas, 2, 30, "No sensor found!"); - break; - case TSSPendingUpdate: { - canvas_draw_str(canvas, 3, 24, "Temperature"); - canvas_draw_str(canvas, 68, 24, "Humidity"); - - // Draw vertical lines - canvas_draw_line(canvas, 61, 16, 61, 50); - canvas_draw_line(canvas, 62, 16, 62, 50); - - // Draw horizontal line - canvas_draw_line(canvas, 2, 27, 122, 27); - - // Draw temperature and humidity values - canvas_draw_str(canvas, 8, 38, ts_data_buffer_temperature_c); - canvas_draw_str(canvas, 42, 38, "C"); - canvas_draw_str(canvas, 8, 48, ts_data_buffer_temperature_f); - canvas_draw_str(canvas, 42, 48, "F"); - canvas_draw_str(canvas, 68, 38, ts_data_buffer_relative_humidity); - canvas_draw_str(canvas, 100, 38, "%"); - canvas_draw_str(canvas, 68, 48, ts_data_buffer_absolute_humidity); - canvas_draw_str(canvas, 100, 48, "g/m3"); - } break; - default: - break; - } -} - -// -// Input callback -// -static void temperature_sensor_input_callback(InputEvent* input_event, void* ctx) { - furi_assert(ctx); - FuriMessageQueue* event_queue = ctx; - - TSEvent event = {.type = TSEventTypeInput, .input = *input_event}; - furi_message_queue_put(event_queue, &event, FuriWaitForever); -} - -// -// Timer callback -// -static void temperature_sensor_timer_callback(FuriMessageQueue* event_queue) { - furi_assert(event_queue); - - TSEvent event = {.type = TSEventTypeTick}; - furi_message_queue_put(event_queue, &event, 0); -} - -// -// App entry point -// -int32_t temperature_sensor_app(void* p) { - UNUSED(p); - - // Declare our variables and assign variables a default value - TSEvent tsEvent; - bool sensorFound = false; - double celsius, fahrenheit, rel_humidity, abs_humidity = TS_DEFAULT_VALUE; - - // Used for absolute humidity calculation - double vapour_pressure = 0; - - FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(TSEvent)); - - // Register callbacks - ViewPort* view_port = view_port_alloc(); - view_port_draw_callback_set(view_port, temperature_sensor_draw_callback, NULL); - view_port_input_callback_set(view_port, temperature_sensor_input_callback, event_queue); - - // Create timer and register its callback - FuriTimer* timer = - furi_timer_alloc(temperature_sensor_timer_callback, FuriTimerTypePeriodic, event_queue); - furi_timer_start(timer, furi_kernel_get_tick_frequency()); - - // Register viewport - Gui* gui = furi_record_open(RECORD_GUI); - gui_add_view_port(gui, view_port, GuiLayerFullscreen); - - // Used to notify the user by blinking red (error) or blue (fetch successful) - NotificationApp* notifications = furi_record_open(RECORD_NOTIFICATION); - - while(1) { - furi_check(furi_message_queue_get(event_queue, &tsEvent, FuriWaitForever) == FuriStatusOk); - - // Handle events - if(tsEvent.type == TSEventTypeInput) { - // Exit on back key - if(tsEvent.input.key == - InputKeyBack) // We dont check for type here, we can check the type of keypress like: (event.input.type == InputTypeShort) - break; - } else if(tsEvent.type == TSEventTypeTick) { - // Update sensor data - // Fetch data and set the sensor current status accordingly - sensorFound = temperature_sensor_fetch_data(&celsius, &rel_humidity); - temperature_sensor_current_status = (sensorFound ? TSSPendingUpdate : TSSNoSensor); - - if(sensorFound) { - // Blink blue - notification_message(notifications, &sequence_blink_blue_100); - - if(celsius != TS_DEFAULT_VALUE && rel_humidity != TS_DEFAULT_VALUE) { - // Convert celsius to fahrenheit - fahrenheit = (celsius * 9 / 5) + 32; - - // Calculate absolute humidity - For more info refer to https://github.com/Mywk/FlipperTemperatureSensor/issues/1 - // Calculate saturation vapour pressure first - vapour_pressure = - (double)6.11 * - pow(10, (double)(((double)7.5 * celsius) / ((double)237.3 + celsius))); - // Then the vapour pressure in Pa - vapour_pressure = vapour_pressure * rel_humidity; - // Calculate absolute humidity - abs_humidity = - (double)2.16679 * (double)(vapour_pressure / ((double)273.15 + celsius)); - - // Fill our buffers here, not on the canvas draw callback - snprintf(ts_data_buffer_temperature_c, DATA_BUFFER_SIZE, "%.2f", celsius); - snprintf(ts_data_buffer_temperature_f, DATA_BUFFER_SIZE, "%.2f", fahrenheit); - snprintf( - ts_data_buffer_relative_humidity, DATA_BUFFER_SIZE, "%.2f", rel_humidity); - snprintf( - ts_data_buffer_absolute_humidity, DATA_BUFFER_SIZE, "%.2f", abs_humidity); - } - } else { - // Reset our variables to their default values - celsius = fahrenheit = rel_humidity = abs_humidity = TS_DEFAULT_VALUE; - - // Blink red - notification_message(notifications, &sequence_blink_red_100); - } - } - - furi_delay_ms(!sensorFound ? 100 : 500); - } - - // Dobby is freee (free our variables, Flipper will crash if we don't do this!) - furi_timer_free(timer); - gui_remove_view_port(gui, view_port); - view_port_free(view_port); - furi_message_queue_free(event_queue); - - furi_record_close(RECORD_NOTIFICATION); - furi_record_close(RECORD_GUI); - - return 0; -} \ No newline at end of file diff --git a/applications/plugins/htu21d_temp_sensor/temperature_sensor.png b/applications/plugins/htu21d_temp_sensor/temperature_sensor.png deleted file mode 100644 index b6fe6d7feb1fa91f43ea3ce545bf3056f0f8a4b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4F%}28J29*~C-V}>VM%xNb!1@J z*w6hZkrl}2EbxddW?X?_wfUrhf?l33jv*SsQ~MdY7!){|xBmaXbJmiR8&)uH zEaAIqH<2lH>YXg@Xy%9c9e?=GOkB=*{m{gR2NzH1OsFVdQ&MBb@0O^W43IG5A diff --git a/applications/plugins/unitemp/sensors/HTU21x.c b/applications/plugins/unitemp/sensors/HTU21x.c index 74fc47d5d..296154f33 100644 --- a/applications/plugins/unitemp/sensors/HTU21x.c +++ b/applications/plugins/unitemp/sensors/HTU21x.c @@ -20,6 +20,7 @@ const SensorType HTU21x = { .typename = "HTU21x", + .altname = "HTU21x/SI70xx/SHT2x", .interface = &I2C, .datatype = UT_DATA_TYPE_TEMP_HUM, .pollingInterval = 250, @@ -45,7 +46,7 @@ bool unitemp_HTU21x_alloc(Sensor* sensor, char* args) { //Адреса на шине I2C (7 бит) i2c_sensor->minI2CAdr = 0x40 << 1; - i2c_sensor->maxI2CAdr = 0x40 << 1; + i2c_sensor->maxI2CAdr = 0x41 << 1; return true; } diff --git a/applications/plugins/unitemp/unitemp.h b/applications/plugins/unitemp/unitemp.h index 5947a3e3c..043ac6ddd 100644 --- a/applications/plugins/unitemp/unitemp.h +++ b/applications/plugins/unitemp/unitemp.h @@ -40,7 +40,7 @@ //Имя приложения #define APP_NAME "Unitemp" //Версия приложения -#define UNITEMP_APP_VER "1.1" +#define UNITEMP_APP_VER "1.1.1-dev" //Путь хранения файлов плагина #define APP_PATH_FOLDER "/ext/unitemp" //Имя файла с настройками From 8c791a998a255b45d4e51c68e131358c8e903509 Mon Sep 17 00:00:00 2001 From: amec0e <88857687+amec0e@users.noreply.github.com> Date: Sat, 7 Jan 2023 22:19:27 +0000 Subject: [PATCH 049/506] Updated ac.ir --- assets/resources/infrared/assets/ac.ir | 28 ++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/assets/resources/infrared/assets/ac.ir b/assets/resources/infrared/assets/ac.ir index 9d1ef95b4..b656c309f 100644 --- a/assets/resources/infrared/assets/ac.ir +++ b/assets/resources/infrared/assets/ac.ir @@ -1,7 +1,7 @@ Filetype: IR library file Version: 1 -# Last Updated 5th Jan, 2023 -# Last Checked 5th Jan, 2023 +# Last Updated 7th Jan, 2023 +# Last Checked 7th Jan, 2023 # # POWER_ON name: POWER @@ -1488,3 +1488,27 @@ type: raw frequency: 38000 duty_cycle: 0.330000 data: 1275 413 1305 384 457 1226 1308 385 1329 385 430 1228 457 1228 457 1229 1304 411 429 1257 428 1258 427 7993 1275 416 1275 416 425 1262 1274 416 1275 417 425 1262 425 1262 425 1261 1276 416 426 1262 424 1262 425 7999 1274 417 1275 417 425 1262 1276 417 1276 417 425 1263 424 1262 425 1262 1276 417 425 1263 425 1263 424 8003 1274 417 1276 417 425 1263 1275 417 1277 417 425 1263 425 1263 425 1263 1276 418 425 1264 424 1263 425 8006 1276 418 1276 418 425 1263 1277 418 1277 418 425 1264 425 1264 425 1264 1276 418 425 1264 425 1264 425 8010 1276 418 1276 418 425 1264 1277 418 1277 418 425 1265 425 1265 424 1265 1276 418 425 1265 425 1265 425 8012 1276 418 1277 418 425 1265 1277 419 1277 419 425 1266 424 1266 424 1266 1277 419 425 1266 424 1266 424 8016 1276 419 1277 419 425 1266 1277 419 1278 419 425 1267 424 1266 425 1267 1277 420 424 1267 424 1267 424 8020 1275 420 1277 420 424 1267 1277 420 1277 420 424 1268 424 1268 423 1267 1277 420 424 1268 424 1268 424 8023 1276 420 1277 421 424 1268 1277 421 1277 421 424 1269 423 1269 423 1268 1278 421 423 1269 424 1269 423 8026 1276 421 1277 422 423 1269 1277 422 1277 422 423 1270 423 1270 423 1270 1276 422 423 1270 423 1271 422 8029 1276 423 1276 447 398 1272 1276 446 1254 447 399 1295 398 1272 422 1295 1252 447 398 1295 398 1295 398 8056 1252 447 1252 447 398 1296 1252 447 1253 447 399 1296 398 1296 398 1296 1253 448 398 1296 398 1296 398 8059 1252 447 1253 447 399 1296 1253 448 1253 448 398 1297 397 1297 398 1297 1253 448 398 1297 398 1297 397 8062 1252 448 1253 448 398 1297 1253 448 1254 448 398 1298 397 1298 397 1298 1253 449 397 1298 397 1298 397 8065 1252 449 1253 449 397 1298 1253 449 1254 449 398 1299 397 1299 397 1299 1253 449 398 1299 397 1299 397 8069 1252 450 1252 450 397 1299 1253 450 1254 450 397 1300 396 1300 396 1300 1252 450 397 1300 397 1300 396 8072 1252 450 1253 451 396 1300 1253 451 1253 451 396 1301 396 1301 396 1301 1253 451 396 1301 396 1301 396 8075 1251 452 1252 452 396 1301 1253 452 1253 452 395 1303 395 1303 394 1302 1254 453 395 1303 395 1303 395 8081 1250 477 1228 455 393 1304 1252 478 1227 478 370 1329 369 1329 369 1328 1228 478 370 1329 369 1329 369 8107 1227 478 1227 478 370 1329 1227 479 1227 479 369 1329 370 1329 370 1329 1227 479 369 1330 369 1330 369 8111 1225 479 1227 479 369 1330 1227 479 1228 480 368 1331 368 1331 368 1331 1227 480 368 1332 367 1332 367 8114 1225 480 1227 481 367 1332 1226 506 1201 507 342 1358 317 1383 342 1358 1200 507 317 1384 316 1384 316 8168 1174 532 1175 532 316 1384 1175 533 1175 533 315 1385 315 1385 315 1384 1175 533 315 1386 315 1385 315 8171 1174 534 1174 559 289 1387 1174 559 1149 560 289 1413 288 1412 289 1413 1148 560 289 1413 288 1413 288 8203 1147 561 1148 562 287 1414 1148 562 1147 588 260 1416 286 1441 260 1440 1122 588 260 1442 260 1442 260 8232 1120 589 1120 615 228 1474 1095 616 1094 642 182 1494 226 1476 226 1503 1067 643 181 3224 182 8314 1066 671 1039 2427 986 +# +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 3110 1566 525 1084 497 356 471 1085 497 356 472 356 471 1085 497 356 470 357 474 1084 498 356 471 356 471 356 471 356 471 356 496 357 470 357 473 1061 520 357 470 1063 519 357 470 1064 518 1064 518 357 470 357 471 +# +name: TIMER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 3128 1546 549 1032 549 356 471 1033 549 357 470 356 445 1085 496 356 471 357 498 1059 523 1059 522 1059 522 1061 520 356 470 357 470 357 470 357 474 1064 518 1065 517 357 470 357 471 357 470 357 470 1064 517 357 471 +# +name: TEMP+ +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 3107 1568 549 1034 524 356 471 1056 549 357 471 357 471 1031 525 356 471 358 473 1083 498 356 471 1083 498 356 494 357 471 357 469 357 470 358 472 1063 518 357 470 357 470 1064 518 1063 519 1064 517 357 470 357 471 +# +name: TEMP- +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 3110 1567 551 1031 550 356 471 1032 550 356 471 356 445 1084 497 355 472 357 497 356 472 1058 523 1058 523 356 471 356 470 357 469 357 470 357 474 357 470 1063 519 357 470 1063 518 1063 519 1063 518 357 470 357 471 From 754a29009ddc192b2539e25ca544998a705b2652 Mon Sep 17 00:00:00 2001 From: amec0e <88857687+amec0e@users.noreply.github.com> Date: Sat, 7 Jan 2023 22:19:56 +0000 Subject: [PATCH 050/506] Updated audio.ir --- assets/resources/infrared/assets/audio.ir | 40 +++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/assets/resources/infrared/assets/audio.ir b/assets/resources/infrared/assets/audio.ir index 6f3ddeee4..f43991573 100644 --- a/assets/resources/infrared/assets/audio.ir +++ b/assets/resources/infrared/assets/audio.ir @@ -1,7 +1,7 @@ Filetype: IR library file Version: 1 -# Last Updated 5th Jan, 2023 -# Last Checked 5th Jan, 2023 +# Last Updated 7th Jan, 2023 +# Last Checked 7th Jan, 2023 # name: POWER type: parsed @@ -2002,3 +2002,39 @@ type: parsed protocol: Kaseikyo address: 51 54 32 01 command: 06 00 00 00 +# +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 4567 4454 549 481 522 481 523 480 498 506 498 1509 499 1509 523 480 499 505 523 1484 523 1484 523 1485 521 1487 520 484 519 485 519 485 519 471 519 4488 518 485 519 485 518 485 519 485 518 485 519 485 519 485 519 485 519 1489 519 1489 518 1489 518 485 519 1489 518 1490 518 1490 517 1490 518 486 518 486 518 486 518 1490 518 +# +name: VOL+ +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 4571 4453 552 478 525 478 526 478 500 504 500 1507 501 1506 526 478 525 477 526 1481 526 1481 526 1482 524 1483 523 481 522 482 521 481 522 468 522 4484 521 482 521 482 521 482 522 481 522 1486 521 1486 521 1486 521 482 521 1486 522 1486 522 1486 522 482 522 482 522 482 522 482 522 1486 522 483 521 482 521 483 521 1487 521 55474 4547 4477 524 479 524 480 524 480 523 480 523 1485 523 1484 524 481 523 481 523 1485 523 1485 522 1485 523 1485 523 480 524 480 524 481 523 467 524 4484 523 481 523 481 523 481 523 481 523 1485 523 1485 523 1485 523 481 523 1485 523 1485 523 1485 523 481 523 481 523 481 523 481 523 1485 523 481 523 481 523 481 523 1486 522 +# +name: VOL- +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 4572 4453 552 456 548 479 524 479 500 504 500 1482 526 1482 551 478 526 478 525 1483 524 1484 523 1486 521 1487 521 483 521 483 521 483 521 470 520 4487 521 483 521 483 521 483 521 483 521 483 521 483 521 483 521 1488 520 1488 520 1488 520 1488 520 483 521 1488 520 1488 520 1488 520 483 521 483 521 483 521 483 521 1488 520 55457 4565 4483 521 483 521 483 521 483 521 483 520 1488 520 1487 521 483 521 483 520 1488 520 1488 520 1488 520 1488 520 483 520 484 520 484 520 470 521 4487 520 484 520 483 520 484 520 484 520 484 520 484 519 484 520 1488 520 1488 520 1488 519 1488 520 484 520 1488 520 1488 520 1488 520 484 520 484 520 484 520 484 520 1489 519 +# +name: MUTE +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 4573 4451 552 477 527 478 526 477 526 478 501 1507 501 1506 502 502 527 477 526 1481 527 1481 527 1481 526 1482 525 479 524 480 523 481 523 468 523 4485 522 481 522 482 522 482 522 482 522 1486 522 482 521 482 522 482 522 1486 522 1486 522 1486 522 482 522 482 521 1487 521 1487 521 1487 521 482 521 483 521 483 521 1487 521 55462 4547 4474 524 478 525 479 524 480 523 480 523 1484 523 1484 523 480 523 480 523 1484 523 1484 524 1484 523 1485 522 480 523 480 524 480 523 467 523 4484 522 480 524 481 523 481 523 481 523 1485 523 481 522 481 523 481 523 1485 522 1485 523 1485 523 481 523 481 522 1485 522 1485 522 1485 523 481 522 481 522 481 523 1485 523 +# +name: VOL- +type: parsed +protocol: NECext +address: 10 E7 00 00 +command: 49 B6 00 00 +# +name: VOL+ +type: parsed +protocol: NECext +address: 10 E7 00 00 +command: 05 FA 00 00 From 3a4b5e6445fecbf47860aaf731b563345a380d38 Mon Sep 17 00:00:00 2001 From: amec0e <88857687+amec0e@users.noreply.github.com> Date: Sat, 7 Jan 2023 22:20:16 +0000 Subject: [PATCH 051/506] Updated fans.ir --- assets/resources/infrared/assets/fans.ir | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/assets/resources/infrared/assets/fans.ir b/assets/resources/infrared/assets/fans.ir index 37fc3a3df..c76fe1d45 100644 --- a/assets/resources/infrared/assets/fans.ir +++ b/assets/resources/infrared/assets/fans.ir @@ -1,7 +1,7 @@ Filetype: IR library file Version: 1 -# Last Updated 5th Jan, 2023 -# Last Checked 5th Jan, 2023 +# Last Updated 7th Jan, 2023 +# Last Checked 7th Jan, 2023 # name: POWER type: raw @@ -1269,3 +1269,21 @@ type: raw frequency: 38000 duty_cycle: 0.330000 data: 9384 4452 658 485 657 484 658 484 659 485 657 1597 658 1597 682 487 655 488 654 1603 652 1603 653 1603 653 1604 653 491 653 491 653 1603 653 1603 653 1603 653 491 653 1604 652 490 654 1603 652 490 653 490 653 1603 652 490 653 1603 652 490 653 1603 652 490 653 1603 652 1603 652 490 653 39953 9263 2181 652 +# +name: POWER +type: parsed +protocol: NEC +address: 01 00 00 00 +command: 83 00 00 00 +# +name: SPEED+ +type: parsed +protocol: NEC +address: 01 00 00 00 +command: 87 00 00 00 +# +name: TIMER +type: parsed +protocol: NEC +address: 01 00 00 00 +command: 8B 00 00 00 From b3f32b69388242d5f5aab00f9edfbd2de9be7e3d Mon Sep 17 00:00:00 2001 From: amec0e <88857687+amec0e@users.noreply.github.com> Date: Sat, 7 Jan 2023 22:20:51 +0000 Subject: [PATCH 052/506] Updated projectors.ir last checked --- assets/resources/infrared/assets/projectors.ir | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/resources/infrared/assets/projectors.ir b/assets/resources/infrared/assets/projectors.ir index 19e0fffb3..0702a987d 100644 --- a/assets/resources/infrared/assets/projectors.ir +++ b/assets/resources/infrared/assets/projectors.ir @@ -1,7 +1,7 @@ Filetype: IR library file Version: 1 # Last Updated 5th Jan, 2023 -# Last Checked 5th Jan, 2023 +# Last Checked 7th Jan, 2023 # # ON name: POWER From cd4f719783ce9c373625d056f43bd75281c7d7e8 Mon Sep 17 00:00:00 2001 From: amec0e <88857687+amec0e@users.noreply.github.com> Date: Sat, 7 Jan 2023 22:21:48 +0000 Subject: [PATCH 053/506] Updated tv.ir New additions and removed 2 mislabelled buttons CH- and VOL- which in fact was Pre_ch and Num_Input --- assets/resources/infrared/assets/tv.ir | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/assets/resources/infrared/assets/tv.ir b/assets/resources/infrared/assets/tv.ir index ff465dbc9..8210dbf30 100755 --- a/assets/resources/infrared/assets/tv.ir +++ b/assets/resources/infrared/assets/tv.ir @@ -1,7 +1,7 @@ Filetype: IR library file Version: 1 -# Last Updated 5th Jan, 2023 -# Last Checked 5th Jan, 2023 +# Last Updated 7th Jan, 2023 +# Last Checked 7th Jan, 2023 # name: POWER type: parsed @@ -1143,25 +1143,13 @@ type: parsed protocol: RC6 address: 00 00 00 00 command: 0D 00 00 00 -# +# Samsung Standby name: POWER type: parsed protocol: Samsung32 address: 07 00 00 00 command: E0 00 00 00 -# -name: VOL- -type: parsed -protocol: Samsung32 -address: 07 00 00 00 -command: 23 00 00 00 -# -name: CH- -type: parsed -protocol: Samsung32 -address: 07 00 00 00 -command: 13 00 00 00 -# +# Samsung Power Off name: POWER type: parsed protocol: Samsung32 From 78c64737aa014a83920767235ae90c5d983713f2 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sun, 8 Jan 2023 03:17:00 +0300 Subject: [PATCH 054/506] Fix readme --- ReadMe.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ReadMe.md b/ReadMe.md index 88326c922..375ecac8e 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -100,7 +100,7 @@ You can support us by using links or addresses below: ### Community apps included: - **RFID Fuzzer** [(by Ganapati & @xMasterX)](https://github.com/DarkFlippers/unleashed-firmware/pull/54) & New protocols by @mvanzanten -- Sub-GHz bruteforce plugin [(by @derskythe & xMasterX)](https://github.com/derskythe/flipperzero-subbrute) [(original by Ganapati & xMasterX)](https://github.com/DarkFlippers/unleashed-firmware/pull/57) +- **Sub-GHz bruteforcer** [(by @derskythe & xMasterX)](https://github.com/derskythe/flipperzero-subbrute) [(original by Ganapati & xMasterX)](https://github.com/DarkFlippers/unleashed-firmware/pull/57) - **Sub-GHz playlist** [(by darmiel)](https://github.com/DarkFlippers/unleashed-firmware/pull/62) - ESP8266 Deauther plugin [(by SequoiaSan)](https://github.com/SequoiaSan/FlipperZero-Wifi-ESP8266-Deauther-Module) - WiFi Scanner plugin [(by SequoiaSan)](https://github.com/SequoiaSan/FlipperZero-WiFi-Scanner_Module) @@ -112,7 +112,7 @@ You can support us by using links or addresses below: - ESP32: WiFi Marauder companion plugin [(by 0xchocolate)](https://github.com/0xchocolate/flipperzero-firmware-with-wifi-marauder-companion) - NRF24: Sniffer & MouseJacker (with changes) [(by mothball187)](https://github.com/mothball187/flipperzero-nrf24/tree/main/mousejacker) - Simple Clock (timer by GMMan / settings by kowalski7cc) [(original by CompaqDisc)](https://gist.github.com/CompaqDisc/4e329c501bd03c1e801849b81f48ea61) -- UniversalRF Remix / **Sub-GHz Remote** [(by @darmiel & @xMasterX)](https://github.com/darmiel/flipper-playlist/tree/feat/unirf-protocols) (original by @ESurge) +- **Sub-GHz Remote** (UniversalRF Remix) [(by @darmiel & @xMasterX)](https://github.com/darmiel/flipper-playlist/tree/feat/unirf-protocols) (original by @ESurge) - Spectrum Analyzer (with changes) [(by jolcese)](https://github.com/jolcese/flipperzero-firmware/tree/spectrum/applications/spectrum_analyzer) - [Ultra Narrow mode & scan channels non-consecutively](https://github.com/theY4Kman/flipperzero-firmware/commits?author=theY4Kman) - Metronome [(by panki27)](https://github.com/panki27/Metronome) - DTMF Dolphin [(by litui)](https://github.com/litui/dtmf_dolphin) From 4ec5dbcee828519778f429d8f59f7538641fa1be Mon Sep 17 00:00:00 2001 From: Daniel <71837281+darmiel@users.noreply.github.com> Date: Sun, 8 Jan 2023 02:05:17 +0100 Subject: [PATCH 055/506] feat: allow disabling automatic signal decoding --- .../main/infrared/scenes/infrared_scene_start.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/applications/main/infrared/scenes/infrared_scene_start.c b/applications/main/infrared/scenes/infrared_scene_start.c index c7df0f45b..32d357dc5 100644 --- a/applications/main/infrared/scenes/infrared_scene_start.c +++ b/applications/main/infrared/scenes/infrared_scene_start.c @@ -3,6 +3,7 @@ enum SubmenuIndex { SubmenuIndexUniversalRemotes, SubmenuIndexLearnNewRemote, + SubmenuIndexLearnNewRemoteRaw, SubmenuIndexSavedRemotes, SubmenuIndexDebug }; @@ -37,6 +38,12 @@ void infrared_scene_start_on_enter(void* context) { infrared); if(infrared->app_state.is_debug_enabled) { + submenu_add_item( + submenu, + "Learn New Remote RAW", + SubmenuIndexLearnNewRemoteRaw, + infrared_scene_start_submenu_callback, + infrared); submenu_add_item( submenu, "Debug", SubmenuIndexDebug, infrared_scene_start_submenu_callback, infrared); } @@ -61,7 +68,15 @@ bool infrared_scene_start_on_event(void* context, SceneManagerEvent event) { if(submenu_index == SubmenuIndexUniversalRemotes) { scene_manager_next_scene(scene_manager, InfraredSceneUniversal); consumed = true; - } else if(submenu_index == SubmenuIndexLearnNewRemote) { + } else if( + submenu_index == SubmenuIndexLearnNewRemote || + submenu_index == SubmenuIndexLearnNewRemoteRaw) { + + // enable automatic signal decoding if "Learn New Remote" + // disable automatic signal decoding if "Learn New Remote (RAW)" + infrared_worker_rx_enable_signal_decoding( + infrared->worker, submenu_index == SubmenuIndexLearnNewRemote); + infrared->app_state.is_learning_new_remote = true; scene_manager_next_scene(scene_manager, InfraredSceneLearn); consumed = true; From 8488f4406e1eee806b9965cfec24be39e45d77f4 Mon Sep 17 00:00:00 2001 From: LTVA1 <87536432+LTVA1@users.noreply.github.com> Date: Sun, 8 Jan 2023 20:12:27 +0300 Subject: [PATCH 056/506] add example of custom font usage --- .../debug/example_custom_font/application.fam | 9 ++ .../example_custom_font/example_custom_font.c | 104 ++++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100644 applications/debug/example_custom_font/application.fam create mode 100644 applications/debug/example_custom_font/example_custom_font.c diff --git a/applications/debug/example_custom_font/application.fam b/applications/debug/example_custom_font/application.fam new file mode 100644 index 000000000..02285b8a0 --- /dev/null +++ b/applications/debug/example_custom_font/application.fam @@ -0,0 +1,9 @@ +App( + appid="example_custom_font", + name="Example: custom font", + apptype=FlipperAppType.EXTERNAL, + entry_point="example_custom_font_main", + requires=["gui"], + stack_size=1 * 1024, + fap_category="Debug", +) diff --git a/applications/debug/example_custom_font/example_custom_font.c b/applications/debug/example_custom_font/example_custom_font.c new file mode 100644 index 000000000..a4bbc413e --- /dev/null +++ b/applications/debug/example_custom_font/example_custom_font.c @@ -0,0 +1,104 @@ +#include +#include + +#include +#include + + +//This include enables font usage + +#include + +//This arrays contains the font itself. You can use any u8g2 font you want + +/* +Fontname: -Raccoon-Fixed4x6-Medium-R-Normal--6-60-75-75-P-40-ISO10646-1 +Copyright: +Glyphs: 95/203 +BBX Build Mode: 0 +*/ +const uint8_t u8g2_font_tom_thumb_4x6_tr[725] U8G2_FONT_SECTION("u8g2_font_tom_thumb_4x6_tr") = + "_\0\2\2\2\3\3\4\4\3\6\0\377\5\377\5\0\0\352\1\330\2\270 \5\340\315\0!\6\265\310" + "\254\0\42\6\213\313$\25#\10\227\310\244\241\206\12$\10\227\310\215\70b\2%\10\227\310d\324F\1" + "&\10\227\310(\65R\22'\5\251\313\10(\6\266\310\251\62)\10\226\310\304\224\24\0*\6\217\312\244" + "\16+\7\217\311\245\225\0,\6\212\310)\0-\5\207\312\14.\5\245\310\4/\7\227\310Ve\4\60" + "\7\227\310-k\1\61\6\226\310\255\6\62\10\227\310h\220\312\1\63\11\227\310h\220\62X\0\64\10\227" + "\310$\65b\1\65\10\227\310\214\250\301\2\66\10\227\310\315\221F\0\67\10\227\310\314TF\0\70\10\227" + "\310\214\64\324\10\71\10\227\310\214\64\342\2:\6\255\311\244\0;\7\222\310e\240\0<\10\227\310\246\32" + "d\20=\6\217\311l\60>\11\227\310d\220A*\1\77\10\227\310\314\224a\2@\10\227\310UC\3" + "\1A\10\227\310UC\251\0B\10\227\310\250\264\322\2C\7\227\310\315\32\10D\10\227\310\250d-\0" + "E\10\227\310\214\70\342\0F\10\227\310\214\70b\4G\10\227\310\315\221\222\0H\10\227\310$\65\224\12" + "I\7\227\310\254X\15J\7\227\310\226\252\2K\10\227\310$\265\222\12L\7\227\310\304\346\0M\10\227" + "\310\244\61\224\12N\10\227\310\244q\250\0O\7\227\310UV\5P\10\227\310\250\264b\4Q\10\227\310" + "Uj$\1R\10\227\310\250\64V\1S\10\227\310m\220\301\2T\7\227\310\254\330\2U\7\227\310$" + "W\22V\10\227\310$\253L\0W\10\227\310$\65\206\12X\10\227\310$\325R\1Y\10\227\310$U" + "V\0Z\7\227\310\314T\16[\7\227\310\214X\16\134\10\217\311d\220A\0]\7\227\310\314r\4^" + "\5\213\313\65_\5\207\310\14`\6\212\313\304\0a\7\223\310\310\65\2b\10\227\310D\225\324\2c\7" + "\223\310\315\14\4d\10\227\310\246\245\222\0e\6\223\310\235\2f\10\227\310\246\264b\2g\10\227\307\35" + "\61%\0h\10\227\310D\225\254\0i\6\265\310\244\1j\10\233\307f\30U\5k\10\227\310\304\264T" + "\1l\7\227\310\310\326\0m\7\223\310 Date: Mon, 9 Jan 2023 17:15:00 +0300 Subject: [PATCH 057/506] New battery display (Bar %) --- .../services/desktop/desktop_settings.h | 7 ++ .../services/power/power_service/power.c | 67 +++++++++++++++++-- .../scenes/desktop_settings_scene_start.c | 12 +++- 3 files changed, 77 insertions(+), 9 deletions(-) diff --git a/applications/services/desktop/desktop_settings.h b/applications/services/desktop/desktop_settings.h index 4ff55c6a9..e62480718 100644 --- a/applications/services/desktop/desktop_settings.h +++ b/applications/services/desktop/desktop_settings.h @@ -36,6 +36,13 @@ #define MIN_PIN_SIZE 4 #define MAX_APP_LENGTH 128 +#define DISPLAY_BATTERY_BAR 0 +#define DISPLAY_BATTERY_PERCENT 1 +#define DISPLAY_BATTERY_INVERTED_PERCENT 2 +#define DISPLAY_BATTERY_RETRO_3 3 +#define DISPLAY_BATTERY_RETRO_5 4 +#define DISPLAY_BATTERY_BAR_PERCENT 5 + #define FAP_LOADER_APP_NAME "Applications" typedef struct { diff --git a/applications/services/power/power_service/power.c b/applications/services/power/power_service/power.c index 8b1c36423..251bae35d 100644 --- a/applications/services/power/power_service/power.c +++ b/applications/services/power/power_service/power.c @@ -1,5 +1,5 @@ -#include "power_i.h" #include "desktop/desktop_settings.h" +#include "power_i.h" #include #include @@ -14,7 +14,7 @@ void power_draw_battery_callback(Canvas* canvas, void* context) { if(power->info.gauge_is_ok) { char batteryPercentile[4]; snprintf(batteryPercentile, sizeof(batteryPercentile), "%d", power->info.charge); - if((power->displayBatteryPercentage == 1) && + if((power->displayBatteryPercentage == DISPLAY_BATTERY_PERCENT) && (power->state != PowerStateCharging)) { //if display battery percentage, black background white text canvas_set_font(canvas, FontBatteryPercent); @@ -23,14 +23,14 @@ void power_draw_battery_callback(Canvas* canvas, void* context) { canvas_set_color(canvas, ColorWhite); canvas_draw_str_aligned(canvas, 11, 4, AlignCenter, AlignCenter, batteryPercentile); } else if( - (power->displayBatteryPercentage == 2) && + (power->displayBatteryPercentage == DISPLAY_BATTERY_INVERTED_PERCENT) && (power->state != PowerStateCharging)) { //if display inverted percentage, white background black text canvas_set_font(canvas, FontBatteryPercent); canvas_set_color(canvas, ColorBlack); canvas_draw_str_aligned(canvas, 11, 4, AlignCenter, AlignCenter, batteryPercentile); } else if( - (power->displayBatteryPercentage == 3) && + (power->displayBatteryPercentage == DISPLAY_BATTERY_RETRO_3) && (power->state != PowerStateCharging)) { //Retro style segmented display, 3 parts if(power->info.charge > 25) { canvas_draw_box(canvas, 2, 2, 6, 4); @@ -42,7 +42,7 @@ void power_draw_battery_callback(Canvas* canvas, void* context) { canvas_draw_box(canvas, 16, 2, 6, 4); } } else if( - (power->displayBatteryPercentage == 4) && + (power->displayBatteryPercentage == DISPLAY_BATTERY_RETRO_5) && (power->state != PowerStateCharging)) { //Retro style segmented display, 5 parts if(power->info.charge > 10) { canvas_draw_box(canvas, 2, 2, 3, 4); @@ -59,6 +59,58 @@ void power_draw_battery_callback(Canvas* canvas, void* context) { if(power->info.charge > 90) { canvas_draw_box(canvas, 18, 2, 3, 4); } + } else if( + (power->displayBatteryPercentage == DISPLAY_BATTERY_BAR_PERCENT) && + (power->state != PowerStateCharging) && // Default bar display with percentage + (power->info.voltage_battery_charging >= 4.2)) { // not looking nice with low voltage indicator + canvas_set_font(canvas, FontBatteryPercent); + + // align charge dispaly value with digits to draw + uint8_t bar_charge = power->info.charge; + if(bar_charge > 23 && bar_charge < 38) { + bar_charge = 23; + } else if(bar_charge >= 38 && bar_charge < 62) { + bar_charge = 50; + } else if(bar_charge >= 62 && bar_charge < 74) { + bar_charge = 74; + } + canvas_set_color(canvas, ColorBlack); + canvas_draw_box(canvas, 1, 1, (bar_charge * 22) / 100, 6); + + // drawing digits + if(bar_charge < 38) { // both digits are black + canvas_set_color(canvas, ColorBlack); + canvas_draw_str_aligned( + canvas, 11, 4, AlignCenter, AlignCenter, batteryPercentile); + } else if(bar_charge >= 38 && bar_charge < 74) { // first digit is white + canvas_set_color(canvas, ColorWhite); + + // first + char batteryPercentileFirstDigit[2]; + snprintf( + batteryPercentileFirstDigit, + sizeof(batteryPercentileFirstDigit), + "%c", + batteryPercentile[0]); + canvas_draw_str_aligned( + canvas, 9, 4, AlignCenter, AlignCenter, batteryPercentileFirstDigit); + + // second + char batteryPercentileSecondDigit[2]; + snprintf( + batteryPercentileSecondDigit, + sizeof(batteryPercentileSecondDigit), + "%c", + batteryPercentile[1]); + canvas_set_color(canvas, ColorBlack); + canvas_draw_str_aligned( + canvas, 15, 4, AlignCenter, AlignCenter, batteryPercentileSecondDigit); + } else { // charge >= 62, both digits are white + canvas_set_color(canvas, ColorWhite); + canvas_draw_str_aligned( + canvas, 11, 4, AlignCenter, AlignCenter, batteryPercentile); + } + } else { //default bar display, added here to serve as fallback/default behaviour. canvas_draw_box(canvas, 2, 2, (power->info.charge + 4) / 5, 4); } @@ -82,7 +134,8 @@ void power_draw_battery_callback(Canvas* canvas, void* context) { if(power->state == PowerStateCharging) { canvas_set_bitmap_mode(canvas, 1); // TODO: replace -1 magic for uint8_t with re-framing - if(power->displayBatteryPercentage == 1) { + if(power->displayBatteryPercentage == DISPLAY_BATTERY_PERCENT || + power->displayBatteryPercentage == DISPLAY_BATTERY_BAR_PERCENT) { canvas_set_color(canvas, ColorBlack); canvas_draw_box(canvas, 1, 1, 22, 6); canvas_draw_icon(canvas, 2, -1, &I_Charging_lightning_9x10); @@ -91,7 +144,7 @@ void power_draw_battery_callback(Canvas* canvas, void* context) { canvas_set_font(canvas, FontBatteryPercent); canvas_draw_str_aligned( canvas, 16, 4, AlignCenter, AlignCenter, batteryPercentile); - } else if(power->displayBatteryPercentage == 2) { + } else if(power->displayBatteryPercentage == DISPLAY_BATTERY_INVERTED_PERCENT) { canvas_set_color(canvas, ColorWhite); canvas_draw_box(canvas, 1, 1, 22, 6); canvas_draw_icon(canvas, 2, -1, &I_Charging_lightning_9x10); diff --git a/applications/settings/desktop_settings/scenes/desktop_settings_scene_start.c b/applications/settings/desktop_settings/scenes/desktop_settings_scene_start.c index b499e9163..d0f295d8f 100644 --- a/applications/settings/desktop_settings/scenes/desktop_settings_scene_start.c +++ b/applications/settings/desktop_settings/scenes/desktop_settings_scene_start.c @@ -26,7 +26,7 @@ const char* const auto_lock_delay_text[AUTO_LOCK_DELAY_COUNT] = { const uint32_t auto_lock_delay_value[AUTO_LOCK_DELAY_COUNT] = {0, 10000, 15000, 30000, 60000, 90000, 120000, 300000, 600000}; -#define BATTERY_VIEW_COUNT 5 +#define BATTERY_VIEW_COUNT 6 const char* const battery_view_count_text[BATTERY_VIEW_COUNT] = { "Bar", @@ -34,9 +34,17 @@ const char* const battery_view_count_text[BATTERY_VIEW_COUNT] = { "Inv. %", "Retro 3", "Retro 5", + "Bar %" }; -const uint32_t displayBatteryPercentage_value[BATTERY_VIEW_COUNT] = {0, 1, 2, 3, 4}; +const uint32_t displayBatteryPercentage_value[BATTERY_VIEW_COUNT] = { + DISPLAY_BATTERY_BAR, + DISPLAY_BATTERY_PERCENT, + DISPLAY_BATTERY_INVERTED_PERCENT, + DISPLAY_BATTERY_RETRO_3, + DISPLAY_BATTERY_RETRO_5, + DISPLAY_BATTERY_BAR_PERCENT +}; static void desktop_settings_scene_start_var_list_enter_callback(void* context, uint32_t index) { DesktopSettingsApp* app = context; From 44830593c110cb3858b2a749afb25531d2cdf73e Mon Sep 17 00:00:00 2001 From: LTVA1 <87536432+LTVA1@users.noreply.github.com> Date: Wed, 11 Jan 2023 12:15:08 +0300 Subject: [PATCH 058/506] delete u8g2 dependency in example custom font --- .../debug/example_custom_font/example_custom_font.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/applications/debug/example_custom_font/example_custom_font.c b/applications/debug/example_custom_font/example_custom_font.c index a4bbc413e..60890f1d4 100644 --- a/applications/debug/example_custom_font/example_custom_font.c +++ b/applications/debug/example_custom_font/example_custom_font.c @@ -4,11 +4,6 @@ #include #include - -//This include enables font usage - -#include - //This arrays contains the font itself. You can use any u8g2 font you want /* @@ -17,7 +12,7 @@ Copyright: Glyphs: 95/203 BBX Build Mode: 0 */ -const uint8_t u8g2_font_tom_thumb_4x6_tr[725] U8G2_FONT_SECTION("u8g2_font_tom_thumb_4x6_tr") = +const uint8_t u8g2_font_tom_thumb_4x6_tr[725] = "_\0\2\2\2\3\3\4\4\3\6\0\377\5\377\5\0\0\352\1\330\2\270 \5\340\315\0!\6\265\310" "\254\0\42\6\213\313$\25#\10\227\310\244\241\206\12$\10\227\310\215\70b\2%\10\227\310d\324F\1" "&\10\227\310(\65R\22'\5\251\313\10(\6\266\310\251\62)\10\226\310\304\224\24\0*\6\217\312\244" From b30aa890e6c8838d91bafe9bdbfa8a9717d92c2a Mon Sep 17 00:00:00 2001 From: TQMatvey Date: Wed, 11 Jan 2023 19:47:45 +0700 Subject: [PATCH 059/506] initial Somfy Telis Encoder (doesnt work) --- firmware/targets/f7/api_symbols.csv | 7 ++- lib/subghz/protocols/somfy_telis.c | 96 +++++++++++++++++++++++++++-- lib/subghz/protocols/somfy_telis.h | 46 ++++++++++++++ 3 files changed, 142 insertions(+), 7 deletions(-) diff --git a/firmware/targets/f7/api_symbols.csv b/firmware/targets/f7/api_symbols.csv index 0d7001578..b16b06685 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,+,11.6,, +Version,+,11.7,, Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/cli/cli.h,, Header,+,applications/services/cli/cli_vcp.h,, @@ -3061,6 +3061,11 @@ Function,-,subghz_protocol_encoder_smc5326_deserialize,_Bool,"void*, FlipperForm Function,-,subghz_protocol_encoder_smc5326_free,void,void* Function,-,subghz_protocol_encoder_smc5326_stop,void,void* Function,-,subghz_protocol_encoder_smc5326_yield,LevelDuration,void* +Function,-,subghz_protocol_encoder_somfy_telis_alloc,void*,SubGhzEnvironment* +Function,-,subghz_protocol_encoder_somfy_telis_deserialize,_Bool,"void*, FlipperFormat*" +Function,-,subghz_protocol_encoder_somfy_telis_free,void,void* +Function,-,subghz_protocol_encoder_somfy_telis_stop,void,void* +Function,-,subghz_protocol_encoder_somfy_telis_yield,LevelDuration,void* Function,-,subghz_protocol_encoder_star_line_alloc,void*,SubGhzEnvironment* Function,-,subghz_protocol_encoder_star_line_deserialize,_Bool,"void*, FlipperFormat*" Function,-,subghz_protocol_encoder_star_line_free,void,void* diff --git a/lib/subghz/protocols/somfy_telis.c b/lib/subghz/protocols/somfy_telis.c index 945a88405..c70305256 100644 --- a/lib/subghz/protocols/somfy_telis.c +++ b/lib/subghz/protocols/somfy_telis.c @@ -31,6 +31,8 @@ struct SubGhzProtocolEncoderSomfyTelis { SubGhzProtocolBlockEncoder encoder; SubGhzBlockGeneric generic; + + SubGhzKeystore* keystore; }; typedef enum { @@ -55,24 +57,106 @@ const SubGhzProtocolDecoder subghz_protocol_somfy_telis_decoder = { }; const SubGhzProtocolEncoder subghz_protocol_somfy_telis_encoder = { - .alloc = NULL, - .free = NULL, + .alloc = subghz_protocol_encoder_somfy_telis_alloc, + .free = subghz_protocol_encoder_somfy_telis_free, - .deserialize = NULL, - .stop = NULL, - .yield = NULL, + .deserialize = subghz_protocol_encoder_somfy_telis_deserialize, + .stop = subghz_protocol_encoder_somfy_telis_stop, + .yield = subghz_protocol_encoder_somfy_telis_yield, }; const SubGhzProtocol subghz_protocol_somfy_telis = { .name = SUBGHZ_PROTOCOL_SOMFY_TELIS_NAME, .type = SubGhzProtocolTypeDynamic, .flag = SubGhzProtocolFlag_433 | SubGhzProtocolFlag_868 | SubGhzProtocolFlag_AM | - SubGhzProtocolFlag_Decodable | SubGhzProtocolFlag_Save, + SubGhzProtocolFlag_Decodable | SubGhzProtocolFlag_Save | SubGhzProtocolFlag_Send, .decoder = &subghz_protocol_somfy_telis_decoder, .encoder = &subghz_protocol_somfy_telis_encoder, }; +void* subghz_protocol_encoder_somfy_telis_alloc(SubGhzEnvironment* environment) { + SubGhzProtocolEncoderSomfyTelis* instance = malloc(sizeof(SubGhzProtocolEncoderSomfyTelis)); + + instance->base.protocol = &subghz_protocol_somfy_telis; + instance->generic.protocol_name = instance->base.protocol->name; + instance->keystore = subghz_environment_get_keystore(environment); + + instance->encoder.repeat = 10; + instance->encoder.size_upload = 256; + instance->encoder.upload = malloc(instance->encoder.size_upload * sizeof(LevelDuration)); + instance->encoder.is_running = false; + + return instance; +} + +void subghz_protocol_encoder_somfy_telis_free(void* context) { + furi_assert(context); + SubGhzProtocolEncoderSomfyTelis* instance = context; + free(instance->encoder.upload); + free(instance); +} + +bool subghz_protocol_encoder_somfy_telis_deserialize(void* context, FlipperFormat* flipper_format) { + furi_assert(context); + SubGhzProtocolEncoderSomfyTelis* instance = context; + bool res = false; + do { + if(!subghz_block_generic_deserialize(&instance->generic, flipper_format)) { + FURI_LOG_E(TAG, "Deserialize error"); + break; + } + + //optional parameter parameter + flipper_format_read_uint32( + flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); + + //TODO: subghz_protocol_encoder_star_line_get_upload(instance, instance->generic.btn); + + if(!flipper_format_rewind(flipper_format)) { + FURI_LOG_E(TAG, "Rewind error"); + break; + } + uint8_t key_data[sizeof(uint64_t)] = {0}; + for(size_t i = 0; i < sizeof(uint64_t); i++) { + key_data[sizeof(uint64_t) - i - 1] = (instance->generic.data >> i * 8) & 0xFF; + } + if(!flipper_format_update_hex(flipper_format, "Key", key_data, sizeof(uint64_t))) { + FURI_LOG_E(TAG, "Unable to add Key"); + break; + } + + instance->encoder.is_running = true; + + res = true; + } while(false); + + return res; +} + +void subghz_protocol_encoder_somfy_telis_stop(void* context) { + SubGhzProtocolEncoderSomfyTelis* instance = context; + instance->encoder.is_running = false; +} + +LevelDuration subghz_protocol_encoder_somfy_telis_yield(void* context) { + SubGhzProtocolEncoderSomfyTelis* instance = context; + + if(instance->encoder.repeat == 0 || !instance->encoder.is_running) { + instance->encoder.is_running = false; + return level_duration_reset(); + } + + LevelDuration ret = instance->encoder.upload[instance->encoder.front]; + + if(++instance->encoder.front == instance->encoder.size_upload) { + instance->encoder.repeat--; + instance->encoder.front = 0; + } + + return ret; +} + void* subghz_protocol_decoder_somfy_telis_alloc(SubGhzEnvironment* environment) { UNUSED(environment); SubGhzProtocolDecoderSomfyTelis* instance = malloc(sizeof(SubGhzProtocolDecoderSomfyTelis)); diff --git a/lib/subghz/protocols/somfy_telis.h b/lib/subghz/protocols/somfy_telis.h index a6a9fa5b2..416ae32e2 100644 --- a/lib/subghz/protocols/somfy_telis.h +++ b/lib/subghz/protocols/somfy_telis.h @@ -11,6 +11,52 @@ extern const SubGhzProtocolDecoder subghz_protocol_somfy_telis_decoder; extern const SubGhzProtocolEncoder subghz_protocol_somfy_telis_encoder; extern const SubGhzProtocol subghz_protocol_somfy_telis; +/** + * Allocate SubGhzProtocolEncoderSomfyTelis. + * @param environment Pointer to a SubGhzEnvironment instance + * @return SubGhzProtocolEncoderSomfyTelis* pointer to a SubGhzProtocolEncoderSSomfyTelis instance + */ +void* subghz_protocol_encoder_somfy_telis_alloc(SubGhzEnvironment* environment); + +/** + * Free SubGhzProtocolEncoderSomfyTelis. + * @param context Pointer to a SubGhzProtocolEncoderSomfyTelis instance + */ +void subghz_protocol_encoder_somfy_telis_free(void* context); + +/** + * Key generation from simple data. + * @param context Pointer to a SubGhzProtocolEncoderSomfyTelis instance + * @param flipper_format Pointer to a FlipperFormat instance + * @param serial Serial number, 24 bit + * @param btn Button number, 8 bit + * @param cnt Counter value, 16 bit + * @param manufacture_name Name of manufacturer's key + * @param preset Modulation, SubGhzRadioPreset + * @return true On success + */ + +/** + * Deserialize and generating an upload to send. + * @param context Pointer to a SubGhzProtocolEncoderSomfyTelis instance + * @param flipper_format Pointer to a FlipperFormat instance + * @return true On success + */ +bool subghz_protocol_encoder_somfy_telis_deserialize(void* context, FlipperFormat* flipper_format); + +/** + * Forced transmission stop. + * @param context Pointer to a SubGhzProtocolEncoderSomfyTelis instance + */ +void subghz_protocol_encoder_somfy_telis_stop(void* context); + +/** + * Getting the level and duration of the upload to be loaded into DMA. + * @param context Pointer to a SubGhzProtocolEncoderSomfyTelis instance + * @return LevelDuration + */ +LevelDuration subghz_protocol_encoder_somfy_telis_yield(void* context); + /** * Allocate SubGhzProtocolDecoderSomfyTelis. * @param environment Pointer to a SubGhzEnvironment instance From 78139c5936845fbbaf189958ab5eb512d550d161 Mon Sep 17 00:00:00 2001 From: Fasjeit <15075638+Fasjeit@users.noreply.github.com> Date: Thu, 12 Jan 2023 11:35:42 +0300 Subject: [PATCH 060/506] drawing own battery (Bar %) charging display --- .../services/power/power_service/power.c | 67 +++++++++++++++++-- 1 file changed, 62 insertions(+), 5 deletions(-) diff --git a/applications/services/power/power_service/power.c b/applications/services/power/power_service/power.c index 251bae35d..824e6d4d4 100644 --- a/applications/services/power/power_service/power.c +++ b/applications/services/power/power_service/power.c @@ -74,10 +74,10 @@ void power_draw_battery_callback(Canvas* canvas, void* context) { } else if(bar_charge >= 62 && bar_charge < 74) { bar_charge = 74; } - canvas_set_color(canvas, ColorBlack); - canvas_draw_box(canvas, 1, 1, (bar_charge * 22) / 100, 6); // drawing digits + canvas_set_color(canvas, ColorBlack); + canvas_draw_box(canvas, 1, 1, (bar_charge * 22) / 100, 6); if(bar_charge < 38) { // both digits are black canvas_set_color(canvas, ColorBlack); canvas_draw_str_aligned( @@ -105,7 +105,7 @@ void power_draw_battery_callback(Canvas* canvas, void* context) { canvas_set_color(canvas, ColorBlack); canvas_draw_str_aligned( canvas, 15, 4, AlignCenter, AlignCenter, batteryPercentileSecondDigit); - } else { // charge >= 62, both digits are white + } else { // charge >= 74, both digits are white canvas_set_color(canvas, ColorWhite); canvas_draw_str_aligned( canvas, 11, 4, AlignCenter, AlignCenter, batteryPercentile); @@ -134,8 +134,7 @@ void power_draw_battery_callback(Canvas* canvas, void* context) { if(power->state == PowerStateCharging) { canvas_set_bitmap_mode(canvas, 1); // TODO: replace -1 magic for uint8_t with re-framing - if(power->displayBatteryPercentage == DISPLAY_BATTERY_PERCENT || - power->displayBatteryPercentage == DISPLAY_BATTERY_BAR_PERCENT) { + if(power->displayBatteryPercentage == DISPLAY_BATTERY_PERCENT) { canvas_set_color(canvas, ColorBlack); canvas_draw_box(canvas, 1, 1, 22, 6); canvas_draw_icon(canvas, 2, -1, &I_Charging_lightning_9x10); @@ -153,6 +152,64 @@ void power_draw_battery_callback(Canvas* canvas, void* context) { canvas_set_font(canvas, FontBatteryPercent); canvas_draw_str_aligned( canvas, 16, 4, AlignCenter, AlignCenter, batteryPercentile); + } else if(power->displayBatteryPercentage == DISPLAY_BATTERY_BAR_PERCENT) { + + // clean-up default charging bar display + canvas_set_color(canvas, ColorWhite); + canvas_draw_box(canvas, 1, 1, 22, 6); + + // align charge dispaly value with digits to draw + uint8_t bar_charge = power->info.charge; + + if(bar_charge > 48 && bar_charge < 63) { + bar_charge = 48; + } else if(bar_charge >= 63 && bar_charge < 84) { + bar_charge = 75; + } else if(bar_charge >= 84 && bar_charge < 96) { + bar_charge = 96; + } + canvas_set_color(canvas, ColorBlack); + canvas_draw_box(canvas, 1, 1, (bar_charge * 22) / 100, 6); + + // drawing charge icon + canvas_draw_icon(canvas, 2, -1, &I_Charging_lightning_9x10); + canvas_set_color(canvas, ColorWhite); + canvas_draw_icon(canvas, 2, -1, &I_Charging_lightning_mask_9x10); + + // drawing digits + canvas_set_font(canvas, FontBatteryPercent); + if(bar_charge < 64) { // both digits are black + canvas_set_color(canvas, ColorBlack); + canvas_draw_str_aligned( + canvas, 16, 4, AlignCenter, AlignCenter, batteryPercentile); + } else if(bar_charge >= 64 && bar_charge < 84) { // first digit is white + canvas_set_color(canvas, ColorWhite); + + // first + char batteryPercentileFirstDigit[2]; + snprintf( + batteryPercentileFirstDigit, + sizeof(batteryPercentileFirstDigit), + "%c", + batteryPercentile[0]); + canvas_draw_str_aligned( + canvas, 14, 4, AlignCenter, AlignCenter, batteryPercentileFirstDigit); + + // second + char batteryPercentileSecondDigit[2]; + snprintf( + batteryPercentileSecondDigit, + sizeof(batteryPercentileSecondDigit), + "%c", + batteryPercentile[1]); + canvas_set_color(canvas, ColorBlack); + canvas_draw_str_aligned( + canvas, 20, 4, AlignCenter, AlignCenter, batteryPercentileSecondDigit); + } else { // charge >= 84, both digits are white + canvas_set_color(canvas, ColorWhite); + canvas_draw_str_aligned( + canvas, 16, 4, AlignCenter, AlignCenter, batteryPercentile); + } } else { canvas_set_color(canvas, ColorWhite); canvas_draw_icon(canvas, 8, -1, &I_Charging_lightning_mask_9x10); From 70f0ab1442041899ad231bebed9dbacbbed13f01 Mon Sep 17 00:00:00 2001 From: amec0e <88857687+amec0e@users.noreply.github.com> Date: Fri, 13 Jan 2023 17:37:13 +0000 Subject: [PATCH 061/506] Updated ac.ir --- assets/resources/infrared/assets/ac.ir | 34 ++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/assets/resources/infrared/assets/ac.ir b/assets/resources/infrared/assets/ac.ir index b656c309f..20a72e0ca 100644 --- a/assets/resources/infrared/assets/ac.ir +++ b/assets/resources/infrared/assets/ac.ir @@ -1,7 +1,37 @@ Filetype: IR library file Version: 1 -# Last Updated 7th Jan, 2023 -# Last Checked 7th Jan, 2023 +# Last Updated 13th Jan, 2023 +# Last Checked 13th Jan, 2023 +# +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 8714 4338 579 538 551 540 549 542 557 1613 555 1615 553 538 551 540 549 1619 549 1620 558 1612 556 1614 554 1617 551 540 559 1611 557 1612 556 531 558 1613 555 536 553 538 551 1620 558 1612 556 535 554 537 552 535 554 537 552 1618 550 1620 558 533 556 536 553 1617 551 1617 551 1608 549 +# +name: MODE +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 8710 4341 576 541 558 533 556 535 554 1616 552 1618 550 542 557 533 556 1612 556 1614 554 1616 552 1618 550 1621 557 534 555 1615 553 1616 552 536 553 538 551 541 558 533 556 1613 555 537 552 539 550 541 558 528 550 1619 559 1610 557 1612 556 536 553 1616 552 1618 550 1619 559 1598 559 +# +name: TIMER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 8717 4334 583 534 555 537 552 539 550 1620 558 1611 557 535 554 536 553 1615 553 1617 551 1619 559 1611 557 1613 555 537 552 1617 551 1619 559 528 550 541 558 1612 556 535 554 1616 552 1619 549 543 556 534 555 532 557 1614 554 537 552 1619 559 533 556 535 554 1616 552 1617 551 1608 549 +# +name: TEMP+ +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 8714 4337 580 538 551 540 559 533 556 1613 555 1615 553 539 550 541 558 1608 560 1611 557 1587 581 1590 578 1593 575 542 557 1613 555 1614 554 534 555 1615 553 539 550 1620 558 534 555 536 553 539 550 541 558 529 549 541 558 1612 556 536 553 1617 551 1619 559 1611 557 1613 555 1603 554 +# +name: TEMP- +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 8711 4341 576 541 558 534 555 536 553 1616 552 1618 549 542 557 533 556 1611 557 1613 555 1614 554 1616 552 1619 559 532 557 1613 555 1614 554 533 556 1614 554 538 551 541 558 1611 557 535 554 537 552 539 550 537 552 540 549 1620 558 1612 556 536 553 1617 550 1619 559 1610 558 1601 556 # # POWER_ON name: POWER From c89a594d308e6d9aa43f76b16c6559b61fea010f Mon Sep 17 00:00:00 2001 From: amec0e <88857687+amec0e@users.noreply.github.com> Date: Fri, 13 Jan 2023 17:37:44 +0000 Subject: [PATCH 062/506] Updated audio.ir --- assets/resources/infrared/assets/audio.ir | 3070 ++++++++++----------- 1 file changed, 1517 insertions(+), 1553 deletions(-) diff --git a/assets/resources/infrared/assets/audio.ir b/assets/resources/infrared/assets/audio.ir index f43991573..5a0b18658 100644 --- a/assets/resources/infrared/assets/audio.ir +++ b/assets/resources/infrared/assets/audio.ir @@ -1,14 +1,14 @@ Filetype: IR library file Version: 1 -# Last Updated 7th Jan, 2023 -# Last Checked 7th Jan, 2023 +# Last Updated 13th Jan, 2023 +# Last Checked 13th Jan, 2023 # name: POWER type: parsed protocol: NEC address: 77 00 00 00 command: F1 00 00 00 -# +# name: MUTE type: parsed protocol: NEC @@ -26,61 +26,61 @@ type: parsed protocol: NEC address: 77 00 00 00 command: FC 00 00 00 -# +# name: POWER type: parsed protocol: NEC address: 80 00 00 00 command: 1A 00 00 00 -# +# name: POWER type: parsed protocol: NECext address: 10 E7 00 00 command: 46 B9 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: 10 E7 00 00 command: 06 F9 00 00 -# +# name: VOL- type: parsed protocol: NECext address: 10 E7 00 00 command: 47 B8 00 00 -# +# name: MUTE type: parsed protocol: NECext address: 10 E7 00 00 command: 41 BE 00 00 -# +# name: POWER type: parsed protocol: RC5 address: 10 00 00 00 command: 0C 00 00 00 -# +# name: MUTE type: parsed protocol: RC5 address: 10 00 00 00 command: 0D 00 00 00 -# +# name: VOL+ type: parsed protocol: RC5 address: 10 00 00 00 command: 10 00 00 00 -# +# name: VOL- type: parsed protocol: RC5 address: 10 00 00 00 command: 11 00 00 00 -# +# name: POWER type: parsed protocol: NEC @@ -140,7 +140,7 @@ type: parsed protocol: SIRC15 address: 44 00 00 00 command: 12 00 00 00 -# +# name: VOL- type: parsed protocol: SIRC15 @@ -152,25 +152,25 @@ type: parsed protocol: SIRC15 address: 44 00 00 00 command: 14 00 00 00 -# +# name: POWER type: parsed protocol: NECext address: 02 A0 00 00 command: 80 7F 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: 02 A0 00 00 command: AA 55 00 00 -# +# name: VOL- type: parsed protocol: NECext address: 02 A0 00 00 command: 6A 95 00 00 -# +# name: MUTE type: parsed protocol: NECext @@ -200,7 +200,7 @@ type: parsed protocol: NEC address: 04 00 00 00 command: 06 00 00 00 -# +# name: POWER type: parsed protocol: NECext @@ -224,25 +224,25 @@ type: parsed protocol: NECext address: 29 A1 00 00 command: 9F 60 00 00 -# +# name: POWER type: parsed protocol: NEC address: 7A 00 00 00 command: 1F 00 00 00 -# +# name: POWER type: parsed protocol: NEC address: 00 00 00 00 command: 1C 00 00 00 -# +# name: MUTE type: parsed protocol: NEC address: 00 00 00 00 command: 0B 00 00 00 -# +# name: VOL+ type: parsed protocol: NEC @@ -254,49 +254,49 @@ type: parsed protocol: NEC address: 00 00 00 00 command: 05 00 00 00 -# +# name: VOL+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 4617 4406 584 448 557 448 557 449 556 449 555 1430 580 1432 577 452 552 454 550 1460 549 1462 548 1462 549 1462 548 457 548 457 548 457 548 457 548 4463 548 457 548 457 548 457 548 458 548 1462 548 1462 548 1462 548 457 548 1463 547 1462 548 1462 548 458 547 458 548 458 548 458 547 1463 547 458 547 458 547 458 548 1463 547 55451 4606 4440 549 457 548 457 548 457 548 457 548 1462 548 1462 548 457 548 457 548 1462 548 1461 549 1462 548 1462 548 457 548 457 548 457 548 457 548 4462 548 457 548 457 548 457 548 457 548 1462 548 1462 548 1462 548 457 548 1462 548 1462 548 1462 547 457 548 458 547 458 547 458 547 1462 548 458 547 458 547 458 547 1462 548 -# +# name: VOL- type: raw frequency: 38000 duty_cycle: 0.330000 data: 4614 4408 583 449 555 450 555 451 553 451 554 1432 577 1434 576 453 551 454 550 1460 549 1461 549 1461 549 1461 549 457 548 457 548 457 548 457 548 4461 548 457 548 457 548 457 548 457 548 457 548 457 548 457 548 1462 548 1461 549 1461 549 1461 548 457 548 1462 549 1461 549 1461 548 457 548 457 548 457 548 458 547 1462 548 55443 4606 4440 549 456 549 456 549 456 549 456 549 1461 549 1461 549 457 548 457 548 1461 549 1461 549 1461 549 1461 549 456 549 457 548 457 548 457 548 4461 549 456 549 457 548 457 548 457 548 457 548 457 548 457 548 1462 548 1461 549 1461 549 1461 548 457 548 1461 549 1461 549 1461 549 457 548 457 548 458 547 457 548 1462 548 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 4588 4435 556 477 556 449 555 450 555 451 554 1428 582 1429 581 451 553 452 552 1457 552 1458 551 1461 548 1463 547 458 547 458 547 458 547 458 547 4464 547 458 547 458 547 458 547 458 548 458 547 458 547 458 548 458 547 1463 547 1463 547 1464 546 459 547 1464 546 1464 546 1463 547 1464 546 459 546 459 546 459 546 1464 547 55456 4581 4468 546 458 547 458 547 458 547 458 547 1463 547 1463 547 458 547 459 547 1463 547 1464 546 1464 546 1464 547 459 546 459 546 459 546 459 547 4465 546 459 546 459 546 459 546 459 546 459 547 459 546 459 546 459 546 1464 546 1464 546 1465 546 460 545 1465 545 1465 545 1465 546 1465 546 460 545 460 546 460 545 1466 544 -# +# name: POWER type: parsed protocol: NECext address: 3F 5C 00 00 command: 18 E7 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: 3F 5C 00 00 command: 55 AA 00 00 -# +# name: VOL- type: parsed protocol: NECext address: 3F 5C 00 00 command: 59 A6 00 00 -# +# name: MUTE type: parsed protocol: NECext address: 3F 5C 00 00 command: 15 EA 00 00 -# +# name: MUTE type: parsed protocol: NECext @@ -320,25 +320,25 @@ type: parsed protocol: NECext address: 00 FB 00 00 command: 0A F5 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: 80 D9 00 00 command: 8A 75 00 00 -# +# name: VOL- type: parsed protocol: NECext address: 80 D9 00 00 command: 88 77 00 00 -# +# name: MUTE type: parsed protocol: NECext address: 80 D9 00 00 command: 8C 73 00 00 -# +# name: POWER type: parsed protocol: NECext @@ -362,13 +362,13 @@ type: parsed protocol: NECext address: 78 0E 00 00 command: 18 E7 00 00 -# +# name: VOL+ type: parsed protocol: NEC address: 20 00 00 00 command: 14 00 00 00 -# +# name: VOL- type: parsed protocol: NEC @@ -381,1555 +381,48 @@ type: parsed protocol: RC5 address: 10 00 00 00 command: 0E 00 00 00 -# +# name: VOL- type: parsed protocol: NECext address: 10 E7 00 00 command: 0C F3 00 00 -# +# name: VOL+ type: parsed protocol: NECext address: 10 E7 00 00 command: 09 F6 00 00 -# +# name: POWER type: raw frequency: 38000 duty_cycle: 0.330000 data: 3309 1906 410 1178 411 1177 412 416 435 445 406 448 414 440 411 1150 439 415 436 1178 411 1177 412 442 409 444 407 1181 408 419 432 1182 407 420 442 1146 433 448 414 440 411 442 409 444 407 446 416 438 413 441 410 443 408 419 432 1182 407 446 405 422 440 414 437 416 435 445 406 1181 408 446 405 448 414 440 411 442 409 418 433 446 416 438 413 1175 414 413 438 1176 413 414 437 443 408 419 432 421 441 413 438 42493 3308 3343 355 43011 3309 3316 382 43009 3310 3314 384 43007 3303 3347 361 -# +# name: VOL+ type: raw frequency: 38000 duty_cycle: 0.330000 data: 3307 1879 437 1177 412 1176 413 415 436 417 434 446 405 448 414 1174 415 412 439 1149 440 1147 442 438 413 440 411 1177 412 441 410 1178 411 442 409 1179 410 417 434 419 432 448 414 440 411 442 409 444 407 446 416 438 413 441 410 1151 438 415 436 444 407 446 416 412 439 414 437 1177 412 1176 413 414 437 416 435 1152 437 1177 412 416 435 444 407 446 416 1146 433 421 441 1173 406 422 440 413 438 442 409 444 407 40133 3308 3341 357 42862 3301 3347 361 42859 3304 3319 379 -# +# name: VOL- type: raw frequency: 38000 duty_cycle: 0.330000 data: 3310 1876 440 1174 415 1173 405 422 440 414 437 443 408 445 406 1182 407 420 442 1173 406 1182 407 420 442 412 439 1175 414 440 411 1150 439 415 436 1152 437 416 435 419 432 447 415 440 411 442 409 418 433 420 442 438 413 440 411 1177 412 415 436 418 433 420 442 438 413 441 410 1151 438 1150 439 415 436 1178 411 1150 439 1149 440 414 437 417 434 445 406 1155 434 420 442 438 413 1175 414 413 438 442 409 444 407 39503 3303 3320 388 42857 3304 3319 379 42867 3305 3317 381 -# +# name: MUTE type: raw frequency: 38000 duty_cycle: 0.330000 data: 3305 1907 409 1178 411 1177 412 442 409 418 433 447 415 439 412 1176 413 441 410 1177 412 1176 413 441 410 443 408 1180 409 445 406 1181 408 446 416 1172 406 448 413 440 411 442 409 445 406 447 414 439 412 442 409 444 407 447 414 1173 405 449 413 441 410 443 408 446 405 448 413 1174 415 440 411 442 409 1178 411 1177 412 1177 412 442 409 444 407 447 415 439 412 441 410 444 407 1180 409 445 406 448 414 440 411 41125 3303 3347 360 42906 3308 3315 382 -# +# name: MUTE type: parsed protocol: NECext address: BA A0 00 00 command: 01 FE 00 00 -# -name: POWER -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 3469 1719 450 447 423 1293 447 451 419 452 418 454 416 455 425 446 424 447 423 449 421 450 420 451 419 452 418 454 416 1300 450 447 423 449 421 450 420 451 419 453 417 454 416 455 425 1291 449 449 421 1295 445 452 418 454 416 1300 450 1292 448 1295 445 453 417 454 426 445 425 1291 449 449 421 1295 445 1297 453 1289 451 1292 448 450 420 452 418 1298 452 445 425 446 424 448 422 449 420 450 420 452 418 1298 452 74868 3471 1717 453 445 425 1291 449 449 421 451 419 452 418 453 417 455 425 446 424 447 423 448 422 449 421 451 419 452 418 1298 452 445 425 447 423 448 422 449 421 451 419 452 418 454 416 1300 450 447 423 1293 447 451 419 453 417 1299 451 1291 449 1293 447 451 419 453 417 454 426 1290 450 447 423 1293 447 1296 444 1299 451 1291 449 449 421 450 420 1296 444 454 426 445 425 446 424 448 422 449 421 450 420 1296 444 74877 3472 1716 443 455 425 1291 449 448 422 450 420 451 419 453 417 454 426 445 425 446 424 447 423 449 421 450 420 451 419 1298 452 445 425 446 424 448 422 449 421 450 420 452 418 453 417 1299 451 447 423 1293 447 451 419 452 418 1298 452 1290 450 1293 447 451 419 452 418 454 416 1300 450 447 423 1293 447 1296 444 1299 451 1291 449 449 421 450 420 1296 444 454 426 445 425 446 424 447 423 449 421 450 420 1296 444 -# -name: VOL+ -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 3472 1743 416 455 425 1317 422 449 420 451 418 453 416 454 426 445 424 447 422 448 421 450 419 452 417 453 416 455 425 1317 422 449 420 450 419 452 417 454 415 455 425 446 423 448 421 1320 419 452 417 1325 425 447 422 448 421 450 419 452 417 453 416 455 425 446 423 448 421 449 420 451 418 452 417 454 415 456 424 1317 422 449 420 451 418 453 416 455 425 446 423 447 422 449 420 450 419 452 417 1324 426 74911 3469 1746 423 448 421 1321 418 453 416 455 425 446 423 447 422 449 420 450 419 452 417 454 415 455 425 446 423 448 421 1320 419 452 417 454 426 445 424 447 422 448 421 450 419 452 417 1324 426 446 423 1291 448 450 419 452 417 454 415 455 425 446 423 448 421 450 419 451 418 453 416 454 426 446 423 447 422 449 420 1294 445 453 416 455 425 446 423 448 421 449 420 451 418 453 416 454 426 445 424 1290 449 -# -name: VOL- -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 3473 1742 417 454 426 1317 422 448 421 450 419 452 417 453 416 455 425 446 423 447 422 449 420 451 418 452 417 454 415 1326 424 448 421 449 420 451 418 453 416 454 426 445 425 447 422 1320 419 452 417 1324 426 446 423 447 422 449 420 450 419 452 417 454 415 455 425 446 423 1319 420 451 418 453 416 454 426 445 424 1318 421 450 419 452 417 1324 426 446 423 447 422 449 420 451 418 452 417 454 415 1326 424 74913 3467 1748 421 450 419 1323 416 455 425 446 423 447 422 449 420 451 418 452 417 454 415 455 425 446 423 448 421 449 420 1322 417 454 426 445 424 447 422 448 421 450 419 452 417 453 416 1326 424 447 422 1320 419 452 417 454 415 455 425 446 423 448 421 450 419 451 418 453 416 1325 425 447 422 448 421 450 419 452 417 1324 426 446 423 447 422 1320 419 452 417 454 415 455 425 446 423 448 421 450 419 1322 417 -# -name: MUTE -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 3473 1716 453 445 425 1291 448 422 447 424 446 453 416 427 453 446 423 420 449 449 420 423 446 425 444 454 426 418 451 1291 448 423 446 452 417 454 415 428 452 446 423 421 448 422 447 1296 443 455 425 1290 449 449 420 423 446 425 444 427 453 445 424 420 449 449 420 423 446 425 444 1298 452 419 450 448 421 1294 445 1298 452 446 423 448 421 449 420 1296 443 427 453 445 424 1292 447 423 446 452 417 1299 451 74922 3472 1717 452 446 423 1292 447 451 418 452 417 454 426 445 424 447 423 449 420 450 419 452 417 454 415 455 425 446 424 1293 446 451 418 453 416 455 425 446 423 447 422 449 420 451 418 1297 453 445 424 1292 447 450 419 452 417 454 415 455 425 446 423 448 421 450 419 451 418 453 416 1300 450 448 421 449 420 1296 443 1299 451 447 422 449 420 450 419 1297 442 455 425 447 422 1293 446 451 418 453 416 1300 450 -# -name: POWER -type: parsed -protocol: NEC -address: 01 00 00 00 -command: 02 00 00 00 -# -name: VOL+ -type: parsed -protocol: NEC -address: 01 00 00 00 -command: 01 00 00 00 -# -name: VOL- -type: parsed -protocol: NEC -address: 01 00 00 00 -command: 0B 00 00 00 -# -name: MUTE -type: parsed -protocol: NEC -address: 01 00 00 00 -command: 06 00 00 00 -# -name: POWER -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 9150 4435 643 1608 643 468 644 469 642 364 749 468 643 447 665 449 663 469 643 452 660 470 642 450 662 442 670 449 662 469 643 1579 672 1608 642 1580 671 1609 641 1607 643 1578 672 1607 643 1608 642 1606 644 1606 644 1606 644 1607 643 1576 675 1579 671 1605 674 438 645 466 673 438 646 466 674 437 673 439 672 439 673 438 646 1604 673 1577 673 1578 673 1577 674 1577 673 23799 9095 4485 616 -# -name: VOL+ -type: parsed -protocol: NEC42 -address: 01 00 00 00 -command: 0C 00 00 00 -# -name: VOL- -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 9151 4434 644 1608 643 376 737 379 733 446 666 449 663 468 644 469 643 468 644 468 644 468 644 447 665 448 664 468 644 450 662 1608 643 1607 644 1576 676 1607 644 1608 643 1578 674 1608 643 1577 674 1579 672 1607 643 1608 643 1607 644 1607 644 1608 643 448 664 1608 643 448 664 468 644 469 643 380 732 468 644 469 643 1607 644 468 644 1608 643 1608 644 1609 643 1608 643 23837 9152 4434 642 -# -name: POWER -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 8968 4344 670 460 670 460 670 1566 669 462 668 486 643 487 642 489 641 1595 640 490 640 491 640 1596 640 491 640 1596 640 1596 640 1596 640 491 640 1596 640 1596 640 1596 640 1596 640 1596 640 1596 640 1596 640 1622 640 491 640 491 640 491 640 491 640 491 640 491 640 491 640 491 639 -# -name: POWER -type: parsed -protocol: SIRC -address: 10 00 00 00 -command: 2E 00 00 00 -# -name: POWER -type: parsed -protocol: NECext -address: 00 FD 00 00 -command: 01 FE 00 00 -# -name: MUTE -type: parsed -protocol: NECext -address: 00 FD 00 00 -command: 03 FC 00 00 -# -name: VOL+ -type: parsed -protocol: NECext -address: 00 FD 00 00 -command: 09 F6 00 00 -# -name: VOL- -type: parsed -protocol: NECext -address: 00 FD 00 00 -command: 07 F8 00 00 -# -name: POWER -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 1042 1461 540 1460 541 1460 541 1460 541 1459 542 1459 542 454 536 460 540 456 544 452 538 458 542 454 546 450 540 456 544 1457 544 1456 545 1448 542 50531 1041 1462 539 1462 539 1461 540 1461 540 1460 541 1460 541 455 545 451 539 457 543 480 510 459 541 481 519 451 539 457 543 1457 543 1457 544 1449 541 50515 1037 1467 544 1456 545 1456 545 1455 546 1455 535 1465 536 486 514 483 517 479 511 485 515 481 509 487 513 483 517 478 512 1462 539 1462 539 1454 536 50537 1035 1467 544 1457 544 1457 544 1456 545 1456 544 1456 545 477 513 483 517 479 511 486 514 481 519 477 513 484 516 479 511 1464 536 1463 538 1455 546 -# -name: POWER -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 1010 1491 509 1490 510 1488 512 487 513 487 513 1486 514 1485 515 484 516 1483 517 482 518 482 518 1481 509 1489 511 488 512 487 513 1486 514 484 516 50963 1011 1489 511 1488 512 1487 513 485 515 486 514 1485 515 1484 516 484 516 1483 517 482 518 482 518 1481 509 1489 511 489 511 489 511 1487 513 486 514 50986 1008 1492 518 1480 510 1488 512 487 513 487 513 1486 514 1484 516 484 516 1483 517 482 518 481 519 1480 510 1488 512 487 513 487 513 1486 514 484 516 50972 1012 1488 512 1486 514 1484 516 483 517 483 517 1482 518 1480 510 489 511 1487 513 486 514 486 514 1485 515 1483 517 483 517 483 517 1481 509 490 510 50976 1008 1491 509 1489 511 1487 513 485 515 485 515 1484 516 1481 509 491 509 1489 511 488 512 488 512 1487 513 1485 515 484 516 484 516 1483 517 481 509 -# -name: POWER -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 1011 1479 517 477 516 481 512 1480 516 1473 513 482 511 485 518 1473 513 482 511 1481 515 1474 512 482 511 485 518 1473 513 1477 509 486 517 1473 513 50728 1014 1475 511 484 509 487 516 1475 511 1479 517 477 516 480 513 1478 508 487 516 1475 511 1479 517 478 514 480 513 1479 517 1473 513 508 484 1479 517 50725 1016 1473 513 481 512 484 519 1473 513 1477 509 485 518 478 515 1476 510 485 518 1473 513 1477 509 486 517 478 515 1476 510 1480 516 479 514 1476 510 50735 1069 1421 513 481 512 484 509 1483 513 1477 509 486 517 479 514 1477 509 486 517 1474 512 1479 507 488 515 480 513 1479 507 1483 513 482 511 1479 517 50733 1011 1478 508 513 490 506 486 1478 508 1483 513 508 485 511 482 1482 514 508 485 1480 516 1473 513 508 485 511 482 1483 513 1477 509 512 491 1473 513 50735 1008 1480 516 479 514 508 485 1480 516 1474 512 509 484 486 517 1472 514 508 485 1480 516 1474 512 509 484 512 481 1482 514 1477 509 512 491 1472 514 50738 1006 1509 487 508 485 486 507 1509 487 1503 483 513 490 505 488 1502 484 512 491 1473 513 1503 483 512 491 505 488 1476 510 1507 489 506 487 1503 483 -# -name: MUTE -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 1010 1479 517 1474 512 509 484 512 491 505 488 507 486 510 483 512 491 505 488 508 485 1505 491 1474 512 1478 508 1483 513 1477 509 1482 514 1475 511 50713 1005 1483 513 1475 511 511 482 513 490 505 488 507 486 483 510 511 482 487 516 505 488 1501 485 1478 508 1483 513 1476 510 1479 507 1483 513 1474 512 50707 1012 1501 485 1479 506 513 490 505 488 507 486 509 484 511 482 487 516 505 488 508 485 1504 482 1482 514 1476 592 1396 590 1400 513 1476 510 1478 508 50715 1015 1473 513 1476 510 484 508 513 490 504 489 480 513 508 485 483 510 511 482 488 515 1473 513 1477 509 1480 516 1474 512 1477 591 1397 516 1472 514 -# -name: VOL+ -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 1041 1462 538 1462 538 485 515 481 519 478 512 484 516 1458 542 1458 542 1459 541 481 519 1481 519 1455 545 1482 518 1456 544 479 511 486 514 474 516 50532 1039 1464 536 1490 510 487 513 483 517 480 510 486 514 1460 540 1486 514 1460 540 483 517 1457 543 1484 516 1458 542 1458 542 481 519 477 513 476 513 50534 1036 1467 543 1457 543 480 509 460 540 483 517 479 511 1463 537 1463 537 1464 536 486 514 1487 513 1461 539 1461 539 1462 538 484 516 481 519 469 510 -# -name: VOL- -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 1042 1461 539 457 543 1458 542 1458 542 1458 542 1458 542 454 536 461 539 457 543 1457 543 453 537 460 540 456 544 452 538 1463 537 1463 537 1456 544 50530 1065 1438 572 424 566 1434 566 1435 565 1435 565 1436 544 452 537 459 572 424 545 1456 544 451 539 458 542 454 536 460 540 1461 539 1461 539 1454 536 50538 1036 1467 543 452 537 1464 536 1464 536 1464 536 1465 545 450 540 456 544 452 537 1464 536 460 540 455 545 452 538 458 542 1459 541 1460 540 1452 538 -# -name: VOL+ -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 1044 1456 544 455 545 455 534 1464 536 1462 538 1460 540 1458 542 1456 544 1455 545 1453 537 1461 539 460 540 459 541 459 561 437 542 457 543 456 544 50915 1016 1483 517 482 518 482 518 1481 509 1489 511 1487 513 1486 514 1485 515 1483 517 1482 508 1490 510 489 511 488 512 487 513 487 513 486 514 485 515 50956 1047 1452 538 462 538 462 538 1461 539 1460 540 1458 542 1457 543 1456 544 1454 546 1453 547 1451 539 461 539 460 540 460 540 459 541 459 541 457 543 -# -name: VOL- -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 1017 1484 516 1482 518 481 519 1480 510 1489 511 1487 513 1486 514 1485 515 1483 517 482 518 1480 510 490 510 489 511 489 511 488 512 488 512 486 514 50956 1015 1486 514 1484 516 484 516 1483 517 1482 518 1480 510 1489 511 1488 512 1486 514 486 514 1485 515 484 516 484 516 483 517 483 517 482 518 481 509 50960 1011 1488 512 1486 514 486 514 1485 515 1483 517 1482 518 1480 510 1488 512 1486 514 486 514 1484 516 483 517 483 517 482 518 481 519 481 508 489 511 50961 1040 1461 539 1459 541 459 541 1458 542 1456 544 1455 545 1454 546 1452 538 1460 540 460 540 1458 542 457 543 456 544 456 544 455 545 455 545 453 547 -# -name: VOL+ -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 1006 1485 511 1479 517 1473 513 509 484 511 482 514 489 506 487 508 485 511 482 513 490 505 488 1477 509 1481 515 1475 511 1480 516 1474 512 1477 509 50734 1007 1483 513 1477 509 1482 514 507 486 509 484 511 492 503 490 506 487 508 485 510 483 513 490 1474 512 1479 517 1473 513 1477 509 1481 515 1474 512 50729 1012 1477 509 1481 515 1474 512 509 484 512 491 504 489 506 487 508 485 511 482 513 490 506 487 1477 509 1481 515 1475 511 1479 517 1473 513 1476 510 -# -name: VOL- -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 1012 1503 483 514 489 1475 511 483 510 486 517 478 515 481 512 483 510 486 517 1473 513 508 485 1480 516 1475 511 1479 507 1483 513 1477 509 1480 588 50646 1012 1476 510 512 491 1473 513 508 485 485 508 488 515 480 513 482 511 512 481 1482 514 482 511 1480 516 1473 513 1478 508 1482 514 1476 510 1479 590 50651 1007 1507 489 507 485 1478 508 514 489 506 487 509 484 485 508 488 515 506 487 1503 483 513 490 1474 512 1478 508 1483 513 1477 509 1481 515 1473 513 50721 1009 1505 491 478 515 1475 511 510 483 486 517 478 515 507 486 483 510 512 491 1472 514 508 485 1505 491 1473 513 1477 509 1481 587 1403 510 1478 508 50733 1008 1506 490 479 514 1477 509 512 481 514 489 506 487 508 485 484 509 513 490 1473 513 509 483 1481 515 1474 512 1479 507 1482 514 1476 510 1478 590 50642 1006 1508 488 508 485 1478 508 487 516 479 514 481 512 510 483 486 517 504 489 1474 512 510 483 1482 514 1475 511 1479 507 1483 513 1477 509 1480 516 -# -name: POWER -type: parsed -protocol: NEC -address: 20 00 00 00 -command: 09 00 00 00 -# -name: MUTE -type: parsed -protocol: NEC -address: 20 00 00 00 -command: 1F 00 00 00 -# -name: VOL+ -type: parsed -protocol: NEC -address: 20 00 00 00 -command: 0E 00 00 00 -# -name: VOL- -type: parsed -protocol: NEC -address: 20 00 00 00 -command: 1A 00 00 00 -# -name: VOL+ -type: parsed -protocol: NEC -address: 20 00 00 00 -command: 02 00 00 00 -# -name: VOL- -type: parsed -protocol: NEC -address: 20 00 00 00 -command: 05 00 00 00 -# -name: POWER -type: parsed -protocol: NEC -address: 20 00 00 00 -command: 0C 00 00 00 -# -name: MUTE -type: parsed -protocol: NEC -address: 20 00 00 00 -command: 08 00 00 00 -# -name: POWER -type: parsed -protocol: NEC -address: 00 00 00 00 -command: 12 00 00 00 -# -name: MUTE -type: parsed -protocol: NEC -address: 00 00 00 00 -command: 1E 00 00 00 -# -name: VOL+ -type: parsed -protocol: NEC -address: 00 00 00 00 -command: 03 00 00 00 -# -name: VOL- -type: parsed -protocol: NEC -address: 00 00 00 00 -command: 01 00 00 00 -# -name: VOL+ -type: parsed -protocol: NEC -address: 00 00 00 00 -command: 1F 00 00 00 -# -name: VOL- -type: parsed -protocol: NEC -address: 00 00 00 00 -command: 09 00 00 00 -# -name: POWER -type: parsed -protocol: NECext -address: 10 E7 00 00 -command: 01 FE 00 00 -# -name: MUTE -type: parsed -protocol: NECext -address: 10 E7 00 00 -command: 00 FF 00 00 -# -name: MUTE -type: parsed -protocol: NECext -address: 10 E7 00 00 -command: 2B D4 00 00 -# -name: MUTE -type: parsed -protocol: NECext -address: 78 0E 00 00 -command: 09 F6 00 00 -# -name: VOL+ -type: parsed -protocol: NECext -address: 78 0E 00 00 -command: 01 FE 00 00 -# -name: VOL- -type: parsed -protocol: NECext -address: 78 0E 00 00 -command: 02 FD 00 00 -# -name: VOL- -type: parsed -protocol: NEC -address: 00 00 00 00 -command: 06 00 00 00 -# -name: POWER -type: parsed -protocol: NEC -address: 02 00 00 00 -command: 0A 00 00 00 -# -name: MUTE -type: parsed -protocol: NEC -address: 02 00 00 00 -command: 0D 00 00 00 -# -name: VOL+ -type: parsed -protocol: NEC -address: 02 00 00 00 -command: 1C 00 00 00 -# -name: VOL- -type: parsed -protocol: NEC -address: 02 00 00 00 -command: 07 00 00 00 -# -name: VOL+ -type: parsed -protocol: NEC -address: 00 00 00 00 -command: 14 00 00 00 -# -name: VOL- -type: parsed -protocol: NEC -address: 00 00 00 00 -command: 08 00 00 00 -# -name: VOL+ -type: parsed -protocol: NECext -address: 86 FF 00 00 -command: 14 EB 00 00 -# -name: VOL- -type: parsed -protocol: NECext -address: 86 FF 00 00 -command: 13 EC 00 00 -# -name: POWER -type: parsed -protocol: NECext -address: 86 FF 00 00 -command: 1B E4 00 00 -# -name: MUTE -type: parsed -protocol: NECext -address: 86 FF 00 00 -command: 2A D5 00 00 -# -name: POWER -type: parsed -protocol: NEC -address: 00 00 00 00 -command: 07 00 00 00 -# -name: MUTE -type: parsed -protocol: NEC -address: 00 00 00 00 -command: 00 00 00 00 -# -name: MUTE -type: parsed -protocol: NECext -address: 40 AF 00 00 -command: 19 E6 00 00 -# -name: VOL+ -type: parsed -protocol: NECext -address: 02 BD 00 00 -command: 26 D9 00 00 -# -name: VOL- -type: parsed -protocol: NECext -address: 02 BD 00 00 -command: 28 D7 00 00 -# -name: POWER -type: parsed -protocol: NECext -address: 02 BD 00 00 -command: 53 AC 00 00 -# -name: MUTE -type: parsed -protocol: NECext -address: 02 BD 00 00 -command: AD 52 00 00 -# -name: POWER -type: parsed -protocol: SIRC -address: 10 00 00 00 -command: 2F 00 00 00 -# -name: VOL+ -type: parsed -protocol: SIRC -address: 10 00 00 00 -command: 12 00 00 00 -# -name: VOL- -type: parsed -protocol: SIRC -address: 10 00 00 00 -command: 13 00 00 00 -# -name: POWER -type: parsed -protocol: NECext -address: 85 23 00 00 -command: 99 66 00 00 -# -name: MUTE -type: parsed -protocol: NECext -address: 85 23 00 00 -command: 97 68 00 00 -# -name: VOL+ -type: parsed -protocol: NECext -address: 85 23 00 00 -command: 57 A8 00 00 -# -name: VOL- -type: parsed -protocol: NECext -address: 85 23 00 00 -command: 47 B8 00 00 -# -name: POWER -type: parsed -protocol: NEC -address: 08 00 00 00 -command: 10 00 00 00 -# -name: MUTE -type: parsed -protocol: NEC -address: 08 00 00 00 -command: 16 00 00 00 -# -name: VOL+ -type: parsed -protocol: NECext -address: 86 FF 00 00 -command: 21 DE 00 00 -# -name: VOL- -type: parsed -protocol: NECext -address: 86 FF 00 00 -command: 2B D4 00 00 -# -name: VOL+ -type: parsed -protocol: NECext -address: BA 4B 00 00 -command: 03 FC 00 00 -# -name: VOL- -type: parsed -protocol: NECext -address: BA 4B 00 00 -command: 02 FD 00 00 -# -name: VOL+ -type: parsed -protocol: NECext -address: BA A0 00 00 -command: 03 FC 00 00 -# -name: VOL- -type: parsed -protocol: NECext -address: BA A0 00 00 -command: 02 FD 00 00 -# -name: VOL+ -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 1014 1477 517 478 514 509 483 487 515 480 512 484 508 488 514 1479 515 1476 508 1483 511 1481 513 1478 516 1475 509 1482 512 1479 515 480 512 483 509 50775 1014 1477 517 504 488 508 484 513 489 506 486 510 482 514 488 1478 516 1475 509 1483 511 1480 514 1477 517 1474 510 1482 512 1478 516 505 487 509 483 50770 1009 1481 513 508 484 512 490 506 486 510 482 514 488 508 484 1481 513 1478 516 1475 509 1483 511 1480 514 1477 517 1475 509 1482 512 509 483 513 489 -# -name: VOL- -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 1010 1508 486 509 483 513 489 507 485 512 490 505 487 510 482 1509 485 511 491 1501 483 1509 485 1507 487 1504 490 1502 482 1509 485 511 491 1500 484 50779 1010 1506 488 508 484 512 490 505 487 509 483 513 489 506 486 1506 488 507 485 1506 488 1503 481 1510 484 1508 486 1505 489 1503 481 514 488 1503 491 -# -name: POWER -type: parsed -protocol: NECext -address: BA A0 00 00 -command: 4C B3 00 00 -# -name: MUTE -type: parsed -protocol: NECext -address: BA A0 00 00 -command: 01 FD 00 00 -# -name: POWER -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 1004 1513 481 515 487 1478 516 505 487 510 482 1484 510 1481 513 508 484 512 490 1475 509 513 489 1477 507 1484 510 511 481 515 487 1479 515 1474 510 50774 1005 1484 510 513 489 1476 508 513 489 508 484 1482 512 1479 515 506 486 511 481 1483 511 512 490 1475 509 1483 511 510 482 515 487 1504 490 1475 509 50777 1013 1503 491 506 486 1505 489 507 485 512 490 1501 483 1508 486 510 482 514 488 1503 481 515 487 1504 490 1500 484 512 490 506 486 1506 488 1502 482 -# -name: MUTE -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 1014 1477 507 514 488 508 484 512 490 505 487 509 483 513 489 507 485 1480 514 1477 517 1475 509 1483 511 1480 514 1477 517 1475 509 1482 512 508 484 50774 1004 1486 508 513 489 507 485 511 491 504 488 508 484 513 489 505 487 1479 515 1476 508 1484 510 1481 513 1478 516 1475 509 1482 512 1480 514 507 485 50771 1007 1507 487 509 483 513 489 507 485 511 481 515 487 508 484 513 489 1502 482 1483 511 1481 513 1479 515 1476 508 1484 510 1481 513 1478 516 506 486 -# -name: POWER -type: parsed -protocol: NECext -address: BA 4B 00 00 -command: 4C B3 00 00 -# -name: MUTE -type: parsed -protocol: NECext -address: BA 4B 00 00 -command: 01 FE 00 00 -# -name: VOL+ -type: parsed -protocol: NECext -address: 83 22 00 00 -command: 0A F5 00 00 -# -name: VOL- -type: parsed -protocol: NECext -address: 83 22 00 00 -command: 01 FE 00 00 -# -name: VOL+ -type: parsed -protocol: NEC -address: 35 00 00 00 -command: 45 00 00 00 -# -name: VOL- -type: parsed -protocol: NEC -address: 35 00 00 00 -command: 1B 00 00 00 -# -name: POWER -type: parsed -protocol: NEC -address: 35 00 00 00 -command: 09 00 00 00 -# -name: MUTE -type: parsed -protocol: NEC -address: 35 00 00 00 -command: 51 00 00 00 -# -name: POWER -type: parsed -protocol: NECext -address: 83 22 00 00 -command: 08 F7 00 00 -# -name: VOL+ -type: parsed -protocol: NECext -address: 0A 1D 00 00 -command: 08 F7 00 00 -# -name: VOL- -type: parsed -protocol: NECext -address: 0A 1D 00 00 -command: 0A F5 00 00 -# -name: MUTE -type: parsed -protocol: NECext -address: 0A 1D 00 00 -command: 03 FC 00 00 -# -name: POWER -type: parsed -protocol: NECext -address: 0A 1D 00 00 -command: 01 FE 00 00 -# -name: VOL+ -type: parsed -protocol: NEC -address: 20 00 00 00 -command: 06 00 00 00 -# -name: VOL- -type: parsed -protocol: NEC -address: 20 00 00 00 -command: 07 00 00 00 -# -name: MUTE -type: parsed -protocol: NEC -address: 20 00 00 00 -command: 1E 00 00 00 -# -name: MUTE -type: parsed -protocol: NEC -address: 80 00 00 00 -command: 01 00 00 00 -# -name: VOL+ -type: parsed -protocol: NEC -address: 80 00 00 00 -command: 03 00 00 00 -# -name: VOL- -type: parsed -protocol: NEC -address: 80 00 00 00 -command: 06 00 00 00 -# -name: VOL+ -type: parsed -protocol: Samsung32 -address: 2C 00 00 00 -command: 17 00 00 00 -# -name: VOL- -type: parsed -protocol: Samsung32 -address: 2C 00 00 00 -command: 16 00 00 00 -# -name: VOL+ -type: parsed -protocol: NECext -address: 83 22 00 00 -command: 16 E9 00 00 -# -name: VOL- -type: parsed -protocol: NECext -address: 83 22 00 00 -command: 0F F0 00 00 -# -name: POWER -type: parsed -protocol: NECext -address: 83 22 00 00 -command: 0C F3 00 00 -# -name: MUTE -type: parsed -protocol: NECext -address: 83 22 00 00 -command: 15 EA 00 00 -# -name: VOL+ -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 3492 1750 416 454 425 1313 424 446 422 447 421 448 420 450 418 451 417 452 416 453 415 455 424 445 423 446 422 447 421 1290 447 450 418 451 417 452 416 453 415 455 424 445 423 447 421 1290 447 422 446 1319 418 452 416 426 442 454 425 445 423 446 422 447 421 421 447 449 419 450 418 451 417 452 416 453 415 454 425 1314 423 446 422 447 421 448 420 449 419 450 418 451 417 452 416 454 425 444 424 1315 422 74926 3488 1754 422 447 421 1317 420 422 446 451 417 452 416 453 415 454 425 444 424 445 423 446 422 447 421 448 420 449 419 1292 445 452 416 453 415 454 425 445 423 446 422 447 421 448 420 1318 419 450 418 1293 444 453 415 454 425 445 423 446 422 447 421 448 420 449 419 450 418 451 417 452 416 453 415 455 424 445 423 1315 422 448 420 449 419 450 418 424 444 452 416 453 415 454 425 445 423 446 422 1289 448 -# -name: VOL- -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 3486 1756 420 449 419 1291 446 424 444 452 416 453 415 454 425 444 424 445 423 446 422 446 422 447 421 448 420 449 419 1319 418 452 416 453 415 426 453 444 424 445 423 446 422 447 421 1290 447 422 446 1319 418 451 417 452 416 454 425 444 424 445 423 446 422 447 421 420 448 1317 420 449 419 450 418 452 416 453 415 1322 425 417 451 445 423 1315 422 447 421 448 420 449 419 450 418 451 417 452 416 1322 415 74922 3492 1722 444 452 416 1321 416 426 453 444 424 445 423 446 422 447 421 447 421 448 420 449 419 450 418 451 417 452 416 1294 443 453 415 454 425 445 423 445 423 446 422 447 421 448 420 1317 420 450 418 1319 418 451 417 425 443 453 415 454 425 444 424 418 450 446 422 447 421 1317 420 449 419 450 418 451 417 452 416 1322 425 444 424 445 423 1315 422 420 448 448 420 448 420 422 446 450 418 451 417 1321 416 -# -name: POWER -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 3491 1751 415 454 425 1314 423 446 422 448 420 449 419 450 418 451 417 452 416 453 415 454 425 445 423 446 422 447 421 1317 420 449 419 451 417 452 416 453 415 454 425 444 424 445 423 1316 421 448 420 1318 419 451 417 452 416 453 415 454 425 445 423 446 422 447 421 448 420 1318 419 451 417 1321 416 1322 425 1313 424 1314 423 419 449 447 421 1290 447 450 418 1320 417 1321 416 1322 425 444 424 445 423 1288 449 74914 3491 1751 415 427 452 1314 423 446 422 447 421 448 420 449 419 450 418 451 417 452 416 453 415 454 425 445 423 446 422 1316 421 449 419 450 418 451 417 452 416 453 415 454 425 445 423 1315 422 448 420 1318 419 451 417 452 416 453 415 454 425 445 423 446 422 447 421 448 420 1318 419 451 417 1321 416 1322 415 1295 452 1286 451 446 422 447 421 1317 420 450 418 1320 417 1321 416 1295 442 454 425 445 423 1315 422 74905 3491 1752 424 445 423 1315 422 447 421 448 420 422 446 451 417 452 416 453 415 454 425 445 423 446 422 447 421 448 420 1318 419 451 417 452 416 453 415 454 425 445 423 446 422 447 421 1317 420 450 418 1293 444 452 416 454 425 444 424 446 422 447 421 448 420 449 419 450 418 1320 417 453 415 1323 424 1314 423 1315 422 1288 449 448 420 450 418 1293 444 453 415 1323 424 1313 424 1314 423 447 421 448 420 1318 419 -# -name: MUTE -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 3486 1728 448 448 420 1318 419 423 445 451 417 452 416 454 425 444 424 445 423 446 422 447 421 448 420 421 447 449 419 1319 418 451 417 453 415 453 426 444 424 445 423 446 422 447 421 1317 420 449 419 1319 418 451 417 452 416 453 415 454 425 445 423 446 422 447 421 447 421 421 447 1291 446 423 445 425 443 1322 415 1322 425 444 424 445 423 446 422 1289 448 448 420 422 446 1292 445 451 417 452 416 1322 415 74924 3486 1755 421 447 421 1317 420 449 419 450 418 451 417 452 416 453 415 454 425 417 451 445 423 446 422 420 448 448 420 1317 420 450 418 451 417 452 416 426 442 427 452 444 424 445 423 1315 422 447 421 1317 420 449 419 450 418 451 417 425 443 453 415 454 425 444 424 418 450 446 422 1315 422 448 420 421 447 1291 446 1319 418 451 417 452 416 454 414 1323 424 445 423 419 449 1316 421 422 446 450 418 1293 444 74912 3487 1755 421 448 420 1290 447 423 445 451 417 452 416 453 415 454 425 445 423 446 422 446 422 447 421 421 447 449 419 1319 418 452 416 426 442 454 425 444 424 445 423 446 422 447 421 1290 447 449 419 1319 418 452 416 452 416 453 415 427 451 445 423 446 422 447 421 448 420 449 419 1319 418 424 444 452 416 1322 415 1323 424 444 424 445 423 446 422 1317 420 449 419 423 445 1320 417 453 415 427 452 1313 424 -# -name: POWER -type: parsed -protocol: NECext -address: C8 91 00 00 -command: 00 FF 00 00 -# -name: MUTE -type: parsed -protocol: NECext -address: C8 91 00 00 -command: 20 DF 00 00 -# -name: VOL+ -type: parsed -protocol: NECext -address: C8 91 00 00 -command: 1E E1 00 00 -# -name: VOL- -type: parsed -protocol: NECext -address: C8 91 00 00 -command: 1F E0 00 00 -# -name: VOL+ -type: parsed -protocol: RC6 -address: 10 00 00 00 -command: 10 00 00 00 -# -name: VOL- -type: parsed -protocol: RC6 -address: 10 00 00 00 -command: 11 00 00 00 -# -name: POWER -type: parsed -protocol: RC6 -address: 10 00 00 00 -command: 0C 00 00 00 -# -name: VOL+ -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 4559 4461 546 490 515 495 521 490 515 495 489 1484 516 1482 550 486 519 491 493 1480 520 1478 522 1477 523 1475 546 490 515 495 521 490 515 495 489 4493 545 491 525 486 519 491 514 496 488 1484 516 1483 517 1481 551 486 488 1485 515 1483 517 1482 550 486 519 491 525 486 519 491 493 1479 542 494 522 489 516 467 517 1482 550 -# -name: VOL- -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 4550 4469 548 462 543 467 549 461 544 466 518 1481 520 1479 542 468 548 462 522 1477 523 1476 514 1485 515 1483 549 461 544 466 550 461 544 466 518 4491 547 463 542 468 548 462 543 467 549 462 543 467 549 461 523 1476 514 1485 515 1484 516 1482 550 461 513 1486 514 1485 515 1483 549 461 544 466 550 461 544 493 491 1481 540 -# -name: VOL+ -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 4496 4442 513 503 488 502 489 501 490 500 491 1505 487 1508 484 505 486 504 487 1508 484 1511 492 1503 489 1499 514 484 486 504 487 502 489 501 490 4449 517 499 492 499 492 497 483 507 484 1511 492 1504 488 1499 514 483 487 1509 483 1512 491 1504 488 503 488 501 490 500 491 499 492 1504 488 501 490 500 491 492 509 1494 488 55126 4496 4446 541 482 488 502 489 501 490 500 491 1505 487 1508 484 505 486 504 487 1508 484 1503 510 1493 489 1480 512 504 487 503 488 502 489 500 491 4449 517 498 493 497 483 507 484 505 486 1502 511 1492 490 1504 488 502 489 1507 485 1509 483 1512 491 473 518 498 493 496 484 505 486 1510 483 499 512 484 486 504 487 1508 484 -# -name: VOL- -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 4492 4434 510 505 486 505 486 504 487 503 488 1481 511 1484 518 499 492 498 493 1476 516 1479 513 1483 519 1469 596 402 516 500 491 499 492 498 493 4447 518 498 493 497 483 507 484 506 485 504 487 503 488 494 517 1485 486 1483 519 1476 516 1480 512 504 486 1508 484 1486 517 1479 565 425 513 502 488 501 490 492 509 1467 515 -# -name: VOL+ -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 4500 4436 516 504 486 510 490 505 485 510 490 1500 491 1474 517 505 485 484 516 1501 490 1501 490 1501 490 1501 490 505 485 511 489 506 484 485 515 4449 513 482 508 513 487 508 482 514 486 1504 487 1504 487 1504 487 482 508 1509 482 1509 492 1499 492 504 486 509 491 504 486 509 491 1500 491 504 486 510 490 478 512 1505 486 55017 4492 4444 508 512 488 508 482 513 487 508 482 1508 483 1482 509 513 487 508 482 1509 482 1509 482 1483 508 1483 508 513 487 508 482 514 486 509 481 4457 515 506 484 511 489 506 484 511 489 1501 490 1475 516 1501 490 506 484 1480 511 1507 484 1480 511 511 489 506 484 512 488 507 483 1507 484 512 488 507 483 512 488 1503 488 -# -name: VOL- -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 4493 4443 509 512 488 507 483 512 488 507 483 1482 509 1482 509 512 488 507 483 1482 509 1482 509 1482 509 1482 509 512 488 507 483 513 487 508 482 4457 516 505 485 510 490 505 485 510 490 505 485 511 489 505 485 1480 511 1480 511 1480 511 1481 510 484 516 1476 515 1476 515 1476 515 481 509 486 514 481 509 486 514 1476 515 55014 4498 4438 514 482 508 487 513 482 508 488 512 1477 514 1477 514 482 508 487 513 1477 514 1477 514 1477 514 1477 514 482 518 477 513 482 518 477 513 4451 511 485 515 479 511 485 515 480 510 485 515 480 510 485 515 1475 516 1475 516 1476 515 1476 515 480 510 1481 510 1481 510 1481 510 486 514 481 509 486 514 481 509 1482 509 -# -name: VOL+ -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 4524 4473 512 516 491 511 486 516 491 511 496 1482 522 1482 522 506 491 512 495 1483 521 1483 521 1483 521 1483 521 506 491 512 495 507 490 512 495 4475 521 507 490 513 494 508 489 513 494 1484 520 1484 520 1483 521 507 490 1488 516 1488 516 1488 516 511 496 506 491 511 496 506 491 1488 516 511 496 506 491 512 495 1483 521 55356 4533 4463 512 516 491 511 486 516 491 511 496 1507 487 1492 512 515 492 510 487 1492 512 1492 512 1491 513 1491 513 515 492 510 487 515 492 510 487 4484 512 516 491 511 496 506 491 512 495 1483 521 1482 522 1482 522 506 491 1488 516 1487 517 1487 517 511 496 506 491 512 495 506 491 1488 516 512 495 507 490 512 495 1483 521 -# -name: VOL- -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 4533 4464 521 507 490 512 495 507 490 513 494 1484 520 1484 520 508 489 513 494 1484 520 1484 520 1483 521 1483 521 506 491 511 496 506 491 512 495 4475 521 507 490 512 495 507 490 513 494 508 489 513 494 508 489 1490 514 1490 514 1490 514 1490 514 514 493 1485 519 1485 519 1485 519 509 488 515 492 510 487 516 491 1487 517 55369 4531 4465 520 508 489 514 493 509 488 515 492 1486 518 1486 518 509 488 514 493 1486 518 1485 519 1485 519 1485 519 509 488 514 493 509 488 515 492 4478 518 511 486 516 491 511 496 506 491 512 495 507 490 512 495 1483 521 1483 521 1483 521 1483 521 507 490 1488 516 1488 516 1488 516 512 495 507 490 513 494 508 489 1490 514 -# -name: POWER -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 4530 4465 521 507 490 513 494 507 490 513 494 1509 496 1483 521 506 491 512 495 1508 486 1492 512 1492 513 1491 513 514 493 509 488 514 493 509 488 4483 513 514 493 509 488 515 492 510 487 515 492 510 487 515 492 510 487 1517 488 1491 513 1490 515 513 494 1510 494 1484 520 1483 521 1483 521 506 491 512 495 506 491 1487 517 55357 4528 4468 518 510 487 515 492 510 487 515 492 1512 493 1485 519 509 488 514 493 1510 494 1483 522 1483 521 1482 512 516 491 511 486 516 491 511 486 4484 512 516 491 511 486 516 491 511 486 516 491 511 486 516 491 511 496 1507 487 1491 513 1491 514 514 493 1510 495 1484 521 1483 522 1483 522 506 491 511 486 516 491 1513 491 -# -name: POWER -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 4495 4440 512 509 491 504 486 509 491 504 486 1478 513 1479 512 509 491 504 486 1478 513 1479 512 1479 512 1479 512 509 491 504 486 509 491 504 486 4452 511 511 489 506 484 511 489 506 484 511 489 506 484 511 489 506 484 1480 511 1480 511 1480 511 510 491 1500 491 1475 516 1475 516 1475 516 504 486 510 490 505 485 1479 512 55017 4497 4439 513 507 483 513 487 507 483 513 487 1476 515 1477 514 507 483 513 487 1476 515 1476 515 1477 514 1477 514 481 509 512 488 507 483 512 488 4451 512 509 491 504 486 509 491 504 486 483 517 504 486 509 492 504 486 1504 487 1504 487 1478 513 508 482 1509 482 1509 482 1509 482 1483 508 513 487 508 482 513 487 1504 487 -# -name: MUTE -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 4501 4435 517 504 486 510 490 505 485 510 490 1475 516 1475 516 506 484 511 489 1476 515 1476 515 1476 515 1477 514 507 483 512 488 507 483 513 487 4451 511 510 490 479 511 484 516 506 484 1481 510 511 489 506 484 511 489 1476 515 1476 515 1477 514 507 483 512 488 1477 514 1477 514 1478 513 508 482 513 487 508 482 1484 517 55011 4496 4440 512 509 491 478 512 483 517 504 486 1480 511 1480 511 484 516 505 485 1480 511 1480 511 1481 510 1481 510 484 516 506 484 511 489 506 484 4455 517 504 486 509 491 504 486 483 517 1474 517 505 485 510 490 505 485 1480 511 1480 511 1481 510 511 489 480 510 1481 510 1481 510 1482 509 485 515 507 483 512 488 1477 514 -# -name: POWER -type: parsed -protocol: Samsung32 -address: 2C 00 00 00 -command: 1E 00 00 00 -# -name: MUTE -type: parsed -protocol: Samsung32 -address: 2C 00 00 00 -command: 1F 00 00 00 -# -name: POWER -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 4504 4432 511 509 492 504 486 509 492 504 486 1478 514 1477 515 507 484 512 489 1476 516 1475 517 1475 517 1474 518 503 487 509 492 503 487 508 493 4446 508 513 488 507 483 512 489 507 483 512 489 506 484 511 490 506 484 1481 511 1480 512 1479 513 509 492 1473 519 1473 519 1472 509 1482 510 511 490 506 484 511 490 1475 517 54985 4498 4437 517 504 486 509 492 504 486 509 492 1473 519 1472 509 512 489 506 484 1481 511 1480 512 1480 512 1479 513 508 493 502 488 507 483 512 489 4449 516 506 485 511 490 505 485 510 491 505 485 510 491 504 486 509 492 1473 519 1473 508 1483 561 434 515 1476 516 1475 517 1474 518 1473 519 502 488 507 483 512 489 1476 516 -# -name: MUTE -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 4531 4406 516 478 512 484 538 457 544 452 538 1453 518 1473 519 476 546 450 540 1451 509 1482 510 1481 511 1480 512 483 539 457 544 452 538 457 544 4420 513 482 540 456 545 450 540 455 546 1445 547 449 541 454 536 458 543 1449 543 1449 543 1448 544 451 539 456 545 1445 547 1445 547 1444 537 458 543 453 537 457 544 1448 544 54957 4495 4440 514 481 520 477 513 482 519 476 514 1476 516 1475 517 478 512 484 517 1474 518 1473 519 1472 520 1471 521 474 516 479 511 484 517 479 511 4452 512 509 492 503 487 508 493 503 487 1477 515 507 483 512 489 506 484 1481 511 1481 511 1480 512 509 492 503 487 1478 514 1478 514 1477 515 506 484 511 490 505 485 1480 512 -# -name: POWER -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 4551 4468 549 461 544 493 523 460 545 466 518 1480 520 1479 542 468 548 489 495 1477 523 1475 515 1484 516 1483 549 461 544 493 523 487 518 466 518 4490 548 462 543 493 523 488 517 466 550 461 544 466 550 460 545 465 519 1480 520 1478 522 1477 544 465 519 1480 520 1479 521 1477 523 1476 545 464 541 496 520 490 494 1479 542 55901 4554 4465 542 494 522 489 516 494 522 488 496 1477 523 1476 545 490 515 495 489 1484 516 1483 517 1481 519 1479 542 494 522 489 516 494 522 488 496 4487 541 495 521 490 515 495 521 489 516 494 522 488 517 493 523 488 496 1476 525 1475 515 1483 549 488 496 1476 524 1475 515 1484 516 1482 550 486 519 491 525 486 488 1485 547 55897 4548 4470 548 462 543 468 548 462 543 467 517 1482 518 1480 541 469 547 490 494 1478 575 1423 515 1485 515 1483 549 461 544 466 550 461 544 466 518 4491 547 462 543 467 549 462 543 467 549 461 544 466 539 497 519 492 492 1480 520 1478 522 1477 544 465 519 1480 520 1479 521 1477 513 1486 546 464 541 469 547 464 520 1478 543 -# -name: MUTE -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 4553 4467 550 459 546 464 541 469 547 464 520 1479 521 1477 544 492 524 486 498 1475 515 1484 516 1482 518 1481 540 496 520 490 515 495 521 490 494 4488 550 486 519 491 525 486 519 491 493 1479 542 494 522 489 516 494 490 1482 518 1481 519 1480 541 494 522 489 495 1478 522 1476 514 1485 547 489 516 494 522 489 495 1477 544 -# -name: POWER -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 4555 4483 516 516 488 519 495 512 492 515 489 1525 493 1519 489 518 496 511 493 1521 487 1525 493 1520 488 1524 494 513 491 517 487 520 494 514 490 4501 519 513 491 516 488 520 494 513 491 517 487 521 493 514 490 518 486 1527 491 1522 496 1517 491 516 488 1525 493 1520 488 1525 493 1520 488 519 495 512 492 516 488 1525 493 -# -name: VOL+ -type: parsed -protocol: RC5 -address: 13 00 00 00 -command: 0D 00 00 00 -# -name: VOL- -type: parsed -protocol: RC5 -address: 13 00 00 00 -command: 0E 00 00 00 -# -name: POWER -type: parsed -protocol: RC5 -address: 13 00 00 00 -command: 0B 00 00 00 -# -name: MUTE -type: parsed -protocol: RC5 -address: 13 00 00 00 -command: 0C 00 00 00 -# -name: VOL+ -type: parsed -protocol: SIRC -address: 01 00 00 00 -command: 12 00 00 00 -# -name: VOL- -type: parsed -protocol: SIRC -address: 01 00 00 00 -command: 13 00 00 00 -# -name: VOL+ -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 4552 4468 574 436 566 444 568 442 570 441 540 1458 546 1453 572 439 573 437 544 1455 539 1460 544 1456 548 1450 575 436 566 444 568 442 570 440 541 4468 594 416 565 445 567 443 569 441 540 1459 545 1453 541 1459 566 444 547 1452 542 1457 547 1452 593 417 564 446 566 444 568 442 539 1460 565 446 566 444 568 442 539 1460 565 55957 4581 4437 543 467 545 466 546 464 538 472 519 1480 514 1485 540 471 541 469 512 1486 518 1481 513 1486 518 1481 575 436 566 444 568 442 570 440 541 4468 543 468 544 465 547 464 538 472 519 1480 514 1485 519 1479 546 465 516 1483 511 1488 516 1483 542 468 544 466 546 464 538 473 519 1480 545 466 546 464 538 472 519 1480 545 -# -name: VOL- -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 4546 4473 538 473 539 470 542 469 543 467 514 1484 520 1479 545 465 547 463 518 1481 513 1486 518 1481 513 1487 538 472 540 470 542 469 543 466 515 4495 546 463 539 472 540 470 542 468 544 466 546 491 521 462 519 1480 513 1485 519 1480 514 1486 539 472 519 1479 515 1484 520 1479 546 464 548 463 539 471 541 469 512 1487 548 -# -name: POWER -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 4549 4469 542 468 544 467 545 465 537 473 519 1481 513 1485 540 471 541 469 512 1487 517 1482 512 1487 517 1482 543 467 545 465 547 463 539 472 519 4489 543 468 544 466 546 464 538 473 539 470 542 468 544 466 546 465 516 1482 512 1487 517 1482 543 468 513 1485 519 1480 514 1485 519 1480 545 465 547 463 539 472 520 1479 546 55899 4549 4470 541 469 574 436 566 445 546 463 549 1450 513 1486 539 471 572 438 543 1456 548 1451 543 1456 548 1451 574 436 566 445 567 443 569 441 540 4469 573 437 575 435 567 443 569 441 571 439 573 437 565 445 567 443 549 1451 543 1456 548 1451 574 436 545 1454 540 1459 545 1454 540 1459 566 444 568 442 570 440 541 1458 567 55878 4580 4439 572 439 573 437 565 445 567 443 548 1451 543 1456 569 441 571 439 542 1457 547 1452 542 1457 547 1452 573 437 575 435 567 443 569 442 539 4469 573 438 574 436 566 444 568 442 570 440 572 438 574 436 566 444 547 1452 542 1457 547 1452 573 437 544 1455 539 1460 544 1455 539 1460 575 435 567 444 568 442 539 1459 566 55879 4578 4442 569 441 571 439 573 437 575 435 546 1453 541 1458 567 444 568 441 540 1459 545 1454 540 1459 545 1454 571 439 573 437 575 435 567 444 548 4461 571 440 572 438 574 436 566 444 568 442 570 440 572 438 574 436 545 1454 540 1459 545 1454 571 439 542 1457 547 1452 542 1457 547 1452 573 437 575 435 567 444 547 1451 574 55871 4554 4465 546 464 538 473 539 471 541 469 512 1487 517 1481 544 467 545 465 516 1483 511 1488 516 1483 511 1488 547 463 539 472 540 470 542 468 513 4496 546 464 538 472 540 470 542 468 544 466 546 464 538 473 539 471 510 1488 516 1483 511 1488 547 463 518 1481 513 1486 518 1481 513 1486 539 472 540 470 542 467 514 1485 540 -# -name: MUTE -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 4555 4465 546 464 538 472 540 470 542 468 513 1486 518 1481 544 467 545 465 516 1483 511 1488 516 1483 511 1488 537 473 539 472 540 470 542 468 513 4496 546 464 538 473 539 471 541 469 512 1487 538 472 540 470 542 469 512 1486 518 1481 544 1455 570 441 571 439 542 1457 547 1452 542 1457 568 442 570 440 572 438 543 1456 569 55920 4555 4464 547 464 538 472 540 470 542 468 513 1486 518 1481 544 466 546 464 517 1482 512 1487 517 1482 512 1487 538 473 539 471 541 469 543 467 514 4495 547 463 539 472 540 470 542 468 513 1486 539 471 541 469 543 467 514 1485 519 1479 515 1485 540 470 542 468 513 1486 518 1481 513 1486 539 471 541 469 543 467 514 1485 540 -# -name: POWER -type: parsed -protocol: SIRC15 -address: 10 00 00 00 -command: 15 00 00 00 -# -name: POWER -type: parsed -protocol: SIRC -address: 01 00 00 00 -command: 15 00 00 00 -# -name: MUTE -type: parsed -protocol: SIRC -address: 01 00 00 00 -command: 14 00 00 00 -# -name: POWER -type: parsed -protocol: SIRC -address: 10 00 00 00 -command: 15 00 00 00 -# -name: POWER -type: parsed -protocol: SIRC15 -address: 30 00 00 00 -command: 15 00 00 00 -# -name: MUTE -type: parsed -protocol: SIRC15 -address: 30 00 00 00 -command: 14 00 00 00 -# -name: POWER -type: parsed -protocol: NECext -address: 86 FF 00 00 -command: 1C E3 00 00 -# -name: MUTE -type: parsed -protocol: NECext -address: 86 FF 00 00 -command: 1D E2 00 00 -# -name: VOL+ -type: parsed -protocol: NEC -address: 80 00 00 00 -command: 0D 00 00 00 -# -name: VOL- -type: parsed -protocol: NEC -address: 80 00 00 00 -command: 08 00 00 00 -# -name: POWER -type: parsed -protocol: NEC -address: 80 00 00 00 -command: 12 00 00 00 -# -name: MUTE -type: parsed -protocol: NEC -address: 80 00 00 00 -command: 1E 00 00 00 -# -name: POWER -type: parsed -protocol: NECext -address: EF 01 00 00 -command: 25 DA 00 00 -# -name: VOL- -type: parsed -protocol: NECext -address: EF 01 00 00 -command: 14 EB 00 00 -# -name: VOL+ -type: parsed -protocol: NECext -address: EF 01 00 00 -command: 13 EC 00 00 -# -name: MUTE -type: parsed -protocol: NECext -address: EF 01 00 00 -command: 28 D7 00 00 -# -name: VOL+ -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 1048 580 597 1165 596 582 595 1167 594 875 599 578 599 1455 593 585 592 1171 600 577 600 576 601 13191 1042 586 591 1170 601 576 601 1161 600 869 595 582 595 1459 599 578 599 1163 598 580 597 579 598 13195 1048 580 597 1165 596 581 596 1167 594 875 599 578 599 1456 592 585 592 1171 600 577 600 577 600 13192 1052 576 601 1162 599 578 599 1163 598 871 593 584 593 1462 596 581 596 1166 595 582 595 582 595 -# -name: VOL- -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 1048 553 624 1138 623 554 623 1139 622 848 626 551 626 1427 621 556 652 1403 655 522 655 814 650 12579 1050 552 656 1106 624 553 624 1138 623 847 627 550 627 1427 621 556 621 1434 624 553 624 845 619 12612 1079 523 623 1139 622 555 622 1139 622 848 626 550 627 1427 621 556 621 1434 624 553 624 845 619 12613 1047 556 621 1141 620 556 621 1141 620 850 624 552 625 1429 619 558 619 1435 623 554 623 846 628 12600 1050 552 625 1137 624 553 624 1137 624 846 618 558 619 1435 623 554 623 1431 627 550 627 842 622 12609 1051 551 626 1136 625 551 626 1136 625 844 620 557 620 1434 624 554 623 1431 627 550 627 843 621 -# -name: POWER -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 1073 528 649 1114 647 530 647 1116 645 825 649 527 650 1405 653 1402 625 552 646 1409 649 1113 648 11417 1077 524 653 1110 651 526 651 1112 649 820 654 523 654 1400 648 1407 651 526 651 1404 654 1109 652 11414 1079 523 654 1109 652 524 653 1111 650 819 624 554 654 1401 647 1408 650 529 648 1406 652 1111 650 11416 1077 525 652 1110 651 526 651 1112 649 820 654 523 654 1401 647 1408 650 528 649 1405 622 1141 651 11414 1080 521 646 1116 624 553 645 1117 654 816 648 529 648 1406 652 1403 655 523 644 1410 648 1114 647 11418 1075 526 651 1111 650 527 650 1112 649 820 623 554 654 1400 648 1407 651 526 651 1403 655 1107 654 -# -name: MUTE -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 1051 550 627 1135 626 551 626 1136 625 845 619 850 624 553 675 794 629 842 622 555 622 555 622 13780 1047 555 622 1140 621 557 620 1141 620 850 624 845 619 558 619 850 624 846 618 559 618 559 618 13782 1045 558 619 1143 618 559 618 1144 627 842 622 847 627 550 627 842 622 848 626 551 626 551 626 13774 1053 549 618 1144 627 550 627 1135 626 843 621 849 625 551 626 844 620 850 624 553 624 552 625 13776 1051 551 626 1137 624 553 624 1138 623 846 618 851 623 554 623 846 628 841 623 554 623 554 623 13776 1051 551 626 1136 625 552 625 1137 624 845 619 850 624 553 624 846 618 852 622 555 622 554 623 13778 1049 554 623 1139 622 555 622 1140 621 849 625 844 620 557 620 850 624 846 618 559 618 558 619 -# -name: POWER -type: parsed -protocol: NEC -address: 78 00 00 00 -command: CC 00 00 00 -# -name: MUTE -type: parsed -protocol: NEC -address: 78 00 00 00 -command: 9C 00 00 00 -# -name: POWER -type: parsed -protocol: NEC -address: 7E 00 00 00 -command: 2A 00 00 00 -# -name: MUTE -type: parsed -protocol: NEC -address: 7A 00 00 00 -command: 1C 00 00 00 -# -name: POWER -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 274 789 254 1792 275 814 250 787 246 816 248 1798 279 784 249 813 251 785 248 788 245 1827 281 1791 275 1825 272 790 253 783 250 43886 277 786 278 1795 272 791 252 783 281 782 251 785 269 1804 273 1800 277 1822 275 1798 279 783 270 766 277 759 274 1825 272 1800 277 43886 277 759 274 1825 272 764 279 756 277 786 278 1795 282 781 272 763 280 755 278 785 279 1794 273 1827 270 1802 275 761 272 791 273 43888 276 761 272 1800 277 786 278 758 275 760 273 790 274 1799 278 1821 276 1796 281 1792 275 788 276 760 273 789 275 1798 279 1794 273 43889 278 785 248 1825 272 790 253 782 272 764 279 1793 274 790 274 761 282 781 273 763 280 1793 273 1825 272 1800 277 813 220 789 275 -# -name: POWER -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 270 793 250 1795 272 818 246 791 252 809 244 766 277 1795 282 781 272 790 253 809 224 1822 275 1797 280 1820 277 785 248 788 245 43889 273 790 274 1799 278 785 248 788 276 787 246 1826 271 792 251 1794 273 1827 270 1802 275 788 245 791 273 790 253 1819 278 1794 273 43889 274 789 254 1818 269 767 276 786 247 789 275 788 245 1827 270 792 251 785 248 814 250 1796 281 1819 248 1825 272 790 253 783 271 43889 245 791 273 1799 278 786 278 784 249 787 246 1827 281 781 252 1821 276 1796 281 1792 274 814 250 786 247 789 244 1829 279 1793 274 43888 275 815 218 1828 280 783 250 786 278 785 248 788 245 1827 280 782 251 785 268 794 249 1797 280 1819 278 1794 272 791 252 810 254 -# -name: VOL+ -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 277 759 274 1799 278 784 280 783 250 812 242 1804 273 816 227 808 246 791 252 1819 248 1825 273 1826 251 1822 276 786 247 789 244 43888 274 815 249 1797 280 783 250 812 252 784 249 813 241 1805 272 1827 250 1822 275 787 246 816 217 819 255 807 226 1820 278 1795 272 43888 273 789 254 1817 270 793 251 785 248 814 250 1795 282 807 247 790 253 783 250 1822 276 1796 281 1818 249 1824 274 814 229 807 247 -# -name: VOL- -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 275 762 271 1800 277 786 278 784 249 813 241 795 248 1824 253 784 270 792 251 1821 246 1826 272 1801 276 1823 275 762 271 790 243 43889 274 789 275 1797 280 783 250 812 252 784 249 1823 275 762 271 1827 250 1822 276 787 246 816 217 818 246 790 253 1819 268 1804 273 43886 277 786 247 1825 273 764 280 783 250 811 253 784 249 1822 276 761 272 816 228 1819 279 1794 273 1826 251 1821 277 786 247 815 249 -# -name: MUTE -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 275 762 271 1800 277 786 278 784 249 813 241 795 248 814 219 817 247 789 254 1818 249 1824 274 1798 279 1820 278 759 274 788 245 43887 274 789 275 1798 279 783 250 812 252 784 249 1823 274 1798 279 1820 247 1826 271 765 278 809 224 812 252 784 249 1823 275 1798 279 43880 281 782 251 1821 277 760 273 789 244 818 246 790 253 808 246 791 252 809 224 1822 275 1797 280 1819 248 1825 273 790 253 808 246 -# -name: POWER -type: raw -frequency: 39105 -duty_cycle: 0.330000 -data: 5396 53113 8899 4450 563 1662 563 1662 563 1662 563 563 563 563 563 563 563 563 563 1662 563 563 563 563 563 1662 563 1662 563 1662 563 1662 563 1662 563 563 563 563 563 563 563 563 563 563 563 563 563 563 563 563 563 1662 563 1662 563 1662 563 1662 563 1662 563 1662 563 1662 563 1662 563 563 563 38358 8899 2225 563 95052 -# -name: VOL+ -type: raw -frequency: 39105 -duty_cycle: 0.330000 -data: 5472 53216 8899 4450 563 1662 563 1662 563 1662 563 563 563 563 563 563 563 563 563 1662 563 563 563 563 563 1662 563 1662 563 1662 563 1662 563 1662 563 563 563 563 563 563 563 563 563 1662 563 563 563 563 563 563 563 1662 563 1662 563 1662 563 1662 563 563 563 1662 563 1662 563 1662 563 563 563 38358 8899 2199 563 95052 -# -name: VOL- -type: raw -frequency: 39105 -duty_cycle: 0.330000 -data: 5472 53344 8899 4424 563 1662 563 1662 563 1662 563 563 563 563 563 563 563 563 563 1662 563 563 563 563 563 1662 563 1662 563 1662 563 1662 563 1662 563 563 563 563 563 563 563 1662 563 1662 563 563 563 563 563 563 563 1662 563 1662 563 1662 563 563 563 563 563 1662 563 1662 563 1662 563 563 563 38358 8899 2225 563 95052 -# -name: MUTE -type: raw -frequency: 39105 -duty_cycle: 0.330000 -data: 5498 53523 8899 4450 563 1662 563 1662 563 1662 563 563 563 563 563 563 563 563 563 1662 563 563 563 563 563 1662 563 1662 563 1662 563 1662 563 1662 563 563 563 563 563 563 563 1662 563 563 563 1662 563 563 563 563 563 1662 563 1662 563 1662 563 563 563 1662 563 563 563 1662 563 1662 563 563 563 38358 8899 2199 563 95052 -# -name: POWER -type: parsed -protocol: NECext -address: D2 6C 00 00 -command: CB 34 00 00 -# -name: VOL+ -type: parsed -protocol: NECext -address: D2 6D 00 00 -command: 02 FD 00 00 -# -name: VOL- -type: parsed -protocol: NECext -address: D2 6D 00 00 -command: 03 FC 00 00 -# -name: MUTE -type: parsed -protocol: NECext -address: D2 6D 00 00 -command: 05 FA 00 00 -# -name: POWER -type: parsed -protocol: NECext -address: D2 03 00 00 -command: 04 FB 00 00 -# -name: VOL+ -type: parsed -protocol: NECext -address: D2 03 00 00 -command: 02 FD 00 00 -# -name: VOL- -type: parsed -protocol: NECext -address: D2 03 00 00 -command: 03 FC 00 00 -# -name: MUTE -type: parsed -protocol: NECext -address: D2 03 00 00 -command: 05 FA 00 00 -# -name: POWER -type: parsed -protocol: RC5 -address: 14 00 00 00 -command: 0C 00 00 00 -# -name: VOL- -type: parsed -protocol: RC5 -address: 14 00 00 00 -command: 11 00 00 00 -# -name: VOL+ -type: parsed -protocol: RC5 -address: 14 00 00 00 -command: 10 00 00 00 -# -name: POWER -type: parsed -protocol: SIRC15 -address: 10 00 00 00 -command: 60 00 00 00 -# -name: VOL+ -type: parsed -protocol: SIRC15 -address: 30 00 00 00 -command: 12 00 00 00 -# -name: VOL- -type: parsed -protocol: SIRC15 -address: 30 00 00 00 -command: 13 00 00 00 -# -name: VOL+ -type: parsed -protocol: SIRC15 -address: 10 00 00 00 -command: 12 00 00 00 -# -name: VOL- -type: parsed -protocol: SIRC15 -address: 10 00 00 00 -command: 13 00 00 00 -# -name: POWER -type: parsed -protocol: NECext -address: 7E 81 00 00 -command: 2A D4 00 00 -# -name: MUTE -type: parsed -protocol: NECext -address: 7A 85 00 00 -command: 1C E2 00 00 -# -name: POWER -type: parsed -protocol: NEC -address: 78 00 00 00 -command: 0F 00 00 00 -# -name: POWER -type: parsed -protocol: NEC -address: 78 00 00 00 -command: 4F 00 00 00 -# -name: VOL+ -type: parsed -protocol: NEC -address: 7A 00 00 00 -command: 1A 00 00 00 -# -name: VOL- -type: parsed -protocol: NEC -address: 7A 00 00 00 -command: 1B 00 00 00 -# -name: VOL+ -type: parsed -protocol: NECext -address: 7A 85 00 00 -command: 1A E4 00 00 -# -name: VOL- -type: parsed -protocol: NECext -address: 7A 85 00 00 -command: 1B E5 00 00 -# -name: VOL+ -type: parsed -protocol: NEC -address: 78 00 00 00 -command: 1E 00 00 00 -# -name: VOL- -type: parsed -protocol: NEC -address: 78 00 00 00 -command: 1F 00 00 00 -# -name: MUTE -type: parsed -protocol: RC5X -address: 0A 00 00 00 -command: 2F 00 00 00 -# -name: VOL- -type: parsed -protocol: NEC -address: 00 00 00 00 -command: 15 00 00 00 -# -name: POWER -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 8437 4188 538 1565 539 1565 539 513 544 508 538 513 544 1559 545 507 539 1564 540 1564 540 1563 541 1563 541 511 546 1557 547 505 542 511 546 505 542 20497 597 1507 545 1559 545 507 539 512 545 507 539 1564 540 512 545 1558 546 1558 546 1558 546 1557 547 505 542 1562 542 510 547 505 542 510 547 20492 540 1564 540 1564 540 512 545 506 540 511 546 1558 546 505 542 1562 542 1562 542 1562 542 1561 543 509 548 1555 538 514 543 509 537 514 543 20495 547 1558 546 1557 547 505 541 511 546 505 542 1562 542 510 547 1556 548 1556 548 1556 548 1556 537 514 543 1560 544 508 538 514 543 508 538 20501 541 1562 542 1562 542 510 547 505 541 510 547 1556 548 504 543 1561 543 1561 543 1560 544 1560 544 508 538 1565 539 513 544 507 539 513 544 20494 548 1556 548 1556 548 504 543 509 548 504 543 1560 544 508 539 1565 539 1565 539 1564 540 1564 540 512 545 1559 545 506 540 512 545 506 540 20499 543 1560 544 1560 544 508 539 513 544 508 538 1564 540 512 545 1559 545 1558 546 1558 546 1558 546 506 541 1563 541 510 547 505 542 510 547 -# -name: VOL+ -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 8430 4194 542 1562 542 1562 542 510 547 505 541 510 547 1556 548 504 542 1561 543 509 548 1556 548 1556 548 1556 548 1556 548 504 542 509 537 514 543 20496 545 1559 545 1559 545 507 539 512 545 507 539 1564 540 512 545 1559 545 507 539 1564 540 1564 540 1563 541 1563 541 511 546 506 540 511 546 20494 546 1557 547 1557 547 505 541 510 547 505 541 1562 542 510 547 1556 548 505 541 1562 542 1562 542 1561 543 1561 543 509 548 504 542 509 537 20501 540 1565 539 1565 539 512 545 507 539 512 545 1559 545 507 539 1564 540 512 545 1559 545 1558 546 1558 546 1558 546 506 540 511 546 506 540 20498 543 1562 542 1562 542 510 547 505 541 510 547 1557 547 505 541 1562 542 509 548 1556 548 1556 548 1556 548 1556 548 504 542 509 548 504 542 20497 543 1560 544 1560 544 508 538 513 544 508 538 1565 539 513 544 1560 544 508 538 1565 539 1565 539 1565 539 1564 540 513 544 507 539 512 545 20495 545 1558 546 1558 546 506 540 511 546 506 540 1563 541 511 546 1558 546 506 540 1563 541 1563 541 1563 541 1562 542 510 547 505 541 510 547 20493 548 1556 548 1556 548 504 542 509 548 504 542 1561 543 509 537 1566 538 514 543 1560 544 1560 544 1560 544 1560 544 508 538 513 544 508 538 20501 539 1564 540 1564 540 512 545 507 539 512 545 1559 545 507 539 1564 540 512 545 1559 545 1558 546 1558 546 1558 546 506 540 511 546 506 540 -# -name: VOL- -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 8434 4191 545 1559 545 1559 545 534 512 513 544 507 539 1564 540 538 519 1559 545 1558 546 1558 546 1558 546 1558 546 1558 546 533 513 511 546 506 540 19446 547 1557 547 1557 547 532 514 511 546 532 514 1562 593 459 546 1557 547 1557 547 1557 547 1557 547 1557 547 1557 547 531 515 510 547 505 541 19446 548 1556 548 1556 548 530 516 509 548 504 543 1561 543 535 512 1566 538 1565 539 1565 539 1565 539 1565 539 1565 539 540 517 509 537 514 543 19444 539 1565 539 1565 539 513 544 508 538 513 544 1559 545 534 512 1564 540 1564 540 1564 540 1564 540 1564 540 1564 540 539 518 507 539 513 544 19442 541 1563 541 1563 541 538 519 507 539 512 545 1558 546 506 540 1563 541 1563 541 1563 541 1563 541 1563 541 1562 542 537 520 505 541 511 546 19440 595 1509 543 1561 543 536 521 504 542 509 548 1555 538 540 517 1560 544 1560 544 1560 544 1560 544 1560 544 1560 544 534 512 513 544 508 538 19448 546 1559 545 1559 545 533 513 512 545 507 539 1563 541 538 519 1558 546 1558 546 1558 546 1557 547 1558 546 1558 546 533 513 512 545 506 540 19447 546 1557 547 1557 547 532 514 511 546 506 540 1562 542 537 520 1557 547 1557 547 1557 547 1557 547 1557 547 1557 547 505 542 510 547 505 541 19445 548 1556 548 1556 548 531 515 510 547 504 542 1561 543 536 521 1555 538 1566 538 1566 538 1566 538 1566 538 1565 539 514 543 509 537 514 543 -# -name: MUTE -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 8435 4189 547 1557 547 1557 547 505 541 510 547 505 541 1562 542 510 547 1557 547 505 541 510 547 1557 546 1557 547 1557 547 505 541 510 547 505 541 21550 547 1558 545 1558 546 506 540 511 546 506 540 1563 541 511 546 1558 545 506 540 511 546 1558 546 1558 546 1558 546 506 540 511 546 506 540 21551 546 1558 546 1558 546 506 540 512 545 506 540 1563 540 512 545 1558 546 506 540 512 545 1558 546 1558 546 1558 546 506 540 512 545 506 540 21551 546 1559 545 1559 545 507 539 512 545 507 539 1564 539 512 545 1559 545 507 539 512 545 1559 545 1559 545 1559 545 507 539 512 545 507 539 21552 545 1559 545 1559 545 507 539 513 544 507 539 1564 540 512 545 1559 545 507 539 512 545 1559 545 1559 545 1559 545 507 539 512 545 507 539 21552 545 1559 545 1559 545 507 539 513 544 507 539 1565 538 513 544 1559 545 507 539 513 544 1559 545 1559 544 1559 545 534 512 513 544 507 539 21553 544 1560 544 1560 544 534 512 513 544 508 538 1565 539 539 518 1560 544 534 512 513 544 1560 544 1560 544 1560 544 534 512 513 544 508 538 -# -name: POWER -type: parsed -protocol: NEC -address: 20 00 00 00 -command: 41 00 00 00 -# -name: VOL+ -type: parsed -protocol: NEC -address: 20 00 00 00 -command: 42 00 00 00 -# -name: VOL- -type: parsed -protocol: NEC -address: 20 00 00 00 -command: 43 00 00 00 -# -name: MUTE -type: parsed -protocol: NEC -address: 20 00 00 00 -command: 1B 00 00 00 -# -name: VOL+ -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 8498 4205 651 1471 576 530 550 1572 547 535 545 536 544 1578 541 540 550 1572 547 535 545 1576 543 539 541 1580 549 1572 547 534 546 1576 543 539 541 540 550 1571 548 533 547 1574 545 537 543 539 541 541 549 532 548 1574 545 536 544 1578 541 540 550 1571 548 1572 547 1574 545 1576 543 26533 8497 4203 653 1468 569 538 542 1579 550 531 549 533 547 1573 546 535 545 1576 543 538 542 1579 550 531 549 1571 548 1573 546 536 544 1576 543 539 541 540 550 1571 548 533 547 1574 545 536 544 538 542 540 550 530 550 1572 547 534 546 1575 544 537 543 1578 541 1579 550 1570 549 1572 547 26524 8496 4207 576 1570 549 533 547 1574 545 537 543 539 541 1580 549 532 548 1573 546 536 544 1577 542 539 551 1570 549 1572 547 534 546 1575 544 538 542 540 550 1571 548 534 546 1575 544 538 542 540 550 531 549 533 547 1575 544 537 543 1579 550 531 549 1571 548 1572 547 1574 545 1576 543 26529 8491 4211 573 1573 546 535 545 1576 543 539 551 530 550 1571 548 533 547 1574 545 536 544 1578 541 540 550 1570 549 1572 547 534 546 1575 544 538 542 539 541 1580 549 532 548 1572 547 535 545 537 543 539 541 540 550 1571 548 533 547 1574 545 537 543 1578 541 1579 550 1571 548 1574 545 26522 8498 4202 571 1574 545 537 543 1578 541 541 549 532 548 1573 546 534 546 1575 544 537 543 1577 542 540 550 1570 549 1571 548 533 547 1574 545 537 543 538 542 1579 550 531 549 1572 547 534 546 536 544 537 543 538 542 1579 550 531 549 1572 547 535 545 1575 544 1577 542 1579 550 1571 548 26522 8498 4203 570 1575 544 537 543 1578 541 541 549 532 548 1573 546 535 545 1575 544 538 542 1579 550 531 549 1571 548 1572 547 535 545 1575 544 538 542 539 541 1580 549 532 548 1572 547 534 546 536 544 537 543 539 541 1579 550 531 549 1571 548 533 547 1573 546 1574 545 1575 544 1577 542 -# -name: VOL- -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 8490 4211 573 1573 546 535 545 1576 543 539 541 540 550 1571 548 532 548 1573 546 535 545 1576 543 539 541 1579 550 1571 548 533 547 1574 545 536 544 1576 543 1578 541 540 550 1570 549 533 547 534 546 536 544 537 543 539 541 540 550 1570 549 532 548 1572 547 1573 546 1574 545 1576 543 26528 8492 4208 648 1475 572 534 546 1575 544 537 543 539 541 1580 549 532 548 1573 546 535 545 1576 543 538 542 1579 550 1571 548 533 547 1575 544 537 543 1577 542 1579 550 532 548 1573 546 535 545 537 543 539 541 541 549 532 548 533 547 1575 544 537 543 1578 541 1579 550 1571 548 1573 546 26523 8496 4203 622 1499 569 537 543 1578 541 541 549 532 548 1572 547 534 546 1574 545 537 543 1578 541 540 550 1570 549 1571 548 534 546 1575 544 538 542 1578 541 1580 549 532 548 1573 546 536 544 538 542 540 550 532 548 533 547 535 545 1576 543 539 541 1579 550 1571 548 1573 546 1574 545 26521 8498 4201 572 1573 546 536 544 1577 542 540 550 531 549 1571 548 533 547 1573 546 536 544 1576 543 539 541 1579 550 1570 549 532 548 1573 546 535 545 1576 543 1578 541 540 550 1571 548 533 547 535 545 537 543 538 542 540 550 531 549 1572 547 534 546 1575 544 1576 543 1577 542 1579 550 26522 8498 4203 570 1575 544 538 542 1579 550 532 548 533 547 1575 544 537 543 1578 541 540 550 1570 549 533 547 1573 546 1575 544 537 543 1578 541 540 550 1571 548 1573 546 536 544 1578 551 531 549 533 547 535 545 537 543 539 541 540 550 1571 548 533 547 1575 544 1576 543 1578 541 1580 549 26521 8498 4203 570 1576 543 538 542 1580 549 532 548 533 547 1574 545 536 544 1577 542 540 550 1570 549 533 547 1573 546 1575 544 538 542 1579 550 531 549 1571 548 1573 546 536 544 1576 543 539 551 531 549 532 548 534 546 536 544 538 542 1579 550 531 549 1572 547 1573 546 1574 545 1576 543 -# -name: POWER -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 8500 4203 653 1468 569 538 542 1579 550 532 548 534 546 1575 544 536 544 1578 541 540 550 1572 547 534 546 1575 544 1577 542 539 541 1580 550 532 548 534 546 535 545 1576 543 1577 542 1579 551 532 548 534 546 536 544 1577 542 1578 552 531 549 533 547 534 546 1574 545 1575 544 1577 542 26533 8492 4211 573 1573 546 535 545 1576 543 539 551 530 550 1571 548 533 547 1574 545 536 544 1577 542 540 550 1570 549 1572 547 534 546 1576 543 539 541 541 549 532 548 1573 546 1574 545 1576 543 539 551 531 549 533 547 1573 546 1576 543 539 541 541 549 532 548 1573 546 1574 545 1576 543 26532 8493 4209 575 1571 548 533 547 1575 544 537 543 539 541 1580 550 531 549 1572 547 534 546 1576 543 538 542 1579 551 1570 549 532 548 1574 545 537 543 538 542 540 550 1570 549 1572 547 1575 544 537 543 539 541 540 550 1571 548 1573 546 536 544 538 542 539 551 1570 549 1572 547 1574 545 26530 8496 4207 567 1579 551 531 549 1572 547 535 545 536 544 1576 543 538 542 1579 551 530 550 1571 548 534 546 1574 545 1576 543 538 542 1579 551 532 548 533 547 534 546 1576 543 1577 542 1579 551 532 548 534 546 535 545 1576 543 1578 541 540 550 532 548 533 547 1574 545 1575 544 1577 542 26531 8495 4210 574 1571 548 534 546 1575 544 538 542 539 551 1569 550 531 549 1572 547 535 545 1576 543 539 541 1579 550 1571 548 534 546 1575 544 538 542 540 550 531 549 1572 547 1549 570 1551 568 539 551 531 549 532 548 1573 546 1550 569 538 542 540 550 531 549 1571 548 1548 571 1550 569 -# -name: POWER -type: parsed -protocol: NECext -address: 00 EF 00 00 -command: 1C E3 00 00 -# -name: VOL+ -type: parsed -protocol: NECext -address: 00 EF 00 00 -command: 00 FF 00 00 -# -name: VOL- -type: parsed -protocol: NECext -address: 00 EF 00 00 -command: 04 FB 00 00 -# -name: POWER -type: parsed -protocol: NEC42 -address: 6E 00 00 00 -command: 00 00 00 00 -# -name: VOL+ -type: parsed -protocol: NEC42 -address: 6E 00 00 00 -command: 4D 00 00 00 -# -name: VOL- -type: parsed -protocol: NEC42 -address: 6E 00 00 00 -command: 4E 00 00 00 -# -name: POWER -type: parsed -protocol: NEC42 -address: 6E 00 00 00 -command: 0E 00 00 00 -# -name: POWER -type: raw -frequency: 38000 -duty_cycle: 0.330000 -data: 8441 4184 542 1562 541 1562 542 511 546 506 540 511 546 1557 546 506 540 1563 541 1563 540 1563 541 512 545 507 539 512 545 507 539 512 545 507 539 22605 538 1565 539 1565 538 514 543 509 537 514 543 1560 543 509 548 1555 548 1556 548 1556 547 504 542 510 547 505 541 510 547 505 541 510 547 22597 546 1559 544 1559 545 507 539 513 544 507 539 1564 539 513 544 1559 544 1559 545 545 508 549 513 508 538 513 544 508 538 513 544 22601 542 1562 542 1561 543 510 547 505 541 510 547 1557 547 505 541 1562 542 1562 542 1562 542 510 547 505 541 510 547 505 541 511 546 505 541 22603 540 1564 539 1565 538 513 544 508 538 513 544 1560 544 508 538 1565 538 1565 538 1566 537 514 543 509 548 504 542 509 548 504 542 509 548 22597 546 1558 546 1558 546 506 540 512 545 507 539 1564 540 512 545 1559 545 1559 544 1559 544 507 539 513 544 508 538 513 544 508 538 513 544 22600 543 1561 542 1562 542 510 547 505 541 510 547 1557 547 505 541 1562 541 1563 540 1563 541 511 546 506 540 511 546 506 540 511 546 506 540 22604 539 1565 538 1566 537 514 543 509 548 504 542 1561 543 509 548 1556 548 1556 548 1556 547 504 542 510 547 505 541 510 547 505 541 510 547 22598 545 1559 544 1559 545 507 539 512 545 507 539 1564 540 512 545 1559 544 1559 545 1559 545 508 538 513 544 508 538 513 544 508 538 513 544 22601 542 1562 542 1562 542 511 546 505 541 511 546 1557 546 506 540 1563 541 1563 540 1563 541 511 546 506 540 511 546 506 540 512 545 506 540 22604 539 1565 538 1566 537 514 543 509 548 504 542 1561 543 509 548 1556 547 1556 547 1556 548 504 542 510 547 505 541 510 547 505 541 510 547 -# -name: POWER -type: parsed -protocol: SIRC -address: 10 00 00 00 -command: 60 00 00 00 -# -name: VOL- -type: parsed -protocol: NEC -address: 08 00 00 00 -command: 0E 00 00 00 -# -name: VOL+ -type: parsed -protocol: NEC -address: 08 00 00 00 -command: 1A 00 00 00 -# -name: VOL+ -type: parsed -protocol: NEC -address: 00 00 00 00 -command: 57 00 00 00 -# -name: VOL+ -type: parsed -protocol: NEC -address: 4D 00 00 00 -command: 04 00 00 00 -# -name: VOL- -type: parsed -protocol: NEC -address: 4D 00 00 00 -command: 05 00 00 00 -# -name: VOL+ -type: parsed -protocol: NEC -address: 4D 00 00 00 -command: 02 00 00 00 -# -name: VOL- -type: parsed -protocol: NEC -address: 4D 00 00 00 -command: 03 00 00 00 -# -name: POWER -type: parsed -protocol: NEC -address: 4D 00 00 00 -command: 00 00 00 00 -# -name: VOL+ -type: parsed -protocol: NEC -address: 00 00 00 00 -command: 19 00 00 00 -# -name: VOL- -type: parsed -protocol: NEC -address: 00 00 00 00 -command: 16 00 00 00 -# -name: MUTE -type: parsed -protocol: NEC -address: 00 00 00 00 -command: 44 00 00 00 -# -name: VOL+ -type: parsed -protocol: NECext -address: 12 36 00 00 -command: 0A F5 00 00 -# -name: VOL- -type: parsed -protocol: NECext -address: 12 36 00 00 -command: 0B F4 00 00 -# -name: MUTE -type: parsed -protocol: NECext -address: 12 36 00 00 -command: 09 F6 00 00 -# -name: POWER -type: parsed -protocol: NECext -address: 12 36 00 00 -command: 01 FE 00 00 -# -# OFF -name: POWER -type: parsed -protocol: RC5 -address: 10 00 00 00 -command: 0F 00 00 00 -# -name: POWER -type: parsed -protocol: NEC -address: 00 00 00 00 -command: 02 00 00 00 -# -name: VOL+ -type: parsed -protocol: NEC -address: 00 00 00 00 -command: 0A 00 00 00 -# -name: VOL- -type: parsed -protocol: NEC -address: 00 00 00 00 -command: 0E 00 00 00 -# -name: MUTE -type: parsed -protocol: Kaseikyo -address: A0 02 20 00 -command: 20 03 00 00 # name: POWER type: parsed @@ -1949,12 +442,1477 @@ protocol: Kaseikyo address: A0 02 20 00 command: 10 02 00 00 # +name: MUTE +type: parsed +protocol: Kaseikyo +address: A0 02 20 00 +command: 20 03 00 00 +# +name: POWER +type: parsed +protocol: NEC +address: 01 00 00 00 +command: 02 00 00 00 +# +name: VOL+ +type: parsed +protocol: NEC +address: 01 00 00 00 +command: 01 00 00 00 +# +name: VOL- +type: parsed +protocol: NEC +address: 01 00 00 00 +command: 0B 00 00 00 +# +name: MUTE +type: parsed +protocol: NEC +address: 01 00 00 00 +command: 06 00 00 00 +# +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 9150 4435 643 1608 643 468 644 469 642 364 749 468 643 447 665 449 663 469 643 452 660 470 642 450 662 442 670 449 662 469 643 1579 672 1608 642 1580 671 1609 641 1607 643 1578 672 1607 643 1608 642 1606 644 1606 644 1606 644 1607 643 1576 675 1579 671 1605 674 438 645 466 673 438 646 466 674 437 673 439 672 439 673 438 646 1604 673 1577 673 1578 673 1577 674 1577 673 23799 9095 4485 616 +# +name: VOL+ +type: parsed +protocol: NEC42 +address: 01 00 00 00 +command: 0C 00 00 00 +# +name: VOL- +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 9151 4434 644 1608 643 376 737 379 733 446 666 449 663 468 644 469 643 468 644 468 644 468 644 447 665 448 664 468 644 450 662 1608 643 1607 644 1576 676 1607 644 1608 643 1578 674 1608 643 1577 674 1579 672 1607 643 1608 643 1607 644 1607 644 1608 643 448 664 1608 643 448 664 468 644 469 643 380 732 468 644 469 643 1607 644 468 644 1608 643 1608 644 1609 643 1608 643 23837 9152 4434 642 +# +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 8968 4344 670 460 670 460 670 1566 669 462 668 486 643 487 642 489 641 1595 640 490 640 491 640 1596 640 491 640 1596 640 1596 640 1596 640 491 640 1596 640 1596 640 1596 640 1596 640 1596 640 1596 640 1596 640 1622 640 491 640 491 640 491 640 491 640 491 640 491 640 491 640 491 639 +# +name: POWER +type: parsed +protocol: SIRC +address: 10 00 00 00 +command: 2E 00 00 00 +# +name: POWER +type: parsed +protocol: NECext +address: 00 FD 00 00 +command: 01 FE 00 00 +# +name: MUTE +type: parsed +protocol: NECext +address: 00 FD 00 00 +command: 03 FC 00 00 +# +name: VOL+ +type: parsed +protocol: NECext +address: 00 FD 00 00 +command: 09 F6 00 00 +# +name: VOL- +type: parsed +protocol: NECext +address: 00 FD 00 00 +command: 07 F8 00 00 +# +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 1042 1461 540 1460 541 1460 541 1460 541 1459 542 1459 542 454 536 460 540 456 544 452 538 458 542 454 546 450 540 456 544 1457 544 1456 545 1448 542 50531 1041 1462 539 1462 539 1461 540 1461 540 1460 541 1460 541 455 545 451 539 457 543 480 510 459 541 481 519 451 539 457 543 1457 543 1457 544 1449 541 50515 1037 1467 544 1456 545 1456 545 1455 546 1455 535 1465 536 486 514 483 517 479 511 485 515 481 509 487 513 483 517 478 512 1462 539 1462 539 1454 536 50537 1035 1467 544 1457 544 1457 544 1456 545 1456 544 1456 545 477 513 483 517 479 511 486 514 481 519 477 513 484 516 479 511 1464 536 1463 538 1455 546 +# +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 1010 1491 509 1490 510 1488 512 487 513 487 513 1486 514 1485 515 484 516 1483 517 482 518 482 518 1481 509 1489 511 488 512 487 513 1486 514 484 516 50963 1011 1489 511 1488 512 1487 513 485 515 486 514 1485 515 1484 516 484 516 1483 517 482 518 482 518 1481 509 1489 511 489 511 489 511 1487 513 486 514 50986 1008 1492 518 1480 510 1488 512 487 513 487 513 1486 514 1484 516 484 516 1483 517 482 518 481 519 1480 510 1488 512 487 513 487 513 1486 514 484 516 50972 1012 1488 512 1486 514 1484 516 483 517 483 517 1482 518 1480 510 489 511 1487 513 486 514 486 514 1485 515 1483 517 483 517 483 517 1481 509 490 510 50976 1008 1491 509 1489 511 1487 513 485 515 485 515 1484 516 1481 509 491 509 1489 511 488 512 488 512 1487 513 1485 515 484 516 484 516 1483 517 481 509 +# +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 1011 1479 517 477 516 481 512 1480 516 1473 513 482 511 485 518 1473 513 482 511 1481 515 1474 512 482 511 485 518 1473 513 1477 509 486 517 1473 513 50728 1014 1475 511 484 509 487 516 1475 511 1479 517 477 516 480 513 1478 508 487 516 1475 511 1479 517 478 514 480 513 1479 517 1473 513 508 484 1479 517 50725 1016 1473 513 481 512 484 519 1473 513 1477 509 485 518 478 515 1476 510 485 518 1473 513 1477 509 486 517 478 515 1476 510 1480 516 479 514 1476 510 50735 1069 1421 513 481 512 484 509 1483 513 1477 509 486 517 479 514 1477 509 486 517 1474 512 1479 507 488 515 480 513 1479 507 1483 513 482 511 1479 517 50733 1011 1478 508 513 490 506 486 1478 508 1483 513 508 485 511 482 1482 514 508 485 1480 516 1473 513 508 485 511 482 1483 513 1477 509 512 491 1473 513 50735 1008 1480 516 479 514 508 485 1480 516 1474 512 509 484 486 517 1472 514 508 485 1480 516 1474 512 509 484 512 481 1482 514 1477 509 512 491 1472 514 50738 1006 1509 487 508 485 486 507 1509 487 1503 483 513 490 505 488 1502 484 512 491 1473 513 1503 483 512 491 505 488 1476 510 1507 489 506 487 1503 483 +# +name: MUTE +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 1010 1479 517 1474 512 509 484 512 491 505 488 507 486 510 483 512 491 505 488 508 485 1505 491 1474 512 1478 508 1483 513 1477 509 1482 514 1475 511 50713 1005 1483 513 1475 511 511 482 513 490 505 488 507 486 483 510 511 482 487 516 505 488 1501 485 1478 508 1483 513 1476 510 1479 507 1483 513 1474 512 50707 1012 1501 485 1479 506 513 490 505 488 507 486 509 484 511 482 487 516 505 488 508 485 1504 482 1482 514 1476 592 1396 590 1400 513 1476 510 1478 508 50715 1015 1473 513 1476 510 484 508 513 490 504 489 480 513 508 485 483 510 511 482 488 515 1473 513 1477 509 1480 516 1474 512 1477 591 1397 516 1472 514 +# +name: VOL+ +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 1041 1462 538 1462 538 485 515 481 519 478 512 484 516 1458 542 1458 542 1459 541 481 519 1481 519 1455 545 1482 518 1456 544 479 511 486 514 474 516 50532 1039 1464 536 1490 510 487 513 483 517 480 510 486 514 1460 540 1486 514 1460 540 483 517 1457 543 1484 516 1458 542 1458 542 481 519 477 513 476 513 50534 1036 1467 543 1457 543 480 509 460 540 483 517 479 511 1463 537 1463 537 1464 536 486 514 1487 513 1461 539 1461 539 1462 538 484 516 481 519 469 510 +# +name: VOL- +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 1042 1461 539 457 543 1458 542 1458 542 1458 542 1458 542 454 536 461 539 457 543 1457 543 453 537 460 540 456 544 452 538 1463 537 1463 537 1456 544 50530 1065 1438 572 424 566 1434 566 1435 565 1435 565 1436 544 452 537 459 572 424 545 1456 544 451 539 458 542 454 536 460 540 1461 539 1461 539 1454 536 50538 1036 1467 543 452 537 1464 536 1464 536 1464 536 1465 545 450 540 456 544 452 537 1464 536 460 540 455 545 452 538 458 542 1459 541 1460 540 1452 538 +# +name: VOL+ +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 1044 1456 544 455 545 455 534 1464 536 1462 538 1460 540 1458 542 1456 544 1455 545 1453 537 1461 539 460 540 459 541 459 561 437 542 457 543 456 544 50915 1016 1483 517 482 518 482 518 1481 509 1489 511 1487 513 1486 514 1485 515 1483 517 1482 508 1490 510 489 511 488 512 487 513 487 513 486 514 485 515 50956 1047 1452 538 462 538 462 538 1461 539 1460 540 1458 542 1457 543 1456 544 1454 546 1453 547 1451 539 461 539 460 540 460 540 459 541 459 541 457 543 +# +name: VOL- +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 1017 1484 516 1482 518 481 519 1480 510 1489 511 1487 513 1486 514 1485 515 1483 517 482 518 1480 510 490 510 489 511 489 511 488 512 488 512 486 514 50956 1015 1486 514 1484 516 484 516 1483 517 1482 518 1480 510 1489 511 1488 512 1486 514 486 514 1485 515 484 516 484 516 483 517 483 517 482 518 481 509 50960 1011 1488 512 1486 514 486 514 1485 515 1483 517 1482 518 1480 510 1488 512 1486 514 486 514 1484 516 483 517 483 517 482 518 481 519 481 508 489 511 50961 1040 1461 539 1459 541 459 541 1458 542 1456 544 1455 545 1454 546 1452 538 1460 540 460 540 1458 542 457 543 456 544 456 544 455 545 455 545 453 547 +# +name: VOL+ +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 1006 1485 511 1479 517 1473 513 509 484 511 482 514 489 506 487 508 485 511 482 513 490 505 488 1477 509 1481 515 1475 511 1480 516 1474 512 1477 509 50734 1007 1483 513 1477 509 1482 514 507 486 509 484 511 492 503 490 506 487 508 485 510 483 513 490 1474 512 1479 517 1473 513 1477 509 1481 515 1474 512 50729 1012 1477 509 1481 515 1474 512 509 484 512 491 504 489 506 487 508 485 511 482 513 490 506 487 1477 509 1481 515 1475 511 1479 517 1473 513 1476 510 +# +name: VOL- +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 1012 1503 483 514 489 1475 511 483 510 486 517 478 515 481 512 483 510 486 517 1473 513 508 485 1480 516 1475 511 1479 507 1483 513 1477 509 1480 588 50646 1012 1476 510 512 491 1473 513 508 485 485 508 488 515 480 513 482 511 512 481 1482 514 482 511 1480 516 1473 513 1478 508 1482 514 1476 510 1479 590 50651 1007 1507 489 507 485 1478 508 514 489 506 487 509 484 485 508 488 515 506 487 1503 483 513 490 1474 512 1478 508 1483 513 1477 509 1481 515 1473 513 50721 1009 1505 491 478 515 1475 511 510 483 486 517 478 515 507 486 483 510 512 491 1472 514 508 485 1505 491 1473 513 1477 509 1481 587 1403 510 1478 508 50733 1008 1506 490 479 514 1477 509 512 481 514 489 506 487 508 485 484 509 513 490 1473 513 509 483 1481 515 1474 512 1479 507 1482 514 1476 510 1478 590 50642 1006 1508 488 508 485 1478 508 487 516 479 514 481 512 510 483 486 517 504 489 1474 512 510 483 1482 514 1475 511 1479 507 1483 513 1477 509 1480 516 +# +name: POWER +type: parsed +protocol: NEC +address: 20 00 00 00 +command: 09 00 00 00 +# +name: MUTE +type: parsed +protocol: NEC +address: 20 00 00 00 +command: 1F 00 00 00 +# +name: VOL+ +type: parsed +protocol: NEC +address: 20 00 00 00 +command: 0E 00 00 00 +# +name: VOL- +type: parsed +protocol: NEC +address: 20 00 00 00 +command: 1A 00 00 00 +# +name: VOL+ +type: parsed +protocol: NEC +address: 20 00 00 00 +command: 02 00 00 00 +# +name: VOL- +type: parsed +protocol: NEC +address: 20 00 00 00 +command: 05 00 00 00 +# +name: POWER +type: parsed +protocol: NEC +address: 20 00 00 00 +command: 0C 00 00 00 +# +name: MUTE +type: parsed +protocol: NEC +address: 20 00 00 00 +command: 08 00 00 00 +# +name: POWER +type: parsed +protocol: NEC +address: 00 00 00 00 +command: 12 00 00 00 +# +name: MUTE +type: parsed +protocol: NEC +address: 00 00 00 00 +command: 1E 00 00 00 +# +name: VOL+ +type: parsed +protocol: NEC +address: 00 00 00 00 +command: 03 00 00 00 +# +name: VOL- +type: parsed +protocol: NEC +address: 00 00 00 00 +command: 01 00 00 00 +# +name: VOL+ +type: parsed +protocol: NEC +address: 00 00 00 00 +command: 1F 00 00 00 +# +name: VOL- +type: parsed +protocol: NEC +address: 00 00 00 00 +command: 09 00 00 00 +# +name: POWER +type: parsed +protocol: NECext +address: 10 E7 00 00 +command: 01 FE 00 00 +# +name: MUTE +type: parsed +protocol: NECext +address: 10 E7 00 00 +command: 00 FF 00 00 +# +name: MUTE +type: parsed +protocol: NECext +address: 10 E7 00 00 +command: 2B D4 00 00 +# +name: MUTE +type: parsed +protocol: NECext +address: 78 0E 00 00 +command: 09 F6 00 00 +# +name: VOL+ +type: parsed +protocol: NECext +address: 78 0E 00 00 +command: 01 FE 00 00 +# +name: VOL- +type: parsed +protocol: NECext +address: 78 0E 00 00 +command: 02 FD 00 00 +# +name: VOL- +type: parsed +protocol: NEC +address: 00 00 00 00 +command: 06 00 00 00 +# +name: POWER +type: parsed +protocol: NEC +address: 02 00 00 00 +command: 0A 00 00 00 +# +name: MUTE +type: parsed +protocol: NEC +address: 02 00 00 00 +command: 0D 00 00 00 +# +name: VOL+ +type: parsed +protocol: NEC +address: 02 00 00 00 +command: 1C 00 00 00 +# +name: VOL- +type: parsed +protocol: NEC +address: 02 00 00 00 +command: 07 00 00 00 +# +name: VOL+ +type: parsed +protocol: NEC +address: 00 00 00 00 +command: 14 00 00 00 +# +name: VOL- +type: parsed +protocol: NEC +address: 00 00 00 00 +command: 08 00 00 00 +# +name: VOL+ +type: parsed +protocol: NECext +address: 86 FF 00 00 +command: 14 EB 00 00 +# +name: VOL- +type: parsed +protocol: NECext +address: 86 FF 00 00 +command: 13 EC 00 00 +# +name: POWER +type: parsed +protocol: NECext +address: 86 FF 00 00 +command: 1B E4 00 00 +# +name: MUTE +type: parsed +protocol: NECext +address: 86 FF 00 00 +command: 2A D5 00 00 +# +name: POWER +type: parsed +protocol: NEC +address: 00 00 00 00 +command: 07 00 00 00 +# +name: MUTE +type: parsed +protocol: NEC +address: 00 00 00 00 +command: 00 00 00 00 +# +name: MUTE +type: parsed +protocol: NECext +address: 40 AF 00 00 +command: 19 E6 00 00 +# +name: VOL+ +type: parsed +protocol: NECext +address: 02 BD 00 00 +command: 26 D9 00 00 +# +name: VOL- +type: parsed +protocol: NECext +address: 02 BD 00 00 +command: 28 D7 00 00 +# +name: POWER +type: parsed +protocol: NECext +address: 02 BD 00 00 +command: 53 AC 00 00 +# +name: MUTE +type: parsed +protocol: NECext +address: 02 BD 00 00 +command: AD 52 00 00 +# +name: POWER +type: parsed +protocol: SIRC +address: 10 00 00 00 +command: 2F 00 00 00 +# +name: VOL+ +type: parsed +protocol: SIRC +address: 10 00 00 00 +command: 12 00 00 00 +# +name: VOL- +type: parsed +protocol: SIRC +address: 10 00 00 00 +command: 13 00 00 00 +# +name: POWER +type: parsed +protocol: NECext +address: 85 23 00 00 +command: 99 66 00 00 +# +name: MUTE +type: parsed +protocol: NECext +address: 85 23 00 00 +command: 97 68 00 00 +# +name: VOL+ +type: parsed +protocol: NECext +address: 85 23 00 00 +command: 57 A8 00 00 +# +name: VOL- +type: parsed +protocol: NECext +address: 85 23 00 00 +command: 47 B8 00 00 +# +name: POWER +type: parsed +protocol: NEC +address: 08 00 00 00 +command: 10 00 00 00 +# +name: MUTE +type: parsed +protocol: NEC +address: 08 00 00 00 +command: 16 00 00 00 +# +name: VOL+ +type: parsed +protocol: NECext +address: 86 FF 00 00 +command: 21 DE 00 00 +# +name: VOL- +type: parsed +protocol: NECext +address: 86 FF 00 00 +command: 2B D4 00 00 +# +name: VOL+ +type: parsed +protocol: NECext +address: BA 4B 00 00 +command: 03 FC 00 00 +# +name: VOL- +type: parsed +protocol: NECext +address: BA 4B 00 00 +command: 02 FD 00 00 +# +name: VOL+ +type: parsed +protocol: NECext +address: BA A0 00 00 +command: 03 FC 00 00 +# +name: VOL- +type: parsed +protocol: NECext +address: BA A0 00 00 +command: 02 FD 00 00 +# +name: VOL+ +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 1014 1477 517 478 514 509 483 487 515 480 512 484 508 488 514 1479 515 1476 508 1483 511 1481 513 1478 516 1475 509 1482 512 1479 515 480 512 483 509 50775 1014 1477 517 504 488 508 484 513 489 506 486 510 482 514 488 1478 516 1475 509 1483 511 1480 514 1477 517 1474 510 1482 512 1478 516 505 487 509 483 50770 1009 1481 513 508 484 512 490 506 486 510 482 514 488 508 484 1481 513 1478 516 1475 509 1483 511 1480 514 1477 517 1475 509 1482 512 509 483 513 489 +# +name: VOL- +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 1010 1508 486 509 483 513 489 507 485 512 490 505 487 510 482 1509 485 511 491 1501 483 1509 485 1507 487 1504 490 1502 482 1509 485 511 491 1500 484 50779 1010 1506 488 508 484 512 490 505 487 509 483 513 489 506 486 1506 488 507 485 1506 488 1503 481 1510 484 1508 486 1505 489 1503 481 514 488 1503 491 +# +name: POWER +type: parsed +protocol: NECext +address: BA A0 00 00 +command: 4C B3 00 00 +# +name: MUTE +type: parsed +protocol: NECext +address: BA A0 00 00 +command: 01 FD 00 00 +# +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 1004 1513 481 515 487 1478 516 505 487 510 482 1484 510 1481 513 508 484 512 490 1475 509 513 489 1477 507 1484 510 511 481 515 487 1479 515 1474 510 50774 1005 1484 510 513 489 1476 508 513 489 508 484 1482 512 1479 515 506 486 511 481 1483 511 512 490 1475 509 1483 511 510 482 515 487 1504 490 1475 509 50777 1013 1503 491 506 486 1505 489 507 485 512 490 1501 483 1508 486 510 482 514 488 1503 481 515 487 1504 490 1500 484 512 490 506 486 1506 488 1502 482 +# +name: MUTE +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 1014 1477 507 514 488 508 484 512 490 505 487 509 483 513 489 507 485 1480 514 1477 517 1475 509 1483 511 1480 514 1477 517 1475 509 1482 512 508 484 50774 1004 1486 508 513 489 507 485 511 491 504 488 508 484 513 489 505 487 1479 515 1476 508 1484 510 1481 513 1478 516 1475 509 1482 512 1480 514 507 485 50771 1007 1507 487 509 483 513 489 507 485 511 481 515 487 508 484 513 489 1502 482 1483 511 1481 513 1479 515 1476 508 1484 510 1481 513 1478 516 506 486 +# +name: POWER +type: parsed +protocol: NECext +address: BA 4B 00 00 +command: 4C B3 00 00 +# +name: MUTE +type: parsed +protocol: NECext +address: BA 4B 00 00 +command: 01 FE 00 00 +# +name: VOL+ +type: parsed +protocol: NECext +address: 83 22 00 00 +command: 0A F5 00 00 +# +name: VOL- +type: parsed +protocol: NECext +address: 83 22 00 00 +command: 01 FE 00 00 +# +name: VOL+ +type: parsed +protocol: NEC +address: 35 00 00 00 +command: 45 00 00 00 +# +name: VOL- +type: parsed +protocol: NEC +address: 35 00 00 00 +command: 1B 00 00 00 +# +name: POWER +type: parsed +protocol: NEC +address: 35 00 00 00 +command: 09 00 00 00 +# +name: MUTE +type: parsed +protocol: NEC +address: 35 00 00 00 +command: 51 00 00 00 +# +name: POWER +type: parsed +protocol: NECext +address: 83 22 00 00 +command: 08 F7 00 00 +# +name: VOL+ +type: parsed +protocol: NECext +address: 0A 1D 00 00 +command: 08 F7 00 00 +# +name: VOL- +type: parsed +protocol: NECext +address: 0A 1D 00 00 +command: 0A F5 00 00 +# +name: MUTE +type: parsed +protocol: NECext +address: 0A 1D 00 00 +command: 03 FC 00 00 +# +name: POWER +type: parsed +protocol: NECext +address: 0A 1D 00 00 +command: 01 FE 00 00 +# +name: VOL+ +type: parsed +protocol: NEC +address: 20 00 00 00 +command: 06 00 00 00 +# +name: VOL- +type: parsed +protocol: NEC +address: 20 00 00 00 +command: 07 00 00 00 +# +name: MUTE +type: parsed +protocol: NEC +address: 20 00 00 00 +command: 1E 00 00 00 +# +name: MUTE +type: parsed +protocol: NEC +address: 80 00 00 00 +command: 01 00 00 00 +# +name: VOL+ +type: parsed +protocol: NEC +address: 80 00 00 00 +command: 03 00 00 00 +# +name: VOL- +type: parsed +protocol: NEC +address: 80 00 00 00 +command: 06 00 00 00 +# +name: VOL+ +type: parsed +protocol: Samsung32 +address: 2C 00 00 00 +command: 17 00 00 00 +# +name: VOL- +type: parsed +protocol: Samsung32 +address: 2C 00 00 00 +command: 16 00 00 00 +# +name: VOL+ +type: parsed +protocol: NECext +address: 83 22 00 00 +command: 16 E9 00 00 +# +name: VOL- +type: parsed +protocol: NECext +address: 83 22 00 00 +command: 0F F0 00 00 +# +name: POWER +type: parsed +protocol: NECext +address: 83 22 00 00 +command: 0C F3 00 00 +# +name: MUTE +type: parsed +protocol: NECext +address: 83 22 00 00 +command: 15 EA 00 00 +# +name: POWER +type: parsed +protocol: Kaseikyo +address: A0 02 20 00 +command: D0 03 00 00 +# +name: POWER +type: parsed +protocol: NECext +address: C8 91 00 00 +command: 00 FF 00 00 +# +name: MUTE +type: parsed +protocol: NECext +address: C8 91 00 00 +command: 20 DF 00 00 +# +name: VOL+ +type: parsed +protocol: NECext +address: C8 91 00 00 +command: 1E E1 00 00 +# +name: VOL- +type: parsed +protocol: NECext +address: C8 91 00 00 +command: 1F E0 00 00 +# +name: VOL+ +type: parsed +protocol: RC6 +address: 10 00 00 00 +command: 10 00 00 00 +# +name: VOL- +type: parsed +protocol: RC6 +address: 10 00 00 00 +command: 11 00 00 00 +# +name: POWER +type: parsed +protocol: RC6 +address: 10 00 00 00 +command: 0C 00 00 00 +# +name: VOL+ +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 4559 4461 546 490 515 495 521 490 515 495 489 1484 516 1482 550 486 519 491 493 1480 520 1478 522 1477 523 1475 546 490 515 495 521 490 515 495 489 4493 545 491 525 486 519 491 514 496 488 1484 516 1483 517 1481 551 486 488 1485 515 1483 517 1482 550 486 519 491 525 486 519 491 493 1479 542 494 522 489 516 467 517 1482 550 +# +name: VOL- +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 4550 4469 548 462 543 467 549 461 544 466 518 1481 520 1479 542 468 548 462 522 1477 523 1476 514 1485 515 1483 549 461 544 466 550 461 544 466 518 4491 547 463 542 468 548 462 543 467 549 462 543 467 549 461 523 1476 514 1485 515 1484 516 1482 550 461 513 1486 514 1485 515 1483 549 461 544 466 550 461 544 493 491 1481 540 +# +name: VOL+ +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 4496 4442 513 503 488 502 489 501 490 500 491 1505 487 1508 484 505 486 504 487 1508 484 1511 492 1503 489 1499 514 484 486 504 487 502 489 501 490 4449 517 499 492 499 492 497 483 507 484 1511 492 1504 488 1499 514 483 487 1509 483 1512 491 1504 488 503 488 501 490 500 491 499 492 1504 488 501 490 500 491 492 509 1494 488 55126 4496 4446 541 482 488 502 489 501 490 500 491 1505 487 1508 484 505 486 504 487 1508 484 1503 510 1493 489 1480 512 504 487 503 488 502 489 500 491 4449 517 498 493 497 483 507 484 505 486 1502 511 1492 490 1504 488 502 489 1507 485 1509 483 1512 491 473 518 498 493 496 484 505 486 1510 483 499 512 484 486 504 487 1508 484 +# +name: VOL- +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 4492 4434 510 505 486 505 486 504 487 503 488 1481 511 1484 518 499 492 498 493 1476 516 1479 513 1483 519 1469 596 402 516 500 491 499 492 498 493 4447 518 498 493 497 483 507 484 506 485 504 487 503 488 494 517 1485 486 1483 519 1476 516 1480 512 504 486 1508 484 1486 517 1479 565 425 513 502 488 501 490 492 509 1467 515 +# +name: VOL+ +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 4500 4436 516 504 486 510 490 505 485 510 490 1500 491 1474 517 505 485 484 516 1501 490 1501 490 1501 490 1501 490 505 485 511 489 506 484 485 515 4449 513 482 508 513 487 508 482 514 486 1504 487 1504 487 1504 487 482 508 1509 482 1509 492 1499 492 504 486 509 491 504 486 509 491 1500 491 504 486 510 490 478 512 1505 486 55017 4492 4444 508 512 488 508 482 513 487 508 482 1508 483 1482 509 513 487 508 482 1509 482 1509 482 1483 508 1483 508 513 487 508 482 514 486 509 481 4457 515 506 484 511 489 506 484 511 489 1501 490 1475 516 1501 490 506 484 1480 511 1507 484 1480 511 511 489 506 484 512 488 507 483 1507 484 512 488 507 483 512 488 1503 488 +# +name: VOL- +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 4493 4443 509 512 488 507 483 512 488 507 483 1482 509 1482 509 512 488 507 483 1482 509 1482 509 1482 509 1482 509 512 488 507 483 513 487 508 482 4457 516 505 485 510 490 505 485 510 490 505 485 511 489 505 485 1480 511 1480 511 1480 511 1481 510 484 516 1476 515 1476 515 1476 515 481 509 486 514 481 509 486 514 1476 515 55014 4498 4438 514 482 508 487 513 482 508 488 512 1477 514 1477 514 482 508 487 513 1477 514 1477 514 1477 514 1477 514 482 518 477 513 482 518 477 513 4451 511 485 515 479 511 485 515 480 510 485 515 480 510 485 515 1475 516 1475 516 1476 515 1476 515 480 510 1481 510 1481 510 1481 510 486 514 481 509 486 514 481 509 1482 509 +# +name: VOL+ +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 4524 4473 512 516 491 511 486 516 491 511 496 1482 522 1482 522 506 491 512 495 1483 521 1483 521 1483 521 1483 521 506 491 512 495 507 490 512 495 4475 521 507 490 513 494 508 489 513 494 1484 520 1484 520 1483 521 507 490 1488 516 1488 516 1488 516 511 496 506 491 511 496 506 491 1488 516 511 496 506 491 512 495 1483 521 55356 4533 4463 512 516 491 511 486 516 491 511 496 1507 487 1492 512 515 492 510 487 1492 512 1492 512 1491 513 1491 513 515 492 510 487 515 492 510 487 4484 512 516 491 511 496 506 491 512 495 1483 521 1482 522 1482 522 506 491 1488 516 1487 517 1487 517 511 496 506 491 512 495 506 491 1488 516 512 495 507 490 512 495 1483 521 +# +name: VOL- +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 4533 4464 521 507 490 512 495 507 490 513 494 1484 520 1484 520 508 489 513 494 1484 520 1484 520 1483 521 1483 521 506 491 511 496 506 491 512 495 4475 521 507 490 512 495 507 490 513 494 508 489 513 494 508 489 1490 514 1490 514 1490 514 1490 514 514 493 1485 519 1485 519 1485 519 509 488 515 492 510 487 516 491 1487 517 55369 4531 4465 520 508 489 514 493 509 488 515 492 1486 518 1486 518 509 488 514 493 1486 518 1485 519 1485 519 1485 519 509 488 514 493 509 488 515 492 4478 518 511 486 516 491 511 496 506 491 512 495 507 490 512 495 1483 521 1483 521 1483 521 1483 521 507 490 1488 516 1488 516 1488 516 512 495 507 490 513 494 508 489 1490 514 +# +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 4530 4465 521 507 490 513 494 507 490 513 494 1509 496 1483 521 506 491 512 495 1508 486 1492 512 1492 513 1491 513 514 493 509 488 514 493 509 488 4483 513 514 493 509 488 515 492 510 487 515 492 510 487 515 492 510 487 1517 488 1491 513 1490 515 513 494 1510 494 1484 520 1483 521 1483 521 506 491 512 495 506 491 1487 517 55357 4528 4468 518 510 487 515 492 510 487 515 492 1512 493 1485 519 509 488 514 493 1510 494 1483 522 1483 521 1482 512 516 491 511 486 516 491 511 486 4484 512 516 491 511 486 516 491 511 486 516 491 511 486 516 491 511 496 1507 487 1491 513 1491 514 514 493 1510 495 1484 521 1483 522 1483 522 506 491 511 486 516 491 1513 491 +# +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 4495 4440 512 509 491 504 486 509 491 504 486 1478 513 1479 512 509 491 504 486 1478 513 1479 512 1479 512 1479 512 509 491 504 486 509 491 504 486 4452 511 511 489 506 484 511 489 506 484 511 489 506 484 511 489 506 484 1480 511 1480 511 1480 511 510 491 1500 491 1475 516 1475 516 1475 516 504 486 510 490 505 485 1479 512 55017 4497 4439 513 507 483 513 487 507 483 513 487 1476 515 1477 514 507 483 513 487 1476 515 1476 515 1477 514 1477 514 481 509 512 488 507 483 512 488 4451 512 509 491 504 486 509 491 504 486 483 517 504 486 509 492 504 486 1504 487 1504 487 1478 513 508 482 1509 482 1509 482 1509 482 1483 508 513 487 508 482 513 487 1504 487 +# +name: MUTE +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 4501 4435 517 504 486 510 490 505 485 510 490 1475 516 1475 516 506 484 511 489 1476 515 1476 515 1476 515 1477 514 507 483 512 488 507 483 513 487 4451 511 510 490 479 511 484 516 506 484 1481 510 511 489 506 484 511 489 1476 515 1476 515 1477 514 507 483 512 488 1477 514 1477 514 1478 513 508 482 513 487 508 482 1484 517 55011 4496 4440 512 509 491 478 512 483 517 504 486 1480 511 1480 511 484 516 505 485 1480 511 1480 511 1481 510 1481 510 484 516 506 484 511 489 506 484 4455 517 504 486 509 491 504 486 483 517 1474 517 505 485 510 490 505 485 1480 511 1480 511 1481 510 511 489 480 510 1481 510 1481 510 1482 509 485 515 507 483 512 488 1477 514 +# +name: POWER +type: parsed +protocol: Samsung32 +address: 2C 00 00 00 +command: 1E 00 00 00 +# +name: MUTE +type: parsed +protocol: Samsung32 +address: 2C 00 00 00 +command: 1F 00 00 00 +# +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 4504 4432 511 509 492 504 486 509 492 504 486 1478 514 1477 515 507 484 512 489 1476 516 1475 517 1475 517 1474 518 503 487 509 492 503 487 508 493 4446 508 513 488 507 483 512 489 507 483 512 489 506 484 511 490 506 484 1481 511 1480 512 1479 513 509 492 1473 519 1473 519 1472 509 1482 510 511 490 506 484 511 490 1475 517 54985 4498 4437 517 504 486 509 492 504 486 509 492 1473 519 1472 509 512 489 506 484 1481 511 1480 512 1480 512 1479 513 508 493 502 488 507 483 512 489 4449 516 506 485 511 490 505 485 510 491 505 485 510 491 504 486 509 492 1473 519 1473 508 1483 561 434 515 1476 516 1475 517 1474 518 1473 519 502 488 507 483 512 489 1476 516 +# +name: MUTE +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 4531 4406 516 478 512 484 538 457 544 452 538 1453 518 1473 519 476 546 450 540 1451 509 1482 510 1481 511 1480 512 483 539 457 544 452 538 457 544 4420 513 482 540 456 545 450 540 455 546 1445 547 449 541 454 536 458 543 1449 543 1449 543 1448 544 451 539 456 545 1445 547 1445 547 1444 537 458 543 453 537 457 544 1448 544 54957 4495 4440 514 481 520 477 513 482 519 476 514 1476 516 1475 517 478 512 484 517 1474 518 1473 519 1472 520 1471 521 474 516 479 511 484 517 479 511 4452 512 509 492 503 487 508 493 503 487 1477 515 507 483 512 489 506 484 1481 511 1481 511 1480 512 509 492 503 487 1478 514 1478 514 1477 515 506 484 511 490 505 485 1480 512 +# +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 4551 4468 549 461 544 493 523 460 545 466 518 1480 520 1479 542 468 548 489 495 1477 523 1475 515 1484 516 1483 549 461 544 493 523 487 518 466 518 4490 548 462 543 493 523 488 517 466 550 461 544 466 550 460 545 465 519 1480 520 1478 522 1477 544 465 519 1480 520 1479 521 1477 523 1476 545 464 541 496 520 490 494 1479 542 55901 4554 4465 542 494 522 489 516 494 522 488 496 1477 523 1476 545 490 515 495 489 1484 516 1483 517 1481 519 1479 542 494 522 489 516 494 522 488 496 4487 541 495 521 490 515 495 521 489 516 494 522 488 517 493 523 488 496 1476 525 1475 515 1483 549 488 496 1476 524 1475 515 1484 516 1482 550 486 519 491 525 486 488 1485 547 55897 4548 4470 548 462 543 468 548 462 543 467 517 1482 518 1480 541 469 547 490 494 1478 575 1423 515 1485 515 1483 549 461 544 466 550 461 544 466 518 4491 547 462 543 467 549 462 543 467 549 461 544 466 539 497 519 492 492 1480 520 1478 522 1477 544 465 519 1480 520 1479 521 1477 513 1486 546 464 541 469 547 464 520 1478 543 +# +name: MUTE +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 4553 4467 550 459 546 464 541 469 547 464 520 1479 521 1477 544 492 524 486 498 1475 515 1484 516 1482 518 1481 540 496 520 490 515 495 521 490 494 4488 550 486 519 491 525 486 519 491 493 1479 542 494 522 489 516 494 490 1482 518 1481 519 1480 541 494 522 489 495 1478 522 1476 514 1485 547 489 516 494 522 489 495 1477 544 +# +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 4555 4483 516 516 488 519 495 512 492 515 489 1525 493 1519 489 518 496 511 493 1521 487 1525 493 1520 488 1524 494 513 491 517 487 520 494 514 490 4501 519 513 491 516 488 520 494 513 491 517 487 521 493 514 490 518 486 1527 491 1522 496 1517 491 516 488 1525 493 1520 488 1525 493 1520 488 519 495 512 492 516 488 1525 493 +# +name: VOL+ +type: parsed +protocol: RC5 +address: 13 00 00 00 +command: 0D 00 00 00 +# +name: VOL- +type: parsed +protocol: RC5 +address: 13 00 00 00 +command: 0E 00 00 00 +# +name: POWER +type: parsed +protocol: RC5 +address: 13 00 00 00 +command: 0B 00 00 00 +# +name: MUTE +type: parsed +protocol: RC5 +address: 13 00 00 00 +command: 0C 00 00 00 +# +name: VOL+ +type: parsed +protocol: SIRC +address: 01 00 00 00 +command: 12 00 00 00 +# +name: VOL- +type: parsed +protocol: SIRC +address: 01 00 00 00 +command: 13 00 00 00 +# +name: VOL+ +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 4552 4468 574 436 566 444 568 442 570 441 540 1458 546 1453 572 439 573 437 544 1455 539 1460 544 1456 548 1450 575 436 566 444 568 442 570 440 541 4468 594 416 565 445 567 443 569 441 540 1459 545 1453 541 1459 566 444 547 1452 542 1457 547 1452 593 417 564 446 566 444 568 442 539 1460 565 446 566 444 568 442 539 1460 565 55957 4581 4437 543 467 545 466 546 464 538 472 519 1480 514 1485 540 471 541 469 512 1486 518 1481 513 1486 518 1481 575 436 566 444 568 442 570 440 541 4468 543 468 544 465 547 464 538 472 519 1480 514 1485 519 1479 546 465 516 1483 511 1488 516 1483 542 468 544 466 546 464 538 473 519 1480 545 466 546 464 538 472 519 1480 545 +# +name: VOL- +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 4546 4473 538 473 539 470 542 469 543 467 514 1484 520 1479 545 465 547 463 518 1481 513 1486 518 1481 513 1487 538 472 540 470 542 469 543 466 515 4495 546 463 539 472 540 470 542 468 544 466 546 491 521 462 519 1480 513 1485 519 1480 514 1486 539 472 519 1479 515 1484 520 1479 546 464 548 463 539 471 541 469 512 1487 548 +# +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 4549 4469 542 468 544 467 545 465 537 473 519 1481 513 1485 540 471 541 469 512 1487 517 1482 512 1487 517 1482 543 467 545 465 547 463 539 472 519 4489 543 468 544 466 546 464 538 473 539 470 542 468 544 466 546 465 516 1482 512 1487 517 1482 543 468 513 1485 519 1480 514 1485 519 1480 545 465 547 463 539 472 520 1479 546 55899 4549 4470 541 469 574 436 566 445 546 463 549 1450 513 1486 539 471 572 438 543 1456 548 1451 543 1456 548 1451 574 436 566 445 567 443 569 441 540 4469 573 437 575 435 567 443 569 441 571 439 573 437 565 445 567 443 549 1451 543 1456 548 1451 574 436 545 1454 540 1459 545 1454 540 1459 566 444 568 442 570 440 541 1458 567 55878 4580 4439 572 439 573 437 565 445 567 443 548 1451 543 1456 569 441 571 439 542 1457 547 1452 542 1457 547 1452 573 437 575 435 567 443 569 442 539 4469 573 438 574 436 566 444 568 442 570 440 572 438 574 436 566 444 547 1452 542 1457 547 1452 573 437 544 1455 539 1460 544 1455 539 1460 575 435 567 444 568 442 539 1459 566 55879 4578 4442 569 441 571 439 573 437 575 435 546 1453 541 1458 567 444 568 441 540 1459 545 1454 540 1459 545 1454 571 439 573 437 575 435 567 444 548 4461 571 440 572 438 574 436 566 444 568 442 570 440 572 438 574 436 545 1454 540 1459 545 1454 571 439 542 1457 547 1452 542 1457 547 1452 573 437 575 435 567 444 547 1451 574 55871 4554 4465 546 464 538 473 539 471 541 469 512 1487 517 1481 544 467 545 465 516 1483 511 1488 516 1483 511 1488 547 463 539 472 540 470 542 468 513 4496 546 464 538 472 540 470 542 468 544 466 546 464 538 473 539 471 510 1488 516 1483 511 1488 547 463 518 1481 513 1486 518 1481 513 1486 539 472 540 470 542 467 514 1485 540 +# +name: MUTE +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 4555 4465 546 464 538 472 540 470 542 468 513 1486 518 1481 544 467 545 465 516 1483 511 1488 516 1483 511 1488 537 473 539 472 540 470 542 468 513 4496 546 464 538 473 539 471 541 469 512 1487 538 472 540 470 542 469 512 1486 518 1481 544 1455 570 441 571 439 542 1457 547 1452 542 1457 568 442 570 440 572 438 543 1456 569 55920 4555 4464 547 464 538 472 540 470 542 468 513 1486 518 1481 544 466 546 464 517 1482 512 1487 517 1482 512 1487 538 473 539 471 541 469 543 467 514 4495 547 463 539 472 540 470 542 468 513 1486 539 471 541 469 543 467 514 1485 519 1479 515 1485 540 470 542 468 513 1486 518 1481 513 1486 539 471 541 469 543 467 514 1485 540 +# +name: POWER +type: parsed +protocol: SIRC15 +address: 10 00 00 00 +command: 15 00 00 00 +# +name: POWER +type: parsed +protocol: SIRC +address: 01 00 00 00 +command: 15 00 00 00 +# +name: MUTE +type: parsed +protocol: SIRC +address: 01 00 00 00 +command: 14 00 00 00 +# +name: POWER +type: parsed +protocol: SIRC +address: 10 00 00 00 +command: 15 00 00 00 +# +name: POWER +type: parsed +protocol: SIRC15 +address: 30 00 00 00 +command: 15 00 00 00 +# +name: MUTE +type: parsed +protocol: SIRC15 +address: 30 00 00 00 +command: 14 00 00 00 +# +name: POWER +type: parsed +protocol: NECext +address: 86 FF 00 00 +command: 1C E3 00 00 +# +name: MUTE +type: parsed +protocol: NECext +address: 86 FF 00 00 +command: 1D E2 00 00 +# +name: VOL+ +type: parsed +protocol: NEC +address: 80 00 00 00 +command: 0D 00 00 00 +# +name: VOL- +type: parsed +protocol: NEC +address: 80 00 00 00 +command: 08 00 00 00 +# +name: POWER +type: parsed +protocol: NEC +address: 80 00 00 00 +command: 12 00 00 00 +# +name: MUTE +type: parsed +protocol: NEC +address: 80 00 00 00 +command: 1E 00 00 00 +# +name: POWER +type: parsed +protocol: NECext +address: EF 01 00 00 +command: 25 DA 00 00 +# +name: VOL- +type: parsed +protocol: NECext +address: EF 01 00 00 +command: 14 EB 00 00 +# +name: VOL+ +type: parsed +protocol: NECext +address: EF 01 00 00 +command: 13 EC 00 00 +# +name: MUTE +type: parsed +protocol: NECext +address: EF 01 00 00 +command: 28 D7 00 00 +# +name: VOL+ +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 1048 580 597 1165 596 582 595 1167 594 875 599 578 599 1455 593 585 592 1171 600 577 600 576 601 13191 1042 586 591 1170 601 576 601 1161 600 869 595 582 595 1459 599 578 599 1163 598 580 597 579 598 13195 1048 580 597 1165 596 581 596 1167 594 875 599 578 599 1456 592 585 592 1171 600 577 600 577 600 13192 1052 576 601 1162 599 578 599 1163 598 871 593 584 593 1462 596 581 596 1166 595 582 595 582 595 +# +name: VOL- +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 1048 553 624 1138 623 554 623 1139 622 848 626 551 626 1427 621 556 652 1403 655 522 655 814 650 12579 1050 552 656 1106 624 553 624 1138 623 847 627 550 627 1427 621 556 621 1434 624 553 624 845 619 12612 1079 523 623 1139 622 555 622 1139 622 848 626 550 627 1427 621 556 621 1434 624 553 624 845 619 12613 1047 556 621 1141 620 556 621 1141 620 850 624 552 625 1429 619 558 619 1435 623 554 623 846 628 12600 1050 552 625 1137 624 553 624 1137 624 846 618 558 619 1435 623 554 623 1431 627 550 627 842 622 12609 1051 551 626 1136 625 551 626 1136 625 844 620 557 620 1434 624 554 623 1431 627 550 627 843 621 +# +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 1073 528 649 1114 647 530 647 1116 645 825 649 527 650 1405 653 1402 625 552 646 1409 649 1113 648 11417 1077 524 653 1110 651 526 651 1112 649 820 654 523 654 1400 648 1407 651 526 651 1404 654 1109 652 11414 1079 523 654 1109 652 524 653 1111 650 819 624 554 654 1401 647 1408 650 529 648 1406 652 1111 650 11416 1077 525 652 1110 651 526 651 1112 649 820 654 523 654 1401 647 1408 650 528 649 1405 622 1141 651 11414 1080 521 646 1116 624 553 645 1117 654 816 648 529 648 1406 652 1403 655 523 644 1410 648 1114 647 11418 1075 526 651 1111 650 527 650 1112 649 820 623 554 654 1400 648 1407 651 526 651 1403 655 1107 654 +# +name: MUTE +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 1051 550 627 1135 626 551 626 1136 625 845 619 850 624 553 675 794 629 842 622 555 622 555 622 13780 1047 555 622 1140 621 557 620 1141 620 850 624 845 619 558 619 850 624 846 618 559 618 559 618 13782 1045 558 619 1143 618 559 618 1144 627 842 622 847 627 550 627 842 622 848 626 551 626 551 626 13774 1053 549 618 1144 627 550 627 1135 626 843 621 849 625 551 626 844 620 850 624 553 624 552 625 13776 1051 551 626 1137 624 553 624 1138 623 846 618 851 623 554 623 846 628 841 623 554 623 554 623 13776 1051 551 626 1136 625 552 625 1137 624 845 619 850 624 553 624 846 618 852 622 555 622 554 623 13778 1049 554 623 1139 622 555 622 1140 621 849 625 844 620 557 620 850 624 846 618 559 618 558 619 +# +name: POWER +type: parsed +protocol: NEC +address: 78 00 00 00 +command: CC 00 00 00 +# +name: MUTE +type: parsed +protocol: NEC +address: 78 00 00 00 +command: 9C 00 00 00 +# +name: POWER +type: parsed +protocol: NEC +address: 7E 00 00 00 +command: 2A 00 00 00 +# +name: MUTE +type: parsed +protocol: NEC +address: 7A 00 00 00 +command: 1C 00 00 00 +# +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 274 789 254 1792 275 814 250 787 246 816 248 1798 279 784 249 813 251 785 248 788 245 1827 281 1791 275 1825 272 790 253 783 250 43886 277 786 278 1795 272 791 252 783 281 782 251 785 269 1804 273 1800 277 1822 275 1798 279 783 270 766 277 759 274 1825 272 1800 277 43886 277 759 274 1825 272 764 279 756 277 786 278 1795 282 781 272 763 280 755 278 785 279 1794 273 1827 270 1802 275 761 272 791 273 43888 276 761 272 1800 277 786 278 758 275 760 273 790 274 1799 278 1821 276 1796 281 1792 275 788 276 760 273 789 275 1798 279 1794 273 43889 278 785 248 1825 272 790 253 782 272 764 279 1793 274 790 274 761 282 781 273 763 280 1793 273 1825 272 1800 277 813 220 789 275 +# +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 270 793 250 1795 272 818 246 791 252 809 244 766 277 1795 282 781 272 790 253 809 224 1822 275 1797 280 1820 277 785 248 788 245 43889 273 790 274 1799 278 785 248 788 276 787 246 1826 271 792 251 1794 273 1827 270 1802 275 788 245 791 273 790 253 1819 278 1794 273 43889 274 789 254 1818 269 767 276 786 247 789 275 788 245 1827 270 792 251 785 248 814 250 1796 281 1819 248 1825 272 790 253 783 271 43889 245 791 273 1799 278 786 278 784 249 787 246 1827 281 781 252 1821 276 1796 281 1792 274 814 250 786 247 789 244 1829 279 1793 274 43888 275 815 218 1828 280 783 250 786 278 785 248 788 245 1827 280 782 251 785 268 794 249 1797 280 1819 278 1794 272 791 252 810 254 +# +name: VOL+ +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 277 759 274 1799 278 784 280 783 250 812 242 1804 273 816 227 808 246 791 252 1819 248 1825 273 1826 251 1822 276 786 247 789 244 43888 274 815 249 1797 280 783 250 812 252 784 249 813 241 1805 272 1827 250 1822 275 787 246 816 217 819 255 807 226 1820 278 1795 272 43888 273 789 254 1817 270 793 251 785 248 814 250 1795 282 807 247 790 253 783 250 1822 276 1796 281 1818 249 1824 274 814 229 807 247 +# +name: VOL- +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 275 762 271 1800 277 786 278 784 249 813 241 795 248 1824 253 784 270 792 251 1821 246 1826 272 1801 276 1823 275 762 271 790 243 43889 274 789 275 1797 280 783 250 812 252 784 249 1823 275 762 271 1827 250 1822 276 787 246 816 217 818 246 790 253 1819 268 1804 273 43886 277 786 247 1825 273 764 280 783 250 811 253 784 249 1822 276 761 272 816 228 1819 279 1794 273 1826 251 1821 277 786 247 815 249 +# +name: MUTE +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 275 762 271 1800 277 786 278 784 249 813 241 795 248 814 219 817 247 789 254 1818 249 1824 274 1798 279 1820 278 759 274 788 245 43887 274 789 275 1798 279 783 250 812 252 784 249 1823 274 1798 279 1820 247 1826 271 765 278 809 224 812 252 784 249 1823 275 1798 279 43880 281 782 251 1821 277 760 273 789 244 818 246 790 253 808 246 791 252 809 224 1822 275 1797 280 1819 248 1825 273 790 253 808 246 +# +name: POWER +type: parsed +protocol: NECext +address: 87 7C 00 00 +command: 80 7F 00 00 +# +name: VOL+ +type: parsed +protocol: NECext +address: 87 7C 00 00 +command: 88 77 00 00 +# +name: VOL- +type: parsed +protocol: NECext +address: 87 7C 00 00 +command: 8C 73 00 00 +# +name: MUTE +type: parsed +protocol: NECext +address: 87 7C 00 00 +command: 94 6B 00 00 +# +name: POWER +type: parsed +protocol: NECext +address: D2 6C 00 00 +command: CB 34 00 00 +# +name: VOL+ +type: parsed +protocol: NECext +address: D2 6D 00 00 +command: 02 FD 00 00 +# +name: VOL- +type: parsed +protocol: NECext +address: D2 6D 00 00 +command: 03 FC 00 00 +# +name: MUTE +type: parsed +protocol: NECext +address: D2 6D 00 00 +command: 05 FA 00 00 +# +name: POWER +type: parsed +protocol: NECext +address: D2 03 00 00 +command: 04 FB 00 00 +# +name: VOL+ +type: parsed +protocol: NECext +address: D2 03 00 00 +command: 02 FD 00 00 +# +name: VOL- +type: parsed +protocol: NECext +address: D2 03 00 00 +command: 03 FC 00 00 +# +name: MUTE +type: parsed +protocol: NECext +address: D2 03 00 00 +command: 05 FA 00 00 +# +name: POWER +type: parsed +protocol: RC5 +address: 14 00 00 00 +command: 0C 00 00 00 +# +name: VOL- +type: parsed +protocol: RC5 +address: 14 00 00 00 +command: 11 00 00 00 +# +name: VOL+ +type: parsed +protocol: RC5 +address: 14 00 00 00 +command: 10 00 00 00 +# +name: POWER +type: parsed +protocol: SIRC15 +address: 10 00 00 00 +command: 60 00 00 00 +# +name: VOL+ +type: parsed +protocol: SIRC15 +address: 30 00 00 00 +command: 12 00 00 00 +# +name: VOL- +type: parsed +protocol: SIRC15 +address: 30 00 00 00 +command: 13 00 00 00 +# +name: VOL+ +type: parsed +protocol: SIRC15 +address: 10 00 00 00 +command: 12 00 00 00 +# +name: VOL- +type: parsed +protocol: SIRC15 +address: 10 00 00 00 +command: 13 00 00 00 +# +name: POWER +type: parsed +protocol: NECext +address: 7E 81 00 00 +command: 2A D4 00 00 +# +name: MUTE +type: parsed +protocol: NECext +address: 7A 85 00 00 +command: 1C E2 00 00 +# +name: POWER +type: parsed +protocol: NEC +address: 78 00 00 00 +command: 0F 00 00 00 +# +name: POWER +type: parsed +protocol: NEC +address: 78 00 00 00 +command: 4F 00 00 00 +# +name: VOL+ +type: parsed +protocol: NEC +address: 7A 00 00 00 +command: 1A 00 00 00 +# +name: VOL- +type: parsed +protocol: NEC +address: 7A 00 00 00 +command: 1B 00 00 00 +# +name: VOL+ +type: parsed +protocol: NECext +address: 7A 85 00 00 +command: 1A E4 00 00 +# +name: VOL- +type: parsed +protocol: NECext +address: 7A 85 00 00 +command: 1B E5 00 00 +# +name: VOL+ +type: parsed +protocol: NEC +address: 78 00 00 00 +command: 1E 00 00 00 +# +name: VOL- +type: parsed +protocol: NEC +address: 78 00 00 00 +command: 1F 00 00 00 +# +name: MUTE +type: parsed +protocol: RC5X +address: 0A 00 00 00 +command: 2F 00 00 00 +# +name: VOL- +type: parsed +protocol: NEC +address: 00 00 00 00 +command: 15 00 00 00 +# +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 8437 4188 538 1565 539 1565 539 513 544 508 538 513 544 1559 545 507 539 1564 540 1564 540 1563 541 1563 541 511 546 1557 547 505 542 511 546 505 542 20497 597 1507 545 1559 545 507 539 512 545 507 539 1564 540 512 545 1558 546 1558 546 1558 546 1557 547 505 542 1562 542 510 547 505 542 510 547 20492 540 1564 540 1564 540 512 545 506 540 511 546 1558 546 505 542 1562 542 1562 542 1562 542 1561 543 509 548 1555 538 514 543 509 537 514 543 20495 547 1558 546 1557 547 505 541 511 546 505 542 1562 542 510 547 1556 548 1556 548 1556 548 1556 537 514 543 1560 544 508 538 514 543 508 538 20501 541 1562 542 1562 542 510 547 505 541 510 547 1556 548 504 543 1561 543 1561 543 1560 544 1560 544 508 538 1565 539 513 544 507 539 513 544 20494 548 1556 548 1556 548 504 543 509 548 504 543 1560 544 508 539 1565 539 1565 539 1564 540 1564 540 512 545 1559 545 506 540 512 545 506 540 20499 543 1560 544 1560 544 508 539 513 544 508 538 1564 540 512 545 1559 545 1558 546 1558 546 1558 546 506 541 1563 541 510 547 505 542 510 547 +# +name: VOL+ +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 8430 4194 542 1562 542 1562 542 510 547 505 541 510 547 1556 548 504 542 1561 543 509 548 1556 548 1556 548 1556 548 1556 548 504 542 509 537 514 543 20496 545 1559 545 1559 545 507 539 512 545 507 539 1564 540 512 545 1559 545 507 539 1564 540 1564 540 1563 541 1563 541 511 546 506 540 511 546 20494 546 1557 547 1557 547 505 541 510 547 505 541 1562 542 510 547 1556 548 505 541 1562 542 1562 542 1561 543 1561 543 509 548 504 542 509 537 20501 540 1565 539 1565 539 512 545 507 539 512 545 1559 545 507 539 1564 540 512 545 1559 545 1558 546 1558 546 1558 546 506 540 511 546 506 540 20498 543 1562 542 1562 542 510 547 505 541 510 547 1557 547 505 541 1562 542 509 548 1556 548 1556 548 1556 548 1556 548 504 542 509 548 504 542 20497 543 1560 544 1560 544 508 538 513 544 508 538 1565 539 513 544 1560 544 508 538 1565 539 1565 539 1565 539 1564 540 513 544 507 539 512 545 20495 545 1558 546 1558 546 506 540 511 546 506 540 1563 541 511 546 1558 546 506 540 1563 541 1563 541 1563 541 1562 542 510 547 505 541 510 547 20493 548 1556 548 1556 548 504 542 509 548 504 542 1561 543 509 537 1566 538 514 543 1560 544 1560 544 1560 544 1560 544 508 538 513 544 508 538 20501 539 1564 540 1564 540 512 545 507 539 512 545 1559 545 507 539 1564 540 512 545 1559 545 1558 546 1558 546 1558 546 506 540 511 546 506 540 +# +name: VOL- +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 8434 4191 545 1559 545 1559 545 534 512 513 544 507 539 1564 540 538 519 1559 545 1558 546 1558 546 1558 546 1558 546 1558 546 533 513 511 546 506 540 19446 547 1557 547 1557 547 532 514 511 546 532 514 1562 593 459 546 1557 547 1557 547 1557 547 1557 547 1557 547 1557 547 531 515 510 547 505 541 19446 548 1556 548 1556 548 530 516 509 548 504 543 1561 543 535 512 1566 538 1565 539 1565 539 1565 539 1565 539 1565 539 540 517 509 537 514 543 19444 539 1565 539 1565 539 513 544 508 538 513 544 1559 545 534 512 1564 540 1564 540 1564 540 1564 540 1564 540 1564 540 539 518 507 539 513 544 19442 541 1563 541 1563 541 538 519 507 539 512 545 1558 546 506 540 1563 541 1563 541 1563 541 1563 541 1563 541 1562 542 537 520 505 541 511 546 19440 595 1509 543 1561 543 536 521 504 542 509 548 1555 538 540 517 1560 544 1560 544 1560 544 1560 544 1560 544 1560 544 534 512 513 544 508 538 19448 546 1559 545 1559 545 533 513 512 545 507 539 1563 541 538 519 1558 546 1558 546 1558 546 1557 547 1558 546 1558 546 533 513 512 545 506 540 19447 546 1557 547 1557 547 532 514 511 546 506 540 1562 542 537 520 1557 547 1557 547 1557 547 1557 547 1557 547 1557 547 505 542 510 547 505 541 19445 548 1556 548 1556 548 531 515 510 547 504 542 1561 543 536 521 1555 538 1566 538 1566 538 1566 538 1566 538 1565 539 514 543 509 537 514 543 +# +name: MUTE +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 8435 4189 547 1557 547 1557 547 505 541 510 547 505 541 1562 542 510 547 1557 547 505 541 510 547 1557 546 1557 547 1557 547 505 541 510 547 505 541 21550 547 1558 545 1558 546 506 540 511 546 506 540 1563 541 511 546 1558 545 506 540 511 546 1558 546 1558 546 1558 546 506 540 511 546 506 540 21551 546 1558 546 1558 546 506 540 512 545 506 540 1563 540 512 545 1558 546 506 540 512 545 1558 546 1558 546 1558 546 506 540 512 545 506 540 21551 546 1559 545 1559 545 507 539 512 545 507 539 1564 539 512 545 1559 545 507 539 512 545 1559 545 1559 545 1559 545 507 539 512 545 507 539 21552 545 1559 545 1559 545 507 539 513 544 507 539 1564 540 512 545 1559 545 507 539 512 545 1559 545 1559 545 1559 545 507 539 512 545 507 539 21552 545 1559 545 1559 545 507 539 513 544 507 539 1565 538 513 544 1559 545 507 539 513 544 1559 545 1559 544 1559 545 534 512 513 544 507 539 21553 544 1560 544 1560 544 534 512 513 544 508 538 1565 539 539 518 1560 544 534 512 513 544 1560 544 1560 544 1560 544 534 512 513 544 508 538 +# +name: POWER +type: parsed +protocol: NEC +address: 20 00 00 00 +command: 41 00 00 00 +# +name: VOL+ +type: parsed +protocol: NEC +address: 20 00 00 00 +command: 42 00 00 00 +# +name: VOL- +type: parsed +protocol: NEC +address: 20 00 00 00 +command: 43 00 00 00 +# +name: MUTE +type: parsed +protocol: NEC +address: 20 00 00 00 +command: 1B 00 00 00 +# +name: VOL+ +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 8498 4205 651 1471 576 530 550 1572 547 535 545 536 544 1578 541 540 550 1572 547 535 545 1576 543 539 541 1580 549 1572 547 534 546 1576 543 539 541 540 550 1571 548 533 547 1574 545 537 543 539 541 541 549 532 548 1574 545 536 544 1578 541 540 550 1571 548 1572 547 1574 545 1576 543 26533 8497 4203 653 1468 569 538 542 1579 550 531 549 533 547 1573 546 535 545 1576 543 538 542 1579 550 531 549 1571 548 1573 546 536 544 1576 543 539 541 540 550 1571 548 533 547 1574 545 536 544 538 542 540 550 530 550 1572 547 534 546 1575 544 537 543 1578 541 1579 550 1570 549 1572 547 26524 8496 4207 576 1570 549 533 547 1574 545 537 543 539 541 1580 549 532 548 1573 546 536 544 1577 542 539 551 1570 549 1572 547 534 546 1575 544 538 542 540 550 1571 548 534 546 1575 544 538 542 540 550 531 549 533 547 1575 544 537 543 1579 550 531 549 1571 548 1572 547 1574 545 1576 543 26529 8491 4211 573 1573 546 535 545 1576 543 539 551 530 550 1571 548 533 547 1574 545 536 544 1578 541 540 550 1570 549 1572 547 534 546 1575 544 538 542 539 541 1580 549 532 548 1572 547 535 545 537 543 539 541 540 550 1571 548 533 547 1574 545 537 543 1578 541 1579 550 1571 548 1574 545 26522 8498 4202 571 1574 545 537 543 1578 541 541 549 532 548 1573 546 534 546 1575 544 537 543 1577 542 540 550 1570 549 1571 548 533 547 1574 545 537 543 538 542 1579 550 531 549 1572 547 534 546 536 544 537 543 538 542 1579 550 531 549 1572 547 535 545 1575 544 1577 542 1579 550 1571 548 26522 8498 4203 570 1575 544 537 543 1578 541 541 549 532 548 1573 546 535 545 1575 544 538 542 1579 550 531 549 1571 548 1572 547 535 545 1575 544 538 542 539 541 1580 549 532 548 1572 547 534 546 536 544 537 543 539 541 1579 550 531 549 1571 548 533 547 1573 546 1574 545 1575 544 1577 542 +# +name: VOL- +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 8490 4211 573 1573 546 535 545 1576 543 539 541 540 550 1571 548 532 548 1573 546 535 545 1576 543 539 541 1579 550 1571 548 533 547 1574 545 536 544 1576 543 1578 541 540 550 1570 549 533 547 534 546 536 544 537 543 539 541 540 550 1570 549 532 548 1572 547 1573 546 1574 545 1576 543 26528 8492 4208 648 1475 572 534 546 1575 544 537 543 539 541 1580 549 532 548 1573 546 535 545 1576 543 538 542 1579 550 1571 548 533 547 1575 544 537 543 1577 542 1579 550 532 548 1573 546 535 545 537 543 539 541 541 549 532 548 533 547 1575 544 537 543 1578 541 1579 550 1571 548 1573 546 26523 8496 4203 622 1499 569 537 543 1578 541 541 549 532 548 1572 547 534 546 1574 545 537 543 1578 541 540 550 1570 549 1571 548 534 546 1575 544 538 542 1578 541 1580 549 532 548 1573 546 536 544 538 542 540 550 532 548 533 547 535 545 1576 543 539 541 1579 550 1571 548 1573 546 1574 545 26521 8498 4201 572 1573 546 536 544 1577 542 540 550 531 549 1571 548 533 547 1573 546 536 544 1576 543 539 541 1579 550 1570 549 532 548 1573 546 535 545 1576 543 1578 541 540 550 1571 548 533 547 535 545 537 543 538 542 540 550 531 549 1572 547 534 546 1575 544 1576 543 1577 542 1579 550 26522 8498 4203 570 1575 544 538 542 1579 550 532 548 533 547 1575 544 537 543 1578 541 540 550 1570 549 533 547 1573 546 1575 544 537 543 1578 541 540 550 1571 548 1573 546 536 544 1578 551 531 549 533 547 535 545 537 543 539 541 540 550 1571 548 533 547 1575 544 1576 543 1578 541 1580 549 26521 8498 4203 570 1576 543 538 542 1580 549 532 548 533 547 1574 545 536 544 1577 542 540 550 1570 549 533 547 1573 546 1575 544 538 542 1579 550 531 549 1571 548 1573 546 536 544 1576 543 539 551 531 549 532 548 534 546 536 544 538 542 1579 550 531 549 1572 547 1573 546 1574 545 1576 543 +# +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 8500 4203 653 1468 569 538 542 1579 550 532 548 534 546 1575 544 536 544 1578 541 540 550 1572 547 534 546 1575 544 1577 542 539 541 1580 550 532 548 534 546 535 545 1576 543 1577 542 1579 551 532 548 534 546 536 544 1577 542 1578 552 531 549 533 547 534 546 1574 545 1575 544 1577 542 26533 8492 4211 573 1573 546 535 545 1576 543 539 551 530 550 1571 548 533 547 1574 545 536 544 1577 542 540 550 1570 549 1572 547 534 546 1576 543 539 541 541 549 532 548 1573 546 1574 545 1576 543 539 551 531 549 533 547 1573 546 1576 543 539 541 541 549 532 548 1573 546 1574 545 1576 543 26532 8493 4209 575 1571 548 533 547 1575 544 537 543 539 541 1580 550 531 549 1572 547 534 546 1576 543 538 542 1579 551 1570 549 532 548 1574 545 537 543 538 542 540 550 1570 549 1572 547 1575 544 537 543 539 541 540 550 1571 548 1573 546 536 544 538 542 539 551 1570 549 1572 547 1574 545 26530 8496 4207 567 1579 551 531 549 1572 547 535 545 536 544 1576 543 538 542 1579 551 530 550 1571 548 534 546 1574 545 1576 543 538 542 1579 551 532 548 533 547 534 546 1576 543 1577 542 1579 551 532 548 534 546 535 545 1576 543 1578 541 540 550 532 548 533 547 1574 545 1575 544 1577 542 26531 8495 4210 574 1571 548 534 546 1575 544 538 542 539 551 1569 550 531 549 1572 547 535 545 1576 543 539 541 1579 550 1571 548 534 546 1575 544 538 542 540 550 531 549 1572 547 1549 570 1551 568 539 551 531 549 532 548 1573 546 1550 569 538 542 540 550 531 549 1571 548 1548 571 1550 569 +# +name: POWER +type: parsed +protocol: NECext +address: 00 EF 00 00 +command: 1C E3 00 00 +# +name: VOL+ +type: parsed +protocol: NECext +address: 00 EF 00 00 +command: 00 FF 00 00 +# +name: VOL- +type: parsed +protocol: NECext +address: 00 EF 00 00 +command: 04 FB 00 00 +# +name: POWER +type: parsed +protocol: NEC42 +address: 6E 00 00 00 +command: 00 00 00 00 +# +name: VOL+ +type: parsed +protocol: NEC42 +address: 6E 00 00 00 +command: 4D 00 00 00 +# +name: VOL- +type: parsed +protocol: NEC42 +address: 6E 00 00 00 +command: 4E 00 00 00 +# +name: POWER +type: parsed +protocol: NEC42 +address: 6E 00 00 00 +command: 0E 00 00 00 +# +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 8441 4184 542 1562 541 1562 542 511 546 506 540 511 546 1557 546 506 540 1563 541 1563 540 1563 541 512 545 507 539 512 545 507 539 512 545 507 539 22605 538 1565 539 1565 538 514 543 509 537 514 543 1560 543 509 548 1555 548 1556 548 1556 547 504 542 510 547 505 541 510 547 505 541 510 547 22597 546 1559 544 1559 545 507 539 513 544 507 539 1564 539 513 544 1559 544 1559 545 545 508 549 513 508 538 513 544 508 538 513 544 22601 542 1562 542 1561 543 510 547 505 541 510 547 1557 547 505 541 1562 542 1562 542 1562 542 510 547 505 541 510 547 505 541 511 546 505 541 22603 540 1564 539 1565 538 513 544 508 538 513 544 1560 544 508 538 1565 538 1565 538 1566 537 514 543 509 548 504 542 509 548 504 542 509 548 22597 546 1558 546 1558 546 506 540 512 545 507 539 1564 540 512 545 1559 545 1559 544 1559 544 507 539 513 544 508 538 513 544 508 538 513 544 22600 543 1561 542 1562 542 510 547 505 541 510 547 1557 547 505 541 1562 541 1563 540 1563 541 511 546 506 540 511 546 506 540 511 546 506 540 22604 539 1565 538 1566 537 514 543 509 548 504 542 1561 543 509 548 1556 548 1556 548 1556 547 504 542 510 547 505 541 510 547 505 541 510 547 22598 545 1559 544 1559 545 507 539 512 545 507 539 1564 540 512 545 1559 544 1559 545 1559 545 508 538 513 544 508 538 513 544 508 538 513 544 22601 542 1562 542 1562 542 511 546 505 541 511 546 1557 546 506 540 1563 541 1563 540 1563 541 511 546 506 540 511 546 506 540 512 545 506 540 22604 539 1565 538 1566 537 514 543 509 548 504 542 1561 543 509 548 1556 547 1556 547 1556 548 504 542 510 547 505 541 510 547 505 541 510 547 +# +name: POWER +type: parsed +protocol: SIRC +address: 10 00 00 00 +command: 60 00 00 00 +# +name: VOL- +type: parsed +protocol: NEC +address: 08 00 00 00 +command: 0E 00 00 00 +# +name: VOL+ +type: parsed +protocol: NEC +address: 08 00 00 00 +command: 1A 00 00 00 +# +name: VOL+ +type: parsed +protocol: NEC +address: 00 00 00 00 +command: 57 00 00 00 +# +name: VOL+ +type: parsed +protocol: NEC +address: 4D 00 00 00 +command: 04 00 00 00 +# +name: VOL- +type: parsed +protocol: NEC +address: 4D 00 00 00 +command: 05 00 00 00 +# +name: VOL+ +type: parsed +protocol: NEC +address: 4D 00 00 00 +command: 02 00 00 00 +# +name: VOL- +type: parsed +protocol: NEC +address: 4D 00 00 00 +command: 03 00 00 00 +# +name: POWER +type: parsed +protocol: NEC +address: 4D 00 00 00 +command: 00 00 00 00 +# +name: VOL+ +type: parsed +protocol: NEC +address: 00 00 00 00 +command: 19 00 00 00 +# +name: VOL- +type: parsed +protocol: NEC +address: 00 00 00 00 +command: 16 00 00 00 +# +name: MUTE +type: parsed +protocol: NEC +address: 00 00 00 00 +command: 44 00 00 00 +# +name: VOL+ +type: parsed +protocol: NECext +address: 12 36 00 00 +command: 0A F5 00 00 +# +name: VOL- +type: parsed +protocol: NECext +address: 12 36 00 00 +command: 0B F4 00 00 +# +name: MUTE +type: parsed +protocol: NECext +address: 12 36 00 00 +command: 09 F6 00 00 +# +name: POWER +type: parsed +protocol: NECext +address: 12 36 00 00 +command: 01 FE 00 00 +# +# OFF +name: POWER +type: parsed +protocol: RC5 +address: 10 00 00 00 +command: 0F 00 00 00 +# +name: POWER +type: parsed +protocol: NEC +address: 00 00 00 00 +command: 02 00 00 00 +# +name: VOL+ +type: parsed +protocol: NEC +address: 00 00 00 00 +command: 0A 00 00 00 +# +name: VOL- +type: parsed +protocol: NEC +address: 00 00 00 00 +command: 0E 00 00 00 +# name: POWER type: parsed protocol: SIRC address: 0F 00 00 00 command: 15 00 00 00 -# +# name: Power type: parsed protocol: Samsung32 @@ -1996,7 +1954,7 @@ type: parsed protocol: Kaseikyo address: 51 54 32 01 command: 05 00 00 00 -# +# name: MUTE type: parsed protocol: Kaseikyo @@ -2038,3 +1996,9 @@ type: parsed protocol: NECext address: 10 E7 00 00 command: 05 FA 00 00 +# +name: MUTE +type: parsed +protocol: NEC +address: 20 00 00 00 +command: 50 00 00 00 From 895dba06ba2d99d38eb8408917897a38696a251c Mon Sep 17 00:00:00 2001 From: amec0e <88857687+amec0e@users.noreply.github.com> Date: Fri, 13 Jan 2023 17:38:06 +0000 Subject: [PATCH 063/506] Updated fans.ir --- assets/resources/infrared/assets/fans.ir | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/resources/infrared/assets/fans.ir b/assets/resources/infrared/assets/fans.ir index c76fe1d45..b2c683cba 100644 --- a/assets/resources/infrared/assets/fans.ir +++ b/assets/resources/infrared/assets/fans.ir @@ -1,7 +1,7 @@ Filetype: IR library file Version: 1 -# Last Updated 7th Jan, 2023 -# Last Checked 7th Jan, 2023 +# Last Updated 13th Jan, 2023 +# Last Checked 13th Jan, 2023 # name: POWER type: raw From deaf80fddc32bf8b836e858e6c09a31cbcd722b3 Mon Sep 17 00:00:00 2001 From: amec0e <88857687+amec0e@users.noreply.github.com> Date: Fri, 13 Jan 2023 17:38:31 +0000 Subject: [PATCH 064/506] Updated projectors.ir --- .../resources/infrared/assets/projectors.ir | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/assets/resources/infrared/assets/projectors.ir b/assets/resources/infrared/assets/projectors.ir index 0702a987d..681c6429b 100644 --- a/assets/resources/infrared/assets/projectors.ir +++ b/assets/resources/infrared/assets/projectors.ir @@ -1,7 +1,7 @@ Filetype: IR library file Version: 1 -# Last Updated 5th Jan, 2023 -# Last Checked 7th Jan, 2023 +# Last Updated 13th Jan, 2023 +# Last Checked 13th Jan, 2023 # # ON name: POWER @@ -712,3 +712,27 @@ type: parsed protocol: NEC address: 00 00 00 00 command: 8C 00 00 00 +# +name: POWER +type: parsed +protocol: NECext +address: 87 45 00 00 +command: 17 E8 00 00 +# +name: VOL+ +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 9064 4354 666 1559 666 1562 662 1586 638 475 636 477 635 477 635 478 635 1590 635 1591 634 478 635 1591 634 478 634 478 635 478 634 1591 635 478 634 1591 634 478 635 478 634 478 635 1591 634 478 634 1591 635 478 634 478 634 1591 634 1591 635 1591 634 478 635 1591 634 478 634 1591 635 40957 9035 2144 634 95483 9047 2155 632 95484 9048 2153 633 +# +name: VOL- +type: parsed +protocol: NECext +address: 87 45 00 00 +command: 50 AF 00 00 +# +name: MUTE +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 9034 4385 638 1587 664 1562 663 1587 637 476 635 478 634 478 635 478 635 1591 634 1591 634 478 635 1591 635 478 634 478 635 478 635 1591 635 478 634 478 634 1591 634 478 635 479 634 1591 635 478 634 1591 635 478 634 1592 634 478 634 1591 635 1591 635 478 634 1592 634 478 634 1591 634 40958 9033 2144 635 From 682d2d9b6f5b3f9134596f0fda2fcab4a1d311d0 Mon Sep 17 00:00:00 2001 From: amec0e <88857687+amec0e@users.noreply.github.com> Date: Fri, 13 Jan 2023 17:38:53 +0000 Subject: [PATCH 065/506] Updated tv.ir --- assets/resources/infrared/assets/tv.ir | 40 ++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/assets/resources/infrared/assets/tv.ir b/assets/resources/infrared/assets/tv.ir index 8210dbf30..6126a6239 100755 --- a/assets/resources/infrared/assets/tv.ir +++ b/assets/resources/infrared/assets/tv.ir @@ -1,7 +1,7 @@ Filetype: IR library file Version: 1 -# Last Updated 7th Jan, 2023 -# Last Checked 7th Jan, 2023 +# Last Updated 13th Jan, 2023 +# Last Checked 13th Jan, 2023 # name: POWER type: parsed @@ -1785,3 +1785,39 @@ type: parsed protocol: NEC address: 00 00 00 00 command: 33 00 00 00 +# +name: POWER +type: parsed +protocol: NEC +address: 28 00 00 00 +command: 0B 00 00 00 +# +name: CH+ +type: parsed +protocol: NEC +address: 28 00 00 00 +command: 0C 00 00 00 +# +name: CH- +type: parsed +protocol: NEC +address: 28 00 00 00 +command: 0D 00 00 00 +# +name: VOL+ +type: parsed +protocol: NEC +address: 28 00 00 00 +command: 0E 00 00 00 +# +name: VOL- +type: parsed +protocol: NEC +address: 28 00 00 00 +command: 0F 00 00 00 +# +name: MUTE +type: parsed +protocol: NEC +address: 28 00 00 00 +command: 10 00 00 00 From d50418e83918178674b4f53a06467712a3b58f43 Mon Sep 17 00:00:00 2001 From: amec0e <88857687+amec0e@users.noreply.github.com> Date: Fri, 13 Jan 2023 18:17:47 +0000 Subject: [PATCH 066/506] Updated projectors.ir --- .../resources/infrared/assets/projectors.ir | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/assets/resources/infrared/assets/projectors.ir b/assets/resources/infrared/assets/projectors.ir index 681c6429b..db90997a7 100644 --- a/assets/resources/infrared/assets/projectors.ir +++ b/assets/resources/infrared/assets/projectors.ir @@ -736,3 +736,45 @@ type: raw frequency: 38000 duty_cycle: 0.330000 data: 9034 4385 638 1587 664 1562 663 1587 637 476 635 478 634 478 635 478 635 1591 634 1591 634 478 635 1591 635 478 634 478 635 478 635 1591 635 478 634 478 634 1591 634 478 635 479 634 1591 635 478 634 1591 635 478 634 1592 634 478 634 1591 635 1591 635 478 634 1592 634 478 634 1591 634 40958 9033 2144 635 +# +name: POWER +type: parsed +protocol: NECext +address: FF FF 00 00 +command: E8 17 00 00 +# +name: VOL+ +type: parsed +protocol: NECext +address: FF FF 00 00 +command: BD 42 00 00 +# +name: VOL- +type: parsed +protocol: NECext +address: FF FF 00 00 +command: F2 0D 00 00 +# +name: POWER +type: parsed +protocol: Kaseikyo +address: 41 54 32 00 +command: 05 00 00 00 +# +name: VOL+ +type: parsed +protocol: Kaseikyo +address: 41 54 32 00 +command: 70 01 00 00 +# +name: VOL- +type: parsed +protocol: Kaseikyo +address: 41 54 32 00 +command: 71 01 00 00 +# +name: POWER +type: parsed +protocol: NEC +address: 31 00 00 00 +command: 81 00 00 00 From 13acdf00da055906a0098edbe91bac9da1f06caf Mon Sep 17 00:00:00 2001 From: LTVA1 <87536432+LTVA1@users.noreply.github.com> Date: Mon, 16 Jan 2023 12:10:32 +0300 Subject: [PATCH 067/506] the MINE formatting --- .clang-format | 204 +++++--------------------------------------------- 1 file changed, 18 insertions(+), 186 deletions(-) diff --git a/.clang-format b/.clang-format index 4b76f7fa4..488e9a494 100644 --- a/.clang-format +++ b/.clang-format @@ -1,191 +1,23 @@ ---- -Language: Cpp +Standard: Cpp11 +BasedOnStyle: LLVM +IndentWidth: 4 +ColumnLimit: 0 AccessModifierOffset: -4 -AlignAfterOpenBracket: AlwaysBreak -AlignArrayOfStructures: None -AlignConsecutiveMacros: None -AlignConsecutiveAssignments: None -AlignConsecutiveBitFields: None -AlignConsecutiveDeclarations: None -AlignEscapedNewlines: Left -AlignOperands: Align -AlignTrailingComments: false -AllowAllArgumentsOnNextLine: true -AllowAllParametersOfDeclarationOnNextLine: false -AllowShortEnumsOnASingleLine: true -AllowShortBlocksOnASingleLine: Never -AllowShortCaseLabelsOnASingleLine: false -AllowShortFunctionsOnASingleLine: None -AllowShortLambdasOnASingleLine: All -AllowShortIfStatementsOnASingleLine: WithoutElse -AllowShortLoopsOnASingleLine: true -AlwaysBreakAfterDefinitionReturnType: None -AlwaysBreakAfterReturnType: None -AlwaysBreakBeforeMultilineStrings: false -AlwaysBreakTemplateDeclarations: Yes -AttributeMacros: - - __capability -BinPackArguments: false -BinPackParameters: false +NamespaceIndentation: All +BreakBeforeBraces: Custom BraceWrapping: - AfterCaseLabel: false - AfterClass: false - AfterControlStatement: Never - AfterEnum: false - AfterFunction: false - AfterNamespace: false - AfterObjCDeclaration: false - AfterStruct: false - AfterUnion: false - AfterExternBlock: false - BeforeCatch: false - BeforeElse: false - BeforeLambdaBody: false - BeforeWhile: false - IndentBraces: false + AfterEnum: true + AfterStruct: true + AfterCaseLabel: true + AfterClass: true SplitEmptyFunction: true + AfterControlStatement: true + AfterNamespace: true + AfterFunction: true + AfterUnion: true + AfterExternBlock: true + BeforeCatch: true + BeforeElse: true SplitEmptyRecord: true SplitEmptyNamespace: true -BreakBeforeBinaryOperators: None -BreakBeforeConceptDeclarations: true -BreakBeforeBraces: Attach -BreakBeforeInheritanceComma: false -BreakInheritanceList: BeforeColon -BreakBeforeTernaryOperators: false -BreakConstructorInitializersBeforeComma: false -BreakConstructorInitializers: BeforeComma -BreakAfterJavaFieldAnnotations: false -BreakStringLiterals: false -ColumnLimit: 99 -CommentPragmas: '^ IWYU pragma:' -QualifierAlignment: Leave -CompactNamespaces: false -ConstructorInitializerIndentWidth: 4 -ContinuationIndentWidth: 4 -Cpp11BracedListStyle: true -DeriveLineEnding: true -DerivePointerAlignment: false -DisableFormat: false -EmptyLineAfterAccessModifier: Never -EmptyLineBeforeAccessModifier: LogicalBlock -ExperimentalAutoDetectBinPacking: false -PackConstructorInitializers: BinPack -BasedOnStyle: '' -ConstructorInitializerAllOnOneLineOrOnePerLine: false -AllowAllConstructorInitializersOnNextLine: true -FixNamespaceComments: false -ForEachMacros: - - foreach - - Q_FOREACH - - BOOST_FOREACH -IfMacros: - - KJ_IF_MAYBE -IncludeBlocks: Preserve -IncludeCategories: - - Regex: '.*' - Priority: 1 - SortPriority: 0 - CaseSensitive: false - - Regex: '^(<|"(gtest|gmock|isl|json)/)' - Priority: 3 - SortPriority: 0 - CaseSensitive: false - - Regex: '.*' - Priority: 1 - SortPriority: 0 - CaseSensitive: false -IncludeIsMainRegex: '(Test)?$' -IncludeIsMainSourceRegex: '' -IndentAccessModifiers: false -IndentCaseLabels: false -IndentCaseBlocks: false -IndentGotoLabels: true -IndentPPDirectives: None -IndentExternBlock: AfterExternBlock -IndentRequires: false -IndentWidth: 4 -IndentWrappedFunctionNames: true -InsertTrailingCommas: None -JavaScriptQuotes: Leave -JavaScriptWrapImports: true -KeepEmptyLinesAtTheStartOfBlocks: false -LambdaBodyIndentation: Signature -MacroBlockBegin: '' -MacroBlockEnd: '' -MaxEmptyLinesToKeep: 1 -NamespaceIndentation: None -ObjCBinPackProtocolList: Auto -ObjCBlockIndentWidth: 4 -ObjCBreakBeforeNestedBlockParam: true -ObjCSpaceAfterProperty: true -ObjCSpaceBeforeProtocolList: true -PenaltyBreakAssignment: 10 -PenaltyBreakBeforeFirstCallParameter: 30 -PenaltyBreakComment: 10 -PenaltyBreakFirstLessLess: 0 -PenaltyBreakOpenParenthesis: 0 -PenaltyBreakString: 10 -PenaltyBreakTemplateDeclaration: 10 -PenaltyExcessCharacter: 100 -PenaltyReturnTypeOnItsOwnLine: 60 -PenaltyIndentedWhitespace: 0 -PointerAlignment: Left -PPIndentWidth: -1 -ReferenceAlignment: Pointer -ReflowComments: false -RemoveBracesLLVM: false -SeparateDefinitionBlocks: Leave -ShortNamespaceLines: 1 -SortIncludes: Never -SortJavaStaticImport: Before -SortUsingDeclarations: false -SpaceAfterCStyleCast: false -SpaceAfterLogicalNot: false -SpaceAfterTemplateKeyword: true -SpaceBeforeAssignmentOperators: true -SpaceBeforeCaseColon: false -SpaceBeforeCpp11BracedList: false -SpaceBeforeCtorInitializerColon: true -SpaceBeforeInheritanceColon: true -SpaceBeforeParens: Never -SpaceBeforeParensOptions: - AfterControlStatements: false - AfterForeachMacros: false - AfterFunctionDefinitionName: false - AfterFunctionDeclarationName: false - AfterIfMacros: false - AfterOverloadedOperator: false - BeforeNonEmptyParentheses: false -SpaceAroundPointerQualifiers: Default -SpaceBeforeRangeBasedForLoopColon: true -SpaceInEmptyBlock: false -SpaceInEmptyParentheses: false -SpacesBeforeTrailingComments: 1 -SpacesInAngles: Never -SpacesInConditionalStatement: false -SpacesInContainerLiterals: false -SpacesInCStyleCastParentheses: false -SpacesInLineCommentPrefix: - Minimum: 1 - Maximum: -1 -SpacesInParentheses: false -SpacesInSquareBrackets: false -SpaceBeforeSquareBrackets: false -BitFieldColonSpacing: Both -Standard: c++03 -StatementAttributeLikeMacros: - - Q_EMIT -StatementMacros: - - Q_UNUSED - - QT_REQUIRE_VERSION -TabWidth: 4 -UseCRLF: false -UseTab: Never -WhitespaceSensitiveMacros: - - STRINGIZE - - PP_STRINGIZE - - BOOST_PP_STRINGIZE - - NS_SWIFT_NAME - - CF_SWIFT_NAME -... - +IndentCaseLabels: true \ No newline at end of file From 729a1b5788796318a71365179a449dec36cf1f2e Mon Sep 17 00:00:00 2001 From: TQMatvey Date: Mon, 16 Jan 2023 19:41:16 +0700 Subject: [PATCH 068/506] somfy_telis: encoder is almost done Co-authored-by: assasinfil --- applications/plugins/flipper-flashlight | 1 + firmware/targets/f7/api_symbols.csv | 3 +- lib/subghz/protocols/somfy_telis.c | 129 ++++++++++++++++++++++-- lib/subghz/protocols/somfy_telis.h | 7 ++ 4 files changed, 129 insertions(+), 11 deletions(-) create mode 160000 applications/plugins/flipper-flashlight diff --git a/applications/plugins/flipper-flashlight b/applications/plugins/flipper-flashlight new file mode 160000 index 000000000..d21e87230 --- /dev/null +++ b/applications/plugins/flipper-flashlight @@ -0,0 +1 @@ +Subproject commit d21e872302dc55d68398cf661854b8df453e248b diff --git a/firmware/targets/f7/api_symbols.csv b/firmware/targets/f7/api_symbols.csv index b16b06685..cb7ff49d1 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,+,11.7,, +Version,+,11.8,, Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/cli/cli.h,, Header,+,applications/services/cli/cli_vcp.h,, @@ -3087,6 +3087,7 @@ Function,+,subghz_protocol_registry_get_by_index,const SubGhzProtocol*,"const Su Function,+,subghz_protocol_registry_get_by_name,const SubGhzProtocol*,"const SubGhzProtocolRegistry*, const char*" Function,-,subghz_protocol_secplus_v1_check_fixed,_Bool,uint32_t Function,-,subghz_protocol_secplus_v2_create_data,_Bool,"void*, FlipperFormat*, uint32_t, uint8_t, uint32_t, SubGhzRadioPreset*" +Function,-,subghz_protocol_somfy_telis_create_data,_Bool,"void*, FlipperFormat*, uint32_t, uint8_t, uint16_t, SubGhzRadioPreset*" Function,-,subghz_protocol_star_line_create_data,_Bool,"void*, FlipperFormat*, uint32_t, uint8_t, uint16_t, const char*, SubGhzRadioPreset*" Function,+,subghz_receiver_alloc_init,SubGhzReceiver*,SubGhzEnvironment* Function,+,subghz_receiver_decode,void,"SubGhzReceiver*, _Bool, uint32_t" diff --git a/lib/subghz/protocols/somfy_telis.c b/lib/subghz/protocols/somfy_telis.c index c70305256..e14978d37 100644 --- a/lib/subghz/protocols/somfy_telis.c +++ b/lib/subghz/protocols/somfy_telis.c @@ -97,6 +97,116 @@ void subghz_protocol_encoder_somfy_telis_free(void* context) { free(instance); } +static bool + subghz_protocol_somfy_telis_gen_data(SubGhzProtocolEncoderSomfyTelis* instance, uint8_t btn) { + // if(instance->generic.cnt < 0xFFFF) { + // instance->generic.cnt++; + // } else if(instance->generic.cnt >= 0xFFFF) { + // instance->generic.cnt = 0; + // } + uint8_t frame[7]; + frame[0] = 0xA7; + frame[1] = btn << 4; + frame[2] = instance->generic.cnt >> 8; + frame[3] = instance->generic.cnt; + frame[4] = instance->generic.serial >> 16; + frame[5] = instance->generic.serial >> 8; + frame[6] = instance->generic.serial; + + uint8_t checksum = 0; + for(uint8_t i = 0; i < 7; i++) { + checksum = checksum ^ frame[i] ^ (frame[i] >> 4); + } + checksum &= 0xF; + + frame[1] |= checksum; + + for(uint8_t i = 1; i < 7; i++) { + frame[i] ^= frame[i - 1]; + } + uint64_t data = 0; + for(uint8_t i = 0; i < 7; ++i) { + data <<= 8; + data |= frame[i]; + } + instance->generic.data = data; + FURI_LOG_D(TAG, "New data: %llx", instance->generic.data); + return true; +} + +bool subghz_protocol_somfy_telis_create_data( + void* context, + FlipperFormat* flipper_format, + uint32_t serial, + uint8_t btn, + uint16_t cnt, + SubGhzRadioPreset* preset) { + furi_assert(context); + SubGhzProtocolEncoderSomfyTelis* instance = context; + instance->generic.serial = serial; + instance->generic.cnt = cnt; + instance->generic.data_count_bit = 56; + bool res = subghz_protocol_somfy_telis_gen_data(instance, btn); + if(res) { + res = subghz_block_generic_serialize(&instance->generic, flipper_format, preset); + } + return res; +} + +/** + * Generating an upload from data. + * @param instance Pointer to a SubGhzProtocolEncoderKeeloq instance + * @return true On success + */ +static bool subghz_protocol_encoder_somfy_telis_get_upload( + SubGhzProtocolEncoderSomfyTelis* instance, + uint8_t btn) { + furi_assert(instance); + + //gen new key + if(subghz_protocol_somfy_telis_gen_data(instance, btn)) { + //ToDo if you need to add a callback to automatically update the data on the display + } else { + return false; + } + + size_t index = 0; + size_t size_upload = 6 * 2 + (instance->generic.data_count_bit * 2); + if(size_upload > instance->encoder.size_upload) { + FURI_LOG_E(TAG, "Size upload exceeds allocated encoder buffer."); + return false; + } else { + instance->encoder.size_upload = size_upload; + } + + //Send header + for(uint8_t i = 6; i > 0; i--) { + instance->encoder.upload[index++] = + level_duration_make(true, (uint32_t)subghz_protocol_somfy_telis_const.te_long * 2); + instance->encoder.upload[index++] = + level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_long * 2); + } + + //Send key data + for(uint8_t i = instance->generic.data_count_bit; i > 0; i--) { + if(bit_read(instance->generic.data, i - 1)) { + //send bit 1 + instance->encoder.upload[index++] = + level_duration_make(true, (uint32_t)subghz_protocol_somfy_telis_const.te_long); + instance->encoder.upload[index++] = + level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_long); + } else { + //send bit 0 + instance->encoder.upload[index++] = + level_duration_make(true, (uint32_t)subghz_protocol_somfy_telis_const.te_short); + instance->encoder.upload[index++] = + level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_short); + } + } + + return true; +} + bool subghz_protocol_encoder_somfy_telis_deserialize(void* context, FlipperFormat* flipper_format) { furi_assert(context); SubGhzProtocolEncoderSomfyTelis* instance = context; @@ -111,7 +221,7 @@ bool subghz_protocol_encoder_somfy_telis_deserialize(void* context, FlipperForma flipper_format_read_uint32( flipper_format, "Repeat", (uint32_t*)&instance->encoder.repeat, 1); - //TODO: subghz_protocol_encoder_star_line_get_upload(instance, instance->generic.btn); + subghz_protocol_encoder_somfy_telis_get_upload(instance, instance->generic.btn); if(!flipper_format_rewind(flipper_format)) { FURI_LOG_E(TAG, "Rewind error"); @@ -383,9 +493,9 @@ static void subghz_protocol_somfy_telis_check_remote_controller(SubGhzBlockGener */ uint64_t data = instance->data ^ (instance->data >> 8); - instance->btn = (data >> 44) & 0xF; - instance->cnt = (data >> 24) & 0xFFFF; - instance->serial = data & 0xFFFFFF; + instance->btn = (data >> 44) & 0xF; // ctrl + instance->cnt = (data >> 24) & 0xFFFF; // rolling code + instance->serial = data & 0xFFFFFF; // address } /** @@ -393,7 +503,7 @@ static void subghz_protocol_somfy_telis_check_remote_controller(SubGhzBlockGener * @param btn Button number, 4 bit */ static const char* subghz_protocol_somfy_telis_get_name_button(uint8_t btn) { - const char* name_btn[0x10] = { + const char* name_btn[16] = { "Unknown", "My", "Up", @@ -452,19 +562,18 @@ void subghz_protocol_decoder_somfy_telis_get_string(void* context, FuriString* o SubGhzProtocolDecoderSomfyTelis* instance = context; subghz_protocol_somfy_telis_check_remote_controller(&instance->generic); - + FURI_LOG_D(TAG, "Data: %llx", instance->generic.data); furi_string_cat_printf( output, "%s %db\r\n" - "Key:0x%lX%08lX\r\n" - "Sn:0x%06lX \r\n" + "Key:0x%lX\r\n" + "Address:0x%03lX \r\n" "Cnt:0x%04lX\r\n" "Btn:%s\r\n", instance->generic.protocol_name, instance->generic.data_count_bit, - (uint32_t)(instance->generic.data >> 32), - (uint32_t)instance->generic.data, + (uint32_t)(instance->generic.data >> 52), instance->generic.serial, instance->generic.cnt, subghz_protocol_somfy_telis_get_name_button(instance->generic.btn)); diff --git a/lib/subghz/protocols/somfy_telis.h b/lib/subghz/protocols/somfy_telis.h index 416ae32e2..3d5cd22f1 100644 --- a/lib/subghz/protocols/somfy_telis.h +++ b/lib/subghz/protocols/somfy_telis.h @@ -35,6 +35,13 @@ void subghz_protocol_encoder_somfy_telis_free(void* context); * @param preset Modulation, SubGhzRadioPreset * @return true On success */ +bool subghz_protocol_somfy_telis_create_data( + void* context, + FlipperFormat* flipper_format, + uint32_t serial, + uint8_t btn, + uint16_t cnt, + SubGhzRadioPreset* preset); /** * Deserialize and generating an upload to send. From ddc5540eebf89f68f1759cf4eb0ad28a4412fae8 Mon Sep 17 00:00:00 2001 From: assasinfil Date: Mon, 16 Jan 2023 15:50:45 +0300 Subject: [PATCH 069/506] Clean --- applications/plugins/flipper-flashlight | 1 - 1 file changed, 1 deletion(-) delete mode 160000 applications/plugins/flipper-flashlight diff --git a/applications/plugins/flipper-flashlight b/applications/plugins/flipper-flashlight deleted file mode 160000 index d21e87230..000000000 --- a/applications/plugins/flipper-flashlight +++ /dev/null @@ -1 +0,0 @@ -Subproject commit d21e872302dc55d68398cf661854b8df453e248b From 5f82732b4f6de8f46b2e9e674f37914d26306fe3 Mon Sep 17 00:00:00 2001 From: assasinfil Date: Mon, 16 Jan 2023 16:40:12 +0300 Subject: [PATCH 070/506] Completed encoder --- lib/subghz/protocols/somfy_telis.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/lib/subghz/protocols/somfy_telis.c b/lib/subghz/protocols/somfy_telis.c index e14978d37..45baa4e46 100644 --- a/lib/subghz/protocols/somfy_telis.c +++ b/lib/subghz/protocols/somfy_telis.c @@ -99,14 +99,20 @@ void subghz_protocol_encoder_somfy_telis_free(void* context) { static bool subghz_protocol_somfy_telis_gen_data(SubGhzProtocolEncoderSomfyTelis* instance, uint8_t btn) { - // if(instance->generic.cnt < 0xFFFF) { - // instance->generic.cnt++; - // } else if(instance->generic.cnt >= 0xFFFF) { - // instance->generic.cnt = 0; - // } + UNUSED(btn); + uint64_t data = instance->generic.data ^ (instance->generic.data >> 8); + instance->generic.btn = (data >> 44) & 0xF; // ctrl + instance->generic.cnt = (data >> 24) & 0xFFFF; // rolling code + instance->generic.serial = data & 0xFFFFFF; // address + + if(instance->generic.cnt < 0xFFFF) { + instance->generic.cnt++; + } else if(instance->generic.cnt >= 0xFFFF) { + instance->generic.cnt = 0; + } uint8_t frame[7]; - frame[0] = 0xA7; - frame[1] = btn << 4; + frame[0] = data >> 48; + frame[1] = instance->generic.btn << 4; frame[2] = instance->generic.cnt >> 8; frame[3] = instance->generic.cnt; frame[4] = instance->generic.serial >> 16; @@ -124,7 +130,7 @@ static bool for(uint8_t i = 1; i < 7; i++) { frame[i] ^= frame[i - 1]; } - uint64_t data = 0; + data = 0; for(uint8_t i = 0; i < 7; ++i) { data <<= 8; data |= frame[i]; @@ -566,14 +572,14 @@ void subghz_protocol_decoder_somfy_telis_get_string(void* context, FuriString* o furi_string_cat_printf( output, "%s %db\r\n" - "Key:0x%lX\r\n" + "Key:0x%X\r\n" "Address:0x%03lX \r\n" "Cnt:0x%04lX\r\n" "Btn:%s\r\n", instance->generic.protocol_name, instance->generic.data_count_bit, - (uint32_t)(instance->generic.data >> 52), + (uint16_t)(instance->generic.data >> 48), instance->generic.serial, instance->generic.cnt, subghz_protocol_somfy_telis_get_name_button(instance->generic.btn)); From f41c06ab74710009842e3e653de34034f10ceef0 Mon Sep 17 00:00:00 2001 From: TQMatvey Date: Mon, 16 Jan 2023 22:10:16 +0700 Subject: [PATCH 071/506] somfy telis: not done yet Co-authored-by: assasinfil --- applications/plugins/flipper-flashlight | 1 + lib/subghz/protocols/somfy_telis.c | 38 +++++++++++++++++-------- 2 files changed, 27 insertions(+), 12 deletions(-) create mode 160000 applications/plugins/flipper-flashlight diff --git a/applications/plugins/flipper-flashlight b/applications/plugins/flipper-flashlight new file mode 160000 index 000000000..d21e87230 --- /dev/null +++ b/applications/plugins/flipper-flashlight @@ -0,0 +1 @@ +Subproject commit d21e872302dc55d68398cf661854b8df453e248b diff --git a/lib/subghz/protocols/somfy_telis.c b/lib/subghz/protocols/somfy_telis.c index 45baa4e46..0761f55a0 100644 --- a/lib/subghz/protocols/somfy_telis.c +++ b/lib/subghz/protocols/somfy_telis.c @@ -11,7 +11,7 @@ static const SubGhzBlockConst subghz_protocol_somfy_telis_const = { .te_short = 640, - .te_long = 1280, + .te_long = 1208, .te_delta = 250, .min_count_bit_for_found = 56, }; @@ -83,7 +83,7 @@ void* subghz_protocol_encoder_somfy_telis_alloc(SubGhzEnvironment* environment) instance->keystore = subghz_environment_get_keystore(environment); instance->encoder.repeat = 10; - instance->encoder.size_upload = 256; + instance->encoder.size_upload = 128; instance->encoder.upload = malloc(instance->encoder.size_upload * sizeof(LevelDuration)); instance->encoder.is_running = false; @@ -177,21 +177,25 @@ static bool subghz_protocol_encoder_somfy_telis_get_upload( } size_t index = 0; - size_t size_upload = 6 * 2 + (instance->generic.data_count_bit * 2); - if(size_upload > instance->encoder.size_upload) { - FURI_LOG_E(TAG, "Size upload exceeds allocated encoder buffer."); - return false; - } else { - instance->encoder.size_upload = size_upload; - } //Send header - for(uint8_t i = 6; i > 0; i--) { + //Wake-up + // instance->encoder.upload[index++] = + // level_duration_make(true, (uint32_t)subghz_protocol_somfy_telis_const.te_short * 15); + // instance->encoder.upload[index++] = + // level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_short * 148); + //Hardware sync + for(uint8_t i = 7; i > 0; i--) { instance->encoder.upload[index++] = - level_duration_make(true, (uint32_t)subghz_protocol_somfy_telis_const.te_long * 2); + level_duration_make(true, (uint32_t)subghz_protocol_somfy_telis_const.te_short * 4); instance->encoder.upload[index++] = - level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_long * 2); + level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_short * 4); } + //Software sync + instance->encoder.upload[index++] = + level_duration_make(true, (uint32_t)subghz_protocol_somfy_telis_const.te_short * 7); + instance->encoder.upload[index++] = + level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_short * 1); //Send key data for(uint8_t i = instance->generic.data_count_bit; i > 0; i--) { @@ -210,6 +214,16 @@ static bool subghz_protocol_encoder_somfy_telis_get_upload( } } + //Inter-frame silence + level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_short * 50); + + size_t size_upload = index; + if(size_upload > instance->encoder.size_upload) { + FURI_LOG_E(TAG, "Size upload exceeds allocated encoder buffer."); + return false; + } else { + instance->encoder.size_upload = size_upload; + } return true; } From 6aeb9478aa41dd0660bbaa2d781c955c9a0b2b0d Mon Sep 17 00:00:00 2001 From: LTVA1 <87536432+LTVA1@users.noreply.github.com> Date: Mon, 16 Jan 2023 20:19:00 +0300 Subject: [PATCH 072/506] Revert "the MINE formatting" This reverts commit 13acdf00da055906a0098edbe91bac9da1f06caf. --- .clang-format | 204 +++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 186 insertions(+), 18 deletions(-) diff --git a/.clang-format b/.clang-format index 488e9a494..4b76f7fa4 100644 --- a/.clang-format +++ b/.clang-format @@ -1,23 +1,191 @@ -Standard: Cpp11 -BasedOnStyle: LLVM -IndentWidth: 4 -ColumnLimit: 0 +--- +Language: Cpp AccessModifierOffset: -4 -NamespaceIndentation: All -BreakBeforeBraces: Custom +AlignAfterOpenBracket: AlwaysBreak +AlignArrayOfStructures: None +AlignConsecutiveMacros: None +AlignConsecutiveAssignments: None +AlignConsecutiveBitFields: None +AlignConsecutiveDeclarations: None +AlignEscapedNewlines: Left +AlignOperands: Align +AlignTrailingComments: false +AllowAllArgumentsOnNextLine: true +AllowAllParametersOfDeclarationOnNextLine: false +AllowShortEnumsOnASingleLine: true +AllowShortBlocksOnASingleLine: Never +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: None +AllowShortLambdasOnASingleLine: All +AllowShortIfStatementsOnASingleLine: WithoutElse +AllowShortLoopsOnASingleLine: true +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: Yes +AttributeMacros: + - __capability +BinPackArguments: false +BinPackParameters: false BraceWrapping: - AfterEnum: true - AfterStruct: true - AfterCaseLabel: true - AfterClass: true + AfterCaseLabel: false + AfterClass: false + AfterControlStatement: Never + AfterEnum: false + AfterFunction: false + AfterNamespace: false + AfterObjCDeclaration: false + AfterStruct: false + AfterUnion: false + AfterExternBlock: false + BeforeCatch: false + BeforeElse: false + BeforeLambdaBody: false + BeforeWhile: false + IndentBraces: false SplitEmptyFunction: true - AfterControlStatement: true - AfterNamespace: true - AfterFunction: true - AfterUnion: true - AfterExternBlock: true - BeforeCatch: true - BeforeElse: true SplitEmptyRecord: true SplitEmptyNamespace: true -IndentCaseLabels: true \ No newline at end of file +BreakBeforeBinaryOperators: None +BreakBeforeConceptDeclarations: true +BreakBeforeBraces: Attach +BreakBeforeInheritanceComma: false +BreakInheritanceList: BeforeColon +BreakBeforeTernaryOperators: false +BreakConstructorInitializersBeforeComma: false +BreakConstructorInitializers: BeforeComma +BreakAfterJavaFieldAnnotations: false +BreakStringLiterals: false +ColumnLimit: 99 +CommentPragmas: '^ IWYU pragma:' +QualifierAlignment: Leave +CompactNamespaces: false +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: true +DeriveLineEnding: true +DerivePointerAlignment: false +DisableFormat: false +EmptyLineAfterAccessModifier: Never +EmptyLineBeforeAccessModifier: LogicalBlock +ExperimentalAutoDetectBinPacking: false +PackConstructorInitializers: BinPack +BasedOnStyle: '' +ConstructorInitializerAllOnOneLineOrOnePerLine: false +AllowAllConstructorInitializersOnNextLine: true +FixNamespaceComments: false +ForEachMacros: + - foreach + - Q_FOREACH + - BOOST_FOREACH +IfMacros: + - KJ_IF_MAYBE +IncludeBlocks: Preserve +IncludeCategories: + - Regex: '.*' + Priority: 1 + SortPriority: 0 + CaseSensitive: false + - Regex: '^(<|"(gtest|gmock|isl|json)/)' + Priority: 3 + SortPriority: 0 + CaseSensitive: false + - Regex: '.*' + Priority: 1 + SortPriority: 0 + CaseSensitive: false +IncludeIsMainRegex: '(Test)?$' +IncludeIsMainSourceRegex: '' +IndentAccessModifiers: false +IndentCaseLabels: false +IndentCaseBlocks: false +IndentGotoLabels: true +IndentPPDirectives: None +IndentExternBlock: AfterExternBlock +IndentRequires: false +IndentWidth: 4 +IndentWrappedFunctionNames: true +InsertTrailingCommas: None +JavaScriptQuotes: Leave +JavaScriptWrapImports: true +KeepEmptyLinesAtTheStartOfBlocks: false +LambdaBodyIndentation: Signature +MacroBlockBegin: '' +MacroBlockEnd: '' +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +ObjCBinPackProtocolList: Auto +ObjCBlockIndentWidth: 4 +ObjCBreakBeforeNestedBlockParam: true +ObjCSpaceAfterProperty: true +ObjCSpaceBeforeProtocolList: true +PenaltyBreakAssignment: 10 +PenaltyBreakBeforeFirstCallParameter: 30 +PenaltyBreakComment: 10 +PenaltyBreakFirstLessLess: 0 +PenaltyBreakOpenParenthesis: 0 +PenaltyBreakString: 10 +PenaltyBreakTemplateDeclaration: 10 +PenaltyExcessCharacter: 100 +PenaltyReturnTypeOnItsOwnLine: 60 +PenaltyIndentedWhitespace: 0 +PointerAlignment: Left +PPIndentWidth: -1 +ReferenceAlignment: Pointer +ReflowComments: false +RemoveBracesLLVM: false +SeparateDefinitionBlocks: Leave +ShortNamespaceLines: 1 +SortIncludes: Never +SortJavaStaticImport: Before +SortUsingDeclarations: false +SpaceAfterCStyleCast: false +SpaceAfterLogicalNot: false +SpaceAfterTemplateKeyword: true +SpaceBeforeAssignmentOperators: true +SpaceBeforeCaseColon: false +SpaceBeforeCpp11BracedList: false +SpaceBeforeCtorInitializerColon: true +SpaceBeforeInheritanceColon: true +SpaceBeforeParens: Never +SpaceBeforeParensOptions: + AfterControlStatements: false + AfterForeachMacros: false + AfterFunctionDefinitionName: false + AfterFunctionDeclarationName: false + AfterIfMacros: false + AfterOverloadedOperator: false + BeforeNonEmptyParentheses: false +SpaceAroundPointerQualifiers: Default +SpaceBeforeRangeBasedForLoopColon: true +SpaceInEmptyBlock: false +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: Never +SpacesInConditionalStatement: false +SpacesInContainerLiterals: false +SpacesInCStyleCastParentheses: false +SpacesInLineCommentPrefix: + Minimum: 1 + Maximum: -1 +SpacesInParentheses: false +SpacesInSquareBrackets: false +SpaceBeforeSquareBrackets: false +BitFieldColonSpacing: Both +Standard: c++03 +StatementAttributeLikeMacros: + - Q_EMIT +StatementMacros: + - Q_UNUSED + - QT_REQUIRE_VERSION +TabWidth: 4 +UseCRLF: false +UseTab: Never +WhitespaceSensitiveMacros: + - STRINGIZE + - PP_STRINGIZE + - BOOST_PP_STRINGIZE + - NS_SWIFT_NAME + - CF_SWIFT_NAME +... + From 75c47a8d6461b7a2bb44219e5f0b0dccfb1e1e1e Mon Sep 17 00:00:00 2001 From: assasinfil Date: Tue, 17 Jan 2023 00:06:00 +0300 Subject: [PATCH 073/506] Full package data --- lib/subghz/protocols/somfy_telis.c | 63 ++++++++++++++++++++++++------ 1 file changed, 51 insertions(+), 12 deletions(-) diff --git a/lib/subghz/protocols/somfy_telis.c b/lib/subghz/protocols/somfy_telis.c index 0761f55a0..91cc9b74f 100644 --- a/lib/subghz/protocols/somfy_telis.c +++ b/lib/subghz/protocols/somfy_telis.c @@ -10,7 +10,7 @@ #define TAG "SubGhzProtocolSomfyTelis" static const SubGhzBlockConst subghz_protocol_somfy_telis_const = { - .te_short = 640, + .te_short = 604, .te_long = 1208, .te_delta = 250, .min_count_bit_for_found = 56, @@ -83,7 +83,7 @@ void* subghz_protocol_encoder_somfy_telis_alloc(SubGhzEnvironment* environment) instance->keystore = subghz_environment_get_keystore(environment); instance->encoder.repeat = 10; - instance->encoder.size_upload = 128; + instance->encoder.size_upload = 255; instance->encoder.upload = malloc(instance->encoder.size_upload * sizeof(LevelDuration)); instance->encoder.is_running = false; @@ -179,13 +179,13 @@ static bool subghz_protocol_encoder_somfy_telis_get_upload( size_t index = 0; //Send header - //Wake-up - // instance->encoder.upload[index++] = - // level_duration_make(true, (uint32_t)subghz_protocol_somfy_telis_const.te_short * 15); - // instance->encoder.upload[index++] = - // level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_short * 148); + // Wake-up + instance->encoder.upload[index++] = + level_duration_make(true, (uint32_t)subghz_protocol_somfy_telis_const.te_short * 15); + instance->encoder.upload[index++] = + level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_short * 148); //Hardware sync - for(uint8_t i = 7; i > 0; i--) { + for(uint8_t i = 2; i > 0; i--) { instance->encoder.upload[index++] = level_duration_make(true, (uint32_t)subghz_protocol_somfy_telis_const.te_short * 4); instance->encoder.upload[index++] = @@ -197,14 +197,14 @@ static bool subghz_protocol_encoder_somfy_telis_get_upload( instance->encoder.upload[index++] = level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_short * 1); - //Send key data + //Send key data MSB manchester for(uint8_t i = instance->generic.data_count_bit; i > 0; i--) { if(bit_read(instance->generic.data, i - 1)) { //send bit 1 instance->encoder.upload[index++] = - level_duration_make(true, (uint32_t)subghz_protocol_somfy_telis_const.te_long); + level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_short); instance->encoder.upload[index++] = - level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_long); + level_duration_make(true, (uint32_t)subghz_protocol_somfy_telis_const.te_short); } else { //send bit 0 instance->encoder.upload[index++] = @@ -215,7 +215,46 @@ static bool subghz_protocol_encoder_somfy_telis_get_upload( } //Inter-frame silence - level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_short * 50); + instance->encoder.upload[index++] = + bit_read(instance->generic.data, 55) ? + level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_short * 50) : + level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_short * 51); + + //Hardware sync + for(uint8_t i = 7; i > 0; i--) { + instance->encoder.upload[index++] = + level_duration_make(true, (uint32_t)subghz_protocol_somfy_telis_const.te_short * 4); + instance->encoder.upload[index++] = + level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_short * 4); + } + //Software sync + instance->encoder.upload[index++] = + level_duration_make(true, (uint32_t)subghz_protocol_somfy_telis_const.te_short * 7); + instance->encoder.upload[index++] = + level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_short); + + //Send key data MSB manchester + for(uint8_t i = instance->generic.data_count_bit; i > 0; i--) { + if(bit_read(instance->generic.data, i - 1)) { + //send bit 1 + instance->encoder.upload[index++] = + level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_short); + instance->encoder.upload[index++] = + level_duration_make(true, (uint32_t)subghz_protocol_somfy_telis_const.te_short); + } else { + //send bit 0 + instance->encoder.upload[index++] = + level_duration_make(true, (uint32_t)subghz_protocol_somfy_telis_const.te_short); + instance->encoder.upload[index++] = + level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_short); + } + } + + //Inter-frame silence + instance->encoder.upload[index++] = + bit_read(instance->generic.data, 55) ? + level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_short * 50) : + level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_short * 51); size_t size_upload = index; if(size_upload > instance->encoder.size_upload) { From 08acfa50c015760ea62a1a35d43931284832e04a Mon Sep 17 00:00:00 2001 From: assasinfil Date: Tue, 17 Jan 2023 00:36:18 +0300 Subject: [PATCH 074/506] Fix? --- lib/subghz/protocols/somfy_telis.c | 88 ++++++++++++++---------------- 1 file changed, 41 insertions(+), 47 deletions(-) diff --git a/lib/subghz/protocols/somfy_telis.c b/lib/subghz/protocols/somfy_telis.c index 91cc9b74f..180094957 100644 --- a/lib/subghz/protocols/somfy_telis.c +++ b/lib/subghz/protocols/somfy_telis.c @@ -180,56 +180,17 @@ static bool subghz_protocol_encoder_somfy_telis_get_upload( //Send header // Wake-up - instance->encoder.upload[index++] = - level_duration_make(true, (uint32_t)subghz_protocol_somfy_telis_const.te_short * 15); - instance->encoder.upload[index++] = - level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_short * 148); + instance->encoder.upload[index++] = level_duration_make(true, 9415); + instance->encoder.upload[index++] = level_duration_make(false, 89565); //Hardware sync for(uint8_t i = 2; i > 0; i--) { instance->encoder.upload[index++] = - level_duration_make(true, (uint32_t)subghz_protocol_somfy_telis_const.te_short * 4); + level_duration_make(true, (uint32_t)subghz_protocol_somfy_telis_const.te_long * 2); instance->encoder.upload[index++] = - level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_short * 4); + level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_long * 2); } //Software sync - instance->encoder.upload[index++] = - level_duration_make(true, (uint32_t)subghz_protocol_somfy_telis_const.te_short * 7); - instance->encoder.upload[index++] = - level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_short * 1); - - //Send key data MSB manchester - for(uint8_t i = instance->generic.data_count_bit; i > 0; i--) { - if(bit_read(instance->generic.data, i - 1)) { - //send bit 1 - instance->encoder.upload[index++] = - level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_short); - instance->encoder.upload[index++] = - level_duration_make(true, (uint32_t)subghz_protocol_somfy_telis_const.te_short); - } else { - //send bit 0 - instance->encoder.upload[index++] = - level_duration_make(true, (uint32_t)subghz_protocol_somfy_telis_const.te_short); - instance->encoder.upload[index++] = - level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_short); - } - } - - //Inter-frame silence - instance->encoder.upload[index++] = - bit_read(instance->generic.data, 55) ? - level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_short * 50) : - level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_short * 51); - - //Hardware sync - for(uint8_t i = 7; i > 0; i--) { - instance->encoder.upload[index++] = - level_duration_make(true, (uint32_t)subghz_protocol_somfy_telis_const.te_short * 4); - instance->encoder.upload[index++] = - level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_short * 4); - } - //Software sync - instance->encoder.upload[index++] = - level_duration_make(true, (uint32_t)subghz_protocol_somfy_telis_const.te_short * 7); + instance->encoder.upload[index++] = level_duration_make(true, 4550); instance->encoder.upload[index++] = level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_short); @@ -251,10 +212,43 @@ static bool subghz_protocol_encoder_somfy_telis_get_upload( } //Inter-frame silence + instance->encoder.upload[index++] = bit_read(instance->generic.data, 55) ? + level_duration_make(false, 30415) : + level_duration_make(false, 30415 + 604); + + //Hardware sync + for(uint8_t i = 7; i > 0; i--) { + instance->encoder.upload[index++] = + level_duration_make(true, (uint32_t)subghz_protocol_somfy_telis_const.te_long * 2); + instance->encoder.upload[index++] = + level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_long * 2); + } + //Software sync + instance->encoder.upload[index++] = level_duration_make(true, 4550); instance->encoder.upload[index++] = - bit_read(instance->generic.data, 55) ? - level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_short * 50) : - level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_short * 51); + level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_short); + + //Send key data MSB manchester + for(uint8_t i = instance->generic.data_count_bit; i > 0; i--) { + if(bit_read(instance->generic.data, i - 1)) { + //send bit 1 + instance->encoder.upload[index++] = + level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_short); + instance->encoder.upload[index++] = + level_duration_make(true, (uint32_t)subghz_protocol_somfy_telis_const.te_short); + } else { + //send bit 0 + instance->encoder.upload[index++] = + level_duration_make(true, (uint32_t)subghz_protocol_somfy_telis_const.te_short); + instance->encoder.upload[index++] = + level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_short); + } + } + + //Inter-frame silence + instance->encoder.upload[index++] = bit_read(instance->generic.data, 55) ? + level_duration_make(false, 30415) : + level_duration_make(false, 30415 + 604); size_t size_upload = index; if(size_upload > instance->encoder.size_upload) { From 414a13131aff858b9c5db4421f77ba41d585a86f Mon Sep 17 00:00:00 2001 From: assasinfil Date: Tue, 17 Jan 2023 13:41:41 +0300 Subject: [PATCH 075/506] Fix v2? --- applications/main/subghz/subghz_history.c | 1 + lib/subghz/protocols/somfy_telis.c | 98 ++++++++++------------- 2 files changed, 42 insertions(+), 57 deletions(-) diff --git a/applications/main/subghz/subghz_history.c b/applications/main/subghz/subghz_history.c index e8d3acfd7..66d19a6fd 100644 --- a/applications/main/subghz/subghz_history.c +++ b/applications/main/subghz/subghz_history.c @@ -418,6 +418,7 @@ bool subghz_history_add_to_history( for(uint8_t i = 0; i < sizeof(uint64_t); i++) { data = (data << 8) | key_data[i]; } + FURI_LOG_D(TAG, "Recieved data:%llx", data); if(!(uint32_t)(data >> 32)) { furi_string_printf( item->item_str, diff --git a/lib/subghz/protocols/somfy_telis.c b/lib/subghz/protocols/somfy_telis.c index 180094957..2608e8245 100644 --- a/lib/subghz/protocols/somfy_telis.c +++ b/lib/subghz/protocols/somfy_telis.c @@ -83,7 +83,7 @@ void* subghz_protocol_encoder_somfy_telis_alloc(SubGhzEnvironment* environment) instance->keystore = subghz_environment_get_keystore(environment); instance->encoder.repeat = 10; - instance->encoder.size_upload = 255; + instance->encoder.size_upload = 400; instance->encoder.upload = malloc(instance->encoder.size_upload * sizeof(LevelDuration)); instance->encoder.is_running = false; @@ -180,75 +180,59 @@ static bool subghz_protocol_encoder_somfy_telis_get_upload( //Send header // Wake-up - instance->encoder.upload[index++] = level_duration_make(true, 9415); - instance->encoder.upload[index++] = level_duration_make(false, 89565); + instance->encoder.upload[index++] = level_duration_make(true, 9415); // 1 + instance->encoder.upload[index++] = level_duration_make(false, 89565); // 0 //Hardware sync - for(uint8_t i = 2; i > 0; i--) { - instance->encoder.upload[index++] = - level_duration_make(true, (uint32_t)subghz_protocol_somfy_telis_const.te_long * 2); - instance->encoder.upload[index++] = - level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_long * 2); + for(uint8_t i = 0; i < 2; ++i) { + instance->encoder.upload[index++] = level_duration_make(true, 4 * 640); // 1 + instance->encoder.upload[index++] = level_duration_make(false, 4 * 640); // 0 } //Software sync - instance->encoder.upload[index++] = level_duration_make(true, 4550); - instance->encoder.upload[index++] = - level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_short); + instance->encoder.upload[index++] = level_duration_make(true, 4550); // 1 + instance->encoder.upload[index++] = level_duration_make(false, 640); // 0 //Send key data MSB manchester - for(uint8_t i = instance->generic.data_count_bit; i > 0; i--) { - if(bit_read(instance->generic.data, i - 1)) { - //send bit 1 - instance->encoder.upload[index++] = - level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_short); - instance->encoder.upload[index++] = - level_duration_make(true, (uint32_t)subghz_protocol_somfy_telis_const.te_short); + for(uint8_t i = 0; i < instance->generic.data_count_bit; ++i) { + if(bit_read(instance->generic.data, i)) { + //send bit 1: 01 = 1 + instance->encoder.upload[index++] = level_duration_make(false, 640); // 0 + instance->encoder.upload[index++] = level_duration_make(true, 640); // 1 } else { - //send bit 0 - instance->encoder.upload[index++] = - level_duration_make(true, (uint32_t)subghz_protocol_somfy_telis_const.te_short); - instance->encoder.upload[index++] = - level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_short); + //send bit 0: 10 = 0 + instance->encoder.upload[index++] = level_duration_make(true, 640); // 1 + instance->encoder.upload[index++] = level_duration_make(false, 640); // 0 } } //Inter-frame silence - instance->encoder.upload[index++] = bit_read(instance->generic.data, 55) ? - level_duration_make(false, 30415) : - level_duration_make(false, 30415 + 604); + instance->encoder.upload[index++] = level_duration_make(false, 30415); - //Hardware sync - for(uint8_t i = 7; i > 0; i--) { - instance->encoder.upload[index++] = - level_duration_make(true, (uint32_t)subghz_protocol_somfy_telis_const.te_long * 2); - instance->encoder.upload[index++] = - level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_long * 2); - } - //Software sync - instance->encoder.upload[index++] = level_duration_make(true, 4550); - instance->encoder.upload[index++] = - level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_short); - - //Send key data MSB manchester - for(uint8_t i = instance->generic.data_count_bit; i > 0; i--) { - if(bit_read(instance->generic.data, i - 1)) { - //send bit 1 - instance->encoder.upload[index++] = - level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_short); - instance->encoder.upload[index++] = - level_duration_make(true, (uint32_t)subghz_protocol_somfy_telis_const.te_short); - } else { - //send bit 0 - instance->encoder.upload[index++] = - level_duration_make(true, (uint32_t)subghz_protocol_somfy_telis_const.te_short); - instance->encoder.upload[index++] = - level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_short); + for(uint8_t j = 0; j < 2; ++j) { + //Hardware sync + for(uint8_t i = 0; i < 7; ++i) { + instance->encoder.upload[index++] = level_duration_make(true, 4 * 640); // 1 + instance->encoder.upload[index++] = level_duration_make(false, 4 * 640); // 0 } - } + //Software sync + instance->encoder.upload[index++] = level_duration_make(true, 4550); // 1 + instance->encoder.upload[index++] = level_duration_make(false, 640); // 0 - //Inter-frame silence - instance->encoder.upload[index++] = bit_read(instance->generic.data, 55) ? - level_duration_make(false, 30415) : - level_duration_make(false, 30415 + 604); + //Send key data MSB manchester + for(uint8_t i = 0; i < instance->generic.data_count_bit; ++i) { + if(bit_read(instance->generic.data, i)) { + //send bit 1: 01 = 1 + instance->encoder.upload[index++] = level_duration_make(false, 640); // 0 + instance->encoder.upload[index++] = level_duration_make(true, 640); // 1 + } else { + //send bit 0: 10 = 0 + instance->encoder.upload[index++] = level_duration_make(true, 640); // 1 + instance->encoder.upload[index++] = level_duration_make(false, 640); // 0 + } + } + + //Inter-frame silence + instance->encoder.upload[index++] = level_duration_make(false, 30415); + } size_t size_upload = index; if(size_upload > instance->encoder.size_upload) { From 374452796c0fc83e22725af460dcc76297c3b9fb Mon Sep 17 00:00:00 2001 From: Cathy Nguyen Date: Tue, 17 Jan 2023 23:41:13 -0500 Subject: [PATCH 076/506] fix 00AM: Flipper may be Zero, but midnight isn't --- applications/main/clock_app/clock_app.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/applications/main/clock_app/clock_app.c b/applications/main/clock_app/clock_app.c index 47b2ba8bd..d2c178903 100644 --- a/applications/main/clock_app/clock_app.c +++ b/applications/main/clock_app/clock_app.c @@ -39,11 +39,12 @@ static void clock_render_callback(Canvas* const canvas, void* ctx) { } else { bool pm = curr_dt.hour > 12; bool pm12 = curr_dt.hour >= 12; + bool am12 = curr_dt.hour == 0; snprintf( time_string, TIME_LEN, CLOCK_TIME_FORMAT, - pm ? curr_dt.hour - 12 : curr_dt.hour, + pm ? curr_dt.hour - 12 : (am12 ? 12 : curr_dt.hour), curr_dt.minute, curr_dt.second); @@ -237,4 +238,4 @@ int32_t clock_app(void* p) { free(plugin_state); return 0; -} \ No newline at end of file +} From cd5596027f1cc088ef5197cd4af4a8140509465e Mon Sep 17 00:00:00 2001 From: assasinfil Date: Wed, 18 Jan 2023 14:57:30 +0300 Subject: [PATCH 077/506] Fixed --- lib/subghz/protocols/somfy_telis.c | 104 +++++++++++++++-------------- 1 file changed, 54 insertions(+), 50 deletions(-) diff --git a/lib/subghz/protocols/somfy_telis.c b/lib/subghz/protocols/somfy_telis.c index 2608e8245..97d7c3720 100644 --- a/lib/subghz/protocols/somfy_telis.c +++ b/lib/subghz/protocols/somfy_telis.c @@ -1,5 +1,6 @@ #include "somfy_telis.h" #include +#include #include "../blocks/const.h" #include "../blocks/decoder.h" @@ -10,8 +11,8 @@ #define TAG "SubGhzProtocolSomfyTelis" static const SubGhzBlockConst subghz_protocol_somfy_telis_const = { - .te_short = 604, - .te_long = 1208, + .te_short = 640, + .te_long = 1280, .te_delta = 250, .min_count_bit_for_found = 56, }; @@ -83,7 +84,7 @@ void* subghz_protocol_encoder_somfy_telis_alloc(SubGhzEnvironment* environment) instance->keystore = subghz_environment_get_keystore(environment); instance->encoder.repeat = 10; - instance->encoder.size_upload = 400; + instance->encoder.size_upload = 128; instance->encoder.upload = malloc(instance->encoder.size_upload * sizeof(LevelDuration)); instance->encoder.is_running = false; @@ -105,11 +106,11 @@ static bool instance->generic.cnt = (data >> 24) & 0xFFFF; // rolling code instance->generic.serial = data & 0xFFFFFF; // address - if(instance->generic.cnt < 0xFFFF) { - instance->generic.cnt++; - } else if(instance->generic.cnt >= 0xFFFF) { - instance->generic.cnt = 0; - } + // if(instance->generic.cnt < 0xFFFF) { + // instance->generic.cnt++; + // } else if(instance->generic.cnt >= 0xFFFF) { + // instance->generic.cnt = 0; + // } uint8_t frame[7]; frame[0] = data >> 48; frame[1] = instance->generic.btn << 4; @@ -179,62 +180,55 @@ static bool subghz_protocol_encoder_somfy_telis_get_upload( size_t index = 0; //Send header - // Wake-up - instance->encoder.upload[index++] = level_duration_make(true, 9415); // 1 - instance->encoder.upload[index++] = level_duration_make(false, 89565); // 0 + //Wake up + instance->encoder.upload[index++] = level_duration_make(true, (uint32_t)9415); // 1 + instance->encoder.upload[index++] = level_duration_make(false, (uint32_t)89565); // 0 //Hardware sync for(uint8_t i = 0; i < 2; ++i) { - instance->encoder.upload[index++] = level_duration_make(true, 4 * 640); // 1 - instance->encoder.upload[index++] = level_duration_make(false, 4 * 640); // 0 + instance->encoder.upload[index++] = level_duration_make( + true, (uint32_t)subghz_protocol_somfy_telis_const.te_short * 4); // 1 + instance->encoder.upload[index++] = level_duration_make( + false, (uint32_t)subghz_protocol_somfy_telis_const.te_short * 4); // 0 } //Software sync - instance->encoder.upload[index++] = level_duration_make(true, 4550); // 1 - instance->encoder.upload[index++] = level_duration_make(false, 640); // 0 + instance->encoder.upload[index++] = level_duration_make(true, (uint32_t)4550); // 1 + instance->encoder.upload[index++] = + level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_short); // 0 //Send key data MSB manchester - for(uint8_t i = 0; i < instance->generic.data_count_bit; ++i) { - if(bit_read(instance->generic.data, i)) { - //send bit 1: 01 = 1 - instance->encoder.upload[index++] = level_duration_make(false, 640); // 0 - instance->encoder.upload[index++] = level_duration_make(true, 640); // 1 + + for(uint8_t i = instance->generic.data_count_bit; i > 0; i--) { + if(bit_read(instance->generic.data, i - 1)) { + if(instance->encoder.upload[index - 1].level == LEVEL_DURATION_LEVEL_LOW) { + instance->encoder.upload[index - 1].duration *= 2; // 00 + instance->encoder.upload[index++] = level_duration_make( + true, (uint32_t)subghz_protocol_somfy_telis_const.te_short); // 1 + } else { + instance->encoder.upload[index++] = level_duration_make( + false, (uint32_t)subghz_protocol_somfy_telis_const.te_short); // 0 + instance->encoder.upload[index++] = level_duration_make( + true, (uint32_t)subghz_protocol_somfy_telis_const.te_short); // 1 + } + } else { - //send bit 0: 10 = 0 - instance->encoder.upload[index++] = level_duration_make(true, 640); // 1 - instance->encoder.upload[index++] = level_duration_make(false, 640); // 0 + if(instance->encoder.upload[index - 1].level == LEVEL_DURATION_LEVEL_HIGH) { + instance->encoder.upload[index - 1].duration *= 2; // 11 + instance->encoder.upload[index++] = level_duration_make( + false, (uint32_t)subghz_protocol_somfy_telis_const.te_short); // 0 + } else { + instance->encoder.upload[index++] = level_duration_make( + true, (uint32_t)subghz_protocol_somfy_telis_const.te_short); // 1 + instance->encoder.upload[index++] = level_duration_make( + false, (uint32_t)subghz_protocol_somfy_telis_const.te_short); // 0 + } } } //Inter-frame silence instance->encoder.upload[index++] = level_duration_make(false, 30415); - for(uint8_t j = 0; j < 2; ++j) { - //Hardware sync - for(uint8_t i = 0; i < 7; ++i) { - instance->encoder.upload[index++] = level_duration_make(true, 4 * 640); // 1 - instance->encoder.upload[index++] = level_duration_make(false, 4 * 640); // 0 - } - //Software sync - instance->encoder.upload[index++] = level_duration_make(true, 4550); // 1 - instance->encoder.upload[index++] = level_duration_make(false, 640); // 0 - - //Send key data MSB manchester - for(uint8_t i = 0; i < instance->generic.data_count_bit; ++i) { - if(bit_read(instance->generic.data, i)) { - //send bit 1: 01 = 1 - instance->encoder.upload[index++] = level_duration_make(false, 640); // 0 - instance->encoder.upload[index++] = level_duration_make(true, 640); // 1 - } else { - //send bit 0: 10 = 0 - instance->encoder.upload[index++] = level_duration_make(true, 640); // 1 - instance->encoder.upload[index++] = level_duration_make(false, 640); // 0 - } - } - - //Inter-frame silence - instance->encoder.upload[index++] = level_duration_make(false, 30415); - } - size_t size_upload = index; + FURI_LOG_D(TAG, "Size upload: %d", size_upload); if(size_upload > instance->encoder.size_upload) { FURI_LOG_E(TAG, "Size upload exceeds allocated encoder buffer."); return false; @@ -361,6 +355,7 @@ void subghz_protocol_decoder_somfy_telis_feed(void* context, bool level, uint32_ if((!level) && (DURATION_DIFF(duration, subghz_protocol_somfy_telis_const.te_short * 4) < subghz_protocol_somfy_telis_const.te_delta * 4)) { instance->decoder.parser_step = SomfyTelisDecoderStepCheckPreambula; + FURI_LOG_D(TAG, "Found preambula"); } else { instance->header_count = 0; instance->decoder.parser_step = SomfyTelisDecoderStepReset; @@ -372,6 +367,7 @@ void subghz_protocol_decoder_somfy_telis_feed(void* context, bool level, uint32_ subghz_protocol_somfy_telis_const.te_delta * 4) { instance->decoder.parser_step = SomfyTelisDecoderStepFoundPreambula; instance->header_count++; + FURI_LOG_D(TAG, "Hardware sync"); } else if( (instance->header_count > 1) && (DURATION_DIFF(duration, subghz_protocol_somfy_telis_const.te_short * 7) < @@ -390,6 +386,7 @@ void subghz_protocol_decoder_somfy_telis_feed(void* context, bool level, uint32_ ManchesterEventLongHigh, &instance->manchester_saved_state, NULL); + FURI_LOG_D(TAG, "Software sync"); } } @@ -400,24 +397,31 @@ void subghz_protocol_decoder_somfy_telis_feed(void* context, bool level, uint32_ if(DURATION_DIFF(duration, subghz_protocol_somfy_telis_const.te_short) < subghz_protocol_somfy_telis_const.te_delta) { event = ManchesterEventShortLow; + FURI_LOG_D(TAG, "Data decode short"); } else if( DURATION_DIFF(duration, subghz_protocol_somfy_telis_const.te_long) < subghz_protocol_somfy_telis_const.te_delta) { event = ManchesterEventLongLow; + FURI_LOG_D(TAG, "Data decode long"); } else if( duration >= (subghz_protocol_somfy_telis_const.te_long + subghz_protocol_somfy_telis_const.te_delta)) { + FURI_LOG_D( + TAG, "Data decode manchester bit: %d", instance->decoder.decode_count_bit); if(instance->decoder.decode_count_bit == subghz_protocol_somfy_telis_const.min_count_bit_for_found) { //check crc uint64_t data_tmp = instance->decoder.decode_data ^ (instance->decoder.decode_data >> 8); + FURI_LOG_D(TAG, "Check crc: %llx", (data_tmp >> 40) & 0xF); if(((data_tmp >> 40) & 0xF) == subghz_protocol_somfy_telis_crc(data_tmp)) { instance->generic.data = instance->decoder.decode_data; instance->generic.data_count_bit = instance->decoder.decode_count_bit; if(instance->base.callback) instance->base.callback(&instance->base, instance->base.context); + } else { + FURI_LOG_D(TAG, "Bad crc"); } } instance->decoder.decode_data = 0; From 5123fac5d9e477e064feb659dbd4f1eacf486a72 Mon Sep 17 00:00:00 2001 From: assasinfil Date: Wed, 18 Jan 2023 15:11:32 +0300 Subject: [PATCH 078/506] Full realization --- lib/subghz/protocols/somfy_telis.c | 60 ++++++++++++++++++++++++++---- 1 file changed, 53 insertions(+), 7 deletions(-) diff --git a/lib/subghz/protocols/somfy_telis.c b/lib/subghz/protocols/somfy_telis.c index 97d7c3720..a605b2809 100644 --- a/lib/subghz/protocols/somfy_telis.c +++ b/lib/subghz/protocols/somfy_telis.c @@ -1,6 +1,5 @@ #include "somfy_telis.h" #include -#include #include "../blocks/const.h" #include "../blocks/decoder.h" @@ -84,7 +83,7 @@ void* subghz_protocol_encoder_somfy_telis_alloc(SubGhzEnvironment* environment) instance->keystore = subghz_environment_get_keystore(environment); instance->encoder.repeat = 10; - instance->encoder.size_upload = 128; + instance->encoder.size_upload = 512; instance->encoder.upload = malloc(instance->encoder.size_upload * sizeof(LevelDuration)); instance->encoder.is_running = false; @@ -106,11 +105,12 @@ static bool instance->generic.cnt = (data >> 24) & 0xFFFF; // rolling code instance->generic.serial = data & 0xFFFFFF; // address - // if(instance->generic.cnt < 0xFFFF) { - // instance->generic.cnt++; - // } else if(instance->generic.cnt >= 0xFFFF) { - // instance->generic.cnt = 0; - // } + if(instance->generic.cnt < 0xFFFF) { + instance->generic.cnt++; + } else if(instance->generic.cnt >= 0xFFFF) { + instance->generic.cnt = 0; + } + uint8_t frame[7]; frame[0] = data >> 48; frame[1] = instance->generic.btn << 4; @@ -226,6 +226,52 @@ static bool subghz_protocol_encoder_somfy_telis_get_upload( //Inter-frame silence instance->encoder.upload[index++] = level_duration_make(false, 30415); + //Retransmission + for(uint8_t i = 0; i < 2; i++) { + //Hardware sync + for(uint8_t i = 0; i < 7; ++i) { + instance->encoder.upload[index++] = level_duration_make( + true, (uint32_t)subghz_protocol_somfy_telis_const.te_short * 4); // 1 + instance->encoder.upload[index++] = level_duration_make( + false, (uint32_t)subghz_protocol_somfy_telis_const.te_short * 4); // 0 + } + //Software sync + instance->encoder.upload[index++] = level_duration_make(true, (uint32_t)4550); // 1 + instance->encoder.upload[index++] = + level_duration_make(false, (uint32_t)subghz_protocol_somfy_telis_const.te_short); // 0 + + //Send key data MSB manchester + + for(uint8_t i = instance->generic.data_count_bit; i > 0; i--) { + if(bit_read(instance->generic.data, i - 1)) { + if(instance->encoder.upload[index - 1].level == LEVEL_DURATION_LEVEL_LOW) { + instance->encoder.upload[index - 1].duration *= 2; // 00 + instance->encoder.upload[index++] = level_duration_make( + true, (uint32_t)subghz_protocol_somfy_telis_const.te_short); // 1 + } else { + instance->encoder.upload[index++] = level_duration_make( + false, (uint32_t)subghz_protocol_somfy_telis_const.te_short); // 0 + instance->encoder.upload[index++] = level_duration_make( + true, (uint32_t)subghz_protocol_somfy_telis_const.te_short); // 1 + } + + } else { + if(instance->encoder.upload[index - 1].level == LEVEL_DURATION_LEVEL_HIGH) { + instance->encoder.upload[index - 1].duration *= 2; // 11 + instance->encoder.upload[index++] = level_duration_make( + false, (uint32_t)subghz_protocol_somfy_telis_const.te_short); // 0 + } else { + instance->encoder.upload[index++] = level_duration_make( + true, (uint32_t)subghz_protocol_somfy_telis_const.te_short); // 1 + instance->encoder.upload[index++] = level_duration_make( + false, (uint32_t)subghz_protocol_somfy_telis_const.te_short); // 0 + } + } + } + + //Inter-frame silence + instance->encoder.upload[index++] = level_duration_make(false, 30415); + } size_t size_upload = index; FURI_LOG_D(TAG, "Size upload: %d", size_upload); From 8c94e3e78d55c72b0c4158f74e4573474a52cc0e Mon Sep 17 00:00:00 2001 From: assasinfil Date: Wed, 18 Jan 2023 15:15:02 +0300 Subject: [PATCH 079/506] Remove bad folder --- applications/plugins/flipper-flashlight | 1 - 1 file changed, 1 deletion(-) delete mode 160000 applications/plugins/flipper-flashlight diff --git a/applications/plugins/flipper-flashlight b/applications/plugins/flipper-flashlight deleted file mode 160000 index d21e87230..000000000 --- a/applications/plugins/flipper-flashlight +++ /dev/null @@ -1 +0,0 @@ -Subproject commit d21e872302dc55d68398cf661854b8df453e248b From 379807423f42943a2dc8e8c2942a0bee90f5700a Mon Sep 17 00:00:00 2001 From: assasinfil Date: Wed, 18 Jan 2023 16:21:42 +0300 Subject: [PATCH 080/506] Debug prints cleanup --- applications/main/subghz/subghz_history.c | 2 +- lib/subghz/protocols/somfy_telis.c | 14 +------------- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/applications/main/subghz/subghz_history.c b/applications/main/subghz/subghz_history.c index 66d19a6fd..c84af3a78 100644 --- a/applications/main/subghz/subghz_history.c +++ b/applications/main/subghz/subghz_history.c @@ -418,7 +418,7 @@ bool subghz_history_add_to_history( for(uint8_t i = 0; i < sizeof(uint64_t); i++) { data = (data << 8) | key_data[i]; } - FURI_LOG_D(TAG, "Recieved data:%llx", data); + if(!(uint32_t)(data >> 32)) { furi_string_printf( item->item_str, diff --git a/lib/subghz/protocols/somfy_telis.c b/lib/subghz/protocols/somfy_telis.c index a605b2809..0952ff2ff 100644 --- a/lib/subghz/protocols/somfy_telis.c +++ b/lib/subghz/protocols/somfy_telis.c @@ -137,7 +137,6 @@ static bool data |= frame[i]; } instance->generic.data = data; - FURI_LOG_D(TAG, "New data: %llx", instance->generic.data); return true; } @@ -274,7 +273,7 @@ static bool subghz_protocol_encoder_somfy_telis_get_upload( } size_t size_upload = index; - FURI_LOG_D(TAG, "Size upload: %d", size_upload); + if(size_upload > instance->encoder.size_upload) { FURI_LOG_E(TAG, "Size upload exceeds allocated encoder buffer."); return false; @@ -401,7 +400,6 @@ void subghz_protocol_decoder_somfy_telis_feed(void* context, bool level, uint32_ if((!level) && (DURATION_DIFF(duration, subghz_protocol_somfy_telis_const.te_short * 4) < subghz_protocol_somfy_telis_const.te_delta * 4)) { instance->decoder.parser_step = SomfyTelisDecoderStepCheckPreambula; - FURI_LOG_D(TAG, "Found preambula"); } else { instance->header_count = 0; instance->decoder.parser_step = SomfyTelisDecoderStepReset; @@ -413,7 +411,6 @@ void subghz_protocol_decoder_somfy_telis_feed(void* context, bool level, uint32_ subghz_protocol_somfy_telis_const.te_delta * 4) { instance->decoder.parser_step = SomfyTelisDecoderStepFoundPreambula; instance->header_count++; - FURI_LOG_D(TAG, "Hardware sync"); } else if( (instance->header_count > 1) && (DURATION_DIFF(duration, subghz_protocol_somfy_telis_const.te_short * 7) < @@ -432,7 +429,6 @@ void subghz_protocol_decoder_somfy_telis_feed(void* context, bool level, uint32_ ManchesterEventLongHigh, &instance->manchester_saved_state, NULL); - FURI_LOG_D(TAG, "Software sync"); } } @@ -443,31 +439,24 @@ void subghz_protocol_decoder_somfy_telis_feed(void* context, bool level, uint32_ if(DURATION_DIFF(duration, subghz_protocol_somfy_telis_const.te_short) < subghz_protocol_somfy_telis_const.te_delta) { event = ManchesterEventShortLow; - FURI_LOG_D(TAG, "Data decode short"); } else if( DURATION_DIFF(duration, subghz_protocol_somfy_telis_const.te_long) < subghz_protocol_somfy_telis_const.te_delta) { event = ManchesterEventLongLow; - FURI_LOG_D(TAG, "Data decode long"); } else if( duration >= (subghz_protocol_somfy_telis_const.te_long + subghz_protocol_somfy_telis_const.te_delta)) { - FURI_LOG_D( - TAG, "Data decode manchester bit: %d", instance->decoder.decode_count_bit); if(instance->decoder.decode_count_bit == subghz_protocol_somfy_telis_const.min_count_bit_for_found) { //check crc uint64_t data_tmp = instance->decoder.decode_data ^ (instance->decoder.decode_data >> 8); - FURI_LOG_D(TAG, "Check crc: %llx", (data_tmp >> 40) & 0xF); if(((data_tmp >> 40) & 0xF) == subghz_protocol_somfy_telis_crc(data_tmp)) { instance->generic.data = instance->decoder.decode_data; instance->generic.data_count_bit = instance->decoder.decode_count_bit; if(instance->base.callback) instance->base.callback(&instance->base, instance->base.context); - } else { - FURI_LOG_D(TAG, "Bad crc"); } } instance->decoder.decode_data = 0; @@ -649,7 +638,6 @@ void subghz_protocol_decoder_somfy_telis_get_string(void* context, FuriString* o SubGhzProtocolDecoderSomfyTelis* instance = context; subghz_protocol_somfy_telis_check_remote_controller(&instance->generic); - FURI_LOG_D(TAG, "Data: %llx", instance->generic.data); furi_string_cat_printf( output, "%s %db\r\n" From db16b3ef1d299300640c47e89bf444c2cee4ffbb Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Wed, 18 Jan 2023 18:15:30 +0300 Subject: [PATCH 081/506] Revert infrared hotfix --- applications/main/infrared/infrared_signal.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/main/infrared/infrared_signal.c b/applications/main/infrared/infrared_signal.c index 80e1a6f92..9154dfbf6 100644 --- a/applications/main/infrared/infrared_signal.c +++ b/applications/main/infrared/infrared_signal.c @@ -295,6 +295,6 @@ void infrared_signal_transmit(InfraredSignal* signal) { raw_signal->duty_cycle); } else { InfraredMessage* message = &signal->payload.message; - infrared_send(message, 2); + infrared_send(message, 1); } } From 927fcca081c1355307db1670c9605e38992286a5 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Tue, 3 Jan 2023 19:06:39 +0300 Subject: [PATCH 082/506] Revert "Merge pull request #252 from X-Stuff/dev-advanced-config" This reverts commit ed5b2da9ad4ea77cf6f02142c5200700688f3ab7. --- .../debug/unit_tests/subghz/subghz_test.c | 140 -------- applications/debug/unit_tests/test_index.c | 105 +----- .../main/subghz/helpers/subghz_custom_event.h | 1 - .../scenes/subghz_scene_receiver_config.c | 232 ------------- .../scenes/subghz_scene_show_error_sub.c | 12 +- .../main/subghz/scenes/subghz_scene_start.c | 21 -- applications/main/subghz/subghz_i.c | 6 - applications/main/subghz/subghz_i.h | 15 - .../helpers/subghz_config_preset_custom.c | 326 ------------------ .../helpers/subghz_config_preset_custom.h | 193 ----------- 10 files changed, 4 insertions(+), 1047 deletions(-) delete mode 100644 lib/subghz/helpers/subghz_config_preset_custom.c delete mode 100644 lib/subghz/helpers/subghz_config_preset_custom.h diff --git a/applications/debug/unit_tests/subghz/subghz_test.c b/applications/debug/unit_tests/subghz/subghz_test.c index adfce74e2..1dee1d59e 100644 --- a/applications/debug/unit_tests/subghz/subghz_test.c +++ b/applications/debug/unit_tests/subghz/subghz_test.c @@ -6,7 +6,6 @@ #include #include #include -#include #include #define TAG "SubGhz TEST" @@ -204,132 +203,6 @@ static bool subghz_encoder_test(const char* path) { return subghz_test_decoder_count ? true : false; } -static bool subghz_custom_preset_test(void) { - static const uint8_t preset_data[][2] = { - {CC1101_MDMCFG0, 0}, - {CC1101_MDMCFG1, 0}, - {CC1101_MDMCFG2, 0}, - {CC1101_MDMCFG3, 0}, - {CC1101_MDMCFG4, 0}, - }; - - static uint8_t test_data[sizeof(preset_data)] = {0}; - memcpy(test_data, preset_data, sizeof(preset_data)); - - uint8_t* test_data_ptr = &test_data[0]; - - { // CHEKING BANDWIDTH SET - for(uint32_t i = 0; i < CH_BANDWIDTH_NUM; ++i) { - uint8_t bw_value = subghz_preset_custom_bandwidth_values[i]; - - bool result = - subghz_preset_custom_set_bandwidth(test_data_ptr, sizeof(test_data), bw_value); - if(!result) { - FURI_LOG_E(TAG, "Failed to set BW value: %hhu", bw_value); - return false; - } - - uint8_t get_bw_value = - subghz_preset_custom_get_bandwidth(test_data_ptr, sizeof(test_data)); - if(get_bw_value != bw_value) { - FURI_LOG_E( - TAG, - "BW value from preset: %hhu is not equal expected value: %hhu", - get_bw_value, - bw_value); - return false; - } - - FURI_LOG_T(TAG, "Bandwidth check OK: %hhu", bw_value); - } - } - - { // CHEKING MACHESTER SET - bool result = - subghz_preset_custom_set_machester_enable(test_data_ptr, sizeof(test_data), false); - if(!result) { - FURI_LOG_E(TAG, "Failed to set manchester enable flag"); - return false; - } - bool flag = subghz_preset_custom_get_machester_enable(test_data_ptr, sizeof(test_data)); - if(flag != false) { - FURI_LOG_E(TAG, "Manchester disable flag setup failed!"); - return false; - } - - subghz_preset_custom_set_machester_enable(test_data_ptr, sizeof(test_data), true); - flag = subghz_preset_custom_get_machester_enable(test_data_ptr, sizeof(test_data)); - if(flag != true) { - FURI_LOG_E(TAG, "Manchester enable flag setup failed!"); - return false; - } - - FURI_LOG_T(TAG, "Manchester flag check OK"); - } - { // CHEKING DATARATE SET - const float datarateRoughMax = 1600000.0f; // bauds - const float datarateRoughStep = 5000.0f; - - const float datarateFineMax = 30000.0f; - const float datarateFineStep = 50.0f; - - bool result = false; - char datarate_set_str[16] = {0}; - char datarate_get_str[16] = {0}; - - float datarate_set = datarateRoughMax; - float datarate_get = -1.0f; - while(datarate_set > 0) { - subghz_preset_custom_printf_datarate( - datarate_set, datarate_set_str, sizeof(datarate_set_str)); - - result = - subghz_preset_custom_set_datarate(test_data_ptr, sizeof(test_data), datarate_set); - if(!result) { - FURI_LOG_E(TAG, "Failed to set datarate: %s!", datarate_set_str); - return false; - } - - datarate_get = subghz_preset_custom_get_datarate(test_data_ptr, sizeof(test_data)); - subghz_preset_custom_printf_datarate( - datarate_get, datarate_get_str, sizeof(datarate_get_str)); - - if(datarate_get < 0) { - FURI_LOG_E(TAG, "Failed to get datarate!"); - return false; - } - - if(datarate_set > datarateFineMax) { - result = fabsf(datarate_get - datarate_set) <= datarateRoughStep; - datarate_set -= datarateRoughStep; - } else { - result = fabsf(datarate_get - datarate_set) <= datarateFineStep; - datarate_set -= datarateFineStep; - } - - if(result) { - FURI_LOG_T( - TAG, - "Datarate check OK: Set: %s - Get: %s", - datarate_set_str, - datarate_get_str); - } else { - FURI_LOG_E( - TAG, - "Datarate check failed!: %s is way to diff %s! DRATE_E: %hhu DRATE_M: %hhu", - datarate_set_str, - datarate_get_str, - test_data[4 * 2 + 1] & 0b00001111, - test_data[3 * 2 + 1]); - return false; - } - } - } - - FURI_LOG_I(TAG, "Sub GHz custom preset test: OK"); - return true; -} - MU_TEST(subghz_keystore_test) { mu_assert( subghz_environment_load_keystore(environment_handler, KEYSTORE_DIR_NAME), @@ -874,10 +747,6 @@ MU_TEST(subghz_random_test) { mu_assert(subghz_decode_random_test(TEST_RANDOM_DIR_NAME), "Random test error\r\n"); } -MU_TEST(subghz_preset_test) { - mu_assert(subghz_custom_preset_test(), "Custom preset logic error\r\n"); -} - MU_TEST_SUITE(subghz) { subghz_test_init(); MU_RUN_TEST(subghz_keystore_test); @@ -948,16 +817,7 @@ MU_TEST_SUITE(subghz) { subghz_test_deinit(); } -MU_TEST_SUITE(subghz_app) { - MU_RUN_TEST(subghz_preset_test); -} - int run_minunit_test_subghz() { MU_RUN_SUITE(subghz); return MU_EXIT_CODE; } - -int run_minunit_test_subghz_app() { - MU_RUN_SUITE(subghz_app); - return MU_EXIT_CODE; -} diff --git a/applications/debug/unit_tests/test_index.c b/applications/debug/unit_tests/test_index.c index bd2789737..2bb9c423f 100644 --- a/applications/debug/unit_tests/test_index.c +++ b/applications/debug/unit_tests/test_index.c @@ -5,7 +5,6 @@ #include #include #include -#include #define TAG "UnitTests" @@ -20,7 +19,6 @@ int run_minunit_test_flipper_format_string(); int run_minunit_test_stream(); int run_minunit_test_storage(); int run_minunit_test_subghz(); -int run_minunit_test_subghz_app(); int run_minunit_test_dirwalk(); int run_minunit_test_power(); int run_minunit_test_protocol_dict(); @@ -49,7 +47,6 @@ const UnitTest unit_tests[] = { {.name = "flipper_format_string", .entry = run_minunit_test_flipper_format_string}, {.name = "rpc", .entry = run_minunit_test_rpc}, {.name = "subghz", .entry = run_minunit_test_subghz}, - {.name = "subghz_app", .entry = run_minunit_test_subghz_app}, {.name = "infrared", .entry = run_minunit_test_infrared}, {.name = "nfc", .entry = run_minunit_test_nfc}, {.name = "power", .entry = run_minunit_test_power}, @@ -76,72 +73,6 @@ void minunit_print_fail(const char* str) { printf(FURI_LOG_CLR_E "%s\r\n" FURI_LOG_CLR_RESET, str); } -void unit_tests_cli_logs_puts(const char* str) { - printf(str); -} - -// by default there is no output from unit tests -// you have to enable them with this function -void unit_tests_cli_enable_logs(FuriLogLevel logLevel) { - furi_log_init(); - furi_log_set_level(logLevel); - furi_log_set_puts(unit_tests_cli_logs_puts); -} - -void unit_tests_cli_print_help() { - printf( - "Usage:\r\n" - " unit_tests [log level] [test_suit_name]\r\n" - " Arguments:\r\n" - " [log level]: optional, enables printing output from FURI_LOG_* macro in unit_tests\r\n" - " [test_suit_name]: a specific test suit to run. If not specified runs all tests\r\n" - " Warning: supports only 1 test suit to launch\r\n" - " Example:\r\n" - " unit_tests - run ALL tests wihtout log printing\r\n" - " unit_tests bt - run bt tests wihtout log printing\r\n" - " unit_tests log debug subghz - run subghz tests with logs at debug level abd above\r\n\r\n" - " unit_tests help [?]\r\n" - " prints this help\r\n"); -} - -bool unit_tests_cli_parse_log_level(FuriString* args) { - bool result = true; - FuriString* level = furi_string_alloc(); - if(args_read_string_and_trim(args, level)) { - if(furi_string_cmpi_str(level, "default") == 0) { - unit_tests_cli_enable_logs(FuriLogLevelDefault); - } else if(furi_string_cmpi_str(level, "none") == 0) { - unit_tests_cli_enable_logs(FuriLogLevelNone); - } else if(furi_string_cmpi_str(level, "error") == 0) { - unit_tests_cli_enable_logs(FuriLogLevelError); - } else if(furi_string_cmpi_str(level, "warn") == 0) { - unit_tests_cli_enable_logs(FuriLogLevelWarn); - } else if(furi_string_cmpi_str(level, "info") == 0) { - unit_tests_cli_enable_logs(FuriLogLevelInfo); - } else if(furi_string_cmpi_str(level, "debug") == 0) { - unit_tests_cli_enable_logs(FuriLogLevelDebug); - } else if(furi_string_cmpi_str(level, "trace") == 0) { - unit_tests_cli_enable_logs(FuriLogLevelTrace); - } else { - printf("Error: Invalid log level: %s\r\n", furi_string_get_cstr(level)); - result = false; - } - } - furi_string_free(level); - return result; -} - -FuriString* unit_tests_cli_parse_test_suit(FuriString* args) { - FuriString* test_suit = furi_string_alloc(); - - if(!args_read_string_and_trim(args, test_suit)) { - furi_string_free(test_suit); - return NULL; - } - - return test_suit; -} - void unit_tests_cli(Cli* cli, FuriString* args, void* context) { UNUSED(cli); UNUSED(args); @@ -151,34 +82,6 @@ void unit_tests_cli(Cli* cli, FuriString* args, void* context) { minunit_fail = 0; minunit_status = 0; - if(furi_string_cmp_str(args, "help") == 0 || furi_string_cmp_str(args, "?") == 0) { - unit_tests_cli_print_help(); - return; - } - - FuriString* test_suit_to_run = NULL; - - if(furi_string_size(args)) { - FuriString* arg = furi_string_alloc(); - if(args_read_string_and_trim(args, arg)) { - if(furi_string_cmp_str(arg, "log") == 0) { - // read next argument - log level, if fail - show help and return - if(!unit_tests_cli_parse_log_level(args)) { - unit_tests_cli_print_help(); - furi_string_free(arg); - return; - } - - // next argument might be test suit - test_suit_to_run = unit_tests_cli_parse_test_suit(args); - } else { - // if first argument wasn't log - it was exact test suit to run - test_suit_to_run = unit_tests_cli_parse_test_suit(arg); - } - } - furi_string_free(arg); - } - Loader* loader = furi_record_open(RECORD_LOADER); NotificationApp* notification = furi_record_open(RECORD_NOTIFICATION); @@ -197,8 +100,8 @@ void unit_tests_cli(Cli* cli, FuriString* args, void* context) { break; } - if(test_suit_to_run) { - if(furi_string_cmp_str(test_suit_to_run, unit_tests[i].name) == 0) { + if(furi_string_size(args)) { + if(furi_string_cmp_str(args, unit_tests[i].name) == 0) { unit_tests[i].entry(); } else { printf("Skipping %s\r\n", unit_tests[i].name); @@ -231,10 +134,6 @@ void unit_tests_cli(Cli* cli, FuriString* args, void* context) { } } - if(test_suit_to_run) { - furi_string_free(test_suit_to_run); - } - furi_record_close(RECORD_NOTIFICATION); furi_record_close(RECORD_LOADER); } diff --git a/applications/main/subghz/helpers/subghz_custom_event.h b/applications/main/subghz/helpers/subghz_custom_event.h index 0559ac67e..350e68ee6 100644 --- a/applications/main/subghz/helpers/subghz_custom_event.h +++ b/applications/main/subghz/helpers/subghz_custom_event.h @@ -50,7 +50,6 @@ typedef enum { SubGhzCustomEventSceneAnalyzerLock, SubGhzCustomEventSceneAnalyzerUnlock, SubGhzCustomEventSceneSettingLock, - SubGhzCustomEventSceneSettingError, SubGhzCustomEventSceneExit, SubGhzCustomEventSceneStay, diff --git a/applications/main/subghz/scenes/subghz_scene_receiver_config.c b/applications/main/subghz/scenes/subghz_scene_receiver_config.c index c23d93496..82debf4c0 100644 --- a/applications/main/subghz/scenes/subghz_scene_receiver_config.c +++ b/applications/main/subghz/scenes/subghz_scene_receiver_config.c @@ -45,35 +45,6 @@ const float raw_theshold_rssi_value[RAW_THRESHOLD_RSSI_COUNT] = { -40.0f, }; -#define BANDWIDTH_COUNT 16 -const char* const bandwidth_labels[BANDWIDTH_COUNT] = { - "58 kHz", - "68 kHz", - "81 kHz", - "102 kHz", - "116 kHz", - "135 kHz", - "162 kHz", - "203 kHz", - "232 kHz", - "270 kHz", - "325 kHz", - "406 kHz", - "464 kHz", - "541 kHz", - "650 kHz", - "812 kHz", -}; - -// Bandwidths values are ordered from F (58kHz) to 0 (812kHz) -#define BANDWIDTH_INDEX(value) ((uint8_t)15 - ((uint8_t)(value >> 4) & 0x0F)) - -#define MANCHESTER_FLAG_COUNT 2 -const char* const manchester_flag_text[MANCHESTER_FLAG_COUNT] = { - "OFF", - "ON", -}; - #define HOPPING_COUNT 2 const char* const hopping_text[HOPPING_COUNT] = { "OFF", @@ -128,18 +99,6 @@ const uint32_t speaker_value[SPEAKER_COUNT] = { SubGhzSpeakerStateEnable, }; -// Allow advanced edit only on specific preset -bool subghz_scene_receiver_config_can_edit_current_preset(SubGhz* subghz) { - SubGhzRadioPreset* preset = subghz->txrx->preset; - - bool preset_name_allow_edit = - !strcmp(furi_string_get_cstr(preset->name), ADVANCED_AM_PRESET_NAME) || - !strcmp(furi_string_get_cstr(preset->name), "CUSTOM"); - - return preset && preset_name_allow_edit && - subghz_preset_custom_is_ook_modulation(preset->data, preset->data_size); -} - uint8_t subghz_scene_receiver_config_next_frequency(const uint32_t value, void* context) { furi_assert(context); SubGhz* subghz = context; @@ -170,52 +129,6 @@ uint8_t subghz_scene_receiver_config_next_preset(const char* preset_name, void* return index; } -// Advanced settings of preset may change if preset was changed. -// In that case - update values -static void subghz_scene_receiver_config_update_advanced(SubGhz* subghz) { - uint8_t value_index; - - if(subghz->variable_item_bandwidth) { - value_index = BANDWIDTH_INDEX(subghz->txrx->raw_bandwidth); - variable_item_set_current_value_index(subghz->variable_item_bandwidth, value_index); - variable_item_set_current_value_text( - subghz->variable_item_bandwidth, bandwidth_labels[value_index]); - } - - if(subghz->variable_item_datarate) { - variable_item_set_current_value_index(subghz->variable_item_datarate, 0); - - char datarate_str[16] = {0}; - subghz_preset_custom_printf_datarate( - subghz->txrx->raw_datarate, datarate_str, sizeof(datarate_str)); - variable_item_set_current_value_text(subghz->variable_item_datarate, datarate_str); - } - - if(subghz->variable_item_manchester) { - value_index = subghz->txrx->raw_manchester_enabled ? 1 : 0; - - variable_item_set_current_value_index(subghz->variable_item_manchester, value_index); - variable_item_set_current_value_text( - subghz->variable_item_manchester, manchester_flag_text[value_index]); - } -} - -// Apply advanced configuration to advanced am preset -static void subghz_scene_receiver_config_apply_advanced(SubGhz* subghz) { - if(subghz_scene_receiver_config_can_edit_current_preset(subghz)) { - SubGhzRadioPreset* preset = subghz->txrx->preset; - - subghz_preset_custom_set_bandwidth( - preset->data, preset->data_size, subghz->txrx->raw_bandwidth); - - subghz_preset_custom_set_machester_enable( - preset->data, preset->data_size, subghz->txrx->raw_manchester_enabled); - - subghz_preset_custom_set_datarate( - preset->data, preset->data_size, subghz->txrx->raw_datarate); - } -} - uint8_t subghz_scene_receiver_config_hopper_value_index( const uint32_t value, const uint32_t values[], @@ -301,8 +214,6 @@ static void subghz_scene_receiver_config_set_preset(VariableItem* item) { subghz->txrx->preset->frequency, subghz_setting_get_preset_data(subghz->setting, index), subghz_setting_get_preset_data_size(subghz->setting, index)); - - subghz_scene_receiver_config_update_advanced(subghz); } static void subghz_scene_receiver_config_set_rssi_threshold(VariableItem* item) { @@ -396,107 +307,6 @@ static void subghz_scene_receiver_config_set_raw_threshold_rssi(VariableItem* it subghz->txrx->raw_threshold_rssi = raw_theshold_rssi_value[index]; } -static void subghz_scene_receiver_config_set_raw_ook_bandwidth(VariableItem* item) { - SubGhz* subghz = variable_item_get_context(item); - if(subghz_scene_receiver_config_can_edit_current_preset(subghz)) { - // update bandwidth value from selected index - uint8_t index = variable_item_get_current_value_index(item); - subghz->txrx->raw_bandwidth = subghz_preset_custom_bandwidth_values[index]; - - subghz_scene_receiver_config_update_advanced(subghz); - } else { - furi_string_set( - subghz->error_str, "Read-only\nsetting!\nUse '" ADVANCED_AM_PRESET_NAME "'\npreset."); - view_dispatcher_send_custom_event( - subghz->view_dispatcher, SubGhzCustomEventSceneSettingError); - } -} - -static void subghz_scene_receiver_config_set_manchester_flag(VariableItem* item) { - SubGhz* subghz = variable_item_get_context(item); - if(subghz_scene_receiver_config_can_edit_current_preset(subghz)) { - // update enable flag from view - uint8_t index = variable_item_get_current_value_index(item); - subghz->txrx->raw_manchester_enabled = index == 0 ? false : true; - - subghz_scene_receiver_config_update_advanced(subghz); - } else { - furi_string_set( - subghz->error_str, "Read-only\nsetting!\nUse '" ADVANCED_AM_PRESET_NAME "'\npreset."); - view_dispatcher_send_custom_event( - subghz->view_dispatcher, SubGhzCustomEventSceneSettingError); - } -} - -static void subghz_scene_receiver_config_datarate_input_callback(void* context) { - furi_assert(context); - SubGhz* subghz = context; - - float value = atoff(subghz->datarate_input_str); - if(value != 0 && value > 0) { - subghz->txrx->raw_datarate = value; - subghz_scene_receiver_config_update_advanced(subghz); - } - - // show list view - view_dispatcher_switch_to_view(subghz->view_dispatcher, SubGhzViewIdVariableItemList); -} - -static bool subghz_scene_receiver_config_datarate_input_validate( - const char* text, - FuriString* error, - void* context) { - UNUSED(context); - - float value = atoff(text); - if(value == 0) { - furi_string_printf(error, "Cannot parse\r\nvalue"); - } else if(value < 0) { - furi_string_printf(error, "Value\r\nshould be\r\ngreater\r\nthan 0"); - } else { - return true; - } - - return false; -} - -static void subghz_scene_receiver_config_show_datarate_input(SubGhz* subghz) { - TextInput* text_input = subghz->text_input; - - snprintf( - subghz->datarate_input_str, - sizeof(subghz->datarate_input_str), - "%.2f", - (double)subghz->txrx->raw_datarate); - - text_input_set_header_text(text_input, "Datarate bauds (not kBauds)"); - text_input_set_result_callback( - text_input, - subghz_scene_receiver_config_datarate_input_callback, - subghz, - subghz->datarate_input_str, - sizeof(subghz->datarate_input_str), - false); - - text_input_set_validator( - text_input, subghz_scene_receiver_config_datarate_input_validate, NULL); - view_dispatcher_switch_to_view(subghz->view_dispatcher, SubGhzViewIdTextInput); -} - -static void subghz_scene_receiver_config_set_datarate(VariableItem* item) { - SubGhz* subghz = variable_item_get_context(item); - if(subghz_scene_receiver_config_can_edit_current_preset(subghz)) { - // reset value index in order to show '>' symbol always - variable_item_set_current_value_index(item, 0); - subghz_scene_receiver_config_show_datarate_input(subghz); - } else { - furi_string_set( - subghz->error_str, "Read-only\nsetting!\nUse '" ADVANCED_AM_PRESET_NAME "'\npreset."); - view_dispatcher_send_custom_event( - subghz->view_dispatcher, SubGhzCustomEventSceneSettingError); - } -} - static void subghz_scene_receiver_config_var_list_enter_callback(void* context, uint32_t index) { furi_assert(context); SubGhz* subghz = context; @@ -627,33 +437,6 @@ void subghz_scene_receiver_config_on_enter(void* context) { subghz->txrx->raw_threshold_rssi, raw_theshold_rssi_value, RAW_THRESHOLD_RSSI_COUNT); variable_item_set_current_value_index(item, value_index); variable_item_set_current_value_text(item, raw_theshold_rssi_text[value_index]); - - // Advanced MODEM settings. RW only for ADVANCED_AM_PRESET_NAME - // Bandwidth - subghz->variable_item_bandwidth = variable_item_list_add( - subghz->variable_item_list, - "Bandwidth:", - BANDWIDTH_COUNT, - subghz_scene_receiver_config_set_raw_ook_bandwidth, - subghz); - - // Data rate (editable via OK click) - subghz->variable_item_datarate = variable_item_list_add( - subghz->variable_item_list, - "Data rate:", - 2, - subghz_scene_receiver_config_set_datarate, - subghz); - - // Manchester codec flag - subghz->variable_item_manchester = variable_item_list_add( - subghz->variable_item_list, - "Manch. Enc.:", - MANCHESTER_FLAG_COUNT, - subghz_scene_receiver_config_set_manchester_flag, - subghz); - - subghz_scene_receiver_config_update_advanced(subghz); } view_dispatcher_switch_to_view(subghz->view_dispatcher, SubGhzViewIdVariableItemList); } @@ -667,11 +450,6 @@ bool subghz_scene_receiver_config_on_event(void* context, SceneManagerEvent even subghz->lock = SubGhzLockOn; scene_manager_previous_scene(subghz->scene_manager); consumed = true; - } else if(event.event == SubGhzCustomEventSceneSettingError) { - scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowErrorSub); - scene_manager_set_scene_state( - subghz->scene_manager, SubGhzSceneShowErrorSub, event.event); - consumed = true; } } return consumed; @@ -679,16 +457,6 @@ bool subghz_scene_receiver_config_on_event(void* context, SceneManagerEvent even void subghz_scene_receiver_config_on_exit(void* context) { SubGhz* subghz = context; - - // reset UI variable list items (next scene may be not RAW config) - subghz->variable_item_bandwidth = NULL; - subghz->variable_item_datarate = NULL; - subghz->variable_item_manchester = NULL; - text_input_set_validator(subghz->text_input, NULL, NULL); - - // apply advanced preset variables (if applicable) - subghz_scene_receiver_config_apply_advanced(subghz); - variable_item_list_set_selected_item(subghz->variable_item_list, 0); variable_item_list_reset(subghz->variable_item_list); subghz_last_settings_save(subghz->last_settings); diff --git a/applications/main/subghz/scenes/subghz_scene_show_error_sub.c b/applications/main/subghz/scenes/subghz_scene_show_error_sub.c index 2943c764a..113e7ae74 100644 --- a/applications/main/subghz/scenes/subghz_scene_show_error_sub.c +++ b/applications/main/subghz/scenes/subghz_scene_show_error_sub.c @@ -26,16 +26,8 @@ bool subghz_scene_show_error_sub_on_event(void* context, SceneManagerEvent event SubGhz* subghz = context; if(event.type == SceneManagerEventTypeCustom) { if(event.event == SubGhzCustomEventSceneShowErrorSub) { - if(scene_manager_get_scene_state(subghz->scene_manager, SubGhzSceneShowErrorSub) == - SubGhzCustomEventSceneSettingError) { - scene_manager_set_scene_state( - subghz->scene_manager, SubGhzSceneReadRAW, SubGhzCustomEventManagerSet); - scene_manager_search_and_switch_to_previous_scene( - subghz->scene_manager, SubGhzSceneReceiverConfig); - } else { - scene_manager_search_and_switch_to_previous_scene( - subghz->scene_manager, SubGhzSceneStart); - } + scene_manager_search_and_switch_to_previous_scene( + subghz->scene_manager, SubGhzSceneStart); return true; } } diff --git a/applications/main/subghz/scenes/subghz_scene_start.c b/applications/main/subghz/scenes/subghz_scene_start.c index 62e30784f..8e6e01469 100644 --- a/applications/main/subghz/scenes/subghz_scene_start.c +++ b/applications/main/subghz/scenes/subghz_scene_start.c @@ -12,25 +12,6 @@ enum SubmenuIndex { SubmenuIndexReadRAW, }; -void subghz_scene_start_remove_advanced_preset(SubGhz* subghz) { - // delete operation is harmless - subghz_setting_delete_custom_preset(subghz->setting, ADVANCED_AM_PRESET_NAME); -} - -void subghz_scene_start_load_advanced_preset(SubGhz* subghz) { - for(uint8_t i = 0; i < subghz_setting_get_preset_count(subghz->setting); i++) { - if(!strcmp(subghz_setting_get_preset_name(subghz->setting, i), ADVANCED_AM_PRESET_NAME)) { - return; // already exists - } - } - - // Load custom advanced AM preset with configurable CFGMDM settings - FlipperFormat* advanced_am_preset = subghz_preset_custom_advanced_am_preset_alloc(); - subghz_setting_load_custom_preset( - subghz->setting, ADVANCED_AM_PRESET_NAME, advanced_am_preset); - flipper_format_free(advanced_am_preset); -} - void subghz_scene_start_submenu_callback(void* context, uint32_t index) { SubGhz* subghz = context; view_dispatcher_send_custom_event(subghz->view_dispatcher, index); @@ -92,14 +73,12 @@ bool subghz_scene_start_on_event(void* context, SceneManagerEvent event) { return true; } else if(event.type == SceneManagerEventTypeCustom) { if(event.event == SubmenuIndexReadRAW) { - subghz_scene_start_load_advanced_preset(subghz); scene_manager_set_scene_state( subghz->scene_manager, SubGhzSceneStart, SubmenuIndexReadRAW); subghz->txrx->rx_key_state = SubGhzRxKeyStateIDLE; scene_manager_next_scene(subghz->scene_manager, SubGhzSceneReadRAW); return true; } else if(event.event == SubmenuIndexRead) { - subghz_scene_start_remove_advanced_preset(subghz); scene_manager_set_scene_state( subghz->scene_manager, SubGhzSceneStart, SubmenuIndexRead); scene_manager_next_scene(subghz->scene_manager, SubGhzSceneReceiver); diff --git a/applications/main/subghz/subghz_i.c b/applications/main/subghz/subghz_i.c index bac25759a..77ee7c950 100644 --- a/applications/main/subghz/subghz_i.c +++ b/applications/main/subghz/subghz_i.c @@ -30,12 +30,6 @@ void subghz_preset_init( subghz->txrx->preset->frequency = frequency; subghz->txrx->preset->data = preset_data; subghz->txrx->preset->data_size = preset_data_size; - - subghz->txrx->raw_bandwidth = - subghz_preset_custom_get_bandwidth(preset_data, preset_data_size); - subghz->txrx->raw_manchester_enabled = - subghz_preset_custom_get_machester_enable(preset_data, preset_data_size); - subghz->txrx->raw_datarate = subghz_preset_custom_get_datarate(preset_data, preset_data_size); } bool subghz_set_preset(SubGhz* subghz, const char* preset) { diff --git a/applications/main/subghz/subghz_i.h b/applications/main/subghz/subghz_i.h index a6c96cb69..d1111fb09 100644 --- a/applications/main/subghz/subghz_i.h +++ b/applications/main/subghz/subghz_i.h @@ -3,7 +3,6 @@ #include "helpers/subghz_types.h" #include "helpers/subghz_error_type.h" #include -#include #include "subghz.h" #include "views/receiver.h" #include "views/transmitter.h" @@ -79,13 +78,6 @@ struct SubGhzTxRx { float raw_threshold_rssi; uint8_t raw_threshold_rssi_low_count; - - // one of the 16 possible bandwidth values - uint8_t raw_bandwidth; - // datarate in bauds - float raw_datarate; - // flag if manchester encoding/decoding enabled - bool raw_manchester_enabled; }; typedef struct SubGhzTxRx SubGhzTxRx; @@ -114,13 +106,6 @@ struct SubGhz { SubGhzViewTransmitter* subghz_transmitter; VariableItemList* variable_item_list; - // Advanced config items - VariableItem* variable_item_bandwidth; // specific config list view item: bandwidth - VariableItem* variable_item_datarate; // specific config list view item: data rate - VariableItem* variable_item_manchester; // specific config list view item: manchester enc flag - // Advanced config strings - char datarate_input_str[16]; - SubGhzFrequencyAnalyzer* subghz_frequency_analyzer; SubGhzReadRAW* subghz_read_raw; bool raw_send_only; diff --git a/lib/subghz/helpers/subghz_config_preset_custom.c b/lib/subghz/helpers/subghz_config_preset_custom.c deleted file mode 100644 index a7247afc1..000000000 --- a/lib/subghz/helpers/subghz_config_preset_custom.c +++ /dev/null @@ -1,326 +0,0 @@ -#include "subghz_config_preset_custom.h" - -#include -#include -#include // UNUSED() -#include // furi_assert() -#include // log2(), floor() - -#include - -// https://www.ti.com/lit/ds/symlink/cc1101.pdf?ts=1671943815135 -// page 35. -// 12 Data Rate Programming -// -#define DATARATE_FUNC_CHIP_FOSC 26000000.0 /* 26MHz */ -#define DATARATE_FUNC_DIVIDER (1 << 28) /* 2 pow 28 */ -#define DATARATE_FUNC_MULTIPLIER \ - (DATARATE_FUNC_CHIP_FOSC / DATARATE_FUNC_DIVIDER) /* should be 0.09685754 */ - -#define DATARATE_EXP_FORMULA_DIVISIBLE (1 << 20) /* 2 pow 20 */ -#define DATARATE_EXP_FORMULA_MULTIPLIER \ - (DATARATE_EXP_FORMULA_DIVISIBLE / DATARATE_FUNC_CHIP_FOSC) /* should be 0.04032984 */ - -#define DATARATE_MNT_FORMULA_DIVISIBLE (1 << 28) /* 2 pow 28 */ -#define DATARATE_MNT_FORMULA_MULTIPLIER \ - (DATARATE_MNT_FORMULA_DIVISIBLE / DATARATE_FUNC_CHIP_FOSC) /* should be 10.3244406 */ -// - -#define SUGHZ_CONFIG_TAG "SubGHz_Config" - -uint8_t furi_hal_subghz_preset_ook_custom_async_regs[PRESET_OOK_CUSTOM_ADVANCED_AM_SIZE] = {0}; - -/** Check if cursom preset is AM (OOK) modulation - * - * This will check MOD_FORMAT bits in CC1101_MDMCFG2 register - * If preset data doesn have this register - will return false. - * This function will not fail in any case - * - * @param preset_data Custom preset data (registers and patable) - * @param data_len Data length - */ -bool subghz_preset_custom_is_ook_modulation(const uint8_t* preset_data, uint8_t data_len) { - if(preset_data != NULL) { - for(uint8_t i = 2; i <= data_len; i += 2) { - if(preset_data[i - 2] == CC1101_MDMCFG2) { - return (preset_data[i - 1] & 0b01110000) == 0x30; - } - } - } - return false; -} - -/** Get bandwidth value from preset data. - * - * This will get HIGHER bits in CC1101_MDMCFG4 register - * If CC1101_MDMCFG4 is not found in preset data - will return - * CH_BANDWIDTH_INVALID (0xFF) - * If there is ANY low 4 bits in returned value - the value is invalid - * - * @param preset_data Custom preset data (registers and patable) - * @param data_len Data length - */ -uint8_t subghz_preset_custom_get_bandwidth(const uint8_t* preset_data, uint8_t data_len) { - if(preset_data != NULL) { - for(uint8_t i = 2; i <= data_len; i += 2) { - if(preset_data[i - 2] == CC1101_MDMCFG4) { - return (preset_data[i - 1] & 0b11110000); - } - } - } - return CH_BANDWIDTH_INVALID; -} - -/** Set bandwidth value to preset data. - * - * This will set HIGHER bits in CC1101_MDMCFG4 register - * If CC1101_MDMCFG4 is not found in preset data - will do nothing and return false - * If there are ANY low 4 bits in provided value - they will be ignored - * - * @param preset_data Custom preset data (registers and patable) - * @param data_len Data length - * @param value New bandwidth value. See macros definition for possible values - */ -bool subghz_preset_custom_set_bandwidth(uint8_t* preset_data, uint8_t data_len, uint8_t value) { - if(preset_data != NULL) { - for(uint8_t i = 2; i <= data_len; i += 2) { - if(preset_data[i - 2] == CC1101_MDMCFG4) { - preset_data[i - 1] = (preset_data[i - 1] & 0b00001111) | (0b11110000 & value); - return true; - } - } - } - return false; -} - -/** Get data rate value from preset data. - * - * This will get DRATE_M and DRATE_E bits from CC1101_MDMCFG3 and CC1101_MDMCFG4 registers - * and calculate the value for 26MHz chip oscillator by formula from datasheet. - * - * If CC1101_MDMCFG[3:4] are not found in preset data - will return `-1` - * - * @param preset_data Custom preset data (registers and patable) - * @param data_len Data length - */ -float subghz_preset_custom_get_datarate(const uint8_t* preset_data, uint8_t data_len) { - if(preset_data != NULL) { - uint8_t mantissa = 0xFF; - uint8_t exponent = 0xFF; // Invalid, only 4 lower bits are singificant - - uint8_t step = 0; - - for(uint8_t i = 2; i <= data_len && step < 2; i += 2) { - if(preset_data[i - 2] == CC1101_MDMCFG4) { - exponent = preset_data[i - 1] & 0b00001111; - step++; - } else if(preset_data[i - 2] == CC1101_MDMCFG3) { - mantissa = preset_data[i - 1]; - step++; - } - } - - if(step == 2) { - return (float)((256 + mantissa) * (1 << exponent) * DATARATE_FUNC_MULTIPLIER); - } - } - return -1; -} - -/** Set data rate value to preset data. - * - * This will update DRATE_M and DRATE_E bits from CC1101_MDMCFG3 and CC1101_MDMCFG4 registers - * with calculated values for 26MHz chip oscillator by formula from datasheet. - * - * If CC1101_MDMCFG[3:4] are not found in preset data - will return false - * - * @param preset_data Custom preset data (registers and patable) - * @param data_len Data length - * @param value value in kBaud - */ -bool subghz_preset_custom_set_datarate(uint8_t* preset_data, uint8_t data_len, float value) { - if(preset_data != NULL) { - uint8_t* pMantissa = NULL; - uint8_t* pExponent = NULL; - - uint8_t step = 0; - for(uint8_t i = 2; i <= data_len && step < 2; i += 2) { - if(preset_data[i - 2] == CC1101_MDMCFG4) { - pExponent = &preset_data[i - 1]; - step++; - } else if(preset_data[i - 2] == CC1101_MDMCFG3) { - pMantissa = &preset_data[i - 1]; - step++; - } - } - - // Has both registers in data - calculate values - if(step == 2) { - // │ value * 2^20 │ - // DRATE_E = │log2(──────────────)│ - // └ Fosc ┘ - - double exponent = floor(log2(value * DATARATE_EXP_FORMULA_MULTIPLIER)); - uint8_t datarate_e = (uint8_t)exponent; - - // value * 2^28 - // DRATE_M = (────────────────────) - 256 - // Fosc * 2^DRATE_E - double mantissa = - floor((value * DATARATE_MNT_FORMULA_MULTIPLIER) / (1 << datarate_e) + 0.5) - 256; - - // If DRATE_M is rounded to the nearest integer and becomes 256, increment DRATE_E and use DRATE_M = 0. - if(mantissa >= 256) { - mantissa = 0; - datarate_e += 1; - } - uint8_t datarate_m = (uint8_t)mantissa; - - *pExponent = (*pExponent & 0b11110000) | (datarate_e & 0b00001111); - *pMantissa = datarate_m; - - return true; - } - } - - return false; -} - -/** Print datarate value to string - * - * This is just convenience function - * - * @param datarate datarate obtained from `subghz_preset_custom_get_datarate` function - * @param string Target print buffer - * @param size Target print buffer size - */ -void subghz_preset_custom_printf_datarate(float datarate, char* string, uint8_t size) { - float kBaudRate = datarate / 1000.0f; - snprintf( - string, - size, - "%lu.%02lu kBd", - (uint32_t)(kBaudRate), // decimal part - (uint32_t)((kBaudRate - (uint32_t)kBaudRate) * 100) // fractional part multiplied by 100 - ); -} - -/** Get Manchester encoding/decoding flag value from preset data. - * - * This will get MANCHESTER_EN (3-rd) bit in CC1101_MDMCFG2 register - * If CC1101_MDMCFG2 is not found in preset data - will return false - * - * @param preset_data Custom preset data (registers and patable) - * @param data_len Data length - */ -bool subghz_preset_custom_get_machester_enable(const uint8_t* preset_data, uint8_t data_len) { - if(preset_data != NULL) { - for(uint8_t i = 2; i <= data_len; i += 2) { - if(preset_data[i - 2] == CC1101_MDMCFG2) { - return (preset_data[i - 1] & 0b00001000); - } - } - } - return false; -} - -/** Set Manchester encoding/decoding flag value to preset data. - * - * This will set MANCHESTER_EN (3-rd) bit in CC1101_MDMCFG2 register - * If CC1101_MDMCFG2 is not found in preset data - will return false - * - * @param preset_data Custom preset data (registers and patable) - * @param data_len Data length - */ -bool subghz_preset_custom_set_machester_enable(uint8_t* preset_data, uint8_t data_len, bool value) { - if(preset_data != NULL) { - for(uint8_t i = 2; i <= data_len; i += 2) { - if(preset_data[i - 2] == CC1101_MDMCFG2) { - preset_data[i - 1] = (preset_data[i - 1] & 0b11110111) | (0b00001000 * value); - return true; - } - } - } - return false; -} - -/** - * Initialize custom preset data - */ -void subghz_preset_custom_init_advanced_am_preset() { - FURI_LOG_D(SUGHZ_CONFIG_TAG, "Initializing AM preset with custom Modem configuration"); - - if(furi_hal_subghz_preset_ook_custom_async_regs[0]) { - // already initialized - FURI_LOG_D(SUGHZ_CONFIG_TAG, "Already initialized"); - return; - } - - // Copy default AM270 preset - memcpy( - &furi_hal_subghz_preset_ook_custom_async_regs, - &furi_hal_subghz_preset_ook_270khz_async_regs, - sizeof(furi_hal_subghz_preset_ook_270khz_async_regs)); - - const uint8_t ModemConfigStart = 4; - -#if FURI_DEBUG - const uint8_t ModemConfigEnd = ModemConfigStart + MODEM_CONFIG_REGISTERS_COUNT; - for(uint8_t i = ModemConfigStart; i < ModemConfigEnd; ++i) { - // Check we'll overwrite correct settings - furi_assert( - furi_hal_subghz_preset_ook_custom_async_regs[i * 2 + 0] == - furi_hal_subghz_custom_modulation_regs[i - ModemConfigStart][0]); - } -#endif - - // Copy CUSTOM Modem preset - memcpy( - &furi_hal_subghz_preset_ook_custom_async_regs[ModemConfigStart * 2], - &furi_hal_subghz_custom_modulation_regs, - sizeof(furi_hal_subghz_custom_modulation_regs)); - - // Copy default AM270 patable - memcpy( - &furi_hal_subghz_preset_ook_custom_async_regs[sizeof( - furi_hal_subghz_preset_ook_270khz_async_regs)], - &furi_hal_subghz_preset_ook_async_patable, - sizeof(furi_hal_subghz_preset_ook_async_patable)); - - // Here at the end we should have - // 00 00 - -#if FURI_DEBUG - FURI_LOG_D(SUGHZ_CONFIG_TAG, "Custom OOK preset created"); - - for(uint8_t i = 0; i < PRESET_OOK_CUSTOM_ADVANCED_AM_SIZE; i += 2) { - FURI_LOG_D( - SUGHZ_CONFIG_TAG, - "Register: 0x%hhX, Value: 0x%hhX", - furi_hal_subghz_preset_ook_custom_async_regs[i * 2 + 0], - furi_hal_subghz_preset_ook_custom_async_regs[i * 2 + 1]); - } -#endif - - FURI_LOG_D(SUGHZ_CONFIG_TAG, "Done"); -} - -/** - * Create subghz preset file with custom am preset - * this is used for preset initialization if subghz app - */ -FlipperFormat* subghz_preset_custom_advanced_am_preset_alloc() { - FlipperFormat* advanced_am_preset = flipper_format_string_alloc(); - - subghz_preset_custom_init_advanced_am_preset(); - - flipper_format_write_hex( - advanced_am_preset, - (const char*)"Custom_preset_data", - (const uint8_t*)&furi_hal_subghz_preset_ook_custom_async_regs[0], - sizeof(furi_hal_subghz_preset_ook_custom_async_regs)); - - flipper_format_rewind(advanced_am_preset); - - return advanced_am_preset; -} diff --git a/lib/subghz/helpers/subghz_config_preset_custom.h b/lib/subghz/helpers/subghz_config_preset_custom.h deleted file mode 100644 index 318197f5d..000000000 --- a/lib/subghz/helpers/subghz_config_preset_custom.h +++ /dev/null @@ -1,193 +0,0 @@ -#pragma once - -#include -#include /* memcpy() */ - -#define ADVANCED_AM_PRESET_NAME "AM*" - -// Awailable bandwidth values -// Setup in MDMCFG4 register -#define CH_BANDWIDTH_058 0b11110000 -#define CH_BANDWIDTH_068 0b11100000 -#define CH_BANDWIDTH_081 0b11010000 -#define CH_BANDWIDTH_102 0b11000000 - -#define CH_BANDWIDTH_116 0b10110000 -#define CH_BANDWIDTH_135 0b10100000 -#define CH_BANDWIDTH_162 0b10010000 -#define CH_BANDWIDTH_203 0b10000000 - -#define CH_BANDWIDTH_232 0b01110000 -#define CH_BANDWIDTH_270 0b01100000 -#define CH_BANDWIDTH_325 0b01010000 -#define CH_BANDWIDTH_406 0b01000000 - -#define CH_BANDWIDTH_464 0b00110000 -#define CH_BANDWIDTH_541 0b00100000 -#define CH_BANDWIDTH_650 0b00010000 -#define CH_BANDWIDTH_812 0b00000000 - -#define CH_BANDWIDTH_INVALID 0xFF - -static const uint8_t subghz_preset_custom_bandwidth_values[] = { - CH_BANDWIDTH_058, - CH_BANDWIDTH_068, - CH_BANDWIDTH_081, - CH_BANDWIDTH_102, - - CH_BANDWIDTH_116, - CH_BANDWIDTH_135, - CH_BANDWIDTH_162, - CH_BANDWIDTH_203, - - CH_BANDWIDTH_232, - CH_BANDWIDTH_270, - CH_BANDWIDTH_325, - CH_BANDWIDTH_406, - - CH_BANDWIDTH_464, - CH_BANDWIDTH_541, - CH_BANDWIDTH_650, - CH_BANDWIDTH_812, -}; -#define CH_BANDWIDTH_NUM (sizeof(subghz_preset_custom_bandwidth_values) / sizeof(uint8_t)) - -#define DATARATE_EXPONENT_3_79_kBaud 0b00000111 // 7 -#define DATARATE_MANTISSA_3_79_kBaud 0x32 - -#define CHANNEL_SPACING_25_EXPONENT 0b00000000 /* last bit */ -#define CHANNEL_SPACING_25_MANTISSA 0x00 - -#define MODEM_CONFIG_REGISTERS_COUNT 5 -#define PRESET_OOK_CUSTOM_ADVANCED_AM_SIZE \ - sizeof(furi_hal_subghz_preset_ook_270khz_async_regs) + \ - sizeof(furi_hal_subghz_preset_ook_async_patable) - -extern uint8_t furi_hal_subghz_preset_ook_custom_async_regs[PRESET_OOK_CUSTOM_ADVANCED_AM_SIZE]; - -static const uint8_t furi_hal_subghz_custom_modulation_regs[MODEM_CONFIG_REGISTERS_COUNT][2] = { - // Channel spacing is 25kHz, no Forward Error Correction, 2 preamble bytes (will be ignored) - {CC1101_MDMCFG0, CHANNEL_SPACING_25_MANTISSA}, - {CC1101_MDMCFG1, 0x00 | CHANNEL_SPACING_25_EXPONENT}, - - // [0:2] SYNC_MODE = 00 // No preamble/sync - // [3:3] MANCHESTER_EN = 0 // Disable - // [4:6] MOD_FORMAT = 03 // Format ASK/OOK - // [7:7] DEM_DCFILT_OFF = 0 // Enable - {CC1101_MDMCFG2, 0x30}, - - // 3.79 kBaud data rate (mantissa in 3rd register) - {CC1101_MDMCFG3, DATARATE_MANTISSA_3_79_kBaud}, - - // 270.8333 kHz Rx BW filer (hi) and 3.79 kBaud data rate (exponent in 4th register) - {CC1101_MDMCFG4, DATARATE_EXPONENT_3_79_kBaud | CH_BANDWIDTH_270}, -}; - -#ifdef __cplusplus -extern "C" { -#endif - -/** Check if cursom preset is AM (OOK) modulation - * - * This will check MOD_FORMAT bits in CC1101_MDMCFG2 register - * If preset data doesn have this register - will return false. - * This function will not fail in any case - * - * @param preset_data Custom preset data (registers and patable) - * @param data_len Data length - */ -bool subghz_preset_custom_is_ook_modulation(const uint8_t* preset_data, uint8_t data_len); - -/** Get bandwidth value from preset data. - * - * This will get HIGHER bits in CC1101_MDMCFG4 register - * If CC1101_MDMCFG4 is not found in preset data - will return - * CH_BANDWIDTH_INVALID (0xFF) - * If there is ANY low 4 bits in returned value - the value is invalid - * - * @param preset_data Custom preset data (registers and patable) - * @param data_len Data length - */ -uint8_t subghz_preset_custom_get_bandwidth(const uint8_t* preset_data, uint8_t data_len); - -/** Set bandwidth value to preset data. - * - * This will set HIGHER bits in CC1101_MDMCFG4 register - * If CC1101_MDMCFG4 is not found in preset data - will do nothing and return false - * If there are ANY low 4 bits in provided value - they will be ignored - * - * @param preset_data Custom preset data (registers and patable) - * @param data_len Data length - * @param value New bandwidth value. See macros definition for possible values - */ -bool subghz_preset_custom_set_bandwidth(uint8_t* preset_data, uint8_t data_len, uint8_t value); - -/** Get data rate value from preset data. - * - * This will get DRATE_M and DRATE_E bits from CC1101_MDMCFG3 and CC1101_MDMCFG4 registers - * and calculate the value for 26MHz chip oscillator by formula from datasheet. - * - * If CC1101_MDMCFG[3:4] are not found in preset data - will return `-1` - * - * @param preset_data Custom preset data (registers and patable) - * @param data_len Data length - */ -float subghz_preset_custom_get_datarate(const uint8_t* preset_data, uint8_t data_len); - -/** Set data rate value to preset data. - * - * This will update DRATE_M and DRATE_E bits from CC1101_MDMCFG3 and CC1101_MDMCFG4 registers - * with calculated values for 26MHz chip oscillator by formula from datasheet. - * - * If CC1101_MDMCFG[3:4] are not found in preset data - will return false - * - * @param preset_data Custom preset data (registers and patable) - * @param data_len Data length - * @param value value in kBaud - */ -bool subghz_preset_custom_set_datarate(uint8_t* preset_data, uint8_t data_len, float value); - -/** Print datarate value to string - * - * This is just conviniece function - * - * @param datarate datarate obtained from `subghz_preset_custom_get_datarate` function - * @param string Target print buffer - * @param size Target print buffer size - */ -void subghz_preset_custom_printf_datarate(float datarate, char* string, uint8_t size); - -/** Get Manchester encoding/decoding flag value from preset data. - * - * This will get MANCHESTER_EN (3-rd) bit in CC1101_MDMCFG2 register - * If CC1101_MDMCFG2 is not found in preset data - will return false - * - * @param preset_data Custom preset data (registers and patable) - * @param data_len Data length - */ -bool subghz_preset_custom_get_machester_enable(const uint8_t* preset_data, uint8_t data_len); - -/** Set Manchester encoding/decoding flag value to preset data. - * - * This will set MANCHESTER_EN (3-rd) bit in CC1101_MDMCFG2 register - * If CC1101_MDMCFG2 is not found in preset data - will return false - * - * @param preset_data Custom preset data (registers and patable) - * @param data_len Data length - */ -bool subghz_preset_custom_set_machester_enable(uint8_t* preset_data, uint8_t data_len, bool value); - -/** - * Initialize advanced am custom preset - */ -void subghz_preset_custom_init_advanced_am_preset(); - -/** - * Create subghz preset file with custom am preset - * this is used for preset initialization if subghz app - */ -struct FlipperFormat* subghz_preset_custom_advanced_am_preset_alloc(); - -#ifdef __cplusplus -} -#endif \ No newline at end of file From 0b92e5ae74c64e1e67c513b928134b6673c1921d Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Wed, 18 Jan 2023 19:16:20 +0300 Subject: [PATCH 083/506] Fix various issues --- lib/subghz/protocols/somfy_telis.c | 11 +++++------ lib/subghz/protocols/somfy_telis.h | 3 +-- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/lib/subghz/protocols/somfy_telis.c b/lib/subghz/protocols/somfy_telis.c index 0952ff2ff..689cbf583 100644 --- a/lib/subghz/protocols/somfy_telis.c +++ b/lib/subghz/protocols/somfy_telis.c @@ -31,8 +31,6 @@ struct SubGhzProtocolEncoderSomfyTelis { SubGhzProtocolBlockEncoder encoder; SubGhzBlockGeneric generic; - - SubGhzKeystore* keystore; }; typedef enum { @@ -76,11 +74,11 @@ const SubGhzProtocol subghz_protocol_somfy_telis = { }; void* subghz_protocol_encoder_somfy_telis_alloc(SubGhzEnvironment* environment) { + UNUSED(environment); SubGhzProtocolEncoderSomfyTelis* instance = malloc(sizeof(SubGhzProtocolEncoderSomfyTelis)); instance->base.protocol = &subghz_protocol_somfy_telis; instance->generic.protocol_name = instance->base.protocol->name; - instance->keystore = subghz_environment_get_keystore(environment); instance->encoder.repeat = 10; instance->encoder.size_upload = 512; @@ -641,14 +639,15 @@ void subghz_protocol_decoder_somfy_telis_get_string(void* context, FuriString* o furi_string_cat_printf( output, "%s %db\r\n" - "Key:0x%X\r\n" - "Address:0x%03lX \r\n" + "Key:0x%lX%08lX\r\n" + "Sn:0x%06lX \r\n" "Cnt:0x%04lX\r\n" "Btn:%s\r\n", instance->generic.protocol_name, instance->generic.data_count_bit, - (uint16_t)(instance->generic.data >> 48), + (uint32_t)(instance->generic.data >> 32), + (uint32_t)instance->generic.data, instance->generic.serial, instance->generic.cnt, subghz_protocol_somfy_telis_get_name_button(instance->generic.btn)); diff --git a/lib/subghz/protocols/somfy_telis.h b/lib/subghz/protocols/somfy_telis.h index 3d5cd22f1..b5e989866 100644 --- a/lib/subghz/protocols/somfy_telis.h +++ b/lib/subghz/protocols/somfy_telis.h @@ -14,7 +14,7 @@ extern const SubGhzProtocol subghz_protocol_somfy_telis; /** * Allocate SubGhzProtocolEncoderSomfyTelis. * @param environment Pointer to a SubGhzEnvironment instance - * @return SubGhzProtocolEncoderSomfyTelis* pointer to a SubGhzProtocolEncoderSSomfyTelis instance + * @return SubGhzProtocolEncoderSomfyTelis* pointer to a SubGhzProtocolEncoderSomfyTelis instance */ void* subghz_protocol_encoder_somfy_telis_alloc(SubGhzEnvironment* environment); @@ -31,7 +31,6 @@ void subghz_protocol_encoder_somfy_telis_free(void* context); * @param serial Serial number, 24 bit * @param btn Button number, 8 bit * @param cnt Counter value, 16 bit - * @param manufacture_name Name of manufacturer's key * @param preset Modulation, SubGhzRadioPreset * @return true On success */ From fb39d6e679bea66d394619b1429da31bf8e0154f Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Wed, 18 Jan 2023 19:19:49 +0300 Subject: [PATCH 084/506] Format code --- .../main/infrared/scenes/infrared_scene_start.c | 1 - applications/plugins/unitemp/sensors/BMP180.c | 3 +-- applications/services/power/power_service/power.c | 6 +++--- .../scenes/desktop_settings_scene_start.c | 13 +++---------- 4 files changed, 7 insertions(+), 16 deletions(-) diff --git a/applications/main/infrared/scenes/infrared_scene_start.c b/applications/main/infrared/scenes/infrared_scene_start.c index 32d357dc5..28aa384c4 100644 --- a/applications/main/infrared/scenes/infrared_scene_start.c +++ b/applications/main/infrared/scenes/infrared_scene_start.c @@ -71,7 +71,6 @@ bool infrared_scene_start_on_event(void* context, SceneManagerEvent event) { } else if( submenu_index == SubmenuIndexLearnNewRemote || submenu_index == SubmenuIndexLearnNewRemoteRaw) { - // enable automatic signal decoding if "Learn New Remote" // disable automatic signal decoding if "Learn New Remote (RAW)" infrared_worker_rx_enable_signal_decoding( diff --git a/applications/plugins/unitemp/sensors/BMP180.c b/applications/plugins/unitemp/sensors/BMP180.c index d17e78c09..e98c05ade 100644 --- a/applications/plugins/unitemp/sensors/BMP180.c +++ b/applications/plugins/unitemp/sensors/BMP180.c @@ -101,8 +101,7 @@ bool unitemp_BMP180_init(Sensor* sensor) { bmp180_instance->bmp180_cal.MC = (buff[18] << 8) | buff[19]; bmp180_instance->bmp180_cal.MD = (buff[20] << 8) | buff[21]; - -UNITEMP_DEBUG( + UNITEMP_DEBUG( "Sensor BMP180 (0x%02X) calibration values: %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d", i2c_sensor->currentI2CAdr, bmp180_instance->bmp180_cal.AC1, diff --git a/applications/services/power/power_service/power.c b/applications/services/power/power_service/power.c index 824e6d4d4..cf71487b7 100644 --- a/applications/services/power/power_service/power.c +++ b/applications/services/power/power_service/power.c @@ -62,8 +62,9 @@ void power_draw_battery_callback(Canvas* canvas, void* context) { } else if( (power->displayBatteryPercentage == DISPLAY_BATTERY_BAR_PERCENT) && (power->state != PowerStateCharging) && // Default bar display with percentage - (power->info.voltage_battery_charging >= 4.2)) { // not looking nice with low voltage indicator - canvas_set_font(canvas, FontBatteryPercent); + (power->info.voltage_battery_charging >= + 4.2)) { // not looking nice with low voltage indicator + canvas_set_font(canvas, FontBatteryPercent); // align charge dispaly value with digits to draw uint8_t bar_charge = power->info.charge; @@ -153,7 +154,6 @@ void power_draw_battery_callback(Canvas* canvas, void* context) { canvas_draw_str_aligned( canvas, 16, 4, AlignCenter, AlignCenter, batteryPercentile); } else if(power->displayBatteryPercentage == DISPLAY_BATTERY_BAR_PERCENT) { - // clean-up default charging bar display canvas_set_color(canvas, ColorWhite); canvas_draw_box(canvas, 1, 1, 22, 6); diff --git a/applications/settings/desktop_settings/scenes/desktop_settings_scene_start.c b/applications/settings/desktop_settings/scenes/desktop_settings_scene_start.c index d0f295d8f..2d1d2f8a5 100644 --- a/applications/settings/desktop_settings/scenes/desktop_settings_scene_start.c +++ b/applications/settings/desktop_settings/scenes/desktop_settings_scene_start.c @@ -28,14 +28,8 @@ const uint32_t auto_lock_delay_value[AUTO_LOCK_DELAY_COUNT] = #define BATTERY_VIEW_COUNT 6 -const char* const battery_view_count_text[BATTERY_VIEW_COUNT] = { - "Bar", - "%", - "Inv. %", - "Retro 3", - "Retro 5", - "Bar %" -}; +const char* const battery_view_count_text[BATTERY_VIEW_COUNT] = + {"Bar", "%", "Inv. %", "Retro 3", "Retro 5", "Bar %"}; const uint32_t displayBatteryPercentage_value[BATTERY_VIEW_COUNT] = { DISPLAY_BATTERY_BAR, @@ -43,8 +37,7 @@ const uint32_t displayBatteryPercentage_value[BATTERY_VIEW_COUNT] = { DISPLAY_BATTERY_INVERTED_PERCENT, DISPLAY_BATTERY_RETRO_3, DISPLAY_BATTERY_RETRO_5, - DISPLAY_BATTERY_BAR_PERCENT -}; + DISPLAY_BATTERY_BAR_PERCENT}; static void desktop_settings_scene_start_var_list_enter_callback(void* context, uint32_t index) { DesktopSettingsApp* app = context; From 62b287aac76d4e3442a6fb9a30bd977ca71b01fc Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Wed, 18 Jan 2023 19:33:01 +0300 Subject: [PATCH 085/506] Update links --- .github/FUNDING.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 98fbecc3f..6a4a770bf 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,2 +1,7 @@ ko_fi: masterx -custom: ['https://boosty.to/mmxdev', 'https://destream.net/live/MMX/donate', 'https://pay.cloudtips.ru/p/7b3e9d65', 'https://yoomoney.ru/fundraise/XA49mgQLPA0.221209'] +custom: + [ + "https://boosty.to/mmxdev", + "https://pay.cloudtips.ru/p/7b3e9d65", + "https://yoomoney.ru/fundraise/XA49mgQLPA0.221209", + ] From 7a211e001882d7218e929070f3c2621a6317ea75 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Wed, 18 Jan 2023 19:51:10 +0300 Subject: [PATCH 086/506] Update UniTemp https://github.com/quen0n/unitemp-flipperzero/tree/dev --- applications/plugins/unitemp/README.md | 7 +++++-- applications/plugins/unitemp/Sensors.c | 6 ++++-- applications/plugins/unitemp/Sensors.h | 2 +- applications/plugins/unitemp/interfaces/I2CSensor.c | 2 +- applications/plugins/unitemp/interfaces/I2CSensor.h | 2 +- applications/plugins/unitemp/interfaces/OneWireSensor.c | 2 +- applications/plugins/unitemp/interfaces/OneWireSensor.h | 2 +- applications/plugins/unitemp/interfaces/SingleWireSensor.c | 2 +- applications/plugins/unitemp/interfaces/SingleWireSensor.h | 2 +- applications/plugins/unitemp/sensors/AM2320.c | 2 +- applications/plugins/unitemp/sensors/AM2320.h | 2 +- applications/plugins/unitemp/sensors/BMP180.c | 5 +++-- applications/plugins/unitemp/sensors/BMP180.h | 2 +- applications/plugins/unitemp/sensors/BMx280.c | 2 +- applications/plugins/unitemp/sensors/BMx280.h | 2 +- applications/plugins/unitemp/sensors/DHT20.c | 2 +- applications/plugins/unitemp/sensors/DHT20.h | 2 +- applications/plugins/unitemp/sensors/HTU21x.c | 1 + applications/plugins/unitemp/sensors/LM75.c | 2 +- applications/plugins/unitemp/sensors/LM75.h | 2 +- applications/plugins/unitemp/sensors/SHT30.c | 2 +- applications/plugins/unitemp/sensors/SHT30.h | 2 +- applications/plugins/unitemp/unitemp.c | 4 +++- applications/plugins/unitemp/unitemp.h | 4 ++-- applications/plugins/unitemp/views/General_view.c | 7 ++++++- applications/plugins/unitemp/views/MainMenu_view.c | 2 +- applications/plugins/unitemp/views/Popup_view.c | 2 +- applications/plugins/unitemp/views/SensorActions_view.c | 2 +- applications/plugins/unitemp/views/SensorEdit_view.c | 2 +- applications/plugins/unitemp/views/SensorNameEdit_view.c | 3 ++- applications/plugins/unitemp/views/SensorsList_view.c | 2 +- applications/plugins/unitemp/views/Settings_view.c | 2 +- applications/plugins/unitemp/views/UnitempViews.h | 2 +- applications/plugins/unitemp/views/Widgets_view.c | 3 ++- 34 files changed, 53 insertions(+), 37 deletions(-) diff --git a/applications/plugins/unitemp/README.md b/applications/plugins/unitemp/README.md index 817f6f481..668aae40a 100644 --- a/applications/plugins/unitemp/README.md +++ b/applications/plugins/unitemp/README.md @@ -1,4 +1,4 @@ -![Flipper usage](https://user-images.githubusercontent.com/10090793/206618263-c1e212e4-58dc-432e-87a8-5c19fd835b35.png) +![Flipper usage](https://user-images.githubusercontent.com/10090793/211182642-e41919c5-3091-4125-815a-2d6a77a859f6.png) # Unitemp - Universal temperature sensor reader [![GitHub release](https://img.shields.io/github/release/quen0n/unitemp-flipperzero?include_prereleases=&sort=semver&color=blue)](https://github.com/quen0n/unitemp-flipperzero/releases/) [![GitHub](https://img.shields.io/github/license/quen0n/unitemp-flipperzero)](https://github.com/quen0n/unitemp-flipperzero/blob/dev/LICENSE.md) @@ -7,7 +7,10 @@ ## List of supported sensors (supplemented) ![image](https://user-images.githubusercontent.com/10090793/211131502-c1560eb5-f59c-4cfa-86f7-27f037490a35.png) ## Installation -Copy the contents of the repository to the `applications/plugins/unitemp` folder and build the project. Flash FZ along with resources. [More...](https://github.com/flipperdevices/flipperzero-firmware/blob/dev/documentation/fbt.md) +1) Download [latest version](https://cloud.quenon.ru/index.php/s/h98rT9UnaOL4wxR/download?path=%2F&files=unitemp-latest.fap) +2) Copy `unitemp-latest.fap` to `SD card/apps/GPIO` with qFlipper or mobile application +3) Open application on your Flipper: `Applications->GPIO->Temp sensors reader` +Note: If you get the message "API version mismatch" after updating the firmware, download and install Unitemp again ## Some community photos ![image](https://user-images.githubusercontent.com/10090793/210120132-7ddbc937-0a6b-4472-bd1c-7fbc3ecdf2ad.png) ![image](https://user-images.githubusercontent.com/10090793/210120135-12fc5810-77ff-49db-b799-e9479e1f57a7.png) diff --git a/applications/plugins/unitemp/Sensors.c b/applications/plugins/unitemp/Sensors.c index 87a218fe0..7945c73ff 100644 --- a/applications/plugins/unitemp/Sensors.c +++ b/applications/plugins/unitemp/Sensors.c @@ -1,6 +1,6 @@ /* Unitemp - Universal temperature reader - Copyright (C) 2022 Victor Nikitchuk (https://github.com/quen0n) + Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -624,8 +624,10 @@ UnitempStatus unitemp_sensor_updateData(Sensor* sensor) { UNITEMP_DEBUG("Sensor %s update status %d", sensor->name, sensor->status); } - if(app->settings.temp_unit == UT_TEMP_FAHRENHEIT && sensor->status == UT_SENSORSTATUS_OK) + if(app->settings.temp_unit == UT_TEMP_FAHRENHEIT && sensor->status == UT_SENSORSTATUS_OK) { uintemp_celsiumToFarengate(sensor); + } + if(sensor->status == UT_SENSORSTATUS_OK) { sensor->temp += sensor->temp_offset / 10.f; if(app->settings.pressure_unit == UT_PRESSURE_MM_HG) { diff --git a/applications/plugins/unitemp/Sensors.h b/applications/plugins/unitemp/Sensors.h index fcbb395fa..2a7741cfd 100644 --- a/applications/plugins/unitemp/Sensors.h +++ b/applications/plugins/unitemp/Sensors.h @@ -1,6 +1,6 @@ /* Unitemp - Universal temperature reader - Copyright (C) 2022 Victor Nikitchuk (https://github.com/quen0n) + Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/applications/plugins/unitemp/interfaces/I2CSensor.c b/applications/plugins/unitemp/interfaces/I2CSensor.c index 72d959e27..e5901c282 100644 --- a/applications/plugins/unitemp/interfaces/I2CSensor.c +++ b/applications/plugins/unitemp/interfaces/I2CSensor.c @@ -1,6 +1,6 @@ /* Unitemp - Universal temperature reader - Copyright (C) 2022 Victor Nikitchuk (https://github.com/quen0n) + Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/applications/plugins/unitemp/interfaces/I2CSensor.h b/applications/plugins/unitemp/interfaces/I2CSensor.h index 3df709d9a..4d468aae1 100644 --- a/applications/plugins/unitemp/interfaces/I2CSensor.h +++ b/applications/plugins/unitemp/interfaces/I2CSensor.h @@ -1,6 +1,6 @@ /* Unitemp - Universal temperature reader - Copyright (C) 2022 Victor Nikitchuk (https://github.com/quen0n) + Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/applications/plugins/unitemp/interfaces/OneWireSensor.c b/applications/plugins/unitemp/interfaces/OneWireSensor.c index 4d5db5d0e..f4f3ebcdc 100644 --- a/applications/plugins/unitemp/interfaces/OneWireSensor.c +++ b/applications/plugins/unitemp/interfaces/OneWireSensor.c @@ -1,6 +1,6 @@ /* Unitemp - Universal temperature reader - Copyright (C) 2022 Victor Nikitchuk (https://github.com/quen0n) + Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/applications/plugins/unitemp/interfaces/OneWireSensor.h b/applications/plugins/unitemp/interfaces/OneWireSensor.h index f2b148535..ef94db820 100644 --- a/applications/plugins/unitemp/interfaces/OneWireSensor.h +++ b/applications/plugins/unitemp/interfaces/OneWireSensor.h @@ -1,6 +1,6 @@ /* Unitemp - Universal temperature reader - Copyright (C) 2022 Victor Nikitchuk (https://github.com/quen0n) + Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/applications/plugins/unitemp/interfaces/SingleWireSensor.c b/applications/plugins/unitemp/interfaces/SingleWireSensor.c index d5343a7a8..d6d1b092b 100644 --- a/applications/plugins/unitemp/interfaces/SingleWireSensor.c +++ b/applications/plugins/unitemp/interfaces/SingleWireSensor.c @@ -1,6 +1,6 @@ /* Unitemp - Universal temperature reader - Copyright (C) 2022 Victor Nikitchuk (https://github.com/quen0n) + Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/applications/plugins/unitemp/interfaces/SingleWireSensor.h b/applications/plugins/unitemp/interfaces/SingleWireSensor.h index f5bc74734..c762ff0aa 100644 --- a/applications/plugins/unitemp/interfaces/SingleWireSensor.h +++ b/applications/plugins/unitemp/interfaces/SingleWireSensor.h @@ -1,6 +1,6 @@ /* Unitemp - Universal temperature reader - Copyright (C) 2022 Victor Nikitchuk (https://github.com/quen0n) + Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/applications/plugins/unitemp/sensors/AM2320.c b/applications/plugins/unitemp/sensors/AM2320.c index e77707005..29b255e1d 100644 --- a/applications/plugins/unitemp/sensors/AM2320.c +++ b/applications/plugins/unitemp/sensors/AM2320.c @@ -1,6 +1,6 @@ /* Unitemp - Universal temperature reader - Copyright (C) 2022 Victor Nikitchuk (https://github.com/quen0n) + Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/applications/plugins/unitemp/sensors/AM2320.h b/applications/plugins/unitemp/sensors/AM2320.h index f13105470..fa5f502d4 100644 --- a/applications/plugins/unitemp/sensors/AM2320.h +++ b/applications/plugins/unitemp/sensors/AM2320.h @@ -1,6 +1,6 @@ /* Unitemp - Universal temperature reader - Copyright (C) 2022 Victor Nikitchuk (https://github.com/quen0n) + Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/applications/plugins/unitemp/sensors/BMP180.c b/applications/plugins/unitemp/sensors/BMP180.c index e98c05ade..e94f38044 100644 --- a/applications/plugins/unitemp/sensors/BMP180.c +++ b/applications/plugins/unitemp/sensors/BMP180.c @@ -1,6 +1,6 @@ /* Unitemp - Universal temperature reader - Copyright (C) 2022 Victor Nikitchuk (https://github.com/quen0n) + Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -101,7 +101,8 @@ bool unitemp_BMP180_init(Sensor* sensor) { bmp180_instance->bmp180_cal.MC = (buff[18] << 8) | buff[19]; bmp180_instance->bmp180_cal.MD = (buff[20] << 8) | buff[21]; - UNITEMP_DEBUG( + +UNITEMP_DEBUG( "Sensor BMP180 (0x%02X) calibration values: %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d", i2c_sensor->currentI2CAdr, bmp180_instance->bmp180_cal.AC1, diff --git a/applications/plugins/unitemp/sensors/BMP180.h b/applications/plugins/unitemp/sensors/BMP180.h index 4237fb57a..ce2569092 100644 --- a/applications/plugins/unitemp/sensors/BMP180.h +++ b/applications/plugins/unitemp/sensors/BMP180.h @@ -1,6 +1,6 @@ /* Unitemp - Universal temperature reader - Copyright (C) 2022 Victor Nikitchuk (https://github.com/quen0n) + Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/applications/plugins/unitemp/sensors/BMx280.c b/applications/plugins/unitemp/sensors/BMx280.c index d572f09c3..db445d330 100644 --- a/applications/plugins/unitemp/sensors/BMx280.c +++ b/applications/plugins/unitemp/sensors/BMx280.c @@ -1,6 +1,6 @@ /* Unitemp - Universal temperature reader - Copyright (C) 2022 Victor Nikitchuk (https://github.com/quen0n) + Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/applications/plugins/unitemp/sensors/BMx280.h b/applications/plugins/unitemp/sensors/BMx280.h index fe52a364e..32027f285 100644 --- a/applications/plugins/unitemp/sensors/BMx280.h +++ b/applications/plugins/unitemp/sensors/BMx280.h @@ -1,6 +1,6 @@ /* Unitemp - Universal temperature reader - Copyright (C) 2022 Victor Nikitchuk (https://github.com/quen0n) + Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/applications/plugins/unitemp/sensors/DHT20.c b/applications/plugins/unitemp/sensors/DHT20.c index f16e8dfc1..ce11fe3d6 100644 --- a/applications/plugins/unitemp/sensors/DHT20.c +++ b/applications/plugins/unitemp/sensors/DHT20.c @@ -1,6 +1,6 @@ /* Unitemp - Universal temperature reader - Copyright (C) 2022 Victor Nikitchuk (https://github.com/quen0n) + Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/applications/plugins/unitemp/sensors/DHT20.h b/applications/plugins/unitemp/sensors/DHT20.h index db49495dc..417b0ed1d 100644 --- a/applications/plugins/unitemp/sensors/DHT20.h +++ b/applications/plugins/unitemp/sensors/DHT20.h @@ -1,6 +1,6 @@ /* Unitemp - Universal temperature reader - Copyright (C) 2022 Victor Nikitchuk (https://github.com/quen0n) + Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/applications/plugins/unitemp/sensors/HTU21x.c b/applications/plugins/unitemp/sensors/HTU21x.c index 296154f33..2e7222bc4 100644 --- a/applications/plugins/unitemp/sensors/HTU21x.c +++ b/applications/plugins/unitemp/sensors/HTU21x.c @@ -89,6 +89,7 @@ UnitempStatus unitemp_HTU21x_update(Sensor* sensor) { sensor->hum = ((0.001907 * (raw ^ 0x02)) - 6); } temp_hum = !temp_hum; + if(temp_hum) return UT_SENSORSTATUS_EARLYPOOL; return UT_SENSORSTATUS_OK; } diff --git a/applications/plugins/unitemp/sensors/LM75.c b/applications/plugins/unitemp/sensors/LM75.c index e71376404..a9c8df84e 100644 --- a/applications/plugins/unitemp/sensors/LM75.c +++ b/applications/plugins/unitemp/sensors/LM75.c @@ -1,6 +1,6 @@ /* Unitemp - Universal temperature reader - Copyright (C) 2022 Victor Nikitchuk (https://github.com/quen0n) + Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/applications/plugins/unitemp/sensors/LM75.h b/applications/plugins/unitemp/sensors/LM75.h index dc1fb791c..d5397b178 100644 --- a/applications/plugins/unitemp/sensors/LM75.h +++ b/applications/plugins/unitemp/sensors/LM75.h @@ -1,6 +1,6 @@ /* Unitemp - Universal temperature reader - Copyright (C) 2022 Victor Nikitchuk (https://github.com/quen0n) + Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/applications/plugins/unitemp/sensors/SHT30.c b/applications/plugins/unitemp/sensors/SHT30.c index 700a54dec..dd43e80af 100644 --- a/applications/plugins/unitemp/sensors/SHT30.c +++ b/applications/plugins/unitemp/sensors/SHT30.c @@ -1,6 +1,6 @@ /* Unitemp - Universal temperature reader - Copyright (C) 2022 Victor Nikitchuk (https://github.com/quen0n) + Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/applications/plugins/unitemp/sensors/SHT30.h b/applications/plugins/unitemp/sensors/SHT30.h index 93e9d05f2..4b5b74411 100644 --- a/applications/plugins/unitemp/sensors/SHT30.h +++ b/applications/plugins/unitemp/sensors/SHT30.h @@ -1,6 +1,6 @@ /* Unitemp - Universal temperature reader - Copyright (C) 2022 Victor Nikitchuk (https://github.com/quen0n) + Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/applications/plugins/unitemp/unitemp.c b/applications/plugins/unitemp/unitemp.c index 31ab057d6..181de0e78 100644 --- a/applications/plugins/unitemp/unitemp.c +++ b/applications/plugins/unitemp/unitemp.c @@ -1,6 +1,6 @@ /* Unitemp - Universal temperature reader - Copyright (C) 2022 Victor Nikitchuk (https://github.com/quen0n) + Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -233,6 +233,8 @@ static bool unitemp_alloc(void) { */ static void unitemp_free(void) { popup_free(app->popup); + //Удаление вида после обработки + view_dispatcher_remove_view(app->view_dispatcher, UnitempViewPopup); unitemp_widgets_free(); unitemp_SensorActions_free(); diff --git a/applications/plugins/unitemp/unitemp.h b/applications/plugins/unitemp/unitemp.h index 043ac6ddd..bcb2e4ac9 100644 --- a/applications/plugins/unitemp/unitemp.h +++ b/applications/plugins/unitemp/unitemp.h @@ -1,6 +1,6 @@ /* Unitemp - Universal temperature reader - Copyright (C) 2022 Victor Nikitchuk (https://github.com/quen0n) + Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -40,7 +40,7 @@ //Имя приложения #define APP_NAME "Unitemp" //Версия приложения -#define UNITEMP_APP_VER "1.1.1-dev" +#define UNITEMP_APP_VER "1.1.2-dev" //Путь хранения файлов плагина #define APP_PATH_FOLDER "/ext/unitemp" //Имя файла с настройками diff --git a/applications/plugins/unitemp/views/General_view.c b/applications/plugins/unitemp/views/General_view.c index 2c0843ea4..7ab0c2180 100644 --- a/applications/plugins/unitemp/views/General_view.c +++ b/applications/plugins/unitemp/views/General_view.c @@ -1,6 +1,6 @@ /* Unitemp - Universal temperature reader - Copyright (C) 2022 Victor Nikitchuk (https://github.com/quen0n) + Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -542,6 +542,10 @@ static bool _input_callback(InputEvent* event, void* context) { return true; } } + //Обработка длинного нажатия "Ок" + if(event->key == InputKeyOk && event->type == InputTypeLong) { + app->settings.temp_unit = !app->settings.temp_unit; + } return true; } @@ -561,5 +565,6 @@ void unitemp_General_switch(void) { } void unitemp_General_free(void) { + view_dispatcher_remove_view(app->view_dispatcher, UnitempViewGeneral); view_free(view); } diff --git a/applications/plugins/unitemp/views/MainMenu_view.c b/applications/plugins/unitemp/views/MainMenu_view.c index 4b2820eee..bfd0cb0cf 100644 --- a/applications/plugins/unitemp/views/MainMenu_view.c +++ b/applications/plugins/unitemp/views/MainMenu_view.c @@ -1,6 +1,6 @@ /* Unitemp - Universal temperature reader - Copyright (C) 2022 Victor Nikitchuk (https://github.com/quen0n) + Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/applications/plugins/unitemp/views/Popup_view.c b/applications/plugins/unitemp/views/Popup_view.c index c24783870..efa7e7ffa 100644 --- a/applications/plugins/unitemp/views/Popup_view.c +++ b/applications/plugins/unitemp/views/Popup_view.c @@ -1,6 +1,6 @@ /* Unitemp - Universal temperature reader - Copyright (C) 2022 Victor Nikitchuk (https://github.com/quen0n) + Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/applications/plugins/unitemp/views/SensorActions_view.c b/applications/plugins/unitemp/views/SensorActions_view.c index 6f375a50a..1d1a83076 100644 --- a/applications/plugins/unitemp/views/SensorActions_view.c +++ b/applications/plugins/unitemp/views/SensorActions_view.c @@ -1,6 +1,6 @@ /* Unitemp - Universal temperature reader - Copyright (C) 2022 Victor Nikitchuk (https://github.com/quen0n) + Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/applications/plugins/unitemp/views/SensorEdit_view.c b/applications/plugins/unitemp/views/SensorEdit_view.c index f1de4ff11..49732da2d 100644 --- a/applications/plugins/unitemp/views/SensorEdit_view.c +++ b/applications/plugins/unitemp/views/SensorEdit_view.c @@ -1,6 +1,6 @@ /* Unitemp - Universal temperature reader - Copyright (C) 2022 Victor Nikitchuk (https://github.com/quen0n) + Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/applications/plugins/unitemp/views/SensorNameEdit_view.c b/applications/plugins/unitemp/views/SensorNameEdit_view.c index 1d36ac142..19df76edf 100644 --- a/applications/plugins/unitemp/views/SensorNameEdit_view.c +++ b/applications/plugins/unitemp/views/SensorNameEdit_view.c @@ -1,6 +1,6 @@ /* Unitemp - Universal temperature reader - Copyright (C) 2022 Victor Nikitchuk (https://github.com/quen0n) + Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -42,5 +42,6 @@ void unitemp_SensorNameEdit_switch(Sensor* sensor) { view_dispatcher_switch_to_view(app->view_dispatcher, VIEW_ID); } void unitemp_SensorNameEdit_free(void) { + view_dispatcher_remove_view(app->view_dispatcher, VIEW_ID); text_input_free(text_input); } \ No newline at end of file diff --git a/applications/plugins/unitemp/views/SensorsList_view.c b/applications/plugins/unitemp/views/SensorsList_view.c index 81afba4cd..57ae3f79c 100644 --- a/applications/plugins/unitemp/views/SensorsList_view.c +++ b/applications/plugins/unitemp/views/SensorsList_view.c @@ -1,6 +1,6 @@ /* Unitemp - Universal temperature reader - Copyright (C) 2022 Victor Nikitchuk (https://github.com/quen0n) + Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/applications/plugins/unitemp/views/Settings_view.c b/applications/plugins/unitemp/views/Settings_view.c index c3f82c14e..bff169129 100644 --- a/applications/plugins/unitemp/views/Settings_view.c +++ b/applications/plugins/unitemp/views/Settings_view.c @@ -1,6 +1,6 @@ /* Unitemp - Universal temperature reader - Copyright (C) 2022 Victor Nikitchuk (https://github.com/quen0n) + Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/applications/plugins/unitemp/views/UnitempViews.h b/applications/plugins/unitemp/views/UnitempViews.h index b7c2467e0..b78cf2b28 100644 --- a/applications/plugins/unitemp/views/UnitempViews.h +++ b/applications/plugins/unitemp/views/UnitempViews.h @@ -1,6 +1,6 @@ /* Unitemp - Universal temperature reader - Copyright (C) 2022 Victor Nikitchuk (https://github.com/quen0n) + Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/applications/plugins/unitemp/views/Widgets_view.c b/applications/plugins/unitemp/views/Widgets_view.c index 49a3faa1f..97505d925 100644 --- a/applications/plugins/unitemp/views/Widgets_view.c +++ b/applications/plugins/unitemp/views/Widgets_view.c @@ -1,6 +1,6 @@ /* Unitemp - Universal temperature reader - Copyright (C) 2022 Victor Nikitchuk (https://github.com/quen0n) + Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -27,6 +27,7 @@ void unitemp_widgets_alloc(void) { } void unitemp_widgets_free(void) { + view_dispatcher_remove_view(app->view_dispatcher, UnitempViewWidget); widget_free(app->widget); } From adfac7affbef877c6756e8bef748e18905c2ddd6 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Wed, 18 Jan 2023 19:52:33 +0300 Subject: [PATCH 087/506] Update TOTP https://github.com/akopachov/flipper-zero_authenticator --- .../plugins/totp/cli/commands/add/add.c | 50 ++++++++++--- .../plugins/totp/cli/commands/list/list.c | 14 ++-- .../plugins/totp/services/config/config.c | 33 +++++++++ .../plugins/totp/services/config/constants.h | 3 +- .../migrations/config_migration_v1_to_v2.c | 3 +- .../migrations/config_migration_v2_to_v3.c | 70 +++++++++++++++++++ .../migrations/config_migration_v2_to_v3.h | 7 ++ applications/plugins/totp/types/token_info.c | 9 +++ applications/plugins/totp/types/token_info.h | 17 ++++- .../add_new_token/totp_scene_add_new_token.c | 43 ++++++++++-- .../totp_scene_generate_token.c | 22 +++--- 11 files changed, 236 insertions(+), 35 deletions(-) create mode 100644 applications/plugins/totp/services/config/migrations/config_migration_v2_to_v3.c create mode 100644 applications/plugins/totp/services/config/migrations/config_migration_v2_to_v3.h diff --git a/applications/plugins/totp/cli/commands/add/add.c b/applications/plugins/totp/cli/commands/add/add.c index ba36a973a..2183d5277 100644 --- a/applications/plugins/totp/cli/commands/add/add.c +++ b/applications/plugins/totp/cli/commands/add/add.c @@ -14,6 +14,8 @@ #define TOTP_CLI_COMMAND_ADD_ARG_DIGITS "digits" #define TOTP_CLI_COMMAND_ADD_ARG_DIGITS_PREFIX "-d" #define TOTP_CLI_COMMAND_ADD_ARG_UNSECURE_PREFIX "-u" +#define TOTP_CLI_COMMAND_ADD_ARG_DURATION "duration" +#define TOTP_CLI_COMMAND_ADD_ARG_DURATION_PREFIX "-l" static bool token_info_set_algo_from_str(TokenInfo* token_info, const FuriString* str) { if(furi_string_cmpi_str(str, TOTP_CONFIG_TOKEN_ALGO_SHA1_NAME) == 0) { @@ -34,6 +36,16 @@ static bool token_info_set_algo_from_str(TokenInfo* token_info, const FuriString return false; } +static bool args_read_uint8_and_trim(FuriString* args, uint8_t* value) { + int int_value; + if(!args_read_int_and_trim(args, &int_value) || int_value < 0 || int_value > UINT8_MAX) { + return false; + } + + *value = (uint8_t)int_value; + return true; +} + void totp_cli_command_add_docopt_commands() { TOTP_CLI_PRINTF(" " TOTP_CLI_COMMAND_ADD ", " TOTP_CLI_COMMAND_ADD_ALT ", " TOTP_CLI_COMMAND_ADD_ALT2 " Add new token\r\n"); @@ -42,11 +54,11 @@ void totp_cli_command_add_docopt_commands() { void totp_cli_command_add_docopt_usage() { TOTP_CLI_PRINTF( " " TOTP_CLI_COMMAND_NAME - " " DOCOPT_REQUIRED(TOTP_CLI_COMMAND_ADD " | " TOTP_CLI_COMMAND_ADD_ALT " | " TOTP_CLI_COMMAND_ADD_ALT2) " " DOCOPT_ARGUMENT(TOTP_CLI_COMMAND_ADD_ARG_NAME) " " DOCOPT_OPTIONAL( + " " DOCOPT_REQUIRED(TOTP_CLI_COMMAND_ADD " | " TOTP_CLI_COMMAND_ADD_ALT " | " TOTP_CLI_COMMAND_ADD_ALT2) " " DOCOPT_ARGUMENT(TOTP_CLI_COMMAND_ADD_ARG_NAME) " " DOCOPT_OPTIONAL(DOCOPT_OPTION(TOTP_CLI_COMMAND_ADD_ARG_ALGO_PREFIX, DOCOPT_ARGUMENT(TOTP_CLI_COMMAND_ADD_ARG_ALGO))) " " DOCOPT_OPTIONAL( DOCOPT_OPTION( - TOTP_CLI_COMMAND_ADD_ARG_ALGO_PREFIX, + TOTP_CLI_COMMAND_ADD_ARG_DIGITS_PREFIX, DOCOPT_ARGUMENT( - TOTP_CLI_COMMAND_ADD_ARG_ALGO))) " " DOCOPT_OPTIONAL(DOCOPT_OPTION(TOTP_CLI_COMMAND_ADD_ARG_DIGITS_PREFIX, DOCOPT_ARGUMENT(TOTP_CLI_COMMAND_ADD_ARG_DIGITS))) " " DOCOPT_OPTIONAL(DOCOPT_SWITCH(TOTP_CLI_COMMAND_ADD_ARG_UNSECURE_PREFIX)) "\r\n"); + TOTP_CLI_COMMAND_ADD_ARG_DIGITS))) " " DOCOPT_OPTIONAL(DOCOPT_OPTION(TOTP_CLI_COMMAND_ADD_ARG_DURATION_PREFIX, DOCOPT_ARGUMENT(TOTP_CLI_COMMAND_ADD_ARG_DURATION))) " " DOCOPT_OPTIONAL(DOCOPT_SWITCH(TOTP_CLI_COMMAND_ADD_ARG_UNSECURE_PREFIX)) "\r\n"); } void totp_cli_command_add_docopt_arguments() { @@ -64,6 +76,10 @@ void totp_cli_command_add_docopt_options() { TOTP_CLI_COMMAND_ADD_ARG_DIGITS_PREFIX, DOCOPT_ARGUMENT( TOTP_CLI_COMMAND_ADD_ARG_DIGITS)) " Number of digits to generate, one of: 6, 8 " DOCOPT_DEFAULT("6") "\r\n"); + TOTP_CLI_PRINTF(" " DOCOPT_OPTION( + TOTP_CLI_COMMAND_ADD_ARG_DURATION_PREFIX, + DOCOPT_ARGUMENT( + TOTP_CLI_COMMAND_ADD_ARG_DURATION)) " Token lifetime duration in seconds, between: 15 and 255 " DOCOPT_DEFAULT("30") "\r\n"); TOTP_CLI_PRINTF(" " DOCOPT_SWITCH( TOTP_CLI_COMMAND_ADD_ARG_UNSECURE_PREFIX) " Show console user input as-is without masking\r\n"); } @@ -110,16 +126,32 @@ void totp_cli_command_add_handle(PluginState* plugin_state, FuriString* args, Cl parsed = true; } } else if(furi_string_cmpi_str(temp_str, TOTP_CLI_COMMAND_ADD_ARG_DIGITS_PREFIX) == 0) { - if(!args_read_string_and_trim(args, temp_str)) { + uint8_t digit_value; + if(!args_read_uint8_and_trim(args, &digit_value)) { TOTP_CLI_PRINTF( - "Missed value for argument \"" TOTP_CLI_COMMAND_ADD_ARG_DIGITS_PREFIX + "Missed or incorrect value for argument \"" TOTP_CLI_COMMAND_ADD_ARG_DIGITS_PREFIX "\"\r\n"); - } else if(!token_info_set_digits_from_int( - token_info, CONVERT_CHAR_TO_DIGIT(furi_string_get_char(temp_str, 0)))) { + } else if(!token_info_set_digits_from_int(token_info, digit_value)) { TOTP_CLI_PRINTF( - "\"%s\" is incorrect value for argument \"" TOTP_CLI_COMMAND_ADD_ARG_DIGITS_PREFIX + "\"%" PRIu8 + "\" is incorrect value for argument \"" TOTP_CLI_COMMAND_ADD_ARG_DIGITS_PREFIX "\"\r\n", - furi_string_get_cstr(temp_str)); + digit_value); + } else { + parsed = true; + } + } else if(furi_string_cmpi_str(temp_str, TOTP_CLI_COMMAND_ADD_ARG_DURATION_PREFIX) == 0) { + uint8_t duration_value; + if(!args_read_uint8_and_trim(args, &duration_value)) { + TOTP_CLI_PRINTF( + "Missed or incorrect value for argument \"" TOTP_CLI_COMMAND_ADD_ARG_DURATION_PREFIX + "\"\r\n"); + } else if(!token_info_set_duration_from_int(token_info, duration_value)) { + TOTP_CLI_PRINTF( + "\"%" PRIu8 + "\" is incorrect value for argument \"" TOTP_CLI_COMMAND_ADD_ARG_DURATION_PREFIX + "\"\r\n", + duration_value); } else { parsed = true; } diff --git a/applications/plugins/totp/cli/commands/list/list.c b/applications/plugins/totp/cli/commands/list/list.c index 739a0de40..8ed9a136d 100644 --- a/applications/plugins/totp/cli/commands/list/list.c +++ b/applications/plugins/totp/cli/commands/list/list.c @@ -40,19 +40,21 @@ void totp_cli_command_list_handle(PluginState* plugin_state, Cli* cli) { return; } - TOTP_CLI_PRINTF("+-----+-----------------------------+--------+--------+\r\n"); - TOTP_CLI_PRINTF("| %-*s | %-*s | %-*s | %-s |\r\n", 3, "#", 27, "Name", 6, "Algo", "Digits"); - TOTP_CLI_PRINTF("+-----+-----------------------------+--------+--------+\r\n"); + TOTP_CLI_PRINTF("+-----+---------------------------+--------+----+-----+\r\n"); + TOTP_CLI_PRINTF( + "| %-*s | %-*s | %-*s | %-s | %-s |\r\n", 3, "#", 25, "Name", 6, "Algo", "Ln", "Dur"); + TOTP_CLI_PRINTF("+-----+---------------------------+--------+----+-----+\r\n"); uint16_t index = 1; TOTP_LIST_FOREACH(plugin_state->tokens_list, node, { TokenInfo* token_info = (TokenInfo*)node->data; TOTP_CLI_PRINTF( - "| %-3" PRIu16 " | %-27.27s | %-6s | %-6" PRIu8 " |\r\n", + "| %-3" PRIu16 " | %-25.25s | %-6s | %-2" PRIu8 " | %-3" PRIu8 " |\r\n", index, token_info->name, get_algo_as_cstr(token_info->algo), - token_info->digits); + token_info->digits, + token_info->duration); index++; }); - TOTP_CLI_PRINTF("+-----+-----------------------------+--------+--------+\r\n"); + TOTP_CLI_PRINTF("+-----+---------------------------+--------+----+-----+\r\n"); } \ No newline at end of file diff --git a/applications/plugins/totp/services/config/config.c b/applications/plugins/totp/services/config/config.c index 01af1992f..27616316c 100644 --- a/applications/plugins/totp/services/config/config.c +++ b/applications/plugins/totp/services/config/config.c @@ -5,6 +5,7 @@ #include "../../types/common.h" #include "../../types/token_info.h" #include "migrations/config_migration_v1_to_v2.h" +#include "migrations/config_migration_v2_to_v3.h" #define CONFIG_FILE_DIRECTORY_PATH EXT_PATH("authenticator") #define CONFIG_FILE_PATH CONFIG_FILE_DIRECTORY_PATH "/totp.conf" @@ -173,6 +174,13 @@ static TotpConfigFileOpenResult totp_open_config_file(Storage* storage, FlipperF flipper_format_write_comment(fff_data_file, temp_str); flipper_format_write_comment_cstr(fff_data_file, " "); + flipper_format_write_comment_cstr( + fff_data_file, + "# Token lifetime duration in seconds. Should be between 15 and 255. Majority websites requires 30, however some rare websites may require custom lifetime. If you are not sure which one to use - use 30"); + furi_string_printf(temp_str, "%s: 30", TOTP_CONFIG_KEY_TOKEN_DURATION); + flipper_format_write_comment(fff_data_file, temp_str); + flipper_format_write_comment_cstr(fff_data_file, " "); + flipper_format_write_comment_cstr(fff_data_file, "=== TOKEN SAMPLE END ==="); flipper_format_write_comment_cstr(fff_data_file, " "); @@ -232,6 +240,12 @@ TotpConfigFileUpdateResult break; } + tmp_uint32 = token_info->duration; + if(!flipper_format_write_uint32(file, TOTP_CONFIG_KEY_TOKEN_DURATION, &tmp_uint32, 1)) { + update_result = TotpConfigFileUpdateError; + break; + } + update_result = TotpConfigFileUpdateSuccess; } while(false); @@ -483,6 +497,7 @@ TotpConfigFileOpenResult totp_config_file_load_base(PluginState* const plugin_st if(file_version == 1) { if(totp_config_migrate_v1_to_v2(fff_data_file, fff_backup_data_file)) { FURI_LOG_I(LOGGING_TAG, "Applied migration from v1 to v2"); + file_version = 2; } else { FURI_LOG_W( LOGGING_TAG, "An error occurred during migration from v1 to v2"); @@ -491,6 +506,18 @@ TotpConfigFileOpenResult totp_config_file_load_base(PluginState* const plugin_st } } + if(file_version == 2) { + if(totp_config_migrate_v2_to_v3(fff_data_file, fff_backup_data_file)) { + FURI_LOG_I(LOGGING_TAG, "Applied migration from v2 to v3"); + file_version = 3; + } else { + FURI_LOG_W( + LOGGING_TAG, "An error occurred during migration from v2 to v3"); + result = TotpConfigFileOpenError; + break; + } + } + flipper_format_file_close(fff_backup_data_file); flipper_format_free(fff_backup_data_file); flipper_format_rewind(fff_data_file); @@ -669,6 +696,12 @@ TokenLoadingResult totp_config_file_load_tokens(PluginState* const plugin_state) tokenInfo->digits = TOTP_6_DIGITS; } + if(!flipper_format_read_uint32( + fff_data_file, TOTP_CONFIG_KEY_TOKEN_DURATION, &temp_data32, 1) || + !token_info_set_duration_from_int(tokenInfo, temp_data32)) { + tokenInfo->duration = TOTP_TOKEN_DURATION_DEFAULT; + } + FURI_LOG_D(LOGGING_TAG, "Found token \"%s\"", tokenInfo->name); TOTP_LIST_INIT_OR_ADD(plugin_state->tokens_list, tokenInfo, furi_check); diff --git a/applications/plugins/totp/services/config/constants.h b/applications/plugins/totp/services/config/constants.h index 696ea1593..487fb159e 100644 --- a/applications/plugins/totp/services/config/constants.h +++ b/applications/plugins/totp/services/config/constants.h @@ -1,13 +1,14 @@ #pragma once #define CONFIG_FILE_HEADER "Flipper TOTP plugin config file" -#define CONFIG_FILE_ACTUAL_VERSION 2 +#define CONFIG_FILE_ACTUAL_VERSION 3 #define TOTP_CONFIG_KEY_TIMEZONE "Timezone" #define TOTP_CONFIG_KEY_TOKEN_NAME "TokenName" #define TOTP_CONFIG_KEY_TOKEN_SECRET "TokenSecret" #define TOTP_CONFIG_KEY_TOKEN_ALGO "TokenAlgo" #define TOTP_CONFIG_KEY_TOKEN_DIGITS "TokenDigits" +#define TOTP_CONFIG_KEY_TOKEN_DURATION "TokenDuration" #define TOTP_CONFIG_KEY_CRYPTO_VERIFY "Crypto" #define TOTP_CONFIG_KEY_BASE_IV "BaseIV" #define TOTP_CONFIG_KEY_PINSET "PinIsSet" diff --git a/applications/plugins/totp/services/config/migrations/config_migration_v1_to_v2.c b/applications/plugins/totp/services/config/migrations/config_migration_v1_to_v2.c index 1ed8c37f0..c2ca8f905 100644 --- a/applications/plugins/totp/services/config/migrations/config_migration_v1_to_v2.c +++ b/applications/plugins/totp/services/config/migrations/config_migration_v1_to_v2.c @@ -1,6 +1,7 @@ #include "config_migration_v1_to_v2.h" #include #include "../constants.h" +#include "../../../types/token_info.h" #define NEW_VERSION 2 @@ -36,7 +37,7 @@ bool totp_config_migrate_v1_to_v2( flipper_format_write_string_cstr( fff_data_file, TOTP_CONFIG_KEY_TOKEN_ALGO, TOTP_CONFIG_TOKEN_ALGO_SHA1_NAME); - uint32_t default_digits = 6; + const uint32_t default_digits = TOTP_6_DIGITS; flipper_format_write_uint32( fff_data_file, TOTP_CONFIG_KEY_TOKEN_DIGITS, &default_digits, 1); } diff --git a/applications/plugins/totp/services/config/migrations/config_migration_v2_to_v3.c b/applications/plugins/totp/services/config/migrations/config_migration_v2_to_v3.c new file mode 100644 index 000000000..995b3b02e --- /dev/null +++ b/applications/plugins/totp/services/config/migrations/config_migration_v2_to_v3.c @@ -0,0 +1,70 @@ +#include "config_migration_v2_to_v3.h" +#include +#include "../constants.h" +#include "../../../types/token_info.h" + +#define NEW_VERSION 3 + +bool totp_config_migrate_v2_to_v3( + FlipperFormat* fff_data_file, + FlipperFormat* fff_backup_data_file) { + flipper_format_write_header_cstr(fff_data_file, CONFIG_FILE_HEADER, NEW_VERSION); + + FuriString* temp_str = furi_string_alloc(); + + if(flipper_format_read_string(fff_backup_data_file, TOTP_CONFIG_KEY_BASE_IV, temp_str)) { + flipper_format_write_string(fff_data_file, TOTP_CONFIG_KEY_BASE_IV, temp_str); + } + + flipper_format_rewind(fff_backup_data_file); + + if(flipper_format_read_string(fff_backup_data_file, TOTP_CONFIG_KEY_CRYPTO_VERIFY, temp_str)) { + flipper_format_write_string(fff_data_file, TOTP_CONFIG_KEY_CRYPTO_VERIFY, temp_str); + } + + flipper_format_rewind(fff_backup_data_file); + + if(flipper_format_read_string(fff_backup_data_file, TOTP_CONFIG_KEY_TIMEZONE, temp_str)) { + flipper_format_write_string(fff_data_file, TOTP_CONFIG_KEY_TIMEZONE, temp_str); + } + + flipper_format_rewind(fff_backup_data_file); + + if(flipper_format_read_string(fff_backup_data_file, TOTP_CONFIG_KEY_PINSET, temp_str)) { + flipper_format_write_string(fff_data_file, TOTP_CONFIG_KEY_PINSET, temp_str); + } + + flipper_format_rewind(fff_backup_data_file); + + if(flipper_format_read_string( + fff_backup_data_file, TOTP_CONFIG_KEY_NOTIFICATION_METHOD, temp_str)) { + flipper_format_write_string(fff_data_file, TOTP_CONFIG_KEY_NOTIFICATION_METHOD, temp_str); + } + + flipper_format_rewind(fff_backup_data_file); + + while(true) { + if(!flipper_format_read_string( + fff_backup_data_file, TOTP_CONFIG_KEY_TOKEN_NAME, temp_str)) { + break; + } + + flipper_format_write_string(fff_data_file, TOTP_CONFIG_KEY_TOKEN_NAME, temp_str); + + flipper_format_read_string(fff_backup_data_file, TOTP_CONFIG_KEY_TOKEN_SECRET, temp_str); + flipper_format_write_string(fff_data_file, TOTP_CONFIG_KEY_TOKEN_SECRET, temp_str); + + flipper_format_read_string(fff_backup_data_file, TOTP_CONFIG_KEY_TOKEN_ALGO, temp_str); + flipper_format_write_string(fff_data_file, TOTP_CONFIG_KEY_TOKEN_ALGO, temp_str); + + flipper_format_read_string(fff_backup_data_file, TOTP_CONFIG_KEY_TOKEN_DIGITS, temp_str); + flipper_format_write_string(fff_data_file, TOTP_CONFIG_KEY_TOKEN_DIGITS, temp_str); + + const uint32_t default_duration = TOTP_TOKEN_DURATION_DEFAULT; + flipper_format_write_uint32( + fff_data_file, TOTP_CONFIG_KEY_TOKEN_DURATION, &default_duration, 1); + } + + furi_string_free(temp_str); + return true; +} diff --git a/applications/plugins/totp/services/config/migrations/config_migration_v2_to_v3.h b/applications/plugins/totp/services/config/migrations/config_migration_v2_to_v3.h new file mode 100644 index 000000000..e3078db14 --- /dev/null +++ b/applications/plugins/totp/services/config/migrations/config_migration_v2_to_v3.h @@ -0,0 +1,7 @@ +#pragma once + +#include + +bool totp_config_migrate_v2_to_v3( + FlipperFormat* fff_data_file, + FlipperFormat* fff_backup_data_file); diff --git a/applications/plugins/totp/types/token_info.c b/applications/plugins/totp/types/token_info.c index b43293788..60d04245f 100644 --- a/applications/plugins/totp/types/token_info.c +++ b/applications/plugins/totp/types/token_info.c @@ -61,3 +61,12 @@ bool token_info_set_digits_from_int(TokenInfo* token_info, uint8_t digits) { return false; } + +bool token_info_set_duration_from_int(TokenInfo* token_info, uint8_t duration) { + if(duration >= 15) { + token_info->duration = duration; + return true; + } + + return false; +} \ No newline at end of file diff --git a/applications/plugins/totp/types/token_info.h b/applications/plugins/totp/types/token_info.h index 04caa68a8..d04564c42 100644 --- a/applications/plugins/totp/types/token_info.h +++ b/applications/plugins/totp/types/token_info.h @@ -2,6 +2,8 @@ #include +#define TOTP_TOKEN_DURATION_DEFAULT 30 + typedef uint8_t TokenHashAlgo; typedef uint8_t TokenDigitsCount; @@ -70,6 +72,11 @@ typedef struct { * @brief Desired TOTP token length */ TokenDigitsCount digits; + + /** + * @brief Desired TOTP token duration in seconds + */ + uint8_t duration; } TokenInfo; /** @@ -102,6 +109,14 @@ bool token_info_set_secret( * @brief Sets token digits count from \c uint8_t value * @param token_info instance whichs token digits count length should be updated * @param digits desired token digits count length - * @return \c true if token digits count length has been updated; \c false p + * @return \c true if token digits count length has been updated; \c false otherwise */ bool token_info_set_digits_from_int(TokenInfo* token_info, uint8_t digits); + +/** + * @brief Sets token duration from \c uint8_t value + * @param token_info instance whichs token digits count length should be updated + * @param duration desired token duration in seconds + * @return \c true if token duration has been updated; \c false otherwise + */ +bool token_info_set_duration_from_int(TokenInfo* token_info, uint8_t duration); diff --git a/applications/plugins/totp/ui/scenes/add_new_token/totp_scene_add_new_token.c b/applications/plugins/totp/ui/scenes/add_new_token/totp_scene_add_new_token.c index 592a12d0f..f35f0238b 100644 --- a/applications/plugins/totp/ui/scenes/add_new_token/totp_scene_add_new_token.c +++ b/applications/plugins/totp/ui/scenes/add_new_token/totp_scene_add_new_token.c @@ -21,6 +21,7 @@ typedef enum { TokenSecretTextBox, TokenAlgoSelect, TokenLengthSelect, + TokenDurationSelect, ConfirmButton, } Control; @@ -39,6 +40,8 @@ typedef struct { int16_t screen_y_offset; TokenHashAlgo algo; uint8_t digits_count_index; + uint8_t duration; + FuriString* duration_text; } SceneState; void totp_scene_add_new_token_init(const PluginState* plugin_state) { @@ -63,6 +66,10 @@ static void on_token_secret_user_comitted(InputTextSceneCallbackResult* result) free(result); } +static void update_duration_text(SceneState* scene_state) { + furi_string_printf(scene_state->duration_text, "%d sec.", scene_state->duration); +} + void totp_scene_add_new_token_activate( PluginState* plugin_state, const TokenAddEditSceneContext* context) { @@ -89,6 +96,9 @@ void totp_scene_add_new_token_activate( scene_state->screen_y_offset = 0; scene_state->input_state = NULL; + scene_state->duration = TOTP_TOKEN_DURATION_DEFAULT; + scene_state->duration_text = furi_string_alloc(); + update_duration_text(scene_state); if(context == NULL) { TOTP_NULLABLE_NULL(scene_state->current_token_index); @@ -124,14 +134,23 @@ void totp_scene_add_new_token_render(Canvas* const canvas, PluginState* plugin_s ui_control_select_render( canvas, 0, - 63 - scene_state->screen_y_offset, + 61 - scene_state->screen_y_offset, SCREEN_WIDTH, TOKEN_DIGITS_TEXT_LIST[scene_state->digits_count_index], scene_state->selected_control == TokenLengthSelect); + + ui_control_select_render( + canvas, + 0, + 78 - scene_state->screen_y_offset, + SCREEN_WIDTH, + furi_string_get_cstr(scene_state->duration_text), + scene_state->selected_control == TokenDurationSelect); + ui_control_button_render( canvas, SCREEN_WIDTH_CENTER - 24, - 85 - scene_state->screen_y_offset, + 101 - scene_state->screen_y_offset, 48, 13, "Confirm", @@ -146,8 +165,12 @@ void totp_scene_add_new_token_render(Canvas* const canvas, PluginState* plugin_s } void update_screen_y_offset(SceneState* scene_state) { - if(scene_state->selected_control > TokenAlgoSelect) { - scene_state->screen_y_offset = 35; + if(scene_state->selected_control > TokenLengthSelect) { + scene_state->screen_y_offset = 51; + } else if(scene_state->selected_control > TokenAlgoSelect) { + scene_state->screen_y_offset = 34; + } else if(scene_state->selected_control > TokenSecretTextBox) { + scene_state->screen_y_offset = 17; } else { scene_state->screen_y_offset = 0; } @@ -197,6 +220,9 @@ bool totp_scene_add_new_token_handle_event(PluginEvent* const event, PluginState } else if(scene_state->selected_control == TokenLengthSelect) { totp_roll_value_uint8_t( &scene_state->digits_count_index, 1, 0, 1, RollOverflowBehaviorRoll); + } else if(scene_state->selected_control == TokenDurationSelect) { + totp_roll_value_uint8_t(&scene_state->duration, 15, 15, 255, RollOverflowBehaviorStop); + update_duration_text(scene_state); } break; case InputKeyLeft: @@ -206,6 +232,10 @@ bool totp_scene_add_new_token_handle_event(PluginEvent* const event, PluginState } else if(scene_state->selected_control == TokenLengthSelect) { totp_roll_value_uint8_t( &scene_state->digits_count_index, -1, 0, 1, RollOverflowBehaviorRoll); + } else if(scene_state->selected_control == TokenDurationSelect) { + totp_roll_value_uint8_t( + &scene_state->duration, -15, 15, 255, RollOverflowBehaviorStop); + update_duration_text(scene_state); } break; case InputKeyOk: @@ -230,6 +260,8 @@ bool totp_scene_add_new_token_handle_event(PluginEvent* const event, PluginState break; case TokenLengthSelect: break; + case TokenDurationSelect: + break; case ConfirmButton: { TokenInfo* tokenInfo = token_info_alloc(); bool token_secret_set = token_info_set_secret( @@ -245,6 +277,7 @@ bool totp_scene_add_new_token_handle_event(PluginEvent* const event, PluginState tokenInfo->name, scene_state->token_name, scene_state->token_name_length + 1); tokenInfo->algo = scene_state->algo; tokenInfo->digits = TOKEN_DIGITS_VALUE_LIST[scene_state->digits_count_index]; + tokenInfo->duration = scene_state->duration; TOTP_LIST_INIT_OR_ADD(plugin_state->tokens_list, tokenInfo, furi_check); plugin_state->tokens_count++; @@ -310,6 +343,8 @@ void totp_scene_add_new_token_deactivate(PluginState* plugin_state) { free(scene_state->token_secret_input_context->header_text); free(scene_state->token_secret_input_context); + furi_string_free(scene_state->duration_text); + if(scene_state->input_state != NULL) { totp_input_text_free(scene_state->input_state); } diff --git a/applications/plugins/totp/ui/scenes/generate_token/totp_scene_generate_token.c b/applications/plugins/totp/ui/scenes/generate_token/totp_scene_generate_token.c index 157a7192f..51c2e7702 100644 --- a/applications/plugins/totp/ui/scenes/generate_token/totp_scene_generate_token.c +++ b/applications/plugins/totp/ui/scenes/generate_token/totp_scene_generate_token.c @@ -16,13 +16,11 @@ #include "../token_menu/totp_scene_token_menu.h" #include "../../../workers/type_code/type_code.h" -#define TOKEN_LIFETIME 30 - typedef struct { uint16_t current_token_index; char last_code[TOTP_TOKEN_DIGITS_MAX_COUNT + 1]; - char* last_code_name; bool need_token_update; + TokenInfo* current_token; uint32_t last_token_gen_time; TotpTypeCodeWorkerContext* type_code_worker_context; NotificationMessage const** notification_sequence_new_token; @@ -151,7 +149,7 @@ static void update_totp_params(PluginState* const plugin_state) { list_element_at(plugin_state->tokens_list, scene_state->current_token_index)->data; scene_state->need_token_update = true; - scene_state->last_code_name = tokenInfo->name; + scene_state->current_token = tokenInfo; } } @@ -229,7 +227,7 @@ void totp_scene_generate_token_render(Canvas* const canvas, PluginState* plugin_ furi_hal_rtc_get_datetime(&curr_dt); uint32_t curr_ts = furi_hal_rtc_datetime_to_timestamp(&curr_dt); - bool is_new_token_time = curr_ts % TOKEN_LIFETIME == 0; + bool is_new_token_time = curr_ts % scene_state->current_token->duration == 0; if(is_new_token_time && scene_state->last_token_gen_time != curr_ts) { scene_state->need_token_update = true; } @@ -238,10 +236,7 @@ void totp_scene_generate_token_render(Canvas* const canvas, PluginState* plugin_ scene_state->need_token_update = false; scene_state->last_token_gen_time = curr_ts; - const TokenInfo* tokenInfo = - (TokenInfo*)(list_element_at( - plugin_state->tokens_list, scene_state->current_token_index) - ->data); + const TokenInfo* tokenInfo = scene_state->current_token; if(tokenInfo->token != NULL && tokenInfo->token_length > 0) { furi_mutex_acquire( @@ -258,7 +253,7 @@ void totp_scene_generate_token_render(Canvas* const canvas, PluginState* plugin_ key_length, curr_ts, plugin_state->timezone_offset, - TOKEN_LIFETIME), + tokenInfo->duration), scene_state->last_code, tokenInfo->digits); memset_s(key, key_length, 0, key_length); @@ -279,7 +274,7 @@ void totp_scene_generate_token_render(Canvas* const canvas, PluginState* plugin_ } canvas_set_font(canvas, FontPrimary); - uint16_t token_name_width = canvas_string_width(canvas, scene_state->last_code_name); + uint16_t token_name_width = canvas_string_width(canvas, scene_state->current_token->name); if(SCREEN_WIDTH - token_name_width > 18) { canvas_draw_str_aligned( canvas, @@ -287,7 +282,7 @@ void totp_scene_generate_token_render(Canvas* const canvas, PluginState* plugin_ SCREEN_HEIGHT_CENTER - 20, AlignCenter, AlignCenter, - scene_state->last_code_name); + scene_state->current_token->name); } else { canvas_draw_str_aligned( canvas, @@ -295,7 +290,7 @@ void totp_scene_generate_token_render(Canvas* const canvas, PluginState* plugin_ SCREEN_HEIGHT_CENTER - 20, AlignLeft, AlignCenter, - scene_state->last_code_name); + scene_state->current_token->name); canvas_set_color(canvas, ColorWhite); canvas_draw_box(canvas, 0, SCREEN_HEIGHT_CENTER - 24, 9, 9); canvas_draw_box(canvas, SCREEN_WIDTH - 10, SCREEN_HEIGHT_CENTER - 24, 9, 9); @@ -313,6 +308,7 @@ void totp_scene_generate_token_render(Canvas* const canvas, PluginState* plugin_ const uint8_t BAR_MARGIN = 3; const uint8_t BAR_HEIGHT = 4; + const uint8_t TOKEN_LIFETIME = scene_state->current_token->duration; float percentDone = (float)(TOKEN_LIFETIME - curr_ts % TOKEN_LIFETIME) / (float)TOKEN_LIFETIME; uint8_t barWidth = (uint8_t)((float)(SCREEN_WIDTH - (BAR_MARGIN << 1)) * percentDone); uint8_t barX = ((SCREEN_WIDTH - (BAR_MARGIN << 1) - barWidth) >> 1) + BAR_MARGIN; From b52674607abb9224e7eeff473df09e4e301c46fd Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Wed, 18 Jan 2023 19:55:46 +0300 Subject: [PATCH 088/506] Add UART Terminal app by cool4uma https://github.com/cool4uma/UART_Terminal/tree/main --- ReadMe.md | 1 + applications/debug/uart_echo/application.fam | 2 +- applications/plugins/uart_terminal/LICENSE | 22 + applications/plugins/uart_terminal/README.md | 45 ++ .../plugins/uart_terminal/application.fam | 13 + .../assets/KeyBackspaceSelected_16x9.png | Bin 0 -> 1812 bytes .../assets/KeyBackspace_16x9.png | Bin 0 -> 1829 bytes .../assets/KeySaveSelected_24x11.png | Bin 0 -> 1853 bytes .../uart_terminal/assets/KeySave_24x11.png | Bin 0 -> 1863 bytes .../assets/WarningDolphin_45x42.png | Bin 0 -> 1139 bytes .../scenes/uart_terminal_scene.c | 30 + .../scenes/uart_terminal_scene.h | 29 + .../scenes/uart_terminal_scene_config.h | 3 + .../uart_terminal_scene_console_output.c | 147 ++++ .../scenes/uart_terminal_scene_start.c | 137 ++++ .../scenes/uart_terminal_scene_text_input.c | 60 ++ .../plugins/uart_terminal/uart_terminal.png | Bin 0 -> 1883 bytes .../plugins/uart_terminal/uart_terminal_app.c | 104 +++ .../plugins/uart_terminal/uart_terminal_app.h | 11 + .../uart_terminal/uart_terminal_app_i.h | 49 ++ .../uart_terminal_custom_event.h | 7 + .../uart_terminal/uart_terminal_uart.c | 97 +++ .../uart_terminal/uart_terminal_uart.h | 14 + .../plugins/uart_terminal/uart_text_input.c | 637 ++++++++++++++++++ .../plugins/uart_terminal/uart_text_input.h | 82 +++ .../plugins/uart_terminal/uart_validators.c | 57 ++ .../plugins/uart_terminal/uart_validators.h | 21 + applications/plugins/unitemp/sensors/BMP180.c | 3 +- 28 files changed, 1568 insertions(+), 3 deletions(-) create mode 100644 applications/plugins/uart_terminal/LICENSE create mode 100644 applications/plugins/uart_terminal/README.md create mode 100644 applications/plugins/uart_terminal/application.fam create mode 100644 applications/plugins/uart_terminal/assets/KeyBackspaceSelected_16x9.png create mode 100644 applications/plugins/uart_terminal/assets/KeyBackspace_16x9.png create mode 100644 applications/plugins/uart_terminal/assets/KeySaveSelected_24x11.png create mode 100644 applications/plugins/uart_terminal/assets/KeySave_24x11.png create mode 100644 applications/plugins/uart_terminal/assets/WarningDolphin_45x42.png create mode 100644 applications/plugins/uart_terminal/scenes/uart_terminal_scene.c create mode 100644 applications/plugins/uart_terminal/scenes/uart_terminal_scene.h create mode 100644 applications/plugins/uart_terminal/scenes/uart_terminal_scene_config.h create mode 100644 applications/plugins/uart_terminal/scenes/uart_terminal_scene_console_output.c create mode 100644 applications/plugins/uart_terminal/scenes/uart_terminal_scene_start.c create mode 100644 applications/plugins/uart_terminal/scenes/uart_terminal_scene_text_input.c create mode 100644 applications/plugins/uart_terminal/uart_terminal.png create mode 100644 applications/plugins/uart_terminal/uart_terminal_app.c create mode 100644 applications/plugins/uart_terminal/uart_terminal_app.h create mode 100644 applications/plugins/uart_terminal/uart_terminal_app_i.h create mode 100644 applications/plugins/uart_terminal/uart_terminal_custom_event.h create mode 100644 applications/plugins/uart_terminal/uart_terminal_uart.c create mode 100644 applications/plugins/uart_terminal/uart_terminal_uart.h create mode 100644 applications/plugins/uart_terminal/uart_text_input.c create mode 100644 applications/plugins/uart_terminal/uart_text_input.h create mode 100644 applications/plugins/uart_terminal/uart_validators.c create mode 100644 applications/plugins/uart_terminal/uart_validators.h diff --git a/ReadMe.md b/ReadMe.md index 375ecac8e..c6e29a6be 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -126,6 +126,7 @@ You can support us by using links or addresses below: - **iButton Fuzzer** [(by xMasterX)](https://github.com/xMasterX/ibutton-fuzzer) - HEX Viewer [(by QtRoS)](https://github.com/QtRoS/flipper-zero-hex-viewer) - POCSAG Pager [(by xMasterX & Shmuma)](https://github.com/xMasterX/flipper-pager) +- UART Terminal [(by cool4uma)](https://github.com/cool4uma/UART_Terminal/tree/main) Games: - DOOM (fixed) [(by p4nic4ttack)](https://github.com/p4nic4ttack/doom-flipper-zero/) diff --git a/applications/debug/uart_echo/application.fam b/applications/debug/uart_echo/application.fam index a16c611bd..9bc61edc8 100644 --- a/applications/debug/uart_echo/application.fam +++ b/applications/debug/uart_echo/application.fam @@ -8,5 +8,5 @@ App( stack_size=2 * 1024, order=70, fap_icon="uart_10px.png", - fap_category="Misc", + fap_category="GPIO", ) diff --git a/applications/plugins/uart_terminal/LICENSE b/applications/plugins/uart_terminal/LICENSE new file mode 100644 index 000000000..c4613e7ea --- /dev/null +++ b/applications/plugins/uart_terminal/LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2023 Malik cool4uma + +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/plugins/uart_terminal/README.md b/applications/plugins/uart_terminal/README.md new file mode 100644 index 000000000..7e2cfd212 --- /dev/null +++ b/applications/plugins/uart_terminal/README.md @@ -0,0 +1,45 @@ +# UART Terminal for Flipper Zero +[Flipper Zero](https://flipperzero.one/) app to control various devices via UART interface. + +## Capabilities +- Read log and command output by uart +- Send commands by uart +- Set baud rate +- Fast commands + +## Connecting +| Flipper Zero pin | UART interface | +| ---------------- | --------------- | +| 13 TX | RX | +| 14 RX | TX | +|8, 18 GND | GND | + +Info: If possible, do not power your devices from 3V3 (pin 9) Flipper Zero. It does not support hot plugging. + +## Keyboard +UART_terminal uses its own special keyboard for work, which has all the symbols necessary for working in the console. + +To accommodate more characters on a small display, some characters are called up by holding. + +![kbf](https://user-images.githubusercontent.com/122148894/212286637-7063f1ee-c6ff-46b9-8dc5-79a5f367fab1.png) + + +## How to install +Copy the contents of the repository to the applications_user/uart_terminal folder Flipper Zero firmware and build app with the command ./fbt fap_uart_terminal. + +Or use the tool [uFBT](https://github.com/flipperdevices/flipperzero-ufbt) for building applications for Flipper Zero. + +## How it works + + +![1f](https://user-images.githubusercontent.com/122148894/211161450-6d177638-3bfa-42a8-9c73-0cf3af5e5ca7.jpg) + + +![2f](https://user-images.githubusercontent.com/122148894/211161456-4d2be15b-4a05-4450-a62e-edcaab3772fd.jpg) + + +![4f](https://user-images.githubusercontent.com/122148894/211161461-4507120b-42df-441f-9e01-e4517aa83537.jpg) + +## INFO: + +~70% of the source code is taken from the [Wifi Marauder](https://github.com/0xchocolate/flipperzero-firmware-with-wifi-marauder-companion) project. Many thanks to the developers of the Wifi Marauder project. diff --git a/applications/plugins/uart_terminal/application.fam b/applications/plugins/uart_terminal/application.fam new file mode 100644 index 000000000..c6cea5362 --- /dev/null +++ b/applications/plugins/uart_terminal/application.fam @@ -0,0 +1,13 @@ +App( + appid="uart_terminal", + name="UART Terminal", + apptype=FlipperAppType.EXTERNAL, + entry_point="uart_terminal_app", + cdefines=["APP_UART_TERMINAL"], + requires=["gui"], + stack_size=1 * 1024, + order=90, + fap_icon="uart_terminal.png", + fap_category="GPIO", + fap_icon_assets="assets", +) diff --git a/applications/plugins/uart_terminal/assets/KeyBackspaceSelected_16x9.png b/applications/plugins/uart_terminal/assets/KeyBackspaceSelected_16x9.png new file mode 100644 index 0000000000000000000000000000000000000000..7cc0759a8ca6acdb9b9c2e3dc00edde2f0e93a67 GIT binary patch literal 1812 zcmcIl&x_()N{W z-JN@vFI~T+Y1-v}FWiIo6?k5J;aT|qw)dv2CwcE-scA1=t)FMK&%d~)Y0rO}4EC%2 z=aK4R$F?2(hE6fX7H(UFBH{$t4v4EaKLer_Vi@d&Z#A)C)-lFal?RqJo6XEw%T&e4 zBEIiim|Bz~ut4QeR$2KDgeVQ)Gl9#&Q7)}LS*mHl<@TY>s++4|`B+t|9IGdATYvr+ zL&4Vp^Jy_zlt*w&PGkz$CD@V$zdYy`l2xi0C^cC%YIhY;r^KZCtp`aa)U15HX4E*y zkX5o{K-UPu6k#$T&@w-;?b`$g7%xpD(1BnTyO^;O$?)hRrco61v$A3tm;JC~04Xy` zM9{K5&YYn{cI-;z+O~({*abcDHnS;pNXu(4c!7VY__VG>?Z1?*P#iGU)eM+zGa?B_ zvgI?>CU%T`*JH?wZ6SP@IW~7zXzvsW>>M^Zjasu3fJoi8ARJ`vf+uoa+eOUrBobcB zw>cJ!4w<1pj@wleRYXcabz7&```zwtp@zu>K9qa+w)FmX*CD>+AZijr7d#lMB4r@7 zBxNIM<=Lo~JFR)Z8qvz(k!=8Gk?gq@8g zfS#k0rCF(l)r=K#a|A8Qr4h!%R?w1c= z{pq*skHW8}pZxgsP>68$^3NZ9>0PQ& Cw>kg- literal 0 HcmV?d00001 diff --git a/applications/plugins/uart_terminal/assets/KeyBackspace_16x9.png b/applications/plugins/uart_terminal/assets/KeyBackspace_16x9.png new file mode 100644 index 0000000000000000000000000000000000000000..9946232d953ef1cbfbf0e6754be6645e5ea2747b GIT binary patch literal 1829 zcmcIl&u`pB6gEEvMG+BPN`-{wNT>+Lo*8@XwOcpZ?1t{5I;81J4Y!WR<6SFjkFlNX zCgRjnK|!3jpo$Y0E}Xb=;LeTzpnm{T)f-4i;dy_hpfu#tmAsxAzxTcGz4y(`m)l!6 zS1w(-q$tWtuiM#y_bNQEzxE>h|J=PM>Pg=HtW=aY-mae)lh*~S0I8^$I!Q-a=}mlXitE9+UN$s!YEtd_TB{DI?graxTNXmKb&NR1RCQdP z*p_AEk5q~&HgLlr6cO9QmPZ_Q{?i~@5yjq4=i_-SnEBeUs&daT#^bR*Hg#DH4C1=3 zfvG_$0t-|gW)+*DtXx|lbVSLEB(D;gsWl=C<$mRBz;u>EnlE9qa$Y7Vm@#3wL3CWF zv@i^U^G(xqX_e|ijf0zqnN0f5E;9~PYWYyXtSU!}MEQj(L+?JpJ#W3Q_ zfcbtgnwBTxh8T$yuuHHdQ+~PEE(EJ&(U)?xXw>#1qDqNQ)vI@tERy5$gPPIYL3CIp zd=0ur5T*!|K7p3G9x*>8*u!{c8h{QWRntB?yEl08lWCYa({L}SbyS-h=I2pl*a_8oT+S_c~#IXiq#zs}!z^4spCcOR_0+*o_q`N6;X{rjK1`QsBs`Gcx|z4v#k QTVG_o&8^N)8~5)21Ktij=l}o! literal 0 HcmV?d00001 diff --git a/applications/plugins/uart_terminal/assets/KeySaveSelected_24x11.png b/applications/plugins/uart_terminal/assets/KeySaveSelected_24x11.png new file mode 100644 index 0000000000000000000000000000000000000000..eeb3569d3accc5a5c56829b12c85079172b56729 GIT binary patch literal 1853 zcmcIlPiW*+7#}^zw%YZuf+B)3d$6*;fxiXAXK-X$#&ks`?Z1FR>QX z26aVbT~%`&N5w=X1OWo&yGcQZD9KMx7+O3JvM4Pgkw_&Y^~HA4kU?pcLYz)%lYCqz zD405=sj4ZsOlbo2yrZFUJVocl(hfu!>phe>@9d^rUFW&j&H}!)!;|9lBv{%Lg~)s2 z4%()#|Dlit(}3xA)*qFJ1uF0J7`Su5Y9oEA+srsEMAi|aKWWt3B%(w#g-G)oQNqL^ zf1*@0Ucg(l;0+nNrXfra);gN*63r#X84bG_S5Oapz-U2_2No;}caH=0Jhz?X1x*6p zZZ%{Or9=^P?a(oNj2+}NPLO5lb>xS(hK#yzQ(Fto(z;~|u)ZaN?XnW(`pULU1i&$^ zrW-ON3~kFtm|7MJL)}ES1tUU3N-T@l>$)*vdoGLM%c1>)tfeXjj8tQ`U&jXGx~+pC zJw&zve}0HDBg6^Jz?Y@lahswqGEXq5ZvEhVyV+dJL>TqqMZUhgD7BZGrskL?B8nzU zEO0}S#T1Md#k9-SH0hSMuhLzKa_I5y_(QtDUmB14ku-9rOM~*GXvjh71`cJarlUj3 ze7uCJ^@AP<(j#0_!EzB61Df%LF0|x7U8vqkd`@?cmVP{k{EyPdWes{X>2la%Rk=(? zE%&0TDeAxbb=w#db1i`F%Wmf5GAz>Wv>@jW_p)ho-#0CeC9cGbyZ*s9Cn^o)Rq=_$h#NIZix%+wt GFa8a7)lmol literal 0 HcmV?d00001 diff --git a/applications/plugins/uart_terminal/assets/KeySave_24x11.png b/applications/plugins/uart_terminal/assets/KeySave_24x11.png new file mode 100644 index 0000000000000000000000000000000000000000..e7dba987a04dad7dd96001913c55566dbde96c8e GIT binary patch literal 1863 zcmcIlO^6&t6dpxnjjSF75f9pQJZy|LUDdzSZ6$n-*6-2D5s-9_fx~uK( zotfQBVDX?Q(UXLzXF6aX)%U*l z-d9y`w^q+Do_PF3p-@5qOL5h2N9RU z^i-~BIziNECdw*wjUcQeOxncsbnKa>(*%1MPoPck0jC)~9$50g-#!ks+4LGwn$d`f zMy;%ZsA3Rsk2!`#ELuW>2#g3fF>;CFBHMCo-El0(@X1&g%&$qdl~*F4Kd~*B3^?Z1 z^bEmDf}0)Wn??sYC6l9$X;6esLO7#_ZCmDy?ZqU3l|%anS#wn!7%f39-Qp(l9fyJ- z(?=x}n~2%2PcX9#VmYdECvH{tWzv)!s%sn^Z&a(TMEXG=KBQ~smzBm!)h4cOBfSV| zapw6l2`LyY2x(Vnan#Li4>BO#dXPeox2Fr~f_P*4)DM)gJ3Y$sMNw8+?gqit>2PpJ znU9yygm%~yKzf8rCa_fc*^nlp(uJ1%rwg^aiBIX^Xz9mu$p0vPT2|JhQCGkYtEqW1 zTD})enxg%?Uw4c#Ggk#{pLa8zmSLH8=LI=?xR>pc=yYsHAgcQUxz^arx`9fR>e$sw zj@}Uy75!kQXF{tT9e=F+z^*!*3|n>nI6oucWq!(t2og`=40-O!tAE1z^ID@;X)nEd zVK7xqj`wg%Ed2Op{k=a*YZpKHX787$ zzhKuN9(?M5ojmn%xcU1}OP>$^`ZD?cW@lIaTn=x3xBtP#z16o~{qVMZ>hecsD?jQQ ME3387mS5lf8`39Il>h($ literal 0 HcmV?d00001 diff --git a/applications/plugins/uart_terminal/assets/WarningDolphin_45x42.png b/applications/plugins/uart_terminal/assets/WarningDolphin_45x42.png new file mode 100644 index 0000000000000000000000000000000000000000..d766ffbb444db1739f2ccd030e506e8bada11ee8 GIT binary patch literal 1139 zcmaJ=TWAz#6rQ4%BpO*okt7zz3Bkm=bK9L=XV}qhW_HceY#KHzP4Z$UGyf(-b}pUy z<8ESW=_MtCk6tj|`k)VrCbo(SMH0n`eW+KIU`wG5O`$IeMg)Vzf7adDhv+af=lqBB zo%5Z`zqhqzdu2s+1%_dji6%LPq#u2o%9fzN?;7Dlq6)^^VVjkKImH23RI|DPo-mXi zkOGP}@Wrnnf?-SQ^>jOIPc{pxWsr*JL*@+|p)oA7EpIDoAAoo_=+RA)c=F3Qf$N$` ze9k55q%DD7y=l+^ZG$aob+Aw6HDcRVJdzhs00Te;&l_3O74jlch$|r7GgAa!aDjay z@rG1;vK5ys2jF3n@vAgV<6)izn!k6Qhd>D(EhD7l zcrhJ1i9|1iwm?z2T#n2INXzM=7@p@Tnx$CQk39VDfC-hn-*jtB5oF-1j&4KUGI1}W z(rxuakw9eMRAJc3%8 zlBq3$QTyJX$a6$&1ldyi4Pe5AEE32Sg@vDzY~7qR?1u@oXh zd9(fBtV<@eK%Tm=yy&p7{=h^#@1W)WFFSe!U5pP~o71uR`FW)7xc*=d5_b}EG@XBZ z@<7MRp-;+|o}SzJvMyfx>37Y4etBizf%0H*zaIF?2ObZt?$D;{o|esJ z*PgAOIO^*8tL%z2)|}k$DP5kN5}8qo*wNa8y?R2=%wO{gCD(`sHt}TzWQuK zMDIJap(nb2=7*ns*oDcRBbC23yy`kvKYV`ovU`a=EmxNv-90;;5r6+l8hQTp^u`Hn XX6*+%8gHC`h)Tl}u@-r>vFqE{F~5F& literal 0 HcmV?d00001 diff --git a/applications/plugins/uart_terminal/scenes/uart_terminal_scene.c b/applications/plugins/uart_terminal/scenes/uart_terminal_scene.c new file mode 100644 index 000000000..451c5d98b --- /dev/null +++ b/applications/plugins/uart_terminal/scenes/uart_terminal_scene.c @@ -0,0 +1,30 @@ +#include "uart_terminal_scene.h" + +// Generate scene on_enter handlers array +#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_enter, +void (*const uart_terminal_scene_on_enter_handlers[])(void*) = { +#include "uart_terminal_scene_config.h" +}; +#undef ADD_SCENE + +// Generate scene on_event handlers array +#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_event, +bool (*const uart_terminal_scene_on_event_handlers[])(void* context, SceneManagerEvent event) = { +#include "uart_terminal_scene_config.h" +}; +#undef ADD_SCENE + +// Generate scene on_exit handlers array +#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_exit, +void (*const uart_terminal_scene_on_exit_handlers[])(void* context) = { +#include "uart_terminal_scene_config.h" +}; +#undef ADD_SCENE + +// Initialize scene handlers configuration structure +const SceneManagerHandlers uart_terminal_scene_handlers = { + .on_enter_handlers = uart_terminal_scene_on_enter_handlers, + .on_event_handlers = uart_terminal_scene_on_event_handlers, + .on_exit_handlers = uart_terminal_scene_on_exit_handlers, + .scene_num = UART_TerminalSceneNum, +}; diff --git a/applications/plugins/uart_terminal/scenes/uart_terminal_scene.h b/applications/plugins/uart_terminal/scenes/uart_terminal_scene.h new file mode 100644 index 000000000..c6f4ed4b4 --- /dev/null +++ b/applications/plugins/uart_terminal/scenes/uart_terminal_scene.h @@ -0,0 +1,29 @@ +#pragma once + +#include + +// Generate scene id and total number +#define ADD_SCENE(prefix, name, id) UART_TerminalScene##id, +typedef enum { +#include "uart_terminal_scene_config.h" + UART_TerminalSceneNum, +} UART_TerminalScene; +#undef ADD_SCENE + +extern const SceneManagerHandlers uart_terminal_scene_handlers; + +// Generate scene on_enter handlers declaration +#define ADD_SCENE(prefix, name, id) void prefix##_scene_##name##_on_enter(void*); +#include "uart_terminal_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 "uart_terminal_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 "uart_terminal_scene_config.h" +#undef ADD_SCENE diff --git a/applications/plugins/uart_terminal/scenes/uart_terminal_scene_config.h b/applications/plugins/uart_terminal/scenes/uart_terminal_scene_config.h new file mode 100644 index 000000000..febdce167 --- /dev/null +++ b/applications/plugins/uart_terminal/scenes/uart_terminal_scene_config.h @@ -0,0 +1,3 @@ +ADD_SCENE(uart_terminal, start, Start) +ADD_SCENE(uart_terminal, console_output, ConsoleOutput) +ADD_SCENE(uart_terminal, text_input, UART_TextInput) diff --git a/applications/plugins/uart_terminal/scenes/uart_terminal_scene_console_output.c b/applications/plugins/uart_terminal/scenes/uart_terminal_scene_console_output.c new file mode 100644 index 000000000..a9f998124 --- /dev/null +++ b/applications/plugins/uart_terminal/scenes/uart_terminal_scene_console_output.c @@ -0,0 +1,147 @@ +#include "../uart_terminal_app_i.h" + +void uart_terminal_console_output_handle_rx_data_cb(uint8_t* buf, size_t len, void* context) { + furi_assert(context); + UART_TerminalApp* app = context; + + // If text box store gets too big, then truncate it + app->text_box_store_strlen += len; + if(app->text_box_store_strlen >= UART_TERMINAL_TEXT_BOX_STORE_SIZE - 1) { + furi_string_right(app->text_box_store, app->text_box_store_strlen / 2); + app->text_box_store_strlen = furi_string_size(app->text_box_store) + len; + } + + // Null-terminate buf and append to text box store + buf[len] = '\0'; + furi_string_cat_printf(app->text_box_store, "%s", buf); + + view_dispatcher_send_custom_event( + app->view_dispatcher, UART_TerminalEventRefreshConsoleOutput); +} + +void uart_terminal_scene_console_output_on_enter(void* context) { + UART_TerminalApp* app = context; + + TextBox* text_box = app->text_box; + text_box_reset(app->text_box); + text_box_set_font(text_box, TextBoxFontText); + if(app->focus_console_start) { + text_box_set_focus(text_box, TextBoxFocusStart); + } else { + text_box_set_focus(text_box, TextBoxFocusEnd); + } + + //Change baudrate /////////////////////////////////////////////////////////////////////////// + if(0 == strncmp("2400", app->selected_tx_string, strlen("2400")) && app->BAUDRATE != 2400) { + uart_terminal_uart_free(app->uart); + app->BAUDRATE = 2400; + app->uart = uart_terminal_uart_init(app); + } + if(0 == strncmp("9600", app->selected_tx_string, strlen("9600")) && app->BAUDRATE != 9600) { + uart_terminal_uart_free(app->uart); + app->BAUDRATE = 9600; + app->uart = uart_terminal_uart_init(app); + } + if(0 == strncmp("19200", app->selected_tx_string, strlen("19200")) && app->BAUDRATE != 19200) { + uart_terminal_uart_free(app->uart); + app->BAUDRATE = 19200; + app->uart = uart_terminal_uart_init(app); + } + if(0 == strncmp("38400", app->selected_tx_string, strlen("38400")) && app->BAUDRATE != 38400) { + uart_terminal_uart_free(app->uart); + app->BAUDRATE = 38400; + app->uart = uart_terminal_uart_init(app); + } + if(0 == strncmp("57600", app->selected_tx_string, strlen("57600")) && app->BAUDRATE != 57600) { + uart_terminal_uart_free(app->uart); + app->BAUDRATE = 57600; + app->uart = uart_terminal_uart_init(app); + } + if(0 == strncmp("115200", app->selected_tx_string, strlen("115200")) && + app->BAUDRATE != 115200) { + uart_terminal_uart_free(app->uart); + app->BAUDRATE = 115200; + app->uart = uart_terminal_uart_init(app); + } + if(0 == strncmp("230400", app->selected_tx_string, strlen("230400")) && + app->BAUDRATE != 230400) { + uart_terminal_uart_free(app->uart); + app->BAUDRATE = 230400; + app->uart = uart_terminal_uart_init(app); + } + if(0 == strncmp("460800", app->selected_tx_string, strlen("460800")) && + app->BAUDRATE != 460800) { + uart_terminal_uart_free(app->uart); + app->BAUDRATE = 460800; + app->uart = uart_terminal_uart_init(app); + } + if(0 == strncmp("921600", app->selected_tx_string, strlen("921600")) && + app->BAUDRATE != 921600) { + uart_terminal_uart_free(app->uart); + app->BAUDRATE = 921600; + app->uart = uart_terminal_uart_init(app); + } + ///////////////////////////////////////////////////////////////////////////////////////////////////// + + if(app->is_command) { + furi_string_reset(app->text_box_store); + app->text_box_store_strlen = 0; + + if(0 == strncmp("help", app->selected_tx_string, strlen("help"))) { + const char* help_msg = + "UART terminal for Flipper\n\nI'm in github: cool4uma\n\nThis app is a modified\nWiFi Marauder companion,\nThanks 0xchocolate(github)\nfor great code and app.\n\n"; + furi_string_cat_str(app->text_box_store, help_msg); + app->text_box_store_strlen += strlen(help_msg); + } + + if(app->show_stopscan_tip) { + const char* help_msg = "Press BACK to return\n"; + furi_string_cat_str(app->text_box_store, help_msg); + app->text_box_store_strlen += strlen(help_msg); + } + } + + // Set starting text - for "View Log", this will just be what was already in the text box store + text_box_set_text(app->text_box, furi_string_get_cstr(app->text_box_store)); + + scene_manager_set_scene_state(app->scene_manager, UART_TerminalSceneConsoleOutput, 0); + view_dispatcher_switch_to_view(app->view_dispatcher, UART_TerminalAppViewConsoleOutput); + + // Register callback to receive data + uart_terminal_uart_set_handle_rx_data_cb( + app->uart, uart_terminal_console_output_handle_rx_data_cb); // setup callback for rx thread + + // Send command with newline '\n' + if(app->is_command && app->selected_tx_string) { + uart_terminal_uart_tx( + (uint8_t*)(app->selected_tx_string), strlen(app->selected_tx_string)); + uart_terminal_uart_tx((uint8_t*)("\n"), 1); + } +} + +bool uart_terminal_scene_console_output_on_event(void* context, SceneManagerEvent event) { + UART_TerminalApp* app = context; + + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + text_box_set_text(app->text_box, furi_string_get_cstr(app->text_box_store)); + consumed = true; + } else if(event.type == SceneManagerEventTypeTick) { + consumed = true; + } + + return consumed; +} + +void uart_terminal_scene_console_output_on_exit(void* context) { + UART_TerminalApp* app = context; + + // Unregister rx callback + uart_terminal_uart_set_handle_rx_data_cb(app->uart, NULL); + + // Automatically logut when exiting view + //if(app->is_command) { + // uart_terminal_uart_tx((uint8_t*)("exit\n"), strlen("exit\n")); + //} +} diff --git a/applications/plugins/uart_terminal/scenes/uart_terminal_scene_start.c b/applications/plugins/uart_terminal/scenes/uart_terminal_scene_start.c new file mode 100644 index 000000000..db783e9b2 --- /dev/null +++ b/applications/plugins/uart_terminal/scenes/uart_terminal_scene_start.c @@ -0,0 +1,137 @@ +#include "../uart_terminal_app_i.h" + +// For each command, define whether additional arguments are needed +// (enabling text input to fill them out), and whether the console +// text box should focus at the start of the output or the end +typedef enum { NO_ARGS = 0, INPUT_ARGS, TOGGLE_ARGS } InputArgs; + +typedef enum { FOCUS_CONSOLE_END = 0, FOCUS_CONSOLE_START, FOCUS_CONSOLE_TOGGLE } FocusConsole; + +#define SHOW_STOPSCAN_TIP (true) +#define NO_TIP (false) + +#define MAX_OPTIONS (9) +typedef struct { + const char* item_string; + const char* options_menu[MAX_OPTIONS]; + int num_options_menu; + const char* actual_commands[MAX_OPTIONS]; + InputArgs needs_keyboard; + FocusConsole focus_console; + bool show_stopscan_tip; +} UART_TerminalItem; + +// NUM_MENU_ITEMS defined in uart_terminal_app_i.h - if you add an entry here, increment it! +const UART_TerminalItem items[NUM_MENU_ITEMS] = { + {"Console", + {"115200", "2400", "9600", "19200", "38400", "57600", "230400", "460800", "921600"}, + 9, + {"115200", "2400", "9600", "19200", "38400", "57600", "230400", "460800", "921600"}, + NO_ARGS, + FOCUS_CONSOLE_TOGGLE, + NO_TIP}, + {"Send command", {""}, 1, {""}, INPUT_ARGS, FOCUS_CONSOLE_END, NO_TIP}, + {"Fast cmd", + {"help", "uptime", "date", "df -h", "ps", "dmesg", "reboot", "poweroff"}, + 8, + {"help", "uptime", "date", "df -h", "ps", "dmesg", "reboot", "poweroff"}, + INPUT_ARGS, + FOCUS_CONSOLE_END, + NO_TIP}, + {"Help", {""}, 1, {"help"}, NO_ARGS, FOCUS_CONSOLE_START, SHOW_STOPSCAN_TIP}, +}; + +static void uart_terminal_scene_start_var_list_enter_callback(void* context, uint32_t index) { + furi_assert(context); + UART_TerminalApp* app = context; + + furi_assert(index < NUM_MENU_ITEMS); + const UART_TerminalItem* item = &items[index]; + + const int selected_option_index = app->selected_option_index[index]; + furi_assert(selected_option_index < item->num_options_menu); + app->selected_tx_string = item->actual_commands[selected_option_index]; + app->is_command = (1 <= index); + app->is_custom_tx_string = false; + app->selected_menu_index = index; + app->focus_console_start = (item->focus_console == FOCUS_CONSOLE_TOGGLE) ? + (selected_option_index == 0) : + item->focus_console; + app->show_stopscan_tip = item->show_stopscan_tip; + + bool needs_keyboard = (item->needs_keyboard == TOGGLE_ARGS) ? (selected_option_index != 0) : + item->needs_keyboard; + if(needs_keyboard) { + view_dispatcher_send_custom_event(app->view_dispatcher, UART_TerminalEventStartKeyboard); + } else { + view_dispatcher_send_custom_event(app->view_dispatcher, UART_TerminalEventStartConsole); + } +} + +static void uart_terminal_scene_start_var_list_change_callback(VariableItem* item) { + furi_assert(item); + + UART_TerminalApp* app = variable_item_get_context(item); + furi_assert(app); + + const UART_TerminalItem* menu_item = &items[app->selected_menu_index]; + uint8_t item_index = variable_item_get_current_value_index(item); + furi_assert(item_index < menu_item->num_options_menu); + variable_item_set_current_value_text(item, menu_item->options_menu[item_index]); + app->selected_option_index[app->selected_menu_index] = item_index; +} + +void uart_terminal_scene_start_on_enter(void* context) { + UART_TerminalApp* app = context; + VariableItemList* var_item_list = app->var_item_list; + + variable_item_list_set_enter_callback( + var_item_list, uart_terminal_scene_start_var_list_enter_callback, app); + + VariableItem* item; + for(int i = 0; i < NUM_MENU_ITEMS; ++i) { + item = variable_item_list_add( + var_item_list, + items[i].item_string, + items[i].num_options_menu, + uart_terminal_scene_start_var_list_change_callback, + app); + variable_item_set_current_value_index(item, app->selected_option_index[i]); + variable_item_set_current_value_text( + item, items[i].options_menu[app->selected_option_index[i]]); + } + + variable_item_list_set_selected_item( + var_item_list, scene_manager_get_scene_state(app->scene_manager, UART_TerminalSceneStart)); + + view_dispatcher_switch_to_view(app->view_dispatcher, UART_TerminalAppViewVarItemList); +} + +bool uart_terminal_scene_start_on_event(void* context, SceneManagerEvent event) { + UNUSED(context); + UART_TerminalApp* app = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + if(event.event == UART_TerminalEventStartKeyboard) { + scene_manager_set_scene_state( + app->scene_manager, UART_TerminalSceneStart, app->selected_menu_index); + scene_manager_next_scene(app->scene_manager, UART_TerminalAppViewTextInput); + } else if(event.event == UART_TerminalEventStartConsole) { + scene_manager_set_scene_state( + app->scene_manager, UART_TerminalSceneStart, app->selected_menu_index); + scene_manager_next_scene(app->scene_manager, UART_TerminalAppViewConsoleOutput); + } + consumed = true; + } else if(event.type == SceneManagerEventTypeTick) { + app->selected_menu_index = variable_item_list_get_selected_item_index(app->var_item_list); + consumed = true; + } + + return consumed; +} + +void uart_terminal_scene_start_on_exit(void* context) { + UART_TerminalApp* app = context; + variable_item_list_reset(app->var_item_list); +} diff --git a/applications/plugins/uart_terminal/scenes/uart_terminal_scene_text_input.c b/applications/plugins/uart_terminal/scenes/uart_terminal_scene_text_input.c new file mode 100644 index 000000000..62c0792d4 --- /dev/null +++ b/applications/plugins/uart_terminal/scenes/uart_terminal_scene_text_input.c @@ -0,0 +1,60 @@ +#include "../uart_terminal_app_i.h" + +void uart_terminal_scene_text_input_callback(void* context) { + UART_TerminalApp* app = context; + + view_dispatcher_send_custom_event(app->view_dispatcher, UART_TerminalEventStartConsole); +} + +void uart_terminal_scene_text_input_on_enter(void* context) { + UART_TerminalApp* app = context; + + if(false == app->is_custom_tx_string) { + // Fill text input with selected string so that user can add to it + size_t length = strlen(app->selected_tx_string); + furi_assert(length < UART_TERMINAL_TEXT_INPUT_STORE_SIZE); + bzero(app->text_input_store, UART_TERMINAL_TEXT_INPUT_STORE_SIZE); + strncpy(app->text_input_store, app->selected_tx_string, length); + + // Add space - because flipper keyboard currently doesn't have a space + //app->text_input_store[length] = ' '; + app->text_input_store[length + 1] = '\0'; + app->is_custom_tx_string = true; + } + + // Setup view + UART_TextInput* text_input = app->text_input; + // Add help message to header + uart_text_input_set_header_text(text_input, "Send command to UART"); + uart_text_input_set_result_callback( + text_input, + uart_terminal_scene_text_input_callback, + app, + app->text_input_store, + UART_TERMINAL_TEXT_INPUT_STORE_SIZE, + false); + + view_dispatcher_switch_to_view(app->view_dispatcher, UART_TerminalAppViewTextInput); +} + +bool uart_terminal_scene_text_input_on_event(void* context, SceneManagerEvent event) { + UART_TerminalApp* app = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + if(event.event == UART_TerminalEventStartConsole) { + // Point to custom string to send + app->selected_tx_string = app->text_input_store; + scene_manager_next_scene(app->scene_manager, UART_TerminalAppViewConsoleOutput); + consumed = true; + } + } + + return consumed; +} + +void uart_terminal_scene_text_input_on_exit(void* context) { + UART_TerminalApp* app = context; + + uart_text_input_reset(app->text_input); +} diff --git a/applications/plugins/uart_terminal/uart_terminal.png b/applications/plugins/uart_terminal/uart_terminal.png new file mode 100644 index 0000000000000000000000000000000000000000..8420f569279aa5ca170da19d080fd27f61b4339c GIT binary patch literal 1883 zcmcIlO^72!6z&~VbYxWUvIs(N?;25X-v&lFK*fSv$c1OHesj5zzNxFKv zJCn?y7xCgj5JVAKyom@RBB%$!MGu}mdJw#O5l?~_eVxA@b#@#U3?yBt{_1<*d+)2N zH(J|UYpYMJDvGk!Y}DKEEXS)4uE6g~Yws6$Jd`$G%oXL~$II^p<^5Y173G0%;?7>N z7rqcMIn*haU7=5gDWDbQ+WI7=Y+n>=SM=hfs{Q))ZB31NRlDhgI81AzA2*IOv3tDT zVaNN-=i2&n>a|G#1Vd3!but_zc`&JJQ{Di^<+P!xQ%JF2)i%n2>R#AVYcdn6t7F74 zCThjkP1m+P?^%^#f(=|TOpFK#up2m*I{#=8E#pzpu0KDI1^=pAzbMkcFvjDtKDKn3 z^$gSZeFGDN5CjO6A0-8ypd`P%V5p0nWpP@>GEqxL+LfcCs)5p33d3|so8*gS+NbG@e$=bfWe7;TZuQO3mPp-76$i(s5B*QTRvFwK-R zLkz?aU^xggm!Z&a9i0an zhCwsQ3z{&|tXDMxWcW%fMZ#qz^S;DR2+ePhg0PHwvD=;VFxyI|ItfO;OcY z=?1~I`E-0rna`KdjCR}?KzfEtX0TjF#h7MdqX#YdPZt_@6Q9$=v!&aNVrpY(gJ2Gd zh)oggMlOnQ{^`kgKYR1w(jV=$#&;iGIr!?vQ?dEQ>mTlH{W$vgv8!)?a%u2`GV#_g{QmvU em*#svf3EDVT)F?1TY9Cu{+gTH^-r(A{Muh4WJ_-V literal 0 HcmV?d00001 diff --git a/applications/plugins/uart_terminal/uart_terminal_app.c b/applications/plugins/uart_terminal/uart_terminal_app.c new file mode 100644 index 000000000..2c18c5bae --- /dev/null +++ b/applications/plugins/uart_terminal/uart_terminal_app.c @@ -0,0 +1,104 @@ +#include "uart_terminal_app_i.h" + +#include +#include + +static bool uart_terminal_app_custom_event_callback(void* context, uint32_t event) { + furi_assert(context); + UART_TerminalApp* app = context; + return scene_manager_handle_custom_event(app->scene_manager, event); +} + +static bool uart_terminal_app_back_event_callback(void* context) { + furi_assert(context); + UART_TerminalApp* app = context; + return scene_manager_handle_back_event(app->scene_manager); +} + +static void uart_terminal_app_tick_event_callback(void* context) { + furi_assert(context); + UART_TerminalApp* app = context; + scene_manager_handle_tick_event(app->scene_manager); +} + +UART_TerminalApp* uart_terminal_app_alloc() { + UART_TerminalApp* app = malloc(sizeof(UART_TerminalApp)); + + app->gui = furi_record_open(RECORD_GUI); + + app->view_dispatcher = view_dispatcher_alloc(); + app->scene_manager = scene_manager_alloc(&uart_terminal_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, uart_terminal_app_custom_event_callback); + view_dispatcher_set_navigation_event_callback( + app->view_dispatcher, uart_terminal_app_back_event_callback); + view_dispatcher_set_tick_event_callback( + app->view_dispatcher, uart_terminal_app_tick_event_callback, 100); + + view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); + + app->var_item_list = variable_item_list_alloc(); + view_dispatcher_add_view( + app->view_dispatcher, + UART_TerminalAppViewVarItemList, + variable_item_list_get_view(app->var_item_list)); + + for(int i = 0; i < NUM_MENU_ITEMS; ++i) { + app->selected_option_index[i] = 0; + } + + app->text_box = text_box_alloc(); + view_dispatcher_add_view( + app->view_dispatcher, UART_TerminalAppViewConsoleOutput, text_box_get_view(app->text_box)); + app->text_box_store = furi_string_alloc(); + furi_string_reserve(app->text_box_store, UART_TERMINAL_TEXT_BOX_STORE_SIZE); + + app->text_input = uart_text_input_alloc(); + view_dispatcher_add_view( + app->view_dispatcher, + UART_TerminalAppViewTextInput, + uart_text_input_get_view(app->text_input)); + + scene_manager_next_scene(app->scene_manager, UART_TerminalSceneStart); + + return app; +} + +void uart_terminal_app_free(UART_TerminalApp* app) { + furi_assert(app); + + // Views + view_dispatcher_remove_view(app->view_dispatcher, UART_TerminalAppViewVarItemList); + view_dispatcher_remove_view(app->view_dispatcher, UART_TerminalAppViewConsoleOutput); + view_dispatcher_remove_view(app->view_dispatcher, UART_TerminalAppViewTextInput); + text_box_free(app->text_box); + furi_string_free(app->text_box_store); + uart_text_input_free(app->text_input); + + // View dispatcher + view_dispatcher_free(app->view_dispatcher); + scene_manager_free(app->scene_manager); + + uart_terminal_uart_free(app->uart); + + // Close records + furi_record_close(RECORD_GUI); + + free(app); +} + +int32_t uart_terminal_app(void* p) { + UNUSED(p); + UART_TerminalApp* uart_terminal_app = uart_terminal_app_alloc(); + + uart_terminal_app->uart = uart_terminal_uart_init(uart_terminal_app); + + view_dispatcher_run(uart_terminal_app->view_dispatcher); + + uart_terminal_app_free(uart_terminal_app); + + return 0; +} diff --git a/applications/plugins/uart_terminal/uart_terminal_app.h b/applications/plugins/uart_terminal/uart_terminal_app.h new file mode 100644 index 000000000..c859d828b --- /dev/null +++ b/applications/plugins/uart_terminal/uart_terminal_app.h @@ -0,0 +1,11 @@ +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct UART_TerminalApp UART_TerminalApp; + +#ifdef __cplusplus +} +#endif diff --git a/applications/plugins/uart_terminal/uart_terminal_app_i.h b/applications/plugins/uart_terminal/uart_terminal_app_i.h new file mode 100644 index 000000000..6b1996eb5 --- /dev/null +++ b/applications/plugins/uart_terminal/uart_terminal_app_i.h @@ -0,0 +1,49 @@ +#pragma once + +#include "uart_terminal_app.h" +#include "scenes/uart_terminal_scene.h" +#include "uart_terminal_custom_event.h" +#include "uart_terminal_uart.h" + +#include +#include +#include +#include +#include +#include "uart_text_input.h" + +#define NUM_MENU_ITEMS (4) + +#define UART_TERMINAL_TEXT_BOX_STORE_SIZE (4096) +#define UART_TERMINAL_TEXT_INPUT_STORE_SIZE (512) +#define UART_CH (FuriHalUartIdUSART1) + +struct UART_TerminalApp { + Gui* gui; + ViewDispatcher* view_dispatcher; + SceneManager* scene_manager; + + char text_input_store[UART_TERMINAL_TEXT_INPUT_STORE_SIZE + 1]; + FuriString* text_box_store; + size_t text_box_store_strlen; + TextBox* text_box; + UART_TextInput* text_input; + + VariableItemList* var_item_list; + + UART_TerminalUart* uart; + int selected_menu_index; + int selected_option_index[NUM_MENU_ITEMS]; + const char* selected_tx_string; + bool is_command; + bool is_custom_tx_string; + bool focus_console_start; + bool show_stopscan_tip; + int BAUDRATE; +}; + +typedef enum { + UART_TerminalAppViewVarItemList, + UART_TerminalAppViewConsoleOutput, + UART_TerminalAppViewTextInput, +} UART_TerminalAppView; diff --git a/applications/plugins/uart_terminal/uart_terminal_custom_event.h b/applications/plugins/uart_terminal/uart_terminal_custom_event.h new file mode 100644 index 000000000..d57d822d1 --- /dev/null +++ b/applications/plugins/uart_terminal/uart_terminal_custom_event.h @@ -0,0 +1,7 @@ +#pragma once + +typedef enum { + UART_TerminalEventRefreshConsoleOutput = 0, + UART_TerminalEventStartConsole, + UART_TerminalEventStartKeyboard, +} UART_TerminalCustomEvent; diff --git a/applications/plugins/uart_terminal/uart_terminal_uart.c b/applications/plugins/uart_terminal/uart_terminal_uart.c new file mode 100644 index 000000000..136bd5d38 --- /dev/null +++ b/applications/plugins/uart_terminal/uart_terminal_uart.c @@ -0,0 +1,97 @@ +#include "uart_terminal_app_i.h" +#include "uart_terminal_uart.h" + +//#define UART_CH (FuriHalUartIdUSART1) +//#define BAUDRATE (115200) + +struct UART_TerminalUart { + UART_TerminalApp* app; + FuriThread* rx_thread; + FuriStreamBuffer* rx_stream; + uint8_t rx_buf[RX_BUF_SIZE + 1]; + void (*handle_rx_data_cb)(uint8_t* buf, size_t len, void* context); +}; + +typedef enum { + WorkerEvtStop = (1 << 0), + WorkerEvtRxDone = (1 << 1), +} WorkerEvtFlags; + +void uart_terminal_uart_set_handle_rx_data_cb( + UART_TerminalUart* uart, + void (*handle_rx_data_cb)(uint8_t* buf, size_t len, void* context)) { + furi_assert(uart); + uart->handle_rx_data_cb = handle_rx_data_cb; +} + +#define WORKER_ALL_RX_EVENTS (WorkerEvtStop | WorkerEvtRxDone) + +void uart_terminal_uart_on_irq_cb(UartIrqEvent ev, uint8_t data, void* context) { + UART_TerminalUart* uart = (UART_TerminalUart*)context; + + if(ev == UartIrqEventRXNE) { + furi_stream_buffer_send(uart->rx_stream, &data, 1, 0); + furi_thread_flags_set(furi_thread_get_id(uart->rx_thread), WorkerEvtRxDone); + } +} + +static int32_t uart_worker(void* context) { + UART_TerminalUart* uart = (void*)context; + + uart->rx_stream = furi_stream_buffer_alloc(RX_BUF_SIZE, 1); + + while(1) { + uint32_t events = + furi_thread_flags_wait(WORKER_ALL_RX_EVENTS, FuriFlagWaitAny, FuriWaitForever); + furi_check((events & FuriFlagError) == 0); + if(events & WorkerEvtStop) break; + if(events & WorkerEvtRxDone) { + size_t len = furi_stream_buffer_receive(uart->rx_stream, uart->rx_buf, RX_BUF_SIZE, 0); + if(len > 0) { + if(uart->handle_rx_data_cb) uart->handle_rx_data_cb(uart->rx_buf, len, uart->app); + } + } + } + + furi_stream_buffer_free(uart->rx_stream); + + return 0; +} + +void uart_terminal_uart_tx(uint8_t* data, size_t len) { + furi_hal_uart_tx(UART_CH, data, len); +} + +UART_TerminalUart* uart_terminal_uart_init(UART_TerminalApp* app) { + UART_TerminalUart* uart = malloc(sizeof(UART_TerminalUart)); + + furi_hal_console_disable(); + if(app->BAUDRATE == 0) { + app->BAUDRATE = 115200; + } + furi_hal_uart_set_br(UART_CH, app->BAUDRATE); + furi_hal_uart_set_irq_cb(UART_CH, uart_terminal_uart_on_irq_cb, uart); + + uart->app = app; + uart->rx_thread = furi_thread_alloc(); + furi_thread_set_name(uart->rx_thread, "UART_TerminalUartRxThread"); + furi_thread_set_stack_size(uart->rx_thread, 1024); + furi_thread_set_context(uart->rx_thread, uart); + furi_thread_set_callback(uart->rx_thread, uart_worker); + + furi_thread_start(uart->rx_thread); + return uart; +} + +void uart_terminal_uart_free(UART_TerminalUart* uart) { + furi_assert(uart); + + furi_thread_flags_set(furi_thread_get_id(uart->rx_thread), WorkerEvtStop); + furi_thread_join(uart->rx_thread); + furi_thread_free(uart->rx_thread); + + furi_hal_uart_set_irq_cb(UART_CH, NULL, NULL); + furi_hal_console_enable(); + + free(uart); +} \ No newline at end of file diff --git a/applications/plugins/uart_terminal/uart_terminal_uart.h b/applications/plugins/uart_terminal/uart_terminal_uart.h new file mode 100644 index 000000000..ca95c92fb --- /dev/null +++ b/applications/plugins/uart_terminal/uart_terminal_uart.h @@ -0,0 +1,14 @@ +#pragma once + +#include "furi_hal.h" + +#define RX_BUF_SIZE (320) + +typedef struct UART_TerminalUart UART_TerminalUart; + +void uart_terminal_uart_set_handle_rx_data_cb( + UART_TerminalUart* uart, + void (*handle_rx_data_cb)(uint8_t* buf, size_t len, void* context)); +void uart_terminal_uart_tx(uint8_t* data, size_t len); +UART_TerminalUart* uart_terminal_uart_init(UART_TerminalApp* app); +void uart_terminal_uart_free(UART_TerminalUart* uart); diff --git a/applications/plugins/uart_terminal/uart_text_input.c b/applications/plugins/uart_terminal/uart_text_input.c new file mode 100644 index 000000000..4a571b127 --- /dev/null +++ b/applications/plugins/uart_terminal/uart_text_input.c @@ -0,0 +1,637 @@ +#include "uart_text_input.h" +#include +#include "uart_terminal_icons.h" +#include + +struct UART_TextInput { + View* view; + FuriTimer* timer; +}; + +typedef struct { + const char text; + const uint8_t x; + const uint8_t y; +} UART_TextInputKey; + +typedef struct { + const char* header; + char* text_buffer; + size_t text_buffer_size; + bool clear_default_text; + + UART_TextInputCallback callback; + void* callback_context; + + uint8_t selected_row; + uint8_t selected_column; + + UART_TextInputValidatorCallback validator_callback; + void* validator_callback_context; + FuriString* validator_text; + bool valadator_message_visible; +} UART_TextInputModel; + +static const uint8_t keyboard_origin_x = 1; +static const uint8_t keyboard_origin_y = 29; +static const uint8_t keyboard_row_count = 4; + +#define ENTER_KEY '\r' +#define BACKSPACE_KEY '\b' + +static const UART_TextInputKey keyboard_keys_row_1[] = { + {'{', 1, 0}, + {'(', 9, 0}, + {'[', 17, 0}, + {'|', 25, 0}, + {'@', 33, 0}, + {'&', 41, 0}, + {'#', 49, 0}, + {';', 57, 0}, + {'^', 65, 0}, + {'*', 73, 0}, + {'`', 81, 0}, + {'"', 89, 0}, + {'~', 97, 0}, + {'\'', 105, 0}, + {'.', 113, 0}, + {'/', 120, 0}, +}; + +static const UART_TextInputKey keyboard_keys_row_2[] = { + {'q', 1, 10}, + {'w', 9, 10}, + {'e', 17, 10}, + {'r', 25, 10}, + {'t', 33, 10}, + {'y', 41, 10}, + {'u', 49, 10}, + {'i', 57, 10}, + {'o', 65, 10}, + {'p', 73, 10}, + {'0', 81, 10}, + {'1', 89, 10}, + {'2', 97, 10}, + {'3', 105, 10}, + {'=', 113, 10}, + {'-', 120, 10}, +}; + +static const UART_TextInputKey keyboard_keys_row_3[] = { + {'a', 1, 21}, + {'s', 9, 21}, + {'d', 18, 21}, + {'f', 25, 21}, + {'g', 33, 21}, + {'h', 41, 21}, + {'j', 49, 21}, + {'k', 57, 21}, + {'l', 65, 21}, + {BACKSPACE_KEY, 72, 13}, + {'4', 89, 21}, + {'5', 97, 21}, + {'6', 105, 21}, + {'$', 113, 21}, + {'%', 120, 21}, + +}; + +static const UART_TextInputKey keyboard_keys_row_4[] = { + {'z', 1, 33}, + {'x', 9, 33}, + {'c', 18, 33}, + {'v', 25, 33}, + {'b', 33, 33}, + {'n', 41, 33}, + {'m', 49, 33}, + {'_', 57, 33}, + {ENTER_KEY, 64, 24}, + {'7', 89, 33}, + {'8', 97, 33}, + {'9', 105, 33}, + {'!', 113, 33}, + {'+', 120, 33}, +}; + +static uint8_t get_row_size(uint8_t row_index) { + uint8_t row_size = 0; + + switch(row_index + 1) { + case 1: + row_size = sizeof(keyboard_keys_row_1) / sizeof(UART_TextInputKey); + break; + case 2: + row_size = sizeof(keyboard_keys_row_2) / sizeof(UART_TextInputKey); + break; + case 3: + row_size = sizeof(keyboard_keys_row_3) / sizeof(UART_TextInputKey); + break; + case 4: + row_size = sizeof(keyboard_keys_row_4) / sizeof(UART_TextInputKey); + break; + } + + return row_size; +} + +static const UART_TextInputKey* get_row(uint8_t row_index) { + const UART_TextInputKey* row = NULL; + + switch(row_index + 1) { + case 1: + row = keyboard_keys_row_1; + break; + case 2: + row = keyboard_keys_row_2; + break; + case 3: + row = keyboard_keys_row_3; + break; + case 4: + row = keyboard_keys_row_4; + break; + } + + return row; +} + +static char get_selected_char(UART_TextInputModel* model) { + return get_row(model->selected_row)[model->selected_column].text; +} + +static bool char_is_lowercase(char letter) { + return (letter >= 0x61 && letter <= 0x7A); +} + +static char char_to_uppercase(const char letter) { + switch(letter) { + case '_': + return 0x20; + break; + case '(': + return 0x29; + break; + case '{': + return 0x7d; + break; + case '[': + return 0x5d; + break; + case '/': + return 0x5c; + break; + case ';': + return 0x3a; + break; + case '.': + return 0x2c; + break; + case '!': + return 0x3f; + break; + case '<': + return 0x3e; + break; + } + if(isalpha(letter)) { + return (letter - 0x20); + } else { + return letter; + } +} + +static void uart_text_input_backspace_cb(UART_TextInputModel* model) { + uint8_t text_length = model->clear_default_text ? 1 : strlen(model->text_buffer); + if(text_length > 0) { + model->text_buffer[text_length - 1] = 0; + } +} + +static void uart_text_input_view_draw_callback(Canvas* canvas, void* _model) { + UART_TextInputModel* model = _model; + uint8_t text_length = model->text_buffer ? strlen(model->text_buffer) : 0; + uint8_t needed_string_width = canvas_width(canvas) - 8; + uint8_t start_pos = 4; + + const char* text = model->text_buffer; + + canvas_clear(canvas); + canvas_set_color(canvas, ColorBlack); + + canvas_draw_str(canvas, 2, 7, model->header); + elements_slightly_rounded_frame(canvas, 1, 8, 126, 12); + + if(canvas_string_width(canvas, text) > needed_string_width) { + canvas_draw_str(canvas, start_pos, 17, "..."); + start_pos += 6; + needed_string_width -= 8; + } + + while(text != 0 && canvas_string_width(canvas, text) > needed_string_width) { + text++; + } + + if(model->clear_default_text) { + elements_slightly_rounded_box( + canvas, start_pos - 1, 14, canvas_string_width(canvas, text) + 2, 10); + canvas_set_color(canvas, ColorWhite); + } else { + canvas_draw_str(canvas, start_pos + canvas_string_width(canvas, text) + 1, 18, "|"); + canvas_draw_str(canvas, start_pos + canvas_string_width(canvas, text) + 2, 18, "|"); + } + canvas_draw_str(canvas, start_pos, 17, text); + + canvas_set_font(canvas, FontKeyboard); + + for(uint8_t row = 0; row <= keyboard_row_count; row++) { + const uint8_t column_count = get_row_size(row); + const UART_TextInputKey* keys = get_row(row); + + for(size_t column = 0; column < column_count; column++) { + if(keys[column].text == ENTER_KEY) { + canvas_set_color(canvas, ColorBlack); + if(model->selected_row == row && model->selected_column == column) { + canvas_draw_icon( + canvas, + keyboard_origin_x + keys[column].x, + keyboard_origin_y + keys[column].y, + &I_KeySaveSelected_24x11); + } else { + canvas_draw_icon( + canvas, + keyboard_origin_x + keys[column].x, + keyboard_origin_y + keys[column].y, + &I_KeySave_24x11); + } + } else if(keys[column].text == BACKSPACE_KEY) { + canvas_set_color(canvas, ColorBlack); + if(model->selected_row == row && model->selected_column == column) { + canvas_draw_icon( + canvas, + keyboard_origin_x + keys[column].x, + keyboard_origin_y + keys[column].y, + &I_KeyBackspaceSelected_16x9); + } else { + canvas_draw_icon( + canvas, + keyboard_origin_x + keys[column].x, + keyboard_origin_y + keys[column].y, + &I_KeyBackspace_16x9); + } + } else { + if(model->selected_row == row && model->selected_column == column) { + canvas_set_color(canvas, ColorBlack); + canvas_draw_box( + canvas, + keyboard_origin_x + keys[column].x - 1, + keyboard_origin_y + keys[column].y - 8, + 7, + 10); + canvas_set_color(canvas, ColorWhite); + } else { + canvas_set_color(canvas, ColorBlack); + } + + if(model->clear_default_text || + (text_length == 0 && char_is_lowercase(keys[column].text))) { + canvas_draw_glyph( + canvas, + keyboard_origin_x + keys[column].x, + keyboard_origin_y + keys[column].y, + //char_to_uppercase(keys[column].text)); + keys[column].text); + } else { + canvas_draw_glyph( + canvas, + keyboard_origin_x + keys[column].x, + keyboard_origin_y + keys[column].y, + keys[column].text); + } + } + } + } + if(model->valadator_message_visible) { + canvas_set_font(canvas, FontSecondary); + canvas_set_color(canvas, ColorWhite); + canvas_draw_box(canvas, 8, 10, 110, 48); + canvas_set_color(canvas, ColorBlack); + canvas_draw_icon(canvas, 10, 14, &I_WarningDolphin_45x42); + canvas_draw_rframe(canvas, 8, 8, 112, 50, 3); + canvas_draw_rframe(canvas, 9, 9, 110, 48, 2); + elements_multiline_text(canvas, 62, 20, furi_string_get_cstr(model->validator_text)); + canvas_set_font(canvas, FontKeyboard); + } +} + +static void + uart_text_input_handle_up(UART_TextInput* uart_text_input, UART_TextInputModel* model) { + UNUSED(uart_text_input); + if(model->selected_row > 0) { + model->selected_row--; + if(model->selected_column > get_row_size(model->selected_row) - 6) { + model->selected_column = model->selected_column + 1; + } + } +} + +static void + uart_text_input_handle_down(UART_TextInput* uart_text_input, UART_TextInputModel* model) { + UNUSED(uart_text_input); + if(model->selected_row < keyboard_row_count - 1) { + model->selected_row++; + if(model->selected_column > get_row_size(model->selected_row) - 4) { + model->selected_column = model->selected_column - 1; + } + } +} + +static void + uart_text_input_handle_left(UART_TextInput* uart_text_input, UART_TextInputModel* model) { + UNUSED(uart_text_input); + if(model->selected_column > 0) { + model->selected_column--; + } else { + model->selected_column = get_row_size(model->selected_row) - 1; + } +} + +static void + uart_text_input_handle_right(UART_TextInput* uart_text_input, UART_TextInputModel* model) { + UNUSED(uart_text_input); + if(model->selected_column < get_row_size(model->selected_row) - 1) { + model->selected_column++; + } else { + model->selected_column = 0; + } +} + +static void uart_text_input_handle_ok( + UART_TextInput* uart_text_input, + UART_TextInputModel* model, + bool shift) { + char selected = get_selected_char(model); + uint8_t text_length = strlen(model->text_buffer); + + if(shift) { + selected = char_to_uppercase(selected); + } + + if(selected == ENTER_KEY) { + if(model->validator_callback && + (!model->validator_callback( + model->text_buffer, model->validator_text, model->validator_callback_context))) { + model->valadator_message_visible = true; + furi_timer_start(uart_text_input->timer, furi_kernel_get_tick_frequency() * 4); + } else if(model->callback != 0 && text_length > 0) { + model->callback(model->callback_context); + } + } else if(selected == BACKSPACE_KEY) { + uart_text_input_backspace_cb(model); + } else { + if(model->clear_default_text) { + text_length = 0; + } + if(text_length < (model->text_buffer_size - 1)) { + if(text_length == 0 && char_is_lowercase(selected)) { + //selected = char_to_uppercase(selected); + } + model->text_buffer[text_length] = selected; + model->text_buffer[text_length + 1] = 0; + } + } + model->clear_default_text = false; +} + +static bool uart_text_input_view_input_callback(InputEvent* event, void* context) { + UART_TextInput* uart_text_input = context; + furi_assert(uart_text_input); + + bool consumed = false; + + // Acquire model + UART_TextInputModel* model = view_get_model(uart_text_input->view); + + if((!(event->type == InputTypePress) && !(event->type == InputTypeRelease)) && + model->valadator_message_visible) { + model->valadator_message_visible = false; + consumed = true; + } else if(event->type == InputTypeShort) { + consumed = true; + switch(event->key) { + case InputKeyUp: + uart_text_input_handle_up(uart_text_input, model); + break; + case InputKeyDown: + uart_text_input_handle_down(uart_text_input, model); + break; + case InputKeyLeft: + uart_text_input_handle_left(uart_text_input, model); + break; + case InputKeyRight: + uart_text_input_handle_right(uart_text_input, model); + break; + case InputKeyOk: + uart_text_input_handle_ok(uart_text_input, model, false); + break; + default: + consumed = false; + break; + } + } else if(event->type == InputTypeLong) { + consumed = true; + switch(event->key) { + case InputKeyUp: + uart_text_input_handle_up(uart_text_input, model); + break; + case InputKeyDown: + uart_text_input_handle_down(uart_text_input, model); + break; + case InputKeyLeft: + uart_text_input_handle_left(uart_text_input, model); + break; + case InputKeyRight: + uart_text_input_handle_right(uart_text_input, model); + break; + case InputKeyOk: + uart_text_input_handle_ok(uart_text_input, model, true); + break; + case InputKeyBack: + uart_text_input_backspace_cb(model); + break; + default: + consumed = false; + break; + } + } else if(event->type == InputTypeRepeat) { + consumed = true; + switch(event->key) { + case InputKeyUp: + uart_text_input_handle_up(uart_text_input, model); + break; + case InputKeyDown: + uart_text_input_handle_down(uart_text_input, model); + break; + case InputKeyLeft: + uart_text_input_handle_left(uart_text_input, model); + break; + case InputKeyRight: + uart_text_input_handle_right(uart_text_input, model); + break; + case InputKeyBack: + uart_text_input_backspace_cb(model); + break; + default: + consumed = false; + break; + } + } + + // Commit model + view_commit_model(uart_text_input->view, consumed); + + return consumed; +} + +void uart_text_input_timer_callback(void* context) { + furi_assert(context); + UART_TextInput* uart_text_input = context; + + with_view_model( + uart_text_input->view, + UART_TextInputModel * model, + { model->valadator_message_visible = false; }, + true); +} + +UART_TextInput* uart_text_input_alloc() { + UART_TextInput* uart_text_input = malloc(sizeof(UART_TextInput)); + uart_text_input->view = view_alloc(); + view_set_context(uart_text_input->view, uart_text_input); + view_allocate_model(uart_text_input->view, ViewModelTypeLocking, sizeof(UART_TextInputModel)); + view_set_draw_callback(uart_text_input->view, uart_text_input_view_draw_callback); + view_set_input_callback(uart_text_input->view, uart_text_input_view_input_callback); + + uart_text_input->timer = + furi_timer_alloc(uart_text_input_timer_callback, FuriTimerTypeOnce, uart_text_input); + + with_view_model( + uart_text_input->view, + UART_TextInputModel * model, + { model->validator_text = furi_string_alloc(); }, + false); + + uart_text_input_reset(uart_text_input); + + return uart_text_input; +} + +void uart_text_input_free(UART_TextInput* uart_text_input) { + furi_assert(uart_text_input); + with_view_model( + uart_text_input->view, + UART_TextInputModel * model, + { furi_string_free(model->validator_text); }, + false); + + // Send stop command + furi_timer_stop(uart_text_input->timer); + // Release allocated memory + furi_timer_free(uart_text_input->timer); + + view_free(uart_text_input->view); + + free(uart_text_input); +} + +void uart_text_input_reset(UART_TextInput* uart_text_input) { + furi_assert(uart_text_input); + with_view_model( + uart_text_input->view, + UART_TextInputModel * model, + { + model->text_buffer_size = 0; + model->header = ""; + model->selected_row = 0; + model->selected_column = 0; + model->clear_default_text = false; + model->text_buffer = NULL; + model->text_buffer_size = 0; + model->callback = NULL; + model->callback_context = NULL; + model->validator_callback = NULL; + model->validator_callback_context = NULL; + furi_string_reset(model->validator_text); + model->valadator_message_visible = false; + }, + true); +} + +View* uart_text_input_get_view(UART_TextInput* uart_text_input) { + furi_assert(uart_text_input); + return uart_text_input->view; +} + +void uart_text_input_set_result_callback( + UART_TextInput* uart_text_input, + UART_TextInputCallback callback, + void* callback_context, + char* text_buffer, + size_t text_buffer_size, + bool clear_default_text) { + with_view_model( + uart_text_input->view, + UART_TextInputModel * model, + { + model->callback = callback; + model->callback_context = callback_context; + model->text_buffer = text_buffer; + model->text_buffer_size = text_buffer_size; + model->clear_default_text = clear_default_text; + if(text_buffer && text_buffer[0] != '\0') { + // Set focus on Save + model->selected_row = 2; + model->selected_column = 8; + } + }, + true); +} + +void uart_text_input_set_validator( + UART_TextInput* uart_text_input, + UART_TextInputValidatorCallback callback, + void* callback_context) { + with_view_model( + uart_text_input->view, + UART_TextInputModel * model, + { + model->validator_callback = callback; + model->validator_callback_context = callback_context; + }, + true); +} + +UART_TextInputValidatorCallback + uart_text_input_get_validator_callback(UART_TextInput* uart_text_input) { + UART_TextInputValidatorCallback validator_callback = NULL; + with_view_model( + uart_text_input->view, + UART_TextInputModel * model, + { validator_callback = model->validator_callback; }, + false); + return validator_callback; +} + +void* uart_text_input_get_validator_callback_context(UART_TextInput* uart_text_input) { + void* validator_callback_context = NULL; + with_view_model( + uart_text_input->view, + UART_TextInputModel * model, + { validator_callback_context = model->validator_callback_context; }, + false); + return validator_callback_context; +} + +void uart_text_input_set_header_text(UART_TextInput* uart_text_input, const char* text) { + with_view_model( + uart_text_input->view, UART_TextInputModel * model, { model->header = text; }, true); +} diff --git a/applications/plugins/uart_terminal/uart_text_input.h b/applications/plugins/uart_terminal/uart_text_input.h new file mode 100644 index 000000000..f3703ed5a --- /dev/null +++ b/applications/plugins/uart_terminal/uart_text_input.h @@ -0,0 +1,82 @@ +#pragma once + +#include +#include "uart_validators.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** Text input anonymous structure */ +typedef struct UART_TextInput UART_TextInput; +typedef void (*UART_TextInputCallback)(void* context); +typedef bool (*UART_TextInputValidatorCallback)(const char* text, FuriString* error, void* context); + +/** Allocate and initialize text input + * + * This text input is used to enter string + * + * @return UART_TextInput instance + */ +UART_TextInput* uart_text_input_alloc(); + +/** Deinitialize and free text input + * + * @param uart_text_input UART_TextInput instance + */ +void uart_text_input_free(UART_TextInput* uart_text_input); + +/** Clean text input view Note: this function does not free memory + * + * @param uart_text_input Text input instance + */ +void uart_text_input_reset(UART_TextInput* uart_text_input); + +/** Get text input view + * + * @param uart_text_input UART_TextInput instance + * + * @return View instance that can be used for embedding + */ +View* uart_text_input_get_view(UART_TextInput* uart_text_input); + +/** Set text input result callback + * + * @param uart_text_input UART_TextInput instance + * @param callback callback fn + * @param callback_context callback context + * @param text_buffer pointer to YOUR text buffer, that we going + * to modify + * @param text_buffer_size YOUR text buffer size in bytes. Max string + * length will be text_buffer_size-1. + * @param clear_default_text clear text from text_buffer on first OK + * event + */ +void uart_text_input_set_result_callback( + UART_TextInput* uart_text_input, + UART_TextInputCallback callback, + void* callback_context, + char* text_buffer, + size_t text_buffer_size, + bool clear_default_text); + +void uart_text_input_set_validator( + UART_TextInput* uart_text_input, + UART_TextInputValidatorCallback callback, + void* callback_context); + +UART_TextInputValidatorCallback + uart_text_input_get_validator_callback(UART_TextInput* uart_text_input); + +void* uart_text_input_get_validator_callback_context(UART_TextInput* uart_text_input); + +/** Set text input header text + * + * @param uart_text_input UART_TextInput instance + * @param text text to be shown + */ +void uart_text_input_set_header_text(UART_TextInput* uart_text_input, const char* text); + +#ifdef __cplusplus +} +#endif diff --git a/applications/plugins/uart_terminal/uart_validators.c b/applications/plugins/uart_terminal/uart_validators.c new file mode 100644 index 000000000..c87a6cc6e --- /dev/null +++ b/applications/plugins/uart_terminal/uart_validators.c @@ -0,0 +1,57 @@ +#include +#include "uart_validators.h" +#include + +struct ValidatorIsFile { + char* app_path_folder; + const char* app_extension; + char* current_name; +}; + +bool validator_is_file_callback(const char* text, FuriString* error, void* context) { + furi_assert(context); + ValidatorIsFile* instance = context; + + if(instance->current_name != NULL) { + if(strcmp(instance->current_name, text) == 0) { + return true; + } + } + + bool ret = true; + FuriString* path = furi_string_alloc_printf( + "%s/%s%s", instance->app_path_folder, text, instance->app_extension); + Storage* storage = furi_record_open(RECORD_STORAGE); + if(storage_common_stat(storage, furi_string_get_cstr(path), NULL) == FSE_OK) { + ret = false; + furi_string_printf(error, "This name\nexists!\nChoose\nanother one."); + } else { + ret = true; + } + furi_string_free(path); + furi_record_close(RECORD_STORAGE); + + return ret; +} + +ValidatorIsFile* validator_is_file_alloc_init( + const char* app_path_folder, + const char* app_extension, + const char* current_name) { + ValidatorIsFile* instance = malloc(sizeof(ValidatorIsFile)); + + instance->app_path_folder = strdup(app_path_folder); + instance->app_extension = app_extension; + if(current_name != NULL) { + instance->current_name = strdup(current_name); + } + + return instance; +} + +void validator_is_file_free(ValidatorIsFile* instance) { + furi_assert(instance); + free(instance->app_path_folder); + free(instance->current_name); + free(instance); +} diff --git a/applications/plugins/uart_terminal/uart_validators.h b/applications/plugins/uart_terminal/uart_validators.h new file mode 100644 index 000000000..d9200b6db --- /dev/null +++ b/applications/plugins/uart_terminal/uart_validators.h @@ -0,0 +1,21 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif +typedef struct ValidatorIsFile ValidatorIsFile; + +ValidatorIsFile* validator_is_file_alloc_init( + const char* app_path_folder, + const char* app_extension, + const char* current_name); + +void validator_is_file_free(ValidatorIsFile* instance); + +bool validator_is_file_callback(const char* text, FuriString* error, void* context); + +#ifdef __cplusplus +} +#endif diff --git a/applications/plugins/unitemp/sensors/BMP180.c b/applications/plugins/unitemp/sensors/BMP180.c index e94f38044..aa0198289 100644 --- a/applications/plugins/unitemp/sensors/BMP180.c +++ b/applications/plugins/unitemp/sensors/BMP180.c @@ -101,8 +101,7 @@ bool unitemp_BMP180_init(Sensor* sensor) { bmp180_instance->bmp180_cal.MC = (buff[18] << 8) | buff[19]; bmp180_instance->bmp180_cal.MD = (buff[20] << 8) | buff[21]; - -UNITEMP_DEBUG( + UNITEMP_DEBUG( "Sensor BMP180 (0x%02X) calibration values: %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d", i2c_sensor->currentI2CAdr, bmp180_instance->bmp180_cal.AC1, From 7aaecd92781b201cf8b33c4271f65f25f051eec0 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Wed, 18 Jan 2023 20:05:01 +0300 Subject: [PATCH 089/506] Add text viewer --- ReadMe.md | 3 +- applications/plugins/text_viewer/LICENSE | 21 ++ applications/plugins/text_viewer/README.md | 9 + .../plugins/text_viewer/application.fam | 16 + .../plugins/text_viewer/icons/text_10px.png | Bin 0 -> 158 bytes .../plugins/text_viewer/text_viewer.c | 282 ++++++++++++++++++ .../plugins/text_viewer/textviewerflipper.PNG | Bin 0 -> 11796 bytes 7 files changed, 330 insertions(+), 1 deletion(-) create mode 100644 applications/plugins/text_viewer/LICENSE create mode 100644 applications/plugins/text_viewer/README.md create mode 100644 applications/plugins/text_viewer/application.fam create mode 100644 applications/plugins/text_viewer/icons/text_10px.png create mode 100644 applications/plugins/text_viewer/text_viewer.c create mode 100644 applications/plugins/text_viewer/textviewerflipper.PNG diff --git a/ReadMe.md b/ReadMe.md index c6e29a6be..3ae674140 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -126,7 +126,8 @@ You can support us by using links or addresses below: - **iButton Fuzzer** [(by xMasterX)](https://github.com/xMasterX/ibutton-fuzzer) - HEX Viewer [(by QtRoS)](https://github.com/QtRoS/flipper-zero-hex-viewer) - POCSAG Pager [(by xMasterX & Shmuma)](https://github.com/xMasterX/flipper-pager) -- UART Terminal [(by cool4uma)](https://github.com/cool4uma/UART_Terminal/tree/main) +- Text Viewer [(by kowalski7cc & kyhwana)](https://github.com/kowalski7cc/flipper-zero-text-viewer/tree/refactor-text-app) +- **UART Terminal** [(by cool4uma)](https://github.com/cool4uma/UART_Terminal/tree/main) Games: - DOOM (fixed) [(by p4nic4ttack)](https://github.com/p4nic4ttack/doom-flipper-zero/) diff --git a/applications/plugins/text_viewer/LICENSE b/applications/plugins/text_viewer/LICENSE new file mode 100644 index 000000000..69004dc62 --- /dev/null +++ b/applications/plugins/text_viewer/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Roman Shchekin + +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/plugins/text_viewer/README.md b/applications/plugins/text_viewer/README.md new file mode 100644 index 000000000..cc41931be --- /dev/null +++ b/applications/plugins/text_viewer/README.md @@ -0,0 +1,9 @@ +# flipper-zero-text-viewer + +Text Viewer application for Flipper Zero! + +A fork with a few changes from [QTRoS' hex viewer](https://github.com/QtRoS/flipper-zero-hex-viewer) to just display text without any hex byte representation + +![Text Viewer app!](https://github.com/kyhwana/flipper-zero-hex-viewer/blob/master/textviewerflipper.PNG?raw=true) + +[Link to FAP](https://github.com/kyhwana/latest_flipper_zero_apps/raw/main/text_viewer.fap) diff --git a/applications/plugins/text_viewer/application.fam b/applications/plugins/text_viewer/application.fam new file mode 100644 index 000000000..dcd573c9d --- /dev/null +++ b/applications/plugins/text_viewer/application.fam @@ -0,0 +1,16 @@ +App( + appid="text_viewer", + name="Text Viewer", + apptype=FlipperAppType.EXTERNAL, + entry_point="text_viewer_app", + cdefines=["APP_TEXT_VIEWER"], + requires=[ + "gui", + "dialogs", + ], + stack_size=2 * 1024, + order=20, + fap_icon="icons/text_10px.png", + fap_category="Misc", + fap_icon_assets="icons", +) diff --git a/applications/plugins/text_viewer/icons/text_10px.png b/applications/plugins/text_viewer/icons/text_10px.png new file mode 100644 index 0000000000000000000000000000000000000000..8e8a6183dd50535729dc9c9b4f220a12dd4c600f GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2VGmzZ%#=aj&u?6^qxB}__|Nk$&IsYz@rRC}3 z7*a7OIiZ2U&CSi=;0cBn1vTatM&Z;3u7g(^G9`qQn09G2aWeNXaKC0S=Q~tg57Z@F z;u=vBoS#-wo>-L1;E+?AmspUPnOCA;ke9BToS%}K{MA`f4ycg9)78&qol`;+00Iau A9smFU literal 0 HcmV?d00001 diff --git a/applications/plugins/text_viewer/text_viewer.c b/applications/plugins/text_viewer/text_viewer.c new file mode 100644 index 000000000..6c7b46579 --- /dev/null +++ b/applications/plugins/text_viewer/text_viewer.c @@ -0,0 +1,282 @@ +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +#define TAG "TextViewer" + +#define TEXT_VIEWER_APP_PATH_FOLDER ANY_PATH("") +#define TEXT_VIEWER_APP_EXTENSION "*" + +#define TEXT_VIEWER_BYTES_PER_LINE 20u +#define TEXT_VIEWER_LINES_ON_SCREEN 5u +#define TEXT_VIEWER_BUF_SIZE (TEXT_VIEWER_LINES_ON_SCREEN * TEXT_VIEWER_BYTES_PER_LINE) + +typedef struct { + uint8_t file_bytes[TEXT_VIEWER_LINES_ON_SCREEN][TEXT_VIEWER_BYTES_PER_LINE]; + uint32_t file_offset; + uint32_t file_read_bytes; + uint32_t file_size; + Stream* stream; + bool mode; // Print address or content +} TextViewerModel; + +typedef struct { + TextViewerModel* model; + FuriMutex** mutex; + + FuriMessageQueue* input_queue; + + ViewPort* view_port; + Gui* gui; + Storage* storage; +} TextViewer; + +static void render_callback(Canvas* canvas, void* ctx) { + TextViewer* text_viewer = ctx; + furi_check(furi_mutex_acquire(text_viewer->mutex, FuriWaitForever) == FuriStatusOk); + + canvas_clear(canvas); + canvas_set_color(canvas, ColorBlack); + + //elements_button_left(canvas, text_viewer->model->mode ? "Addr" : "Text"); + text_viewer->model->mode = 1; //text mode + //elements_button_right(canvas, "Info"); + + int ROW_HEIGHT = 12; + int TOP_OFFSET = 10; + int LEFT_OFFSET = 3; + + uint32_t line_count = text_viewer->model->file_size / TEXT_VIEWER_BYTES_PER_LINE; + if(text_viewer->model->file_size % TEXT_VIEWER_BYTES_PER_LINE != 0) line_count += 1; + uint32_t first_line_on_screen = text_viewer->model->file_offset / TEXT_VIEWER_BYTES_PER_LINE; + if(line_count > TEXT_VIEWER_LINES_ON_SCREEN) { + uint8_t width = canvas_width(canvas); + elements_scrollbar_pos( + canvas, + width, + 0, + ROW_HEIGHT * TEXT_VIEWER_LINES_ON_SCREEN, + first_line_on_screen, // TODO + line_count - (TEXT_VIEWER_LINES_ON_SCREEN - 1)); + } + + char temp_buf[32]; + uint32_t row_iters = text_viewer->model->file_read_bytes / TEXT_VIEWER_BYTES_PER_LINE; + if(text_viewer->model->file_read_bytes % TEXT_VIEWER_BYTES_PER_LINE != 0) row_iters += 1; + + for(uint32_t i = 0; i < row_iters; ++i) { + uint32_t bytes_left_per_row = + text_viewer->model->file_read_bytes - i * TEXT_VIEWER_BYTES_PER_LINE; + bytes_left_per_row = MIN(bytes_left_per_row, TEXT_VIEWER_BYTES_PER_LINE); + + if(text_viewer->model->mode) { + memcpy(temp_buf, text_viewer->model->file_bytes[i], bytes_left_per_row); + temp_buf[bytes_left_per_row] = '\0'; + for(uint32_t j = 0; j < bytes_left_per_row; ++j) + if(!isprint((int)temp_buf[j])) temp_buf[j] = ' '; + + canvas_set_font(canvas, FontKeyboard); + canvas_draw_str(canvas, LEFT_OFFSET, TOP_OFFSET + i * ROW_HEIGHT, temp_buf); + } else { + uint32_t addr = text_viewer->model->file_offset + i * TEXT_VIEWER_BYTES_PER_LINE; + snprintf(temp_buf, 32, "%04lX", addr); + + canvas_set_font(canvas, FontKeyboard); + canvas_draw_str(canvas, LEFT_OFFSET, TOP_OFFSET + i * ROW_HEIGHT, temp_buf); + } + } + + furi_mutex_release(text_viewer->mutex); +} + +static void input_callback(InputEvent* input_event, void* ctx) { + TextViewer* text_viewer = ctx; + if(input_event->type == InputTypeShort || input_event->type == InputTypeRepeat) { + furi_message_queue_put(text_viewer->input_queue, input_event, 0); + } +} + +static TextViewer* text_viewer_alloc() { + TextViewer* instance = malloc(sizeof(TextViewer)); + + instance->model = malloc(sizeof(TextViewerModel)); + memset(instance->model, 0x0, sizeof(TextViewerModel)); + + instance->mutex = furi_mutex_alloc(FuriMutexTypeNormal); + + instance->input_queue = furi_message_queue_alloc(8, sizeof(InputEvent)); + + instance->view_port = view_port_alloc(); + view_port_draw_callback_set(instance->view_port, render_callback, instance); + view_port_input_callback_set(instance->view_port, input_callback, instance); + + instance->gui = furi_record_open(RECORD_GUI); + gui_add_view_port(instance->gui, instance->view_port, GuiLayerFullscreen); + + instance->storage = furi_record_open(RECORD_STORAGE); + + return instance; +} + +static void text_viewer_free(TextViewer* instance) { + furi_record_close(RECORD_STORAGE); + + gui_remove_view_port(instance->gui, instance->view_port); + furi_record_close(RECORD_GUI); + view_port_free(instance->view_port); + + furi_message_queue_free(instance->input_queue); + + furi_mutex_free(instance->mutex); + + if(instance->model->stream) buffered_file_stream_close(instance->model->stream); + + free(instance->model); + free(instance); +} + +static bool text_viewer_open_file(TextViewer* text_viewer, const char* file_path) { + furi_assert(text_viewer); + furi_assert(file_path); + + text_viewer->model->stream = buffered_file_stream_alloc(text_viewer->storage); + bool isOk = true; + + do { + if(!buffered_file_stream_open( + text_viewer->model->stream, file_path, FSAM_READ, FSOM_OPEN_EXISTING)) { + FURI_LOG_E(TAG, "Unable to open stream: %s", file_path); + isOk = false; + break; + }; + + text_viewer->model->file_size = stream_size(text_viewer->model->stream); + } while(false); + + return isOk; +} + +static bool text_viewer_read_file(TextViewer* text_viewer) { + furi_assert(text_viewer); + furi_assert(text_viewer->model->stream); + furi_assert(text_viewer->model->file_offset % TEXT_VIEWER_BYTES_PER_LINE == 0); + + memset(text_viewer->model->file_bytes, 0x0, TEXT_VIEWER_BUF_SIZE); + bool isOk = true; + + do { + uint32_t offset = text_viewer->model->file_offset; + if(!stream_seek(text_viewer->model->stream, offset, true)) { + FURI_LOG_E(TAG, "Unable to seek stream"); + isOk = false; + break; + } + + text_viewer->model->file_read_bytes = stream_read( + text_viewer->model->stream, + (uint8_t*)text_viewer->model->file_bytes, + TEXT_VIEWER_BUF_SIZE); + } while(false); + + return isOk; +} + +int32_t text_viewer_app(void* p) { + TextViewer* text_viewer = text_viewer_alloc(); + + FuriString* file_path; + file_path = furi_string_alloc(); + + do { + if(p && strlen(p)) { + furi_string_set(file_path, (const char*)p); + } else { + furi_string_set(file_path, TEXT_VIEWER_APP_PATH_FOLDER); + + DialogsFileBrowserOptions browser_options; + dialog_file_browser_set_basic_options( + &browser_options, TEXT_VIEWER_APP_EXTENSION, &I_text_10px); + browser_options.hide_ext = false; + + DialogsApp* dialogs = furi_record_open(RECORD_DIALOGS); + bool res = dialog_file_browser_show(dialogs, file_path, file_path, &browser_options); + + furi_record_close(RECORD_DIALOGS); + if(!res) { + FURI_LOG_I(TAG, "No file selected"); + break; + } + } + + FURI_LOG_I(TAG, "File selected: %s", furi_string_get_cstr(file_path)); + + if(!text_viewer_open_file(text_viewer, furi_string_get_cstr(file_path))) break; + text_viewer_read_file(text_viewer); + + InputEvent input; + while(furi_message_queue_get(text_viewer->input_queue, &input, FuriWaitForever) == + FuriStatusOk) { + if(input.key == InputKeyBack) { + break; + } else if(input.key == InputKeyUp) { + furi_check(furi_mutex_acquire(text_viewer->mutex, FuriWaitForever) == FuriStatusOk); + if(text_viewer->model->file_offset > 0) { + text_viewer->model->file_offset -= TEXT_VIEWER_BYTES_PER_LINE; + if(!text_viewer_read_file(text_viewer)) break; + } + furi_mutex_release(text_viewer->mutex); + } else if(input.key == InputKeyDown) { + furi_check(furi_mutex_acquire(text_viewer->mutex, FuriWaitForever) == FuriStatusOk); + uint32_t last_byte_on_screen = + text_viewer->model->file_offset + text_viewer->model->file_read_bytes; + + if(text_viewer->model->file_size > last_byte_on_screen) { + text_viewer->model->file_offset += TEXT_VIEWER_BYTES_PER_LINE; + if(!text_viewer_read_file(text_viewer)) break; + } + furi_mutex_release(text_viewer->mutex); + } else if(input.key == InputKeyLeft) { + furi_check(furi_mutex_acquire(text_viewer->mutex, FuriWaitForever) == FuriStatusOk); + text_viewer->model->mode = !text_viewer->model->mode; + furi_mutex_release(text_viewer->mutex); + } else if(input.key == InputKeyRight) { + FuriString* buffer; + buffer = furi_string_alloc(); + furi_string_printf( + buffer, + "File path: %s\nFile size: %lu (0x%lX)", + furi_string_get_cstr(file_path), + text_viewer->model->file_size, + text_viewer->model->file_size); + + DialogsApp* dialogs = furi_record_open(RECORD_DIALOGS); + DialogMessage* message = dialog_message_alloc(); + dialog_message_set_header(message, "Text Viewer v1.1", 16, 2, AlignLeft, AlignTop); + dialog_message_set_icon(message, &I_text_10px, 3, 2); + dialog_message_set_text( + message, furi_string_get_cstr(buffer), 3, 16, AlignLeft, AlignTop); + dialog_message_set_buttons(message, NULL, NULL, "Back"); + dialog_message_show(dialogs, message); + + furi_string_free(buffer); + dialog_message_free(message); + furi_record_close(RECORD_DIALOGS); + } + view_port_update(text_viewer->view_port); + } + } while(false); + + furi_string_free(file_path); + text_viewer_free(text_viewer); + + return 0; +} \ No newline at end of file diff --git a/applications/plugins/text_viewer/textviewerflipper.PNG b/applications/plugins/text_viewer/textviewerflipper.PNG new file mode 100644 index 0000000000000000000000000000000000000000..d357b7455fced494b392f417a676360cb4f33388 GIT binary patch literal 11796 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 W Date: Wed, 18 Jan 2023 20:18:19 +0300 Subject: [PATCH 090/506] Add protoview https://github.com/antirez/protoview --- ReadMe.md | 1 + applications/plugins/protoview/LICENSE | 24 + applications/plugins/protoview/README.md | 130 ++++ applications/plugins/protoview/app.c | 362 +++++++++++ applications/plugins/protoview/app.h | 231 +++++++ applications/plugins/protoview/app_buffer.c | 71 +++ applications/plugins/protoview/app_buffer.h | 31 + applications/plugins/protoview/app_subghz.c | 157 +++++ applications/plugins/protoview/appicon.png | Bin 0 -> 116 bytes .../plugins/protoview/application.fam | 12 + .../plugins/protoview/binaries/README.md | 10 + .../plugins/protoview/binaries/protoview.fap | Bin 0 -> 30656 bytes .../plugins/protoview/binaries/update.sh | 4 + applications/plugins/protoview/crc.c | 20 + .../plugins/protoview/custom_presets.h | 244 +++++++ applications/plugins/protoview/data_feed.c | 120 ++++ .../protoview/images/ProtoViewSignal.jpg | Bin 0 -> 85828 bytes .../plugins/protoview/images/protoview_1.jpg | Bin 0 -> 66885 bytes .../plugins/protoview/images/protoview_2.jpg | Bin 0 -> 64574 bytes .../plugins/protoview/protocols/b4b1.c | 50 ++ .../plugins/protoview/protocols/keeloq.c | 91 +++ .../plugins/protoview/protocols/oregon2.c | 67 ++ .../protoview/protocols/tpms/citroen.c | 63 ++ .../plugins/protoview/protocols/tpms/ford.c | 67 ++ .../protoview/protocols/tpms/renault.c | 69 ++ .../protoview/protocols/tpms/schrader.c | 68 ++ .../protocols/tpms/schrader_eg53ma4.c | 66 ++ .../plugins/protoview/protocols/tpms/toyota.c | 91 +++ applications/plugins/protoview/signal.c | 593 ++++++++++++++++++ applications/plugins/protoview/signal_file.c | 141 +++++ applications/plugins/protoview/ui.c | 104 +++ .../plugins/protoview/view_direct_sampling.c | 67 ++ applications/plugins/protoview/view_info.c | 165 +++++ .../plugins/protoview/view_raw_signal.c | 97 +++ .../plugins/protoview/view_settings.c | 117 ++++ 35 files changed, 3333 insertions(+) create mode 100644 applications/plugins/protoview/LICENSE create mode 100644 applications/plugins/protoview/README.md create mode 100644 applications/plugins/protoview/app.c create mode 100644 applications/plugins/protoview/app.h create mode 100644 applications/plugins/protoview/app_buffer.c create mode 100644 applications/plugins/protoview/app_buffer.h create mode 100644 applications/plugins/protoview/app_subghz.c create mode 100644 applications/plugins/protoview/appicon.png create mode 100644 applications/plugins/protoview/application.fam create mode 100644 applications/plugins/protoview/binaries/README.md create mode 100644 applications/plugins/protoview/binaries/protoview.fap create mode 100755 applications/plugins/protoview/binaries/update.sh create mode 100644 applications/plugins/protoview/crc.c create mode 100644 applications/plugins/protoview/custom_presets.h create mode 100644 applications/plugins/protoview/data_feed.c create mode 100644 applications/plugins/protoview/images/ProtoViewSignal.jpg create mode 100644 applications/plugins/protoview/images/protoview_1.jpg create mode 100644 applications/plugins/protoview/images/protoview_2.jpg create mode 100644 applications/plugins/protoview/protocols/b4b1.c create mode 100644 applications/plugins/protoview/protocols/keeloq.c create mode 100644 applications/plugins/protoview/protocols/oregon2.c create mode 100644 applications/plugins/protoview/protocols/tpms/citroen.c create mode 100644 applications/plugins/protoview/protocols/tpms/ford.c create mode 100644 applications/plugins/protoview/protocols/tpms/renault.c create mode 100644 applications/plugins/protoview/protocols/tpms/schrader.c create mode 100644 applications/plugins/protoview/protocols/tpms/schrader_eg53ma4.c create mode 100644 applications/plugins/protoview/protocols/tpms/toyota.c create mode 100644 applications/plugins/protoview/signal.c create mode 100644 applications/plugins/protoview/signal_file.c create mode 100644 applications/plugins/protoview/ui.c create mode 100644 applications/plugins/protoview/view_direct_sampling.c create mode 100644 applications/plugins/protoview/view_info.c create mode 100644 applications/plugins/protoview/view_raw_signal.c create mode 100644 applications/plugins/protoview/view_settings.c diff --git a/ReadMe.md b/ReadMe.md index 3ae674140..a4913ae2d 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -128,6 +128,7 @@ You can support us by using links or addresses below: - POCSAG Pager [(by xMasterX & Shmuma)](https://github.com/xMasterX/flipper-pager) - Text Viewer [(by kowalski7cc & kyhwana)](https://github.com/kowalski7cc/flipper-zero-text-viewer/tree/refactor-text-app) - **UART Terminal** [(by cool4uma)](https://github.com/cool4uma/UART_Terminal/tree/main) +- **ProtoView** [(by antirez)](https://github.com/antirez/protoview) Games: - DOOM (fixed) [(by p4nic4ttack)](https://github.com/p4nic4ttack/doom-flipper-zero/) diff --git a/applications/plugins/protoview/LICENSE b/applications/plugins/protoview/LICENSE new file mode 100644 index 000000000..2d8a8a74d --- /dev/null +++ b/applications/plugins/protoview/LICENSE @@ -0,0 +1,24 @@ +Copyright (c) 2022-2023 Salvatore Sanfilippo + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/applications/plugins/protoview/README.md b/applications/plugins/protoview/README.md new file mode 100644 index 000000000..a12aec979 --- /dev/null +++ b/applications/plugins/protoview/README.md @@ -0,0 +1,130 @@ +ProtoView is a digital signal detection and visualization tool for the +[Flipper Zero](https://flipperzero.one/). The Flipper is able to identify +a great deal of RF protocols, however when the exact protocol is not +implemented (and there are many proprietary ones, such as the ones of +the car keys), the curious person is left wondering what the device is +sending at all. Using ProtoView she or he can visualize the high and low pulses +like in the example image below (showing a Volkswagen key in 2FSK): + +![ProtoView screenshot raw signal](/images/protoview_1.jpg) + +This is often enough to make an initial idea about the encoding used +and if the selected modulation is correct. + +Other than that, ProtoView is able to decode a few interesting protocols: + +* TPMS sensors: Renault, Toyota, Schrader, Citroen, Ford. +* Microchip HSC200/300/301 Keeloq protocol. +* Oregon thermometer protocol 2. +* PT2262, SC5262 based remotes. +* ... more will be implemented soon, hopefully. Send PRs :) + +![ProtoView screenshot Renault TPMS data](/images/protoview_2.jpg) + +The app implements a framework that makes adding and experimenting with new +protocols very simple. Check the `protocols` directory to see how the +API works. + +The secondary goal of ProtoView is to provide a somewhat-documented application +for the Flipper (even if ProtoView is a pretty atypical application: doesn't make use of the standard widgets and other abstractions provded by the framework). +Many apps dealing with the *subghz subsystem* (the Flipper +abstraction to work with the [CC1101 chip](https://www.ti.com/product/CC1101)) +tend to be complicated and completely undocumented. This is unfortunately +true for the firmware of the device itself. It's a shame because especially +in the case of code that talks with hardware peripherals there are tons +of assumptions and hard-gained lessons that can [only be captured by comments and are in the code only implicitly](http://antirez.com/news/124). + +However, the Flipper firmware source code is well written even if it +lacks comments and documentation, so it is possible to make some ideas of +how things work just grepping inside. + +# Detection algorithm + +In order to show unknown signals, the application attempts to understand if +the samples obtained by the Flipper API (a series of pulses that are high +or low, and with different duration in microseconds) look like belonging to +a legitimate signal, and aren't just noise. + +We can't make assumptions about +the encoding and the data rate of the communication, so we use a simple +but relatively effective algorithm. As we check the signal, we try to detect +long parts of it that are composed of pulses roughly classifiable into +a maximum of three different classes of lengths, plus or minus 10%. Most +encodings are somewhat self-clocked, so they tend to have just two or +three classes of pulse lengths. + +However often pulses of the same theoretical +length have slightly different lengths in the case of high and low level +(RF on or off), so we classify them separately for robustness. + +# Usage + +The application shows the longest coherent signal detected so far. + +* The OK button resets the current signal. +* The UP and DOWN buttons change the scale. Default is 100us per pixel. +* The LEFT and RIGHT buttons switch to settings. + +Under the detected sequence, you will see a small triangle marking a +specific sample. This mark means that the sequence looked coherent up +to that point, and starting from there it could be just noise. + +If the protocol is decoded, the bottom-left corner of the screen +will show the name of the protocol, and going in the next screen +with the right arrow will show information about the decoded signal. + +In the bottom-right corner the application displays an amount of time +in microseconds. This is the average length of the shortest pulse length +detected among the three classes. Usually the *data rate* of the protocol +is something like `1000000/this-number*2`, but it depends on the encoding +and could actually be `1000000/this-number*N` with `N > 2` (here 1000000 +is the number of microseconds in one second, and N is the number of clock +cycles needed to represent a bit). + +Things to investigate: + +* Many cheap remotes (gate openers, remotes, ...) are on the 433.92Mhz or nearby and use OOK modulation. +* Weather stations are often too in the 433.92Mhz OOK. +* For car keys, try 433.92 OOK650 and 868.35 Mhz in OOK or 2FSK. +* For TPMS try 433.92 in TPMS modulation (FSK optimized for these signals). + +# Installing the app from source + +* Download the Flipper Zero dev kit and build it: +``` +mkdir -p ~/flipperZero/official/ +cd ~/flipperZero/official/ +git clone --recursive https://github.com/flipperdevices/flipperzero-firmware.git ./ +./fbt +``` +* Copy this application folder in `official/applications_user`. +* Connect your Flipper via USB. +* Build and install with: `./fbt launch_app APPSRC=protoview`. + +# Installing the binary file (no build needed) + +Drop the `protoview.fap` file you can find in the `binaries` folder into the +following Flipper Zero location: + + /ext/apps/Tools + +The `ext` part means that we are in the SD card. So if you don't want +to use the Android (or other) application to upload the file, +you can just take out the SD card, insert it in your computer, +copy the fine into `apps/Tools`, and that's it. + +# License + +The code is released under the BSD license. + +# Disclaimer + +This application is only provided as an educational tool. The author is not liable in case the application is used to reverse engineer protocols protected by IP or for any other illegal purpose. + +# Credits + +A big thank you to the RTL433 author, [Benjamin Larsson](https://github.com/merbanan). I used the code and tools he developed in many ways: +* To capture TPMS data with rtl433 and save to a file, to later play the IQ files and speedup the development. +* As a sourve of documentation for protocols. +* As an awesome way to visualize and understand protocols, via [these great web tools](https://triq.org/). +* To have tons of fun with RTLSDR in general, now and in the past. diff --git a/applications/plugins/protoview/app.c b/applications/plugins/protoview/app.c new file mode 100644 index 000000000..0f860d08e --- /dev/null +++ b/applications/plugins/protoview/app.c @@ -0,0 +1,362 @@ +/* Copyright (C) 2022-2023 Salvatore Sanfilippo -- All Rights Reserved + * See the LICENSE file for information about the license. */ + +#include "app.h" + +/* If this define is enabled, ProtoView is going to mess with the + * otherwise opaque SubGhzWorker structure in order to disable + * its filter for samples shorter than a given amount (30us at the + * time I'm writing this comment). + * + * This structure must be taken in sync with the one of the firmware. */ +#define PROTOVIEW_DISABLE_SUBGHZ_FILTER 0 + +#ifdef PROTOVIEW_DISABLE_SUBGHZ_FILTER +struct SubGhzWorker { + FuriThread* thread; + FuriStreamBuffer* stream; + + volatile bool running; + volatile bool overrun; + + LevelDuration filter_level_duration; + bool filter_running; + uint16_t filter_duration; + + SubGhzWorkerOverrunCallback overrun_callback; + SubGhzWorkerPairCallback pair_callback; + void* context; +}; +#endif + +RawSamplesBuffer *RawSamples, *DetectedSamples; +extern const SubGhzProtocolRegistry protoview_protocol_registry; + +/* Draw some text with a border. If the outside color is black and the inside + * color is white, it just writes the border of the text, but the function can + * also be used to write a bold variation of the font setting both the + * colors to black, or alternatively to write a black text with a white + * border so that it is visible if there are black stuff on the background. */ +/* The callback actually just passes the control to the actual active + * view callback, after setting up basic stuff like cleaning the screen + * and setting color to black. */ +static void render_callback(Canvas *const canvas, void *ctx) { + ProtoViewApp *app = ctx; + + /* Clear screen. */ + canvas_set_color(canvas, ColorWhite); + canvas_draw_box(canvas, 0, 0, 127, 63); + canvas_set_color(canvas, ColorBlack); + canvas_set_font(canvas, FontPrimary); + + /* Call who is in charge right now. */ + switch(app->current_view) { + case ViewRawPulses: render_view_raw_pulses(canvas,app); break; + case ViewInfo: render_view_info(canvas,app); break; + case ViewFrequencySettings: + case ViewModulationSettings: + render_view_settings(canvas,app); break; + case ViewDirectSampling: render_view_direct_sampling(canvas,app); break; + case ViewLast: furi_crash(TAG " ViewLast selected"); break; + } +} + +/* Here all we do is putting the events into the queue that will be handled + * in the while() loop of the app entry point function. */ +static void input_callback(InputEvent* input_event, void* ctx) +{ + ProtoViewApp *app = ctx; + furi_message_queue_put(app->event_queue,input_event,FuriWaitForever); +} + + +/* Called to switch view (when left/right is pressed). Handles + * changing the current view ID and calling the enter/exit view + * callbacks if needed. */ +static void app_switch_view(ProtoViewApp *app, SwitchViewDirection dir) { + ProtoViewCurrentView old = app->current_view; + if (dir == AppNextView) { + app->current_view++; + if (app->current_view == ViewLast) app->current_view = 0; + } else if (dir == AppPrevView) { + if (app->current_view == 0) + app->current_view = ViewLast-1; + else + app->current_view--; + } + ProtoViewCurrentView new = app->current_view; + + /* Call the enter/exit view callbacks if needed. */ + if (old == ViewDirectSampling) view_exit_direct_sampling(app); + if (new == ViewDirectSampling) view_enter_direct_sampling(app); + /* The frequency/modulation settings are actually a single view: + * as long as the user stays between the two modes of this view we + * don't need to call the exit-view callback. */ + if ((old == ViewFrequencySettings && new != ViewModulationSettings) || + (old == ViewModulationSettings && new != ViewFrequencySettings)) + view_exit_settings(app); + + /* Set the current subview of the view we just left to zero, that is + * the main subview of the view. When re re-enter it we want to see + * the main thing. */ + app->current_subview[old] = 0; + memset(app->view_privdata,0,PROTOVIEW_VIEW_PRIVDATA_LEN); +} + +/* Allocate the application state and initialize a number of stuff. + * This is called in the entry point to create the application state. */ +ProtoViewApp* protoview_app_alloc() { + ProtoViewApp *app = malloc(sizeof(ProtoViewApp)); + + // Init shared data structures + RawSamples = raw_samples_alloc(); + DetectedSamples = raw_samples_alloc(); + + //init setting + app->setting = subghz_setting_alloc(); + subghz_setting_load(app->setting, EXT_PATH("subghz/assets/setting_user")); + + // GUI + app->gui = furi_record_open(RECORD_GUI); + app->view_port = view_port_alloc(); + view_port_draw_callback_set(app->view_port, render_callback, app); + view_port_input_callback_set(app->view_port, input_callback, app); + gui_add_view_port(app->gui, app->view_port, GuiLayerFullscreen); + app->event_queue = furi_message_queue_alloc(8, sizeof(InputEvent)); + app->view_dispatcher = NULL; + app->text_input = NULL; + app->show_text_input = false; + app->current_view = ViewRawPulses; + for (int j = 0; j < ViewLast; j++) app->current_subview[j] = 0; + app->direct_sampling_enabled = false; + app->view_privdata = malloc(PROTOVIEW_VIEW_PRIVDATA_LEN); + memset(app->view_privdata,0,PROTOVIEW_VIEW_PRIVDATA_LEN); + + // Signal found and visualization defaults + app->signal_bestlen = 0; + app->signal_last_scan_idx = 0; + app->signal_decoded = false; + app->us_scale = PROTOVIEW_RAW_VIEW_DEFAULT_SCALE; + app->signal_offset = 0; + app->msg_info = NULL; + + // Init Worker & Protocol + app->txrx = malloc(sizeof(ProtoViewTxRx)); + + /* Setup rx worker and environment. */ + app->txrx->freq_mod_changed = false; + app->txrx->debug_timer_sampling = false; + app->txrx->last_g0_change_time = DWT->CYCCNT; + app->txrx->last_g0_value = false; + app->txrx->worker = subghz_worker_alloc(); +#ifdef PROTOVIEW_DISABLE_SUBGHZ_FILTER + app->txrx->worker->filter_running = 0; +#endif + app->txrx->environment = subghz_environment_alloc(); + subghz_environment_set_protocol_registry( + app->txrx->environment, (void*)&protoview_protocol_registry); + app->txrx->receiver = + subghz_receiver_alloc_init(app->txrx->environment); + subghz_receiver_set_filter(app->txrx->receiver, + SubGhzProtocolFlag_Decodable); + subghz_worker_set_overrun_callback( + app->txrx->worker, + (SubGhzWorkerOverrunCallback)subghz_receiver_reset); + subghz_worker_set_pair_callback( + app->txrx->worker, (SubGhzWorkerPairCallback)subghz_receiver_decode); + subghz_worker_set_context(app->txrx->worker, app->txrx->receiver); + + app->frequency = subghz_setting_get_default_frequency(app->setting); + app->modulation = 0; /* Defaults to ProtoViewModulations[0]. */ + + furi_hal_power_suppress_charge_enter(); + app->running = 1; + + return app; +} + +/* Free what the application allocated. It is not clear to me if the + * Flipper OS, once the application exits, will be able to reclaim space + * even if we forget to free something here. */ +void protoview_app_free(ProtoViewApp *app) { + furi_assert(app); + + // Put CC1101 on sleep. + radio_sleep(app); + + // View related. + view_port_enabled_set(app->view_port, false); + gui_remove_view_port(app->gui, app->view_port); + view_port_free(app->view_port); + furi_record_close(RECORD_GUI); + furi_message_queue_free(app->event_queue); + app->gui = NULL; + + // Frequency setting. + subghz_setting_free(app->setting); + + // Worker stuff. + if (!app->txrx->debug_timer_sampling) { + subghz_receiver_free(app->txrx->receiver); + subghz_environment_free(app->txrx->environment); + subghz_worker_free(app->txrx->worker); + } + free(app->txrx); + + // Raw samples buffers. + raw_samples_free(RawSamples); + raw_samples_free(DetectedSamples); + furi_hal_power_suppress_charge_exit(); + + free(app); +} + +/* Called periodically. Do signal processing here. Data we process here + * will be later displayed by the render callback. The side effect of this + * function is to scan for signals and set DetectedSamples. */ +static void timer_callback(void *ctx) { + ProtoViewApp *app = ctx; + uint32_t delta, lastidx = app->signal_last_scan_idx; + + /* scan_for_signal(), called by this function, deals with a + * circular buffer. To never miss anything, even if a signal spawns + * cross-boundaries, it is enough if we scan each time the buffer fills + * for 50% more compared to the last scan. Thanks to this check we + * can avoid scanning too many times to just find the same data. */ + if (lastidx < RawSamples->idx) { + delta = RawSamples->idx - lastidx; + } else { + delta = RawSamples->total - lastidx + RawSamples->idx; + } + if (delta < RawSamples->total/2) return; + app->signal_last_scan_idx = RawSamples->idx; + scan_for_signal(app); +} + +int32_t protoview_app_entry(void* p) { + UNUSED(p); + ProtoViewApp *app = protoview_app_alloc(); + + /* Create a timer. We do data analysis in the callback. */ + FuriTimer *timer = furi_timer_alloc(timer_callback, FuriTimerTypePeriodic, app); + furi_timer_start(timer, furi_kernel_get_tick_frequency() / 8); + + /* Start listening to signals immediately. */ + radio_begin(app); + radio_rx(app); + + /* This is the main event loop: here we get the events that are pushed + * in the queue by input_callback(), and process them one after the + * other. The timeout is 100 milliseconds, so if not input is received + * before such time, we exit the queue_get() function and call + * view_port_update() in order to refresh our screen content. */ + InputEvent input; + while(app->running) { + FuriStatus qstat = furi_message_queue_get(app->event_queue, &input, 100); + if (qstat == FuriStatusOk) { + if (DEBUG_MSG) FURI_LOG_E(TAG, "Main Loop - Input: type %d key %u", + input.type, input.key); + + /* Handle navigation here. Then handle view-specific inputs + * in the view specific handling function. */ + if (input.type == InputTypeShort && + input.key == InputKeyBack) + { + /* Exit the app. */ + app->running = 0; + } else if (input.type == InputTypeShort && + input.key == InputKeyRight && + get_current_subview(app) == 0) + { + /* Go to the next view. */ + app_switch_view(app,AppNextView); + } else if (input.type == InputTypeShort && + input.key == InputKeyLeft && + get_current_subview(app) == 0) + { + /* Go to the previous view. */ + app_switch_view(app,AppPrevView); + } else { + /* This is where we pass the control to the currently + * active view input processing. */ + switch(app->current_view) { + case ViewRawPulses: + process_input_raw_pulses(app,input); + break; + case ViewInfo: + process_input_info(app,input); + break; + case ViewFrequencySettings: + case ViewModulationSettings: + process_input_settings(app,input); + break; + case ViewDirectSampling: + process_input_direct_sampling(app,input); + break; + case ViewLast: furi_crash(TAG " ViewLast selected"); break; + } + } + } else { + /* Useful to understand if the app is still alive when it + * does not respond because of bugs. */ + if (DEBUG_MSG) { + static int c = 0; c++; + if (!(c % 20)) FURI_LOG_E(TAG, "Loop timeout"); + } + } + if (app->show_text_input) { + /* Remove our viewport: we need to use a view dispatcher + * in order to show the standard Flipper keyboard. */ + gui_remove_view_port(app->gui, app->view_port); + + /* Allocate a view dispatcher, add a text input view to it, + * and activate it. */ + app->view_dispatcher = view_dispatcher_alloc(); + view_dispatcher_enable_queue(app->view_dispatcher); + app->text_input = text_input_alloc(); + view_dispatcher_set_event_callback_context(app->view_dispatcher,app); + view_dispatcher_add_view(app->view_dispatcher, 0, text_input_get_view(app->text_input)); + view_dispatcher_switch_to_view(app->view_dispatcher, 0); + + /* Setup the text input view. The different parameters are set + * in the app structure by the view that wanted to show the + * input text. The callback, buffer and buffer len must be set. */ + text_input_set_header_text(app->text_input, "Save signal filename"); + text_input_set_result_callback( + app->text_input, + app->text_input_done_callback, + app, + app->text_input_buffer, + app->text_input_buffer_len, + false); + + /* Run the dispatcher with the keyboard. */ + view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); + view_dispatcher_run(app->view_dispatcher); + + /* Undo all it: remove the view from the dispatcher, free it + * so that it removes itself from the current gui, finally + * restore our viewport. */ + view_dispatcher_remove_view(app->view_dispatcher, 0); + text_input_free(app->text_input); + view_dispatcher_free(app->view_dispatcher); + app->view_dispatcher = NULL; + gui_add_view_port(app->gui, app->view_port, GuiLayerFullscreen); + app->show_text_input = false; + } else { + view_port_update(app->view_port); + } + } + + /* App no longer running. Shut down and free. */ + if (app->txrx->txrx_state == TxRxStateRx) { + FURI_LOG_E(TAG, "Putting CC1101 to sleep before exiting."); + radio_rx_end(app); + radio_sleep(app); + } + + furi_timer_free(timer); + protoview_app_free(app); + return 0; +} + diff --git a/applications/plugins/protoview/app.h b/applications/plugins/protoview/app.h new file mode 100644 index 000000000..7698d4325 --- /dev/null +++ b/applications/plugins/protoview/app.h @@ -0,0 +1,231 @@ +/* Copyright (C) 2022-2023 Salvatore Sanfilippo -- All Rights Reserved + * See the LICENSE file for information about the license. */ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "app_buffer.h" + +#define TAG "ProtoView" +#define PROTOVIEW_RAW_VIEW_DEFAULT_SCALE 100 // 100us is 1 pixel by default +#define BITMAP_SEEK_NOT_FOUND UINT32_MAX // Returned by function as sentinel +#define PROTOVIEW_VIEW_PRIVDATA_LEN 64 // View specific private data len + +#define DEBUG_MSG 1 + +typedef struct ProtoViewApp ProtoViewApp; + +/* Subghz system state */ +typedef enum { + TxRxStateIDLE, + TxRxStateRx, + TxRxStateSleep, +} TxRxState; + +/* Currently active view. */ +typedef enum { + ViewRawPulses, + ViewInfo, + ViewFrequencySettings, + ViewModulationSettings, + ViewDirectSampling, + ViewLast, /* Just a sentinel to wrap around. */ +} ProtoViewCurrentView; + +/* Used by app_switch_view() */ +typedef enum { + AppNextView, + AppPrevView +} SwitchViewDirection; + +typedef struct { + const char *name; // Name to show to the user. + const char *id; // Identifier in the Flipper API/file. + FuriHalSubGhzPreset preset; // The preset ID. + uint8_t *custom; // If not null, a set of registers for + // the CC1101, specifying a custom preset. +} ProtoViewModulation; + +extern ProtoViewModulation ProtoViewModulations[]; /* In app_subghz.c */ + +/* This is the context of our subghz worker and associated thread. + * It receives data and we get our protocol "feed" callback called + * with the level (1 or 0) and duration. */ +struct ProtoViewTxRx { + bool freq_mod_changed; /* The user changed frequency and/or modulation + from the interface. There is to restart the + radio with the right parameters. */ + SubGhzWorker* worker; /* Our background worker. */ + SubGhzEnvironment* environment; + SubGhzReceiver* receiver; + TxRxState txrx_state; /* Receiving, idle or sleeping? */ + + /* Timer sampling mode state. */ + bool debug_timer_sampling; /* Read data from GDO0 in a busy loop. Only + for testing. */ + uint32_t last_g0_change_time; /* Last high->low (or reverse) switch. */ + bool last_g0_value; /* Current value (high or low): we are + checking the duration in the timer + handler. */ +}; + +typedef struct ProtoViewTxRx ProtoViewTxRx; + +/* This stucture is filled by the decoder for specific protocols with the + * informations about the message. ProtoView will display such information + * in the message info view. */ +#define PROTOVIEW_MSG_STR_LEN 32 +typedef struct ProtoViewMsgInfo { + char name[PROTOVIEW_MSG_STR_LEN]; /* Protocol name and version. */ + char raw[PROTOVIEW_MSG_STR_LEN]; /* Protocol specific raw representation.*/ + /* The following is what the decoder wants to show to user. Each decoder + * can use the number of fileds it needs. */ + char info1[PROTOVIEW_MSG_STR_LEN]; /* Protocol specific info line 1. */ + char info2[PROTOVIEW_MSG_STR_LEN]; /* Protocol specific info line 2. */ + char info3[PROTOVIEW_MSG_STR_LEN]; /* Protocol specific info line 3. */ + char info4[PROTOVIEW_MSG_STR_LEN]; /* Protocol specific info line 4. */ + /* Low level information of the detected signal: the following are filled + * by the protocol decoding function: */ + uint32_t start_off; /* Pulses start offset in the bitmap. */ + uint32_t pulses_count; /* Number of pulses of the full message. */ + /* The following are passed already filled to the decoder. */ + uint32_t short_pulse_dur; /* Microseconds duration of the short pulse. */ + /* The following are filled by ProtoView core after the decoder returned + * success. */ + uint8_t *bits; /* Bitmap with the signal. */ + uint32_t bits_bytes; /* Number of full bytes in the bitmap, that + is 'pulses_count/8' rounded to the next + integer. */ +} ProtoViewMsgInfo; + +struct ProtoViewApp { + /* GUI */ + Gui *gui; + ViewPort *view_port; /* We just use a raw viewport and we render + everything into the low level canvas. */ + ProtoViewCurrentView current_view; /* Active left-right view ID. */ + int current_subview[ViewLast]; /* Active up-down subview ID. */ + FuriMessageQueue *event_queue; /* Keypress events go here. */ + ViewDispatcher *view_dispatcher; /* Used only when we want to show + the text_input view for a moment. + Otherwise it is set to null. */ + TextInput *text_input; + bool show_text_input; + char *text_input_buffer; + uint32_t text_input_buffer_len; + void (*text_input_done_callback)(void*); + + /* Radio related. */ + ProtoViewTxRx *txrx; /* Radio state. */ + SubGhzSetting *setting; /* A list of valid frequencies. */ + + /* Generic app state. */ + int running; /* Once false exists the app. */ + uint32_t signal_bestlen; /* Longest coherent signal observed so far. */ + uint32_t signal_last_scan_idx; /* Index of the buffer last time we + performed the scan. */ + bool signal_decoded; /* Was the current signal decoded? */ + ProtoViewMsgInfo *msg_info; /* Decoded message info if not NULL. */ + bool direct_sampling_enabled; /* This special view needs an explicit + acknowledge to work. */ + void *view_privdata; /* This is a piece of memory of total size + PROTOVIEW_VIEW_PRIVDATA_LEN that it is + initialized to zero when we switch to + a a new view. While the view we are using + is the same, it can be used by the view to + store any kind of info inside, just casting + the pointer to a few specific-data structure. */ + + /* Raw view apps state. */ + uint32_t us_scale; /* microseconds per pixel. */ + uint32_t signal_offset; /* Long press left/right panning in raw view. */ + + /* Configuration view app state. */ + uint32_t frequency; /* Current frequency. */ + uint8_t modulation; /* Current modulation ID, array index in the + ProtoViewModulations table. */ +}; + +typedef struct ProtoViewDecoder { + const char *name; /* Protocol name. */ + /* The decode function takes a buffer that is actually a bitmap, with + * high and low levels represented as 0 and 1. The number of high/low + * pulses represented by the bitmap is passed as the 'numbits' argument, + * while 'numbytes' represents the total size of the bitmap pointed by + * 'bits'. So 'numbytes' is mainly useful to pass as argument to other + * functions that perform bit extraction with bound checking, such as + * bitmap_get() and so forth. */ + bool (*decode)(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoViewMsgInfo *info); +} ProtoViewDecoder; + +extern RawSamplesBuffer *RawSamples, *DetectedSamples; + +/* app_radio.c */ +void radio_begin(ProtoViewApp* app); +uint32_t radio_rx(ProtoViewApp* app); +void radio_idle(ProtoViewApp* app); +void radio_rx_end(ProtoViewApp* app); +void radio_sleep(ProtoViewApp* app); +void raw_sampling_worker_start(ProtoViewApp *app); +void raw_sampling_worker_stop(ProtoViewApp *app); + +/* signal.c */ +uint32_t duration_delta(uint32_t a, uint32_t b); +void reset_current_signal(ProtoViewApp *app); +void scan_for_signal(ProtoViewApp *app); +bool bitmap_get(uint8_t *b, uint32_t blen, uint32_t bitpos); +void bitmap_set(uint8_t *b, uint32_t blen, uint32_t bitpos, bool val); +void bitmap_copy(uint8_t *d, uint32_t dlen, uint32_t doff, uint8_t *s, uint32_t slen, uint32_t soff, uint32_t count); +void bitmap_set_pattern(uint8_t *b, uint32_t blen, uint32_t off, const char *pat); +void bitmap_reverse_bytes(uint8_t *p, uint32_t len); +bool bitmap_match_bits(uint8_t *b, uint32_t blen, uint32_t bitpos, const char *bits); +uint32_t bitmap_seek_bits(uint8_t *b, uint32_t blen, uint32_t startpos, uint32_t maxbits, const char *bits); +uint32_t convert_from_line_code(uint8_t *buf, uint64_t buflen, uint8_t *bits, uint32_t len, uint32_t offset, const char *zero_pattern, const char *one_pattern); +uint32_t convert_from_diff_manchester(uint8_t *buf, uint64_t buflen, uint8_t *bits, uint32_t len, uint32_t off, bool previous); +void init_msg_info(ProtoViewMsgInfo *i, ProtoViewApp *app); +void free_msg_info(ProtoViewMsgInfo *i); + +/* signal_file.c */ +bool save_signal(ProtoViewApp *app, const char *filename); + +/* view_*.c */ +void render_view_raw_pulses(Canvas *const canvas, ProtoViewApp *app); +void process_input_raw_pulses(ProtoViewApp *app, InputEvent input); +void render_view_settings(Canvas *const canvas, ProtoViewApp *app); +void process_input_settings(ProtoViewApp *app, InputEvent input); +void render_view_info(Canvas *const canvas, ProtoViewApp *app); +void process_input_info(ProtoViewApp *app, InputEvent input); +void render_view_direct_sampling(Canvas *const canvas, ProtoViewApp *app); +void process_input_direct_sampling(ProtoViewApp *app, InputEvent input); +void view_enter_direct_sampling(ProtoViewApp *app); +void view_exit_direct_sampling(ProtoViewApp *app); +void view_exit_settings(ProtoViewApp *app); + +/* ui.c */ +int get_current_subview(ProtoViewApp *app); +void show_available_subviews(Canvas *canvas, ProtoViewApp *app, int last_subview); +bool process_subview_updown(ProtoViewApp *app, InputEvent input, int last_subview); +void canvas_draw_str_with_border(Canvas* canvas, uint8_t x, uint8_t y, const char* str, Color text_color, Color border_color); +void show_keyboard(ProtoViewApp *app, char *buffer, uint32_t buflen, + void (*done_callback)(void*)); +void dismiss_keyboard(ProtoViewApp *app); + +/* crc.c */ +uint8_t crc8(const uint8_t *data, size_t len, uint8_t init, uint8_t poly); diff --git a/applications/plugins/protoview/app_buffer.c b/applications/plugins/protoview/app_buffer.c new file mode 100644 index 000000000..7c069fd91 --- /dev/null +++ b/applications/plugins/protoview/app_buffer.c @@ -0,0 +1,71 @@ +/* Copyright (C) 2022-2023 Salvatore Sanfilippo -- All Rights Reserved + * See the LICENSE file for information about the license. */ + +#include +#include +#include +#include +#include "app_buffer.h" + +/* Allocate and initialize a samples buffer. */ +RawSamplesBuffer *raw_samples_alloc(void) { + RawSamplesBuffer *buf = malloc(sizeof(*buf)); + buf->mutex = furi_mutex_alloc(FuriMutexTypeNormal); + raw_samples_reset(buf); + return buf; +} + +/* Free a sample buffer. Should be called when the mutex is released. */ +void raw_samples_free(RawSamplesBuffer *s) { + furi_mutex_free(s->mutex); + free(s); +} + +/* This just set all the samples to zero and also resets the internal + * index. There is no need to call it after raw_samples_alloc(), but only + * when one wants to reset the whole buffer of samples. */ +void raw_samples_reset(RawSamplesBuffer *s) { + furi_mutex_acquire(s->mutex,FuriWaitForever); + s->total = RAW_SAMPLES_NUM; + s->idx = 0; + s->short_pulse_dur = 0; + memset(s->samples,0,sizeof(s->samples)); + furi_mutex_release(s->mutex); +} + +/* Set the raw sample internal index so that what is currently at + * offset 'offset', will appear to be at 0 index. */ +void raw_samples_center(RawSamplesBuffer *s, uint32_t offset) { + s->idx = (s->idx+offset) % RAW_SAMPLES_NUM; +} + +/* Add the specified sample in the circular buffer. */ +void raw_samples_add(RawSamplesBuffer *s, bool level, uint32_t dur) { + furi_mutex_acquire(s->mutex,FuriWaitForever); + s->samples[s->idx].level = level; + s->samples[s->idx].dur = dur; + s->idx = (s->idx+1) % RAW_SAMPLES_NUM; + furi_mutex_release(s->mutex); +} + +/* Get the sample from the buffer. It is possible to use out of range indexes + * as 'idx' because the modulo operation will rewind back from the start. */ +void raw_samples_get(RawSamplesBuffer *s, uint32_t idx, bool *level, uint32_t *dur) +{ + furi_mutex_acquire(s->mutex,FuriWaitForever); + idx = (s->idx + idx) % RAW_SAMPLES_NUM; + *level = s->samples[idx].level; + *dur = s->samples[idx].dur; + furi_mutex_release(s->mutex); +} + +/* Copy one buffer to the other, including current index. */ +void raw_samples_copy(RawSamplesBuffer *dst, RawSamplesBuffer *src) { + furi_mutex_acquire(src->mutex,FuriWaitForever); + furi_mutex_acquire(dst->mutex,FuriWaitForever); + dst->idx = src->idx; + dst->short_pulse_dur = src->short_pulse_dur; + memcpy(dst->samples,src->samples,sizeof(dst->samples)); + furi_mutex_release(src->mutex); + furi_mutex_release(dst->mutex); +} diff --git a/applications/plugins/protoview/app_buffer.h b/applications/plugins/protoview/app_buffer.h new file mode 100644 index 000000000..3a34d50f8 --- /dev/null +++ b/applications/plugins/protoview/app_buffer.h @@ -0,0 +1,31 @@ +/* Copyright (C) 2022-2023 Salvatore Sanfilippo -- All Rights Reserved + * See the LICENSE file for information about the license. */ + +/* Our circular buffer of raw samples, used in order to display + * the signal. */ + +#define RAW_SAMPLES_NUM 2048 /* Use a power of two: we take the modulo + of the index quite often to normalize inside + the range, and division is slow. */ +typedef struct RawSamplesBuffer { + FuriMutex *mutex; + struct { + uint16_t level:1; + uint16_t dur:15; + } samples[RAW_SAMPLES_NUM]; + uint32_t idx; /* Current idx (next to write). */ + uint32_t total; /* Total samples: same as RAW_SAMPLES_NUM, we provide + this field for a cleaner interface with the user, but + we always use RAW_SAMPLES_NUM when taking the modulo so + the compiler can optimize % as bit masking. */ + /* Signal features. */ + uint32_t short_pulse_dur; /* Duration of the shortest pulse. */ +} RawSamplesBuffer; + +RawSamplesBuffer *raw_samples_alloc(void); +void raw_samples_reset(RawSamplesBuffer *s); +void raw_samples_center(RawSamplesBuffer *s, uint32_t offset); +void raw_samples_add(RawSamplesBuffer *s, bool level, uint32_t dur); +void raw_samples_get(RawSamplesBuffer *s, uint32_t idx, bool *level, uint32_t *dur); +void raw_samples_copy(RawSamplesBuffer *dst, RawSamplesBuffer *src); +void raw_samples_free(RawSamplesBuffer *s); diff --git a/applications/plugins/protoview/app_subghz.c b/applications/plugins/protoview/app_subghz.c new file mode 100644 index 000000000..840b683dc --- /dev/null +++ b/applications/plugins/protoview/app_subghz.c @@ -0,0 +1,157 @@ +/* Copyright (C) 2022-2023 Salvatore Sanfilippo -- All Rights Reserved + * See the LICENSE file for information about the license. */ + +#include "app.h" +#include "custom_presets.h" + +#include +#include +#include +#include + +void raw_sampling_worker_start(ProtoViewApp *app); +void raw_sampling_worker_stop(ProtoViewApp *app); + +ProtoViewModulation ProtoViewModulations[] = { + {"OOK 650Khz", "FuriHalSubGhzPresetOok650Async", + FuriHalSubGhzPresetOok650Async, NULL}, + {"OOK 270Khz", "FuriHalSubGhzPresetOok270Async", + FuriHalSubGhzPresetOok270Async, NULL}, + {"2FSK 2.38Khz", "FuriHalSubGhzPreset2FSKDev238Async", + FuriHalSubGhzPreset2FSKDev238Async, NULL}, + {"2FSK 47.6Khz", "FuriHalSubGhzPreset2FSKDev476Async", + FuriHalSubGhzPreset2FSKDev476Async, NULL}, + {"TPMS 1 (FSK)", NULL, 0, (uint8_t*)protoview_subghz_tpms1_fsk_async_regs}, + {"TPMS 2 (OOK)", NULL, 0, (uint8_t*)protoview_subghz_tpms2_ook_async_regs}, + {"TPMS 3 (FSK)", NULL, 0, (uint8_t*)protoview_subghz_tpms3_fsk_async_regs}, + {"TPMS 4 (FSK)", NULL, 0, (uint8_t*)protoview_subghz_tpms4_fsk_async_regs}, + {NULL, NULL, 0, NULL} /* End of list sentinel. */ +}; + +/* Called after the application initialization in order to setup the + * subghz system and put it into idle state. If the user wants to start + * receiving we will call radio_rx() to start a receiving worker and + * associated thread. */ +void radio_begin(ProtoViewApp* app) { + furi_assert(app); + furi_hal_subghz_reset(); + furi_hal_subghz_idle(); + + /* The CC1101 preset can be either one of the standard presets, if + * the modulation "custom" field is NULL, or a custom preset we + * defined in custom_presets.h. */ + if (ProtoViewModulations[app->modulation].custom == NULL) + furi_hal_subghz_load_preset(ProtoViewModulations[app->modulation].preset); + else + furi_hal_subghz_load_custom_preset(ProtoViewModulations[app->modulation].custom); + furi_hal_gpio_init(&gpio_cc1101_g0, GpioModeInput, GpioPullNo, GpioSpeedLow); + app->txrx->txrx_state = TxRxStateIDLE; +} + +/* Setup subghz to start receiving using a background worker. */ +uint32_t radio_rx(ProtoViewApp* app) { + furi_assert(app); + if(!furi_hal_subghz_is_frequency_valid(app->frequency)) { + furi_crash(TAG" Incorrect RX frequency."); + } + + if (app->txrx->txrx_state == TxRxStateRx) return app->frequency; + + furi_hal_subghz_idle(); /* Put it into idle state in case it is sleeping. */ + uint32_t value = furi_hal_subghz_set_frequency_and_path(app->frequency); + FURI_LOG_E(TAG, "Switched to frequency: %lu", value); + furi_hal_gpio_init(&gpio_cc1101_g0, GpioModeInput, GpioPullNo, GpioSpeedLow); + furi_hal_subghz_flush_rx(); + furi_hal_subghz_rx(); + if (!app->txrx->debug_timer_sampling) { + + furi_hal_subghz_start_async_rx(subghz_worker_rx_callback, + app->txrx->worker); + subghz_worker_start(app->txrx->worker); + } else { + raw_sampling_worker_start(app); + } + app->txrx->txrx_state = TxRxStateRx; + return value; +} + +/* Stop subghz worker (if active), put radio on idle state. */ +void radio_rx_end(ProtoViewApp* app) { + furi_assert(app); + if (app->txrx->txrx_state == TxRxStateRx) { + if (!app->txrx->debug_timer_sampling) { + if(subghz_worker_is_running(app->txrx->worker)) { + subghz_worker_stop(app->txrx->worker); + furi_hal_subghz_stop_async_rx(); + } + } else { + raw_sampling_worker_stop(app); + } + } + furi_hal_subghz_idle(); + app->txrx->txrx_state = TxRxStateIDLE; +} + +/* Put radio on sleep. */ +void radio_sleep(ProtoViewApp* app) { + furi_assert(app); + if (app->txrx->txrx_state == TxRxStateRx) { + /* We can't go from having an active RX worker to sleeping. + * Stop the RX subsystems first. */ + radio_rx_end(app); + } + furi_hal_subghz_sleep(); + app->txrx->txrx_state = TxRxStateSleep; +} + +/* ============================= Raw sampling mode ============================= + * This is a special mode that uses a high frequency timer to sample the + * CC1101 pin directly. It's useful for debugging purposes when we want + * to get the raw data from the chip and completely bypass the subghz + * Flipper system. + * ===========================================================================*/ + +void protoview_timer_isr(void *ctx) { + ProtoViewApp *app = ctx; + + bool level = furi_hal_gpio_read(&gpio_cc1101_g0); + if (app->txrx->last_g0_value != level) { + uint32_t now = DWT->CYCCNT; + uint32_t dur = now - app->txrx->last_g0_change_time; + dur /= furi_hal_cortex_instructions_per_microsecond(); + if (dur > 15000) dur = 15000; + raw_samples_add(RawSamples, app->txrx->last_g0_value, dur); + app->txrx->last_g0_value = level; + app->txrx->last_g0_change_time = now; + } + LL_TIM_ClearFlag_UPDATE(TIM2); +} + +void raw_sampling_worker_start(ProtoViewApp *app) { + UNUSED(app); + + LL_TIM_InitTypeDef tim_init = { + .Prescaler = 63, /* CPU frequency is ~64Mhz. */ + .CounterMode = LL_TIM_COUNTERMODE_UP, + .Autoreload = 5, /* Sample every 5 us */ + }; + + LL_TIM_Init(TIM2, &tim_init); + LL_TIM_SetClockSource(TIM2, LL_TIM_CLOCKSOURCE_INTERNAL); + LL_TIM_DisableCounter(TIM2); + LL_TIM_SetCounter(TIM2, 0); + furi_hal_interrupt_set_isr(FuriHalInterruptIdTIM2, protoview_timer_isr, app); + LL_TIM_EnableIT_UPDATE(TIM2); + LL_TIM_EnableCounter(TIM2); + FURI_LOG_E(TAG, "Timer enabled"); +} + +void raw_sampling_worker_stop(ProtoViewApp *app) { + UNUSED(app); + FURI_CRITICAL_ENTER(); + LL_TIM_DisableCounter(TIM2); + LL_TIM_DisableIT_UPDATE(TIM2); + furi_hal_interrupt_set_isr(FuriHalInterruptIdTIM2, NULL, NULL); + LL_TIM_DeInit(TIM2); + FURI_CRITICAL_EXIT(); +} diff --git a/applications/plugins/protoview/appicon.png b/applications/plugins/protoview/appicon.png new file mode 100644 index 0000000000000000000000000000000000000000..7ce5c4effe68487f668016cee2623ec193cf832c GIT binary patch literal 116 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 literal 0 HcmV?d00001 diff --git a/applications/plugins/protoview/protocols/b4b1.c b/applications/plugins/protoview/protocols/b4b1.c new file mode 100644 index 000000000..d1835ec19 --- /dev/null +++ b/applications/plugins/protoview/protocols/b4b1.c @@ -0,0 +1,50 @@ +/* PT/SC remotes. Usually 443.92 Mhz OOK. + * + * This line code is used in many remotes such as Princeton chips + * named PT2262, Silian Microelectronics SC5262 and others. + * Basically every 4 pulsee represent a bit, where 1000 means 0, and + * 1110 means 1. Usually we can read 24 bits of data. + * In this specific implementation we check for a prelude that is + * 1 bit high, 31 bits low, but the check is relaxed. */ + +#include "../app.h" + +static bool decode(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoViewMsgInfo *info) { + if (numbits < 30) return false; + const char *sync_patterns[3] = { + "10000000000000000000000000000001", /* 30 zero bits. */ + "100000000000000000000000000000001", /* 31 zero bits. */ + "1000000000000000000000000000000001", /* 32 zero bits. */ + }; + + uint32_t off; + int j; + for (j = 0; j < 3; j++) { + off = bitmap_seek_bits(bits,numbytes,0,numbits,sync_patterns[j]); + if (off != BITMAP_SEEK_NOT_FOUND) break; + } + if (off == BITMAP_SEEK_NOT_FOUND) return false; + if (DEBUG_MSG) FURI_LOG_E(TAG, "B4B1 preamble at: %lu",off); + info->start_off = off; + + // Seek data setction. Why -1? Last bit is data. + off += strlen(sync_patterns[j])-1; + + uint8_t d[3]; /* 24 bits of data. */ + uint32_t decoded = + convert_from_line_code(d,sizeof(d),bits,numbytes,off,"1000","1110"); + + if (DEBUG_MSG) FURI_LOG_E(TAG, "B4B1 decoded: %lu",decoded); + if (decoded < 24) return false; + + off += 24*4; // seek to end symbol offset to calculate the length. + off++; // In this protocol there is a final pulse as terminator. + info->pulses_count = off - info->start_off; + snprintf(info->name,PROTOVIEW_MSG_STR_LEN,"PT/SC remote"); + snprintf(info->raw,PROTOVIEW_MSG_STR_LEN,"%02X%02X%02X",d[0],d[1],d[2]); + return true; +} + +ProtoViewDecoder B4B1Decoder = { + "B4B1", decode +}; diff --git a/applications/plugins/protoview/protocols/keeloq.c b/applications/plugins/protoview/protocols/keeloq.c new file mode 100644 index 000000000..db59be230 --- /dev/null +++ b/applications/plugins/protoview/protocols/keeloq.c @@ -0,0 +1,91 @@ +/* Microchip HCS200/HCS300/HSC301 KeeLoq, rolling code remotes. + * + * Usually 443.92 Mhz OOK, ~200us or ~400us pulse len, depending + * on the configuration. + * + * Preamble: 12 pairs of alternating pulse/gap. + * Sync: long gap of around 10 times the duration of the short-pulse. + * Data: pulse width encoded data. Each bit takes three cycles: + * + * 0 = 110 + * 1 = 100 + * + * There are a total of 66 bits transmitted. + * 0..31: 32 bits of encrypted rolling code. + * 32..59: Remote ID, 28 bits + * 60..63: Buttons pressed + * 64..64: Low battery if set + * 65..65: Always set to 1 + * + * Bits in bytes are inverted: least significant bit is first. + * For some reason there is no checksum whatsoever, so we only decode + * if we find everything well formed. + */ + +#include "../app.h" + +static bool decode(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoViewMsgInfo *info) { + + /* In the sync pattern, we require the 12 high/low pulses and at least + * half the gap we expect (5 pulses times, one is the final zero in the + * 24 symbols high/low sequence, then other 4). */ + const char *sync_pattern = "101010101010101010101010" "0000"; + uint8_t sync_len = 24+4; + if (numbits-sync_len+sync_len < 3*66) return false; + uint32_t off = bitmap_seek_bits(bits,numbytes,0,numbits,sync_pattern); + if (off == BITMAP_SEEK_NOT_FOUND) return false; + + info->start_off = off; + off += sync_len; // Seek start of message. + + /* Now there is half the gap left, but we allow from 3 to 7, instead of 5 + * symbols of gap, to avoid missing the signal for a matter of wrong + * timing. */ + uint8_t gap_len = 0; + while(gap_len <= 7 && bitmap_get(bits,numbytes,off+gap_len) == 0) + gap_len++; + if (gap_len < 3 || gap_len > 7) return false; + + off += gap_len; + FURI_LOG_E(TAG, "Keeloq preamble+sync found"); + + uint8_t raw[9] = {0}; + uint32_t decoded = + convert_from_line_code(raw,sizeof(raw),bits,numbytes,off, + "110","100"); /* Pulse width modulation. */ + FURI_LOG_E(TAG, "Keeloq decoded bits: %lu", decoded); + if (decoded < 66) return false; /* Require the full 66 bits. */ + + info->pulses_count = (off+66*3) - info->start_off; + + bitmap_reverse_bytes(raw,sizeof(raw)); /* Keeloq is LSB first. */ + + int buttons = raw[7]>>4; + int s3 = (buttons&1) != 0; + int s0 = (buttons&2) != 0; + int s1 = (buttons&4) != 0; + int s2 = (buttons&8) != 0; + + int remote_id = ((raw[7]&0x0f) << 24) | + (raw[6] << 16) | + (raw[5] << 8) | + (raw[4] << 0); + int lowbat = raw[8]&0x80; + + snprintf(info->name,sizeof(info->name),"%s","Keeloq remote"); + snprintf(info->raw,sizeof(info->raw),"%02X%02X%02X%02X%02X%02X%02X%02X%02X", + raw[0],raw[1],raw[2],raw[3],raw[4],raw[5], + raw[6],raw[7],raw[8]); + snprintf(info->info1,sizeof(info->info1),"Encrpyted %02X%02X%02X%02X", + raw[3],raw[2],raw[1],raw[0]); + snprintf(info->info2,sizeof(info->info2),"ID %08X", remote_id); + snprintf(info->info3,sizeof(info->info3),"s0-s3: %d%d%d%d", + s0,s1,s2,s3); + snprintf(info->info4,sizeof(info->info4),"Low battery? %s", + lowbat ? "yes" : "no"); + return true; +} + +ProtoViewDecoder KeeloqDecoder = { + "Keeloq", decode +}; diff --git a/applications/plugins/protoview/protocols/oregon2.c b/applications/plugins/protoview/protocols/oregon2.c new file mode 100644 index 000000000..aa7346619 --- /dev/null +++ b/applications/plugins/protoview/protocols/oregon2.c @@ -0,0 +1,67 @@ +/* Oregon remote termometers. Usually 443.92 Mhz OOK. + * + * The protocol is described here: + * https://wmrx00.sourceforge.net/Arduino/OregonScientific-RF-Protocols.pdf + * This implementation is not very complete. */ + +#include "../app.h" + +static bool decode(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoViewMsgInfo *info) { + if (numbits < 32) return false; + const char *sync_pattern = "01100110" "01100110" "10010110" "10010110"; + uint64_t off = bitmap_seek_bits(bits,numbytes,0,numbits,sync_pattern); + if (off == BITMAP_SEEK_NOT_FOUND) return false; + FURI_LOG_E(TAG, "Oregon2 preamble+sync found"); + + info->start_off = off; + off += 32; /* Skip preamble. */ + + uint8_t buffer[8], raw[8] = {0}; + uint32_t decoded = + convert_from_line_code(buffer,sizeof(buffer),bits,numbytes,off,"1001","0110"); + FURI_LOG_E(TAG, "Oregon2 decoded bits: %lu", decoded); + + if (decoded < 11*4) return false; /* Minimum len to extract some data. */ + info->pulses_count = (off+11*4*4) - info->start_off; + + char temp[3] = {0}, deviceid[2] = {0}, hum[2] = {0}; + for (int j = 0; j < 64; j += 4) { + uint8_t nib[1]; + nib[0] = (bitmap_get(buffer,8,j+0) | + bitmap_get(buffer,8,j+1) << 1 | + bitmap_get(buffer,8,j+2) << 2 | + bitmap_get(buffer,8,j+3) << 3); + if (DEBUG_MSG) FURI_LOG_E(TAG, "Not inverted nibble[%d]: %x", j/4, (unsigned int)nib[0]); + raw[j/8] |= nib[0] << (4-(j%4)); + switch(j/4) { + case 1: deviceid[0] |= nib[0]; break; + case 0: deviceid[0] |= nib[0] << 4; break; + case 3: deviceid[1] |= nib[0]; break; + case 2: deviceid[1] |= nib[0] << 4; break; + case 10: temp[0] = nib[0]; break; + /* Fixme: take the temperature sign from nibble 11. */ + case 9: temp[1] = nib[0]; break; + case 8: temp[2] = nib[0]; break; + case 13: hum[0] = nib[0]; break; + case 12: hum[1] = nib[0]; break; + } + } + + snprintf(info->name,sizeof(info->name),"%s","Oregon v2.1"); + /* The following line crashes the Flipper because of broken + * snprintf() implementation. */ + snprintf(info->raw,sizeof(info->raw),"%02X%02X%02X%02X%02X%02X%02X%02X", + raw[0],raw[1],raw[2],raw[3],raw[4],raw[5], + raw[6],raw[7]); + snprintf(info->info1,sizeof(info->info1),"Sensor ID %02X%02X", + deviceid[0], deviceid[1]); + snprintf(info->info2,sizeof(info->info2),"Temperature %d%d.%d", + temp[0],temp[1],temp[2]); + snprintf(info->info3,sizeof(info->info3),"Humidity %d%d", + hum[0],hum[1]); + return true; +} + +ProtoViewDecoder Oregon2Decoder = { + "Oregon2", decode +}; diff --git a/applications/plugins/protoview/protocols/tpms/citroen.c b/applications/plugins/protoview/protocols/tpms/citroen.c new file mode 100644 index 000000000..0a34d4549 --- /dev/null +++ b/applications/plugins/protoview/protocols/tpms/citroen.c @@ -0,0 +1,63 @@ +/* Citroen TPMS. Usually 443.92 Mhz FSK. + * + * Preamble of ~14 high/low 52 us pulses + * Sync of high 100us pulse then 50us low + * Then Manchester bits, 10 bytes total. + * Simple XOR checksum. */ + +#include "../../app.h" + +static bool decode(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoViewMsgInfo *info) { + + /* We consider a preamble of 17 symbols. They are more, but the decoding + * is more likely to happen if we don't pretend to receive from the + * very start of the message. */ + uint32_t sync_len = 17; + const char *sync_pattern = "10101010101010110"; + if (numbits-sync_len < 8*10) return false; /* Expect 10 bytes. */ + + uint64_t off = bitmap_seek_bits(bits,numbytes,0,numbits,sync_pattern); + if (off == BITMAP_SEEK_NOT_FOUND) return false; + FURI_LOG_E(TAG, "Renault TPMS preamble+sync found"); + + info->start_off = off; + off += sync_len; /* Skip preamble + sync. */ + + uint8_t raw[10]; + uint32_t decoded = + convert_from_line_code(raw,sizeof(raw),bits,numbytes,off, + "01","10"); /* Manchester. */ + FURI_LOG_E(TAG, "Citroen TPMS decoded bits: %lu", decoded); + + if (decoded < 8*10) return false; /* Require the full 10 bytes. */ + + /* Check the CRC. It's a simple XOR of bytes 1-9, the first byte + * is not included. The meaning of the first byte is unknown and + * we don't display it. */ + uint8_t crc = 0; + for (int j = 1; j < 10; j++) crc ^= raw[j]; + if (crc != 0) return false; /* Require sane checksum. */ + + info->pulses_count = (off+8*10*2) - info->start_off; + + int repeat = raw[5] & 0xf; + float kpa = (float)raw[6]*1.364; + int temp = raw[7]-50; + int battery = raw[8]; /* This may be the battery. It's not clear. */ + + snprintf(info->name,sizeof(info->name),"%s","Citroen TPMS"); + snprintf(info->raw,sizeof(info->raw), + "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", + raw[0],raw[1],raw[2],raw[3],raw[4],raw[5], + raw[6],raw[7],raw[8],raw[9]); + snprintf(info->info1,sizeof(info->info1),"Tire ID %02X%02X%02X%02X", + raw[1],raw[2],raw[3],raw[4]); + snprintf(info->info2,sizeof(info->info2),"Pressure %.2f kpa", (double)kpa); + snprintf(info->info3,sizeof(info->info3),"Temperature %d C", temp); + snprintf(info->info4,sizeof(info->info4),"Repeat %d, Bat %d", repeat, battery); + return true; +} + +ProtoViewDecoder CitroenTPMSDecoder = { + "Citroen TPMS", decode +}; diff --git a/applications/plugins/protoview/protocols/tpms/ford.c b/applications/plugins/protoview/protocols/tpms/ford.c new file mode 100644 index 000000000..e897d9d1f --- /dev/null +++ b/applications/plugins/protoview/protocols/tpms/ford.c @@ -0,0 +1,67 @@ +/* Ford tires TPMS. Usually 443.92 Mhz FSK (in Europe). + * + * 52 us short pules + * Preamble: 0101010101010101010101010101 + * Sync: 0110 (that is 52 us gap + 104 us pulse + 52 us gap) + * Data: 8 bytes Manchester encoded + * 01 = zero + * 10 = one + */ + +#include "../../app.h" + +static bool decode(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoViewMsgInfo *info) { + + const char *sync_pattern = "010101010101" "0110"; + uint8_t sync_len = 12+4; /* We just use 12 preamble symbols + sync. */ + if (numbits-sync_len < 8*8) return false; + + uint64_t off = bitmap_seek_bits(bits,numbytes,0,numbits,sync_pattern); + if (off == BITMAP_SEEK_NOT_FOUND) return false; + FURI_LOG_E(TAG, "Fort TPMS preamble+sync found"); + + info->start_off = off; + off += sync_len; /* Skip preamble and sync. */ + + uint8_t raw[8]; + uint32_t decoded = + convert_from_line_code(raw,sizeof(raw),bits,numbytes,off, + "01","10"); /* Manchester. */ + FURI_LOG_E(TAG, "Ford TPMS decoded bits: %lu", decoded); + + if (decoded < 8*8) return false; /* Require the full 8 bytes. */ + + /* CRC is just the sum of the first 7 bytes MOD 256. */ + uint8_t crc = 0; + for (int j = 0; j < 7; j++) crc += raw[j]; + if (crc != raw[7]) return false; /* Require sane CRC. */ + + info->pulses_count = (off+8*8*2) - info->start_off; + + float psi = 0.25 * (((raw[6]&0x20)<<3)|raw[4]); + + /* Temperature apperas to be valid only if the most significant + * bit of the value is not set. Otherwise its meaning is unknown. + * Likely useful to alternatively send temperature or other info. */ + int temp = raw[5] & 0x80 ? 0 : raw[5]-56; + int flags = raw[5] & 0x7f; + int car_moving = (raw[6] & 0x44) == 0x44; + + snprintf(info->name,sizeof(info->name),"%s","Ford TPMS"); + snprintf(info->raw,sizeof(info->raw),"%02X%02X%02X%02X%02X%02X%02X%02X", + raw[0],raw[1],raw[2],raw[3],raw[4],raw[5], + raw[6],raw[7]); + snprintf(info->info1,sizeof(info->info1),"Tire ID %02X%02X%02X%02X", + raw[0],raw[1],raw[2],raw[3]); + snprintf(info->info2,sizeof(info->info2),"Pressure %.2f psi", (double)psi); + if (temp) + snprintf(info->info3,sizeof(info->info3),"Temperature %d C", temp); + else + snprintf(info->info3,sizeof(info->info3),"Flags %d", flags); + snprintf(info->info4,sizeof(info->info4),"Moving %s", car_moving ? "yes" : "no"); + return true; +} + +ProtoViewDecoder FordTPMSDecoder = { + "Ford TPMS", decode +}; diff --git a/applications/plugins/protoview/protocols/tpms/renault.c b/applications/plugins/protoview/protocols/tpms/renault.c new file mode 100644 index 000000000..b8dd46ce8 --- /dev/null +++ b/applications/plugins/protoview/protocols/tpms/renault.c @@ -0,0 +1,69 @@ +/* Renault tires TPMS. Usually 443.92 Mhz FSK. + * + * Preamble + sync + Manchester bits. ~48us short pulse. + * 9 Bytes in total not counting the preamble. */ + +#include "../../app.h" + +#define USE_TEST_VECTOR 0 +static const char *test_vector = + "...01010101010101010110" // Preamble + sync + + /* The following is Marshal encoded, so each two characters are + * actaully one bit. 01 = 0, 10 = 1. */ + "010110010110" // Flags. + "10011001101010011001" // Pressure, multiply by 0.75 to obtain kpa. + // 244 kpa here. + "1010010110011010" // Temperature, subtract 30 to obtain celsius. 22C here. + "1001010101101001" + "0101100110010101" + "1001010101100110" // Tire ID. 0x7AD779 here. + "0101010101010101" + "0101010101010101" // Two FF bytes (usually). Unknown. + "0110010101010101"; // CRC8 with (poly 7, initialization 0). + +static bool decode(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoViewMsgInfo *info) { + + if (USE_TEST_VECTOR) { /* Test vector to check that decoding works. */ + bitmap_set_pattern(bits,numbytes,0,test_vector); + numbits = strlen(test_vector); + } + + if (numbits-12 < 9*8) return false; + + const char *sync_pattern = "01010101010101010110"; + uint64_t off = bitmap_seek_bits(bits,numbytes,0,numbits,sync_pattern); + if (off == BITMAP_SEEK_NOT_FOUND) return false; + FURI_LOG_E(TAG, "Renault TPMS preamble+sync found"); + + info->start_off = off; + off += 20; /* Skip preamble. */ + + uint8_t raw[9]; + uint32_t decoded = + convert_from_line_code(raw,sizeof(raw),bits,numbytes,off, + "01","10"); /* Manchester. */ + FURI_LOG_E(TAG, "Renault TPMS decoded bits: %lu", decoded); + + if (decoded < 8*9) return false; /* Require the full 9 bytes. */ + if (crc8(raw,8,0,7) != raw[8]) return false; /* Require sane CRC. */ + + info->pulses_count = (off+8*9*2) - info->start_off; + + float kpa = 0.75 *((uint32_t)((raw[0]&3)<<8) | raw[1]); + int temp = raw[2]-30; + + snprintf(info->name,sizeof(info->name),"%s","Renault TPMS"); + snprintf(info->raw,sizeof(info->raw),"%02X%02X%02X%02X%02X%02X%02X%02X%02X", + raw[0],raw[1],raw[2],raw[3],raw[4],raw[5], + raw[6],raw[7],raw[8]); + snprintf(info->info1,sizeof(info->info1),"Tire ID %02X%02X%02X", + raw[3],raw[4],raw[5]); + snprintf(info->info2,sizeof(info->info2),"Pressure %.2f kpa", (double)kpa); + snprintf(info->info3,sizeof(info->info3),"Temperature %d C", temp); + return true; +} + +ProtoViewDecoder RenaultTPMSDecoder = { + "Renault TPMS", decode +}; diff --git a/applications/plugins/protoview/protocols/tpms/schrader.c b/applications/plugins/protoview/protocols/tpms/schrader.c new file mode 100644 index 000000000..efcc21380 --- /dev/null +++ b/applications/plugins/protoview/protocols/tpms/schrader.c @@ -0,0 +1,68 @@ +/* Schrader TPMS. Usually 443.92 Mhz OOK, 120us pulse len. + * + * 500us high pulse + Preamble + Manchester coded bits where: + * 1 = 10 + * 0 = 01 + * + * 60 bits of data total (first 4 nibbles is the preamble, 0xF). + * + * Used in FIAT-Chrysler, Mercedes, ... */ + +#include "../../app.h" + +#define USE_TEST_VECTOR 0 +static const char *test_vector = "000000111101010101011010010110010110101001010110100110011001100101010101011010100110100110011010101010101010101010101010101010101010101010101010"; + +static bool decode(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoViewMsgInfo *info) { + + if (USE_TEST_VECTOR) { /* Test vector to check that decoding works. */ + bitmap_set_pattern(bits,numbytes,0,test_vector); + numbits = strlen(test_vector); + } + + if (numbits < 64) return false; /* Preamble + data. */ + + const char *sync_pattern = "1111010101" "01011010"; + uint64_t off = bitmap_seek_bits(bits,numbytes,0,numbits,sync_pattern); + if (off == BITMAP_SEEK_NOT_FOUND) return false; + FURI_LOG_E(TAG, "Schrader TPMS gap+preamble found"); + + info->start_off = off; + off += 10; /* Skip just the long pulse and the first 3 bits of sync, so + that we have the first byte of data with the sync nibble + 0011 = 0x3. */ + + uint8_t raw[8]; + uint32_t decoded = + convert_from_line_code(raw,sizeof(raw),bits,numbytes,off, + "01","10"); /* Manchester code. */ + FURI_LOG_E(TAG, "Schrader TPMS decoded bits: %lu", decoded); + + if (decoded < 64) return false; /* Require the full 8 bytes. */ + + raw[0] |= 0xf0; // Fix the preamble nibble for checksum computation. + uint8_t cksum = crc8(raw,sizeof(raw)-1,0xf0,0x7); + if (cksum != raw[7]) { + FURI_LOG_E(TAG, "Schrader TPMS checksum mismatch"); + return false; + } + + info->pulses_count = (off+8*8*2) - info->start_off; + + float kpa = (float)raw[5]*2.5; + int temp = raw[6]-50; + + snprintf(info->name,sizeof(info->name),"%s","Schrader TPMS"); + snprintf(info->raw,sizeof(info->raw),"%02X%02X%02X%02X%02X%02X%02X%02X", + raw[0],raw[1],raw[2],raw[3],raw[4],raw[5], + raw[6],raw[7]); + snprintf(info->info1,sizeof(info->info1),"Tire ID %01X%02X%02X%02X", + raw[1]&7,raw[2],raw[3],raw[4]); /* Only 28 bits of ID, not 32. */ + snprintf(info->info2,sizeof(info->info2),"Pressure %.2f kpa", (double)kpa); + snprintf(info->info3,sizeof(info->info3),"Temperature %d C", temp); + return true; +} + +ProtoViewDecoder SchraderTPMSDecoder = { + "Schrader TPMS", decode +}; diff --git a/applications/plugins/protoview/protocols/tpms/schrader_eg53ma4.c b/applications/plugins/protoview/protocols/tpms/schrader_eg53ma4.c new file mode 100644 index 000000000..29701e6ca --- /dev/null +++ b/applications/plugins/protoview/protocols/tpms/schrader_eg53ma4.c @@ -0,0 +1,66 @@ +/* Schrader variant EG53MA4 TPMS. + * Usually 443.92 Mhz OOK, 100us pulse len. + * + * Preamble: alternating pulse/gap, 100us. + * Sync (as pulses and gaps): "01100101", already part of the data stream + * (first nibble) corresponding to 0x4 + * + * A total of 10 bytes payload, Manchester encoded. + * + * 0 = 01 + * 1 = 10 + * + * Used in certain Open cars and others. + */ + +#include "../../app.h" + +static bool decode(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoViewMsgInfo *info) { + + const char *sync_pattern = "010101010101" "01100101"; + uint8_t sync_len = 12+8; /* We just use 12 preamble symbols + sync. */ + if (numbits-sync_len+8 < 8*10) return false; + + uint64_t off = bitmap_seek_bits(bits,numbytes,0,numbits,sync_pattern); + if (off == BITMAP_SEEK_NOT_FOUND) return false; + FURI_LOG_E(TAG, "Schrader EG53MA4 TPMS preamble+sync found"); + + info->start_off = off; + off += sync_len-8; /* Skip preamble, not sync that is part of the data. */ + + uint8_t raw[10]; + uint32_t decoded = + convert_from_line_code(raw,sizeof(raw),bits,numbytes,off, + "01","10"); /* Manchester code. */ + FURI_LOG_E(TAG, "Schrader EG53MA4 TPMS decoded bits: %lu", decoded); + + if (decoded < 10*8) return false; /* Require the full 10 bytes. */ + + /* CRC is just all bytes added mod 256. */ + uint8_t crc = 0; + for (int j = 0; j < 9; j++) crc += raw[j]; + if (crc != raw[9]) return false; /* Require sane CRC. */ + + info->pulses_count = (off+10*8*2) - info->start_off; + + /* To convert the raw pressure to kPa, RTL433 uses 2.5, but is likely + * wrong. Searching on Google for users experimenting with the value + * reported, the value appears to be 2.75. */ + float kpa = (float)raw[7]*2.75; + int temp_f = raw[8]; + int temp_c = (temp_f-32)*5/9; /* Convert Fahrenheit to Celsius. */ + + snprintf(info->name,sizeof(info->name),"%s","Schrader EG53MA4 TPMS"); + snprintf(info->raw,sizeof(info->raw),"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", + raw[0],raw[1],raw[2],raw[3],raw[4],raw[5], + raw[6],raw[7],raw[8],raw[9]); + snprintf(info->info1,sizeof(info->info1),"Tire ID %02X%02X%02X", + raw[4],raw[5],raw[6]); /* Only 28 bits of ID, not 32. */ + snprintf(info->info2,sizeof(info->info2),"Pressure %.2f kpa", (double)kpa); + snprintf(info->info3,sizeof(info->info3),"Temperature %d C", temp_c); + return true; +} + +ProtoViewDecoder SchraderEG53MA4TPMSDecoder = { + "Schrader EG53MA4 TPMS", decode +}; diff --git a/applications/plugins/protoview/protocols/tpms/toyota.c b/applications/plugins/protoview/protocols/tpms/toyota.c new file mode 100644 index 000000000..c029baf11 --- /dev/null +++ b/applications/plugins/protoview/protocols/tpms/toyota.c @@ -0,0 +1,91 @@ +/* Toyota tires TPMS. Usually 443.92 Mhz FSK (In Europe). + * + * Preamble + sync + 64 bits of data. ~48us short pulse length. + * + * The preamble + sync is something like: + * + * 10101010101 (preamble) + 001111[1] (sync) + * + * Note: the final [1] means that sometimes it is four 1s, sometimes + * five, depending on the short pulse length detection and the exact + * duration of the high long pulse. After the sync, a differential + * Manchester encoded payload follows. However the Flipper's CC1101 + * often can't decode correctly the initial alternating pattern 101010101, + * so what we do is to seek just the sync, that is "001111" or "0011111", + * however we now that it must be followed by one differenitally encoded + * bit, so we can use also the first symbol of data to force a more robust + * detection, and look for one of the following: + * + * [001111]00 + * [0011111]00 + * [001111]01 + * [0011111]01 + */ + +#include "../../app.h" + +static bool decode(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoViewMsgInfo *info) { + + if (numbits-6 < 64*2) return false; /* Ask for 64 bit of data (each bit + is two symbols in the bitmap). */ + + char *sync[] = { + "00111100", + "001111100", + "00111101", + "001111101", + NULL + }; + + int j; + uint32_t off = 0; + for (j = 0; sync[j]; j++) { + off = bitmap_seek_bits(bits,numbytes,0,numbits,sync[j]); + if (off != BITMAP_SEEK_NOT_FOUND) { + info->start_off = off; + off += strlen(sync[j])-2; + break; + } + } + if (off == BITMAP_SEEK_NOT_FOUND) return false; + + FURI_LOG_E(TAG, "Toyota TPMS sync[%s] found", sync[j]); + + uint8_t raw[9]; + uint32_t decoded = + convert_from_diff_manchester(raw,sizeof(raw),bits,numbytes,off,true); + FURI_LOG_E(TAG, "Toyota TPMS decoded bits: %lu", decoded); + + if (decoded < 8*9) return false; /* Require the full 8 bytes. */ + if (crc8(raw,8,0x80,7) != raw[8]) return false; /* Require sane CRC. */ + + /* We detected a valid signal. However now info->start_off is actually + * pointing to the sync part, not the preamble of alternating 0 and 1. + * Protoview decoders get called with some space to the left, in order + * for the decoder itself to fix the signal if neeeded, so that its + * logical representation will be more accurate and better to save + * and retransmit. */ + if (info->start_off >= 12) { + info->start_off -= 12; + bitmap_set_pattern(bits,numbytes,info->start_off,"010101010101"); + } + + info->pulses_count = (off+8*9*2) - info->start_off; + + float kpa = (float)((raw[4]&0x7f)<<1 | raw[5]>>7) * 0.25 - 7; + int temp = ((raw[5]&0x7f)<<1 | raw[6]>>7) - 40; + + snprintf(info->name,sizeof(info->name),"%s","Toyota TPMS"); + snprintf(info->raw,sizeof(info->raw),"%02X%02X%02X%02X%02X%02X%02X%02X%02X", + raw[0],raw[1],raw[2],raw[3],raw[4],raw[5], + raw[6],raw[7],raw[8]); + snprintf(info->info1,sizeof(info->info1),"Tire ID %02X%02X%02X%02X", + raw[0],raw[1],raw[2],raw[3]); + snprintf(info->info2,sizeof(info->info2),"Pressure %.2f psi", (double)kpa); + snprintf(info->info3,sizeof(info->info3),"Temperature %d C", temp); + return true; +} + +ProtoViewDecoder ToyotaTPMSDecoder = { + "Toyota TPMS", decode +}; diff --git a/applications/plugins/protoview/signal.c b/applications/plugins/protoview/signal.c new file mode 100644 index 000000000..1ea195245 --- /dev/null +++ b/applications/plugins/protoview/signal.c @@ -0,0 +1,593 @@ +/* Copyright (C) 2022-2023 Salvatore Sanfilippo -- All Rights Reserved + * See the LICENSE file for information about the license. */ + +#include "app.h" + +bool decode_signal(RawSamplesBuffer *s, uint64_t len, ProtoViewMsgInfo *info); + +/* ============================================================================= + * Raw signal detection + * ===========================================================================*/ + +/* Return the time difference between a and b, always >= 0 since + * the absolute value is returned. */ +uint32_t duration_delta(uint32_t a, uint32_t b) { + return a > b ? a - b : b - a; +} + +/* Reset the current signal, so that a new one can be detected. */ +void reset_current_signal(ProtoViewApp *app) { + app->signal_bestlen = 0; + app->signal_offset = 0; + app->signal_decoded = false; + raw_samples_reset(DetectedSamples); + raw_samples_reset(RawSamples); + free_msg_info(app->msg_info); + app->msg_info = NULL; +} + +/* This function starts scanning samples at offset idx looking for the + * longest run of pulses, either high or low, that are not much different + * from each other, for a maximum of three duration classes. + * So for instance 50 successive pulses that are roughly long 340us or 670us + * will be sensed as a coherent signal (example: 312, 361, 700, 334, 667, ...) + * + * The classes are counted separtely for high and low signals (RF on / off) + * because many devices tend to have different pulse lenghts depending on + * the level of the pulse. + * + * For instance Oregon2 sensors, in the case of protocol 2.1 will send + * pulses of ~400us (RF on) VS ~580us (RF off). */ +#define SEARCH_CLASSES 3 +uint32_t search_coherent_signal(RawSamplesBuffer *s, uint32_t idx) { + struct { + uint32_t dur[2]; /* dur[0] = low, dur[1] = high */ + uint32_t count[2]; /* Associated observed frequency. */ + } classes[SEARCH_CLASSES]; + + memset(classes,0,sizeof(classes)); + uint32_t minlen = 30, maxlen = 4000; /* Depends on data rate, here we + allow for high and low. */ + uint32_t len = 0; /* Observed len of coherent samples. */ + s->short_pulse_dur = 0; + for (uint32_t j = idx; j < idx+500; j++) { + bool level; + uint32_t dur; + raw_samples_get(s, j, &level, &dur); + + if (dur < minlen || dur > maxlen) break; /* return. */ + + /* Let's see if it matches a class we already have or if we + * can populate a new (yet empty) class. */ + uint32_t k; + for (k = 0; k < SEARCH_CLASSES; k++) { + if (classes[k].count[level] == 0) { + classes[k].dur[level] = dur; + classes[k].count[level] = 1; + break; /* Sample accepted. */ + } else { + uint32_t classavg = classes[k].dur[level]; + uint32_t count = classes[k].count[level]; + uint32_t delta = duration_delta(dur,classavg); + /* Is the difference in duration between this signal and + * the class we are inspecting less than a given percentage? + * If so, accept this signal. */ + if (delta < classavg/5) { /* 100%/5 = 20%. */ + /* It is useful to compute the average of the class + * we are observing. We know how many samples we got so + * far, so we can recompute the average easily. + * By always having a better estimate of the pulse len + * we can avoid missing next samples in case the first + * observed samples are too off. */ + classavg = ((classavg * count) + dur) / (count+1); + classes[k].dur[level] = classavg; + classes[k].count[level]++; + break; /* Sample accepted. */ + } + } + } + + if (k == SEARCH_CLASSES) break; /* No match, return. */ + + /* If we are here, we accepted this sample. Try with the next + * one. */ + len++; + } + + /* Update the buffer setting the shortest pulse we found + * among the three classes. This will be used when scaling + * for visualization. */ + uint32_t short_dur[2] = {0,0}; + for (int j = 0; j < SEARCH_CLASSES; j++) { + for (int level = 0; level < 2; level++) { + if (classes[j].dur[level] == 0) continue; + if (classes[j].count[level] < 3) continue; + if (short_dur[level] == 0 || + short_dur[level] > classes[j].dur[level]) + { + short_dur[level] = classes[j].dur[level]; + } + } + } + + /* Use the average between high and low short pulses duration. + * Often they are a bit different, and using the average is more robust + * when we do decoding sampling at short_pulse_dur intervals. */ + if (short_dur[0] == 0) short_dur[0] = short_dur[1]; + if (short_dur[1] == 0) short_dur[1] = short_dur[0]; + s->short_pulse_dur = (short_dur[0]+short_dur[1])/2; + + return len; +} + +/* Search the buffer with the stored signal (last N samples received) + * in order to find a coherent signal. If a signal that does not appear to + * be just noise is found, it is set in DetectedSamples global signal + * buffer, that is what is rendered on the screen. */ +void scan_for_signal(ProtoViewApp *app) { + /* We need to work on a copy: the RawSamples buffer is populated + * by the background thread receiving data. */ + RawSamplesBuffer *copy = raw_samples_alloc(); + raw_samples_copy(copy,RawSamples); + + /* Try to seek on data that looks to have a regular high low high low + * pattern. */ + uint32_t minlen = 18; /* Min run of coherent samples. With less + than a few samples it's very easy to + mistake noise for signal. */ + + uint32_t i = 0; + + while (i < copy->total-1) { + uint32_t thislen = search_coherent_signal(copy,i); + + /* For messages that are long enough, attempt decoding. */ + if (thislen > minlen) { + /* Allocate the message information that some decoder may + * fill, in case it is able to decode a message. */ + ProtoViewMsgInfo *info = malloc(sizeof(ProtoViewMsgInfo)); + init_msg_info(info,app); + info->short_pulse_dur = copy->short_pulse_dur; + + uint32_t saved_idx = copy->idx; /* Save index, see later. */ + + /* decode_signal() expects the detected signal to start + * from index zero .*/ + raw_samples_center(copy,i); + bool decoded = decode_signal(copy,thislen,info); + copy->idx = saved_idx; /* Restore the index as we are scanning + the signal in the loop. */ + + /* Accept this signal as the new signal if either it's longer + * than the previous undecoded one, or the previous one was + * unknown and this is decoded. */ + if ((thislen > app->signal_bestlen && app->signal_decoded == false) + || (app->signal_decoded == false && decoded)) + { + free_msg_info(app->msg_info); + app->msg_info = info; + app->signal_bestlen = thislen; + app->signal_decoded = decoded; + raw_samples_copy(DetectedSamples,copy); + raw_samples_center(DetectedSamples,i); + FURI_LOG_E(TAG, "===> Displayed sample updated (%d samples %lu us)", + (int)thislen, DetectedSamples->short_pulse_dur); + + /* Adjust raw view scale if the signal has an high + * data rate. */ + if (DetectedSamples->short_pulse_dur < 75) + app->us_scale = 10; + else if (DetectedSamples->short_pulse_dur < 145) + app->us_scale = 30; + } else { + /* If the structure was not filled, discard it. Otherwise + * now the owner is app->msg_info. */ + free_msg_info(info); + } + } + i += thislen ? thislen : 1; + } + raw_samples_free(copy); +} + +/* ============================================================================= + * Decoding + * + * The following code will translates the raw singals as received by + * the CC1101 into logical signals: a bitmap of 0s and 1s sampled at + * the detected data clock interval. + * + * Then the converted signal is passed to the protocols decoders, that look + * for protocol-specific information. We stop at the first decoder that is + * able to decode the data, so protocols here should be registered in + * order of complexity and specificity, with the generic ones at the end. + * ===========================================================================*/ + +/* Set the 'bitpos' bit to value 'val', in the specified bitmap + * 'b' of len 'blen'. + * Out of range bits will silently be discarded. */ +void bitmap_set(uint8_t *b, uint32_t blen, uint32_t bitpos, bool val) { + uint32_t byte = bitpos/8; + uint32_t bit = 7-(bitpos&7); + if (byte >= blen) return; + if (val) + b[byte] |= 1<= blen) return 0; + return (b[byte] & (1< 8 && didx < dlen && sidx < slen) { + d[didx++] = s[sidx++]; + count -= 8; + } + doff = didx * 8; + soff = sidx * 8; + /* Note that if we entered this path, the count at the end + * of the loop will be < 8. */ + } + + /* Copy the bits needed to reach an offset where we can copy + * two half bytes of src to a full byte of destination. */ + while(count > 8 && (doff&7) != 0) { + bool bit = bitmap_get(s,slen,soff++); + bitmap_set(d,dlen,doff++,bit); + count--; + } + + /* If we are here and count > 8, we have an offset that is byte aligned + * to the destination bitmap, but not aligned to the source bitmap. + * We can copy fast enough by shifting each two bytes of the original + * bitmap. + * + * This is how it works: + * + * dst: + * +--------+--------+--------+ + * | 0 | 1 | 2 | + * | | | | <- data to fill + * +--------+--------+--------+ + * ^ + * | + * doff = 8 + * + * src: + * +--------+--------+--------+ + * | 0 | 1 | 2 | + * |hellowor|ld!HELLO|WORLDS!!| <- data to copy + * +--------+--------+--------+ + * ^ + * | + * soff = 11 + * + * skew = 11%8 = 3 + * each destination byte in dst will receive: + * + * dst[doff/8] = (src[soff/8] << skew) | (src[soff/8+1] >> (8-skew)) + * + * dstbyte = doff/8 = 8/8 = 1 + * srcbyte = soff/8 = 11/8 = 1 + * + * so dst[1] will get: + * src[1] << 3, that is "ld!HELLO" << 3 = "HELLO..." + * xored with + * src[2] << 5, that is "WORLDS!!" >> 5 = ".....WOR" + * That is "HELLOWOR" + */ + if (count > 8) { + uint8_t skew = soff % 8; /* Don't worry, compiler will optimize. */ + uint32_t didx = doff/8; + uint32_t sidx = soff/8; + while(count > 8 && didx < dlen && sidx < slen) { + d[didx] = ((s[sidx] << skew) | + (s[sidx+1] >> (8-skew))); + sidx++; + didx++; + soff += 8; + doff += 8; + count -= 8; + } + } + + /* Here count is guaranteed to be < 8. + * Copy the final bits bit by bit. */ + while(count) { + bool bit = bitmap_get(s,slen,soff++); + bitmap_set(d,dlen,doff++,bit); + count--; + } +} + +/* We decode bits assuming the first bit we receive is the MSB + * (see bitmap_set/get functions). Certain devices send data + * encoded in the reverse way. */ +void bitmap_reverse_bytes(uint8_t *p, uint32_t len) { + for (uint32_t j = 0; j < len; j++) { + uint32_t b = p[j]; + /* Step 1: swap the two nibbles: 12345678 -> 56781234 */ + b = (b&0xf0)>>4 | (b&0x0f)<<4; + /* Step 2: swap adjacent pairs : 56781234 -> 78563412 */ + b = (b&0xcc)>>2 | (b&0x33)<<2; + /* Step 3: swap adjacent bits : 78563412 -> 87654321 */ + b = (b&0xaa)>>1 | (b&0x55)<<1; + p[j] = b; + } +} + +/* Return true if the specified sequence of bits, provided as a string in the + * form "11010110..." is found in the 'b' bitmap of 'blen' bits at 'bitpos' + * position. */ +bool bitmap_match_bits(uint8_t *b, uint32_t blen, uint32_t bitpos, const char *bits) { + for (size_t j = 0; bits[j]; j++) { + bool expected = (bits[j] == '1') ? true : false; + if (bitmap_get(b,blen,bitpos+j) != expected) return false; + } + return true; +} + +/* Search for the specified bit sequence (see bitmap_match_bits() for details) + * in the bitmap 'b' of 'blen' bytes, looking forward at most 'maxbits' ahead. + * Returns the offset (in bits) of the match, or BITMAP_SEEK_NOT_FOUND if not + * found. + * + * Note: there are better algorithms, such as Boyer-Moore. Here we hope that + * for the kind of patterns we search we'll have a lot of early stops so + * we use a vanilla approach. */ +uint32_t bitmap_seek_bits(uint8_t *b, uint32_t blen, uint32_t startpos, uint32_t maxbits, const char *bits) { + uint32_t endpos = startpos+blen*8; + uint32_t end2 = startpos+maxbits; + if (end2 < endpos) endpos = end2; + for (uint32_t j = startpos; j < endpos; j++) + if (bitmap_match_bits(b,blen,j,bits)) return j; + return BITMAP_SEEK_NOT_FOUND; +} + +/* Set the pattern 'pat' into the bitmap 'b' of max length 'blen' bytes, + * starting from the specified offset. + * + * The pattern is given as a string of 0s and 1s characters, like "01101001". + * This function is useful in order to set the test vectors in the protocol + * decoders, to see if the decoding works regardless of the fact we are able + * to actually receive a given signal. */ +void bitmap_set_pattern(uint8_t *b, uint32_t blen, uint32_t off, const char *pat) { + uint32_t i = 0; + while(pat[i]) { + bitmap_set(b,blen,i+off,pat[i] == '1'); + i++; + } +} + +/* Take the raw signal and turn it into a sequence of bits inside the + * buffer 'b'. Note that such 0s and 1s are NOT the actual data in the + * signal, but is just a low level representation of the line code. Basically + * if the short pulse we find in the signal is 320us, we convert high and + * low levels in the raw sample in this way: + * + * If for instance we see a high level lasting ~600 us, we will add + * two 1s bit. If then the signal goes down for 330us, we will add one zero, + * and so forth. So for each period of high and low we find the closest + * multiple and set the relevant number of bits. + * + * In case of a short pulse of 320us detected, 320*2 is the closest to a + * high pulse of 600us, so 2 bits will be set. + * + * In other terms what this function does is sampling the signal at + * fixed 'rate' intervals. + * + * This representation makes it simple to decode the signal at a higher + * level later, translating it from Marshal coding or other line codes + * to the actual bits/bytes. + * + * The 'idx' argument marks the detected signal start index into the + * raw samples buffer. The 'count' tells the function how many raw + * samples to convert into bits. The function returns the number of + * bits set into the buffer 'b'. The 'rate' argument, in microseconds, is + * the detected short-pulse duration. We expect the line code to be + * meaningful when interpreted at multiples of 'rate'. */ +uint32_t convert_signal_to_bits(uint8_t *b, uint32_t blen, RawSamplesBuffer *s, uint32_t idx, uint32_t count, uint32_t rate) { + if (rate == 0) return 0; /* We can't perform the conversion. */ + uint32_t bitpos = 0; + for (uint32_t j = 0; j < count; j++) { + uint32_t dur; + bool level; + raw_samples_get(s, j+idx, &level, &dur); + + uint32_t numbits = dur / rate; /* full bits that surely fit. */ + uint32_t rest = dur % rate; /* How much we are left with. */ + if (rest > rate/2) numbits++; /* There is another one. */ + + /* Limit how much a single sample can spawn. There are likely no + * protocols doing such long pulses when the rate is low. */ + if (numbits > 1024) numbits = 1024; + + if (0) /* Super verbose, so not under the DEBUG_MSG define. */ + FURI_LOG_E(TAG, "%lu converted into %lu (%d) bits", + dur,numbits,(int)level); + + /* If the signal is too short, let's claim it an interference + * and ignore it completely. */ + if (numbits == 0) continue; + + while(numbits--) bitmap_set(b,blen,bitpos++,level); + } + return bitpos; +} + +/* This function converts the line code used to the final data representation. + * The representation is put inside 'buf', for up to 'buflen' bytes of total + * data. For instance in order to convert manchester you can use "10" and "01" + * as zero and one patterns. However this function does not handle differential + * encodings. See below for convert_from_diff_manchester(). + * + * The function returns the number of bits converted. It will stop as soon + * as it finds a pattern that does not match zero or one patterns, or when + * the end of the bitmap pointed by 'bits' is reached (the length is + * specified in bytes by the caller, via the 'len' parameters). + * + * The decoding starts at the specified offset (in bits) 'off'. */ +uint32_t convert_from_line_code(uint8_t *buf, uint64_t buflen, uint8_t *bits, uint32_t len, uint32_t off, const char *zero_pattern, const char *one_pattern) +{ + uint32_t decoded = 0; /* Number of bits extracted. */ + len *= 8; /* Convert bytes to bits. */ + while(off < len) { + bool bitval; + if (bitmap_match_bits(bits,len,off,zero_pattern)) { + bitval = false; + off += strlen(zero_pattern); + } else if (bitmap_match_bits(bits,len,off,one_pattern)) { + bitval = true; + off += strlen(one_pattern); + } else { + break; + } + bitmap_set(buf,buflen,decoded++,bitval); + if (decoded/8 == buflen) break; /* No space left on target buffer. */ + } + return decoded; +} + +/* Convert the differential Manchester code to bits. This is similar to + * convert_from_line_code() but specific for Manchester. The user must + * supply the value of the previous symbol before this stream, since + * in differential codings the next bits depend on the previous one. + * + * Parameters and return values are like convert_from_line_code(). */ +uint32_t convert_from_diff_manchester(uint8_t *buf, uint64_t buflen, uint8_t *bits, uint32_t len, uint32_t off, bool previous) +{ + uint32_t decoded = 0; + len *= 8; /* Conver to bits. */ + for (uint32_t j = off; j < len; j += 2) { + bool b0 = bitmap_get(bits,len,j); + bool b1 = bitmap_get(bits,len,j+1); + if (b0 == previous) break; /* Each new bit must switch value. */ + bitmap_set(buf,buflen,decoded++,b0 == b1); + previous = b1; + if (decoded/8 == buflen) break; /* No space left on target buffer. */ + } + return decoded; +} + +/* Supported protocols go here, with the relevant implementation inside + * protocols/.c */ + +extern ProtoViewDecoder Oregon2Decoder; +extern ProtoViewDecoder B4B1Decoder; +extern ProtoViewDecoder RenaultTPMSDecoder; +extern ProtoViewDecoder ToyotaTPMSDecoder; +extern ProtoViewDecoder SchraderTPMSDecoder; +extern ProtoViewDecoder SchraderEG53MA4TPMSDecoder; +extern ProtoViewDecoder CitroenTPMSDecoder; +extern ProtoViewDecoder FordTPMSDecoder; +extern ProtoViewDecoder KeeloqDecoder; + +ProtoViewDecoder *Decoders[] = { + &Oregon2Decoder, /* Oregon sensors v2.1 protocol. */ + &B4B1Decoder, /* PT, SC, ... 24 bits remotes. */ + &RenaultTPMSDecoder, /* Renault TPMS. */ + &ToyotaTPMSDecoder, /* Toyota TPMS. */ + &SchraderTPMSDecoder, /* Schrader TPMS. */ + &SchraderEG53MA4TPMSDecoder, /* Schrader EG53MA4 TPMS. */ + &CitroenTPMSDecoder, /* Citroen TPMS. */ + &FordTPMSDecoder, /* Ford TPMS. */ + &KeeloqDecoder, /* Keeloq remote. */ + NULL +}; + +/* Free the message info and allocated data. */ +void free_msg_info(ProtoViewMsgInfo *i) { + if (i == NULL) return; + free(i->bits); + free(i); +} + +/* Reset the message info structure before passing it to the decoding + * functions. */ +void init_msg_info(ProtoViewMsgInfo *i, ProtoViewApp *app) { + UNUSED(app); + memset(i,0,sizeof(ProtoViewMsgInfo)); + i->bits = NULL; +} + +/* This function is called when a new signal is detected. It converts it + * to a bitstream, and the calls the protocol specific functions for + * decoding. If the signal was decoded correctly by some protocol, true + * is returned. Otherwise false is returned. */ +bool decode_signal(RawSamplesBuffer *s, uint64_t len, ProtoViewMsgInfo *info) { + uint32_t bitmap_bits_size = 4096*8; + uint32_t bitmap_size = bitmap_bits_size/8; + + /* We call the decoders with an offset a few samples before the actual + * signal detected and for a len of a few bits after its end. */ + uint32_t before_samples = 32; + uint32_t after_samples = 100; + + uint8_t *bitmap = malloc(bitmap_size); + uint32_t bits = convert_signal_to_bits(bitmap,bitmap_size,s,-before_samples,len+before_samples+after_samples,s->short_pulse_dur); + + if (DEBUG_MSG) { /* Useful for debugging purposes. Don't remove. */ + char *str = malloc(1024); + uint32_t j; + for (j = 0; j < bits && j < 1023; j++) { + str[j] = bitmap_get(bitmap,bitmap_size,j) ? '1' : '0'; + } + str[j] = 0; + FURI_LOG_E(TAG, "%lu bits sampled: %s", bits, str); + free(str); + } + + /* Try all the decoders available. */ + int j = 0; + + bool decoded = false; + while(Decoders[j]) { + uint32_t start_time = furi_get_tick(); + decoded = Decoders[j]->decode(bitmap,bitmap_size,bits,info); + uint32_t delta = furi_get_tick() - start_time; + FURI_LOG_E(TAG, "Decoder %s took %lu ms", + Decoders[j]->name, (unsigned long)delta); + if (decoded) break; + j++; + } + + if (!decoded) { + FURI_LOG_E(TAG, "No decoding possible"); + } else { + FURI_LOG_E(TAG, "Decoded %s, raw=%s info=[%s,%s,%s,%s]", + info->name, info->raw, info->info1, info->info2, + info->info3, info->info4); + /* The message was correctly decoded: fill the info structure + * with the decoded signal. The decoder may not implement offset/len + * filling of the structure. In such case we have no info and + * pulses_count will be set to zero. */ + if (info->pulses_count) { + info->bits_bytes = (info->pulses_count+7)/8; // Round to full byte. + info->bits = malloc(info->bits_bytes); + bitmap_copy(info->bits,info->bits_bytes,0, + bitmap,bitmap_size,info->start_off, + info->pulses_count); + } + } + free(bitmap); + return decoded; +} diff --git a/applications/plugins/protoview/signal_file.c b/applications/plugins/protoview/signal_file.c new file mode 100644 index 000000000..31c8726fb --- /dev/null +++ b/applications/plugins/protoview/signal_file.c @@ -0,0 +1,141 @@ +/* Copyright (C) 2023 Salvatore Sanfilippo -- All Rights Reserved + * Copyright (C) 2023 Maciej Wojtasik -- All Rights Reserved + * See the LICENSE file for information about the license. */ + +#include "app.h" +#include +#include + +/* ========================= Signal file operations ========================= */ + +/* This function saves the current logical signal on disk. What is saved here + * is not the signal as level and duration as we received it from CC1101, + * but it's logical representation stored in the app->msg_info bitmap, where + * each 1 or 0 means a puls or gap for the specified short pulse duration time + * (te). */ +bool save_signal(ProtoViewApp *app, const char *filename) { + /* We have a message at all? */ + if (app->msg_info == NULL || app->msg_info->pulses_count == 0) return false; + + Storage *storage = furi_record_open(RECORD_STORAGE); + FlipperFormat *file = flipper_format_file_alloc(storage); + Stream *stream = flipper_format_get_raw_stream(file); + FuriString *file_content = NULL; + bool success = true; + + if (flipper_format_file_open_always(file, filename)) { + /* Write the file header. */ + FuriString *file_content = furi_string_alloc(); + const char *preset_id = ProtoViewModulations[app->modulation].id; + + furi_string_printf(file_content, + "Filetype: Flipper SubGhz RAW File\n" + "Version: 1\n" + "Frequency: %ld\n" + "Preset: %s\n", + app->frequency, + preset_id ? preset_id : "FuriHalSubGhzPresetCustom"); + + /* For custom modulations, we need to emit a set of registers. */ + if (preset_id == NULL) { + FuriString *custom = furi_string_alloc(); + uint8_t *regs = ProtoViewModulations[app->modulation].custom; + furi_string_printf(custom, + "Custom_preset_module: CC1101\n" + "Custom_preset_data: "); + for (int j = 0; regs[j]; j += 2) { + furi_string_cat_printf(custom, "%02X %02X ", + (int)regs[j], (int)regs[j+1]); + } + size_t len = furi_string_size(file_content); + furi_string_set_char(custom,len-1,'\n'); + furi_string_cat(file_content,custom); + furi_string_free(custom); + } + + /* We always save raw files. */ + furi_string_cat_printf(file_content, + "Protocol: RAW\n" + "RAW_Data: -10000\n"); // Start with 10 ms of gap + + /* Write header. */ + size_t len = furi_string_size(file_content); + if (stream_write(stream, + (uint8_t*) furi_string_get_cstr(file_content), len) + != len) + { + FURI_LOG_W(TAG, "Short write to file"); + success = false; + goto write_err; + } + furi_string_reset(file_content); + + /* Write raw data sections. The Flipper subghz parser can't handle + * too much data on a single line, so we generate a new one + * every few samples. */ + uint32_t this_line_samples = 0; + uint32_t max_line_samples = 100; + uint32_t idx = 0; // Iindex in the signal bitmap. + ProtoViewMsgInfo *i = app->msg_info; + while(idx < i->pulses_count) { + bool level = bitmap_get(i->bits,i->bits_bytes,idx); + uint32_t te_times = 1; + idx++; + /* Count the duration of the current pulse/gap. */ + while(idx < i->pulses_count && + bitmap_get(i->bits,i->bits_bytes,idx) == level) + { + te_times++; + idx++; + } + // Invariant: after the loop 'idx' is at the start of the + // next gap or pulse. + + int32_t dur = (int32_t)i->short_pulse_dur * te_times; + if (level == 0) dur = -dur; /* Negative is gap in raw files. */ + + /* Emit the sample. If this is the first sample of the line, + * also emit the RAW_Data: field. */ + if (this_line_samples == 0) + furi_string_cat_printf(file_content,"RAW_Data: "); + furi_string_cat_printf(file_content,"%d ",(int)dur); + this_line_samples++; + + /* Store the current set of samples on disk, when we reach a + * given number or the end of the signal. */ + bool end_reached = (idx == i->pulses_count); + if (this_line_samples == max_line_samples || end_reached) { + /* If that's the end, terminate the signal with a long + * gap. */ + if (end_reached) furi_string_cat_printf(file_content,"-10000 "); + + /* We always have a trailing space in the last sample. Make it + * a newline. */ + size_t len = furi_string_size(file_content); + furi_string_set_char(file_content,len-1,'\n'); + + if (stream_write(stream, + (uint8_t*) furi_string_get_cstr(file_content), + len) != len) + { + FURI_LOG_W(TAG, "Short write to file"); + success = false; + goto write_err; + } + + /* Prepare for next line. */ + furi_string_reset(file_content); + this_line_samples = 0; + } + } + } else { + success = false; + FURI_LOG_W(TAG, "Unable to open file"); + } + +write_err: + furi_record_close(RECORD_STORAGE); + flipper_format_free(file); + if (file_content != NULL) furi_string_free(file_content); + return success; +} diff --git a/applications/plugins/protoview/ui.c b/applications/plugins/protoview/ui.c new file mode 100644 index 000000000..325fc5efc --- /dev/null +++ b/applications/plugins/protoview/ui.c @@ -0,0 +1,104 @@ +/* Copyright (C) 2022-2023 Salvatore Sanfilippo -- All Rights Reserved + * See the LICENSE file for information about the license. */ + +#include "app.h" + +/* =========================== Subview handling ================================ + * Note that these are not the Flipper subviews, but the subview system + * implemented inside ProtoView. + * ========================================================================== */ + +/* Return the ID of the currently selected subview, of the current + * view. */ +int get_current_subview(ProtoViewApp *app) { + return app->current_subview[app->current_view]; +} + +/* Called by view rendering callback that has subviews, to show small triangles + * facing down/up if there are other subviews the user can access with up + * and down. */ +void show_available_subviews(Canvas *canvas, ProtoViewApp *app, + int last_subview) +{ + int subview = get_current_subview(app); + if (subview != 0) + canvas_draw_triangle(canvas,120,5,8,5,CanvasDirectionBottomToTop); + if (subview != last_subview-1) + canvas_draw_triangle(canvas,120,59,8,5,CanvasDirectionTopToBottom); +} + +/* Handle up/down keys when we are in a subview. If the function catched + * such keypress, it returns true, so that the actual view input callback + * knows it can just return ASAP without doing anything. */ +bool process_subview_updown(ProtoViewApp *app, InputEvent input, int last_subview) { + int subview = get_current_subview(app); + if (input.type == InputTypePress) { + if (input.key == InputKeyUp) { + if (subview != 0) + app->current_subview[app->current_view]--; + return true; + } else if (input.key == InputKeyDown) { + if (subview != last_subview-1) + app->current_subview[app->current_view]++; + return true; + } + } + return false; +} + +/* ============================= Text input ==================================== + * Normally we just use our own private UI widgets. However for the text input + * widget, that is quite complex, visualizes a keyboard and must be standardized + * for user coherent experience, we use the one provided by the Flipper + * framework. The following two functions allow to show the keyboard to get + * text and later dismiss it. + * ========================================================================== */ + +/* Show the keyboard, take the user input and store it into the specified + * 'buffer' of 'buflen' total bytes. When the user is done, the done_callback + * is called passing the application context to it. Such callback needs + * to do whatever it wants with the input buffer and dismissi the keyboard + * calling: dismiss_keyboard(app); + * + * Note: if the buffer is not a null-termined zero string, what it contains will + * be used as initial input for the user. */ +void show_keyboard(ProtoViewApp *app, char *buffer, uint32_t buflen, + void (*done_callback)(void*)) +{ + app->show_text_input = true; + app->text_input_buffer = buffer; + app->text_input_buffer_len = buflen; + app->text_input_done_callback = done_callback; +} + +void dismiss_keyboard(ProtoViewApp *app) { + view_dispatcher_stop(app->view_dispatcher); +} + +/* =========================== Canvas extensions ============================ */ + +void canvas_draw_str_with_border(Canvas* canvas, uint8_t x, uint8_t y, const char* str, Color text_color, Color border_color) +{ + struct { + uint8_t x; uint8_t y; + } dir[8] = { + {-1,-1}, + {0,-1}, + {1,-1}, + {1,0}, + {1,1}, + {0,1}, + {-1,1}, + {-1,0} + }; + + /* Rotate in all the directions writing the same string to create a + * border, then write the actual string in the other color in the + * middle. */ + canvas_set_color(canvas, border_color); + for (int j = 0; j < 8; j++) + canvas_draw_str(canvas,x+dir[j].x,y+dir[j].y,str); + canvas_set_color(canvas, text_color); + canvas_draw_str(canvas,x,y,str); + canvas_set_color(canvas, ColorBlack); +} diff --git a/applications/plugins/protoview/view_direct_sampling.c b/applications/plugins/protoview/view_direct_sampling.c new file mode 100644 index 000000000..251a289b8 --- /dev/null +++ b/applications/plugins/protoview/view_direct_sampling.c @@ -0,0 +1,67 @@ +/* Copyright (C) 2022-2023 Salvatore Sanfilippo -- All Rights Reserved + * See the LICENSE file for information about the license. */ + +#include "app.h" + +#include + +/* Read directly from the G0 CC1101 pin, and draw a black or white + * dot depending on the level. */ +void render_view_direct_sampling(Canvas *const canvas, ProtoViewApp *app) { + if (!app->direct_sampling_enabled) { + canvas_set_font(canvas, FontSecondary); + canvas_draw_str(canvas,2,9,"Direct sampling is a special"); + canvas_draw_str(canvas,2,18,"mode that displays the signal"); + canvas_draw_str(canvas,2,27,"captured in real time. Like in"); + canvas_draw_str(canvas,2,36,"a old CRT TV. It's very slow."); + canvas_draw_str(canvas,2,45,"Can crash your Flipper."); + canvas_set_font(canvas, FontPrimary); + canvas_draw_str(canvas,14,60,"To enable press OK"); + return; + } + + for (int y = 0; y < 64; y++) { + for (int x = 0; x < 128; x++) { + bool level = furi_hal_gpio_read(&gpio_cc1101_g0); + if (level) canvas_draw_dot(canvas,x,y); + /* Busy loop: this is a terrible approach as it blocks + * everything else, but for now it's the best we can do + * to obtain direct data with some spacing. */ + uint32_t x = 250; while(x--); + } + } + canvas_set_font(canvas, FontSecondary); + canvas_draw_str_with_border(canvas,36,60,"Direct sampling", + ColorWhite,ColorBlack); +} + +/* Handle input */ +void process_input_direct_sampling(ProtoViewApp *app, InputEvent input) { + if (input.type == InputTypePress && input.key == InputKeyOk) { + app->direct_sampling_enabled = !app->direct_sampling_enabled; + } +} + +/* Enter view. Stop the subghz thread to prevent access as we read + * the CC1101 data directly. */ +void view_enter_direct_sampling(ProtoViewApp *app) { + if (app->txrx->txrx_state == TxRxStateRx && + !app->txrx->debug_timer_sampling) + { + subghz_worker_stop(app->txrx->worker); + } else { + raw_sampling_worker_stop(app); + } +} + +/* Exit view. Restore the subghz thread. */ +void view_exit_direct_sampling(ProtoViewApp *app) { + if (app->txrx->txrx_state == TxRxStateRx && + !app->txrx->debug_timer_sampling) + { + subghz_worker_start(app->txrx->worker); + } else { + raw_sampling_worker_start(app); + } + app->direct_sampling_enabled = false; +} diff --git a/applications/plugins/protoview/view_info.c b/applications/plugins/protoview/view_info.c new file mode 100644 index 000000000..b31c62a51 --- /dev/null +++ b/applications/plugins/protoview/view_info.c @@ -0,0 +1,165 @@ +/* Copyright (C) 2022-2023 Salvatore Sanfilippo -- All Rights Reserved + * See the LICENSE file for information about the license. */ + +#include "app.h" +#include +#include + +enum { + SubViewInfoMain, + SubViewInfoSave, + SubViewInfoLast, /* Just a sentinel. */ +}; + +/* Our view private data. */ +#define SAVE_FILENAME_LEN 64 +typedef struct { + /* Our save view displays an oscilloscope-alike resampled signal, + * so that the user can see what they are saving. With left/right + * you can move to next rows. Here we store where we are. */ + uint32_t signal_display_start_row; + char *filename; +} InfoViewPrivData; + +/* Render the view with the detected message information. */ +static void render_subview_main(Canvas *const canvas, ProtoViewApp *app) { + /* Protocol name as title. */ + canvas_set_font(canvas, FontPrimary); + uint8_t y = 8, lineheight = 10; + canvas_draw_str(canvas, 0, y, app->msg_info->name); + y += lineheight; + + /* Info fields. */ + char buf[128]; + canvas_set_font(canvas, FontSecondary); + if (app->msg_info->raw[0]) { + snprintf(buf,sizeof(buf),"Raw: %s", app->msg_info->raw); + canvas_draw_str(canvas, 0, y, buf); + y += lineheight; + } + canvas_draw_str(canvas, 0, y, app->msg_info->info1); y += lineheight; + canvas_draw_str(canvas, 0, y, app->msg_info->info2); y += lineheight; + canvas_draw_str(canvas, 0, y, app->msg_info->info3); y += lineheight; + canvas_draw_str(canvas, 0, y, app->msg_info->info4); y += lineheight; + + y = 37; + lineheight = 7; + canvas_draw_str(canvas, 119, y, "s"); y += lineheight; + canvas_draw_str(canvas, 119, y, "a"); y += lineheight; + canvas_draw_str(canvas, 119, y, "v"); y += lineheight; + canvas_draw_str(canvas, 119, y, "e"); y += lineheight; +} + +/* Render view with save option. */ +static void render_subview_save(Canvas *const canvas, ProtoViewApp *app) { + InfoViewPrivData *privdata = app->view_privdata; + + /* Display our signal in digital form: here we don't show the + * signal with the exact timing of the received samples, but as it + * is in its logic form, in exact multiples of the short pulse length. */ + uint8_t rows = 6; + uint8_t rowheight = 11; + uint8_t bitwidth = 4; + uint8_t bitheight = 5; + uint32_t idx = privdata->signal_display_start_row * (128/4); + bool prevbit = false; + for (uint8_t y = bitheight+12; y <= rows*rowheight; y += rowheight) { + for (uint8_t x = 0; x < 128; x += 4) { + bool bit = bitmap_get(app->msg_info->bits, + app->msg_info->bits_bytes,idx); + uint8_t prevy = y + prevbit*(bitheight*-1) - 1; + uint8_t thisy = y + bit*(bitheight*-1) - 1; + canvas_draw_line(canvas,x,prevy,x,thisy); + canvas_draw_line(canvas,x,thisy,x+bitwidth-1,thisy); + prevbit = bit; + if (idx >= app->msg_info->pulses_count) { + canvas_set_color(canvas, ColorWhite); + canvas_draw_dot(canvas, x+1,thisy); + canvas_draw_dot(canvas, x+3,thisy); + canvas_set_color(canvas, ColorBlack); + } + idx++; // Draw next bit + } + } + + canvas_set_font(canvas, FontSecondary); + canvas_draw_str(canvas, 0, 6, "ok: save, < >: slide rows"); +} + +/* Render the selected subview of this view. */ +void render_view_info(Canvas *const canvas, ProtoViewApp *app) { + if (app->signal_decoded == false) { + canvas_set_font(canvas, FontSecondary); + canvas_draw_str(canvas, 30,36,"No signal decoded"); + return; + } + + show_available_subviews(canvas,app,SubViewInfoLast); + switch(app->current_subview[app->current_view]) { + case SubViewInfoMain: render_subview_main(canvas,app); break; + case SubViewInfoSave: render_subview_save(canvas,app); break; + } +} + +/* The user typed the file name. Let's save it and remove the keyboard + * view. */ +void text_input_done_callback(void* context) { + ProtoViewApp *app = context; + InfoViewPrivData *privdata = app->view_privdata; + + FuriString *save_path = furi_string_alloc_printf( + "%s/%s.sub", EXT_PATH("subghz"), privdata->filename); + save_signal(app, furi_string_get_cstr(save_path)); + furi_string_free(save_path); + + free(privdata->filename); + dismiss_keyboard(app); +} + +/* Replace all the occurrences of character c1 with c2 in the specified + * string. */ +void str_replace(char *buf, char c1, char c2) { + char *p = buf; + while(*p) { + if (*p == c1) *p = c2; + p++; + } +} + +/* Set a random filename the user can edit. */ +void set_signal_random_filename(ProtoViewApp *app, char *buf, size_t buflen) { + char suffix[6]; + set_random_name(suffix,sizeof(suffix)); + snprintf(buf,buflen,"%.10s-%s-%d",app->msg_info->name,suffix,rand()%1000); + str_replace(buf,' ','_'); + str_replace(buf,'-','_'); + str_replace(buf,'/','_'); +} + +/* Handle input for the info view. */ +void process_input_info(ProtoViewApp *app, InputEvent input) { + if (process_subview_updown(app,input,SubViewInfoLast)) return; + InfoViewPrivData *privdata = app->view_privdata; + int subview = get_current_subview(app); + + /* Main subview. */ + if (subview == SubViewInfoMain) { + if (input.type == InputTypeShort && input.key == InputKeyOk) { + /* Reset the current sample to capture the next. */ + reset_current_signal(app); + } + } else if (subview == SubViewInfoSave) { + /* Save subview. */ + if (input.type == InputTypePress && input.key == InputKeyRight) { + privdata->signal_display_start_row++; + } else if (input.type == InputTypePress && input.key == InputKeyLeft) { + if (privdata->signal_display_start_row != 0) + privdata->signal_display_start_row--; + } else if (input.type == InputTypePress && input.key == InputKeyOk) { + privdata->filename = malloc(SAVE_FILENAME_LEN); + set_signal_random_filename(app,privdata->filename,SAVE_FILENAME_LEN); + show_keyboard(app, privdata->filename, SAVE_FILENAME_LEN, + text_input_done_callback); + } + } +} diff --git a/applications/plugins/protoview/view_raw_signal.c b/applications/plugins/protoview/view_raw_signal.c new file mode 100644 index 000000000..3c4fc3ae6 --- /dev/null +++ b/applications/plugins/protoview/view_raw_signal.c @@ -0,0 +1,97 @@ +/* Copyright (C) 2022-2023 Salvatore Sanfilippo -- All Rights Reserved + * See the LICENSE file for information about the license. */ + +#include "app.h" + +/* Render the received signal. + * + * The screen of the flipper is 128 x 64. Even using 4 pixels per line + * (where low level signal is one pixel high, high level is 4 pixels + * high) and 4 pixels of spacing between the different lines, we can + * plot comfortably 8 lines. + * + * The 'idx' argument is the first sample to render in the circular + * buffer. */ +void render_signal(ProtoViewApp *app, Canvas *const canvas, RawSamplesBuffer *buf, uint32_t idx) { + canvas_set_color(canvas, ColorBlack); + + int rows = 8; + uint32_t time_per_pixel = app->us_scale; + uint32_t start_idx = idx; + bool level = 0; + uint32_t dur = 0, sample_num = 0; + for (int row = 0; row < rows ; row++) { + for (int x = 0; x < 128; x++) { + int y = 3 + row*8; + if (dur < time_per_pixel/2) { + /* Get more data. */ + raw_samples_get(buf, idx++, &level, &dur); + sample_num++; + } + + canvas_draw_line(canvas, x,y,x,y-(level*3)); + + /* Write a small triangle under the last sample detected. */ + if (app->signal_bestlen != 0 && + sample_num+start_idx == app->signal_bestlen+1) + { + canvas_draw_dot(canvas,x,y+2); + canvas_draw_dot(canvas,x-1,y+3); + canvas_draw_dot(canvas,x,y+3); + canvas_draw_dot(canvas,x+1,y+3); + sample_num++; /* Make sure we don't mark the next, too. */ + } + + /* Remove from the current level duration the time we + * just plot. */ + if (dur > time_per_pixel) + dur -= time_per_pixel; + else + dur = 0; + } + } +} + +/* Raw pulses rendering. This is our default view. */ +void render_view_raw_pulses(Canvas *const canvas, ProtoViewApp *app) { + /* Show signal. */ + render_signal(app, canvas, DetectedSamples, app->signal_offset); + + /* Show signal information. */ + char buf[64]; + snprintf(buf,sizeof(buf),"%luus", + (unsigned long)DetectedSamples->short_pulse_dur); + canvas_set_font(canvas, FontSecondary); + canvas_draw_str_with_border(canvas, 97, 63, buf, ColorWhite, ColorBlack); + if (app->signal_decoded) { + canvas_set_font(canvas, FontPrimary); + canvas_draw_str_with_border(canvas, 1, 61, app->msg_info->name, ColorWhite, ColorBlack); + } +} + +/* Handle input for the raw pulses view. */ +void process_input_raw_pulses(ProtoViewApp *app, InputEvent input) { + if (input.type == InputTypeRepeat) { + /* Handle panning of the signal window. Long pressing + * right will show successive samples, long pressing left + * previous samples. */ + if (input.key == InputKeyRight) app->signal_offset++; + else if (input.key == InputKeyLeft) app->signal_offset--; + else if (input.key == InputKeyOk) { + app->signal_offset = 0; + app->us_scale = PROTOVIEW_RAW_VIEW_DEFAULT_SCALE; + } + } else if (input.type == InputTypeShort) { + if (input.key == InputKeyOk) { + /* Reset the current sample to capture the next. */ + reset_current_signal(app); + } else if (input.key == InputKeyDown) { + /* Rescaling. The set becomes finer under 50us per pixel. */ + uint32_t scale_step = app->us_scale >= 50 ? 50 : 10; + if (app->us_scale < 500) app->us_scale += scale_step; + } else if (input.key == InputKeyUp) { + uint32_t scale_step = app->us_scale > 50 ? 50 : 10; + if (app->us_scale > 10) app->us_scale -= scale_step; + } + } +} diff --git a/applications/plugins/protoview/view_settings.c b/applications/plugins/protoview/view_settings.c new file mode 100644 index 000000000..1e2dce226 --- /dev/null +++ b/applications/plugins/protoview/view_settings.c @@ -0,0 +1,117 @@ +/* Copyright (C) 2022-2023 Salvatore Sanfilippo -- All Rights Reserved + * See the LICENSE file for information about the license. */ + +#include "app.h" + +/* Renders a single view with frequency and modulation setting. However + * this are logically two different views, and only one of the settings + * will be highlighted. */ +void render_view_settings(Canvas *const canvas, ProtoViewApp *app) { + canvas_set_font(canvas, FontPrimary); + if (app->current_view == ViewFrequencySettings) + canvas_draw_str_with_border(canvas,1,10,"Frequency",ColorWhite,ColorBlack); + else + canvas_draw_str(canvas,1,10,"Frequency"); + + if (app->current_view == ViewModulationSettings) + canvas_draw_str_with_border(canvas,70,10,"Modulation",ColorWhite,ColorBlack); + else + canvas_draw_str(canvas,70,10,"Modulation"); + canvas_set_font(canvas, FontSecondary); + canvas_draw_str(canvas,10,61,"Use up and down to modify"); + + if (app->txrx->debug_timer_sampling) + canvas_draw_str(canvas,3,52,"(DEBUG timer sampling is ON)"); + + /* Show frequency. We can use big numbers font since it's just a number. */ + if (app->current_view == ViewFrequencySettings) { + char buf[16]; + snprintf(buf,sizeof(buf),"%.2f",(double)app->frequency/1000000); + canvas_set_font(canvas, FontBigNumbers); + canvas_draw_str(canvas, 30, 40, buf); + } else if (app->current_view == ViewModulationSettings) { + int current = app->modulation; + canvas_set_font(canvas, FontPrimary); + canvas_draw_str(canvas, 33, 39, ProtoViewModulations[current].name); + } +} + +/* Handle input for the settings view. */ +void process_input_settings(ProtoViewApp *app, InputEvent input) { + if (input.type == InputTypeLong && input.key == InputKeyOk) { + /* Long pressing to OK sets the default frequency and + * modulation. */ + app->frequency = subghz_setting_get_default_frequency(app->setting); + app->modulation = 0; + } else if (0 && input.type == InputTypeLong && input.key == InputKeyDown) { + /* Long pressing to down switches between normal and debug + * timer sampling mode. NOTE: this feature is disabled for users, + * only useful for devs (if useful at all). */ + + /* We have to stop the previous sampling system. */ + radio_rx_end(app); + + /* Then switch mode and start the new one. */ + app->txrx->debug_timer_sampling = !app->txrx->debug_timer_sampling; + radio_begin(app); + radio_rx(app); + } else if (input.type == InputTypePress && + (input.key != InputKeyDown || input.key != InputKeyUp)) + { + /* Handle up and down to change frequency or modulation. */ + if (app->current_view == ViewFrequencySettings) { + size_t curidx = 0, i; + size_t count = subghz_setting_get_frequency_count(app->setting); + + /* Scan the list of frequencies to check for the index of the + * currently set frequency. */ + for(i = 0; i < count; i++) { + uint32_t freq = subghz_setting_get_frequency(app->setting,i); + if (freq == app->frequency) { + curidx = i; + break; + } + } + if (i == count) return; /* Should never happen. */ + + if (input.key == InputKeyUp) { + curidx = curidx == 0 ? count-1 : curidx-1; + } else if (input.key == InputKeyDown) { + curidx = (curidx+1) % count; + } else { + return; + } + app->frequency = subghz_setting_get_frequency(app->setting,curidx); + } else if (app->current_view == ViewModulationSettings) { + uint32_t count = 0; + uint32_t modid = app->modulation; + + while(ProtoViewModulations[count].name != NULL) count++; + if (input.key == InputKeyUp) { + modid = modid == 0 ? count-1 : modid-1; + } else if (input.key == InputKeyDown) { + modid = (modid+1) % count; + } else { + return; + } + app->modulation = modid; + } + } else { + return; + } + + /* Apply changes when switching to other views. */ + app->txrx->freq_mod_changed = true; +} + +/* When the user switches to some other view, if they changed the parameters + * we need to restart the radio with the right frequency and modulation. */ +void view_exit_settings(ProtoViewApp *app) { + if (app->txrx->freq_mod_changed) { + FURI_LOG_E(TAG, "Setting view, setting frequency/modulation to %lu %s", app->frequency, ProtoViewModulations[app->modulation].name); + radio_rx_end(app); + radio_begin(app); + radio_rx(app); + app->txrx->freq_mod_changed = false; + } +} From 06501789468959667c8db39be6d823d8bfe13527 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Wed, 18 Jan 2023 21:17:53 +0300 Subject: [PATCH 091/506] Fixed and improved WAV Player by LTVA1 https://github.com/LTVA1/wav_player --- ReadMe.md | 2 +- applications/plugins/wav_player/README.md | 4 + applications/plugins/wav_player/wav_parser.c | 6 +- applications/plugins/wav_player/wav_parser.h | 40 +++++- applications/plugins/wav_player/wav_player.c | 126 +++++++++++------- .../plugins/wav_player/wav_player_hal.c | 103 +++++++++----- .../plugins/wav_player/wav_player_view.c | 19 +-- .../plugins/wav_player/wav_player_view.h | 31 +++++ 8 files changed, 229 insertions(+), 102 deletions(-) create mode 100644 applications/plugins/wav_player/README.md diff --git a/ReadMe.md b/ReadMe.md index a4913ae2d..9111b3691 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -106,7 +106,7 @@ You can support us by using links or addresses below: - WiFi Scanner plugin [(by SequoiaSan)](https://github.com/SequoiaSan/FlipperZero-WiFi-Scanner_Module) - MultiConverter plugin [(by theisolinearchip)](https://github.com/theisolinearchip/flipperzero_stuff) - USB Keyboard plugin [(by huuck)](https://github.com/huuck/FlipperZeroUSBKeyboard) -- WAV player plugin (fixed) [(OFW: DrZlo13)](https://github.com/flipperdevices/flipperzero-firmware/tree/zlo/wav-player) +- WAV Player [(OFW: DrZlo13)](https://github.com/flipperdevices/flipperzero-firmware/tree/zlo/wav-player) - Fixed and improved by [LTVA1](https://github.com/LTVA1/wav_player) - Barcode generator plugin [(original by McAzzaMan)](https://github.com/McAzzaMan/flipperzero-firmware/tree/UPC-A_Barcode_Generator/applications/barcode_generator) - [EAN-8 and refactoring](https://github.com/DarkFlippers/unleashed-firmware/pull/154) by @msvsergey - GPIO: Sentry Safe plugin [(by H4ckd4ddy)](https://github.com/H4ckd4ddy/flipperzero-sentry-safe-plugin) - ESP32: WiFi Marauder companion plugin [(by 0xchocolate)](https://github.com/0xchocolate/flipperzero-firmware-with-wifi-marauder-companion) diff --git a/applications/plugins/wav_player/README.md b/applications/plugins/wav_player/README.md new file mode 100644 index 000000000..e5ea73c2f --- /dev/null +++ b/applications/plugins/wav_player/README.md @@ -0,0 +1,4 @@ +# WAV player + A Flipper Zero application for playing wav files. My fork adds support for correct playback speed (for files with different sample rates) and for mono files (original wav player only plays stereo). You still need to convert your file to unsigned 8-bit PCM format for it to played correctly on flipper. + +Original app by https://github.com/DrZlo13. \ No newline at end of file diff --git a/applications/plugins/wav_player/wav_parser.c b/applications/plugins/wav_player/wav_parser.c index c2897706c..1f534bacb 100644 --- a/applications/plugins/wav_player/wav_parser.c +++ b/applications/plugins/wav_player/wav_parser.c @@ -29,7 +29,7 @@ void wav_parser_free(WavParser* parser) { free(parser); } -bool wav_parser_parse(WavParser* parser, Stream* stream) { +bool wav_parser_parse(WavParser* parser, Stream* stream, WavPlayerApp* app) { stream_read(stream, (uint8_t*)&parser->header, sizeof(WavHeaderChunk)); stream_read(stream, (uint8_t*)&parser->format, sizeof(WavFormatChunk)); stream_read(stream, (uint8_t*)&parser->data, sizeof(WavDataChunk)); @@ -63,6 +63,10 @@ bool wav_parser_parse(WavParser* parser, Stream* stream) { parser->format.byte_per_sec, parser->format.bits_per_sample); + app->sample_rate = parser->format.sample_rate; + app->num_channels = parser->format.channels; + app->bits_per_sample = parser->format.bits_per_sample; + parser->wav_data_start = stream_tell(stream); parser->wav_data_end = parser->wav_data_start + parser->data.size; diff --git a/applications/plugins/wav_player/wav_parser.h b/applications/plugins/wav_player/wav_parser.h index f50c48b3f..b442406f9 100644 --- a/applications/plugins/wav_player/wav_parser.h +++ b/applications/plugins/wav_player/wav_parser.h @@ -1,6 +1,18 @@ #pragma once #include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "wav_player_view.h" + #ifdef __cplusplus extern "C" { #endif @@ -34,11 +46,37 @@ typedef struct { typedef struct WavParser WavParser; +typedef struct { + Storage* storage; + Stream* stream; + WavParser* parser; + uint16_t* sample_buffer; + uint8_t* tmp_buffer; + + uint32_t sample_rate; + + uint16_t num_channels; + uint16_t bits_per_sample; + + size_t samples_count_half; + size_t samples_count; + + FuriMessageQueue* queue; + + float volume; + bool play; + + WavPlayerView* view; + ViewDispatcher* view_dispatcher; + Gui* gui; + NotificationApp* notification; +} WavPlayerApp; + WavParser* wav_parser_alloc(); void wav_parser_free(WavParser* parser); -bool wav_parser_parse(WavParser* parser, Stream* stream); +bool wav_parser_parse(WavParser* parser, Stream* stream, WavPlayerApp* app); size_t wav_parser_get_data_start(WavParser* parser); diff --git a/applications/plugins/wav_player/wav_player.c b/applications/plugins/wav_player/wav_player.c index 1e79fce61..3fb8b1ea5 100644 --- a/applications/plugins/wav_player/wav_player.c +++ b/applications/plugins/wav_player/wav_player.c @@ -19,7 +19,7 @@ #define WAVPLAYER_FOLDER "/ext/wav_player" static bool open_wav_stream(Stream* stream) { - DialogsApp* dialogs = furi_record_open("dialogs"); + DialogsApp* dialogs = furi_record_open(RECORD_DIALOGS); bool result = false; FuriString* path; path = furi_string_alloc(); @@ -32,7 +32,7 @@ static bool open_wav_stream(Stream* stream) { bool ret = dialog_file_browser_show(dialogs, path, path, &browser_options); - furi_record_close("dialogs"); + furi_record_close(RECORD_DIALOGS); if(ret) { if(!file_stream_open(stream, furi_string_get_cstr(path), FSAM_READ, FSOM_OPEN_EXISTING)) { FURI_LOG_E(TAG, "Cannot open file \"%s\"", furi_string_get_cstr(path)); @@ -79,27 +79,6 @@ static void wav_player_dma_isr(void* ctx) { } } -typedef struct { - Storage* storage; - Stream* stream; - WavParser* parser; - uint16_t* sample_buffer; - uint8_t* tmp_buffer; - - size_t samples_count_half; - size_t samples_count; - - FuriMessageQueue* queue; - - float volume; - bool play; - - WavPlayerView* view; - ViewDispatcher* view_dispatcher; - Gui* gui; - NotificationApp* notification; -} WavPlayerApp; - static WavPlayerApp* app_alloc() { WavPlayerApp* app = malloc(sizeof(WavPlayerApp)); app->samples_count_half = 1024 * 4; @@ -122,7 +101,7 @@ static WavPlayerApp* app_alloc() { view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); view_dispatcher_switch_to_view(app->view_dispatcher, 0); - app->notification = furi_record_open("notification"); + app->notification = furi_record_open(RECORD_NOTIFICATION); notification_message(app->notification, &sequence_display_backlight_enforce_on); return app; @@ -142,44 +121,89 @@ static void app_free(WavPlayerApp* app) { furi_record_close(RECORD_STORAGE); notification_message(app->notification, &sequence_display_backlight_enforce_auto); - furi_record_close("notification"); + furi_record_close(RECORD_NOTIFICATION); free(app); } // TODO: that works only with 8-bit 2ch audio static bool fill_data(WavPlayerApp* app, size_t index) { - uint16_t* sample_buffer_start = &app->sample_buffer[index]; - size_t count = stream_read(app->stream, app->tmp_buffer, app->samples_count); + if(app->num_channels == 1) { + uint16_t* sample_buffer_start = &app->sample_buffer[index]; + size_t count = stream_read(app->stream, app->tmp_buffer, app->samples_count_half); - for(size_t i = count; i < app->samples_count; i++) { - app->tmp_buffer[i] = 0; - } - - for(size_t i = 0; i < app->samples_count; i += 2) { - float data = app->tmp_buffer[i]; - data -= UINT8_MAX / 2; // to signed - data /= UINT8_MAX / 2; // scale -1..1 - - data *= app->volume; // volume - data = tanhf(data); // hyperbolic tangent limiter - - data *= UINT8_MAX / 2; // scale -128..127 - data += UINT8_MAX / 2; // to unsigned - - if(data < 0) { - data = 0; + for(size_t i = count; i < app->samples_count_half; i++) { + app->tmp_buffer[i] = 0; } - if(data > 255) { - data = 255; + //for(size_t i = 0; i < app->samples_count; i += 2) + for(size_t i = 0; i < app->samples_count_half; i++) //now works with mono! + { + float data = app->tmp_buffer[i]; + data -= UINT8_MAX / 2; // to signed + data /= UINT8_MAX / 2; // scale -1..1 + + data *= app->volume; // volume + data = tanhf(data); // hyperbolic tangent limiter + + data *= UINT8_MAX / 2; // scale -128..127 + data += UINT8_MAX / 2; // to unsigned + + if(data < 0) { + data = 0; + } + + if(data > 255) { + data = 255; + } + + //uint8_t data = app->tmp_buffer[i]; + + sample_buffer_start[i] = data; } - sample_buffer_start[i / 2] = data; + wav_player_view_set_data(app->view, sample_buffer_start, app->samples_count_half); + + return count != app->samples_count_half; } - wav_player_view_set_data(app->view, sample_buffer_start, app->samples_count_half); + if(app->num_channels == 2) { + uint16_t* sample_buffer_start = &app->sample_buffer[index]; + size_t count = stream_read(app->stream, app->tmp_buffer, app->samples_count); - return count != app->samples_count; + for(size_t i = count; i < app->samples_count; i++) { + app->tmp_buffer[i] = 0; + } + + for(size_t i = 0; i < app->samples_count; i += 2) { + float data = (app->tmp_buffer[i] + app->tmp_buffer[i + 1]) / 2; // (L + R) / 2 + data -= UINT8_MAX / 2; // to signed + data /= UINT8_MAX / 2; // scale -1..1 + + data *= app->volume; // volume + data = tanhf(data); // hyperbolic tangent limiter + + data *= UINT8_MAX / 2; // scale -128..127 + data += UINT8_MAX / 2; // to unsigned + + if(data < 0) { + data = 0; + } + + if(data > 255) { + data = 255; + } + + //uint8_t data = app->tmp_buffer[i]; + + sample_buffer_start[i / 2] = data; + } + + wav_player_view_set_data(app->view, sample_buffer_start, app->samples_count_half); + + return count != app->samples_count; + } + + return true; } static void ctrl_callback(WavPlayerCtrl ctrl, void* ctx) { @@ -218,7 +242,7 @@ static void ctrl_callback(WavPlayerCtrl ctrl, void* ctx) { static void app_run(WavPlayerApp* app) { if(!open_wav_stream(app->stream)) return; - if(!wav_parser_parse(app->parser, app->stream)) return; + if(!wav_parser_parse(app->parser, app->stream, app)) return; wav_player_view_set_volume(app->view, app->volume); wav_player_view_set_start(app->view, wav_parser_get_data_start(app->parser)); @@ -232,7 +256,7 @@ static void app_run(WavPlayerApp* app) { bool eof = fill_data(app, 0); eof = fill_data(app, app->samples_count_half); - wav_player_speaker_init(); + wav_player_speaker_init(app->sample_rate); wav_player_dma_init((uint32_t)app->sample_buffer, app->samples_count); furi_hal_interrupt_set_isr(FuriHalInterruptIdDma1Ch1, wav_player_dma_isr, app->queue); diff --git a/applications/plugins/wav_player/wav_player_hal.c b/applications/plugins/wav_player/wav_player_hal.c index ad0c019be..ece81fee0 100644 --- a/applications/plugins/wav_player/wav_player_hal.c +++ b/applications/plugins/wav_player/wav_player_hal.c @@ -2,57 +2,100 @@ #include #include +#include +#include +#include +#include + +//#define FURI_HAL_SPEAKER_TIMER TIM16 + #define FURI_HAL_SPEAKER_TIMER TIM16 + +#define SAMPLE_RATE_TIMER TIM2 + #define FURI_HAL_SPEAKER_CHANNEL LL_TIM_CHANNEL_CH1 #define DMA_INSTANCE DMA1, LL_DMA_CHANNEL_1 -void wav_player_speaker_init() { - LL_TIM_InitTypeDef TIM_InitStruct = {0}; - TIM_InitStruct.Prescaler = 4; - TIM_InitStruct.Autoreload = 255; - LL_TIM_Init(FURI_HAL_SPEAKER_TIMER, &TIM_InitStruct); +void wav_player_speaker_init(uint32_t sample_rate) +{ + LL_TIM_InitTypeDef TIM_InitStruct = {0}; + //TIM_InitStruct.Prescaler = 4; + TIM_InitStruct.Prescaler = 1; + TIM_InitStruct.Autoreload = + 255; //in this fork used purely as PWM timer, the DMA now is triggered by SAMPLE_RATE_TIMER + LL_TIM_Init(FURI_HAL_SPEAKER_TIMER, &TIM_InitStruct); - LL_TIM_OC_InitTypeDef TIM_OC_InitStruct = {0}; - TIM_OC_InitStruct.OCMode = LL_TIM_OCMODE_PWM1; - TIM_OC_InitStruct.OCState = LL_TIM_OCSTATE_ENABLE; - TIM_OC_InitStruct.CompareValue = 127; - LL_TIM_OC_Init(FURI_HAL_SPEAKER_TIMER, FURI_HAL_SPEAKER_CHANNEL, &TIM_OC_InitStruct); + LL_TIM_OC_InitTypeDef TIM_OC_InitStruct = {0}; + TIM_OC_InitStruct.OCMode = LL_TIM_OCMODE_PWM1; + TIM_OC_InitStruct.OCState = LL_TIM_OCSTATE_ENABLE; + TIM_OC_InitStruct.CompareValue = 127; + LL_TIM_OC_Init(FURI_HAL_SPEAKER_TIMER, FURI_HAL_SPEAKER_CHANNEL, &TIM_OC_InitStruct); + + //====================================================== + + TIM_InitStruct.Prescaler = 0; + //TIM_InitStruct.Autoreload = 1451; //64 000 000 / 1451 ~= 44100 Hz + + TIM_InitStruct.Autoreload = 64000000 / sample_rate; //to support various sample rates + + LL_TIM_Init(SAMPLE_RATE_TIMER, &TIM_InitStruct); + + //LL_TIM_OC_InitTypeDef TIM_OC_InitStruct = {0}; + TIM_OC_InitStruct.OCMode = LL_TIM_OCMODE_PWM1; + TIM_OC_InitStruct.OCState = LL_TIM_OCSTATE_ENABLE; + TIM_OC_InitStruct.CompareValue = 127; + LL_TIM_OC_Init(SAMPLE_RATE_TIMER, FURI_HAL_SPEAKER_CHANNEL, &TIM_OC_InitStruct); + + //========================================================= + //configuring PA6 pin as TIM16 output + + //furi_hal_gpio_init_ex(&gpio_ext_pa6, (GpioMode)GpioPullNo, (GpioPull)GpioModeAltFunctionPushPull, GpioSpeedVeryHigh, GpioAltFn14TIM16); + //furi_hal_gpio_init_ex(&gpio_ext_pa6, (GpioMode)GpioPullNo, (GpioPull)GpioModeAltFunctionPushPull, GpioSpeedLow, GpioAltFn14TIM16); + furi_hal_gpio_init_ex(&gpio_ext_pa6, GpioModeAltFunctionPushPull, GpioPullNo, GpioSpeedVeryHigh, GpioAltFn14TIM16); + //furi_hal_gpio_init_simple(&gpio_ext_pa6, GpioModeOutputPushPull); + //furi_hal_gpio_write(&gpio_ext_pa6, false); } void wav_player_speaker_start() { - LL_TIM_EnableAllOutputs(FURI_HAL_SPEAKER_TIMER); - LL_TIM_EnableCounter(FURI_HAL_SPEAKER_TIMER); + LL_TIM_EnableAllOutputs(FURI_HAL_SPEAKER_TIMER); + LL_TIM_EnableCounter(FURI_HAL_SPEAKER_TIMER); + + LL_TIM_EnableAllOutputs(SAMPLE_RATE_TIMER); + LL_TIM_EnableCounter(SAMPLE_RATE_TIMER); } void wav_player_speaker_stop() { - LL_TIM_DisableAllOutputs(FURI_HAL_SPEAKER_TIMER); - LL_TIM_DisableCounter(FURI_HAL_SPEAKER_TIMER); + LL_TIM_DisableAllOutputs(FURI_HAL_SPEAKER_TIMER); + LL_TIM_DisableCounter(FURI_HAL_SPEAKER_TIMER); + + LL_TIM_DisableAllOutputs(SAMPLE_RATE_TIMER); + LL_TIM_DisableCounter(SAMPLE_RATE_TIMER); } void wav_player_dma_init(uint32_t address, size_t size) { - uint32_t dma_dst = (uint32_t) & (FURI_HAL_SPEAKER_TIMER->CCR1); + uint32_t dma_dst = (uint32_t) & (FURI_HAL_SPEAKER_TIMER->CCR1); - LL_DMA_ConfigAddresses(DMA_INSTANCE, address, dma_dst, LL_DMA_DIRECTION_MEMORY_TO_PERIPH); - LL_DMA_SetDataLength(DMA_INSTANCE, size); + LL_DMA_ConfigAddresses(DMA_INSTANCE, address, dma_dst, LL_DMA_DIRECTION_MEMORY_TO_PERIPH); + LL_DMA_SetDataLength(DMA_INSTANCE, size); - LL_DMA_SetPeriphRequest(DMA_INSTANCE, LL_DMAMUX_REQ_TIM16_UP); - LL_DMA_SetDataTransferDirection(DMA_INSTANCE, LL_DMA_DIRECTION_MEMORY_TO_PERIPH); - LL_DMA_SetChannelPriorityLevel(DMA_INSTANCE, LL_DMA_PRIORITY_VERYHIGH); - LL_DMA_SetMode(DMA_INSTANCE, LL_DMA_MODE_CIRCULAR); - LL_DMA_SetPeriphIncMode(DMA_INSTANCE, LL_DMA_PERIPH_NOINCREMENT); - LL_DMA_SetMemoryIncMode(DMA_INSTANCE, LL_DMA_MEMORY_INCREMENT); - LL_DMA_SetPeriphSize(DMA_INSTANCE, LL_DMA_PDATAALIGN_HALFWORD); - LL_DMA_SetMemorySize(DMA_INSTANCE, LL_DMA_MDATAALIGN_HALFWORD); + LL_DMA_SetPeriphRequest(DMA_INSTANCE, LL_DMAMUX_REQ_TIM2_UP); + LL_DMA_SetDataTransferDirection(DMA_INSTANCE, LL_DMA_DIRECTION_MEMORY_TO_PERIPH); + LL_DMA_SetChannelPriorityLevel(DMA_INSTANCE, LL_DMA_PRIORITY_VERYHIGH); + LL_DMA_SetMode(DMA_INSTANCE, LL_DMA_MODE_CIRCULAR); + LL_DMA_SetPeriphIncMode(DMA_INSTANCE, LL_DMA_PERIPH_NOINCREMENT); + LL_DMA_SetMemoryIncMode(DMA_INSTANCE, LL_DMA_MEMORY_INCREMENT); + LL_DMA_SetPeriphSize(DMA_INSTANCE, LL_DMA_PDATAALIGN_HALFWORD); + LL_DMA_SetMemorySize(DMA_INSTANCE, LL_DMA_MDATAALIGN_HALFWORD); - LL_DMA_EnableIT_TC(DMA_INSTANCE); - LL_DMA_EnableIT_HT(DMA_INSTANCE); + LL_DMA_EnableIT_TC(DMA_INSTANCE); + LL_DMA_EnableIT_HT(DMA_INSTANCE); } void wav_player_dma_start() { - LL_DMA_EnableChannel(DMA_INSTANCE); - LL_TIM_EnableDMAReq_UPDATE(FURI_HAL_SPEAKER_TIMER); + LL_DMA_EnableChannel(DMA_INSTANCE); + LL_TIM_EnableDMAReq_UPDATE(SAMPLE_RATE_TIMER); } void wav_player_dma_stop() { - LL_DMA_DisableChannel(DMA_INSTANCE); + LL_DMA_DisableChannel(DMA_INSTANCE); } \ No newline at end of file diff --git a/applications/plugins/wav_player/wav_player_view.c b/applications/plugins/wav_player/wav_player_view.c index fdf08cb21..b2414d0b8 100644 --- a/applications/plugins/wav_player/wav_player_view.c +++ b/applications/plugins/wav_player/wav_player_view.c @@ -1,22 +1,5 @@ #include "wav_player_view.h" -#define DATA_COUNT 116 - -struct WavPlayerView { - View* view; - WavPlayerCtrlCallback callback; - void* context; -}; - -typedef struct { - bool play; - float volume; - size_t start; - size_t end; - size_t current; - uint8_t data[DATA_COUNT]; -} WavPlayerViewModel; - float map(float x, float in_min, float in_max, float out_min, float out_max) { return (x - in_min) * (out_max - out_min + 1) / (in_max - in_min + 1) + out_min; } @@ -30,7 +13,7 @@ static void wav_player_view_draw_callback(Canvas* canvas, void* _model) { uint8_t y_pos = 0; // volume - x_pos = 124; + x_pos = 123; y_pos = 0; const float volume = (64 / 10.0f) * model->volume; canvas_draw_frame(canvas, x_pos, y_pos, 4, 64); diff --git a/applications/plugins/wav_player/wav_player_view.h b/applications/plugins/wav_player/wav_player_view.h index 246aeaf3e..72227c096 100644 --- a/applications/plugins/wav_player/wav_player_view.h +++ b/applications/plugins/wav_player/wav_player_view.h @@ -1,6 +1,16 @@ #pragma once #include +#include +#include +#include +#include +#include +#include +#include +#include +#include + #ifdef __cplusplus extern "C" { #endif @@ -18,6 +28,27 @@ typedef enum { typedef void (*WavPlayerCtrlCallback)(WavPlayerCtrl ctrl, void* context); +#define DATA_COUNT 116 + +struct WavPlayerView { + View* view; + WavPlayerCtrlCallback callback; + void* context; +}; + +typedef struct { + bool play; + float volume; + size_t start; + size_t end; + size_t current; + uint8_t data[DATA_COUNT]; +} WavPlayerViewModel; + + + + + WavPlayerView* wav_player_view_alloc(); void wav_player_view_free(WavPlayerView* wav_view); From e4aad248cf893cf45bf9420429e3b4bd57608bda Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Wed, 18 Jan 2023 22:24:16 +0300 Subject: [PATCH 092/506] Update changelog and readme --- CHANGELOG.md | 69 ++++++++++++++++++---------------------------------- ReadMe.md | 1 + 2 files changed, 24 insertions(+), 46 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 285348b8b..514d801ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,50 +1,27 @@ ### New changes -* CI/CD: Builds with extra apps pack included, see new option below -* SubGHz: Allow manual creation of Nice Flor S, Nice Smilo -* LF RFID: Allow removing password from T5577 to make it operational (PR #225 | by @TQMatvey & Tobirg (grvpvl)) -* Plugins -> Barcode Generator: Save last used barcode, and load on app start -* Plugins -> Barcode Generator: Add EAN-13 support (PR #234 | by @gid9798) -* Plugins -> Arkanoid: Fix bug with unability to continue game after first level -* Plugins -> Morse Code: Fixed crashes, fixed known issues (PR #249 | by @gid9798) -* Plugins -> USB Keyboard & Mouse: Added ESCAPE key (PR #243 | by @huuck) -* Plugins -> USB Keyboard & Mouse: Added Delete key -* Plugins -> SubGHz Bruteforcer: Add holtek HT12X protocol support -* Plugins -> POCSAG Pager: Fix UI bug -* Plugins -> Wifi Marauder: Enable +5volt on plugin start, to allow usage with custom boards -* Plugins: Add 2048 Game (PR #233 | by @eugene-kirzhanov) -* Plugins: Update TOTP, UniTemp, Wifi marauder to latest commits from their repo's -* Infrared: Universal remote assets updates (by @amec0e | PRs #246 #242) -* Readme fixes (PR #247 | by @Kavitate) -* New Year update slideshow (by @Svaarich) -* Show OTP flipper region on debug and about screens -* OFW: Add float_tools to SDK api -* OFW: Gui: change data ownership model in submenu, own text by default -* OFW: Gui: Direct Draw API -* OFW: Mifare dictionary attack performance improvements. -* OFW: SubGhz: CAME 12 bit encoder fix guard time -* OFW: Fix MFC bruteforce progress bar -* OFW: Docs and readme's updates -* OFW: Picopass read bug fixes -* OFW: OpenOCD scripts -* OFW: New MFC Bruteforce animation -* OFW: File browser: Empty folder label -* OFW: SubGhz: add Holtek_ht12x protocol -* OFW: USB/BLE HID Remote icon fix -* OFW: Fix quoted error for macOS bad-usb -* OFW: Modules: locking view model -* OFW: Fix PVS-Studio warnings -* OFW: Fix unit tests -* OFW: WeatherStation: fix incorrect history index increment -* OFW: File format docs: RFID, iButton, BadUSB -* OFW: SubGhz: fix start navigation -* OFW: iButton: fixed notification on successful read -* OFW: Archive browser delete fix -* OFW: Fixes: correct scrolling text -* OFW: SubGhz: fix Hormann HSM -* OFW: Rework BLE key storage -* OFW: Gui: scrollable long file names in FileBrowser and Archive Browser -* OFW: Untangle NFC_APP_FOLDER from nfc_device -* OFW: WS: add choice fahrenheit/celsius (can be set from flipper settings -> system) +* SubGHz: **Somfy Telis Encoder** (PR #289 | by @assasinfil & @TQMatvey) +* SubGHz: Add 350Mhz to default range +* Plugins -> Solitaire: Fix for solitaire card placement bug (PR #253 | by @teeebor) +* Plugins -> UniTemp, TOTP - Updated to latest commits +* Plugins -> Added Text Viewer [(by kowalski7cc & kyhwana)](https://github.com/kowalski7cc/flipper-zero-text-viewer/tree/refactor-text-app) +* Plugins -> Added **UART Terminal** [(by cool4uma)](https://github.com/cool4uma/UART_Terminal/tree/main) +* Plugins -> Added **ProtoView** [(by antirez)](https://github.com/antirez/protoview) +* Plugins -> WAV Player - Replaced with fixed and improved version by [@LTVA1](https://github.com/LTVA1/wav_player) +* Clock: Fix 12AM was displaying as 00 AM (PR #288 | by @Smileycathy1128) +* Infrared: Allow disabling automatic signal decoding (aka Learn RAW) - works only when debug enabled (PR #273 | by @darmiel) +* Infrared: Update universal remote assets (by @amec0e) +* Desktop: New battery display (Bar %) - (PR #278 | by @Fasjeit) +* BadUSB: Adding CZ keyboard layout (PR #255 | by @peoblouk) +* OFW: Various improvements: Toolbox, Updater and Unit Tests. +* OFW: Fix typos in source code +* OFW: Add the sleigh ride animation +* OFW: Documentation: edit texts, markdown linting +* OFW: Change broken BadUSB link to Hak5 duckyscript quick reference webpage +* OFW: **Per protocol signal repeat count** - **Fixes issues with Sony remotes with SIRC protocol (bruteforce also fixed now!)** +* OFW: Add the ability to turn pages in infrared +* OFW: relocate R_ARM_CALL +* OFW: fbt: PVS support +* OFW: fbt: removed DEBUG_TOOLS & FAP_EXAMPLES flags #### [🎲 Download latest extra apps pack](https://download-directory.github.io/?url=https://github.com/xMasterX/unleashed-extra-pack/tree/main/apps) diff --git a/ReadMe.md b/ReadMe.md index 9111b3691..e904934c1 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -71,6 +71,7 @@ Also check the changelog in releases for latest updates! - BFT Mitto [External seed calculation required (For info contact me in Discord: Nano#8998)] - Security+ v1 & v2 - Star Line +- Somfy Telis (by @assasinfil & @TQMatvey) ## Please support development of the project The majority of this project is developed and maintained by me, @xMasterX. From 5a9da13d84cf5301b86ebcaec21b04415328fd94 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Wed, 18 Jan 2023 22:25:39 +0300 Subject: [PATCH 093/506] Update UniTemp and run fbt format --- applications/plugins/protoview/app.c | 146 ++++---- applications/plugins/protoview/app.h | 173 +++++---- applications/plugins/protoview/app_buffer.c | 35 +- applications/plugins/protoview/app_buffer.h | 25 +- applications/plugins/protoview/app_subghz.c | 56 +-- applications/plugins/protoview/crc.c | 9 +- .../plugins/protoview/custom_presets.h | 8 +- applications/plugins/protoview/data_feed.c | 17 +- .../plugins/protoview/protocols/b4b1.c | 35 +- .../plugins/protoview/protocols/keeloq.c | 87 +++-- .../plugins/protoview/protocols/oregon2.c | 100 +++-- .../protoview/protocols/tpms/citroen.c | 66 ++-- .../plugins/protoview/protocols/tpms/ford.c | 72 ++-- .../protoview/protocols/tpms/renault.c | 69 ++-- .../protoview/protocols/tpms/schrader.c | 71 ++-- .../protocols/tpms/schrader_eg53ma4.c | 69 ++-- .../plugins/protoview/protocols/tpms/toyota.c | 79 ++-- applications/plugins/protoview/signal.c | 347 ++++++++++-------- applications/plugins/protoview/signal_file.c | 96 +++-- applications/plugins/protoview/ui.c | 61 ++- .../plugins/protoview/view_direct_sampling.c | 45 ++- applications/plugins/protoview/view_info.c | 129 ++++--- .../plugins/protoview/view_raw_signal.c | 57 ++- .../plugins/protoview/view_settings.c | 74 ++-- .../plugins/text_viewer/text_viewer.c | 9 +- applications/plugins/unitemp/Sensors.c | 31 +- applications/plugins/unitemp/Sensors.h | 3 +- .../plugins/unitemp/interfaces/SPISensor.c | 89 +++++ .../plugins/unitemp/interfaces/SPISensor.h | 66 ++++ .../plugins/unitemp/sensors/MAX31855.c | 93 +++++ .../plugins/unitemp/sensors/MAX31855.h | 65 ++++ .../plugins/unitemp/views/General_view.c | 27 +- .../plugins/unitemp/views/SensorEdit_view.c | 15 +- .../plugins/unitemp/views/SensorsList_view.c | 4 +- .../plugins/wav_player/wav_player_hal.c | 112 +++--- .../plugins/wav_player/wav_player_view.h | 4 - 36 files changed, 1478 insertions(+), 966 deletions(-) create mode 100644 applications/plugins/unitemp/interfaces/SPISensor.c create mode 100644 applications/plugins/unitemp/interfaces/SPISensor.h create mode 100644 applications/plugins/unitemp/sensors/MAX31855.c create mode 100644 applications/plugins/unitemp/sensors/MAX31855.h diff --git a/applications/plugins/protoview/app.c b/applications/plugins/protoview/app.c index 0f860d08e..33f740499 100644 --- a/applications/plugins/protoview/app.c +++ b/applications/plugins/protoview/app.c @@ -40,8 +40,8 @@ extern const SubGhzProtocolRegistry protoview_protocol_registry; /* The callback actually just passes the control to the actual active * view callback, after setting up basic stuff like cleaning the screen * and setting color to black. */ -static void render_callback(Canvas *const canvas, void *ctx) { - ProtoViewApp *app = ctx; +static void render_callback(Canvas* const canvas, void* ctx) { + ProtoViewApp* app = ctx; /* Clear screen. */ canvas_set_color(canvas, ColorWhite); @@ -51,62 +51,69 @@ static void render_callback(Canvas *const canvas, void *ctx) { /* Call who is in charge right now. */ switch(app->current_view) { - case ViewRawPulses: render_view_raw_pulses(canvas,app); break; - case ViewInfo: render_view_info(canvas,app); break; + case ViewRawPulses: + render_view_raw_pulses(canvas, app); + break; + case ViewInfo: + render_view_info(canvas, app); + break; case ViewFrequencySettings: case ViewModulationSettings: - render_view_settings(canvas,app); break; - case ViewDirectSampling: render_view_direct_sampling(canvas,app); break; - case ViewLast: furi_crash(TAG " ViewLast selected"); break; + render_view_settings(canvas, app); + break; + case ViewDirectSampling: + render_view_direct_sampling(canvas, app); + break; + case ViewLast: + furi_crash(TAG " ViewLast selected"); + break; } } /* Here all we do is putting the events into the queue that will be handled * in the while() loop of the app entry point function. */ -static void input_callback(InputEvent* input_event, void* ctx) -{ - ProtoViewApp *app = ctx; - furi_message_queue_put(app->event_queue,input_event,FuriWaitForever); +static void input_callback(InputEvent* input_event, void* ctx) { + ProtoViewApp* app = ctx; + furi_message_queue_put(app->event_queue, input_event, FuriWaitForever); } - /* Called to switch view (when left/right is pressed). Handles * changing the current view ID and calling the enter/exit view * callbacks if needed. */ -static void app_switch_view(ProtoViewApp *app, SwitchViewDirection dir) { +static void app_switch_view(ProtoViewApp* app, SwitchViewDirection dir) { ProtoViewCurrentView old = app->current_view; - if (dir == AppNextView) { + if(dir == AppNextView) { app->current_view++; - if (app->current_view == ViewLast) app->current_view = 0; - } else if (dir == AppPrevView) { - if (app->current_view == 0) - app->current_view = ViewLast-1; + if(app->current_view == ViewLast) app->current_view = 0; + } else if(dir == AppPrevView) { + if(app->current_view == 0) + app->current_view = ViewLast - 1; else app->current_view--; } ProtoViewCurrentView new = app->current_view; /* Call the enter/exit view callbacks if needed. */ - if (old == ViewDirectSampling) view_exit_direct_sampling(app); - if (new == ViewDirectSampling) view_enter_direct_sampling(app); + if(old == ViewDirectSampling) view_exit_direct_sampling(app); + if(new == ViewDirectSampling) view_enter_direct_sampling(app); /* The frequency/modulation settings are actually a single view: * as long as the user stays between the two modes of this view we * don't need to call the exit-view callback. */ - if ((old == ViewFrequencySettings && new != ViewModulationSettings) || - (old == ViewModulationSettings && new != ViewFrequencySettings)) + if((old == ViewFrequencySettings && new != ViewModulationSettings) || + (old == ViewModulationSettings && new != ViewFrequencySettings)) view_exit_settings(app); /* Set the current subview of the view we just left to zero, that is * the main subview of the view. When re re-enter it we want to see * the main thing. */ app->current_subview[old] = 0; - memset(app->view_privdata,0,PROTOVIEW_VIEW_PRIVDATA_LEN); + memset(app->view_privdata, 0, PROTOVIEW_VIEW_PRIVDATA_LEN); } /* Allocate the application state and initialize a number of stuff. * This is called in the entry point to create the application state. */ ProtoViewApp* protoview_app_alloc() { - ProtoViewApp *app = malloc(sizeof(ProtoViewApp)); + ProtoViewApp* app = malloc(sizeof(ProtoViewApp)); // Init shared data structures RawSamples = raw_samples_alloc(); @@ -127,10 +134,10 @@ ProtoViewApp* protoview_app_alloc() { app->text_input = NULL; app->show_text_input = false; app->current_view = ViewRawPulses; - for (int j = 0; j < ViewLast; j++) app->current_subview[j] = 0; + for(int j = 0; j < ViewLast; j++) app->current_subview[j] = 0; app->direct_sampling_enabled = false; app->view_privdata = malloc(PROTOVIEW_VIEW_PRIVDATA_LEN); - memset(app->view_privdata,0,PROTOVIEW_VIEW_PRIVDATA_LEN); + memset(app->view_privdata, 0, PROTOVIEW_VIEW_PRIVDATA_LEN); // Signal found and visualization defaults app->signal_bestlen = 0; @@ -155,17 +162,14 @@ ProtoViewApp* protoview_app_alloc() { app->txrx->environment = subghz_environment_alloc(); subghz_environment_set_protocol_registry( app->txrx->environment, (void*)&protoview_protocol_registry); - app->txrx->receiver = - subghz_receiver_alloc_init(app->txrx->environment); - subghz_receiver_set_filter(app->txrx->receiver, - SubGhzProtocolFlag_Decodable); + app->txrx->receiver = subghz_receiver_alloc_init(app->txrx->environment); + subghz_receiver_set_filter(app->txrx->receiver, SubGhzProtocolFlag_Decodable); subghz_worker_set_overrun_callback( - app->txrx->worker, - (SubGhzWorkerOverrunCallback)subghz_receiver_reset); + app->txrx->worker, (SubGhzWorkerOverrunCallback)subghz_receiver_reset); subghz_worker_set_pair_callback( app->txrx->worker, (SubGhzWorkerPairCallback)subghz_receiver_decode); subghz_worker_set_context(app->txrx->worker, app->txrx->receiver); - + app->frequency = subghz_setting_get_default_frequency(app->setting); app->modulation = 0; /* Defaults to ProtoViewModulations[0]. */ @@ -178,7 +182,7 @@ ProtoViewApp* protoview_app_alloc() { /* Free what the application allocated. It is not clear to me if the * Flipper OS, once the application exits, will be able to reclaim space * even if we forget to free something here. */ -void protoview_app_free(ProtoViewApp *app) { +void protoview_app_free(ProtoViewApp* app) { furi_assert(app); // Put CC1101 on sleep. @@ -196,7 +200,7 @@ void protoview_app_free(ProtoViewApp *app) { subghz_setting_free(app->setting); // Worker stuff. - if (!app->txrx->debug_timer_sampling) { + if(!app->txrx->debug_timer_sampling) { subghz_receiver_free(app->txrx->receiver); subghz_environment_free(app->txrx->environment); subghz_worker_free(app->txrx->worker); @@ -214,8 +218,8 @@ void protoview_app_free(ProtoViewApp *app) { /* Called periodically. Do signal processing here. Data we process here * will be later displayed by the render callback. The side effect of this * function is to scan for signals and set DetectedSamples. */ -static void timer_callback(void *ctx) { - ProtoViewApp *app = ctx; +static void timer_callback(void* ctx) { + ProtoViewApp* app = ctx; uint32_t delta, lastidx = app->signal_last_scan_idx; /* scan_for_signal(), called by this function, deals with a @@ -223,22 +227,22 @@ static void timer_callback(void *ctx) { * cross-boundaries, it is enough if we scan each time the buffer fills * for 50% more compared to the last scan. Thanks to this check we * can avoid scanning too many times to just find the same data. */ - if (lastidx < RawSamples->idx) { + if(lastidx < RawSamples->idx) { delta = RawSamples->idx - lastidx; } else { delta = RawSamples->total - lastidx + RawSamples->idx; } - if (delta < RawSamples->total/2) return; + if(delta < RawSamples->total / 2) return; app->signal_last_scan_idx = RawSamples->idx; scan_for_signal(app); } int32_t protoview_app_entry(void* p) { UNUSED(p); - ProtoViewApp *app = protoview_app_alloc(); + ProtoViewApp* app = protoview_app_alloc(); /* Create a timer. We do data analysis in the callback. */ - FuriTimer *timer = furi_timer_alloc(timer_callback, FuriTimerTypePeriodic, app); + FuriTimer* timer = furi_timer_alloc(timer_callback, FuriTimerTypePeriodic, app); furi_timer_start(timer, furi_kernel_get_tick_frequency() / 8); /* Start listening to signals immediately. */ @@ -253,58 +257,57 @@ int32_t protoview_app_entry(void* p) { InputEvent input; while(app->running) { FuriStatus qstat = furi_message_queue_get(app->event_queue, &input, 100); - if (qstat == FuriStatusOk) { - if (DEBUG_MSG) FURI_LOG_E(TAG, "Main Loop - Input: type %d key %u", - input.type, input.key); + if(qstat == FuriStatusOk) { + if(DEBUG_MSG) + FURI_LOG_E(TAG, "Main Loop - Input: type %d key %u", input.type, input.key); /* Handle navigation here. Then handle view-specific inputs * in the view specific handling function. */ - if (input.type == InputTypeShort && - input.key == InputKeyBack) - { + if(input.type == InputTypeShort && input.key == InputKeyBack) { /* Exit the app. */ app->running = 0; - } else if (input.type == InputTypeShort && - input.key == InputKeyRight && - get_current_subview(app) == 0) - { + } else if( + input.type == InputTypeShort && input.key == InputKeyRight && + get_current_subview(app) == 0) { /* Go to the next view. */ - app_switch_view(app,AppNextView); - } else if (input.type == InputTypeShort && - input.key == InputKeyLeft && - get_current_subview(app) == 0) - { + app_switch_view(app, AppNextView); + } else if( + input.type == InputTypeShort && input.key == InputKeyLeft && + get_current_subview(app) == 0) { /* Go to the previous view. */ - app_switch_view(app,AppPrevView); + app_switch_view(app, AppPrevView); } else { /* This is where we pass the control to the currently * active view input processing. */ switch(app->current_view) { case ViewRawPulses: - process_input_raw_pulses(app,input); + process_input_raw_pulses(app, input); break; case ViewInfo: - process_input_info(app,input); + process_input_info(app, input); break; case ViewFrequencySettings: case ViewModulationSettings: - process_input_settings(app,input); + process_input_settings(app, input); break; case ViewDirectSampling: - process_input_direct_sampling(app,input); + process_input_direct_sampling(app, input); + break; + case ViewLast: + furi_crash(TAG " ViewLast selected"); break; - case ViewLast: furi_crash(TAG " ViewLast selected"); break; } } } else { /* Useful to understand if the app is still alive when it * does not respond because of bugs. */ - if (DEBUG_MSG) { - static int c = 0; c++; - if (!(c % 20)) FURI_LOG_E(TAG, "Loop timeout"); + if(DEBUG_MSG) { + static int c = 0; + c++; + if(!(c % 20)) FURI_LOG_E(TAG, "Loop timeout"); } } - if (app->show_text_input) { + if(app->show_text_input) { /* Remove our viewport: we need to use a view dispatcher * in order to show the standard Flipper keyboard. */ gui_remove_view_port(app->gui, app->view_port); @@ -314,8 +317,9 @@ int32_t protoview_app_entry(void* p) { app->view_dispatcher = view_dispatcher_alloc(); view_dispatcher_enable_queue(app->view_dispatcher); app->text_input = text_input_alloc(); - view_dispatcher_set_event_callback_context(app->view_dispatcher,app); - view_dispatcher_add_view(app->view_dispatcher, 0, text_input_get_view(app->text_input)); + view_dispatcher_set_event_callback_context(app->view_dispatcher, app); + view_dispatcher_add_view( + app->view_dispatcher, 0, text_input_get_view(app->text_input)); view_dispatcher_switch_to_view(app->view_dispatcher, 0); /* Setup the text input view. The different parameters are set @@ -331,7 +335,8 @@ int32_t protoview_app_entry(void* p) { false); /* Run the dispatcher with the keyboard. */ - view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); + view_dispatcher_attach_to_gui( + app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); view_dispatcher_run(app->view_dispatcher); /* Undo all it: remove the view from the dispatcher, free it @@ -349,7 +354,7 @@ int32_t protoview_app_entry(void* p) { } /* App no longer running. Shut down and free. */ - if (app->txrx->txrx_state == TxRxStateRx) { + if(app->txrx->txrx_state == TxRxStateRx) { FURI_LOG_E(TAG, "Putting CC1101 to sleep before exiting."); radio_rx_end(app); radio_sleep(app); @@ -359,4 +364,3 @@ int32_t protoview_app_entry(void* p) { protoview_app_free(app); return 0; } - diff --git a/applications/plugins/protoview/app.h b/applications/plugins/protoview/app.h index 7698d4325..82f2f5263 100644 --- a/applications/plugins/protoview/app.h +++ b/applications/plugins/protoview/app.h @@ -50,17 +50,14 @@ typedef enum { } ProtoViewCurrentView; /* Used by app_switch_view() */ -typedef enum { - AppNextView, - AppPrevView -} SwitchViewDirection; +typedef enum { AppNextView, AppPrevView } SwitchViewDirection; typedef struct { - const char *name; // Name to show to the user. - const char *id; // Identifier in the Flipper API/file. - FuriHalSubGhzPreset preset; // The preset ID. - uint8_t *custom; // If not null, a set of registers for - // the CC1101, specifying a custom preset. + const char* name; // Name to show to the user. + const char* id; // Identifier in the Flipper API/file. + FuriHalSubGhzPreset preset; // The preset ID. + uint8_t* custom; // If not null, a set of registers for + // the CC1101, specifying a custom preset. } ProtoViewModulation; extern ProtoViewModulation ProtoViewModulations[]; /* In app_subghz.c */ @@ -69,19 +66,19 @@ extern ProtoViewModulation ProtoViewModulations[]; /* In app_subghz.c */ * It receives data and we get our protocol "feed" callback called * with the level (1 or 0) and duration. */ struct ProtoViewTxRx { - bool freq_mod_changed; /* The user changed frequency and/or modulation + bool freq_mod_changed; /* The user changed frequency and/or modulation from the interface. There is to restart the radio with the right parameters. */ - SubGhzWorker* worker; /* Our background worker. */ + SubGhzWorker* worker; /* Our background worker. */ SubGhzEnvironment* environment; SubGhzReceiver* receiver; TxRxState txrx_state; /* Receiving, idle or sleeping? */ /* Timer sampling mode state. */ - bool debug_timer_sampling; /* Read data from GDO0 in a busy loop. Only + bool debug_timer_sampling; /* Read data from GDO0 in a busy loop. Only for testing. */ uint32_t last_g0_change_time; /* Last high->low (or reverse) switch. */ - bool last_g0_value; /* Current value (high or low): we are + bool last_g0_value; /* Current value (high or low): we are checking the duration in the timer handler. */ }; @@ -103,49 +100,49 @@ typedef struct ProtoViewMsgInfo { char info4[PROTOVIEW_MSG_STR_LEN]; /* Protocol specific info line 4. */ /* Low level information of the detected signal: the following are filled * by the protocol decoding function: */ - uint32_t start_off; /* Pulses start offset in the bitmap. */ - uint32_t pulses_count; /* Number of pulses of the full message. */ + uint32_t start_off; /* Pulses start offset in the bitmap. */ + uint32_t pulses_count; /* Number of pulses of the full message. */ /* The following are passed already filled to the decoder. */ - uint32_t short_pulse_dur; /* Microseconds duration of the short pulse. */ + uint32_t short_pulse_dur; /* Microseconds duration of the short pulse. */ /* The following are filled by ProtoView core after the decoder returned * success. */ - uint8_t *bits; /* Bitmap with the signal. */ - uint32_t bits_bytes; /* Number of full bytes in the bitmap, that + uint8_t* bits; /* Bitmap with the signal. */ + uint32_t bits_bytes; /* Number of full bytes in the bitmap, that is 'pulses_count/8' rounded to the next integer. */ } ProtoViewMsgInfo; struct ProtoViewApp { /* GUI */ - Gui *gui; - ViewPort *view_port; /* We just use a raw viewport and we render + Gui* gui; + ViewPort* view_port; /* We just use a raw viewport and we render everything into the low level canvas. */ - ProtoViewCurrentView current_view; /* Active left-right view ID. */ - int current_subview[ViewLast]; /* Active up-down subview ID. */ - FuriMessageQueue *event_queue; /* Keypress events go here. */ - ViewDispatcher *view_dispatcher; /* Used only when we want to show + ProtoViewCurrentView current_view; /* Active left-right view ID. */ + int current_subview[ViewLast]; /* Active up-down subview ID. */ + FuriMessageQueue* event_queue; /* Keypress events go here. */ + ViewDispatcher* view_dispatcher; /* Used only when we want to show the text_input view for a moment. Otherwise it is set to null. */ - TextInput *text_input; + TextInput* text_input; bool show_text_input; - char *text_input_buffer; + char* text_input_buffer; uint32_t text_input_buffer_len; void (*text_input_done_callback)(void*); /* Radio related. */ - ProtoViewTxRx *txrx; /* Radio state. */ - SubGhzSetting *setting; /* A list of valid frequencies. */ + ProtoViewTxRx* txrx; /* Radio state. */ + SubGhzSetting* setting; /* A list of valid frequencies. */ /* Generic app state. */ - int running; /* Once false exists the app. */ + int running; /* Once false exists the app. */ uint32_t signal_bestlen; /* Longest coherent signal observed so far. */ uint32_t signal_last_scan_idx; /* Index of the buffer last time we performed the scan. */ - bool signal_decoded; /* Was the current signal decoded? */ - ProtoViewMsgInfo *msg_info; /* Decoded message info if not NULL. */ + bool signal_decoded; /* Was the current signal decoded? */ + ProtoViewMsgInfo* msg_info; /* Decoded message info if not NULL. */ bool direct_sampling_enabled; /* This special view needs an explicit acknowledge to work. */ - void *view_privdata; /* This is a piece of memory of total size + void* view_privdata; /* This is a piece of memory of total size PROTOVIEW_VIEW_PRIVDATA_LEN that it is initialized to zero when we switch to a a new view. While the view we are using @@ -154,17 +151,17 @@ struct ProtoViewApp { the pointer to a few specific-data structure. */ /* Raw view apps state. */ - uint32_t us_scale; /* microseconds per pixel. */ - uint32_t signal_offset; /* Long press left/right panning in raw view. */ + uint32_t us_scale; /* microseconds per pixel. */ + uint32_t signal_offset; /* Long press left/right panning in raw view. */ /* Configuration view app state. */ - uint32_t frequency; /* Current frequency. */ - uint8_t modulation; /* Current modulation ID, array index in the + uint32_t frequency; /* Current frequency. */ + uint8_t modulation; /* Current modulation ID, array index in the ProtoViewModulations table. */ }; typedef struct ProtoViewDecoder { - const char *name; /* Protocol name. */ + const char* name; /* Protocol name. */ /* The decode function takes a buffer that is actually a bitmap, with * high and low levels represented as 0 and 1. The number of high/low * pulses represented by the bitmap is passed as the 'numbits' argument, @@ -172,7 +169,7 @@ typedef struct ProtoViewDecoder { * 'bits'. So 'numbytes' is mainly useful to pass as argument to other * functions that perform bit extraction with bound checking, such as * bitmap_get() and so forth. */ - bool (*decode)(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoViewMsgInfo *info); + bool (*decode)(uint8_t* bits, uint32_t numbytes, uint32_t numbits, ProtoViewMsgInfo* info); } ProtoViewDecoder; extern RawSamplesBuffer *RawSamples, *DetectedSamples; @@ -183,49 +180,79 @@ uint32_t radio_rx(ProtoViewApp* app); void radio_idle(ProtoViewApp* app); void radio_rx_end(ProtoViewApp* app); void radio_sleep(ProtoViewApp* app); -void raw_sampling_worker_start(ProtoViewApp *app); -void raw_sampling_worker_stop(ProtoViewApp *app); +void raw_sampling_worker_start(ProtoViewApp* app); +void raw_sampling_worker_stop(ProtoViewApp* app); /* signal.c */ uint32_t duration_delta(uint32_t a, uint32_t b); -void reset_current_signal(ProtoViewApp *app); -void scan_for_signal(ProtoViewApp *app); -bool bitmap_get(uint8_t *b, uint32_t blen, uint32_t bitpos); -void bitmap_set(uint8_t *b, uint32_t blen, uint32_t bitpos, bool val); -void bitmap_copy(uint8_t *d, uint32_t dlen, uint32_t doff, uint8_t *s, uint32_t slen, uint32_t soff, uint32_t count); -void bitmap_set_pattern(uint8_t *b, uint32_t blen, uint32_t off, const char *pat); -void bitmap_reverse_bytes(uint8_t *p, uint32_t len); -bool bitmap_match_bits(uint8_t *b, uint32_t blen, uint32_t bitpos, const char *bits); -uint32_t bitmap_seek_bits(uint8_t *b, uint32_t blen, uint32_t startpos, uint32_t maxbits, const char *bits); -uint32_t convert_from_line_code(uint8_t *buf, uint64_t buflen, uint8_t *bits, uint32_t len, uint32_t offset, const char *zero_pattern, const char *one_pattern); -uint32_t convert_from_diff_manchester(uint8_t *buf, uint64_t buflen, uint8_t *bits, uint32_t len, uint32_t off, bool previous); -void init_msg_info(ProtoViewMsgInfo *i, ProtoViewApp *app); -void free_msg_info(ProtoViewMsgInfo *i); +void reset_current_signal(ProtoViewApp* app); +void scan_for_signal(ProtoViewApp* app); +bool bitmap_get(uint8_t* b, uint32_t blen, uint32_t bitpos); +void bitmap_set(uint8_t* b, uint32_t blen, uint32_t bitpos, bool val); +void bitmap_copy( + uint8_t* d, + uint32_t dlen, + uint32_t doff, + uint8_t* s, + uint32_t slen, + uint32_t soff, + uint32_t count); +void bitmap_set_pattern(uint8_t* b, uint32_t blen, uint32_t off, const char* pat); +void bitmap_reverse_bytes(uint8_t* p, uint32_t len); +bool bitmap_match_bits(uint8_t* b, uint32_t blen, uint32_t bitpos, const char* bits); +uint32_t bitmap_seek_bits( + uint8_t* b, + uint32_t blen, + uint32_t startpos, + uint32_t maxbits, + const char* bits); +uint32_t convert_from_line_code( + uint8_t* buf, + uint64_t buflen, + uint8_t* bits, + uint32_t len, + uint32_t offset, + const char* zero_pattern, + const char* one_pattern); +uint32_t convert_from_diff_manchester( + uint8_t* buf, + uint64_t buflen, + uint8_t* bits, + uint32_t len, + uint32_t off, + bool previous); +void init_msg_info(ProtoViewMsgInfo* i, ProtoViewApp* app); +void free_msg_info(ProtoViewMsgInfo* i); /* signal_file.c */ -bool save_signal(ProtoViewApp *app, const char *filename); +bool save_signal(ProtoViewApp* app, const char* filename); /* view_*.c */ -void render_view_raw_pulses(Canvas *const canvas, ProtoViewApp *app); -void process_input_raw_pulses(ProtoViewApp *app, InputEvent input); -void render_view_settings(Canvas *const canvas, ProtoViewApp *app); -void process_input_settings(ProtoViewApp *app, InputEvent input); -void render_view_info(Canvas *const canvas, ProtoViewApp *app); -void process_input_info(ProtoViewApp *app, InputEvent input); -void render_view_direct_sampling(Canvas *const canvas, ProtoViewApp *app); -void process_input_direct_sampling(ProtoViewApp *app, InputEvent input); -void view_enter_direct_sampling(ProtoViewApp *app); -void view_exit_direct_sampling(ProtoViewApp *app); -void view_exit_settings(ProtoViewApp *app); +void render_view_raw_pulses(Canvas* const canvas, ProtoViewApp* app); +void process_input_raw_pulses(ProtoViewApp* app, InputEvent input); +void render_view_settings(Canvas* const canvas, ProtoViewApp* app); +void process_input_settings(ProtoViewApp* app, InputEvent input); +void render_view_info(Canvas* const canvas, ProtoViewApp* app); +void process_input_info(ProtoViewApp* app, InputEvent input); +void render_view_direct_sampling(Canvas* const canvas, ProtoViewApp* app); +void process_input_direct_sampling(ProtoViewApp* app, InputEvent input); +void view_enter_direct_sampling(ProtoViewApp* app); +void view_exit_direct_sampling(ProtoViewApp* app); +void view_exit_settings(ProtoViewApp* app); /* ui.c */ -int get_current_subview(ProtoViewApp *app); -void show_available_subviews(Canvas *canvas, ProtoViewApp *app, int last_subview); -bool process_subview_updown(ProtoViewApp *app, InputEvent input, int last_subview); -void canvas_draw_str_with_border(Canvas* canvas, uint8_t x, uint8_t y, const char* str, Color text_color, Color border_color); -void show_keyboard(ProtoViewApp *app, char *buffer, uint32_t buflen, - void (*done_callback)(void*)); -void dismiss_keyboard(ProtoViewApp *app); +int get_current_subview(ProtoViewApp* app); +void show_available_subviews(Canvas* canvas, ProtoViewApp* app, int last_subview); +bool process_subview_updown(ProtoViewApp* app, InputEvent input, int last_subview); +void canvas_draw_str_with_border( + Canvas* canvas, + uint8_t x, + uint8_t y, + const char* str, + Color text_color, + Color border_color); +void show_keyboard(ProtoViewApp* app, char* buffer, uint32_t buflen, void (*done_callback)(void*)); +void dismiss_keyboard(ProtoViewApp* app); /* crc.c */ -uint8_t crc8(const uint8_t *data, size_t len, uint8_t init, uint8_t poly); +uint8_t crc8(const uint8_t* data, size_t len, uint8_t init, uint8_t poly); diff --git a/applications/plugins/protoview/app_buffer.c b/applications/plugins/protoview/app_buffer.c index 7c069fd91..0184dc9f8 100644 --- a/applications/plugins/protoview/app_buffer.c +++ b/applications/plugins/protoview/app_buffer.c @@ -8,15 +8,15 @@ #include "app_buffer.h" /* Allocate and initialize a samples buffer. */ -RawSamplesBuffer *raw_samples_alloc(void) { - RawSamplesBuffer *buf = malloc(sizeof(*buf)); +RawSamplesBuffer* raw_samples_alloc(void) { + RawSamplesBuffer* buf = malloc(sizeof(*buf)); buf->mutex = furi_mutex_alloc(FuriMutexTypeNormal); raw_samples_reset(buf); return buf; } /* Free a sample buffer. Should be called when the mutex is released. */ -void raw_samples_free(RawSamplesBuffer *s) { +void raw_samples_free(RawSamplesBuffer* s) { furi_mutex_free(s->mutex); free(s); } @@ -24,35 +24,34 @@ void raw_samples_free(RawSamplesBuffer *s) { /* This just set all the samples to zero and also resets the internal * index. There is no need to call it after raw_samples_alloc(), but only * when one wants to reset the whole buffer of samples. */ -void raw_samples_reset(RawSamplesBuffer *s) { - furi_mutex_acquire(s->mutex,FuriWaitForever); +void raw_samples_reset(RawSamplesBuffer* s) { + furi_mutex_acquire(s->mutex, FuriWaitForever); s->total = RAW_SAMPLES_NUM; s->idx = 0; s->short_pulse_dur = 0; - memset(s->samples,0,sizeof(s->samples)); + memset(s->samples, 0, sizeof(s->samples)); furi_mutex_release(s->mutex); } /* Set the raw sample internal index so that what is currently at * offset 'offset', will appear to be at 0 index. */ -void raw_samples_center(RawSamplesBuffer *s, uint32_t offset) { - s->idx = (s->idx+offset) % RAW_SAMPLES_NUM; +void raw_samples_center(RawSamplesBuffer* s, uint32_t offset) { + s->idx = (s->idx + offset) % RAW_SAMPLES_NUM; } /* Add the specified sample in the circular buffer. */ -void raw_samples_add(RawSamplesBuffer *s, bool level, uint32_t dur) { - furi_mutex_acquire(s->mutex,FuriWaitForever); +void raw_samples_add(RawSamplesBuffer* s, bool level, uint32_t dur) { + furi_mutex_acquire(s->mutex, FuriWaitForever); s->samples[s->idx].level = level; s->samples[s->idx].dur = dur; - s->idx = (s->idx+1) % RAW_SAMPLES_NUM; + s->idx = (s->idx + 1) % RAW_SAMPLES_NUM; furi_mutex_release(s->mutex); } /* Get the sample from the buffer. It is possible to use out of range indexes * as 'idx' because the modulo operation will rewind back from the start. */ -void raw_samples_get(RawSamplesBuffer *s, uint32_t idx, bool *level, uint32_t *dur) -{ - furi_mutex_acquire(s->mutex,FuriWaitForever); +void raw_samples_get(RawSamplesBuffer* s, uint32_t idx, bool* level, uint32_t* dur) { + furi_mutex_acquire(s->mutex, FuriWaitForever); idx = (s->idx + idx) % RAW_SAMPLES_NUM; *level = s->samples[idx].level; *dur = s->samples[idx].dur; @@ -60,12 +59,12 @@ void raw_samples_get(RawSamplesBuffer *s, uint32_t idx, bool *level, uint32_t *d } /* Copy one buffer to the other, including current index. */ -void raw_samples_copy(RawSamplesBuffer *dst, RawSamplesBuffer *src) { - furi_mutex_acquire(src->mutex,FuriWaitForever); - furi_mutex_acquire(dst->mutex,FuriWaitForever); +void raw_samples_copy(RawSamplesBuffer* dst, RawSamplesBuffer* src) { + furi_mutex_acquire(src->mutex, FuriWaitForever); + furi_mutex_acquire(dst->mutex, FuriWaitForever); dst->idx = src->idx; dst->short_pulse_dur = src->short_pulse_dur; - memcpy(dst->samples,src->samples,sizeof(dst->samples)); + memcpy(dst->samples, src->samples, sizeof(dst->samples)); furi_mutex_release(src->mutex); furi_mutex_release(dst->mutex); } diff --git a/applications/plugins/protoview/app_buffer.h b/applications/plugins/protoview/app_buffer.h index 3a34d50f8..34b005fc9 100644 --- a/applications/plugins/protoview/app_buffer.h +++ b/applications/plugins/protoview/app_buffer.h @@ -4,16 +4,17 @@ /* Our circular buffer of raw samples, used in order to display * the signal. */ -#define RAW_SAMPLES_NUM 2048 /* Use a power of two: we take the modulo +#define RAW_SAMPLES_NUM \ + 2048 /* Use a power of two: we take the modulo of the index quite often to normalize inside the range, and division is slow. */ typedef struct RawSamplesBuffer { - FuriMutex *mutex; + FuriMutex* mutex; struct { - uint16_t level:1; - uint16_t dur:15; + uint16_t level : 1; + uint16_t dur : 15; } samples[RAW_SAMPLES_NUM]; - uint32_t idx; /* Current idx (next to write). */ + uint32_t idx; /* Current idx (next to write). */ uint32_t total; /* Total samples: same as RAW_SAMPLES_NUM, we provide this field for a cleaner interface with the user, but we always use RAW_SAMPLES_NUM when taking the modulo so @@ -22,10 +23,10 @@ typedef struct RawSamplesBuffer { uint32_t short_pulse_dur; /* Duration of the shortest pulse. */ } RawSamplesBuffer; -RawSamplesBuffer *raw_samples_alloc(void); -void raw_samples_reset(RawSamplesBuffer *s); -void raw_samples_center(RawSamplesBuffer *s, uint32_t offset); -void raw_samples_add(RawSamplesBuffer *s, bool level, uint32_t dur); -void raw_samples_get(RawSamplesBuffer *s, uint32_t idx, bool *level, uint32_t *dur); -void raw_samples_copy(RawSamplesBuffer *dst, RawSamplesBuffer *src); -void raw_samples_free(RawSamplesBuffer *s); +RawSamplesBuffer* raw_samples_alloc(void); +void raw_samples_reset(RawSamplesBuffer* s); +void raw_samples_center(RawSamplesBuffer* s, uint32_t offset); +void raw_samples_add(RawSamplesBuffer* s, bool level, uint32_t dur); +void raw_samples_get(RawSamplesBuffer* s, uint32_t idx, bool* level, uint32_t* dur); +void raw_samples_copy(RawSamplesBuffer* dst, RawSamplesBuffer* src); +void raw_samples_free(RawSamplesBuffer* s); diff --git a/applications/plugins/protoview/app_subghz.c b/applications/plugins/protoview/app_subghz.c index 840b683dc..5bc6864fc 100644 --- a/applications/plugins/protoview/app_subghz.c +++ b/applications/plugins/protoview/app_subghz.c @@ -9,18 +9,20 @@ #include #include -void raw_sampling_worker_start(ProtoViewApp *app); -void raw_sampling_worker_stop(ProtoViewApp *app); +void raw_sampling_worker_start(ProtoViewApp* app); +void raw_sampling_worker_stop(ProtoViewApp* app); ProtoViewModulation ProtoViewModulations[] = { - {"OOK 650Khz", "FuriHalSubGhzPresetOok650Async", - FuriHalSubGhzPresetOok650Async, NULL}, - {"OOK 270Khz", "FuriHalSubGhzPresetOok270Async", - FuriHalSubGhzPresetOok270Async, NULL}, - {"2FSK 2.38Khz", "FuriHalSubGhzPreset2FSKDev238Async", - FuriHalSubGhzPreset2FSKDev238Async, NULL}, - {"2FSK 47.6Khz", "FuriHalSubGhzPreset2FSKDev476Async", - FuriHalSubGhzPreset2FSKDev476Async, NULL}, + {"OOK 650Khz", "FuriHalSubGhzPresetOok650Async", FuriHalSubGhzPresetOok650Async, NULL}, + {"OOK 270Khz", "FuriHalSubGhzPresetOok270Async", FuriHalSubGhzPresetOok270Async, NULL}, + {"2FSK 2.38Khz", + "FuriHalSubGhzPreset2FSKDev238Async", + FuriHalSubGhzPreset2FSKDev238Async, + NULL}, + {"2FSK 47.6Khz", + "FuriHalSubGhzPreset2FSKDev476Async", + FuriHalSubGhzPreset2FSKDev476Async, + NULL}, {"TPMS 1 (FSK)", NULL, 0, (uint8_t*)protoview_subghz_tpms1_fsk_async_regs}, {"TPMS 2 (OOK)", NULL, 0, (uint8_t*)protoview_subghz_tpms2_ook_async_regs}, {"TPMS 3 (FSK)", NULL, 0, (uint8_t*)protoview_subghz_tpms3_fsk_async_regs}, @@ -40,7 +42,7 @@ void radio_begin(ProtoViewApp* app) { /* The CC1101 preset can be either one of the standard presets, if * the modulation "custom" field is NULL, or a custom preset we * defined in custom_presets.h. */ - if (ProtoViewModulations[app->modulation].custom == NULL) + if(ProtoViewModulations[app->modulation].custom == NULL) furi_hal_subghz_load_preset(ProtoViewModulations[app->modulation].preset); else furi_hal_subghz_load_custom_preset(ProtoViewModulations[app->modulation].custom); @@ -52,10 +54,10 @@ void radio_begin(ProtoViewApp* app) { uint32_t radio_rx(ProtoViewApp* app) { furi_assert(app); if(!furi_hal_subghz_is_frequency_valid(app->frequency)) { - furi_crash(TAG" Incorrect RX frequency."); + furi_crash(TAG " Incorrect RX frequency."); } - if (app->txrx->txrx_state == TxRxStateRx) return app->frequency; + if(app->txrx->txrx_state == TxRxStateRx) return app->frequency; furi_hal_subghz_idle(); /* Put it into idle state in case it is sleeping. */ uint32_t value = furi_hal_subghz_set_frequency_and_path(app->frequency); @@ -63,10 +65,8 @@ uint32_t radio_rx(ProtoViewApp* app) { furi_hal_gpio_init(&gpio_cc1101_g0, GpioModeInput, GpioPullNo, GpioSpeedLow); furi_hal_subghz_flush_rx(); furi_hal_subghz_rx(); - if (!app->txrx->debug_timer_sampling) { - - furi_hal_subghz_start_async_rx(subghz_worker_rx_callback, - app->txrx->worker); + if(!app->txrx->debug_timer_sampling) { + furi_hal_subghz_start_async_rx(subghz_worker_rx_callback, app->txrx->worker); subghz_worker_start(app->txrx->worker); } else { raw_sampling_worker_start(app); @@ -78,8 +78,8 @@ uint32_t radio_rx(ProtoViewApp* app) { /* Stop subghz worker (if active), put radio on idle state. */ void radio_rx_end(ProtoViewApp* app) { furi_assert(app); - if (app->txrx->txrx_state == TxRxStateRx) { - if (!app->txrx->debug_timer_sampling) { + if(app->txrx->txrx_state == TxRxStateRx) { + if(!app->txrx->debug_timer_sampling) { if(subghz_worker_is_running(app->txrx->worker)) { subghz_worker_stop(app->txrx->worker); furi_hal_subghz_stop_async_rx(); @@ -95,7 +95,7 @@ void radio_rx_end(ProtoViewApp* app) { /* Put radio on sleep. */ void radio_sleep(ProtoViewApp* app) { furi_assert(app); - if (app->txrx->txrx_state == TxRxStateRx) { + if(app->txrx->txrx_state == TxRxStateRx) { /* We can't go from having an active RX worker to sleeping. * Stop the RX subsystems first. */ radio_rx_end(app); @@ -111,15 +111,15 @@ void radio_sleep(ProtoViewApp* app) { * Flipper system. * ===========================================================================*/ -void protoview_timer_isr(void *ctx) { - ProtoViewApp *app = ctx; +void protoview_timer_isr(void* ctx) { + ProtoViewApp* app = ctx; bool level = furi_hal_gpio_read(&gpio_cc1101_g0); - if (app->txrx->last_g0_value != level) { + if(app->txrx->last_g0_value != level) { uint32_t now = DWT->CYCCNT; uint32_t dur = now - app->txrx->last_g0_change_time; dur /= furi_hal_cortex_instructions_per_microsecond(); - if (dur > 15000) dur = 15000; + if(dur > 15000) dur = 15000; raw_samples_add(RawSamples, app->txrx->last_g0_value, dur); app->txrx->last_g0_value = level; app->txrx->last_g0_change_time = now; @@ -127,13 +127,13 @@ void protoview_timer_isr(void *ctx) { LL_TIM_ClearFlag_UPDATE(TIM2); } -void raw_sampling_worker_start(ProtoViewApp *app) { +void raw_sampling_worker_start(ProtoViewApp* app) { UNUSED(app); LL_TIM_InitTypeDef tim_init = { - .Prescaler = 63, /* CPU frequency is ~64Mhz. */ + .Prescaler = 63, /* CPU frequency is ~64Mhz. */ .CounterMode = LL_TIM_COUNTERMODE_UP, - .Autoreload = 5, /* Sample every 5 us */ + .Autoreload = 5, /* Sample every 5 us */ }; LL_TIM_Init(TIM2, &tim_init); @@ -146,7 +146,7 @@ void raw_sampling_worker_start(ProtoViewApp *app) { FURI_LOG_E(TAG, "Timer enabled"); } -void raw_sampling_worker_stop(ProtoViewApp *app) { +void raw_sampling_worker_stop(ProtoViewApp* app) { UNUSED(app); FURI_CRITICAL_ENTER(); LL_TIM_DisableCounter(TIM2); diff --git a/applications/plugins/protoview/crc.c b/applications/plugins/protoview/crc.c index 38a809e10..94d482972 100644 --- a/applications/plugins/protoview/crc.c +++ b/applications/plugins/protoview/crc.c @@ -3,14 +3,13 @@ /* CRC8 with the specified initialization value 'init' and * polynomial 'poly'. */ -uint8_t crc8(const uint8_t *data, size_t len, uint8_t init, uint8_t poly) -{ +uint8_t crc8(const uint8_t* data, size_t len, uint8_t init, uint8_t poly) { uint8_t crc = init; size_t i, j; - for (i = 0; i < len; i++) { + for(i = 0; i < len; i++) { crc ^= data[i]; - for (j = 0; j < 8; j++) { - if ((crc & 0x80) != 0) + for(j = 0; j < 8; j++) { + if((crc & 0x80) != 0) crc = (uint8_t)((crc << 1) ^ poly); else crc <<= 1; diff --git a/applications/plugins/protoview/custom_presets.h b/applications/plugins/protoview/custom_presets.h index 713827d22..fa87238e7 100644 --- a/applications/plugins/protoview/custom_presets.h +++ b/applications/plugins/protoview/custom_presets.h @@ -76,7 +76,8 @@ static uint8_t protoview_subghz_tpms1_fsk_async_regs[][2] = { // // Modem Configuration {CC1101_MDMCFG0, 0x00}, {CC1101_MDMCFG1, 0x02}, - {CC1101_MDMCFG2, 0x04}, // Format 2-FSK/FM, No preamble/sync, Disable (current optimized). Other code reading TPMS uses GFSK, but should be the same when in RX mode. + {CC1101_MDMCFG2, + 0x04}, // Format 2-FSK/FM, No preamble/sync, Disable (current optimized). Other code reading TPMS uses GFSK, but should be the same when in RX mode. {CC1101_MDMCFG3, 0x93}, // Data rate is 20kBaud {CC1101_MDMCFG4, 0x59}, // Rx bandwidth filter is 325 kHz {CC1101_DEVIATN, 0x41}, // Deviation 28.56 kHz @@ -168,7 +169,8 @@ static uint8_t protoview_subghz_tpms3_fsk_async_regs[][2] = { // // Modem Configuration {CC1101_MDMCFG0, 0x00}, {CC1101_MDMCFG1, 0x02}, - {CC1101_MDMCFG2, 0x04}, // Format 2-FSK/FM, No preamble/sync, Disable (current optimized). Other code reading TPMS uses GFSK, but should be the same when in RX mode. + {CC1101_MDMCFG2, + 0x04}, // Format 2-FSK/FM, No preamble/sync, Disable (current optimized). Other code reading TPMS uses GFSK, but should be the same when in RX mode. {CC1101_MDMCFG3, 0x93}, // Data rate is 40kBaud {CC1101_MDMCFG4, 0x6A}, // 6 = BW filter 270kHz, A = Data rate exp {CC1101_DEVIATN, 0x41}, // Deviation 28kHz @@ -240,5 +242,3 @@ static uint8_t protoview_subghz_tpms4_fsk_async_regs[][2] = { /* End */ {0, 0}, }; - - diff --git a/applications/plugins/protoview/data_feed.c b/applications/plugins/protoview/data_feed.c index c3387fc4c..686bd356e 100644 --- a/applications/plugins/protoview/data_feed.c +++ b/applications/plugins/protoview/data_feed.c @@ -14,7 +14,7 @@ const SubGhzProtocol subghz_protocol_protoview; /* The feed() method puts data in the RawSamples global (protected by * a mutex). */ -extern RawSamplesBuffer *RawSamples; +extern RawSamplesBuffer* RawSamples; /* This is totally dummy: we just define the decoder base for the async * system to work but we don't really use it if not to collect raw @@ -26,8 +26,7 @@ typedef struct SubGhzProtocolDecoderprotoview { void* subghz_protocol_decoder_protoview_alloc(SubGhzEnvironment* environment) { UNUSED(environment); - SubGhzProtocolDecoderprotoview* instance = - malloc(sizeof(SubGhzProtocolDecoderprotoview)); + SubGhzProtocolDecoderprotoview* instance = malloc(sizeof(SubGhzProtocolDecoderprotoview)); instance->base.protocol = &subghz_protocol_protoview; return instance; } @@ -66,8 +65,7 @@ uint8_t subghz_protocol_decoder_protoview_get_hash_data(void* context) { bool subghz_protocol_decoder_protoview_serialize( void* context, FlipperFormat* flipper_format, - SubGhzRadioPreset* preset) -{ + SubGhzRadioPreset* preset) { UNUSED(context); UNUSED(flipper_format); UNUSED(preset); @@ -75,15 +73,13 @@ bool subghz_protocol_decoder_protoview_serialize( } /* Not used. */ -bool subghz_protocol_decoder_protoview_deserialize(void* context, FlipperFormat* flipper_format) -{ +bool subghz_protocol_decoder_protoview_deserialize(void* context, FlipperFormat* flipper_format) { UNUSED(context); UNUSED(flipper_format); return false; } -void subhz_protocol_decoder_protoview_get_string(void* context, FuriString* output) -{ +void subhz_protocol_decoder_protoview_get_string(void* context, FuriString* output) { furi_assert(context); furi_string_cat_printf(output, "Protoview"); } @@ -116,5 +112,4 @@ const SubGhzProtocol* protoview_protocol_registry_items[] = { const SubGhzProtocolRegistry protoview_protocol_registry = { .items = protoview_protocol_registry_items, - .size = COUNT_OF(protoview_protocol_registry_items) -}; + .size = COUNT_OF(protoview_protocol_registry_items)}; diff --git a/applications/plugins/protoview/protocols/b4b1.c b/applications/plugins/protoview/protocols/b4b1.c index d1835ec19..e947e1ead 100644 --- a/applications/plugins/protoview/protocols/b4b1.c +++ b/applications/plugins/protoview/protocols/b4b1.c @@ -9,9 +9,9 @@ #include "../app.h" -static bool decode(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoViewMsgInfo *info) { - if (numbits < 30) return false; - const char *sync_patterns[3] = { +static bool decode(uint8_t* bits, uint32_t numbytes, uint32_t numbits, ProtoViewMsgInfo* info) { + if(numbits < 30) return false; + const char* sync_patterns[3] = { "10000000000000000000000000000001", /* 30 zero bits. */ "100000000000000000000000000000001", /* 31 zero bits. */ "1000000000000000000000000000000001", /* 32 zero bits. */ @@ -19,32 +19,29 @@ static bool decode(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoView uint32_t off; int j; - for (j = 0; j < 3; j++) { - off = bitmap_seek_bits(bits,numbytes,0,numbits,sync_patterns[j]); - if (off != BITMAP_SEEK_NOT_FOUND) break; + for(j = 0; j < 3; j++) { + off = bitmap_seek_bits(bits, numbytes, 0, numbits, sync_patterns[j]); + if(off != BITMAP_SEEK_NOT_FOUND) break; } - if (off == BITMAP_SEEK_NOT_FOUND) return false; - if (DEBUG_MSG) FURI_LOG_E(TAG, "B4B1 preamble at: %lu",off); + if(off == BITMAP_SEEK_NOT_FOUND) return false; + if(DEBUG_MSG) FURI_LOG_E(TAG, "B4B1 preamble at: %lu", off); info->start_off = off; // Seek data setction. Why -1? Last bit is data. - off += strlen(sync_patterns[j])-1; + off += strlen(sync_patterns[j]) - 1; uint8_t d[3]; /* 24 bits of data. */ - uint32_t decoded = - convert_from_line_code(d,sizeof(d),bits,numbytes,off,"1000","1110"); + uint32_t decoded = convert_from_line_code(d, sizeof(d), bits, numbytes, off, "1000", "1110"); - if (DEBUG_MSG) FURI_LOG_E(TAG, "B4B1 decoded: %lu",decoded); - if (decoded < 24) return false; + if(DEBUG_MSG) FURI_LOG_E(TAG, "B4B1 decoded: %lu", decoded); + if(decoded < 24) return false; - off += 24*4; // seek to end symbol offset to calculate the length. + off += 24 * 4; // seek to end symbol offset to calculate the length. off++; // In this protocol there is a final pulse as terminator. info->pulses_count = off - info->start_off; - snprintf(info->name,PROTOVIEW_MSG_STR_LEN,"PT/SC remote"); - snprintf(info->raw,PROTOVIEW_MSG_STR_LEN,"%02X%02X%02X",d[0],d[1],d[2]); + snprintf(info->name, PROTOVIEW_MSG_STR_LEN, "PT/SC remote"); + snprintf(info->raw, PROTOVIEW_MSG_STR_LEN, "%02X%02X%02X", d[0], d[1], d[2]); return true; } -ProtoViewDecoder B4B1Decoder = { - "B4B1", decode -}; +ProtoViewDecoder B4B1Decoder = {"B4B1", decode}; diff --git a/applications/plugins/protoview/protocols/keeloq.c b/applications/plugins/protoview/protocols/keeloq.c index db59be230..3fb578683 100644 --- a/applications/plugins/protoview/protocols/keeloq.c +++ b/applications/plugins/protoview/protocols/keeloq.c @@ -24,16 +24,16 @@ #include "../app.h" -static bool decode(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoViewMsgInfo *info) { - +static bool decode(uint8_t* bits, uint32_t numbytes, uint32_t numbits, ProtoViewMsgInfo* info) { /* In the sync pattern, we require the 12 high/low pulses and at least * half the gap we expect (5 pulses times, one is the final zero in the * 24 symbols high/low sequence, then other 4). */ - const char *sync_pattern = "101010101010101010101010" "0000"; - uint8_t sync_len = 24+4; - if (numbits-sync_len+sync_len < 3*66) return false; - uint32_t off = bitmap_seek_bits(bits,numbytes,0,numbits,sync_pattern); - if (off == BITMAP_SEEK_NOT_FOUND) return false; + const char* sync_pattern = "101010101010101010101010" + "0000"; + uint8_t sync_len = 24 + 4; + if(numbits - sync_len + sync_len < 3 * 66) return false; + uint32_t off = bitmap_seek_bits(bits, numbytes, 0, numbits, sync_pattern); + if(off == BITMAP_SEEK_NOT_FOUND) return false; info->start_off = off; off += sync_len; // Seek start of message. @@ -42,50 +42,57 @@ static bool decode(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoView * symbols of gap, to avoid missing the signal for a matter of wrong * timing. */ uint8_t gap_len = 0; - while(gap_len <= 7 && bitmap_get(bits,numbytes,off+gap_len) == 0) - gap_len++; - if (gap_len < 3 || gap_len > 7) return false; + while(gap_len <= 7 && bitmap_get(bits, numbytes, off + gap_len) == 0) gap_len++; + if(gap_len < 3 || gap_len > 7) return false; off += gap_len; FURI_LOG_E(TAG, "Keeloq preamble+sync found"); uint8_t raw[9] = {0}; - uint32_t decoded = - convert_from_line_code(raw,sizeof(raw),bits,numbytes,off, - "110","100"); /* Pulse width modulation. */ + uint32_t decoded = convert_from_line_code( + raw, sizeof(raw), bits, numbytes, off, "110", "100"); /* Pulse width modulation. */ FURI_LOG_E(TAG, "Keeloq decoded bits: %lu", decoded); - if (decoded < 66) return false; /* Require the full 66 bits. */ + if(decoded < 66) return false; /* Require the full 66 bits. */ - info->pulses_count = (off+66*3) - info->start_off; + info->pulses_count = (off + 66 * 3) - info->start_off; - bitmap_reverse_bytes(raw,sizeof(raw)); /* Keeloq is LSB first. */ + bitmap_reverse_bytes(raw, sizeof(raw)); /* Keeloq is LSB first. */ - int buttons = raw[7]>>4; - int s3 = (buttons&1) != 0; - int s0 = (buttons&2) != 0; - int s1 = (buttons&4) != 0; - int s2 = (buttons&8) != 0; + int buttons = raw[7] >> 4; + int s3 = (buttons & 1) != 0; + int s0 = (buttons & 2) != 0; + int s1 = (buttons & 4) != 0; + int s2 = (buttons & 8) != 0; - int remote_id = ((raw[7]&0x0f) << 24) | - (raw[6] << 16) | - (raw[5] << 8) | - (raw[4] << 0); - int lowbat = raw[8]&0x80; + int remote_id = ((raw[7] & 0x0f) << 24) | (raw[6] << 16) | (raw[5] << 8) | (raw[4] << 0); + int lowbat = raw[8] & 0x80; - snprintf(info->name,sizeof(info->name),"%s","Keeloq remote"); - snprintf(info->raw,sizeof(info->raw),"%02X%02X%02X%02X%02X%02X%02X%02X%02X", - raw[0],raw[1],raw[2],raw[3],raw[4],raw[5], - raw[6],raw[7],raw[8]); - snprintf(info->info1,sizeof(info->info1),"Encrpyted %02X%02X%02X%02X", - raw[3],raw[2],raw[1],raw[0]); - snprintf(info->info2,sizeof(info->info2),"ID %08X", remote_id); - snprintf(info->info3,sizeof(info->info3),"s0-s3: %d%d%d%d", - s0,s1,s2,s3); - snprintf(info->info4,sizeof(info->info4),"Low battery? %s", - lowbat ? "yes" : "no"); + snprintf(info->name, sizeof(info->name), "%s", "Keeloq remote"); + snprintf( + info->raw, + sizeof(info->raw), + "%02X%02X%02X%02X%02X%02X%02X%02X%02X", + raw[0], + raw[1], + raw[2], + raw[3], + raw[4], + raw[5], + raw[6], + raw[7], + raw[8]); + snprintf( + info->info1, + sizeof(info->info1), + "Encrpyted %02X%02X%02X%02X", + raw[3], + raw[2], + raw[1], + raw[0]); + snprintf(info->info2, sizeof(info->info2), "ID %08X", remote_id); + snprintf(info->info3, sizeof(info->info3), "s0-s3: %d%d%d%d", s0, s1, s2, s3); + snprintf(info->info4, sizeof(info->info4), "Low battery? %s", lowbat ? "yes" : "no"); return true; } -ProtoViewDecoder KeeloqDecoder = { - "Keeloq", decode -}; +ProtoViewDecoder KeeloqDecoder = {"Keeloq", decode}; diff --git a/applications/plugins/protoview/protocols/oregon2.c b/applications/plugins/protoview/protocols/oregon2.c index aa7346619..612896370 100644 --- a/applications/plugins/protoview/protocols/oregon2.c +++ b/applications/plugins/protoview/protocols/oregon2.c @@ -6,11 +6,14 @@ #include "../app.h" -static bool decode(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoViewMsgInfo *info) { - if (numbits < 32) return false; - const char *sync_pattern = "01100110" "01100110" "10010110" "10010110"; - uint64_t off = bitmap_seek_bits(bits,numbytes,0,numbits,sync_pattern); - if (off == BITMAP_SEEK_NOT_FOUND) return false; +static bool decode(uint8_t* bits, uint32_t numbytes, uint32_t numbits, ProtoViewMsgInfo* info) { + if(numbits < 32) return false; + const char* sync_pattern = "01100110" + "01100110" + "10010110" + "10010110"; + uint64_t off = bitmap_seek_bits(bits, numbytes, 0, numbits, sync_pattern); + if(off == BITMAP_SEEK_NOT_FOUND) return false; FURI_LOG_E(TAG, "Oregon2 preamble+sync found"); info->start_off = off; @@ -18,50 +21,71 @@ static bool decode(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoView uint8_t buffer[8], raw[8] = {0}; uint32_t decoded = - convert_from_line_code(buffer,sizeof(buffer),bits,numbytes,off,"1001","0110"); + convert_from_line_code(buffer, sizeof(buffer), bits, numbytes, off, "1001", "0110"); FURI_LOG_E(TAG, "Oregon2 decoded bits: %lu", decoded); - if (decoded < 11*4) return false; /* Minimum len to extract some data. */ - info->pulses_count = (off+11*4*4) - info->start_off; + if(decoded < 11 * 4) return false; /* Minimum len to extract some data. */ + info->pulses_count = (off + 11 * 4 * 4) - info->start_off; char temp[3] = {0}, deviceid[2] = {0}, hum[2] = {0}; - for (int j = 0; j < 64; j += 4) { + for(int j = 0; j < 64; j += 4) { uint8_t nib[1]; - nib[0] = (bitmap_get(buffer,8,j+0) | - bitmap_get(buffer,8,j+1) << 1 | - bitmap_get(buffer,8,j+2) << 2 | - bitmap_get(buffer,8,j+3) << 3); - if (DEBUG_MSG) FURI_LOG_E(TAG, "Not inverted nibble[%d]: %x", j/4, (unsigned int)nib[0]); - raw[j/8] |= nib[0] << (4-(j%4)); - switch(j/4) { - case 1: deviceid[0] |= nib[0]; break; - case 0: deviceid[0] |= nib[0] << 4; break; - case 3: deviceid[1] |= nib[0]; break; - case 2: deviceid[1] |= nib[0] << 4; break; - case 10: temp[0] = nib[0]; break; + nib[0] = + (bitmap_get(buffer, 8, j + 0) | bitmap_get(buffer, 8, j + 1) << 1 | + bitmap_get(buffer, 8, j + 2) << 2 | bitmap_get(buffer, 8, j + 3) << 3); + if(DEBUG_MSG) FURI_LOG_E(TAG, "Not inverted nibble[%d]: %x", j / 4, (unsigned int)nib[0]); + raw[j / 8] |= nib[0] << (4 - (j % 4)); + switch(j / 4) { + case 1: + deviceid[0] |= nib[0]; + break; + case 0: + deviceid[0] |= nib[0] << 4; + break; + case 3: + deviceid[1] |= nib[0]; + break; + case 2: + deviceid[1] |= nib[0] << 4; + break; + case 10: + temp[0] = nib[0]; + break; /* Fixme: take the temperature sign from nibble 11. */ - case 9: temp[1] = nib[0]; break; - case 8: temp[2] = nib[0]; break; - case 13: hum[0] = nib[0]; break; - case 12: hum[1] = nib[0]; break; + case 9: + temp[1] = nib[0]; + break; + case 8: + temp[2] = nib[0]; + break; + case 13: + hum[0] = nib[0]; + break; + case 12: + hum[1] = nib[0]; + break; } } - snprintf(info->name,sizeof(info->name),"%s","Oregon v2.1"); + snprintf(info->name, sizeof(info->name), "%s", "Oregon v2.1"); /* The following line crashes the Flipper because of broken * snprintf() implementation. */ - snprintf(info->raw,sizeof(info->raw),"%02X%02X%02X%02X%02X%02X%02X%02X", - raw[0],raw[1],raw[2],raw[3],raw[4],raw[5], - raw[6],raw[7]); - snprintf(info->info1,sizeof(info->info1),"Sensor ID %02X%02X", - deviceid[0], deviceid[1]); - snprintf(info->info2,sizeof(info->info2),"Temperature %d%d.%d", - temp[0],temp[1],temp[2]); - snprintf(info->info3,sizeof(info->info3),"Humidity %d%d", - hum[0],hum[1]); + snprintf( + info->raw, + sizeof(info->raw), + "%02X%02X%02X%02X%02X%02X%02X%02X", + raw[0], + raw[1], + raw[2], + raw[3], + raw[4], + raw[5], + raw[6], + raw[7]); + snprintf(info->info1, sizeof(info->info1), "Sensor ID %02X%02X", deviceid[0], deviceid[1]); + snprintf(info->info2, sizeof(info->info2), "Temperature %d%d.%d", temp[0], temp[1], temp[2]); + snprintf(info->info3, sizeof(info->info3), "Humidity %d%d", hum[0], hum[1]); return true; } -ProtoViewDecoder Oregon2Decoder = { - "Oregon2", decode -}; +ProtoViewDecoder Oregon2Decoder = {"Oregon2", decode}; diff --git a/applications/plugins/protoview/protocols/tpms/citroen.c b/applications/plugins/protoview/protocols/tpms/citroen.c index 0a34d4549..01c46ffc1 100644 --- a/applications/plugins/protoview/protocols/tpms/citroen.c +++ b/applications/plugins/protoview/protocols/tpms/citroen.c @@ -7,57 +7,69 @@ #include "../../app.h" -static bool decode(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoViewMsgInfo *info) { - +static bool decode(uint8_t* bits, uint32_t numbytes, uint32_t numbits, ProtoViewMsgInfo* info) { /* We consider a preamble of 17 symbols. They are more, but the decoding * is more likely to happen if we don't pretend to receive from the * very start of the message. */ uint32_t sync_len = 17; - const char *sync_pattern = "10101010101010110"; - if (numbits-sync_len < 8*10) return false; /* Expect 10 bytes. */ + const char* sync_pattern = "10101010101010110"; + if(numbits - sync_len < 8 * 10) return false; /* Expect 10 bytes. */ - uint64_t off = bitmap_seek_bits(bits,numbytes,0,numbits,sync_pattern); - if (off == BITMAP_SEEK_NOT_FOUND) return false; + uint64_t off = bitmap_seek_bits(bits, numbytes, 0, numbits, sync_pattern); + if(off == BITMAP_SEEK_NOT_FOUND) return false; FURI_LOG_E(TAG, "Renault TPMS preamble+sync found"); info->start_off = off; off += sync_len; /* Skip preamble + sync. */ uint8_t raw[10]; - uint32_t decoded = - convert_from_line_code(raw,sizeof(raw),bits,numbytes,off, - "01","10"); /* Manchester. */ + uint32_t decoded = convert_from_line_code( + raw, sizeof(raw), bits, numbytes, off, "01", "10"); /* Manchester. */ FURI_LOG_E(TAG, "Citroen TPMS decoded bits: %lu", decoded); - if (decoded < 8*10) return false; /* Require the full 10 bytes. */ + if(decoded < 8 * 10) return false; /* Require the full 10 bytes. */ /* Check the CRC. It's a simple XOR of bytes 1-9, the first byte * is not included. The meaning of the first byte is unknown and * we don't display it. */ uint8_t crc = 0; - for (int j = 1; j < 10; j++) crc ^= raw[j]; - if (crc != 0) return false; /* Require sane checksum. */ + for(int j = 1; j < 10; j++) crc ^= raw[j]; + if(crc != 0) return false; /* Require sane checksum. */ - info->pulses_count = (off+8*10*2) - info->start_off; + info->pulses_count = (off + 8 * 10 * 2) - info->start_off; int repeat = raw[5] & 0xf; - float kpa = (float)raw[6]*1.364; - int temp = raw[7]-50; + float kpa = (float)raw[6] * 1.364; + int temp = raw[7] - 50; int battery = raw[8]; /* This may be the battery. It's not clear. */ - snprintf(info->name,sizeof(info->name),"%s","Citroen TPMS"); - snprintf(info->raw,sizeof(info->raw), + snprintf(info->name, sizeof(info->name), "%s", "Citroen TPMS"); + snprintf( + info->raw, + sizeof(info->raw), "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", - raw[0],raw[1],raw[2],raw[3],raw[4],raw[5], - raw[6],raw[7],raw[8],raw[9]); - snprintf(info->info1,sizeof(info->info1),"Tire ID %02X%02X%02X%02X", - raw[1],raw[2],raw[3],raw[4]); - snprintf(info->info2,sizeof(info->info2),"Pressure %.2f kpa", (double)kpa); - snprintf(info->info3,sizeof(info->info3),"Temperature %d C", temp); - snprintf(info->info4,sizeof(info->info4),"Repeat %d, Bat %d", repeat, battery); + raw[0], + raw[1], + raw[2], + raw[3], + raw[4], + raw[5], + raw[6], + raw[7], + raw[8], + raw[9]); + snprintf( + info->info1, + sizeof(info->info1), + "Tire ID %02X%02X%02X%02X", + raw[1], + raw[2], + raw[3], + raw[4]); + snprintf(info->info2, sizeof(info->info2), "Pressure %.2f kpa", (double)kpa); + snprintf(info->info3, sizeof(info->info3), "Temperature %d C", temp); + snprintf(info->info4, sizeof(info->info4), "Repeat %d, Bat %d", repeat, battery); return true; } -ProtoViewDecoder CitroenTPMSDecoder = { - "Citroen TPMS", decode -}; +ProtoViewDecoder CitroenTPMSDecoder = {"Citroen TPMS", decode}; diff --git a/applications/plugins/protoview/protocols/tpms/ford.c b/applications/plugins/protoview/protocols/tpms/ford.c index e897d9d1f..d469acb2a 100644 --- a/applications/plugins/protoview/protocols/tpms/ford.c +++ b/applications/plugins/protoview/protocols/tpms/ford.c @@ -10,58 +10,70 @@ #include "../../app.h" -static bool decode(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoViewMsgInfo *info) { +static bool decode(uint8_t* bits, uint32_t numbytes, uint32_t numbits, ProtoViewMsgInfo* info) { + const char* sync_pattern = "010101010101" + "0110"; + uint8_t sync_len = 12 + 4; /* We just use 12 preamble symbols + sync. */ + if(numbits - sync_len < 8 * 8) return false; - const char *sync_pattern = "010101010101" "0110"; - uint8_t sync_len = 12+4; /* We just use 12 preamble symbols + sync. */ - if (numbits-sync_len < 8*8) return false; - - uint64_t off = bitmap_seek_bits(bits,numbytes,0,numbits,sync_pattern); - if (off == BITMAP_SEEK_NOT_FOUND) return false; + uint64_t off = bitmap_seek_bits(bits, numbytes, 0, numbits, sync_pattern); + if(off == BITMAP_SEEK_NOT_FOUND) return false; FURI_LOG_E(TAG, "Fort TPMS preamble+sync found"); info->start_off = off; off += sync_len; /* Skip preamble and sync. */ uint8_t raw[8]; - uint32_t decoded = - convert_from_line_code(raw,sizeof(raw),bits,numbytes,off, - "01","10"); /* Manchester. */ + uint32_t decoded = convert_from_line_code( + raw, sizeof(raw), bits, numbytes, off, "01", "10"); /* Manchester. */ FURI_LOG_E(TAG, "Ford TPMS decoded bits: %lu", decoded); - if (decoded < 8*8) return false; /* Require the full 8 bytes. */ + if(decoded < 8 * 8) return false; /* Require the full 8 bytes. */ /* CRC is just the sum of the first 7 bytes MOD 256. */ uint8_t crc = 0; - for (int j = 0; j < 7; j++) crc += raw[j]; - if (crc != raw[7]) return false; /* Require sane CRC. */ + for(int j = 0; j < 7; j++) crc += raw[j]; + if(crc != raw[7]) return false; /* Require sane CRC. */ - info->pulses_count = (off+8*8*2) - info->start_off; + info->pulses_count = (off + 8 * 8 * 2) - info->start_off; - float psi = 0.25 * (((raw[6]&0x20)<<3)|raw[4]); + float psi = 0.25 * (((raw[6] & 0x20) << 3) | raw[4]); /* Temperature apperas to be valid only if the most significant * bit of the value is not set. Otherwise its meaning is unknown. * Likely useful to alternatively send temperature or other info. */ - int temp = raw[5] & 0x80 ? 0 : raw[5]-56; + int temp = raw[5] & 0x80 ? 0 : raw[5] - 56; int flags = raw[5] & 0x7f; int car_moving = (raw[6] & 0x44) == 0x44; - snprintf(info->name,sizeof(info->name),"%s","Ford TPMS"); - snprintf(info->raw,sizeof(info->raw),"%02X%02X%02X%02X%02X%02X%02X%02X", - raw[0],raw[1],raw[2],raw[3],raw[4],raw[5], - raw[6],raw[7]); - snprintf(info->info1,sizeof(info->info1),"Tire ID %02X%02X%02X%02X", - raw[0],raw[1],raw[2],raw[3]); - snprintf(info->info2,sizeof(info->info2),"Pressure %.2f psi", (double)psi); - if (temp) - snprintf(info->info3,sizeof(info->info3),"Temperature %d C", temp); + snprintf(info->name, sizeof(info->name), "%s", "Ford TPMS"); + snprintf( + info->raw, + sizeof(info->raw), + "%02X%02X%02X%02X%02X%02X%02X%02X", + raw[0], + raw[1], + raw[2], + raw[3], + raw[4], + raw[5], + raw[6], + raw[7]); + snprintf( + info->info1, + sizeof(info->info1), + "Tire ID %02X%02X%02X%02X", + raw[0], + raw[1], + raw[2], + raw[3]); + snprintf(info->info2, sizeof(info->info2), "Pressure %.2f psi", (double)psi); + if(temp) + snprintf(info->info3, sizeof(info->info3), "Temperature %d C", temp); else - snprintf(info->info3,sizeof(info->info3),"Flags %d", flags); - snprintf(info->info4,sizeof(info->info4),"Moving %s", car_moving ? "yes" : "no"); + snprintf(info->info3, sizeof(info->info3), "Flags %d", flags); + snprintf(info->info4, sizeof(info->info4), "Moving %s", car_moving ? "yes" : "no"); return true; } -ProtoViewDecoder FordTPMSDecoder = { - "Ford TPMS", decode -}; +ProtoViewDecoder FordTPMSDecoder = {"Ford TPMS", decode}; diff --git a/applications/plugins/protoview/protocols/tpms/renault.c b/applications/plugins/protoview/protocols/tpms/renault.c index b8dd46ce8..355637e9f 100644 --- a/applications/plugins/protoview/protocols/tpms/renault.c +++ b/applications/plugins/protoview/protocols/tpms/renault.c @@ -6,64 +6,69 @@ #include "../../app.h" #define USE_TEST_VECTOR 0 -static const char *test_vector = +static const char* test_vector = "...01010101010101010110" // Preamble + sync /* The following is Marshal encoded, so each two characters are * actaully one bit. 01 = 0, 10 = 1. */ "010110010110" // Flags. "10011001101010011001" // Pressure, multiply by 0.75 to obtain kpa. - // 244 kpa here. - "1010010110011010" // Temperature, subtract 30 to obtain celsius. 22C here. + // 244 kpa here. + "1010010110011010" // Temperature, subtract 30 to obtain celsius. 22C here. "1001010101101001" "0101100110010101" - "1001010101100110" // Tire ID. 0x7AD779 here. + "1001010101100110" // Tire ID. 0x7AD779 here. "0101010101010101" - "0101010101010101" // Two FF bytes (usually). Unknown. + "0101010101010101" // Two FF bytes (usually). Unknown. "0110010101010101"; // CRC8 with (poly 7, initialization 0). -static bool decode(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoViewMsgInfo *info) { - - if (USE_TEST_VECTOR) { /* Test vector to check that decoding works. */ - bitmap_set_pattern(bits,numbytes,0,test_vector); +static bool decode(uint8_t* bits, uint32_t numbytes, uint32_t numbits, ProtoViewMsgInfo* info) { + if(USE_TEST_VECTOR) { /* Test vector to check that decoding works. */ + bitmap_set_pattern(bits, numbytes, 0, test_vector); numbits = strlen(test_vector); } - if (numbits-12 < 9*8) return false; + if(numbits - 12 < 9 * 8) return false; - const char *sync_pattern = "01010101010101010110"; - uint64_t off = bitmap_seek_bits(bits,numbytes,0,numbits,sync_pattern); - if (off == BITMAP_SEEK_NOT_FOUND) return false; + const char* sync_pattern = "01010101010101010110"; + uint64_t off = bitmap_seek_bits(bits, numbytes, 0, numbits, sync_pattern); + if(off == BITMAP_SEEK_NOT_FOUND) return false; FURI_LOG_E(TAG, "Renault TPMS preamble+sync found"); info->start_off = off; off += 20; /* Skip preamble. */ uint8_t raw[9]; - uint32_t decoded = - convert_from_line_code(raw,sizeof(raw),bits,numbytes,off, - "01","10"); /* Manchester. */ + uint32_t decoded = convert_from_line_code( + raw, sizeof(raw), bits, numbytes, off, "01", "10"); /* Manchester. */ FURI_LOG_E(TAG, "Renault TPMS decoded bits: %lu", decoded); - if (decoded < 8*9) return false; /* Require the full 9 bytes. */ - if (crc8(raw,8,0,7) != raw[8]) return false; /* Require sane CRC. */ + if(decoded < 8 * 9) return false; /* Require the full 9 bytes. */ + if(crc8(raw, 8, 0, 7) != raw[8]) return false; /* Require sane CRC. */ - info->pulses_count = (off+8*9*2) - info->start_off; + info->pulses_count = (off + 8 * 9 * 2) - info->start_off; - float kpa = 0.75 *((uint32_t)((raw[0]&3)<<8) | raw[1]); - int temp = raw[2]-30; + float kpa = 0.75 * ((uint32_t)((raw[0] & 3) << 8) | raw[1]); + int temp = raw[2] - 30; - snprintf(info->name,sizeof(info->name),"%s","Renault TPMS"); - snprintf(info->raw,sizeof(info->raw),"%02X%02X%02X%02X%02X%02X%02X%02X%02X", - raw[0],raw[1],raw[2],raw[3],raw[4],raw[5], - raw[6],raw[7],raw[8]); - snprintf(info->info1,sizeof(info->info1),"Tire ID %02X%02X%02X", - raw[3],raw[4],raw[5]); - snprintf(info->info2,sizeof(info->info2),"Pressure %.2f kpa", (double)kpa); - snprintf(info->info3,sizeof(info->info3),"Temperature %d C", temp); + snprintf(info->name, sizeof(info->name), "%s", "Renault TPMS"); + snprintf( + info->raw, + sizeof(info->raw), + "%02X%02X%02X%02X%02X%02X%02X%02X%02X", + raw[0], + raw[1], + raw[2], + raw[3], + raw[4], + raw[5], + raw[6], + raw[7], + raw[8]); + snprintf(info->info1, sizeof(info->info1), "Tire ID %02X%02X%02X", raw[3], raw[4], raw[5]); + snprintf(info->info2, sizeof(info->info2), "Pressure %.2f kpa", (double)kpa); + snprintf(info->info3, sizeof(info->info3), "Temperature %d C", temp); return true; } -ProtoViewDecoder RenaultTPMSDecoder = { - "Renault TPMS", decode -}; +ProtoViewDecoder RenaultTPMSDecoder = {"Renault TPMS", decode}; diff --git a/applications/plugins/protoview/protocols/tpms/schrader.c b/applications/plugins/protoview/protocols/tpms/schrader.c index efcc21380..c1abf5c05 100644 --- a/applications/plugins/protoview/protocols/tpms/schrader.c +++ b/applications/plugins/protoview/protocols/tpms/schrader.c @@ -11,20 +11,21 @@ #include "../../app.h" #define USE_TEST_VECTOR 0 -static const char *test_vector = "000000111101010101011010010110010110101001010110100110011001100101010101011010100110100110011010101010101010101010101010101010101010101010101010"; +static const char* test_vector = + "000000111101010101011010010110010110101001010110100110011001100101010101011010100110100110011010101010101010101010101010101010101010101010101010"; -static bool decode(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoViewMsgInfo *info) { - - if (USE_TEST_VECTOR) { /* Test vector to check that decoding works. */ - bitmap_set_pattern(bits,numbytes,0,test_vector); +static bool decode(uint8_t* bits, uint32_t numbytes, uint32_t numbits, ProtoViewMsgInfo* info) { + if(USE_TEST_VECTOR) { /* Test vector to check that decoding works. */ + bitmap_set_pattern(bits, numbytes, 0, test_vector); numbits = strlen(test_vector); } - if (numbits < 64) return false; /* Preamble + data. */ + if(numbits < 64) return false; /* Preamble + data. */ - const char *sync_pattern = "1111010101" "01011010"; - uint64_t off = bitmap_seek_bits(bits,numbytes,0,numbits,sync_pattern); - if (off == BITMAP_SEEK_NOT_FOUND) return false; + const char* sync_pattern = "1111010101" + "01011010"; + uint64_t off = bitmap_seek_bits(bits, numbytes, 0, numbits, sync_pattern); + if(off == BITMAP_SEEK_NOT_FOUND) return false; FURI_LOG_E(TAG, "Schrader TPMS gap+preamble found"); info->start_off = off; @@ -33,36 +34,48 @@ static bool decode(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoView 0011 = 0x3. */ uint8_t raw[8]; - uint32_t decoded = - convert_from_line_code(raw,sizeof(raw),bits,numbytes,off, - "01","10"); /* Manchester code. */ + uint32_t decoded = convert_from_line_code( + raw, sizeof(raw), bits, numbytes, off, "01", "10"); /* Manchester code. */ FURI_LOG_E(TAG, "Schrader TPMS decoded bits: %lu", decoded); - if (decoded < 64) return false; /* Require the full 8 bytes. */ + if(decoded < 64) return false; /* Require the full 8 bytes. */ raw[0] |= 0xf0; // Fix the preamble nibble for checksum computation. - uint8_t cksum = crc8(raw,sizeof(raw)-1,0xf0,0x7); - if (cksum != raw[7]) { + uint8_t cksum = crc8(raw, sizeof(raw) - 1, 0xf0, 0x7); + if(cksum != raw[7]) { FURI_LOG_E(TAG, "Schrader TPMS checksum mismatch"); return false; } - info->pulses_count = (off+8*8*2) - info->start_off; + info->pulses_count = (off + 8 * 8 * 2) - info->start_off; - float kpa = (float)raw[5]*2.5; - int temp = raw[6]-50; + float kpa = (float)raw[5] * 2.5; + int temp = raw[6] - 50; - snprintf(info->name,sizeof(info->name),"%s","Schrader TPMS"); - snprintf(info->raw,sizeof(info->raw),"%02X%02X%02X%02X%02X%02X%02X%02X", - raw[0],raw[1],raw[2],raw[3],raw[4],raw[5], - raw[6],raw[7]); - snprintf(info->info1,sizeof(info->info1),"Tire ID %01X%02X%02X%02X", - raw[1]&7,raw[2],raw[3],raw[4]); /* Only 28 bits of ID, not 32. */ - snprintf(info->info2,sizeof(info->info2),"Pressure %.2f kpa", (double)kpa); - snprintf(info->info3,sizeof(info->info3),"Temperature %d C", temp); + snprintf(info->name, sizeof(info->name), "%s", "Schrader TPMS"); + snprintf( + info->raw, + sizeof(info->raw), + "%02X%02X%02X%02X%02X%02X%02X%02X", + raw[0], + raw[1], + raw[2], + raw[3], + raw[4], + raw[5], + raw[6], + raw[7]); + snprintf( + info->info1, + sizeof(info->info1), + "Tire ID %01X%02X%02X%02X", + raw[1] & 7, + raw[2], + raw[3], + raw[4]); /* Only 28 bits of ID, not 32. */ + snprintf(info->info2, sizeof(info->info2), "Pressure %.2f kpa", (double)kpa); + snprintf(info->info3, sizeof(info->info3), "Temperature %d C", temp); return true; } -ProtoViewDecoder SchraderTPMSDecoder = { - "Schrader TPMS", decode -}; +ProtoViewDecoder SchraderTPMSDecoder = {"Schrader TPMS", decode}; diff --git a/applications/plugins/protoview/protocols/tpms/schrader_eg53ma4.c b/applications/plugins/protoview/protocols/tpms/schrader_eg53ma4.c index 29701e6ca..ea9946b47 100644 --- a/applications/plugins/protoview/protocols/tpms/schrader_eg53ma4.c +++ b/applications/plugins/protoview/protocols/tpms/schrader_eg53ma4.c @@ -15,52 +15,65 @@ #include "../../app.h" -static bool decode(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoViewMsgInfo *info) { +static bool decode(uint8_t* bits, uint32_t numbytes, uint32_t numbits, ProtoViewMsgInfo* info) { + const char* sync_pattern = "010101010101" + "01100101"; + uint8_t sync_len = 12 + 8; /* We just use 12 preamble symbols + sync. */ + if(numbits - sync_len + 8 < 8 * 10) return false; - const char *sync_pattern = "010101010101" "01100101"; - uint8_t sync_len = 12+8; /* We just use 12 preamble symbols + sync. */ - if (numbits-sync_len+8 < 8*10) return false; - - uint64_t off = bitmap_seek_bits(bits,numbytes,0,numbits,sync_pattern); - if (off == BITMAP_SEEK_NOT_FOUND) return false; + uint64_t off = bitmap_seek_bits(bits, numbytes, 0, numbits, sync_pattern); + if(off == BITMAP_SEEK_NOT_FOUND) return false; FURI_LOG_E(TAG, "Schrader EG53MA4 TPMS preamble+sync found"); info->start_off = off; - off += sync_len-8; /* Skip preamble, not sync that is part of the data. */ + off += sync_len - 8; /* Skip preamble, not sync that is part of the data. */ uint8_t raw[10]; - uint32_t decoded = - convert_from_line_code(raw,sizeof(raw),bits,numbytes,off, - "01","10"); /* Manchester code. */ + uint32_t decoded = convert_from_line_code( + raw, sizeof(raw), bits, numbytes, off, "01", "10"); /* Manchester code. */ FURI_LOG_E(TAG, "Schrader EG53MA4 TPMS decoded bits: %lu", decoded); - if (decoded < 10*8) return false; /* Require the full 10 bytes. */ + if(decoded < 10 * 8) return false; /* Require the full 10 bytes. */ /* CRC is just all bytes added mod 256. */ uint8_t crc = 0; - for (int j = 0; j < 9; j++) crc += raw[j]; - if (crc != raw[9]) return false; /* Require sane CRC. */ + for(int j = 0; j < 9; j++) crc += raw[j]; + if(crc != raw[9]) return false; /* Require sane CRC. */ - info->pulses_count = (off+10*8*2) - info->start_off; + info->pulses_count = (off + 10 * 8 * 2) - info->start_off; /* To convert the raw pressure to kPa, RTL433 uses 2.5, but is likely * wrong. Searching on Google for users experimenting with the value * reported, the value appears to be 2.75. */ - float kpa = (float)raw[7]*2.75; + float kpa = (float)raw[7] * 2.75; int temp_f = raw[8]; - int temp_c = (temp_f-32)*5/9; /* Convert Fahrenheit to Celsius. */ + int temp_c = (temp_f - 32) * 5 / 9; /* Convert Fahrenheit to Celsius. */ - snprintf(info->name,sizeof(info->name),"%s","Schrader EG53MA4 TPMS"); - snprintf(info->raw,sizeof(info->raw),"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", - raw[0],raw[1],raw[2],raw[3],raw[4],raw[5], - raw[6],raw[7],raw[8],raw[9]); - snprintf(info->info1,sizeof(info->info1),"Tire ID %02X%02X%02X", - raw[4],raw[5],raw[6]); /* Only 28 bits of ID, not 32. */ - snprintf(info->info2,sizeof(info->info2),"Pressure %.2f kpa", (double)kpa); - snprintf(info->info3,sizeof(info->info3),"Temperature %d C", temp_c); + snprintf(info->name, sizeof(info->name), "%s", "Schrader EG53MA4 TPMS"); + snprintf( + info->raw, + sizeof(info->raw), + "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", + raw[0], + raw[1], + raw[2], + raw[3], + raw[4], + raw[5], + raw[6], + raw[7], + raw[8], + raw[9]); + snprintf( + info->info1, + sizeof(info->info1), + "Tire ID %02X%02X%02X", + raw[4], + raw[5], + raw[6]); /* Only 28 bits of ID, not 32. */ + snprintf(info->info2, sizeof(info->info2), "Pressure %.2f kpa", (double)kpa); + snprintf(info->info3, sizeof(info->info3), "Temperature %d C", temp_c); return true; } -ProtoViewDecoder SchraderEG53MA4TPMSDecoder = { - "Schrader EG53MA4 TPMS", decode -}; +ProtoViewDecoder SchraderEG53MA4TPMSDecoder = {"Schrader EG53MA4 TPMS", decode}; diff --git a/applications/plugins/protoview/protocols/tpms/toyota.c b/applications/plugins/protoview/protocols/tpms/toyota.c index c029baf11..af788a230 100644 --- a/applications/plugins/protoview/protocols/tpms/toyota.c +++ b/applications/plugins/protoview/protocols/tpms/toyota.c @@ -24,40 +24,33 @@ #include "../../app.h" -static bool decode(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoViewMsgInfo *info) { - - if (numbits-6 < 64*2) return false; /* Ask for 64 bit of data (each bit +static bool decode(uint8_t* bits, uint32_t numbytes, uint32_t numbits, ProtoViewMsgInfo* info) { + if(numbits - 6 < 64 * 2) + return false; /* Ask for 64 bit of data (each bit is two symbols in the bitmap). */ - char *sync[] = { - "00111100", - "001111100", - "00111101", - "001111101", - NULL - }; + char* sync[] = {"00111100", "001111100", "00111101", "001111101", NULL}; int j; uint32_t off = 0; - for (j = 0; sync[j]; j++) { - off = bitmap_seek_bits(bits,numbytes,0,numbits,sync[j]); - if (off != BITMAP_SEEK_NOT_FOUND) { + for(j = 0; sync[j]; j++) { + off = bitmap_seek_bits(bits, numbytes, 0, numbits, sync[j]); + if(off != BITMAP_SEEK_NOT_FOUND) { info->start_off = off; - off += strlen(sync[j])-2; + off += strlen(sync[j]) - 2; break; - } + } } - if (off == BITMAP_SEEK_NOT_FOUND) return false; + if(off == BITMAP_SEEK_NOT_FOUND) return false; FURI_LOG_E(TAG, "Toyota TPMS sync[%s] found", sync[j]); uint8_t raw[9]; - uint32_t decoded = - convert_from_diff_manchester(raw,sizeof(raw),bits,numbytes,off,true); + uint32_t decoded = convert_from_diff_manchester(raw, sizeof(raw), bits, numbytes, off, true); FURI_LOG_E(TAG, "Toyota TPMS decoded bits: %lu", decoded); - if (decoded < 8*9) return false; /* Require the full 8 bytes. */ - if (crc8(raw,8,0x80,7) != raw[8]) return false; /* Require sane CRC. */ + if(decoded < 8 * 9) return false; /* Require the full 8 bytes. */ + if(crc8(raw, 8, 0x80, 7) != raw[8]) return false; /* Require sane CRC. */ /* We detected a valid signal. However now info->start_off is actually * pointing to the sync part, not the preamble of alternating 0 and 1. @@ -65,27 +58,41 @@ static bool decode(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoView * for the decoder itself to fix the signal if neeeded, so that its * logical representation will be more accurate and better to save * and retransmit. */ - if (info->start_off >= 12) { + if(info->start_off >= 12) { info->start_off -= 12; - bitmap_set_pattern(bits,numbytes,info->start_off,"010101010101"); + bitmap_set_pattern(bits, numbytes, info->start_off, "010101010101"); } - info->pulses_count = (off+8*9*2) - info->start_off; + info->pulses_count = (off + 8 * 9 * 2) - info->start_off; - float kpa = (float)((raw[4]&0x7f)<<1 | raw[5]>>7) * 0.25 - 7; - int temp = ((raw[5]&0x7f)<<1 | raw[6]>>7) - 40; + float kpa = (float)((raw[4] & 0x7f) << 1 | raw[5] >> 7) * 0.25 - 7; + int temp = ((raw[5] & 0x7f) << 1 | raw[6] >> 7) - 40; - snprintf(info->name,sizeof(info->name),"%s","Toyota TPMS"); - snprintf(info->raw,sizeof(info->raw),"%02X%02X%02X%02X%02X%02X%02X%02X%02X", - raw[0],raw[1],raw[2],raw[3],raw[4],raw[5], - raw[6],raw[7],raw[8]); - snprintf(info->info1,sizeof(info->info1),"Tire ID %02X%02X%02X%02X", - raw[0],raw[1],raw[2],raw[3]); - snprintf(info->info2,sizeof(info->info2),"Pressure %.2f psi", (double)kpa); - snprintf(info->info3,sizeof(info->info3),"Temperature %d C", temp); + snprintf(info->name, sizeof(info->name), "%s", "Toyota TPMS"); + snprintf( + info->raw, + sizeof(info->raw), + "%02X%02X%02X%02X%02X%02X%02X%02X%02X", + raw[0], + raw[1], + raw[2], + raw[3], + raw[4], + raw[5], + raw[6], + raw[7], + raw[8]); + snprintf( + info->info1, + sizeof(info->info1), + "Tire ID %02X%02X%02X%02X", + raw[0], + raw[1], + raw[2], + raw[3]); + snprintf(info->info2, sizeof(info->info2), "Pressure %.2f psi", (double)kpa); + snprintf(info->info3, sizeof(info->info3), "Temperature %d C", temp); return true; } -ProtoViewDecoder ToyotaTPMSDecoder = { - "Toyota TPMS", decode -}; +ProtoViewDecoder ToyotaTPMSDecoder = {"Toyota TPMS", decode}; diff --git a/applications/plugins/protoview/signal.c b/applications/plugins/protoview/signal.c index 1ea195245..c1f90b9ab 100644 --- a/applications/plugins/protoview/signal.c +++ b/applications/plugins/protoview/signal.c @@ -3,7 +3,7 @@ #include "app.h" -bool decode_signal(RawSamplesBuffer *s, uint64_t len, ProtoViewMsgInfo *info); +bool decode_signal(RawSamplesBuffer* s, uint64_t len, ProtoViewMsgInfo* info); /* ============================================================================= * Raw signal detection @@ -16,7 +16,7 @@ uint32_t duration_delta(uint32_t a, uint32_t b) { } /* Reset the current signal, so that a new one can be detected. */ -void reset_current_signal(ProtoViewApp *app) { +void reset_current_signal(ProtoViewApp* app) { app->signal_bestlen = 0; app->signal_offset = 0; app->signal_decoded = false; @@ -39,47 +39,47 @@ void reset_current_signal(ProtoViewApp *app) { * For instance Oregon2 sensors, in the case of protocol 2.1 will send * pulses of ~400us (RF on) VS ~580us (RF off). */ #define SEARCH_CLASSES 3 -uint32_t search_coherent_signal(RawSamplesBuffer *s, uint32_t idx) { +uint32_t search_coherent_signal(RawSamplesBuffer* s, uint32_t idx) { struct { - uint32_t dur[2]; /* dur[0] = low, dur[1] = high */ - uint32_t count[2]; /* Associated observed frequency. */ + uint32_t dur[2]; /* dur[0] = low, dur[1] = high */ + uint32_t count[2]; /* Associated observed frequency. */ } classes[SEARCH_CLASSES]; - memset(classes,0,sizeof(classes)); + memset(classes, 0, sizeof(classes)); uint32_t minlen = 30, maxlen = 4000; /* Depends on data rate, here we allow for high and low. */ uint32_t len = 0; /* Observed len of coherent samples. */ s->short_pulse_dur = 0; - for (uint32_t j = idx; j < idx+500; j++) { + for(uint32_t j = idx; j < idx + 500; j++) { bool level; uint32_t dur; raw_samples_get(s, j, &level, &dur); - if (dur < minlen || dur > maxlen) break; /* return. */ + if(dur < minlen || dur > maxlen) break; /* return. */ /* Let's see if it matches a class we already have or if we * can populate a new (yet empty) class. */ uint32_t k; - for (k = 0; k < SEARCH_CLASSES; k++) { - if (classes[k].count[level] == 0) { + for(k = 0; k < SEARCH_CLASSES; k++) { + if(classes[k].count[level] == 0) { classes[k].dur[level] = dur; classes[k].count[level] = 1; break; /* Sample accepted. */ } else { uint32_t classavg = classes[k].dur[level]; uint32_t count = classes[k].count[level]; - uint32_t delta = duration_delta(dur,classavg); + uint32_t delta = duration_delta(dur, classavg); /* Is the difference in duration between this signal and * the class we are inspecting less than a given percentage? * If so, accept this signal. */ - if (delta < classavg/5) { /* 100%/5 = 20%. */ + if(delta < classavg / 5) { /* 100%/5 = 20%. */ /* It is useful to compute the average of the class * we are observing. We know how many samples we got so * far, so we can recompute the average easily. * By always having a better estimate of the pulse len * we can avoid missing next samples in case the first * observed samples are too off. */ - classavg = ((classavg * count) + dur) / (count+1); + classavg = ((classavg * count) + dur) / (count + 1); classes[k].dur[level] = classavg; classes[k].count[level]++; break; /* Sample accepted. */ @@ -87,7 +87,7 @@ uint32_t search_coherent_signal(RawSamplesBuffer *s, uint32_t idx) { } } - if (k == SEARCH_CLASSES) break; /* No match, return. */ + if(k == SEARCH_CLASSES) break; /* No match, return. */ /* If we are here, we accepted this sample. Try with the next * one. */ @@ -97,14 +97,12 @@ uint32_t search_coherent_signal(RawSamplesBuffer *s, uint32_t idx) { /* Update the buffer setting the shortest pulse we found * among the three classes. This will be used when scaling * for visualization. */ - uint32_t short_dur[2] = {0,0}; - for (int j = 0; j < SEARCH_CLASSES; j++) { - for (int level = 0; level < 2; level++) { - if (classes[j].dur[level] == 0) continue; - if (classes[j].count[level] < 3) continue; - if (short_dur[level] == 0 || - short_dur[level] > classes[j].dur[level]) - { + uint32_t short_dur[2] = {0, 0}; + for(int j = 0; j < SEARCH_CLASSES; j++) { + for(int level = 0; level < 2; level++) { + if(classes[j].dur[level] == 0) continue; + if(classes[j].count[level] < 3) continue; + if(short_dur[level] == 0 || short_dur[level] > classes[j].dur[level]) { short_dur[level] = classes[j].dur[level]; } } @@ -113,9 +111,9 @@ uint32_t search_coherent_signal(RawSamplesBuffer *s, uint32_t idx) { /* Use the average between high and low short pulses duration. * Often they are a bit different, and using the average is more robust * when we do decoding sampling at short_pulse_dur intervals. */ - if (short_dur[0] == 0) short_dur[0] = short_dur[1]; - if (short_dur[1] == 0) short_dur[1] = short_dur[0]; - s->short_pulse_dur = (short_dur[0]+short_dur[1])/2; + if(short_dur[0] == 0) short_dur[0] = short_dur[1]; + if(short_dur[1] == 0) short_dur[1] = short_dur[0]; + s->short_pulse_dur = (short_dur[0] + short_dur[1]) / 2; return len; } @@ -124,60 +122,62 @@ uint32_t search_coherent_signal(RawSamplesBuffer *s, uint32_t idx) { * in order to find a coherent signal. If a signal that does not appear to * be just noise is found, it is set in DetectedSamples global signal * buffer, that is what is rendered on the screen. */ -void scan_for_signal(ProtoViewApp *app) { +void scan_for_signal(ProtoViewApp* app) { /* We need to work on a copy: the RawSamples buffer is populated * by the background thread receiving data. */ - RawSamplesBuffer *copy = raw_samples_alloc(); - raw_samples_copy(copy,RawSamples); + RawSamplesBuffer* copy = raw_samples_alloc(); + raw_samples_copy(copy, RawSamples); /* Try to seek on data that looks to have a regular high low high low * pattern. */ - uint32_t minlen = 18; /* Min run of coherent samples. With less + uint32_t minlen = 18; /* Min run of coherent samples. With less than a few samples it's very easy to mistake noise for signal. */ uint32_t i = 0; - while (i < copy->total-1) { - uint32_t thislen = search_coherent_signal(copy,i); + while(i < copy->total - 1) { + uint32_t thislen = search_coherent_signal(copy, i); /* For messages that are long enough, attempt decoding. */ - if (thislen > minlen) { + if(thislen > minlen) { /* Allocate the message information that some decoder may * fill, in case it is able to decode a message. */ - ProtoViewMsgInfo *info = malloc(sizeof(ProtoViewMsgInfo)); - init_msg_info(info,app); + ProtoViewMsgInfo* info = malloc(sizeof(ProtoViewMsgInfo)); + init_msg_info(info, app); info->short_pulse_dur = copy->short_pulse_dur; uint32_t saved_idx = copy->idx; /* Save index, see later. */ /* decode_signal() expects the detected signal to start * from index zero .*/ - raw_samples_center(copy,i); - bool decoded = decode_signal(copy,thislen,info); + raw_samples_center(copy, i); + bool decoded = decode_signal(copy, thislen, info); copy->idx = saved_idx; /* Restore the index as we are scanning the signal in the loop. */ /* Accept this signal as the new signal if either it's longer * than the previous undecoded one, or the previous one was * unknown and this is decoded. */ - if ((thislen > app->signal_bestlen && app->signal_decoded == false) - || (app->signal_decoded == false && decoded)) - { + if((thislen > app->signal_bestlen && app->signal_decoded == false) || + (app->signal_decoded == false && decoded)) { free_msg_info(app->msg_info); app->msg_info = info; app->signal_bestlen = thislen; app->signal_decoded = decoded; - raw_samples_copy(DetectedSamples,copy); - raw_samples_center(DetectedSamples,i); - FURI_LOG_E(TAG, "===> Displayed sample updated (%d samples %lu us)", - (int)thislen, DetectedSamples->short_pulse_dur); + raw_samples_copy(DetectedSamples, copy); + raw_samples_center(DetectedSamples, i); + FURI_LOG_E( + TAG, + "===> Displayed sample updated (%d samples %lu us)", + (int)thislen, + DetectedSamples->short_pulse_dur); /* Adjust raw view scale if the signal has an high * data rate. */ - if (DetectedSamples->short_pulse_dur < 75) + if(DetectedSamples->short_pulse_dur < 75) app->us_scale = 10; - else if (DetectedSamples->short_pulse_dur < 145) + else if(DetectedSamples->short_pulse_dur < 145) app->us_scale = 30; } else { /* If the structure was not filled, discard it. Otherwise @@ -206,38 +206,42 @@ void scan_for_signal(ProtoViewApp *app) { /* Set the 'bitpos' bit to value 'val', in the specified bitmap * 'b' of len 'blen'. * Out of range bits will silently be discarded. */ -void bitmap_set(uint8_t *b, uint32_t blen, uint32_t bitpos, bool val) { - uint32_t byte = bitpos/8; - uint32_t bit = 7-(bitpos&7); - if (byte >= blen) return; - if (val) - b[byte] |= 1<= blen) return; + if(val) + b[byte] |= 1 << bit; else - b[byte] &= ~(1<= blen) return 0; - return (b[byte] & (1<= blen) return 0; + return (b[byte] & (1 << bit)) != 0; } /* Copy 'count' bits from the bitmap 's' of 'slen' total bytes, to the * bitmap 'd' of 'dlen' total bytes. The bits are copied starting from * offset 'soff' of the source bitmap to the offset 'doff' of the * destination bitmap. */ -void bitmap_copy(uint8_t *d, uint32_t dlen, uint32_t doff, - uint8_t *s, uint32_t slen, uint32_t soff, - uint32_t count) -{ +void bitmap_copy( + uint8_t* d, + uint32_t dlen, + uint32_t doff, + uint8_t* s, + uint32_t slen, + uint32_t soff, + uint32_t count) { /* If we are byte-aligned in both source and destination, use a fast * path for the number of bytes we can consume this way. */ - if ((doff & 7) == 0 && (soff & 7) == 0) { - uint32_t didx = doff/8; - uint32_t sidx = soff/8; + if((doff & 7) == 0 && (soff & 7) == 0) { + uint32_t didx = doff / 8; + uint32_t sidx = soff / 8; while(count > 8 && didx < dlen && sidx < slen) { d[didx++] = s[sidx++]; count -= 8; @@ -250,9 +254,9 @@ void bitmap_copy(uint8_t *d, uint32_t dlen, uint32_t doff, /* Copy the bits needed to reach an offset where we can copy * two half bytes of src to a full byte of destination. */ - while(count > 8 && (doff&7) != 0) { - bool bit = bitmap_get(s,slen,soff++); - bitmap_set(d,dlen,doff++,bit); + while(count > 8 && (doff & 7) != 0) { + bool bit = bitmap_get(s, slen, soff++); + bitmap_set(d, dlen, doff++, bit); count--; } @@ -295,13 +299,12 @@ void bitmap_copy(uint8_t *d, uint32_t dlen, uint32_t doff, * src[2] << 5, that is "WORLDS!!" >> 5 = ".....WOR" * That is "HELLOWOR" */ - if (count > 8) { + if(count > 8) { uint8_t skew = soff % 8; /* Don't worry, compiler will optimize. */ - uint32_t didx = doff/8; - uint32_t sidx = soff/8; + uint32_t didx = doff / 8; + uint32_t sidx = soff / 8; while(count > 8 && didx < dlen && sidx < slen) { - d[didx] = ((s[sidx] << skew) | - (s[sidx+1] >> (8-skew))); + d[didx] = ((s[sidx] << skew) | (s[sidx + 1] >> (8 - skew))); sidx++; didx++; soff += 8; @@ -313,8 +316,8 @@ void bitmap_copy(uint8_t *d, uint32_t dlen, uint32_t doff, /* Here count is guaranteed to be < 8. * Copy the final bits bit by bit. */ while(count) { - bool bit = bitmap_get(s,slen,soff++); - bitmap_set(d,dlen,doff++,bit); + bool bit = bitmap_get(s, slen, soff++); + bitmap_set(d, dlen, doff++, bit); count--; } } @@ -322,15 +325,15 @@ void bitmap_copy(uint8_t *d, uint32_t dlen, uint32_t doff, /* We decode bits assuming the first bit we receive is the MSB * (see bitmap_set/get functions). Certain devices send data * encoded in the reverse way. */ -void bitmap_reverse_bytes(uint8_t *p, uint32_t len) { - for (uint32_t j = 0; j < len; j++) { +void bitmap_reverse_bytes(uint8_t* p, uint32_t len) { + for(uint32_t j = 0; j < len; j++) { uint32_t b = p[j]; /* Step 1: swap the two nibbles: 12345678 -> 56781234 */ - b = (b&0xf0)>>4 | (b&0x0f)<<4; + b = (b & 0xf0) >> 4 | (b & 0x0f) << 4; /* Step 2: swap adjacent pairs : 56781234 -> 78563412 */ - b = (b&0xcc)>>2 | (b&0x33)<<2; + b = (b & 0xcc) >> 2 | (b & 0x33) << 2; /* Step 3: swap adjacent bits : 78563412 -> 87654321 */ - b = (b&0xaa)>>1 | (b&0x55)<<1; + b = (b & 0xaa) >> 1 | (b & 0x55) << 1; p[j] = b; } } @@ -338,10 +341,10 @@ void bitmap_reverse_bytes(uint8_t *p, uint32_t len) { /* Return true if the specified sequence of bits, provided as a string in the * form "11010110..." is found in the 'b' bitmap of 'blen' bits at 'bitpos' * position. */ -bool bitmap_match_bits(uint8_t *b, uint32_t blen, uint32_t bitpos, const char *bits) { - for (size_t j = 0; bits[j]; j++) { +bool bitmap_match_bits(uint8_t* b, uint32_t blen, uint32_t bitpos, const char* bits) { + for(size_t j = 0; bits[j]; j++) { bool expected = (bits[j] == '1') ? true : false; - if (bitmap_get(b,blen,bitpos+j) != expected) return false; + if(bitmap_get(b, blen, bitpos + j) != expected) return false; } return true; } @@ -354,12 +357,17 @@ bool bitmap_match_bits(uint8_t *b, uint32_t blen, uint32_t bitpos, const char *b * Note: there are better algorithms, such as Boyer-Moore. Here we hope that * for the kind of patterns we search we'll have a lot of early stops so * we use a vanilla approach. */ -uint32_t bitmap_seek_bits(uint8_t *b, uint32_t blen, uint32_t startpos, uint32_t maxbits, const char *bits) { - uint32_t endpos = startpos+blen*8; - uint32_t end2 = startpos+maxbits; - if (end2 < endpos) endpos = end2; - for (uint32_t j = startpos; j < endpos; j++) - if (bitmap_match_bits(b,blen,j,bits)) return j; +uint32_t bitmap_seek_bits( + uint8_t* b, + uint32_t blen, + uint32_t startpos, + uint32_t maxbits, + const char* bits) { + uint32_t endpos = startpos + blen * 8; + uint32_t end2 = startpos + maxbits; + if(end2 < endpos) endpos = end2; + for(uint32_t j = startpos; j < endpos; j++) + if(bitmap_match_bits(b, blen, j, bits)) return j; return BITMAP_SEEK_NOT_FOUND; } @@ -370,10 +378,10 @@ uint32_t bitmap_seek_bits(uint8_t *b, uint32_t blen, uint32_t startpos, uint32_t * This function is useful in order to set the test vectors in the protocol * decoders, to see if the decoding works regardless of the fact we are able * to actually receive a given signal. */ -void bitmap_set_pattern(uint8_t *b, uint32_t blen, uint32_t off, const char *pat) { +void bitmap_set_pattern(uint8_t* b, uint32_t blen, uint32_t off, const char* pat) { uint32_t i = 0; while(pat[i]) { - bitmap_set(b,blen,i+off,pat[i] == '1'); + bitmap_set(b, blen, i + off, pat[i] == '1'); i++; } } @@ -405,31 +413,36 @@ void bitmap_set_pattern(uint8_t *b, uint32_t blen, uint32_t off, const char *pat * bits set into the buffer 'b'. The 'rate' argument, in microseconds, is * the detected short-pulse duration. We expect the line code to be * meaningful when interpreted at multiples of 'rate'. */ -uint32_t convert_signal_to_bits(uint8_t *b, uint32_t blen, RawSamplesBuffer *s, uint32_t idx, uint32_t count, uint32_t rate) { - if (rate == 0) return 0; /* We can't perform the conversion. */ +uint32_t convert_signal_to_bits( + uint8_t* b, + uint32_t blen, + RawSamplesBuffer* s, + uint32_t idx, + uint32_t count, + uint32_t rate) { + if(rate == 0) return 0; /* We can't perform the conversion. */ uint32_t bitpos = 0; - for (uint32_t j = 0; j < count; j++) { + for(uint32_t j = 0; j < count; j++) { uint32_t dur; bool level; - raw_samples_get(s, j+idx, &level, &dur); + raw_samples_get(s, j + idx, &level, &dur); uint32_t numbits = dur / rate; /* full bits that surely fit. */ - uint32_t rest = dur % rate; /* How much we are left with. */ - if (rest > rate/2) numbits++; /* There is another one. */ + uint32_t rest = dur % rate; /* How much we are left with. */ + if(rest > rate / 2) numbits++; /* There is another one. */ /* Limit how much a single sample can spawn. There are likely no * protocols doing such long pulses when the rate is low. */ - if (numbits > 1024) numbits = 1024; + if(numbits > 1024) numbits = 1024; - if (0) /* Super verbose, so not under the DEBUG_MSG define. */ - FURI_LOG_E(TAG, "%lu converted into %lu (%d) bits", - dur,numbits,(int)level); + if(0) /* Super verbose, so not under the DEBUG_MSG define. */ + FURI_LOG_E(TAG, "%lu converted into %lu (%d) bits", dur, numbits, (int)level); /* If the signal is too short, let's claim it an interference * and ignore it completely. */ - if (numbits == 0) continue; + if(numbits == 0) continue; - while(numbits--) bitmap_set(b,blen,bitpos++,level); + while(numbits--) bitmap_set(b, blen, bitpos++, level); } return bitpos; } @@ -446,23 +459,29 @@ uint32_t convert_signal_to_bits(uint8_t *b, uint32_t blen, RawSamplesBuffer *s, * specified in bytes by the caller, via the 'len' parameters). * * The decoding starts at the specified offset (in bits) 'off'. */ -uint32_t convert_from_line_code(uint8_t *buf, uint64_t buflen, uint8_t *bits, uint32_t len, uint32_t off, const char *zero_pattern, const char *one_pattern) -{ +uint32_t convert_from_line_code( + uint8_t* buf, + uint64_t buflen, + uint8_t* bits, + uint32_t len, + uint32_t off, + const char* zero_pattern, + const char* one_pattern) { uint32_t decoded = 0; /* Number of bits extracted. */ len *= 8; /* Convert bytes to bits. */ while(off < len) { bool bitval; - if (bitmap_match_bits(bits,len,off,zero_pattern)) { + if(bitmap_match_bits(bits, len, off, zero_pattern)) { bitval = false; off += strlen(zero_pattern); - } else if (bitmap_match_bits(bits,len,off,one_pattern)) { + } else if(bitmap_match_bits(bits, len, off, one_pattern)) { bitval = true; off += strlen(one_pattern); } else { break; } - bitmap_set(buf,buflen,decoded++,bitval); - if (decoded/8 == buflen) break; /* No space left on target buffer. */ + bitmap_set(buf, buflen, decoded++, bitval); + if(decoded / 8 == buflen) break; /* No space left on target buffer. */ } return decoded; } @@ -473,17 +492,22 @@ uint32_t convert_from_line_code(uint8_t *buf, uint64_t buflen, uint8_t *bits, ui * in differential codings the next bits depend on the previous one. * * Parameters and return values are like convert_from_line_code(). */ -uint32_t convert_from_diff_manchester(uint8_t *buf, uint64_t buflen, uint8_t *bits, uint32_t len, uint32_t off, bool previous) -{ +uint32_t convert_from_diff_manchester( + uint8_t* buf, + uint64_t buflen, + uint8_t* bits, + uint32_t len, + uint32_t off, + bool previous) { uint32_t decoded = 0; len *= 8; /* Conver to bits. */ - for (uint32_t j = off; j < len; j += 2) { - bool b0 = bitmap_get(bits,len,j); - bool b1 = bitmap_get(bits,len,j+1); - if (b0 == previous) break; /* Each new bit must switch value. */ - bitmap_set(buf,buflen,decoded++,b0 == b1); + for(uint32_t j = off; j < len; j += 2) { + bool b0 = bitmap_get(bits, len, j); + bool b1 = bitmap_get(bits, len, j + 1); + if(b0 == previous) break; /* Each new bit must switch value. */ + bitmap_set(buf, buflen, decoded++, b0 == b1); previous = b1; - if (decoded/8 == buflen) break; /* No space left on target buffer. */ + if(decoded / 8 == buflen) break; /* No space left on target buffer. */ } return decoded; } @@ -501,31 +525,30 @@ extern ProtoViewDecoder CitroenTPMSDecoder; extern ProtoViewDecoder FordTPMSDecoder; extern ProtoViewDecoder KeeloqDecoder; -ProtoViewDecoder *Decoders[] = { - &Oregon2Decoder, /* Oregon sensors v2.1 protocol. */ - &B4B1Decoder, /* PT, SC, ... 24 bits remotes. */ - &RenaultTPMSDecoder, /* Renault TPMS. */ - &ToyotaTPMSDecoder, /* Toyota TPMS. */ - &SchraderTPMSDecoder, /* Schrader TPMS. */ - &SchraderEG53MA4TPMSDecoder, /* Schrader EG53MA4 TPMS. */ - &CitroenTPMSDecoder, /* Citroen TPMS. */ - &FordTPMSDecoder, /* Ford TPMS. */ - &KeeloqDecoder, /* Keeloq remote. */ - NULL -}; +ProtoViewDecoder* Decoders[] = { + &Oregon2Decoder, /* Oregon sensors v2.1 protocol. */ + &B4B1Decoder, /* PT, SC, ... 24 bits remotes. */ + &RenaultTPMSDecoder, /* Renault TPMS. */ + &ToyotaTPMSDecoder, /* Toyota TPMS. */ + &SchraderTPMSDecoder, /* Schrader TPMS. */ + &SchraderEG53MA4TPMSDecoder, /* Schrader EG53MA4 TPMS. */ + &CitroenTPMSDecoder, /* Citroen TPMS. */ + &FordTPMSDecoder, /* Ford TPMS. */ + &KeeloqDecoder, /* Keeloq remote. */ + NULL}; /* Free the message info and allocated data. */ -void free_msg_info(ProtoViewMsgInfo *i) { - if (i == NULL) return; +void free_msg_info(ProtoViewMsgInfo* i) { + if(i == NULL) return; free(i->bits); free(i); } /* Reset the message info structure before passing it to the decoding * functions. */ -void init_msg_info(ProtoViewMsgInfo *i, ProtoViewApp *app) { +void init_msg_info(ProtoViewMsgInfo* i, ProtoViewApp* app) { UNUSED(app); - memset(i,0,sizeof(ProtoViewMsgInfo)); + memset(i, 0, sizeof(ProtoViewMsgInfo)); i->bits = NULL; } @@ -533,23 +556,29 @@ void init_msg_info(ProtoViewMsgInfo *i, ProtoViewApp *app) { * to a bitstream, and the calls the protocol specific functions for * decoding. If the signal was decoded correctly by some protocol, true * is returned. Otherwise false is returned. */ -bool decode_signal(RawSamplesBuffer *s, uint64_t len, ProtoViewMsgInfo *info) { - uint32_t bitmap_bits_size = 4096*8; - uint32_t bitmap_size = bitmap_bits_size/8; +bool decode_signal(RawSamplesBuffer* s, uint64_t len, ProtoViewMsgInfo* info) { + uint32_t bitmap_bits_size = 4096 * 8; + uint32_t bitmap_size = bitmap_bits_size / 8; /* We call the decoders with an offset a few samples before the actual * signal detected and for a len of a few bits after its end. */ uint32_t before_samples = 32; uint32_t after_samples = 100; - uint8_t *bitmap = malloc(bitmap_size); - uint32_t bits = convert_signal_to_bits(bitmap,bitmap_size,s,-before_samples,len+before_samples+after_samples,s->short_pulse_dur); + uint8_t* bitmap = malloc(bitmap_size); + uint32_t bits = convert_signal_to_bits( + bitmap, + bitmap_size, + s, + -before_samples, + len + before_samples + after_samples, + s->short_pulse_dur); - if (DEBUG_MSG) { /* Useful for debugging purposes. Don't remove. */ - char *str = malloc(1024); + if(DEBUG_MSG) { /* Useful for debugging purposes. Don't remove. */ + char* str = malloc(1024); uint32_t j; - for (j = 0; j < bits && j < 1023; j++) { - str[j] = bitmap_get(bitmap,bitmap_size,j) ? '1' : '0'; + for(j = 0; j < bits && j < 1023; j++) { + str[j] = bitmap_get(bitmap, bitmap_size, j) ? '1' : '0'; } str[j] = 0; FURI_LOG_E(TAG, "%lu bits sampled: %s", bits, str); @@ -562,30 +591,40 @@ bool decode_signal(RawSamplesBuffer *s, uint64_t len, ProtoViewMsgInfo *info) { bool decoded = false; while(Decoders[j]) { uint32_t start_time = furi_get_tick(); - decoded = Decoders[j]->decode(bitmap,bitmap_size,bits,info); + decoded = Decoders[j]->decode(bitmap, bitmap_size, bits, info); uint32_t delta = furi_get_tick() - start_time; - FURI_LOG_E(TAG, "Decoder %s took %lu ms", - Decoders[j]->name, (unsigned long)delta); - if (decoded) break; + FURI_LOG_E(TAG, "Decoder %s took %lu ms", Decoders[j]->name, (unsigned long)delta); + if(decoded) break; j++; } - if (!decoded) { + if(!decoded) { FURI_LOG_E(TAG, "No decoding possible"); } else { - FURI_LOG_E(TAG, "Decoded %s, raw=%s info=[%s,%s,%s,%s]", - info->name, info->raw, info->info1, info->info2, - info->info3, info->info4); + FURI_LOG_E( + TAG, + "Decoded %s, raw=%s info=[%s,%s,%s,%s]", + info->name, + info->raw, + info->info1, + info->info2, + info->info3, + info->info4); /* The message was correctly decoded: fill the info structure * with the decoded signal. The decoder may not implement offset/len * filling of the structure. In such case we have no info and * pulses_count will be set to zero. */ - if (info->pulses_count) { - info->bits_bytes = (info->pulses_count+7)/8; // Round to full byte. + if(info->pulses_count) { + info->bits_bytes = (info->pulses_count + 7) / 8; // Round to full byte. info->bits = malloc(info->bits_bytes); - bitmap_copy(info->bits,info->bits_bytes,0, - bitmap,bitmap_size,info->start_off, - info->pulses_count); + bitmap_copy( + info->bits, + info->bits_bytes, + 0, + bitmap, + bitmap_size, + info->start_off, + info->pulses_count); } } free(bitmap); diff --git a/applications/plugins/protoview/signal_file.c b/applications/plugins/protoview/signal_file.c index 31c8726fb..c60a6a181 100644 --- a/applications/plugins/protoview/signal_file.c +++ b/applications/plugins/protoview/signal_file.c @@ -13,57 +13,56 @@ * but it's logical representation stored in the app->msg_info bitmap, where * each 1 or 0 means a puls or gap for the specified short pulse duration time * (te). */ -bool save_signal(ProtoViewApp *app, const char *filename) { +bool save_signal(ProtoViewApp* app, const char* filename) { /* We have a message at all? */ - if (app->msg_info == NULL || app->msg_info->pulses_count == 0) return false; - - Storage *storage = furi_record_open(RECORD_STORAGE); - FlipperFormat *file = flipper_format_file_alloc(storage); - Stream *stream = flipper_format_get_raw_stream(file); - FuriString *file_content = NULL; + if(app->msg_info == NULL || app->msg_info->pulses_count == 0) return false; + + Storage* storage = furi_record_open(RECORD_STORAGE); + FlipperFormat* file = flipper_format_file_alloc(storage); + Stream* stream = flipper_format_get_raw_stream(file); + FuriString* file_content = NULL; bool success = true; - if (flipper_format_file_open_always(file, filename)) { + if(flipper_format_file_open_always(file, filename)) { /* Write the file header. */ - FuriString *file_content = furi_string_alloc(); - const char *preset_id = ProtoViewModulations[app->modulation].id; + FuriString* file_content = furi_string_alloc(); + const char* preset_id = ProtoViewModulations[app->modulation].id; - furi_string_printf(file_content, - "Filetype: Flipper SubGhz RAW File\n" - "Version: 1\n" - "Frequency: %ld\n" - "Preset: %s\n", - app->frequency, - preset_id ? preset_id : "FuriHalSubGhzPresetCustom"); + furi_string_printf( + file_content, + "Filetype: Flipper SubGhz RAW File\n" + "Version: 1\n" + "Frequency: %ld\n" + "Preset: %s\n", + app->frequency, + preset_id ? preset_id : "FuriHalSubGhzPresetCustom"); /* For custom modulations, we need to emit a set of registers. */ - if (preset_id == NULL) { - FuriString *custom = furi_string_alloc(); - uint8_t *regs = ProtoViewModulations[app->modulation].custom; - furi_string_printf(custom, + if(preset_id == NULL) { + FuriString* custom = furi_string_alloc(); + uint8_t* regs = ProtoViewModulations[app->modulation].custom; + furi_string_printf( + custom, "Custom_preset_module: CC1101\n" - "Custom_preset_data: "); - for (int j = 0; regs[j]; j += 2) { - furi_string_cat_printf(custom, "%02X %02X ", - (int)regs[j], (int)regs[j+1]); + "Custom_preset_data: "); + for(int j = 0; regs[j]; j += 2) { + furi_string_cat_printf(custom, "%02X %02X ", (int)regs[j], (int)regs[j + 1]); } size_t len = furi_string_size(file_content); - furi_string_set_char(custom,len-1,'\n'); - furi_string_cat(file_content,custom); + furi_string_set_char(custom, len - 1, '\n'); + furi_string_cat(file_content, custom); furi_string_free(custom); } /* We always save raw files. */ - furi_string_cat_printf(file_content, - "Protocol: RAW\n" - "RAW_Data: -10000\n"); // Start with 10 ms of gap + furi_string_cat_printf( + file_content, + "Protocol: RAW\n" + "RAW_Data: -10000\n"); // Start with 10 ms of gap /* Write header. */ size_t len = furi_string_size(file_content); - if (stream_write(stream, - (uint8_t*) furi_string_get_cstr(file_content), len) - != len) - { + if(stream_write(stream, (uint8_t*)furi_string_get_cstr(file_content), len) != len) { FURI_LOG_W(TAG, "Short write to file"); success = false; goto write_err; @@ -76,15 +75,13 @@ bool save_signal(ProtoViewApp *app, const char *filename) { uint32_t this_line_samples = 0; uint32_t max_line_samples = 100; uint32_t idx = 0; // Iindex in the signal bitmap. - ProtoViewMsgInfo *i = app->msg_info; + ProtoViewMsgInfo* i = app->msg_info; while(idx < i->pulses_count) { - bool level = bitmap_get(i->bits,i->bits_bytes,idx); + bool level = bitmap_get(i->bits, i->bits_bytes, idx); uint32_t te_times = 1; idx++; /* Count the duration of the current pulse/gap. */ - while(idx < i->pulses_count && - bitmap_get(i->bits,i->bits_bytes,idx) == level) - { + while(idx < i->pulses_count && bitmap_get(i->bits, i->bits_bytes, idx) == level) { te_times++; idx++; } @@ -92,32 +89,29 @@ bool save_signal(ProtoViewApp *app, const char *filename) { // next gap or pulse. int32_t dur = (int32_t)i->short_pulse_dur * te_times; - if (level == 0) dur = -dur; /* Negative is gap in raw files. */ + if(level == 0) dur = -dur; /* Negative is gap in raw files. */ /* Emit the sample. If this is the first sample of the line, * also emit the RAW_Data: field. */ - if (this_line_samples == 0) - furi_string_cat_printf(file_content,"RAW_Data: "); - furi_string_cat_printf(file_content,"%d ",(int)dur); + if(this_line_samples == 0) furi_string_cat_printf(file_content, "RAW_Data: "); + furi_string_cat_printf(file_content, "%d ", (int)dur); this_line_samples++; /* Store the current set of samples on disk, when we reach a * given number or the end of the signal. */ bool end_reached = (idx == i->pulses_count); - if (this_line_samples == max_line_samples || end_reached) { + if(this_line_samples == max_line_samples || end_reached) { /* If that's the end, terminate the signal with a long * gap. */ - if (end_reached) furi_string_cat_printf(file_content,"-10000 "); + if(end_reached) furi_string_cat_printf(file_content, "-10000 "); /* We always have a trailing space in the last sample. Make it * a newline. */ size_t len = furi_string_size(file_content); - furi_string_set_char(file_content,len-1,'\n'); + furi_string_set_char(file_content, len - 1, '\n'); - if (stream_write(stream, - (uint8_t*) furi_string_get_cstr(file_content), - len) != len) - { + if(stream_write(stream, (uint8_t*)furi_string_get_cstr(file_content), len) != + len) { FURI_LOG_W(TAG, "Short write to file"); success = false; goto write_err; @@ -136,6 +130,6 @@ bool save_signal(ProtoViewApp *app, const char *filename) { write_err: furi_record_close(RECORD_STORAGE); flipper_format_free(file); - if (file_content != NULL) furi_string_free(file_content); + if(file_content != NULL) furi_string_free(file_content); return success; } diff --git a/applications/plugins/protoview/ui.c b/applications/plugins/protoview/ui.c index 325fc5efc..e2c775d96 100644 --- a/applications/plugins/protoview/ui.c +++ b/applications/plugins/protoview/ui.c @@ -10,36 +10,31 @@ /* Return the ID of the currently selected subview, of the current * view. */ -int get_current_subview(ProtoViewApp *app) { +int get_current_subview(ProtoViewApp* app) { return app->current_subview[app->current_view]; } /* Called by view rendering callback that has subviews, to show small triangles * facing down/up if there are other subviews the user can access with up * and down. */ -void show_available_subviews(Canvas *canvas, ProtoViewApp *app, - int last_subview) -{ +void show_available_subviews(Canvas* canvas, ProtoViewApp* app, int last_subview) { int subview = get_current_subview(app); - if (subview != 0) - canvas_draw_triangle(canvas,120,5,8,5,CanvasDirectionBottomToTop); - if (subview != last_subview-1) - canvas_draw_triangle(canvas,120,59,8,5,CanvasDirectionTopToBottom); + if(subview != 0) canvas_draw_triangle(canvas, 120, 5, 8, 5, CanvasDirectionBottomToTop); + if(subview != last_subview - 1) + canvas_draw_triangle(canvas, 120, 59, 8, 5, CanvasDirectionTopToBottom); } /* Handle up/down keys when we are in a subview. If the function catched * such keypress, it returns true, so that the actual view input callback * knows it can just return ASAP without doing anything. */ -bool process_subview_updown(ProtoViewApp *app, InputEvent input, int last_subview) { +bool process_subview_updown(ProtoViewApp* app, InputEvent input, int last_subview) { int subview = get_current_subview(app); - if (input.type == InputTypePress) { - if (input.key == InputKeyUp) { - if (subview != 0) - app->current_subview[app->current_view]--; + if(input.type == InputTypePress) { + if(input.key == InputKeyUp) { + if(subview != 0) app->current_subview[app->current_view]--; return true; - } else if (input.key == InputKeyDown) { - if (subview != last_subview-1) - app->current_subview[app->current_view]++; + } else if(input.key == InputKeyDown) { + if(subview != last_subview - 1) app->current_subview[app->current_view]++; return true; } } @@ -62,43 +57,37 @@ bool process_subview_updown(ProtoViewApp *app, InputEvent input, int last_subvie * * Note: if the buffer is not a null-termined zero string, what it contains will * be used as initial input for the user. */ -void show_keyboard(ProtoViewApp *app, char *buffer, uint32_t buflen, - void (*done_callback)(void*)) -{ +void show_keyboard(ProtoViewApp* app, char* buffer, uint32_t buflen, void (*done_callback)(void*)) { app->show_text_input = true; app->text_input_buffer = buffer; app->text_input_buffer_len = buflen; app->text_input_done_callback = done_callback; } -void dismiss_keyboard(ProtoViewApp *app) { +void dismiss_keyboard(ProtoViewApp* app) { view_dispatcher_stop(app->view_dispatcher); } /* =========================== Canvas extensions ============================ */ -void canvas_draw_str_with_border(Canvas* canvas, uint8_t x, uint8_t y, const char* str, Color text_color, Color border_color) -{ +void canvas_draw_str_with_border( + Canvas* canvas, + uint8_t x, + uint8_t y, + const char* str, + Color text_color, + Color border_color) { struct { - uint8_t x; uint8_t y; - } dir[8] = { - {-1,-1}, - {0,-1}, - {1,-1}, - {1,0}, - {1,1}, - {0,1}, - {-1,1}, - {-1,0} - }; + uint8_t x; + uint8_t y; + } dir[8] = {{-1, -1}, {0, -1}, {1, -1}, {1, 0}, {1, 1}, {0, 1}, {-1, 1}, {-1, 0}}; /* Rotate in all the directions writing the same string to create a * border, then write the actual string in the other color in the * middle. */ canvas_set_color(canvas, border_color); - for (int j = 0; j < 8; j++) - canvas_draw_str(canvas,x+dir[j].x,y+dir[j].y,str); + for(int j = 0; j < 8; j++) canvas_draw_str(canvas, x + dir[j].x, y + dir[j].y, str); canvas_set_color(canvas, text_color); - canvas_draw_str(canvas,x,y,str); + canvas_draw_str(canvas, x, y, str); canvas_set_color(canvas, ColorBlack); } diff --git a/applications/plugins/protoview/view_direct_sampling.c b/applications/plugins/protoview/view_direct_sampling.c index 251a289b8..1ab90f096 100644 --- a/applications/plugins/protoview/view_direct_sampling.c +++ b/applications/plugins/protoview/view_direct_sampling.c @@ -7,47 +7,46 @@ /* Read directly from the G0 CC1101 pin, and draw a black or white * dot depending on the level. */ -void render_view_direct_sampling(Canvas *const canvas, ProtoViewApp *app) { - if (!app->direct_sampling_enabled) { +void render_view_direct_sampling(Canvas* const canvas, ProtoViewApp* app) { + if(!app->direct_sampling_enabled) { canvas_set_font(canvas, FontSecondary); - canvas_draw_str(canvas,2,9,"Direct sampling is a special"); - canvas_draw_str(canvas,2,18,"mode that displays the signal"); - canvas_draw_str(canvas,2,27,"captured in real time. Like in"); - canvas_draw_str(canvas,2,36,"a old CRT TV. It's very slow."); - canvas_draw_str(canvas,2,45,"Can crash your Flipper."); + canvas_draw_str(canvas, 2, 9, "Direct sampling is a special"); + canvas_draw_str(canvas, 2, 18, "mode that displays the signal"); + canvas_draw_str(canvas, 2, 27, "captured in real time. Like in"); + canvas_draw_str(canvas, 2, 36, "a old CRT TV. It's very slow."); + canvas_draw_str(canvas, 2, 45, "Can crash your Flipper."); canvas_set_font(canvas, FontPrimary); - canvas_draw_str(canvas,14,60,"To enable press OK"); + canvas_draw_str(canvas, 14, 60, "To enable press OK"); return; } - for (int y = 0; y < 64; y++) { - for (int x = 0; x < 128; x++) { + for(int y = 0; y < 64; y++) { + for(int x = 0; x < 128; x++) { bool level = furi_hal_gpio_read(&gpio_cc1101_g0); - if (level) canvas_draw_dot(canvas,x,y); + if(level) canvas_draw_dot(canvas, x, y); /* Busy loop: this is a terrible approach as it blocks * everything else, but for now it's the best we can do * to obtain direct data with some spacing. */ - uint32_t x = 250; while(x--); + uint32_t x = 250; + while(x--) + ; } } canvas_set_font(canvas, FontSecondary); - canvas_draw_str_with_border(canvas,36,60,"Direct sampling", - ColorWhite,ColorBlack); + canvas_draw_str_with_border(canvas, 36, 60, "Direct sampling", ColorWhite, ColorBlack); } /* Handle input */ -void process_input_direct_sampling(ProtoViewApp *app, InputEvent input) { - if (input.type == InputTypePress && input.key == InputKeyOk) { +void process_input_direct_sampling(ProtoViewApp* app, InputEvent input) { + if(input.type == InputTypePress && input.key == InputKeyOk) { app->direct_sampling_enabled = !app->direct_sampling_enabled; } } /* Enter view. Stop the subghz thread to prevent access as we read * the CC1101 data directly. */ -void view_enter_direct_sampling(ProtoViewApp *app) { - if (app->txrx->txrx_state == TxRxStateRx && - !app->txrx->debug_timer_sampling) - { +void view_enter_direct_sampling(ProtoViewApp* app) { + if(app->txrx->txrx_state == TxRxStateRx && !app->txrx->debug_timer_sampling) { subghz_worker_stop(app->txrx->worker); } else { raw_sampling_worker_stop(app); @@ -55,10 +54,8 @@ void view_enter_direct_sampling(ProtoViewApp *app) { } /* Exit view. Restore the subghz thread. */ -void view_exit_direct_sampling(ProtoViewApp *app) { - if (app->txrx->txrx_state == TxRxStateRx && - !app->txrx->debug_timer_sampling) - { +void view_exit_direct_sampling(ProtoViewApp* app) { + if(app->txrx->txrx_state == TxRxStateRx && !app->txrx->debug_timer_sampling) { subghz_worker_start(app->txrx->worker); } else { raw_sampling_worker_start(app); diff --git a/applications/plugins/protoview/view_info.c b/applications/plugins/protoview/view_info.c index b31c62a51..8416fd235 100644 --- a/applications/plugins/protoview/view_info.c +++ b/applications/plugins/protoview/view_info.c @@ -18,11 +18,11 @@ typedef struct { * so that the user can see what they are saving. With left/right * you can move to next rows. Here we store where we are. */ uint32_t signal_display_start_row; - char *filename; + char* filename; } InfoViewPrivData; /* Render the view with the detected message information. */ -static void render_subview_main(Canvas *const canvas, ProtoViewApp *app) { +static void render_subview_main(Canvas* const canvas, ProtoViewApp* app) { /* Protocol name as title. */ canvas_set_font(canvas, FontPrimary); uint8_t y = 8, lineheight = 10; @@ -32,27 +32,35 @@ static void render_subview_main(Canvas *const canvas, ProtoViewApp *app) { /* Info fields. */ char buf[128]; canvas_set_font(canvas, FontSecondary); - if (app->msg_info->raw[0]) { - snprintf(buf,sizeof(buf),"Raw: %s", app->msg_info->raw); + if(app->msg_info->raw[0]) { + snprintf(buf, sizeof(buf), "Raw: %s", app->msg_info->raw); canvas_draw_str(canvas, 0, y, buf); y += lineheight; } - canvas_draw_str(canvas, 0, y, app->msg_info->info1); y += lineheight; - canvas_draw_str(canvas, 0, y, app->msg_info->info2); y += lineheight; - canvas_draw_str(canvas, 0, y, app->msg_info->info3); y += lineheight; - canvas_draw_str(canvas, 0, y, app->msg_info->info4); y += lineheight; + canvas_draw_str(canvas, 0, y, app->msg_info->info1); + y += lineheight; + canvas_draw_str(canvas, 0, y, app->msg_info->info2); + y += lineheight; + canvas_draw_str(canvas, 0, y, app->msg_info->info3); + y += lineheight; + canvas_draw_str(canvas, 0, y, app->msg_info->info4); + y += lineheight; y = 37; lineheight = 7; - canvas_draw_str(canvas, 119, y, "s"); y += lineheight; - canvas_draw_str(canvas, 119, y, "a"); y += lineheight; - canvas_draw_str(canvas, 119, y, "v"); y += lineheight; - canvas_draw_str(canvas, 119, y, "e"); y += lineheight; + canvas_draw_str(canvas, 119, y, "s"); + y += lineheight; + canvas_draw_str(canvas, 119, y, "a"); + y += lineheight; + canvas_draw_str(canvas, 119, y, "v"); + y += lineheight; + canvas_draw_str(canvas, 119, y, "e"); + y += lineheight; } /* Render view with save option. */ -static void render_subview_save(Canvas *const canvas, ProtoViewApp *app) { - InfoViewPrivData *privdata = app->view_privdata; +static void render_subview_save(Canvas* const canvas, ProtoViewApp* app) { + InfoViewPrivData* privdata = app->view_privdata; /* Display our signal in digital form: here we don't show the * signal with the exact timing of the received samples, but as it @@ -61,21 +69,20 @@ static void render_subview_save(Canvas *const canvas, ProtoViewApp *app) { uint8_t rowheight = 11; uint8_t bitwidth = 4; uint8_t bitheight = 5; - uint32_t idx = privdata->signal_display_start_row * (128/4); + uint32_t idx = privdata->signal_display_start_row * (128 / 4); bool prevbit = false; - for (uint8_t y = bitheight+12; y <= rows*rowheight; y += rowheight) { - for (uint8_t x = 0; x < 128; x += 4) { - bool bit = bitmap_get(app->msg_info->bits, - app->msg_info->bits_bytes,idx); - uint8_t prevy = y + prevbit*(bitheight*-1) - 1; - uint8_t thisy = y + bit*(bitheight*-1) - 1; - canvas_draw_line(canvas,x,prevy,x,thisy); - canvas_draw_line(canvas,x,thisy,x+bitwidth-1,thisy); + for(uint8_t y = bitheight + 12; y <= rows * rowheight; y += rowheight) { + for(uint8_t x = 0; x < 128; x += 4) { + bool bit = bitmap_get(app->msg_info->bits, app->msg_info->bits_bytes, idx); + uint8_t prevy = y + prevbit * (bitheight * -1) - 1; + uint8_t thisy = y + bit * (bitheight * -1) - 1; + canvas_draw_line(canvas, x, prevy, x, thisy); + canvas_draw_line(canvas, x, thisy, x + bitwidth - 1, thisy); prevbit = bit; - if (idx >= app->msg_info->pulses_count) { + if(idx >= app->msg_info->pulses_count) { canvas_set_color(canvas, ColorWhite); - canvas_draw_dot(canvas, x+1,thisy); - canvas_draw_dot(canvas, x+3,thisy); + canvas_draw_dot(canvas, x + 1, thisy); + canvas_draw_dot(canvas, x + 3, thisy); canvas_set_color(canvas, ColorBlack); } idx++; // Draw next bit @@ -87,28 +94,32 @@ static void render_subview_save(Canvas *const canvas, ProtoViewApp *app) { } /* Render the selected subview of this view. */ -void render_view_info(Canvas *const canvas, ProtoViewApp *app) { - if (app->signal_decoded == false) { +void render_view_info(Canvas* const canvas, ProtoViewApp* app) { + if(app->signal_decoded == false) { canvas_set_font(canvas, FontSecondary); - canvas_draw_str(canvas, 30,36,"No signal decoded"); + canvas_draw_str(canvas, 30, 36, "No signal decoded"); return; } - show_available_subviews(canvas,app,SubViewInfoLast); + show_available_subviews(canvas, app, SubViewInfoLast); switch(app->current_subview[app->current_view]) { - case SubViewInfoMain: render_subview_main(canvas,app); break; - case SubViewInfoSave: render_subview_save(canvas,app); break; + case SubViewInfoMain: + render_subview_main(canvas, app); + break; + case SubViewInfoSave: + render_subview_save(canvas, app); + break; } } /* The user typed the file name. Let's save it and remove the keyboard * view. */ void text_input_done_callback(void* context) { - ProtoViewApp *app = context; - InfoViewPrivData *privdata = app->view_privdata; + ProtoViewApp* app = context; + InfoViewPrivData* privdata = app->view_privdata; - FuriString *save_path = furi_string_alloc_printf( - "%s/%s.sub", EXT_PATH("subghz"), privdata->filename); + FuriString* save_path = + furi_string_alloc_printf("%s/%s.sub", EXT_PATH("subghz"), privdata->filename); save_signal(app, furi_string_get_cstr(save_path)); furi_string_free(save_path); @@ -118,48 +129,46 @@ void text_input_done_callback(void* context) { /* Replace all the occurrences of character c1 with c2 in the specified * string. */ -void str_replace(char *buf, char c1, char c2) { - char *p = buf; +void str_replace(char* buf, char c1, char c2) { + char* p = buf; while(*p) { - if (*p == c1) *p = c2; + if(*p == c1) *p = c2; p++; } } /* Set a random filename the user can edit. */ -void set_signal_random_filename(ProtoViewApp *app, char *buf, size_t buflen) { +void set_signal_random_filename(ProtoViewApp* app, char* buf, size_t buflen) { char suffix[6]; - set_random_name(suffix,sizeof(suffix)); - snprintf(buf,buflen,"%.10s-%s-%d",app->msg_info->name,suffix,rand()%1000); - str_replace(buf,' ','_'); - str_replace(buf,'-','_'); - str_replace(buf,'/','_'); + set_random_name(suffix, sizeof(suffix)); + snprintf(buf, buflen, "%.10s-%s-%d", app->msg_info->name, suffix, rand() % 1000); + str_replace(buf, ' ', '_'); + str_replace(buf, '-', '_'); + str_replace(buf, '/', '_'); } /* Handle input for the info view. */ -void process_input_info(ProtoViewApp *app, InputEvent input) { - if (process_subview_updown(app,input,SubViewInfoLast)) return; - InfoViewPrivData *privdata = app->view_privdata; +void process_input_info(ProtoViewApp* app, InputEvent input) { + if(process_subview_updown(app, input, SubViewInfoLast)) return; + InfoViewPrivData* privdata = app->view_privdata; int subview = get_current_subview(app); /* Main subview. */ - if (subview == SubViewInfoMain) { - if (input.type == InputTypeShort && input.key == InputKeyOk) { + if(subview == SubViewInfoMain) { + if(input.type == InputTypeShort && input.key == InputKeyOk) { /* Reset the current sample to capture the next. */ reset_current_signal(app); } - } else if (subview == SubViewInfoSave) { - /* Save subview. */ - if (input.type == InputTypePress && input.key == InputKeyRight) { + } else if(subview == SubViewInfoSave) { + /* Save subview. */ + if(input.type == InputTypePress && input.key == InputKeyRight) { privdata->signal_display_start_row++; - } else if (input.type == InputTypePress && input.key == InputKeyLeft) { - if (privdata->signal_display_start_row != 0) - privdata->signal_display_start_row--; - } else if (input.type == InputTypePress && input.key == InputKeyOk) { + } else if(input.type == InputTypePress && input.key == InputKeyLeft) { + if(privdata->signal_display_start_row != 0) privdata->signal_display_start_row--; + } else if(input.type == InputTypePress && input.key == InputKeyOk) { privdata->filename = malloc(SAVE_FILENAME_LEN); - set_signal_random_filename(app,privdata->filename,SAVE_FILENAME_LEN); - show_keyboard(app, privdata->filename, SAVE_FILENAME_LEN, - text_input_done_callback); + set_signal_random_filename(app, privdata->filename, SAVE_FILENAME_LEN); + show_keyboard(app, privdata->filename, SAVE_FILENAME_LEN, text_input_done_callback); } } } diff --git a/applications/plugins/protoview/view_raw_signal.c b/applications/plugins/protoview/view_raw_signal.c index 3c4fc3ae6..019aad7c8 100644 --- a/applications/plugins/protoview/view_raw_signal.c +++ b/applications/plugins/protoview/view_raw_signal.c @@ -12,7 +12,7 @@ * * The 'idx' argument is the first sample to render in the circular * buffer. */ -void render_signal(ProtoViewApp *app, Canvas *const canvas, RawSamplesBuffer *buf, uint32_t idx) { +void render_signal(ProtoViewApp* app, Canvas* const canvas, RawSamplesBuffer* buf, uint32_t idx) { canvas_set_color(canvas, ColorBlack); int rows = 8; @@ -20,31 +20,29 @@ void render_signal(ProtoViewApp *app, Canvas *const canvas, RawSamplesBuffer *bu uint32_t start_idx = idx; bool level = 0; uint32_t dur = 0, sample_num = 0; - for (int row = 0; row < rows ; row++) { - for (int x = 0; x < 128; x++) { - int y = 3 + row*8; - if (dur < time_per_pixel/2) { + for(int row = 0; row < rows; row++) { + for(int x = 0; x < 128; x++) { + int y = 3 + row * 8; + if(dur < time_per_pixel / 2) { /* Get more data. */ raw_samples_get(buf, idx++, &level, &dur); sample_num++; } - canvas_draw_line(canvas, x,y,x,y-(level*3)); + canvas_draw_line(canvas, x, y, x, y - (level * 3)); /* Write a small triangle under the last sample detected. */ - if (app->signal_bestlen != 0 && - sample_num+start_idx == app->signal_bestlen+1) - { - canvas_draw_dot(canvas,x,y+2); - canvas_draw_dot(canvas,x-1,y+3); - canvas_draw_dot(canvas,x,y+3); - canvas_draw_dot(canvas,x+1,y+3); + if(app->signal_bestlen != 0 && sample_num + start_idx == app->signal_bestlen + 1) { + canvas_draw_dot(canvas, x, y + 2); + canvas_draw_dot(canvas, x - 1, y + 3); + canvas_draw_dot(canvas, x, y + 3); + canvas_draw_dot(canvas, x + 1, y + 3); sample_num++; /* Make sure we don't mark the next, too. */ } /* Remove from the current level duration the time we * just plot. */ - if (dur > time_per_pixel) + if(dur > time_per_pixel) dur -= time_per_pixel; else dur = 0; @@ -53,45 +51,46 @@ void render_signal(ProtoViewApp *app, Canvas *const canvas, RawSamplesBuffer *bu } /* Raw pulses rendering. This is our default view. */ -void render_view_raw_pulses(Canvas *const canvas, ProtoViewApp *app) { +void render_view_raw_pulses(Canvas* const canvas, ProtoViewApp* app) { /* Show signal. */ render_signal(app, canvas, DetectedSamples, app->signal_offset); /* Show signal information. */ char buf[64]; - snprintf(buf,sizeof(buf),"%luus", - (unsigned long)DetectedSamples->short_pulse_dur); + snprintf(buf, sizeof(buf), "%luus", (unsigned long)DetectedSamples->short_pulse_dur); canvas_set_font(canvas, FontSecondary); canvas_draw_str_with_border(canvas, 97, 63, buf, ColorWhite, ColorBlack); - if (app->signal_decoded) { + if(app->signal_decoded) { canvas_set_font(canvas, FontPrimary); canvas_draw_str_with_border(canvas, 1, 61, app->msg_info->name, ColorWhite, ColorBlack); } } /* Handle input for the raw pulses view. */ -void process_input_raw_pulses(ProtoViewApp *app, InputEvent input) { - if (input.type == InputTypeRepeat) { +void process_input_raw_pulses(ProtoViewApp* app, InputEvent input) { + if(input.type == InputTypeRepeat) { /* Handle panning of the signal window. Long pressing * right will show successive samples, long pressing left * previous samples. */ - if (input.key == InputKeyRight) app->signal_offset++; - else if (input.key == InputKeyLeft) app->signal_offset--; - else if (input.key == InputKeyOk) { + if(input.key == InputKeyRight) + app->signal_offset++; + else if(input.key == InputKeyLeft) + app->signal_offset--; + else if(input.key == InputKeyOk) { app->signal_offset = 0; app->us_scale = PROTOVIEW_RAW_VIEW_DEFAULT_SCALE; } - } else if (input.type == InputTypeShort) { - if (input.key == InputKeyOk) { + } else if(input.type == InputTypeShort) { + if(input.key == InputKeyOk) { /* Reset the current sample to capture the next. */ reset_current_signal(app); - } else if (input.key == InputKeyDown) { + } else if(input.key == InputKeyDown) { /* Rescaling. The set becomes finer under 50us per pixel. */ uint32_t scale_step = app->us_scale >= 50 ? 50 : 10; - if (app->us_scale < 500) app->us_scale += scale_step; - } else if (input.key == InputKeyUp) { + if(app->us_scale < 500) app->us_scale += scale_step; + } else if(input.key == InputKeyUp) { uint32_t scale_step = app->us_scale > 50 ? 50 : 10; - if (app->us_scale > 10) app->us_scale -= scale_step; + if(app->us_scale > 10) app->us_scale -= scale_step; } } } diff --git a/applications/plugins/protoview/view_settings.c b/applications/plugins/protoview/view_settings.c index 1e2dce226..09abf5a2a 100644 --- a/applications/plugins/protoview/view_settings.c +++ b/applications/plugins/protoview/view_settings.c @@ -6,30 +6,30 @@ /* Renders a single view with frequency and modulation setting. However * this are logically two different views, and only one of the settings * will be highlighted. */ -void render_view_settings(Canvas *const canvas, ProtoViewApp *app) { +void render_view_settings(Canvas* const canvas, ProtoViewApp* app) { canvas_set_font(canvas, FontPrimary); - if (app->current_view == ViewFrequencySettings) - canvas_draw_str_with_border(canvas,1,10,"Frequency",ColorWhite,ColorBlack); + if(app->current_view == ViewFrequencySettings) + canvas_draw_str_with_border(canvas, 1, 10, "Frequency", ColorWhite, ColorBlack); else - canvas_draw_str(canvas,1,10,"Frequency"); + canvas_draw_str(canvas, 1, 10, "Frequency"); - if (app->current_view == ViewModulationSettings) - canvas_draw_str_with_border(canvas,70,10,"Modulation",ColorWhite,ColorBlack); + if(app->current_view == ViewModulationSettings) + canvas_draw_str_with_border(canvas, 70, 10, "Modulation", ColorWhite, ColorBlack); else - canvas_draw_str(canvas,70,10,"Modulation"); + canvas_draw_str(canvas, 70, 10, "Modulation"); canvas_set_font(canvas, FontSecondary); - canvas_draw_str(canvas,10,61,"Use up and down to modify"); + canvas_draw_str(canvas, 10, 61, "Use up and down to modify"); - if (app->txrx->debug_timer_sampling) - canvas_draw_str(canvas,3,52,"(DEBUG timer sampling is ON)"); + if(app->txrx->debug_timer_sampling) + canvas_draw_str(canvas, 3, 52, "(DEBUG timer sampling is ON)"); /* Show frequency. We can use big numbers font since it's just a number. */ - if (app->current_view == ViewFrequencySettings) { + if(app->current_view == ViewFrequencySettings) { char buf[16]; - snprintf(buf,sizeof(buf),"%.2f",(double)app->frequency/1000000); + snprintf(buf, sizeof(buf), "%.2f", (double)app->frequency / 1000000); canvas_set_font(canvas, FontBigNumbers); canvas_draw_str(canvas, 30, 40, buf); - } else if (app->current_view == ViewModulationSettings) { + } else if(app->current_view == ViewModulationSettings) { int current = app->modulation; canvas_set_font(canvas, FontPrimary); canvas_draw_str(canvas, 33, 39, ProtoViewModulations[current].name); @@ -37,13 +37,13 @@ void render_view_settings(Canvas *const canvas, ProtoViewApp *app) { } /* Handle input for the settings view. */ -void process_input_settings(ProtoViewApp *app, InputEvent input) { - if (input.type == InputTypeLong && input.key == InputKeyOk) { +void process_input_settings(ProtoViewApp* app, InputEvent input) { + if(input.type == InputTypeLong && input.key == InputKeyOk) { /* Long pressing to OK sets the default frequency and * modulation. */ app->frequency = subghz_setting_get_default_frequency(app->setting); app->modulation = 0; - } else if (0 && input.type == InputTypeLong && input.key == InputKeyDown) { + } else if(0 && input.type == InputTypeLong && input.key == InputKeyDown) { /* Long pressing to down switches between normal and debug * timer sampling mode. NOTE: this feature is disabled for users, * only useful for devs (if useful at all). */ @@ -55,42 +55,40 @@ void process_input_settings(ProtoViewApp *app, InputEvent input) { app->txrx->debug_timer_sampling = !app->txrx->debug_timer_sampling; radio_begin(app); radio_rx(app); - } else if (input.type == InputTypePress && - (input.key != InputKeyDown || input.key != InputKeyUp)) - { + } else if(input.type == InputTypePress && (input.key != InputKeyDown || input.key != InputKeyUp)) { /* Handle up and down to change frequency or modulation. */ - if (app->current_view == ViewFrequencySettings) { + if(app->current_view == ViewFrequencySettings) { size_t curidx = 0, i; size_t count = subghz_setting_get_frequency_count(app->setting); /* Scan the list of frequencies to check for the index of the * currently set frequency. */ for(i = 0; i < count; i++) { - uint32_t freq = subghz_setting_get_frequency(app->setting,i); - if (freq == app->frequency) { + uint32_t freq = subghz_setting_get_frequency(app->setting, i); + if(freq == app->frequency) { curidx = i; break; } } - if (i == count) return; /* Should never happen. */ + if(i == count) return; /* Should never happen. */ - if (input.key == InputKeyUp) { - curidx = curidx == 0 ? count-1 : curidx-1; - } else if (input.key == InputKeyDown) { - curidx = (curidx+1) % count; + if(input.key == InputKeyUp) { + curidx = curidx == 0 ? count - 1 : curidx - 1; + } else if(input.key == InputKeyDown) { + curidx = (curidx + 1) % count; } else { return; } - app->frequency = subghz_setting_get_frequency(app->setting,curidx); - } else if (app->current_view == ViewModulationSettings) { + app->frequency = subghz_setting_get_frequency(app->setting, curidx); + } else if(app->current_view == ViewModulationSettings) { uint32_t count = 0; uint32_t modid = app->modulation; while(ProtoViewModulations[count].name != NULL) count++; - if (input.key == InputKeyUp) { - modid = modid == 0 ? count-1 : modid-1; - } else if (input.key == InputKeyDown) { - modid = (modid+1) % count; + if(input.key == InputKeyUp) { + modid = modid == 0 ? count - 1 : modid - 1; + } else if(input.key == InputKeyDown) { + modid = (modid + 1) % count; } else { return; } @@ -106,9 +104,13 @@ void process_input_settings(ProtoViewApp *app, InputEvent input) { /* When the user switches to some other view, if they changed the parameters * we need to restart the radio with the right frequency and modulation. */ -void view_exit_settings(ProtoViewApp *app) { - if (app->txrx->freq_mod_changed) { - FURI_LOG_E(TAG, "Setting view, setting frequency/modulation to %lu %s", app->frequency, ProtoViewModulations[app->modulation].name); +void view_exit_settings(ProtoViewApp* app) { + if(app->txrx->freq_mod_changed) { + FURI_LOG_E( + TAG, + "Setting view, setting frequency/modulation to %lu %s", + app->frequency, + ProtoViewModulations[app->modulation].name); radio_rx_end(app); radio_begin(app); radio_rx(app); diff --git a/applications/plugins/text_viewer/text_viewer.c b/applications/plugins/text_viewer/text_viewer.c index 6c7b46579..59923adb9 100644 --- a/applications/plugins/text_viewer/text_viewer.c +++ b/applications/plugins/text_viewer/text_viewer.c @@ -228,14 +228,16 @@ int32_t text_viewer_app(void* p) { if(input.key == InputKeyBack) { break; } else if(input.key == InputKeyUp) { - furi_check(furi_mutex_acquire(text_viewer->mutex, FuriWaitForever) == FuriStatusOk); + furi_check( + furi_mutex_acquire(text_viewer->mutex, FuriWaitForever) == FuriStatusOk); if(text_viewer->model->file_offset > 0) { text_viewer->model->file_offset -= TEXT_VIEWER_BYTES_PER_LINE; if(!text_viewer_read_file(text_viewer)) break; } furi_mutex_release(text_viewer->mutex); } else if(input.key == InputKeyDown) { - furi_check(furi_mutex_acquire(text_viewer->mutex, FuriWaitForever) == FuriStatusOk); + furi_check( + furi_mutex_acquire(text_viewer->mutex, FuriWaitForever) == FuriStatusOk); uint32_t last_byte_on_screen = text_viewer->model->file_offset + text_viewer->model->file_read_bytes; @@ -245,7 +247,8 @@ int32_t text_viewer_app(void* p) { } furi_mutex_release(text_viewer->mutex); } else if(input.key == InputKeyLeft) { - furi_check(furi_mutex_acquire(text_viewer->mutex, FuriWaitForever) == FuriStatusOk); + furi_check( + furi_mutex_acquire(text_viewer->mutex, FuriWaitForever) == FuriStatusOk); text_viewer->model->mode = !text_viewer->model->mode; furi_mutex_release(text_viewer->mutex); } else if(input.key == InputKeyRight) { diff --git a/applications/plugins/unitemp/Sensors.c b/applications/plugins/unitemp/Sensors.c index 7945c73ff..2b1eaf6bf 100644 --- a/applications/plugins/unitemp/Sensors.c +++ b/applications/plugins/unitemp/Sensors.c @@ -66,9 +66,14 @@ const Interface ONE_WIRE = { .allocator = unitemp_onewire_sensor_alloc, .mem_releaser = unitemp_onewire_sensor_free, .updater = unitemp_onewire_sensor_update}; +const Interface SPI = { + .name = "SPI", + .allocator = unitemp_spi_sensor_alloc, + .mem_releaser = unitemp_spi_sensor_free, + .updater = unitemp_spi_sensor_update}; //Перечень интерфейсов подключения -//static const Interface* interfaces[] = {&SINGLE_WIRE, &I2C, &ONE_WIRE}; +//static const Interface* interfaces[] = {&SINGLE_WIRE, &I2C, &ONE_WIRE, &SPI}; //Перечень датчиков static const SensorType* sensorTypes[] = { &DHT11, @@ -87,7 +92,8 @@ static const SensorType* sensorTypes[] = { &HDC1080, &BMP180, &BMP280, - &BME280}; + &BME280, + &MAX31855}; const SensorType* unitemp_sensors_getTypeFromInt(uint8_t index) { if(index > SENSOR_TYPES_COUNT) return NULL; @@ -166,7 +172,7 @@ uint8_t unitemp_gpio_getAviablePortsCount(const Interface* interface, const GPIO } //Проверка для single wire - if(interface == &SINGLE_WIRE) { + if(interface == &SINGLE_WIRE || interface == &SPI) { if(gpio_interfaces_list[i] == NULL || (unitemp_gpio_getFromIndex(i) == extraport)) { aviable_ports_count++; } @@ -205,6 +211,13 @@ const GPIO* return NULL; } } + if(interface == &SPI) { + if(!((gpio_interfaces_list[0] == NULL || gpio_interfaces_list[0] == &SPI) && + (gpio_interfaces_list[1] == NULL || gpio_interfaces_list[1] == &SPI) && + (gpio_interfaces_list[3] == NULL || gpio_interfaces_list[3] == &SPI))) { + return NULL; + } + } uint8_t aviable_index = 0; for(uint8_t i = 0; i < GPIO_ITEMS; i++) { @@ -222,7 +235,7 @@ const GPIO* } } //Проверка для single wire - if(interface == &SINGLE_WIRE) { + if(interface == &SINGLE_WIRE || interface == &SPI) { if(gpio_interfaces_list[i] == NULL || unitemp_gpio_getFromIndex(i) == extraport) { if(aviable_index == index) { return unitemp_gpio_getFromIndex(i); @@ -435,6 +448,11 @@ bool unitemp_sensors_save(void) { stream_write_format( app->file_stream, "%d\n", unitemp_singlewire_sensorGetGPIO(sensor)->num); } + if(sensor->type->interface == &SPI) { + uint8_t gpio_num = ((SPISensor*)sensor->instance)->CS_pin->num; + stream_write_format(app->file_stream, "%d\n", gpio_num); + } + if(sensor->type->interface == &I2C) { stream_write_format( app->file_stream, "%X\n", ((I2CSensor*)sensor->instance)->currentI2CAdr); @@ -512,7 +530,7 @@ Sensor* unitemp_sensor_alloc(char* name, const SensorType* type, char* args) { //Выход если датчик успешно развёрнут if(status) { - FURI_LOG_I(APP_NAME, "Sensor %s allocated", name); + UNITEMP_DEBUG("Sensor %s allocated", name); return sensor; } //Выход с очисткой если память для датчика не была выделена @@ -545,7 +563,6 @@ void unitemp_sensor_free(Sensor* sensor) { FURI_LOG_E(APP_NAME, "Sensor %s memory is not released", sensor->name); } free(sensor->name); - //free(sensor); } void unitemp_sensors_free(void) { @@ -573,7 +590,7 @@ bool unitemp_sensors_init(void) { app->sensors[i]->name); result = false; } - UNITEMP_DEBUG("Sensor %s successfully initialized", app->sensors[i]->name); + FURI_LOG_I(APP_NAME, "Sensor %s successfully initialized", app->sensors[i]->name); } app->sensors_ready = true; return result; diff --git a/applications/plugins/unitemp/Sensors.h b/applications/plugins/unitemp/Sensors.h index 2a7741cfd..3e4152e33 100644 --- a/applications/plugins/unitemp/Sensors.h +++ b/applications/plugins/unitemp/Sensors.h @@ -136,7 +136,7 @@ typedef struct Sensor { extern const Interface SINGLE_WIRE; //Собственный однопроводной протокол датчиков DHTXX и AM23XX extern const Interface ONE_WIRE; //Однопроводной протокол Dallas extern const Interface I2C; //I2C_2 (PC0, PC1) -//extern const Interface SPI; +extern const Interface SPI; //SPI_1 (MOSI - 2, MISO - 3, CS - 4, SCK - 5) /* ============================= Датчик(и) ============================= */ /** @@ -326,4 +326,5 @@ const GPIO* #include "./sensors/BMP180.h" #include "./sensors/HTU21x.h" #include "./sensors/HDC1080.h" +#include "./sensors/MAX31855.h" #endif diff --git a/applications/plugins/unitemp/interfaces/SPISensor.c b/applications/plugins/unitemp/interfaces/SPISensor.c new file mode 100644 index 000000000..b53aed28d --- /dev/null +++ b/applications/plugins/unitemp/interfaces/SPISensor.c @@ -0,0 +1,89 @@ +/* + Unitemp - Universal temperature reader + Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include "SPISensor.h" + +static uint8_t sensors_count = 0; + +bool unitemp_spi_sensor_alloc(Sensor* sensor, char* args) { + if(args == NULL) return false; + + //Создание инстанса датчика SPI + SPISensor* instance = malloc(sizeof(SPISensor)); + if(instance == NULL) { + FURI_LOG_E(APP_NAME, "Sensor %s instance allocation error", sensor->name); + return false; + } + sensor->instance = instance; + + //Определение GPIO chip select + int gpio = 255; + sscanf(args, "%d", &gpio); + instance->CS_pin = unitemp_gpio_getFromInt(gpio); + if(instance->CS_pin == NULL) { + FURI_LOG_E(APP_NAME, "Sensor %s GPIO setting error", sensor->name); + free(instance); + return false; + } + + instance->spi = malloc(sizeof(FuriHalSpiBusHandle)); + memcpy(instance->spi, &furi_hal_spi_bus_handle_external, sizeof(FuriHalSpiBusHandle)); + + instance->spi->cs = instance->CS_pin->pin; + + bool status = sensor->type->allocator(sensor, args); + + //Блокировка портов GPIO + sensors_count++; + unitemp_gpio_lock(unitemp_gpio_getFromInt(2), &SPI); + unitemp_gpio_lock(unitemp_gpio_getFromInt(3), &SPI); + unitemp_gpio_lock(unitemp_gpio_getFromInt(5), &SPI); + unitemp_gpio_lock(instance->CS_pin, &SPI); + return status; +} + +bool unitemp_spi_sensor_free(Sensor* sensor) { + bool status = sensor->type->mem_releaser(sensor); + unitemp_gpio_unlock(((SPISensor*)sensor->instance)->CS_pin); + free(((SPISensor*)(sensor->instance))->spi); + free(sensor->instance); + + if(--sensors_count == 0) { + unitemp_gpio_unlock(unitemp_gpio_getFromInt(2)); + unitemp_gpio_unlock(unitemp_gpio_getFromInt(3)); + unitemp_gpio_unlock(unitemp_gpio_getFromInt(5)); + } + + return status; +} + +bool unitemp_spi_sensor_init(Sensor* sensor) { + return sensor->type->initializer(sensor); +} + +bool unitemp_spi_sensor_deinit(Sensor* sensor) { + UNUSED(sensor); + + return true; +} + +UnitempStatus unitemp_spi_sensor_update(Sensor* sensor) { + return sensor->type->updater(sensor); +} \ No newline at end of file diff --git a/applications/plugins/unitemp/interfaces/SPISensor.h b/applications/plugins/unitemp/interfaces/SPISensor.h new file mode 100644 index 000000000..40f284b04 --- /dev/null +++ b/applications/plugins/unitemp/interfaces/SPISensor.h @@ -0,0 +1,66 @@ +/* + Unitemp - Universal temperature reader + Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +#ifndef UNITEMP_SPI +#define UNITEMP_SPI + +#include "../unitemp.h" +#include + +//Структура SPI датчика +typedef struct SPISensor { + //Указатель на интерфейс SPI + FuriHalSpiBusHandle* spi; + //Порт подключения CS + const GPIO* CS_pin; +} SPISensor; + +/** + * @brief Выделение памяти для датчика с интерфейсом SPI + * @param sensor Указатель на датчик + * @param args Указатель на массив аргументов с параметрами датчика + * @return Истина если всё ок + */ +bool unitemp_spi_sensor_alloc(Sensor* sensor, char* args); + +/** + * @brief Высвобождение памяти инстанса датчика + * @param sensor Указатель на датчик + */ +bool unitemp_spi_sensor_free(Sensor* sensor); + +/** + * @brief Инициализации датчика с интерфейсом one wire + * @param sensor Указатель на датчик + * @return Истина если инициализация упспешная + */ +bool unitemp_spi_sensor_init(Sensor* sensor); + +/** + * @brief Деинициализация датчика + * @param sensor Указатель на датчик + */ +bool unitemp_spi_sensor_deinit(Sensor* sensor); + +/** + * @brief Обновить значение с датчка + * @param sensor Указатель на датчик + * @return Статус обновления + */ +UnitempStatus unitemp_spi_sensor_update(Sensor* sensor); + +#endif \ No newline at end of file diff --git a/applications/plugins/unitemp/sensors/MAX31855.c b/applications/plugins/unitemp/sensors/MAX31855.c new file mode 100644 index 000000000..2411eb09e --- /dev/null +++ b/applications/plugins/unitemp/sensors/MAX31855.c @@ -0,0 +1,93 @@ +/* + Unitemp - Universal temperature reader + Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +#include "MAX31855.h" + +const SensorType MAX31855 = { + .typename = "MAX31855", + .altname = "MAX31855 (Thermocouple)", + .interface = &SPI, + .datatype = UT_TEMPERATURE, + .pollingInterval = 500, + .allocator = unitemp_MAX31855_alloc, + .mem_releaser = unitemp_MAX31855_free, + .initializer = unitemp_MAX31855_init, + .deinitializer = unitemp_MAX31855_deinit, + .updater = unitemp_MAX31855_update}; + +bool unitemp_MAX31855_alloc(Sensor* sensor, char* args) { + UNUSED(sensor); + UNUSED(args); + return true; +} + +bool unitemp_MAX31855_free(Sensor* sensor) { + UNUSED(sensor); + return true; +} + +bool unitemp_MAX31855_init(Sensor* sensor) { + SPISensor* instance = sensor->instance; + furi_hal_spi_bus_handle_init(instance->spi); + UNUSED(instance); + return true; +} + +bool unitemp_MAX31855_deinit(Sensor* sensor) { + UNUSED(sensor); + return true; +} + +UnitempStatus unitemp_MAX31855_update(Sensor* sensor) { + SPISensor* instance = sensor->instance; + + furi_hal_spi_acquire(instance->spi); + furi_hal_gpio_write(instance->CS_pin->pin, false); + + uint8_t buff[4] = {0}; + + furi_hal_spi_bus_rx(instance->spi, buff, 4, 0xFF); + furi_hal_spi_release(instance->spi); + + uint32_t raw = (buff[0] << 24) | (buff[1] << 16) | (buff[2] << 8) | buff[3]; + + if(raw == 0xFFFFFFFF || raw == 0) return UT_SENSORSTATUS_TIMEOUT; + + //Определение состояния термопары + uint8_t state = raw & 0b111; + //Обрыв + if(state == 0x01) { + UNITEMP_DEBUG("%s has thermocouple open circuit", sensor->name); + return UT_SENSORSTATUS_ERROR; + } + //Короткое замыкание к земле + if(state == 0x02) { + UNITEMP_DEBUG("%s has thermocouple short to GND", sensor->name); + return UT_SENSORSTATUS_ERROR; + } + //Короткое замыкание к питанию + if(state == 0x04) { + UNITEMP_DEBUG("%s has thermocouple short to VCC", sensor->name); + return UT_SENSORSTATUS_ERROR; + } + + raw = (raw >> 16) & 0xFFFC; + + sensor->temp = (int16_t)(raw) / 16.0f; + + return UT_SENSORSTATUS_OK; +} diff --git a/applications/plugins/unitemp/sensors/MAX31855.h b/applications/plugins/unitemp/sensors/MAX31855.h new file mode 100644 index 000000000..d63c39885 --- /dev/null +++ b/applications/plugins/unitemp/sensors/MAX31855.h @@ -0,0 +1,65 @@ +/* + Unitemp - Universal temperature reader + Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +#ifndef UNITEMP_MAX31855 +#define UNITEMP_MAX31855 + +#include "../unitemp.h" +#include "../Sensors.h" +#include "../interfaces/SPISensor.h" + +extern const SensorType MAX31855; + +/** + * @brief Выделение памяти и установка начальных значений датчика MAX31855 + * + * @param sensor Указатель на создаваемый датчик + * @return Истина при успехе + */ +bool unitemp_MAX31855_alloc(Sensor* sensor, char* args); + +/** + * @brief Инициализации датчика MAX31855 + * + * @param sensor Указатель на датчик + * @return Истина если инициализация упспешная + */ +bool unitemp_MAX31855_init(Sensor* sensor); + +/** + * @brief Деинициализация датчика + * + * @param sensor Указатель на датчик + */ +bool unitemp_MAX31855_deinit(Sensor* sensor); + +/** + * @brief Обновление значений из датчика + * + * @param sensor Указатель на датчик + * @return Статус обновления + */ +UnitempStatus unitemp_MAX31855_update(Sensor* sensor); + +/** + * @brief Высвободить память датчика + * + * @param sensor Указатель на датчик + */ +bool unitemp_MAX31855_free(Sensor* sensor); + +#endif \ No newline at end of file diff --git a/applications/plugins/unitemp/views/General_view.c b/applications/plugins/unitemp/views/General_view.c index 7ab0c2180..dcf8420d9 100644 --- a/applications/plugins/unitemp/views/General_view.c +++ b/applications/plugins/unitemp/views/General_view.c @@ -76,7 +76,7 @@ static void _draw_temperature(Canvas* canvas, Sensor* sensor, uint8_t x, uint8_t app->buff[0] = '-'; offset = 1; } - snprintf((char*)(app->buff + offset), BUFF_SIZE, "%d", (int8_t)sensor->temp); + snprintf((char*)(app->buff + offset), BUFF_SIZE, "%d", (int16_t)sensor->temp); canvas_set_font(canvas, FontBigNumbers); canvas_draw_str_aligned( canvas, @@ -237,6 +237,7 @@ static void _draw_carousel_values(Canvas* canvas) { canvas_draw_icon(canvas, 34, 23, frames[furi_get_tick() % 2250 / 750]); canvas_set_font(canvas, FontSecondary); + //TODO: Оптимизировать эту срань if(unitemp_sensor_getActive(generalview_sensor_index)->type->interface == &SINGLE_WIRE) { snprintf( app->buff, @@ -256,6 +257,9 @@ static void _draw_carousel_values(Canvas* canvas) { if(unitemp_sensor_getActive(generalview_sensor_index)->type->interface == &I2C) { snprintf(app->buff, BUFF_SIZE, "Waiting for module on I2C pins"); } + if(unitemp_sensor_getActive(generalview_sensor_index)->type->interface == &SPI) { + snprintf(app->buff, BUFF_SIZE, "Waiting for module on SPI pins"); + } canvas_draw_str_aligned(canvas, 64, 19, AlignCenter, AlignCenter, app->buff); return; } @@ -304,6 +308,8 @@ static void _draw_carousel_values(Canvas* canvas) { break; } } + +//TODO: Оптимизировать вывод информации static void _draw_carousel_info(Canvas* canvas) { canvas_set_font(canvas, FontPrimary); canvas_draw_str(canvas, 10, 23, "Type:"); @@ -351,6 +357,25 @@ static void _draw_carousel_info(Canvas* canvas) { ->gpio->name); } + if(unitemp_sensor_getActive(generalview_sensor_index)->type->interface == &SPI) { + canvas_set_font(canvas, FontPrimary); + canvas_draw_str(canvas, 10, 35, "MISO pin:"); + canvas_draw_str(canvas, 10, 46, "CS pin:"); + canvas_draw_str(canvas, 10, 58, "SCK pin:"); + + canvas_set_font(canvas, FontSecondary); + canvas_draw_str( + canvas, 41, 23, unitemp_sensor_getActive(generalview_sensor_index)->type->typename); + canvas_draw_str(canvas, 60, 35, unitemp_gpio_getFromInt(3)->name); + canvas_draw_str( + canvas, + 47, + 46, + ((SPISensor*)unitemp_sensor_getActive(generalview_sensor_index)->instance) + ->CS_pin->name); + canvas_draw_str(canvas, 54, 58, unitemp_gpio_getFromInt(5)->name); + } + if(unitemp_sensor_getActive(generalview_sensor_index)->type->interface == &I2C) { canvas_set_font(canvas, FontPrimary); canvas_draw_str(canvas, 10, 35, "I2C addr:"); diff --git a/applications/plugins/unitemp/views/SensorEdit_view.c b/applications/plugins/unitemp/views/SensorEdit_view.c index 49732da2d..ccb07a48e 100644 --- a/applications/plugins/unitemp/views/SensorEdit_view.c +++ b/applications/plugins/unitemp/views/SensorEdit_view.c @@ -193,6 +193,12 @@ static void _gpio_change_callback(VariableItem* item) { unitemp_gpio_getAviablePort(editable_sensor->type->interface, index, initial_gpio); variable_item_set_current_value_text(item, instance->gpio->name); } + if(editable_sensor->type->interface == &SPI) { + SPISensor* instance = editable_sensor->instance; + instance->CS_pin = + unitemp_gpio_getAviablePort(editable_sensor->type->interface, index, initial_gpio); + variable_item_set_current_value_text(item, instance->CS_pin->name); + } if(editable_sensor->type->interface == &ONE_WIRE) { OneWireSensor* instance = editable_sensor->instance; instance->bus->gpio = @@ -296,12 +302,15 @@ void unitemp_SensorEdit_switch(Sensor* sensor) { offset_buff, OFFSET_BUFF_SIZE, "%+1.1f", (double)(editable_sensor->temp_offset / 10.0)); variable_item_set_current_value_text(temp_offset_item, offset_buff); - //Порт подключения датчка (для one wire и single wire) - if(sensor->type->interface == &ONE_WIRE || sensor->type->interface == &SINGLE_WIRE) { + //Порт подключения датчка (для one wire, SPI и single wire) + if(sensor->type->interface == &ONE_WIRE || sensor->type->interface == &SINGLE_WIRE || + sensor->type->interface == &SPI) { if(sensor->type->interface == &ONE_WIRE) { initial_gpio = ((OneWireSensor*)editable_sensor->instance)->bus->gpio; - } else { + } else if(sensor->type->interface == &SINGLE_WIRE) { initial_gpio = ((SingleWireSensor*)editable_sensor->instance)->gpio; + } else if(sensor->type->interface == &SPI) { + initial_gpio = ((SPISensor*)editable_sensor->instance)->CS_pin; } uint8_t aviable_gpio_count = diff --git a/applications/plugins/unitemp/views/SensorsList_view.c b/applications/plugins/unitemp/views/SensorsList_view.c index 57ae3f79c..716ec260b 100644 --- a/applications/plugins/unitemp/views/SensorsList_view.c +++ b/applications/plugins/unitemp/views/SensorsList_view.c @@ -86,8 +86,8 @@ static void _enter_callback(void* context, uint32_t index) { return; } - //Выбор первого доступного порта для датчика single wire - if(type->interface == &SINGLE_WIRE) { + //Выбор первого доступного порта для датчика single wire и SPI + if(type->interface == &SINGLE_WIRE || type->interface == &SPI) { snprintf( args, 4, diff --git a/applications/plugins/wav_player/wav_player_hal.c b/applications/plugins/wav_player/wav_player_hal.c index ece81fee0..ba049321d 100644 --- a/applications/plugins/wav_player/wav_player_hal.c +++ b/applications/plugins/wav_player/wav_player_hal.c @@ -16,86 +16,90 @@ #define FURI_HAL_SPEAKER_CHANNEL LL_TIM_CHANNEL_CH1 #define DMA_INSTANCE DMA1, LL_DMA_CHANNEL_1 -void wav_player_speaker_init(uint32_t sample_rate) -{ - LL_TIM_InitTypeDef TIM_InitStruct = {0}; - //TIM_InitStruct.Prescaler = 4; - TIM_InitStruct.Prescaler = 1; - TIM_InitStruct.Autoreload = - 255; //in this fork used purely as PWM timer, the DMA now is triggered by SAMPLE_RATE_TIMER - LL_TIM_Init(FURI_HAL_SPEAKER_TIMER, &TIM_InitStruct); +void wav_player_speaker_init(uint32_t sample_rate) { + LL_TIM_InitTypeDef TIM_InitStruct = {0}; + //TIM_InitStruct.Prescaler = 4; + TIM_InitStruct.Prescaler = 1; + TIM_InitStruct.Autoreload = + 255; //in this fork used purely as PWM timer, the DMA now is triggered by SAMPLE_RATE_TIMER + LL_TIM_Init(FURI_HAL_SPEAKER_TIMER, &TIM_InitStruct); - LL_TIM_OC_InitTypeDef TIM_OC_InitStruct = {0}; - TIM_OC_InitStruct.OCMode = LL_TIM_OCMODE_PWM1; - TIM_OC_InitStruct.OCState = LL_TIM_OCSTATE_ENABLE; - TIM_OC_InitStruct.CompareValue = 127; - LL_TIM_OC_Init(FURI_HAL_SPEAKER_TIMER, FURI_HAL_SPEAKER_CHANNEL, &TIM_OC_InitStruct); + LL_TIM_OC_InitTypeDef TIM_OC_InitStruct = {0}; + TIM_OC_InitStruct.OCMode = LL_TIM_OCMODE_PWM1; + TIM_OC_InitStruct.OCState = LL_TIM_OCSTATE_ENABLE; + TIM_OC_InitStruct.CompareValue = 127; + LL_TIM_OC_Init(FURI_HAL_SPEAKER_TIMER, FURI_HAL_SPEAKER_CHANNEL, &TIM_OC_InitStruct); - //====================================================== + //====================================================== - TIM_InitStruct.Prescaler = 0; - //TIM_InitStruct.Autoreload = 1451; //64 000 000 / 1451 ~= 44100 Hz + TIM_InitStruct.Prescaler = 0; + //TIM_InitStruct.Autoreload = 1451; //64 000 000 / 1451 ~= 44100 Hz - TIM_InitStruct.Autoreload = 64000000 / sample_rate; //to support various sample rates + TIM_InitStruct.Autoreload = 64000000 / sample_rate; //to support various sample rates - LL_TIM_Init(SAMPLE_RATE_TIMER, &TIM_InitStruct); + LL_TIM_Init(SAMPLE_RATE_TIMER, &TIM_InitStruct); - //LL_TIM_OC_InitTypeDef TIM_OC_InitStruct = {0}; - TIM_OC_InitStruct.OCMode = LL_TIM_OCMODE_PWM1; - TIM_OC_InitStruct.OCState = LL_TIM_OCSTATE_ENABLE; - TIM_OC_InitStruct.CompareValue = 127; - LL_TIM_OC_Init(SAMPLE_RATE_TIMER, FURI_HAL_SPEAKER_CHANNEL, &TIM_OC_InitStruct); + //LL_TIM_OC_InitTypeDef TIM_OC_InitStruct = {0}; + TIM_OC_InitStruct.OCMode = LL_TIM_OCMODE_PWM1; + TIM_OC_InitStruct.OCState = LL_TIM_OCSTATE_ENABLE; + TIM_OC_InitStruct.CompareValue = 127; + LL_TIM_OC_Init(SAMPLE_RATE_TIMER, FURI_HAL_SPEAKER_CHANNEL, &TIM_OC_InitStruct); - //========================================================= - //configuring PA6 pin as TIM16 output + //========================================================= + //configuring PA6 pin as TIM16 output - //furi_hal_gpio_init_ex(&gpio_ext_pa6, (GpioMode)GpioPullNo, (GpioPull)GpioModeAltFunctionPushPull, GpioSpeedVeryHigh, GpioAltFn14TIM16); - //furi_hal_gpio_init_ex(&gpio_ext_pa6, (GpioMode)GpioPullNo, (GpioPull)GpioModeAltFunctionPushPull, GpioSpeedLow, GpioAltFn14TIM16); - furi_hal_gpio_init_ex(&gpio_ext_pa6, GpioModeAltFunctionPushPull, GpioPullNo, GpioSpeedVeryHigh, GpioAltFn14TIM16); - //furi_hal_gpio_init_simple(&gpio_ext_pa6, GpioModeOutputPushPull); - //furi_hal_gpio_write(&gpio_ext_pa6, false); + //furi_hal_gpio_init_ex(&gpio_ext_pa6, (GpioMode)GpioPullNo, (GpioPull)GpioModeAltFunctionPushPull, GpioSpeedVeryHigh, GpioAltFn14TIM16); + //furi_hal_gpio_init_ex(&gpio_ext_pa6, (GpioMode)GpioPullNo, (GpioPull)GpioModeAltFunctionPushPull, GpioSpeedLow, GpioAltFn14TIM16); + furi_hal_gpio_init_ex( + &gpio_ext_pa6, + GpioModeAltFunctionPushPull, + GpioPullNo, + GpioSpeedVeryHigh, + GpioAltFn14TIM16); + //furi_hal_gpio_init_simple(&gpio_ext_pa6, GpioModeOutputPushPull); + //furi_hal_gpio_write(&gpio_ext_pa6, false); } void wav_player_speaker_start() { - LL_TIM_EnableAllOutputs(FURI_HAL_SPEAKER_TIMER); - LL_TIM_EnableCounter(FURI_HAL_SPEAKER_TIMER); + LL_TIM_EnableAllOutputs(FURI_HAL_SPEAKER_TIMER); + LL_TIM_EnableCounter(FURI_HAL_SPEAKER_TIMER); - LL_TIM_EnableAllOutputs(SAMPLE_RATE_TIMER); - LL_TIM_EnableCounter(SAMPLE_RATE_TIMER); + LL_TIM_EnableAllOutputs(SAMPLE_RATE_TIMER); + LL_TIM_EnableCounter(SAMPLE_RATE_TIMER); } void wav_player_speaker_stop() { - LL_TIM_DisableAllOutputs(FURI_HAL_SPEAKER_TIMER); - LL_TIM_DisableCounter(FURI_HAL_SPEAKER_TIMER); + LL_TIM_DisableAllOutputs(FURI_HAL_SPEAKER_TIMER); + LL_TIM_DisableCounter(FURI_HAL_SPEAKER_TIMER); - LL_TIM_DisableAllOutputs(SAMPLE_RATE_TIMER); - LL_TIM_DisableCounter(SAMPLE_RATE_TIMER); + LL_TIM_DisableAllOutputs(SAMPLE_RATE_TIMER); + LL_TIM_DisableCounter(SAMPLE_RATE_TIMER); } void wav_player_dma_init(uint32_t address, size_t size) { - uint32_t dma_dst = (uint32_t) & (FURI_HAL_SPEAKER_TIMER->CCR1); + uint32_t dma_dst = (uint32_t) & (FURI_HAL_SPEAKER_TIMER->CCR1); - LL_DMA_ConfigAddresses(DMA_INSTANCE, address, dma_dst, LL_DMA_DIRECTION_MEMORY_TO_PERIPH); - LL_DMA_SetDataLength(DMA_INSTANCE, size); + LL_DMA_ConfigAddresses(DMA_INSTANCE, address, dma_dst, LL_DMA_DIRECTION_MEMORY_TO_PERIPH); + LL_DMA_SetDataLength(DMA_INSTANCE, size); - LL_DMA_SetPeriphRequest(DMA_INSTANCE, LL_DMAMUX_REQ_TIM2_UP); - LL_DMA_SetDataTransferDirection(DMA_INSTANCE, LL_DMA_DIRECTION_MEMORY_TO_PERIPH); - LL_DMA_SetChannelPriorityLevel(DMA_INSTANCE, LL_DMA_PRIORITY_VERYHIGH); - LL_DMA_SetMode(DMA_INSTANCE, LL_DMA_MODE_CIRCULAR); - LL_DMA_SetPeriphIncMode(DMA_INSTANCE, LL_DMA_PERIPH_NOINCREMENT); - LL_DMA_SetMemoryIncMode(DMA_INSTANCE, LL_DMA_MEMORY_INCREMENT); - LL_DMA_SetPeriphSize(DMA_INSTANCE, LL_DMA_PDATAALIGN_HALFWORD); - LL_DMA_SetMemorySize(DMA_INSTANCE, LL_DMA_MDATAALIGN_HALFWORD); + LL_DMA_SetPeriphRequest(DMA_INSTANCE, LL_DMAMUX_REQ_TIM2_UP); + LL_DMA_SetDataTransferDirection(DMA_INSTANCE, LL_DMA_DIRECTION_MEMORY_TO_PERIPH); + LL_DMA_SetChannelPriorityLevel(DMA_INSTANCE, LL_DMA_PRIORITY_VERYHIGH); + LL_DMA_SetMode(DMA_INSTANCE, LL_DMA_MODE_CIRCULAR); + LL_DMA_SetPeriphIncMode(DMA_INSTANCE, LL_DMA_PERIPH_NOINCREMENT); + LL_DMA_SetMemoryIncMode(DMA_INSTANCE, LL_DMA_MEMORY_INCREMENT); + LL_DMA_SetPeriphSize(DMA_INSTANCE, LL_DMA_PDATAALIGN_HALFWORD); + LL_DMA_SetMemorySize(DMA_INSTANCE, LL_DMA_MDATAALIGN_HALFWORD); - LL_DMA_EnableIT_TC(DMA_INSTANCE); - LL_DMA_EnableIT_HT(DMA_INSTANCE); + LL_DMA_EnableIT_TC(DMA_INSTANCE); + LL_DMA_EnableIT_HT(DMA_INSTANCE); } void wav_player_dma_start() { - LL_DMA_EnableChannel(DMA_INSTANCE); - LL_TIM_EnableDMAReq_UPDATE(SAMPLE_RATE_TIMER); + LL_DMA_EnableChannel(DMA_INSTANCE); + LL_TIM_EnableDMAReq_UPDATE(SAMPLE_RATE_TIMER); } void wav_player_dma_stop() { - LL_DMA_DisableChannel(DMA_INSTANCE); + LL_DMA_DisableChannel(DMA_INSTANCE); } \ No newline at end of file diff --git a/applications/plugins/wav_player/wav_player_view.h b/applications/plugins/wav_player/wav_player_view.h index 72227c096..3ef9251fe 100644 --- a/applications/plugins/wav_player/wav_player_view.h +++ b/applications/plugins/wav_player/wav_player_view.h @@ -45,10 +45,6 @@ typedef struct { uint8_t data[DATA_COUNT]; } WavPlayerViewModel; - - - - WavPlayerView* wav_player_view_alloc(); void wav_player_view_free(WavPlayerView* wav_view); From 6e1875f2858094379fb28629bd3c2155e7f2cc68 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Wed, 18 Jan 2023 22:53:22 +0300 Subject: [PATCH 094/506] Remove New Year update slideshow --- assets/slideshow/update_default/frame_00.png | Bin 4037 -> 3266 bytes assets/slideshow/update_default/frame_01.png | Bin 3766 -> 933 bytes assets/slideshow/update_default/frame_02.png | Bin 3266 -> 3415 bytes assets/slideshow/update_default/frame_03.png | Bin 933 -> 0 bytes assets/slideshow/update_default/frame_04.png | Bin 3415 -> 0 bytes 5 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 assets/slideshow/update_default/frame_03.png delete mode 100644 assets/slideshow/update_default/frame_04.png diff --git a/assets/slideshow/update_default/frame_00.png b/assets/slideshow/update_default/frame_00.png index f65d3e813bd3cd47aae63a63072b8d903f12cff0..801267de010e409524ee592cf3d02a2cb11c1575 100644 GIT binary patch literal 3266 zcmcIn3se->8D4}EUtkm;4QQP%N{u?Z^V->&g$4E{OJs3DjG{+ncIFO@usiGS!Y))T z(WV+SnnZ|(plI-MD4L+6#(LVSCt^-fs{~u4sBJU}8m&|@8a1(ZdBrwFJ?-h9Gp{@U z{r>O&|L?zZ_ceQZO2okEfeM8pBGqcngx6AdB=_$J&vP5vCcw)8w>8_VP^e;qM@V36 zQjtQ@|3fKjmT#6VO~=bl6(`6Jpb9wM&|0BLND8<)J|FlH2gsFNdgaZ7e^erppjXb+ z*f5*h1o9+ni3dzCNzdX-@_ANJCM6;X0UZQz0w0G2oCPkgE}&O-;_Bdia9FKGI!%1} zdZi)g5SeAOBPQ7c5L$(yJcbd7mQ~?2MKR1|gun<)jcL_5h7yDhqjee*>HaC9H;*9d zGR;%EeZeQaGSBC8>(pw$->>qMD%q2(##xqCV}zO@P-uaAi(Ni0fV#Y~JqTvtn`*ZbVe%hYES^2(98>o;k~Zhd9qLT=E*-2 zNAK(2XxuuJ2XH>wlO@XqJ%zIOpdbXH!jK6wC6^%ky)OnCbx#0h&Ij~LSTzF07?dEh z2vSGEs^OC`Qiow(rZ%Vpf%9>X8?z`*WMQ}tCw2J08_R+u7C(!r&8ACrd3~IV2dQSg z5|UC$lAvP=2d;JC460#72THM&7G*dFo+uFjQWQ8*i+A#Z^UX3}7))PqewS$#^>46uiT()4!M)X3%bRyVQl#w2MD!vV{pG)cja1xAr5 zBTzibilQLkg5bafETNM{f%G&i+MywNiUueP6@dZ)0y2ORQ4!Y?0uTrS(}TCYn+f>PyBz^8*dZRc*@zi3 z!m3b&)~A{cS%In>b3XMPMf#sffAnabJhn<#ZfiY6ZQOp|oWYh&mcCn*cvTrW|8!I! zUKMiq!?3W+!=7I?H5q&A!!PHVPiB|w-Fw#Fh?-h1wQs&vl^#==5nVI%>V*37H&$Tj zrSJLAH6FOW)=RI>lYZm7Fg*Rz$hfnsW5cNIt*>7VPl$4>V;5H>EnkN$Je5-F8+PZF zweb;P@7EVLv}Dhi+T6ewy)$A=7;<1_R5>$8+CL;RC)c0k685F9 z@nQIe-(Pqx`Gb$*uFb367Vdi3@a6T&{>kUY{_OZW%U)eyy;E3nK5R$xl8Sw0p>1!E zJA8LjP0i)0)q@8MFIcXfrH|zgNcNmOF!;SwOi0t->Wu{}igFC&9y0a+T+ou;5`J;l zx0CusoX%L%Zfo2c)_S6(xcO53){bR2R*yqg#C`mU?tz?owf%5X-R)&dto<_V;Wt^! zk(isM!?}(vGoAe^y?a}gna9=z3}t13er#s*cgXr$>z0`N!+gg=&Is`x zx57?r$eulW<5v-BVb|-2srM(0P`@5JIma}yHssdlZ=A0g9a%SE_Ccms}9KV9fK|(uRHtYP>`nJ5{juN9IuhqE z)m*3?;BkjWUJy z^Ov4Zv}U{y;`jJpyU@RC)50+}G7&6Yuy2j+PTELrc->pS!sCi_qVwi|LOwTY64;r2 z{4b%zH%M*HjF8OKu?Ir7mF&J>QBi(6^W-bm(#5qqj@H*n+@Zfm9gN&kU%r3PKNJkg zY`z`Q@zYK8olwL1=?#|^m-j8zAd8Lf{*7$ietZ6v$~_BOL)sVZs%b92n-se9zF|Z3 zrHO6Ulxn-ZJY2uM?9|FPA4REF%qBn2IhIzm-v06zuVzxFVJsl uGPE7tmNxpqqNe59k^W_-%A&f5Wn*1Cr&!|$oXZaW%Sg4Po8LF)Ed3WoXpVyb literal 4037 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 diff --git a/assets/slideshow/update_default/frame_01.png b/assets/slideshow/update_default/frame_01.png index 2f21ef695f7ad96d6613978257b2634c30df0b98..8a1b6585738886eee91d24c415ea17210706e004 100644 GIT binary patch delta 912 zcmV;B18@Ac9i<15BYyw^b5ch_0Itp)=>Px&Ur9tkRCt{2ob7JIAPhyrwD*5y_KPj@ zFupd1klII@)TV@bjWPa8O0BhCNm#y~79e?+RDj^50t6=&AULT2!AS)OPAWifQUQXK z3J{!BfZ(J81Sb_BIH>@^`5t{(N-<5^3XIbEv=G_Ga|Oy-d4H1sqy-4h&;m5j6~wJj zZlzn9l_&WFQh*3hWs#H?Q9|yVQp&PzNjtYn0nimrkJG)~%OYsyd4jtv?c$syUw8|E zu57BzlEW%}C$~6y^KxUjV;Z(7fVU6uDNu7w6{FVLJ$7Av%hFzJ2yX!>JC&1OVEWk( zmWF|)6zB&%ZGT_fNmByKE=3G$0VD@<Icwz@7iVy zX&joCeN(>RDbfN2r;MHvI|cgwF$Ldh*(F zuR_cTxPL|gXhS83)Od+{^_p?op1hu{Z&rfPKESAx=FJyXgQ^yQwo9S$yHp^tW)L+N zgKNxu`^rWM?E`3g@;;Ga9^l_#uwzF$51qG>IsbKp_5nP2yLE8!0qFSIY9AL3NOEy< zBs`&gfLUf%|L!}GI82#9YhM5zhptq#7GUvFEPvj<$A#Z%okss-XbYgZkRB`csjZ0% zb+2pjGlI}~9Ifi1c?N|0cfQ?`n;~Qr;CaEHb~I<(>Xtqu2)(mMTPv73{z(^~L*v(k zvj83!tyaI=*-I(Ef4$@P_w@CsZ5~zhBcBnZHEUYmz>?lwx!R=)q;wC#$Y+w|4jTom zynorkgWfi&l@}Se^%+64Ke*O%Ao+z;BY;tL5?R^l1Av^k`kP|ThT#ZHEdaVVqt!$X zZvK-^eB&+~_u4uRA-n~M&ZEx=qMxJP!q$AjDeUex%38o7+?~!>R0A8c!lEl1l|ySm mPO=EQBah4j9LPxu`2()=HiYe2d-MPR00{s|MNUMnLSTZV478d6 literal 3766 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 diff --git a/assets/slideshow/update_default/frame_02.png b/assets/slideshow/update_default/frame_02.png index 801267de010e409524ee592cf3d02a2cb11c1575..db971092250d8f86551d9914baea868a11d2a082 100644 GIT binary patch delta 1291 zcmX>kd0lFP1rsOBMyn1c4nqT71IrKtqsgb3lo6b-Od2XFiRMX0W|qdfrYQzyx+aDu z2D(W}rpdY{Mky(2DXFH(iK!-&9htRMEK*IAl1xm@bPY@mQgoBjOw4r?4Gc_mjm(YB z5)F(}43bSvHup2vGT9Sjq>@5$iECMjRe45go~@FRfsv6e%#EA9*#a3=%#)HVO^hs3 zfbL35)=e`sF#)>EFh$oQ$s{Q$)za9)%p_&<0d|eebJ(L8>xEapna;q#{L|CLF{EP7 z+o;>yRx9wZ-2MOmsOx#>>uHzoa0uvqHQ3MOyiT`r~Q|MrMqY zH*(JC@jZ}|!=#ohY#=$i;p7b#pJNcIj|EJ7zHi<=;oxM>5BJv3&pK1`ao4)fHmyvG zEsraVy7wOZrPosbVDI$3@8?*bzg+#lYVR8BZ8A|;d{%g`Z`gJ0TKxN~8G*(-^**j? zeZ^jUfis{<>TuiF#eG*lI6AztE7HqW+cB>>Lg;_ymOrjPlo_h!cg)`7>GX1?=$9<3 zmF;)>tsSq0MfDiJs24oFWdBA611CFHvyE& z$|w3a^t`QNNM>ToKkE93vxL9Iv_7x2`Dx)7E`b2^PbNItYvbnT86MGMkvO;8ghkKMV>j2|WR*2tU#idW4qmef#~;+cQ!lZD=K|Ja{CRx-0>f1P582wm-4%JiYn z?yT!9rP`x&OD&EI?Ob5Rw`_iksfI1*sbvsDYW^;qxH>Yv#;Y;;nqPBM+3oNb%zNIe2|f7c{d41rO2xy8)%%&g zv`2ogZ5Q|w=EM=Hd0A)8dXA+z6DMx_z3-_$|N7TTwY*KdzO$BQ3#Hv;sd%Px=f?X> z*Y!)kd0#GY{Z@TB?SHIp<-YeHpG~Sc@0S$$zTWz?{^NTcf7y<^9{$Ml;heaq05`PTK?`)rZQCqfm^7dz(>DTQGHko>qT@Cv9)vz;plEQ(b;R^u?r_YDH?RUMO zpkR~mF74Wh4HgkQ`8b%KE8IK5mZm362w~ZN!DMfsSHP>x`@Fh1Xf{PE)q`yVKG( zC2_ZNJ9A>*HP3)K+7*G1w#{0!V8zs>u_9%zdE#rsQhLSD2p+YJTh@Q#f8>Fb7%R`q zmQ!VC+iewCx>&EkZ}wxk-YE;*JmOs$=K8iz@nx8>dQ+fq6q7{l-B$`5*73(~>U6R@ z@Jc7DYf+i?TDf04E;Ki=ACR5H9A<3BSp1RyW!~ZX>IW;|G5~?6tDnm{r-UW|5Klw? delta 1176 zcmcaEbx3l81rx`PjaD5@90r!UhDIR6AM#aOS9BO-PAM_LtP6CQ&U|FOM|pT z!{j8R6pQ4|{mivY_QV*eq)=SqT2^9Jo{^eot7K$gWTXpo<7RKRK*r54*rOQhrTIlY z7#Ns0c)B=-RLprBeY5DO0>@Rq|Np1w%g?cz;(O>q;bTa?d*u7NZi@zvb zVXen_a0d&^V|DtzL{KX)|ZjlR&rOw@4lGYjXq@-lgOpLFWGE_3-pz1r`oqqS17#T-cTa+ zwQ;gFZ|c@>cjsP-4E4UWCAn;-s4R=ZPBGyr7SWm8`S}vkou;duogeCY{neT{fh%>E zUf&Fb4Cn5>%kHrLh}x^TmCM-j{%om#{$>`3!!3EaGc%i8XUt!lQg@qW&851j+q#%v zOj9}deZk_zkG<#f@T5q(zPe#{Je$*@=-f`8MHeg>Pj8(+FQ=m{!BORp#fFbrS0b;l z-P`zAn~C>gVBH7bV@p}?oUN+7bbrIrFU@cJR1`YYPF%M7o$vYb!$JGipPTDEm;wXX z-donY9+H0FAd>iHNq8>Ptm3VAl!A^=uW;<@s$hEY^|Y4vceOx={y4>r?y)^wFV39a zGWG0{FlDVDsmjjBiWU?vHgOQHstj0G>F81TGhggNp6!%A|C>L4Ux?+OvC?CS^e>^3 zIXgEpDr(+qULTe>8-(#qnpS~D(9PYqpJ;c=?eooDHs5 zf)nET7DsL|T=|Pl#%mk5tm-s2vp+s_G}EP1f-)vq{ga$Bt2O1vvb+O%FPy$q*s|D3 zA9}*N)=2#Sr91xhP2Zb(cII1u;eLE(^^NB`_qrkswsg%nf6S)%_i|pg$+khw6AQ#` zkFSb2q*mTwdUqCQQ2{gGleGE9$Mnix@ohM>DO=U}-_=YPDMLR7trLMu7EZ`@=>PD# z|K7gSiT>H*8RZQZ?K}e4rCM(;@4U+~XF;K?ud!WfQ`WYA->*JmiS;6@C)FFORVGMf z#9uaM7uQZ*8+qm$v(Zn5l?kDYL7wtE8JAUU`Zaaxl#4;<8a*0nSFSm_VRdHWfrrAo z`Ic;$vYq=KgN3fe!q2>4Bo>%`Wp=zByyY>&<84i*3bjtN9~j?R{yF~1tj$?>7(di( zTzqNDcYEfwzZ~aE-Pd~I;XXegAb1L!?eeY*-4p){>vcpKKTSC9Q#KgTe~ HDWM4fcbov4 diff --git a/assets/slideshow/update_default/frame_03.png b/assets/slideshow/update_default/frame_03.png deleted file mode 100644 index 8a1b6585738886eee91d24c415ea17210706e004..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 933 zcmV;W16urvP)Px&Ur9tkRCt{2ob7JIAPhyrwD*5y_KPj@Fupd1klII@)TV@bjWPa8O0BhCNm#y~ z79e?+RDj^50t6=&AULT2!AS)OPAWifQUQXK3J{!BfZ(J81Sb_BIH>@^`5t{(N-<5^ z3XIbEv=G_Ga|Oy-d6NI61qja20yNMS#H~Wz9a$~q-8n!5aw-4|s zP;*Tcqt@Czc3pkT(q3x_ZviMfm6Kjz`q>VahJmFN=m$M*U))Jk0?IB$3~K=-2Xf@W z_vS&8S5o5Zt_-7NJ(;)o0M=EC{+QbNPq!M9Ly4Mxddzdn$V^~xAPeA?xs&EWLLv`& zb|U>xbc^7;ek2sM5Y`9a;FQavbV!(YUGfFAo`*100IxlkTglq0-|2fkr5EOTXFX>L zYXPi|sCGP60;>|QQhrlEz-*y}8_&&a?JGd#S;cHfr#a6`SPRft8G3q#bm;b}#U&4b zn8DtAE~%oGXVvP6K;{90W9kRcdhgn13uzphmVHyc;3?7q1gDIi5#+tMYU6vY#YrDP zPg;QBxMTvYrB& zIsbKp_5nP2yLE8!0qFSIY9AL3NOEy9xL{#t%(bDuWRu$g3x#zt?Hq9288=}zTJ_VA!HQbdBLA{ zG-uoDmOdj0y|YJKE0{U{Nf)0(Tap!^qkE(lbN~y{lEMA z?#-W-u`x5fhK(C0lgYevkrDCWUI4C84>$0gy8rGJaPzcACfj8)rJw5>C+MD-jaMDQdbLg;7`qt5paLp(q2B41vjeJ_=yX#*0jR#Ec$W z;4Mgz?r>Ncl`148B18yw&StbajFLs} zLSzk6rXxrJJnas_Z0&=!*n83h5~gypRu!UzT_N=<>h-TzHJkgi?G9}gu+rmizrgl{ z9IK#;7wl4|jT5w4g2mz2YmDdm_F6M-rmjeNP9>NGGf=Yw$B;f#)^y1s+0&(;iKB11 zFB&ToZWCCCWJ{1FQ*WVSdr{;ls)XfJ<`^x!lx?5t@~CHn5WzZxAO)xz3c(bFVhJe5 z;Gk-VKa4Rj+^wnyJm6Ue`-(ECFH9%ED1%@O^54o5ZxnL|qN>+3I*Z-GS~x)$5u^Z4 zDUC*+;aRl-C20&Ic$kE61cxDmf#4t<<#~}82#yu-F2BJ32#L#drO&m$o3^~f0gS#3 zF_b_U3^-0gFah(BLB!P%3&RA2sxgv$D;^-S1V)OKnuTBv za8eKe4viurM9?H5vKWSu7_E@=93x6LGYfcPG_z@f%4$hd$ba-ETrx>Ey~Kl@W3S3} z;o-41Ni>?kf<1nwMy}I_lL$?c5UNC6vUlC5iWEd0+u`!)B)o0Q5C1=~lB#q9dEN31MlVB)`Z))z3L^XR}`KIxP}3 zO#pJJaTI|>9_Jy7qhW~VP*RQXY8V&9-q8OquJ@#sOJ^-<0+_HW#jg)$V08aU9r|y; zUsH$vgHgE#Yd6DG|4Y6f`P|znVW5Xy)U@~1RKuqARX4c*#&oqGBG5EMVxYrO7{?%r z$2o`=MV?1^-hl9MV3!vr<1b;61_I-7Qh;c{2uR=oASF;DBqC~*7kCtfIbon!YJ-8s zQHlrSN8|tkj)U=o0EQWGgF&D%ip2SWVsQk9vlNR!I8X3ka^NCFV>}pY6slHp2+F}2 zIZ!NtMG+Q+0#OvfLM)975CzjLgt7)6R~rNaPEtR`>K$L2hzP9)M?gMiPza(8r?r|0 zt(L?HTBAiZVf|#fcc%eHI9Ey_f}{)(Lc3x>1qxD=Y6^y7HKwMqSL}9Gth@ZG*Yl)H z^Oc`+P~uY$E+hlGO z{N~1jGY#(1C%c#0tZqj;{#>=@t76aAYZY4-o^!MvDQ^#a-)++J8&32O)n7eVE^n@0 zU){1P;6hzqXKwZGfCJ;_{ylnUR7Js&llAjkE~m#~hm~!+-@pHc{i0{=(s8vbo_z7) z<<_v!`@uG4#^ghvFH7?6H17XF`@Nqm@2x`{kLon{c8z|#kl9t(^ie=qed65J*xkh= zzy9O#eKJ@RJcK+Gb+O5j&H1qD^;aqxUBI!9Powtky*A{g=b)y|*WA||N0*leHe91p z4hod>NYSFwXIq`BNC!JC;Hzm%xksWyZZLj2}a$E^55N@obodN zv!~D}E8{s1~Nqhr1F(~nob#m*{N{UBGyxeb+0Xs>%Z zyd8ukbJ?v$kB9lhsvqIQ{rAk{aI z*x#HYFVRUSA5qFvvr?Z$GvhZ*cz#xv^lq6x)2;Qx;BT}W6!|AMXHutp4{v2gY~Qk+ zm=ff9c02Xxbi3cocJJgJjtSqzd2M_dI-^oqe~J!0yY7zp(Xsuvtk0KqjAF}@=fC&P z60SaG+0v}WId=yiZJF%b{50y>zMVOfYT3NwZjTF-JMs&C9w%x%lBd>9-(BHRYWn!& z1OGmDOXXehPes1hQZN06(hOhmTX*N}x0@PTE?rS&K8>ogYM8hBko8|yy)K=R&Zu#&9`HJK(d<-7XQtE zLQ(O-+n#AxLadcUWY*>QwkOC+Zf)e*#8BnL#z`$1ZcA3Fr{y+hk5=Z5m}0IO?Hha5 z=XQZ<2p8JH->9kF=Wcv{_4AT3=N(N|wZgu${$~_x?kxP~+?T7`BE5Dues*qz;bptO zy?AX(=B7J7PjkvHUe39+qNusFxDuWI z{dZJsIhH%BJfKSS3yEo3zM_P!3NIYYTIzMNoBW+|*AHyiwsq&a($wE%X)R;+B=SXL z&W$`l&)fdd>CWUDK84ZM(d#B`4F1xm^b4gmX5)>CMI~EjM9$aBHtP#Z^s+T&m2soy zx{b}hdSAY`+&i^$r6#!M{`9%4wq*tEnfUzB#bpI=)NC4@h>?TrZQl1RwTttbcRg_Z O_0ef#BFZ%jmi`Amz22<= From c303b44f3fff494220ee2a96d72e248b137fef53 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Wed, 18 Jan 2023 23:24:35 +0300 Subject: [PATCH 095/506] Disable debug messages in protoview --- applications/plugins/protoview/app.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/plugins/protoview/app.h b/applications/plugins/protoview/app.h index 82f2f5263..beff44710 100644 --- a/applications/plugins/protoview/app.h +++ b/applications/plugins/protoview/app.h @@ -28,7 +28,7 @@ #define BITMAP_SEEK_NOT_FOUND UINT32_MAX // Returned by function as sentinel #define PROTOVIEW_VIEW_PRIVDATA_LEN 64 // View specific private data len -#define DEBUG_MSG 1 +#define DEBUG_MSG 0 typedef struct ProtoViewApp ProtoViewApp; From 034a436ae08f08daa889eecfec643bcf71786550 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Thu, 19 Jan 2023 00:54:02 +0300 Subject: [PATCH 096/506] Update changelog --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 514d801ef..50de9136a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ * SubGHz: **Somfy Telis Encoder** (PR #289 | by @assasinfil & @TQMatvey) * SubGHz: Add 350Mhz to default range * Plugins -> Solitaire: Fix for solitaire card placement bug (PR #253 | by @teeebor) -* Plugins -> UniTemp, TOTP - Updated to latest commits +* Plugins -> UniTemp (New sensors added), TOTP - Updated to latest commits * Plugins -> Added Text Viewer [(by kowalski7cc & kyhwana)](https://github.com/kowalski7cc/flipper-zero-text-viewer/tree/refactor-text-app) * Plugins -> Added **UART Terminal** [(by cool4uma)](https://github.com/cool4uma/UART_Terminal/tree/main) * Plugins -> Added **ProtoView** [(by antirez)](https://github.com/antirez/protoview) @@ -19,6 +19,7 @@ * OFW: Change broken BadUSB link to Hak5 duckyscript quick reference webpage * OFW: **Per protocol signal repeat count** - **Fixes issues with Sony remotes with SIRC protocol (bruteforce also fixed now!)** * OFW: Add the ability to turn pages in infrared +* OFW: **BadUSB backspace/delete fix** * OFW: relocate R_ARM_CALL * OFW: fbt: PVS support * OFW: fbt: removed DEBUG_TOOLS & FAP_EXAMPLES flags From 59bcad0cfc9012c2ec2bb763151d51298df8d186 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Thu, 19 Jan 2023 01:19:21 +0300 Subject: [PATCH 097/506] Remove protoview binaries --- .../plugins/protoview/binaries/README.md | 10 ---------- .../plugins/protoview/binaries/protoview.fap | Bin 30656 -> 0 bytes .../plugins/protoview/binaries/update.sh | 4 ---- 3 files changed, 14 deletions(-) delete mode 100644 applications/plugins/protoview/binaries/README.md delete mode 100644 applications/plugins/protoview/binaries/protoview.fap delete mode 100755 applications/plugins/protoview/binaries/update.sh diff --git a/applications/plugins/protoview/binaries/README.md b/applications/plugins/protoview/binaries/README.md deleted file mode 100644 index 58113d779..000000000 --- a/applications/plugins/protoview/binaries/README.md +++ /dev/null @@ -1,10 +0,0 @@ -This is the binary distribution of the application. If you don't want -to build it from source, just take `protoview.fap` file and drop it into the -following Flipper Zero location: - - /ext/apps/Tools - -The `ext` part means that we are in the SD card. So if you don't want -to use the Android (or other) application to upload the file, -you can just take out the SD card, insert it in your computer, -copy the fine into `apps/Tools`, and that's it. diff --git a/applications/plugins/protoview/binaries/protoview.fap b/applications/plugins/protoview/binaries/protoview.fap deleted file mode 100644 index 95e7cb3da2bb15511b415ec0065b18fb59ecc260..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30656 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 literal 0 HcmV?d00001 diff --git a/assets/icons/MainMenu/Xtreme_14/frame_04.png b/assets/icons/MainMenu/Xtreme_14/frame_04.png new file mode 100644 index 0000000000000000000000000000000000000000..ec9d4d5b4ba6880d81e49f586fd893ee5bf281f4 GIT binary patch literal 5701 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 literal 0 HcmV?d00001 diff --git a/assets/icons/MainMenu/Xtreme_14/frame_05.png b/assets/icons/MainMenu/Xtreme_14/frame_05.png new file mode 100644 index 0000000000000000000000000000000000000000..39f2d29795b9d2a44e33138be7c8daa0b5065c36 GIT binary patch literal 6982 zcmeHMXHb({w+=-NRX|a?A%dt7QVAp{C=jX=MOpwANQF?6m;?xTlp;k$5EK*;3rZCb zu+WPFN)Z()N>#9dpa`g_2hsb29?RTs=FXY9-@lWYoxFRMXRY<@wfDSx5@)~NT2@L` z3Iqbl+S*t+0KamJ11t`FUo(5|4gyJ!hB~b zJ>bOCO>ztOHZdi^@`|@d-)8pT&=0$G-Inao`zA0D_cC!$xtKYbtmrWG`El6E`4t{^ zIyKGbtDe1@*{YLjzxVu?+KDgPXXnO3?o8U0JRE*&bv@@0jS%Kre%&*;3G@m`Nj9^nXLbw&RBT*nL5&dUQ-dLgOdB*u% z_}Wm*$-P#dp22T?a=0dnk5e+ww!lmNcv7J@gWK`ZnBO(2U+dv{yfJy4G(Q(soaI-d zQkcJy*!#)7hqiHE=ANM)#j)_9PrvjRbWGBMfl#lgx@lF+oBGk=0(;QzctzQZSAC{v zd2$MlX$Ii!=HpsZ@v1s0ofk$=z9Q*?lhk)c_&qMoQ$BOK^Gx~2sX70{>B~p&n<^if zPUSQV2RD?S*cs6}=}1n}6L-WmBc8olc~nHf{iH*P-p82(VJeptz?WJ58ywE{1;zN- zH4w~(Osxs6#+q`+j`)G{!H(#tEU6knP)(UF2rz9REOZYgG5MWAUqCIX#DQdRCV{2Hh09R^Cb7maykGDWkm0H}=!J zo~ki}J^Nk;Mky@++|o*nNkmO#OFCw-W;+~n@1iCn3yQ~G+-ql#kzLPj*U5T@WS4KBj-c=DiwwOY*J+rX-GVc@mC|MhOtxH$j>pAx^*7g0T z@w;sf347?p*EOd_h{m)h%yo_$*xsZwK2}4U%oyhPg}I;bF+~MU3>z=#z{qNHLx?}W zFMPAHTU~QK;g*K#CON%`Y;0XyL~P2Fi~>7twSYTvdf`rnDMgzfj7zpdX(oClt15;%vHmIJ}TFVMpNavzk+R;H0 zQ!T|i$&o3=RWH&j9(k?ptg}UaZrKYN)|8a$r-@jr6`I|st@Z0FFe`daj=2VNwM;-= zM09v3$`AO|72%Aj?W>P(O1RGp@QqUymR;}_XsElJxk+GN9*>Y#DA44pOro_yXnqgZ z=Rivb)@8k7ENkmFW1f~NdE@8HH3HqMfC=MB`l{flS+!S6_ac=qmToD{WsyTw?zs6& zqF3CC@82_HabXk)JPT@OrkE9aa?eatT4^n_7E2@KqZ zHF3(TqCTq?MCIM6UcX+ZZz_CO&7#*LR?D8e%5!#e2IrL(CCfF>Z_Qe>}^LR6?`v9k}7;5ja7&G)p(gP zHG|hOI@W7fz4d{m5eC2b_Yy4*UG9lGJiVcFMG0n?@}Y8W_Y0E|r4~Dq68>RCg6Gbz z??!Nwbx4{0$aNio0hHD?$+|POj9w`Uu8v33K%(hRldK!2{#dbDAOI>N=TCV zn7?O@xg9JnU|-ACqf>il^Q=AWRXcc4xU+cDW%;usXZAeD>QQPQn3=GW|EL6Ak?ZSe ze4<=_KIz7I_@5#({_M+2*D6600`$|U&p!TQMz<)V8k_5+FcO=h*qaF_6~vPQ>0bNe zEU|LSUL2`PQpz*GNUWnuEAY(q*FdD;AlhZP6YKP{pgBa^s+O{i;_fJXf`-rFjGYQy zaNubanE8O3Ok264g5~62PH0pzzuE@Q)oII79I<5g%BRXZ23SiN9P75QQQvmfw(NF< zXtvo2bD4u42=$NU)%wc24n&Fv_0l)Sx2Qg}h72vYX#V`{9EB2c^XhZ+M?8Y|EGB+b zs_D_@{XKm_?Bv@)JUO?{a!;9~LjnDFo1}Lid@T0bsr7u0j`{memX~QWE6SU*e!tt* zd9SVpnSr+_X8*AMa7yj0Rt;znrE(Lt6XVz35{6${ulX#=+j84`)7j!ut=@Gv!6#N+ zjc|=v&|QTcH5nOX)QyZ{A!>5cYduA0W0ung4!MS2LH56l89Y~OJ}V0LG8U$hKOSjW zDI1LHK3)5#Yzs%dqsD#M6ZB3;a|#{%2o!Q|FJ*Lr?Bn0_MJZ_u1WaR9$ZH?3iG_&W z{kl3*JLrRaws`Ogv&+@{zz#Klxb(t4@Doyhusl68YGF)V#P@^zGxDpiT4t`pCgN^Q z!$f)U)_vgfPo}iMG&oP%EUEM{QC`}*LcaNO@-Fb@rvn<|EWj%1weK59s|PT<;qp#1 z@;dPmF=^A3W@OPTz;O-=L~TrDYaL=-tB@DZ2h6tuy3D#(S@ANfVVHQ^BEr3W$qm}A z%&!{aZh6@={K%*Yz%|Gk$fslu>dAQuqlRjSTnos`X^nPNf+d) z`oq1qeKJGc5?JL(V?N*2Sr+A>jK;!n=HnTdoms0=ZN%~#ooXNE^JDhF2N|i3uz22I zB64~aJe7n!`B%2zc2ui{a8jUz6_zPbTd&xOP^ z4;06`#4Jo{xz`!$>Y3jFb-k(4oq9Z|S9rwdwYGa#y5EozQiYP3Y8u$lsjs$Csl83d z-ZsJ57PP^n;2w2A}GlNU#t&%;gb@3oLS0S}Z8 zZ9nm1WwC!%{1undltTaXnhh1PI?=|&sN{I1ThUdOh*1bVs8Z{?GfVJ#lSraiM(bX? zLc`dw$txtivcrVhN9^|zI>nmhd6Z>A5b@VhkMb!qh)I{c_f|C>9WEt$+gfWhw>oaY zBSgUBMqW4n0wZVc6xJz>J4u|CO&q>{Wp&Gxt)1U|)otB+!-bAI_ra2{6WjWH?$uj( z0OQK7*hcRiUXx~~tb(SrvLu<*1b61fD*2`zI_~M)+%)Dijz8=l(fku;5+k~LJuT}k zb6)x+aUW)T5jt2^mmK?M;?$A7&-|t(@;F@=LLAEL;{ttWt!~K+vD+cjtV{xaCHb*M z5PJEh5JB4cbofxyqYq*d+m6Arg5qCl^=zx*2B#&umYBc3Gjn2+ls`-jRcIej85N{? zL=QmS-rh93=vWt~Fgah%TftaxB2Q%%otmnRk!K_w!*^?I+)%UE;7+s?ftSVIAUvg*H z@{IhBtGkRuB0j&mS=@bjzS4O|OtM^6y6f(lqX$Os-?%~(PJDWRjM~>}zn+oQqMm$h zTZR!iN^l7ryL*9$bn37-XL6H9zz5f#R)R(qhb}bD)yxNudN-K&#XZmfzPHe;pOV2- zg`R3&u$v2OL;d?ms!4=05J&{dA`zbIsY3r{{w{#CNP3{`pC3#*ucw178 zpnj_(?U?=jROW>b|g09+U22^7fw50g(=t zz02!g!$26o1+GpY5MhguOQHEO1Q062o5ePPzNu+| zLRfSYDA|yNAaRKdAC^rhkKq`)-H8_JN5j#fTQ*A(gm?fTfFYnjgaQ6+K3-@7UBbl! z&x>L>6tZL@@H2tBlI$Tw4vzuB7+?$#FiRmT2nF3N1tIY0OuU1I)prPBW&-sQ2)KAS zJUBSmAQ)}H;d#T6I2;a+K*3Qc7+?Y8hp+_{A&kvmw+QhK!-B!5@mO2|i^GO2Vp6D_ zK!FJq3g{t!=NG^wk$%9l`QKRp_<##3TsYDI0S^d(|LVaPSOx(g-xK7_cId@D?0e;9`2V7ADZe_;@;p#-ihw z9%)E4oq?np!Du)`It*iMjD=Bn%J zMhHVXjtN6xm}nRVgQCKyhDaLB5JyE&DHtRYOQHM%v4h6~x{~7mYgUU;bN~vAq#7Ed zm`oVf2n#?lsQ?t6ih)s#=@?@w#*mJ|GM1p|G`tmu7eE1)lNCVmX27{@?1iPpixVj#bv<*#Q?-o7W)(cSds&^;E6m2MZn=XaX9`a(8ZJ>i=IE!Bw#zyDFTWG zMZf?+5hyesfx@E@PDmUcjlmlt^$-X=;um`koy83KzpNKG4}|b-$!%DCAb!Y_=-ZBR zWbFMm`!@AwEo~(TWNB02DYS1T@F_tI`cj?%);AT+hr;$|0H??IcKut<`VXyOh(=>@ z2nH2~zyghg!Qu>II2^_hW<;YSu)wxQQ8CQl(fJ&vAeh2qn0W&{0$c&@xx^J@!_q=+ z{M|a(hq1T{0AVl$3igvQ)OW(*-wTE>o*92vOo0C{P6$f|zZ^1v-!~a>cmZc2{KsMV zowLPb=fC**z83$*2mtiILH-fH|I+m@UH^!Ie`Ne`cl}G(KVsk?8UNc||8I0j{k%>w z*uYy*FmPF#RUK9YE?T10ZPpeb(8YvxC}1YZwQ=JEe_E|v93r5MOl3g0TwqJGTs|hc zY9$o&mrY$FATqYKFmqDwe%@Io3qpX!Zs=0Krk)mcgKkKNOpR2pkOW26hvwQYe^AF3 nhaM@}AFaw5*57wY<$zdbfV76oRCGRo0kXB+ZgI)nEAoE;bKodu literal 0 HcmV?d00001 diff --git a/assets/icons/MainMenu/Xtreme_14/frame_06.png b/assets/icons/MainMenu/Xtreme_14/frame_06.png new file mode 100644 index 0000000000000000000000000000000000000000..782fc285428f304ee9201f4165fd050792a95396 GIT binary patch literal 6911 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 KmRC0U#s3!%1R*E@ literal 0 HcmV?d00001 diff --git a/assets/icons/MainMenu/Xtreme_14/frame_07.png b/assets/icons/MainMenu/Xtreme_14/frame_07.png new file mode 100644 index 0000000000000000000000000000000000000000..5d56ce1fdcb0864bf6533acbffc529c308811fbe GIT binary patch literal 7733 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 literal 0 HcmV?d00001 diff --git a/assets/icons/MainMenu/Xtreme_14/frame_08.png b/assets/icons/MainMenu/Xtreme_14/frame_08.png new file mode 100644 index 0000000000000000000000000000000000000000..a21cbb27c36e9fca2c36b63ecf1c152a6c20b5a4 GIT binary patch literal 8435 zcmeHrcT|(vw{{Rj5JV}`g_wZUKnMwt&}8T(fb?cbg#bw)gepZ*ks?K;DTp9Nihv?m zKtK@%L69oaQ3R1DAYIB0j5EKP@4IW=HEZ4b-(;<~oPD1CoV}m3&slj-l%=`hp@YH) z0RX@uVnGFo`wPokP z(O3{{giH}cXxFY`)^R%(d8T({Sap@DO?TWe zKu~&h`qIj#&O-0nIstfIEW<(KeIvs187pli_*^N|)XkJQ$$O156&|d;tMMY`X0h5@ z+UZ;0eCyAHy~JH->2FBeDA#x<^KIn#RH)VXAq9Bp{GgAc@5^KlsOVyw#j1FzwW--M zRWT^;!|ct#o!X$-lqbECbFbenY_F|^5b9eF%!P{o3~;?u=DM=JHExFDuL(H2U4mHb z_aXB47`hxQGakw>zvF#+jGs1r9}1ajsC#jQw8I~&TrhVMGg&H9H^hfy?}ZI>TDQV{ zwEeo2ItB_oKSxy#Rc#Ud-trIJZg}5P=BUE`_7lu|R()o;uNp!ec|2LVG6eG%i!d$0 zKwsI1ZWf1bT&a{edaYx9PHv{$E+bZm2f5xt&}+EgQixGsTlu*G_V(3-My5*YAB-cr zM)JQil=M<>kK@T^l zRY;gisPr|Ltee1oT8YS0<%aL2aYv2bHEoD+0XqyIn7`O7o1n{%K)GWh zmGY(aAD&2kZgTu}l9jn+&rJFI$c(#fUk z{5CO=%0ZLjV{7yg-FVIALDRBVT&e});5hiAbdI_5#m*(=cWPbl9=)r&&`)z;KWgVf z8n?BpF`PX(eQ!iuuhr$$BXuhprphqZ-@57$CO3m6N{H!Evj`|tf(6iT@{X=D>>QQR zU?$Lfhl3w{slih)N|1Z0>*IrW5WnWkNRuz2M^%$Itp{i749txuLj|9`_dYLBc^uyD z-(b!kZCwfe`82=(U6@zTj~qFV>lH+Kh3VJJgxq$#vy{%#nxrrGC3#K5VqHDtrc7!D zQFYBjiC#!{I-TrQ$hkRSC{)l2@)ybTk)j9{=01-*!6%i%U8aA?=#qWwc>2~WbvMF|6^>`$116aO3BAU`rwk2=*B$B@!=}*u3Jn8 zCb{jTi`Ut!Y=m++urcO2dSj_EK(VpujF;1Mp0mJ==g~6G0}o6oxM1Ux=9%_4;`CKs zM?nI4W-0kA9!Jx=;I;}LRdKSs!r7&)`W0xhsT?uQytv}f?=rqF%jYc$4dplASWk)7 zoeeV444+cXw2IFPTHt%lM`s@3;SJ1H4J6H|wU7 zXI${mO4{vf2I#rG(y4q2=#{j7r4WQweJ=4^6}9?#bWPxinh}G(*yJB8%;gm0n;hzF zEfuKh^b@6AjY3l=&)g`N=tjJKQ~H$siA780uuuAJiCEr?A8%zcWfM@sh-&D~&+ihR zjhrY+EBxq9j<>Cgyp7$JXaH?^SZ(DLWhpP zGY(l#wfi8o`X4rGK25m--?@?n6Cf@y+EEjp^k%PPjg~^^*?J_k7J`qa5nJ;GaX&sHGaG$*11{DfKYg3@vK`CjNT z^TPnx>S&D2e);3rqEfjdgBhnSL@ZR?Hs2(TwmdFYgERqx)K&e34=JB$OG&kD?0X^0 zB7I8tbaZM~;S3joUCj9Dr4MEmSy6{>c*D?#C39-T<>6o>{!oM$I0v>5CH$bD8zj?{ zrYZ2r$gs1@;WjusH%55g>HdT3UsNhwIxlkY_{3QYoV+?>#9bf8%{@{W`vDx-!=#4g zFk-6cuV-shZRg59=q>vq6-1FIULK^IT(`72f~Wn4jQwbU^u0IwfRrGwNpT6pU6oid zUwwFc2<)a4YQ=>f|83f^0v{Yt&MUF>$X%)UaMN5BXV!VmJi=|U#>vA`-&Q=Ka_IV4 z_j~KWDmC@Y&X_Y#C6gRZaqqvZ6w++8oRJ6+*HKR$7OejyGgB1I7uzj)`Q%&I(%HH1 zwiUG1^V$+WqT1dP3QN}Aj)?G>4>NN(9e8d3P5`6CwiA6XD~6>IVBReqjkmn~WRQ0# zm6$ro@ot@pK%-_74GvsYKO!@wGaZ^P2=clreR?#gdik=t;8WSDlrLd}3eRyf92yk( z@K-tACQnRFk4?Y)3wq4_G52|nQ`QK|zsfrFP-ub%sQ*ydQ6PUVHj=BV)u;Uga3s)hbmtLdC}u+`j_dWox9 z8iJBu$kz&wxmEM1IDODt+yxXD-o>SQ%C<8OMxW5D+b_hKA?vg7W<*O&>0{0VQ3&mJ zc@jNoM?SMQWuN#&2afFT9Mt^PdoIg9z}Is6d~NZiW3vM>nMbYM!?;5h*7Pl2j!rO# zoBUkiiB_2^y*j|chqjf)EGO=lvyIkF^{1ai|JZKQ3gLKEWhvwvge z%)4&7G$fOxqNruhEMvstZ16+$xA%N6((Ybq|Ky{68@)9BInpWksWm8}RvC2rHjhc} zwux25g?*=uOo;a5wLF_2-P874#%fu5aC>vPN-T-t(?vM%j{(45bv-Y9IEV%QgLNq!9wHUh3w~?JtE9HfD~zres3;dGc)CW zMl3hmgK)VL`QdZt*mYCrB?9_U*O$wxwu|iw6=Ra&>{dT0h_6L~tBJa;Hxj4HWU~Wm zDdV=o+i^jD+hKAB`U7{C*($aw#j>Z*#7F8`ik@hmJQkT8!hikF>G?vRkE%&+IvFR& zyxs_e^OYnNN^~1sx2{N#gbf}*ZbHf)t z@AN!PUMT77Cwmt=b9`byiI!^bApQm`x$aS}5bvzZV+n0~`z z=L?Qwc}bf5q41%_QT|O)omvlh!eWb4NV0oblj+Zl*B&4!3L!Mk(2F0E@Ki{D&c)Vl@PsC5Ve*c^Y$?HK`D$KOa9)EHFV3P|)Gw=5OV_-mLFwaZpU|oJx#4j6hhgg37_ZOZ0-eaSlkR#~ z{jQQpH+Ufdb7aMH!1i;S20xTEGNE}*p-hVG3%3d?9V@)mL>8Q z{?ukpeA=iWsm%RQ`>DFOWsOT#)gOZ$-7|GoZ9L9=)USacb}Z>V8>Q{f1L3J{AujK& zohO^u3^CU{dK|v2ovM2rOS8nYB&5#cI20P;#GC*qbQ)r zN2!(6qC@)v^s2ypa&I(l*?*zl6f74=FJ#kL?nWitHD*Wddq^{q8ZDS9KExTSC}T7x z@aBxQ*ZJ}3tU3c>%ab>SKbdC}91kp?TatJB`q(GS_pEMLsQab(FU)W+_k7T0%ngYHj&8YT?-3pGJg94QU^pf$iHn8>iaco} zF>TlyUwf))TjEJ~hL|cAPy6iCnNvuY1)UNkkG*b@ZCH!?Y***pxDlBiR2PT9R|8g_ zjN{~R3XWjXSZ(qtJmNCnhw>ZQp2^BW`Av4LojRiFSD2_CGi!5BxU;>&)uK`v8@BPq z7U3F}?W7sw2%V@4-wK9e(t%lC8|B4To#^C{Sf^VVX-fH|d-C_MaCQ2u%sJnAYjn{e z)WCoCuuHlC=W|uXD(yyHtE7XbXl8Eq<`W$13Q13`%BCKalM}DJ#5M7==nXnvo40Sj z9M+`rz~_VK;=Fl)*?e&*+qsvsIX^Y`6Wd6!MnO7k>?Tv8TQINv*EvUPi1ZkiY;w{S}sx>C{Q zg@I&uE!vmwtiidq%W?M9^zS2|NT=4wi(o17o&>VgzGP7L^%4^|?-y71XC@%rs25-H zn>nfQ3l)y8LO*fvc5oiscQhc;;~i&M#3>x9oJA}8keL|f*w)H=$Y6B>i6WcBi?ibi}OstSmlOnf^Vyqb@Di zGU%a&<2856agWKa zB^897FmlnRb|NC)Vlmsow&a3d)HGtTWm!^j}SjB3{Um^aO_r$yBnTzeCNQM9YDK8A00IR?h63G z1S09`S{m!>{&5V$IDE;to$%1)l_g(9UBg{a)yL03E+H57{~+o7S$hH*)rW}b_{%# zuba-FuH!Hf@?Je}A-EPR6!J~DY~q>rdm3MAHa)w!{&~TReu32qTZ)7JS3kH0k9Op3 z=~mFfjQ~{>@GGK!+KET=ja`F8%{GNL^x4WwE$qx1qHo@%C0ceQ6Q@MGa28WmN4zYI zrO}Z+=^pu?4Q!g(8W5jW3h{&=q%%Jhz8X*b)4_h1}m1&|nrRt{)06pl(( zz~HG^f20SeI%Ao;;SS_gp|G&~VyrDyPqg3;0hxzXufC`Cnoe}4skWd$nDRZ$6vL@GjI ziZB?2fq?h~Qs|ff2*n4yOYu909>E7kBYDwDR0?pH6N9Dt(ltRKMnCY6_{d&p^q=$; zpI<64^iT}Icqu9=Ko!Yk#lL#^(DnToB)3-3`xJPZP8|J_=98k?^R!S5+lEMh&B?0#R00 zhC|>;m=XjFMXEvY1T`2EqYB63Rk44eGN$;@F%%qOmx@8IKw|J933v=1tAd0;VK^cL z4p%`yum}VKf+50`2?%9XEDWde7YYj+iBXjp&%Z{sONHO1Qi2lIkOXCjiZT|-ph7A` zka(CXgrK6#h!YD}gF~TvRCpZ9fJ!4{7}H52V_XS}UKH28j$Oe~I+n(oAeh4M&^?Q# zCx%XBIB0^*NEF|I|3Ga>WP&vvv#X|(imD0{27|$&YH(#`rN4OF5okV)O5EjCf+{G( z_S|=;1;t2)AuMLMP8kGyc1A8JT^a#Hr_yYwR8LLNZUDet&p*4-jOB#K&@p-#I)On7 zg(;(;Fcb`Gql84kl~D+!92AQBmFX@Wnu;e81OF%V?&1MzFz}2iHzN5k#t+;x{l22C z3EscAes6k`_LdS5xVI=!7~JnE_+b19_`Nt8T)%hW+%ObZ0%Q01Rjz;7N&ihLU=UcW znhF*UQBzW5lmZ@$g!pzH5C6pO*HlZf7xUhe!tron-^m* zRQz)@{H59Mw)21Z`!yH;ha)hk{~hEX>HDu-|H}1`6!=Hrf2-?Xx&Dy?{|NkVb^Wi& zb?`r*Qv?d*UywiJV@bVpbcXSvwGV4*s0RQP#e!js7Q2^`qYnVU!Ml4g0d8doGK>f4 z#%TQmU-$9x$^-Pn@Rbacsj;4pjbK-7!plQ1pq%>-CvDm1$IBLFsM)S%0z@PMSlbH= zcRejxEOK8TyS#qgqnj!JW$CJI@W`{En!0U_e~XK+Eb_hTgw5$qW|9GqC}8*%8-o^L NtZ%MY`rEni{{p3kF53VA literal 0 HcmV?d00001 diff --git a/assets/icons/MainMenu/Xtreme_14/frame_09.png b/assets/icons/MainMenu/Xtreme_14/frame_09.png new file mode 100644 index 0000000000000000000000000000000000000000..e2f07516a179ddc8a0abad14d697fc124d2943c4 GIT binary patch literal 8881 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 literal 0 HcmV?d00001 diff --git a/assets/icons/MainMenu/Xtreme_14/frame_10.png b/assets/icons/MainMenu/Xtreme_14/frame_10.png new file mode 100644 index 0000000000000000000000000000000000000000..a888dd8a7a13e2483b8d7fe4d0466db12a464958 GIT binary patch literal 9296 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 literal 0 HcmV?d00001 diff --git a/assets/icons/MainMenu/Xtreme_14/frame_rate b/assets/icons/MainMenu/Xtreme_14/frame_rate new file mode 100644 index 000000000..e440e5c84 --- /dev/null +++ b/assets/icons/MainMenu/Xtreme_14/frame_rate @@ -0,0 +1 @@ +3 \ No newline at end of file From 8d78d6b524dfc23f14cd2868ba50deeef651a757 Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Mon, 20 Feb 2023 19:57:19 +0000 Subject: [PATCH 317/506] Small xtreme settings tweaks --- applications/main/xtreme_app/application.fam | 2 +- .../desktop/scenes/desktop_scene_lock_menu.c | 2 +- assets/icons/MainMenu/Xtreme_14/frame_11.png | Bin 9295 -> 0 bytes 3 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 assets/icons/MainMenu/Xtreme_14/frame_11.png diff --git a/applications/main/xtreme_app/application.fam b/applications/main/xtreme_app/application.fam index 8807b6dca..1cbbacf39 100644 --- a/applications/main/xtreme_app/application.fam +++ b/applications/main/xtreme_app/application.fam @@ -1,6 +1,6 @@ App( appid="xtreme_app", - name="Xtreme FW", + name="Xtreme Settings", apptype=FlipperAppType.APP, entry_point="xtreme_app", requires=[ diff --git a/applications/services/desktop/scenes/desktop_scene_lock_menu.c b/applications/services/desktop/scenes/desktop_scene_lock_menu.c index a0a2c08e9..9b4eabffd 100644 --- a/applications/services/desktop/scenes/desktop_scene_lock_menu.c +++ b/applications/services/desktop/scenes/desktop_scene_lock_menu.c @@ -98,7 +98,7 @@ bool desktop_scene_lock_menu_on_event(void* context, SceneManagerEvent event) { break; case DesktopLockMenuEventXtremeSettings: - loader_start(desktop->loader, "Xtreme FW", NULL); + loader_start(desktop->loader, "Xtreme Settings", NULL); break; default: break; diff --git a/assets/icons/MainMenu/Xtreme_14/frame_11.png b/assets/icons/MainMenu/Xtreme_14/frame_11.png deleted file mode 100644 index 8737ae1ad94dc88abfc0085670e51a94d47071a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9295 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 From 85e77d82dbcf8de9fa00dd6e66369500197110d7 Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Mon, 20 Feb 2023 20:30:40 +0000 Subject: [PATCH 318/506] Remove dolphin deeds (xp) from games --- applications/plugins/arkanoid/arkanoid_game.c | 4 ---- applications/plugins/blackjack/blackjack.c | 7 +------ applications/plugins/doom/doom.c | 4 ---- applications/plugins/flappy_bird/flappy_bird.c | 9 --------- applications/plugins/game15/game15.c | 4 ---- applications/plugins/game_2048/game_2048.c | 4 ---- applications/plugins/heap_defence_game/heap_defence.c | 4 ---- applications/plugins/minesweeper/minesweeper.c | 7 ------- applications/plugins/pomodoro/flipp_pomodoro_app.c | 7 +------ applications/plugins/snake_game/snake_game.c | 3 --- applications/plugins/solitaire/solitaire.c | 5 ----- applications/plugins/tetris_game/tetris_game.c | 10 +--------- applications/plugins/tictactoe_game/tictactoe_game.c | 6 +----- applications/plugins/zombiez/zombiez.c | 6 +----- applications/services/dolphin/helpers/dolphin_deed.c | 2 -- applications/services/dolphin/helpers/dolphin_deed.h | 2 -- 16 files changed, 5 insertions(+), 79 deletions(-) diff --git a/applications/plugins/arkanoid/arkanoid_game.c b/applications/plugins/arkanoid/arkanoid_game.c index 0b9bb91e9..af9976c98 100644 --- a/applications/plugins/arkanoid/arkanoid_game.c +++ b/applications/plugins/arkanoid/arkanoid_game.c @@ -5,7 +5,6 @@ #include #include #include -#include #define TAG "Arkanoid" @@ -398,9 +397,6 @@ int32_t arkanoid_game_app(void* p) { Gui* gui = furi_record_open(RECORD_GUI); gui_add_view_port(gui, view_port, GuiLayerFullscreen); - // Call dolphin deed on game start - DOLPHIN_DEED(DolphinDeedPluginGameStart); - GameEvent event; for(bool processing = true; processing;) { FuriStatus event_status = furi_message_queue_get(event_queue, &event, 100); diff --git a/applications/plugins/blackjack/blackjack.c b/applications/plugins/blackjack/blackjack.c index 9314e21dd..384104378 100644 --- a/applications/plugins/blackjack/blackjack.c +++ b/applications/plugins/blackjack/blackjack.c @@ -1,7 +1,6 @@ #include #include -#include #include #include @@ -278,7 +277,6 @@ void dealer_tick(GameState* game_state) { if(dealer_score >= DEALER_MAX) { if(dealer_score > 21 || dealer_score < player_score) { - DOLPHIN_DEED(DolphinDeedPluginGameWin); enqueue( &(game_state->queue_state), game_state, @@ -572,9 +570,6 @@ int32_t blackjack_app(void* p) { AppEvent event; - // Call dolphin deed on game start - DOLPHIN_DEED(DolphinDeedPluginGameStart); - for(bool processing = true; processing;) { FuriStatus event_status = furi_message_queue_get(event_queue, &event, 100); GameState* localstate = (GameState*)acquire_mutex_block(&state_mutex); @@ -635,4 +630,4 @@ free_and_exit: furi_message_queue_free(event_queue); return return_code; -} \ No newline at end of file +} diff --git a/applications/plugins/doom/doom.c b/applications/plugins/doom/doom.c index 65b63c75b..78a06055c 100644 --- a/applications/plugins/doom/doom.c +++ b/applications/plugins/doom/doom.c @@ -13,7 +13,6 @@ #include "level.h" #include #include -#include #define SOUND @@ -996,9 +995,6 @@ int32_t doom_app() { music_player_worker_load_rtttl_from_string(plugin_state->music_instance->worker, dsintro); music_player_worker_start(plugin_state->music_instance->worker); #endif - // Call dolphin deed on game start - DOLPHIN_DEED(DolphinDeedPluginGameStart); - for(bool processing = true; processing;) { FuriStatus event_status = furi_message_queue_get(event_queue, &event, 100); PluginState* plugin_state = (PluginState*)acquire_mutex_block(&state_mutex); diff --git a/applications/plugins/flappy_bird/flappy_bird.c b/applications/plugins/flappy_bird/flappy_bird.c index 2a885f985..2eeaf7816 100644 --- a/applications/plugins/flappy_bird/flappy_bird.c +++ b/applications/plugins/flappy_bird/flappy_bird.c @@ -1,12 +1,10 @@ #include -#include #include #include #include #include #include -#include #define TAG "Flappy" #define DEBUG false @@ -257,10 +255,6 @@ static void flappy_game_render_callback(Canvas* const canvas, void* ctx) { canvas_set_font(canvas, FontPrimary); canvas_draw_str(canvas, 37, 31, "Game Over"); - if(game_state->points != 0 && game_state->points % 5 == 0) { - DOLPHIN_DEED(getRandomDeed()); - } - canvas_set_font(canvas, FontSecondary); char buffer[12]; snprintf(buffer, sizeof(buffer), "Score: %u", game_state->points); @@ -313,9 +307,6 @@ int32_t flappy_game_app(void* p) { Gui* gui = furi_record_open(RECORD_GUI); gui_add_view_port(gui, view_port, GuiLayerFullscreen); - // Call dolphin deed on game start - DOLPHIN_DEED(DolphinDeedPluginGameStart); - GameEvent event; for(bool processing = true; processing;) { FuriStatus event_status = furi_message_queue_get(event_queue, &event, 100); diff --git a/applications/plugins/game15/game15.c b/applications/plugins/game15/game15.c index 43d2e12f4..8faea4380 100644 --- a/applications/plugins/game15/game15.c +++ b/applications/plugins/game15/game15.c @@ -3,7 +3,6 @@ #include #include #include -#include #include "sandbox.h" @@ -463,9 +462,6 @@ int32_t game15_app() { sandbox_init( FPS, (SandboxRenderCallback)render_callback, (SandboxEventHandler)game_event_handler); - // Call dolphin deed on game start - DOLPHIN_DEED(DolphinDeedPluginGameStart); - sandbox_loop(); sandbox_free(); game_free(); diff --git a/applications/plugins/game_2048/game_2048.c b/applications/plugins/game_2048/game_2048.c index 1a2f4a4d3..097f0d3d5 100644 --- a/applications/plugins/game_2048/game_2048.c +++ b/applications/plugins/game_2048/game_2048.c @@ -13,7 +13,6 @@ #include #include #include -#include #include "digits.h" #include "array_utils.h" @@ -398,9 +397,6 @@ int32_t game_2048_app() { Gui* gui = furi_record_open(RECORD_GUI); gui_add_view_port(gui, view_port, GuiLayerFullscreen); - // Call dolphin deed on game start - DOLPHIN_DEED(DolphinDeedPluginGameStart); - bool is_finished = false; while(!is_finished) { FuriStatus event_status = furi_message_queue_get(event_queue, &input, FuriWaitForever); diff --git a/applications/plugins/heap_defence_game/heap_defence.c b/applications/plugins/heap_defence_game/heap_defence.c index e40a97803..a22a8db22 100644 --- a/applications/plugins/heap_defence_game/heap_defence.c +++ b/applications/plugins/heap_defence_game/heap_defence.c @@ -15,7 +15,6 @@ #include #include #include -#include #define Y_FIELD_SIZE 6 #define Y_LAST (Y_FIELD_SIZE - 1) @@ -531,9 +530,6 @@ int32_t heap_defence_app(void* p) { game->game_status = 0; game->animation = AnimationPause; - // Call dolphin deed on game start - DOLPHIN_DEED(DolphinDeedPluginGameStart); - GameEvent event = {0}; while(event.input.key != InputKeyBack) { if(furi_message_queue_get(event_queue, &event, 100) != FuriStatusOk) { diff --git a/applications/plugins/minesweeper/minesweeper.c b/applications/plugins/minesweeper/minesweeper.c index cbc1329bc..cbfeb2aa1 100644 --- a/applications/plugins/minesweeper/minesweeper.c +++ b/applications/plugins/minesweeper/minesweeper.c @@ -8,7 +8,6 @@ #include #include -#include #include "assets.h" @@ -253,9 +252,6 @@ static bool game_won(Minesweeper* minesweeper_state) { dialog_message_set_buttons(message, NULL, "Play again", NULL); dialog_message_set_icon(message, NULL, 72, 17); - // Call dolphin deed when we win the game - DOLPHIN_DEED(DolphinDeedPluginGameWin); - DialogMessageButton choice = dialog_message_show(dialogs, message); dialog_message_free(message); furi_string_free(tempStr); @@ -410,9 +406,6 @@ int32_t minesweeper_app(void* p) { Gui* gui = furi_record_open("gui"); gui_add_view_port(gui, view_port, GuiLayerFullscreen); - // Call dolphin deed on game start - DOLPHIN_DEED(DolphinDeedPluginGameStart); - PluginEvent event; for(bool processing = true; processing;) { FuriStatus event_status = furi_message_queue_get(event_queue, &event, 100); diff --git a/applications/plugins/pomodoro/flipp_pomodoro_app.c b/applications/plugins/pomodoro/flipp_pomodoro_app.c index ed5b8282b..2ddf8cf68 100644 --- a/applications/plugins/pomodoro/flipp_pomodoro_app.c +++ b/applications/plugins/pomodoro/flipp_pomodoro_app.c @@ -29,11 +29,6 @@ static bool flipp_pomodoro_app_custom_event_callback(void* ctx, uint32_t event) app->view_dispatcher, FlippPomodoroAppCustomEventStateUpdated); return CustomEventConsumed; case FlippPomodoroAppCustomEventStageComplete: - if(flipp_pomodoro__get_stage(app->state) == FlippPomodoroStageFocus) { - // REGISTER a deed on work stage complete to get an acheivement - DOLPHIN_DEED(DolphinDeedPluginGameWin); - }; - flipp_pomodoro__toggle_stage(app->state); notification_message( app->notification_app, @@ -98,4 +93,4 @@ int32_t flipp_pomodoro_app(void* p) { flipp_pomodoro_app_free(app); return 0; -}; \ No newline at end of file +}; diff --git a/applications/plugins/snake_game/snake_game.c b/applications/plugins/snake_game/snake_game.c index 2815e2f37..d2eb22f13 100644 --- a/applications/plugins/snake_game/snake_game.c +++ b/applications/plugins/snake_game/snake_game.c @@ -2,7 +2,6 @@ #include #include #include -#include #include #include @@ -346,8 +345,6 @@ int32_t snake_game_app(void* p) { notification_message_block(notification, &sequence_display_backlight_enforce_on); - DOLPHIN_DEED(DolphinDeedPluginGameStart); - SnakeEvent event; for(bool processing = true; processing;) { FuriStatus event_status = furi_message_queue_get(event_queue, &event, 100); diff --git a/applications/plugins/solitaire/solitaire.c b/applications/plugins/solitaire/solitaire.c index bfb533d82..78205ad69 100644 --- a/applications/plugins/solitaire/solitaire.c +++ b/applications/plugins/solitaire/solitaire.c @@ -1,5 +1,4 @@ #include -#include #include #include #include "defines.h" @@ -277,7 +276,6 @@ void tick(GameState* game_state, NotificationApp* notification) { if(game_state->state == GameStatePlay) { if(game_state->top_cards[0].character == 11 && game_state->top_cards[1].character == 11 && game_state->top_cards[2].character == 11 && game_state->top_cards[3].character == 11) { - DOLPHIN_DEED(DolphinDeedPluginGameWin); game_state->state = GameStateAnimate; return; } @@ -492,9 +490,6 @@ int32_t solitaire_app(void* p) { AppEvent event; - // Call Dolphin deed on game start - DOLPHIN_DEED(DolphinDeedPluginGameStart); - for(bool processing = true; processing;) { FuriStatus event_status = furi_message_queue_get(event_queue, &event, 150); GameState* localstate = (GameState*)acquire_mutex_block(&state_mutex); diff --git a/applications/plugins/tetris_game/tetris_game.c b/applications/plugins/tetris_game/tetris_game.c index 366f405f3..1e8e85afa 100644 --- a/applications/plugins/tetris_game/tetris_game.c +++ b/applications/plugins/tetris_game/tetris_game.c @@ -6,7 +6,6 @@ #include #include #include -#include #define BORDER_OFFSET 1 #define MARGIN_OFFSET 3 @@ -154,10 +153,6 @@ static void tetris_game_render_callback(Canvas* const canvas, void* ctx) { canvas_set_font(canvas, FontPrimary); canvas_draw_str(canvas, 4, 63, "Game Over"); - if(tetris_state->numLines % 8 == 0 && tetris_state->numLines != 0) { - DOLPHIN_DEED(getRandomDeed()); - } - char buffer[13]; snprintf(buffer, sizeof(buffer), "Lines: %u", tetris_state->numLines); canvas_set_font(canvas, FontSecondary); @@ -395,9 +390,6 @@ int32_t tetris_game_app() { Piece* newPiece = malloc(sizeof(Piece)); uint8_t downRepeatCounter = 0; - // Call dolphin deed on game start - DOLPHIN_DEED(DolphinDeedPluginGameStart); - for(bool processing = true; processing;) { // This 10U implicitly sets the game loop speed. downRepeatCounter relies on this value FuriStatus event_status = furi_message_queue_get(event_queue, &event, 10U); @@ -484,4 +476,4 @@ int32_t tetris_game_app() { free(tetris_state); return 0; -} \ No newline at end of file +} diff --git a/applications/plugins/tictactoe_game/tictactoe_game.c b/applications/plugins/tictactoe_game/tictactoe_game.c index ec82192a8..93536c61a 100644 --- a/applications/plugins/tictactoe_game/tictactoe_game.c +++ b/applications/plugins/tictactoe_game/tictactoe_game.c @@ -3,7 +3,6 @@ #include #include #include -#include #define TAG "TicTacToe" @@ -331,9 +330,6 @@ int32_t tictactoe_game_app(void* p) { Gui* gui = furi_record_open(RECORD_GUI); gui_add_view_port(gui, view_port, GuiLayerFullscreen); - // Call dolphin deed on game start - DOLPHIN_DEED(DolphinDeedPluginGameStart); - GameEvent event; for(bool processing = true; processing;) { FuriStatus event_status = furi_message_queue_get(event_queue, &event, 100); @@ -383,4 +379,4 @@ int32_t tictactoe_game_app(void* p) { free(tictactoe_state); return 0; -} \ No newline at end of file +} diff --git a/applications/plugins/zombiez/zombiez.c b/applications/plugins/zombiez/zombiez.c index 2677d13e0..af873ef20 100644 --- a/applications/plugins/zombiez/zombiez.c +++ b/applications/plugins/zombiez/zombiez.c @@ -2,7 +2,6 @@ #include #include #include -#include //ORIGINAL REPO: https://github.com/Dooskington/flipperzero-zombiez //AUTHORS: https://github.com/Dooskington | https://github.com/DevMilanIan @@ -314,9 +313,6 @@ int32_t zombiez_game_app(void* p) { Gui* gui = furi_record_open(RECORD_GUI); gui_add_view_port(gui, view_port, GuiLayerFullscreen); - // Call dolphin deed on game start - DOLPHIN_DEED(DolphinDeedPluginGameStart); - PluginEvent event; bool isRunning = true; while(isRunning) { @@ -401,4 +397,4 @@ free_and_exit: furi_message_queue_free(event_queue); return return_code; -} \ No newline at end of file +} diff --git a/applications/services/dolphin/helpers/dolphin_deed.c b/applications/services/dolphin/helpers/dolphin_deed.c index 4b9f11599..2cbaf84a6 100644 --- a/applications/services/dolphin/helpers/dolphin_deed.c +++ b/applications/services/dolphin/helpers/dolphin_deed.c @@ -40,8 +40,6 @@ static const DolphinDeedWeight dolphin_deed_weights[] = { {1, DolphinAppPlugin}, // DolphinDeedGpioUartBridge {1, DolphinAppPlugin}, // DolphinDeedPluginStart - {1, DolphinAppPlugin}, // DolphinDeedPluginGameStart - {10, DolphinAppPlugin}, // DolphinDeedPluginGameWin }; static uint8_t dolphin_deed_limits[] = { diff --git a/applications/services/dolphin/helpers/dolphin_deed.h b/applications/services/dolphin/helpers/dolphin_deed.h index 51adf6b20..d81166417 100644 --- a/applications/services/dolphin/helpers/dolphin_deed.h +++ b/applications/services/dolphin/helpers/dolphin_deed.h @@ -56,8 +56,6 @@ typedef enum { DolphinDeedGpioUartBridge, DolphinDeedPluginStart, - DolphinDeedPluginGameStart, - DolphinDeedPluginGameWin, DolphinDeedMAX, From 663eb6cd6d4a14d00caf93d402b71eadb9a4d63f Mon Sep 17 00:00:00 2001 From: Liam Hays Date: Tue, 21 Feb 2023 00:15:48 -0700 Subject: [PATCH 319/506] Display Mifare Classic data in NFC app (#2389) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add data display for Mifare Classic cards. * Clean up log statements and data display. Co-authored-by: あく --- .../main/nfc/scenes/nfc_scene_config.h | 1 + .../nfc/scenes/nfc_scene_mf_classic_data.c | 106 ++++++++++++++++++ .../main/nfc/scenes/nfc_scene_nfc_data_info.c | 6 +- .../main/nfc/scenes/nfc_scene_saved_menu.c | 2 + 4 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 applications/main/nfc/scenes/nfc_scene_mf_classic_data.c diff --git a/applications/main/nfc/scenes/nfc_scene_config.h b/applications/main/nfc/scenes/nfc_scene_config.h index f81fe178e..a9da07dfd 100644 --- a/applications/main/nfc/scenes/nfc_scene_config.h +++ b/applications/main/nfc/scenes/nfc_scene_config.h @@ -29,6 +29,7 @@ ADD_SCENE(nfc, mf_desfire_menu, MfDesfireMenu) ADD_SCENE(nfc, mf_desfire_data, MfDesfireData) ADD_SCENE(nfc, mf_desfire_app, MfDesfireApp) ADD_SCENE(nfc, mf_classic_read_success, MfClassicReadSuccess) +ADD_SCENE(nfc, mf_classic_data, MfClassicData) ADD_SCENE(nfc, mf_classic_menu, MfClassicMenu) ADD_SCENE(nfc, mf_classic_emulate, MfClassicEmulate) ADD_SCENE(nfc, mf_classic_keys, MfClassicKeys) diff --git a/applications/main/nfc/scenes/nfc_scene_mf_classic_data.c b/applications/main/nfc/scenes/nfc_scene_mf_classic_data.c new file mode 100644 index 000000000..dcb02d364 --- /dev/null +++ b/applications/main/nfc/scenes/nfc_scene_mf_classic_data.c @@ -0,0 +1,106 @@ +#include "../nfc_i.h" + +void nfc_scene_mf_classic_data_on_enter(void* context) { + Nfc* nfc = context; + MfClassicType type = nfc->dev->dev_data.mf_classic_data.type; + MfClassicData* data = &nfc->dev->dev_data.mf_classic_data; + TextBox* text_box = nfc->text_box; + + text_box_set_font(text_box, TextBoxFontHex); + + int card_blocks = 0; + if(type == MfClassicType1k) { + card_blocks = MF_CLASSIC_1K_TOTAL_SECTORS_NUM * 4; + } else if(type == MfClassicType4k) { + // 16 sectors of 4 blocks each plus 8 sectors of 16 blocks each + card_blocks = MF_CLASSIC_1K_TOTAL_SECTORS_NUM * 4 + 8 * 16; + } else if(type == MfClassicTypeMini) { + card_blocks = MF_MINI_TOTAL_SECTORS_NUM * 4; + } + + int bytes_written = 0; + for(int block_num = 0; block_num < card_blocks; block_num++) { + bool is_sec_trailer = mf_classic_is_sector_trailer(block_num); + if(is_sec_trailer) { + uint8_t sector_num = mf_classic_get_sector_by_block(block_num); + MfClassicSectorTrailer* sec_tr = + mf_classic_get_sector_trailer_by_sector(data, sector_num); + // Key A + for(size_t i = 0; i < sizeof(sec_tr->key_a); i += 2) { + if((bytes_written % 8 == 0) && (bytes_written != 0)) { + furi_string_push_back(nfc->text_box_store, '\n'); + } + if(mf_classic_is_key_found(data, sector_num, MfClassicKeyA)) { + furi_string_cat_printf( + nfc->text_box_store, "%02X%02X ", sec_tr->key_a[i], sec_tr->key_a[i + 1]); + } else { + furi_string_cat_printf(nfc->text_box_store, "???? "); + } + bytes_written += 2; + } + // Access bytes + for(size_t i = 0; i < MF_CLASSIC_ACCESS_BYTES_SIZE; i += 2) { + if((bytes_written % 8 == 0) && (bytes_written != 0)) { + furi_string_push_back(nfc->text_box_store, '\n'); + } + if(mf_classic_is_block_read(data, block_num)) { + furi_string_cat_printf( + nfc->text_box_store, + "%02X%02X ", + sec_tr->access_bits[i], + sec_tr->access_bits[i + 1]); + } else { + furi_string_cat_printf(nfc->text_box_store, "???? "); + } + bytes_written += 2; + } + // Key B + for(size_t i = 0; i < sizeof(sec_tr->key_b); i += 2) { + if((bytes_written % 8 == 0) && (bytes_written != 0)) { + furi_string_push_back(nfc->text_box_store, '\n'); + } + if(mf_classic_is_key_found(data, sector_num, MfClassicKeyB)) { + furi_string_cat_printf( + nfc->text_box_store, "%02X%02X ", sec_tr->key_b[i], sec_tr->key_b[i + 1]); + } else { + furi_string_cat_printf(nfc->text_box_store, "???? "); + } + bytes_written += 2; + } + } else { + // Write data block + for(size_t i = 0; i < MF_CLASSIC_BLOCK_SIZE; i += 2) { + if((bytes_written % 8 == 0) && (bytes_written != 0)) { + furi_string_push_back(nfc->text_box_store, '\n'); + } + if(mf_classic_is_block_read(data, block_num)) { + furi_string_cat_printf( + nfc->text_box_store, + "%02X%02X ", + data->block[block_num].value[i], + data->block[block_num].value[i + 1]); + } else { + furi_string_cat_printf(nfc->text_box_store, "???? "); + } + bytes_written += 2; + } + } + } + text_box_set_text(text_box, furi_string_get_cstr(nfc->text_box_store)); + + view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewTextBox); +} + +bool nfc_scene_mf_classic_data_on_event(void* context, SceneManagerEvent event) { + UNUSED(context); + UNUSED(event); + return false; +} + +void nfc_scene_mf_classic_data_on_exit(void* context) { + Nfc* nfc = context; + + // Clean view + text_box_reset(nfc->text_box); + furi_string_reset(nfc->text_box_store); +} diff --git a/applications/main/nfc/scenes/nfc_scene_nfc_data_info.c b/applications/main/nfc/scenes/nfc_scene_nfc_data_info.c index b44ab7823..92ad7b56e 100644 --- a/applications/main/nfc/scenes/nfc_scene_nfc_data_info.c +++ b/applications/main/nfc/scenes/nfc_scene_nfc_data_info.c @@ -14,7 +14,8 @@ void nfc_scene_nfc_data_info_on_enter(void* context) { NfcDeviceData* dev_data = &nfc->dev->dev_data; NfcProtocol protocol = dev_data->protocol; uint8_t text_scroll_height = 0; - if((protocol == NfcDeviceProtocolMifareDesfire) || (protocol == NfcDeviceProtocolMifareUl)) { + if((protocol == NfcDeviceProtocolMifareDesfire) || (protocol == NfcDeviceProtocolMifareUl) || + (protocol == NfcDeviceProtocolMifareClassic)) { widget_add_button_element( widget, GuiButtonTypeRight, "More", nfc_scene_nfc_data_info_widget_callback, nfc); text_scroll_height = 52; @@ -136,6 +137,9 @@ bool nfc_scene_nfc_data_info_on_event(void* context, SceneManagerEvent event) { } else if(protocol == NfcDeviceProtocolMifareUl) { scene_manager_next_scene(nfc->scene_manager, NfcSceneMfUltralightData); consumed = true; + } else if(protocol == NfcDeviceProtocolMifareClassic) { + scene_manager_next_scene(nfc->scene_manager, NfcSceneMfClassicData); + consumed = true; } } } diff --git a/applications/main/nfc/scenes/nfc_scene_saved_menu.c b/applications/main/nfc/scenes/nfc_scene_saved_menu.c index 04c686fbe..f42e0fe95 100644 --- a/applications/main/nfc/scenes/nfc_scene_saved_menu.c +++ b/applications/main/nfc/scenes/nfc_scene_saved_menu.c @@ -150,6 +150,8 @@ bool nfc_scene_saved_menu_on_event(void* context, SceneManagerEvent event) { application_info_present = nfc_supported_card_verify_and_parse(dev_data); } + FURI_LOG_I("nfc", "application_info_present: %d", application_info_present); + if(application_info_present) { scene_manager_next_scene(nfc->scene_manager, NfcSceneDeviceInfo); } else { From 9690dba7fe0df77032395bb2d626bbb14b214656 Mon Sep 17 00:00:00 2001 From: amec0e <88857687+amec0e@users.noreply.github.com> Date: Tue, 21 Feb 2023 15:21:57 +0000 Subject: [PATCH 320/506] Updated ac.ir New additions --- assets/resources/infrared/assets/ac.ir | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/assets/resources/infrared/assets/ac.ir b/assets/resources/infrared/assets/ac.ir index e55c27f30..3b25a5c86 100644 --- a/assets/resources/infrared/assets/ac.ir +++ b/assets/resources/infrared/assets/ac.ir @@ -1,7 +1,7 @@ Filetype: IR library file Version: 1 -# Last Updated 15th Feb, 2023 -# Last Checked 15th Feb, 2023 +# Last Updated 21st Feb, 2023 +# Last Checked 21st Feb, 2023 # name: POWER type: raw @@ -1560,3 +1560,15 @@ type: raw frequency: 38000 duty_cycle: 0.330000 data: 8838 3941 624 1427 514 500 515 497 541 473 540 1487 540 474 539 474 538 476 512 1538 514 1516 544 466 514 497 514 501 514 499 514 500 513 499 513 501 487 525 514 499 512 502 487 526 512 1517 542 470 487 1539 513 499 512 503 513 499 512 1513 512 +# +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 8364 4223 621 1958 1115 1478 593 1986 1082 1566 1072 1497 576 2003 1069 1513 1069 1541 1070 1505 1069 1505 1069 1497 1070 1550 1069 1530 1045 1522 551 2028 1045 1582 1044 1530 1044 1522 1045 1530 1044 1566 1045 1530 1045 1530 550 2021 550 2064 1044 1530 1044 1523 1043 1531 1044 1566 1045 1531 1043 1531 1044 1523 1044 1575 1043 1531 1044 1523 1044 1531 1044 1567 1044 1531 1043 1531 1044 1524 1043 1575 1043 1532 1043 1524 1043 1532 1043 1568 1042 1532 1043 1532 1043 1524 1043 1576 1042 1532 1043 1524 1043 1532 1042 1569 1042 1533 1016 1558 1042 1525 1042 1577 1016 1558 523 2048 1042 1525 547 2071 1041 1533 523 2049 522 2049 522 +# +name: MODE +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 8362 4223 595 1983 1116 1480 592 1987 1081 1567 1070 1524 550 2029 1043 1540 1042 1568 1043 1532 549 2030 1042 1540 1042 1568 1042 1532 1042 1532 549 2022 549 2065 1043 1528 1043 1532 1043 1524 1042 1576 1042 1532 1042 1525 548 2030 549 2082 1042 1524 1042 1533 1042 1525 1042 1576 1042 1533 1042 1525 1041 1533 1042 1569 1042 1533 1042 1533 1042 1525 1041 1577 1041 1533 1042 1525 1041 1534 1041 1569 1042 1533 1041 1534 1040 1526 1041 1578 1041 1534 1041 1526 1040 1534 1041 1570 1041 1534 1015 1560 1015 1552 1015 1604 1040 1535 1040 1527 1039 1535 1014 1597 1013 1561 1014 1561 1013 1554 519 2129 987 1554 544 2036 518 2093 987 From 2bcb15b8bc5db6673c41b7537ed672153765b9f7 Mon Sep 17 00:00:00 2001 From: amec0e <88857687+amec0e@users.noreply.github.com> Date: Tue, 21 Feb 2023 15:25:20 +0000 Subject: [PATCH 321/506] Updated audio.ir New additions --- assets/resources/infrared/assets/audio.ir | 28 +++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/assets/resources/infrared/assets/audio.ir b/assets/resources/infrared/assets/audio.ir index 1bb3c11e0..d1db3270c 100644 --- a/assets/resources/infrared/assets/audio.ir +++ b/assets/resources/infrared/assets/audio.ir @@ -1,7 +1,7 @@ Filetype: IR library file Version: 1 -# Last Updated 15th Feb, 2023 -# Last Checked 15th Feb, 2023 +# Last Updated 21st Feb, 2023 +# Last Checked 21st Feb, 2023 # name: POWER type: parsed @@ -2068,3 +2068,27 @@ type: raw frequency: 38000 duty_cycle: 0.330000 data: 325 50440 173 137541 4551 4465 530 475 529 475 529 474 530 474 530 1479 530 1479 529 476 528 477 527 1480 554 1457 551 1480 528 1481 527 477 527 478 526 478 526 478 526 4497 525 478 526 478 526 478 526 478 526 479 525 479 525 479 525 1484 525 1483 526 1484 525 1483 526 479 525 1483 526 1483 526 1483 526 479 525 479 525 479 525 479 525 1484 525 +# +name: POWER +type: parsed +protocol: NECext +address: 30 FC 00 00 +command: 10 EF 00 00 +# +name: MUTE +type: parsed +protocol: NECext +address: 30 FC 00 00 +command: 0C F3 00 00 +# +name: VOL+ +type: parsed +protocol: NECext +address: 30 FC 00 00 +command: 0D F2 00 00 +# +name: VOL- +type: parsed +protocol: NECext +address: 30 FC 00 00 +command: 17 E8 00 00 From 11b3484f4b30b4c1e9f2c3f60c8dabd05ee599f1 Mon Sep 17 00:00:00 2001 From: amec0e <88857687+amec0e@users.noreply.github.com> Date: Tue, 21 Feb 2023 15:25:51 +0000 Subject: [PATCH 322/506] Updated fans.ir Updated last checked --- assets/resources/infrared/assets/fans.ir | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/resources/infrared/assets/fans.ir b/assets/resources/infrared/assets/fans.ir index c30f58e5e..535f96274 100644 --- a/assets/resources/infrared/assets/fans.ir +++ b/assets/resources/infrared/assets/fans.ir @@ -1,7 +1,7 @@ Filetype: IR library file Version: 1 # Last Updated 15th Feb, 2023 -# Last Checked 15th Feb, 2023 +# Last Checked 21st Feb, 2023 # name: POWER type: raw From d16d1f43fc036fd2217ff46eac4a06d994fd9db0 Mon Sep 17 00:00:00 2001 From: amec0e <88857687+amec0e@users.noreply.github.com> Date: Tue, 21 Feb 2023 15:26:38 +0000 Subject: [PATCH 323/506] Updated projectors.ir New additions --- assets/resources/infrared/assets/projectors.ir | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/assets/resources/infrared/assets/projectors.ir b/assets/resources/infrared/assets/projectors.ir index 6378f2d12..d073dccfa 100644 --- a/assets/resources/infrared/assets/projectors.ir +++ b/assets/resources/infrared/assets/projectors.ir @@ -1,7 +1,7 @@ Filetype: IR library file Version: 1 -# Last Updated 8th Feb, 2023 -# Last Checked 15th Feb, 2023 +# Last Updated 21st Feb, 2023 +# Last Checked 21st Feb, 2023 # # ON name: POWER @@ -838,3 +838,9 @@ type: parsed protocol: NECext address: 87 45 00 00 command: 52 AD 00 00 +# +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 8811 4222 530 1580 531 1579 531 507 531 507 531 507 531 508 531 508 530 1582 528 1583 527 535 503 1608 502 536 501 1609 501 537 501 1610 500 538 500 1611 499 538 500 539 500 538 500 1611 500 539 499 538 500 1611 499 539 499 1611 499 1611 500 1611 499 539 499 1611 500 1611 500 539 499 35437 8784 4252 500 1611 500 1612 500 539 500 539 500 539 500 539 500 539 500 1611 500 1612 499 539 500 1612 500 539 500 1612 499 539 500 1612 500 539 500 1612 499 539 500 539 500 539 499 1612 499 540 499 539 500 1612 499 539 500 1612 499 1613 499 1612 499 539 500 1612 500 1612 500 539 500 From 36debf25fbc7a7070a1554d78389ca321f7c35d8 Mon Sep 17 00:00:00 2001 From: amec0e <88857687+amec0e@users.noreply.github.com> Date: Tue, 21 Feb 2023 15:27:01 +0000 Subject: [PATCH 324/506] Updated tv.ir Updated last checked --- assets/resources/infrared/assets/tv.ir | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/resources/infrared/assets/tv.ir b/assets/resources/infrared/assets/tv.ir index e3d41b9a7..7b203b15e 100755 --- a/assets/resources/infrared/assets/tv.ir +++ b/assets/resources/infrared/assets/tv.ir @@ -1,7 +1,7 @@ Filetype: IR library file Version: 1 # Last Updated 15th Feb, 2023 -# Last Checked 15th Feb, 2023 +# Last Checked 21st Feb, 2023 # name: POWER type: parsed From f9db06b7814575b42553b9e09a5710fb3faee38a Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Tue, 21 Feb 2023 23:42:12 +0300 Subject: [PATCH 325/506] fbt format --- applications/plugins/tetris_game/tetris_game.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/applications/plugins/tetris_game/tetris_game.c b/applications/plugins/tetris_game/tetris_game.c index 9b492cc8e..0b813f26a 100644 --- a/applications/plugins/tetris_game/tetris_game.c +++ b/applications/plugins/tetris_game/tetris_game.c @@ -327,9 +327,10 @@ static void uint16_t oldNumLines = tetris_state->numLines; tetris_state->numLines += numLines; if((oldNumLines / 10) % 10 != (tetris_state->numLines / 10) % 10) { - nextFallSpeed = tetris_state->fallSpeed - (100 / (tetris_state->numLines / 10)); - if (nextFallSpeed >= MIN_FALL_SPEED){ - tetris_state->fallSpeed = nextFallSpeed; + nextFallSpeed = + tetris_state->fallSpeed - (100 / (tetris_state->numLines / 10)); + if(nextFallSpeed >= MIN_FALL_SPEED) { + tetris_state->fallSpeed = nextFallSpeed; } } } From 1f3e937471071df385eaa5cb419ce69fd1c9fb6f Mon Sep 17 00:00:00 2001 From: amec0e <88857687+amec0e@users.noreply.github.com> Date: Tue, 21 Feb 2023 23:35:00 +0000 Subject: [PATCH 326/506] Updated audio.ir Fixed rename of a power button --- assets/resources/infrared/assets/audio.ir | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/resources/infrared/assets/audio.ir b/assets/resources/infrared/assets/audio.ir index d1db3270c..b3b56e211 100644 --- a/assets/resources/infrared/assets/audio.ir +++ b/assets/resources/infrared/assets/audio.ir @@ -1913,7 +1913,7 @@ protocol: SIRC address: 0F 00 00 00 command: 15 00 00 00 # -name: Power +name: POWER type: parsed protocol: Samsung32 address: 10 00 00 00 From 07ff0c7d9761b4d0bbd3aea99a5995f44dd7052c Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Fri, 24 Feb 2023 02:43:42 +0300 Subject: [PATCH 327/506] Add SWD Probe into main FW Moved from extra pack to main FW https://github.com/g3gg0/flipper-swd_probe --- ReadMe.md | 1 + applications/plugins/swd_probe/.gitignore | 52 + applications/plugins/swd_probe/LICENSE.txt | 674 ++++ applications/plugins/swd_probe/README.md | 0 applications/plugins/swd_probe/adi.c | 1016 ++++++ applications/plugins/swd_probe/adi.h | 34 + .../plugins/swd_probe/application.fam | 13 + .../swd_probe/icons/ButtonDown_7x4.png | Bin 0 -> 102 bytes .../plugins/swd_probe/icons/ButtonUp_7x4.png | Bin 0 -> 102 bytes applications/plugins/swd_probe/icons/app.png | Bin 0 -> 179 bytes applications/plugins/swd_probe/icons/swd.png | Bin 0 -> 169 bytes applications/plugins/swd_probe/jep106.c | 26 + applications/plugins/swd_probe/jep106.h | 26 + applications/plugins/swd_probe/jep106.inc | 1791 +++++++++++ applications/plugins/swd_probe/model/chip.ply | 216 ++ .../plugins/swd_probe/model/convert.py | 39 + .../plugins/swd_probe/model/model_chip.h | 420 +++ .../plugins/swd_probe/swd_probe_app.c | 2840 +++++++++++++++++ .../plugins/swd_probe/swd_probe_app.h | 233 ++ applications/plugins/swd_probe/usb_uart.c | 223 ++ applications/plugins/swd_probe/usb_uart.h | 29 + assets/resources/swd_scripts/100us.swd | 1 + assets/resources/swd_scripts/call_test_1.swd | 6 + assets/resources/swd_scripts/call_test_2.swd | 7 + .../swd_scripts/dump_0x00000000_1k.swd | 6 + .../swd_scripts/dump_0x00000000_4b.swd | 6 + assets/resources/swd_scripts/dump_STM32.swd | 6 + assets/resources/swd_scripts/goto_test.swd | 7 + assets/resources/swd_scripts/halt.swd | 11 + assets/resources/swd_scripts/reset.swd | 8 + assets/resources/swd_scripts/test_write.swd | 3 + 31 files changed, 7694 insertions(+) create mode 100644 applications/plugins/swd_probe/.gitignore create mode 100644 applications/plugins/swd_probe/LICENSE.txt create mode 100644 applications/plugins/swd_probe/README.md create mode 100644 applications/plugins/swd_probe/adi.c create mode 100644 applications/plugins/swd_probe/adi.h create mode 100644 applications/plugins/swd_probe/application.fam create mode 100644 applications/plugins/swd_probe/icons/ButtonDown_7x4.png create mode 100644 applications/plugins/swd_probe/icons/ButtonUp_7x4.png create mode 100644 applications/plugins/swd_probe/icons/app.png create mode 100644 applications/plugins/swd_probe/icons/swd.png create mode 100644 applications/plugins/swd_probe/jep106.c create mode 100644 applications/plugins/swd_probe/jep106.h create mode 100644 applications/plugins/swd_probe/jep106.inc create mode 100644 applications/plugins/swd_probe/model/chip.ply create mode 100644 applications/plugins/swd_probe/model/convert.py create mode 100644 applications/plugins/swd_probe/model/model_chip.h create mode 100644 applications/plugins/swd_probe/swd_probe_app.c create mode 100644 applications/plugins/swd_probe/swd_probe_app.h create mode 100644 applications/plugins/swd_probe/usb_uart.c create mode 100644 applications/plugins/swd_probe/usb_uart.h create mode 100644 assets/resources/swd_scripts/100us.swd create mode 100644 assets/resources/swd_scripts/call_test_1.swd create mode 100644 assets/resources/swd_scripts/call_test_2.swd create mode 100644 assets/resources/swd_scripts/dump_0x00000000_1k.swd create mode 100644 assets/resources/swd_scripts/dump_0x00000000_4b.swd create mode 100644 assets/resources/swd_scripts/dump_STM32.swd create mode 100644 assets/resources/swd_scripts/goto_test.swd create mode 100644 assets/resources/swd_scripts/halt.swd create mode 100644 assets/resources/swd_scripts/reset.swd create mode 100644 assets/resources/swd_scripts/test_write.swd diff --git a/ReadMe.md b/ReadMe.md index e6d5bb1a6..f5c9c20bb 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -139,6 +139,7 @@ You can support us by using links or addresses below: - Text Viewer [(by kowalski7cc & kyhwana)](https://github.com/kowalski7cc/flipper-zero-text-viewer/tree/refactor-text-app) - **UART Terminal** [(by cool4uma)](https://github.com/cool4uma/UART_Terminal/tree/main) - **ProtoView** [(by antirez)](https://github.com/antirez/protoview) +- **SWD Probe** [(by g3gg0)](https://github.com/g3gg0/flipper-swd_probe) Games: - DOOM (fixed) [(by p4nic4ttack)](https://github.com/p4nic4ttack/doom-flipper-zero/) diff --git a/applications/plugins/swd_probe/.gitignore b/applications/plugins/swd_probe/.gitignore new file mode 100644 index 000000000..c6127b38c --- /dev/null +++ b/applications/plugins/swd_probe/.gitignore @@ -0,0 +1,52 @@ +# Prerequisites +*.d + +# Object files +*.o +*.ko +*.obj +*.elf + +# Linker output +*.ilk +*.map +*.exp + +# Precompiled Headers +*.gch +*.pch + +# Libraries +*.lib +*.a +*.la +*.lo + +# Shared objects (inc. Windows DLLs) +*.dll +*.so +*.so.* +*.dylib + +# Executables +*.exe +*.out +*.app +*.i*86 +*.x86_64 +*.hex + +# Debug files +*.dSYM/ +*.su +*.idb +*.pdb + +# Kernel Module Compile Results +*.mod* +*.cmd +.tmp_versions/ +modules.order +Module.symvers +Mkfile.old +dkms.conf diff --git a/applications/plugins/swd_probe/LICENSE.txt b/applications/plugins/swd_probe/LICENSE.txt new file mode 100644 index 000000000..f288702d2 --- /dev/null +++ b/applications/plugins/swd_probe/LICENSE.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/applications/plugins/swd_probe/README.md b/applications/plugins/swd_probe/README.md new file mode 100644 index 000000000..e69de29bb diff --git a/applications/plugins/swd_probe/adi.c b/applications/plugins/swd_probe/adi.c new file mode 100644 index 000000000..95456fcd0 --- /dev/null +++ b/applications/plugins/swd_probe/adi.c @@ -0,0 +1,1016 @@ + +#include +#include + +#include "adi.h" +#include "swd_probe_app.h" + +/* https://github.com/openocd-org/openocd/blob/master/src/target/arm_adi_v5.c */ + +/* +static const char* class_description[16] = { + [0x0] = "Generic verification component", + [0x1] = "(ROM Table)", + [0x2] = "Reserved", + [0x3] = "Reserved", + [0x4] = "Reserved", + [0x5] = "Reserved", + [0x6] = "Reserved", + [0x7] = "Reserved", + [0x8] = "Reserved", + [0x9] = "CoreSight component", + [0xA] = "Reserved", + [0xB] = "Peripheral Test Block", + [0xC] = "Reserved", + [0xD] = "OptimoDE DESS", + [0xE] = "Generic IP component", + [0xF] = "CoreLink, PrimeCell or System component", +}; +*/ + +static const struct { + uint32_t arch_id; + const char* description; +} class0x9_devarch[] = { + /* keep same unsorted order as in ARM IHI0029E */ + {ARCH_ID(ARM_ID, 0x0A00), "RAS architecture"}, + {ARCH_ID(ARM_ID, 0x1A01), "Instrumentation Trace Macrocell (ITM) architecture"}, + {ARCH_ID(ARM_ID, 0x1A02), "DWT architecture"}, + {ARCH_ID(ARM_ID, 0x1A03), "Flash Patch and Breakpoint unit (FPB) architecture"}, + {ARCH_ID(ARM_ID, 0x2A04), "Processor debug architecture (ARMv8-M)"}, + {ARCH_ID(ARM_ID, 0x6A05), "Processor debug architecture (ARMv8-R)"}, + {ARCH_ID(ARM_ID, 0x0A10), "PC sample-based profiling"}, + {ARCH_ID(ARM_ID, 0x4A13), "Embedded Trace Macrocell (ETM) architecture"}, + {ARCH_ID(ARM_ID, 0x1A14), "Cross Trigger Interface (CTI) architecture"}, + {ARCH_ID(ARM_ID, 0x6A15), "Processor debug architecture (v8.0-A)"}, + {ARCH_ID(ARM_ID, 0x7A15), "Processor debug architecture (v8.1-A)"}, + {ARCH_ID(ARM_ID, 0x8A15), "Processor debug architecture (v8.2-A)"}, + {ARCH_ID(ARM_ID, 0x2A16), "Processor Performance Monitor (PMU) architecture"}, + {ARCH_ID(ARM_ID, 0x0A17), "Memory Access Port v2 architecture"}, + {ARCH_ID(ARM_ID, 0x0A27), "JTAG Access Port v2 architecture"}, + {ARCH_ID(ARM_ID, 0x0A31), "Basic trace router"}, + {ARCH_ID(ARM_ID, 0x0A37), "Power requestor"}, + {ARCH_ID(ARM_ID, 0x0A47), "Unknown Access Port v2 architecture"}, + {ARCH_ID(ARM_ID, 0x0A50), "HSSTP architecture"}, + {ARCH_ID(ARM_ID, 0x0A63), "System Trace Macrocell (STM) architecture"}, + {ARCH_ID(ARM_ID, 0x0A75), "CoreSight ELA architecture"}, + {ARCH_ID(ARM_ID, 0x0AF7), "CoreSight ROM architecture"}, +}; + +/* Part number interpretations are from Cortex + * core specs, the CoreSight components TRM + * (ARM DDI 0314H), CoreSight System Design + * Guide (ARM DGI 0012D) and ETM specs; also + * from chip observation (e.g. TI SDTI). + */ + +static const struct dap_part_nums { + uint16_t designer_id; + uint16_t part_num; + const char* type; + const char* full; +} dap_part_nums[] = { + { + ARM_ID, + 0x000, + "Cortex-M3 SCS", + "(System Control Space)", + }, + { + ARM_ID, + 0x001, + "Cortex-M3 ITM", + "(Instrumentation Trace Module)", + }, + { + ARM_ID, + 0x002, + "Cortex-M3 DWT", + "(Data Watchpoint and Trace)", + }, + { + ARM_ID, + 0x003, + "Cortex-M3 FPB", + "(Flash Patch and Breakpoint)", + }, + { + ARM_ID, + 0x008, + "Cortex-M0 SCS", + "(System Control Space)", + }, + { + ARM_ID, + 0x00a, + "Cortex-M0 DWT", + "(Data Watchpoint and Trace)", + }, + { + ARM_ID, + 0x00b, + "Cortex-M0 BPU", + "(Breakpoint Unit)", + }, + { + ARM_ID, + 0x00c, + "Cortex-M4 SCS", + "(System Control Space)", + }, + { + ARM_ID, + 0x00d, + "CoreSight ETM11", + "(Embedded Trace)", + }, + { + ARM_ID, + 0x00e, + "Cortex-M7 FPB", + "(Flash Patch and Breakpoint)", + }, + { + ARM_ID, + 0x193, + "SoC-600 TSGEN", + "(Timestamp Generator)", + }, + { + ARM_ID, + 0x470, + "Cortex-M1 ROM", + "(ROM Table)", + }, + { + ARM_ID, + 0x471, + "Cortex-M0 ROM", + "(ROM Table)", + }, + { + ARM_ID, + 0x490, + "Cortex-A15 GIC", + "(Generic Interrupt Controller)", + }, + { + ARM_ID, + 0x492, + "Cortex-R52 GICD", + "(Distributor)", + }, + { + ARM_ID, + 0x493, + "Cortex-R52 GICR", + "(Redistributor)", + }, + { + ARM_ID, + 0x4a1, + "Cortex-A53 ROM", + "(v8 Memory Map ROM Table)", + }, + { + ARM_ID, + 0x4a2, + "Cortex-A57 ROM", + "(ROM Table)", + }, + { + ARM_ID, + 0x4a3, + "Cortex-A53 ROM", + "(v7 Memory Map ROM Table)", + }, + { + ARM_ID, + 0x4a4, + "Cortex-A72 ROM", + "(ROM Table)", + }, + { + ARM_ID, + 0x4a9, + "Cortex-A9 ROM", + "(ROM Table)", + }, + { + ARM_ID, + 0x4aa, + "Cortex-A35 ROM", + "(v8 Memory Map ROM Table)", + }, + { + ARM_ID, + 0x4af, + "Cortex-A15 ROM", + "(ROM Table)", + }, + { + ARM_ID, + 0x4b5, + "Cortex-R5 ROM", + "(ROM Table)", + }, + { + ARM_ID, + 0x4b8, + "Cortex-R52 ROM", + "(ROM Table)", + }, + { + ARM_ID, + 0x4c0, + "Cortex-M0+ ROM", + "(ROM Table)", + }, + { + ARM_ID, + 0x4c3, + "Cortex-M3 ROM", + "(ROM Table)", + }, + { + ARM_ID, + 0x4c4, + "Cortex-M4 ROM", + "(ROM Table)", + }, + { + ARM_ID, + 0x4c7, + "Cortex-M7 PPB ROM", + "(Private Peripheral Bus ROM Table)", + }, + { + ARM_ID, + 0x4c8, + "Cortex-M7 ROM", + "(ROM Table)", + }, + { + ARM_ID, + 0x4e0, + "Cortex-A35 ROM", + "(v7 Memory Map ROM Table)", + }, + { + ARM_ID, + 0x4e4, + "Cortex-A76 ROM", + "(ROM Table)", + }, + { + ARM_ID, + 0x906, + "CoreSight CTI", + "(Cross Trigger)", + }, + { + ARM_ID, + 0x907, + "CoreSight ETB", + "(Trace Buffer)", + }, + { + ARM_ID, + 0x908, + "CoreSight CSTF", + "(Trace Funnel)", + }, + { + ARM_ID, + 0x909, + "CoreSight ATBR", + "(Advanced Trace Bus Replicator)", + }, + { + ARM_ID, + 0x910, + "CoreSight ETM9", + "(Embedded Trace)", + }, + { + ARM_ID, + 0x912, + "CoreSight TPIU", + "(Trace Port Interface Unit)", + }, + { + ARM_ID, + 0x913, + "CoreSight ITM", + "(Instrumentation Trace Macrocell)", + }, + { + ARM_ID, + 0x914, + "CoreSight SWO", + "(Single Wire Output)", + }, + { + ARM_ID, + 0x917, + "CoreSight HTM", + "(AHB Trace Macrocell)", + }, + { + ARM_ID, + 0x920, + "CoreSight ETM11", + "(Embedded Trace)", + }, + { + ARM_ID, + 0x921, + "Cortex-A8 ETM", + "(Embedded Trace)", + }, + { + ARM_ID, + 0x922, + "Cortex-A8 CTI", + "(Cross Trigger)", + }, + { + ARM_ID, + 0x923, + "Cortex-M3 TPIU", + "(Trace Port Interface Unit)", + }, + { + ARM_ID, + 0x924, + "Cortex-M3 ETM", + "(Embedded Trace)", + }, + { + ARM_ID, + 0x925, + "Cortex-M4 ETM", + "(Embedded Trace)", + }, + { + ARM_ID, + 0x930, + "Cortex-R4 ETM", + "(Embedded Trace)", + }, + { + ARM_ID, + 0x931, + "Cortex-R5 ETM", + "(Embedded Trace)", + }, + { + ARM_ID, + 0x932, + "CoreSight MTB-M0+", + "(Micro Trace Buffer)", + }, + { + ARM_ID, + 0x941, + "CoreSight TPIU-Lite", + "(Trace Port Interface Unit)", + }, + { + ARM_ID, + 0x950, + "Cortex-A9 PTM", + "(Program Trace Macrocell)", + }, + { + ARM_ID, + 0x955, + "Cortex-A5 ETM", + "(Embedded Trace)", + }, + { + ARM_ID, + 0x95a, + "Cortex-A72 ETM", + "(Embedded Trace)", + }, + { + ARM_ID, + 0x95b, + "Cortex-A17 PTM", + "(Program Trace Macrocell)", + }, + { + ARM_ID, + 0x95d, + "Cortex-A53 ETM", + "(Embedded Trace)", + }, + { + ARM_ID, + 0x95e, + "Cortex-A57 ETM", + "(Embedded Trace)", + }, + { + ARM_ID, + 0x95f, + "Cortex-A15 PTM", + "(Program Trace Macrocell)", + }, + { + ARM_ID, + 0x961, + "CoreSight TMC", + "(Trace Memory Controller)", + }, + { + ARM_ID, + 0x962, + "CoreSight STM", + "(System Trace Macrocell)", + }, + { + ARM_ID, + 0x975, + "Cortex-M7 ETM", + "(Embedded Trace)", + }, + { + ARM_ID, + 0x9a0, + "CoreSight PMU", + "(Performance Monitoring Unit)", + }, + { + ARM_ID, + 0x9a1, + "Cortex-M4 TPIU", + "(Trace Port Interface Unit)", + }, + { + ARM_ID, + 0x9a4, + "CoreSight GPR", + "(Granular Power Requester)", + }, + { + ARM_ID, + 0x9a5, + "Cortex-A5 PMU", + "(Performance Monitor Unit)", + }, + { + ARM_ID, + 0x9a7, + "Cortex-A7 PMU", + "(Performance Monitor Unit)", + }, + { + ARM_ID, + 0x9a8, + "Cortex-A53 CTI", + "(Cross Trigger)", + }, + { + ARM_ID, + 0x9a9, + "Cortex-M7 TPIU", + "(Trace Port Interface Unit)", + }, + { + ARM_ID, + 0x9ae, + "Cortex-A17 PMU", + "(Performance Monitor Unit)", + }, + { + ARM_ID, + 0x9af, + "Cortex-A15 PMU", + "(Performance Monitor Unit)", + }, + { + ARM_ID, + 0x9b6, + "Cortex-R52 PMU/CTI/ETM", + "(Performance Monitor Unit/Cross Trigger/ETM)", + }, + { + ARM_ID, + 0x9b7, + "Cortex-R7 PMU", + "(Performance Monitor Unit)", + }, + { + ARM_ID, + 0x9d3, + "Cortex-A53 PMU", + "(Performance Monitor Unit)", + }, + { + ARM_ID, + 0x9d7, + "Cortex-A57 PMU", + "(Performance Monitor Unit)", + }, + { + ARM_ID, + 0x9d8, + "Cortex-A72 PMU", + "(Performance Monitor Unit)", + }, + { + ARM_ID, + 0x9da, + "Cortex-A35 PMU/CTI/ETM", + "(Performance Monitor Unit/Cross Trigger/ETM)", + }, + { + ARM_ID, + 0x9e2, + "SoC-600 APB-AP", + "(APB4 Memory Access Port)", + }, + { + ARM_ID, + 0x9e3, + "SoC-600 AHB-AP", + "(AHB5 Memory Access Port)", + }, + { + ARM_ID, + 0x9e4, + "SoC-600 AXI-AP", + "(AXI Memory Access Port)", + }, + { + ARM_ID, + 0x9e5, + "SoC-600 APv1 Adapter", + "(Access Port v1 Adapter)", + }, + { + ARM_ID, + 0x9e6, + "SoC-600 JTAG-AP", + "(JTAG Access Port)", + }, + { + ARM_ID, + 0x9e7, + "SoC-600 TPIU", + "(Trace Port Interface Unit)", + }, + { + ARM_ID, + 0x9e8, + "SoC-600 TMC ETR/ETS", + "(Embedded Trace Router/Streamer)", + }, + { + ARM_ID, + 0x9e9, + "SoC-600 TMC ETB", + "(Embedded Trace Buffer)", + }, + { + ARM_ID, + 0x9ea, + "SoC-600 TMC ETF", + "(Embedded Trace FIFO)", + }, + { + ARM_ID, + 0x9eb, + "SoC-600 ATB Funnel", + "(Trace Funnel)", + }, + { + ARM_ID, + 0x9ec, + "SoC-600 ATB Replicator", + "(Trace Replicator)", + }, + { + ARM_ID, + 0x9ed, + "SoC-600 CTI", + "(Cross Trigger)", + }, + { + ARM_ID, + 0x9ee, + "SoC-600 CATU", + "(Address Translation Unit)", + }, + { + ARM_ID, + 0xc05, + "Cortex-A5 Debug", + "(Debug Unit)", + }, + { + ARM_ID, + 0xc07, + "Cortex-A7 Debug", + "(Debug Unit)", + }, + { + ARM_ID, + 0xc08, + "Cortex-A8 Debug", + "(Debug Unit)", + }, + { + ARM_ID, + 0xc09, + "Cortex-A9 Debug", + "(Debug Unit)", + }, + { + ARM_ID, + 0xc0e, + "Cortex-A17 Debug", + "(Debug Unit)", + }, + { + ARM_ID, + 0xc0f, + "Cortex-A15 Debug", + "(Debug Unit)", + }, + { + ARM_ID, + 0xc14, + "Cortex-R4 Debug", + "(Debug Unit)", + }, + { + ARM_ID, + 0xc15, + "Cortex-R5 Debug", + "(Debug Unit)", + }, + { + ARM_ID, + 0xc17, + "Cortex-R7 Debug", + "(Debug Unit)", + }, + { + ARM_ID, + 0xd03, + "Cortex-A53 Debug", + "(Debug Unit)", + }, + { + ARM_ID, + 0xd04, + "Cortex-A35 Debug", + "(Debug Unit)", + }, + { + ARM_ID, + 0xd07, + "Cortex-A57 Debug", + "(Debug Unit)", + }, + { + ARM_ID, + 0xd08, + "Cortex-A72 Debug", + "(Debug Unit)", + }, + { + ARM_ID, + 0xd0b, + "Cortex-A76 Debug", + "(Debug Unit)", + }, + { + ARM_ID, + 0xd0c, + "Neoverse N1", + "(Debug Unit)", + }, + { + ARM_ID, + 0xd13, + "Cortex-R52 Debug", + "(Debug Unit)", + }, + { + ARM_ID, + 0xd49, + "Neoverse N2", + "(Debug Unit)", + }, + { + 0x017, + 0x120, + "TI SDTI", + "(System Debug Trace Interface)", + }, /* from OMAP3 memmap */ + { + 0x017, + 0x343, + "TI DAPCTL", + "", + }, /* from OMAP3 memmap */ + {0x017, 0x9af, "MSP432 ROM", "(ROM Table)"}, + {0x01f, 0xcd0, "Atmel CPU with DSU", "(CPU)"}, + {0x041, 0x1db, "XMC4500 ROM", "(ROM Table)"}, + {0x041, 0x1df, "XMC4700/4800 ROM", "(ROM Table)"}, + {0x041, 0x1ed, "XMC1000 ROM", "(ROM Table)"}, + { + 0x065, + 0x000, + "SHARC+/Blackfin+", + "", + }, + { + 0x070, + 0x440, + "Qualcomm QDSS Component v1", + "(Qualcomm Designed CoreSight Component v1)", + }, + { + 0x0bf, + 0x100, + "Brahma-B53 Debug", + "(Debug Unit)", + }, + { + 0x0bf, + 0x9d3, + "Brahma-B53 PMU", + "(Performance Monitor Unit)", + }, + { + 0x0bf, + 0x4a1, + "Brahma-B53 ROM", + "(ROM Table)", + }, + { + 0x0bf, + 0x721, + "Brahma-B53 ROM", + "(ROM Table)", + }, + { + 0x1eb, + 0x181, + "Tegra 186 ROM", + "(ROM Table)", + }, + { + 0x1eb, + 0x202, + "Denver ETM", + "(Denver Embedded Trace)", + }, + { + 0x1eb, + 0x211, + "Tegra 210 ROM", + "(ROM Table)", + }, + { + 0x1eb, + 0x302, + "Denver Debug", + "(Debug Unit)", + }, + { + 0x1eb, + 0x402, + "Denver PMU", + "(Performance Monitor Unit)", + }, + {0x20, 0x410, "STM32F10 (med)", "(ROM Table)"}, + {0x20, 0x411, "STM32F2", "(ROM Table)"}, + {0x20, 0x412, "STM32F10 (low)", "(ROM Table)"}, + {0x20, 0x413, "STM32F40/41", "(ROM Table)"}, + {0x20, 0x414, "STM32F10 (high)", "(ROM Table)"}, + {0x20, 0x415, "STM32L47/48", "(ROM Table)"}, + {0x20, 0x416, "STM32L1xxx6/8/B", "(ROM Table)"}, + {0x20, 0x417, "STM32L05/06", "(ROM Table)"}, + {0x20, 0x418, "STM32F105xx/107", "(ROM Table)"}, + {0x20, 0x419, "STM32F42/43", "(ROM Table)"}, + {0x20, 0x420, "STM32F10 (med)", "(ROM Table)"}, + {0x20, 0x421, "STM32F446xx", "(ROM Table)"}, + {0x20, 0x422, "STM32FF358/02/03", "(ROM Table)"}, + {0x20, 0x423, "STM32F401xB/C", "(ROM Table)"}, + {0x20, 0x425, "STM32L031/41", "(ROM Table)"}, + {0x20, 0x427, "STM32L1xxxC", "(ROM Table)"}, + {0x20, 0x428, "STM32F10 (high)", "(ROM Table)"}, + {0x20, 0x429, "STM32L1xxx6A/8A/BA", "(ROM Table)"}, + {0x20, 0x430, "STM32F10 (xl)", "(ROM Table)"}, + {0x20, 0x431, "STM32F411xx", "(ROM Table)"}, + {0x20, 0x432, "STM32F373/8", "(ROM Table)"}, + {0x20, 0x433, "STM32F401xD/E", "(ROM Table)"}, + {0x20, 0x434, "STM32F469/79", "(ROM Table)"}, + {0x20, 0x435, "STM32L43/44", "(ROM Table)"}, + {0x20, 0x436, "STM32L1xxxD", "(ROM Table)"}, + {0x20, 0x437, "STM32L1xxxE", "(ROM Table)"}, + {0x20, 0x438, "STM32F303/34/28", "(ROM Table)"}, + {0x20, 0x439, "STM32F301/02/18 ", "(ROM Table)"}, + {0x20, 0x440, "STM32F03/5", "(ROM Table)"}, + {0x20, 0x441, "STM32F412xx", "(ROM Table)"}, + {0x20, 0x442, "STM32F03/9", "(ROM Table)"}, + {0x20, 0x444, "STM32F03xx4", "(ROM Table)"}, + {0x20, 0x445, "STM32F04/7", "(ROM Table)"}, + {0x20, 0x446, "STM32F302/03/98", "(ROM Table)"}, + {0x20, 0x447, "STM32L07/08", "(ROM Table)"}, + {0x20, 0x448, "STM32F070/1/2", "(ROM Table)"}, + {0x20, 0x449, "STM32F74/5", "(ROM Table)"}, + {0x20, 0x450, "STM32H74/5", "(ROM Table)"}, + {0x20, 0x451, "STM32F76/7", "(ROM Table)"}, + {0x20, 0x452, "STM32F72/3", "(ROM Table)"}, + {0x20, 0x457, "STM32L01/2", "(ROM Table)"}, + {0x20, 0x458, "STM32F410xx", "(ROM Table)"}, + {0x20, 0x460, "STM32G07/8", "(ROM Table)"}, + {0x20, 0x461, "STM32L496/A6", "(ROM Table)"}, + {0x20, 0x462, "STM32L45/46", "(ROM Table)"}, + {0x20, 0x463, "STM32F413/23", "(ROM Table)"}, + {0x20, 0x464, "STM32L412/22", "(ROM Table)"}, + {0x20, 0x466, "STM32G03/04", "(ROM Table)"}, + {0x20, 0x468, "STM32G431/41", "(ROM Table)"}, + {0x20, 0x469, "STM32G47/48", "(ROM Table)"}, + {0x20, 0x470, "STM32L4R/S", "(ROM Table)"}, + {0x20, 0x471, "STM32L4P5/Q5", "(ROM Table)"}, + {0x20, 0x479, "STM32G491xx", "(ROM Table)"}, + {0x20, 0x480, "STM32H7A/B", "(ROM Table)"}, + {0x20, 0x495, "STM32WB50/55", "(ROM Table)"}, + {0x20, 0x497, "STM32WLE5xx", "(ROM Table)"}}; + +const char* adi_devarch_desc(uint32_t devarch) { + if(!(devarch & ARM_CS_C9_DEVARCH_PRESENT)) { + return "not present"; + } + + for(unsigned int i = 0; i < ARRAY_SIZE(class0x9_devarch); i++) { + if((devarch & DEVARCH_ID_MASK) == class0x9_devarch[i].arch_id) { + return class0x9_devarch[i].description; + } + } + + return "unknown"; +} + +const struct dap_part_nums* adi_part_num(unsigned int des, unsigned int part) { + static char buf[32]; + static struct dap_part_nums unknown = { + .type = "Unrecognized", + .full = "", + }; + + for(unsigned int i = 0; i < ARRAY_SIZE(dap_part_nums); i++) { + if(dap_part_nums[i].designer_id == des && dap_part_nums[i].part_num == part) { + return &dap_part_nums[i]; + } + } + + snprintf(buf, sizeof(buf), "D:%x P:%x", des, part); + unknown.full = buf; + + return &unknown; +} + +bool adi_get_pidr(AppFSM* const ctx, uint32_t base, pidr_data_t* data) { + uint32_t pidrs[7]; + uint32_t offsets[] = {0xFE0, 0xFE4, 0xFE8, 0xFEC, 0xFD0, 0xFD4, 0xFD8, 0xFDC}; + + furi_mutex_acquire(ctx->swd_mutex, FuriWaitForever); + for(size_t pos = 0; pos < COUNT(pidrs); pos++) { + uint8_t ret = swd_read_memory(ctx, ctx->ap_pos, base + offsets[pos], &pidrs[pos]); + if(ret != 1) { + DBGS("Read failed"); + furi_mutex_release(ctx->swd_mutex); + return false; + } + } + furi_mutex_release(ctx->swd_mutex); + + data->designer = ((pidrs[4] & 0x0F) << 7) | ((pidrs[2] & 0x07) << 4) | + ((pidrs[1] >> 4) & 0x0F); + data->part = (pidrs[0] & 0xFF) | ((pidrs[1] & 0x0F) << 8); + data->revand = ((pidrs[3] >> 4) & 0x0F); + data->cmod = (pidrs[3] & 0x0F); + data->revision = ((pidrs[2] >> 4) & 0x0F); + data->size = ((pidrs[2] >> 4) & 0x0F); + + return true; +} + +bool adi_get_class(AppFSM* const ctx, uint32_t base, uint8_t* class) { + uint32_t cidrs[4]; + uint32_t offsets[] = {0xFF0, 0xFF4, 0xFF8, 0xFFC}; + + furi_mutex_acquire(ctx->swd_mutex, FuriWaitForever); + for(size_t pos = 0; pos < COUNT(cidrs); pos++) { + uint8_t ret = swd_read_memory(ctx, ctx->ap_pos, base + offsets[pos], &cidrs[pos]); + if(ret != 1) { + DBGS("Read failed"); + furi_mutex_release(ctx->swd_mutex); + return false; + } + } + furi_mutex_release(ctx->swd_mutex); + + if((cidrs[0] & 0xFF) != 0x0D) { + return false; + } + if((cidrs[1] & 0x0F) != 0x00) { + return false; + } + if((cidrs[2] & 0xFF) != 0x05) { + return false; + } + if((cidrs[3] & 0xFF) != 0xB1) { + return false; + } + + *class = ((cidrs[1] >> 4) & 0x0F); + + return true; +} + +const char* adi_romtable_type(AppFSM* const ctx, uint32_t base) { + pidr_data_t data; + + if(!adi_get_pidr(ctx, base, &data)) { + return "fail"; + } + const struct dap_part_nums* info = adi_part_num(data.designer, data.part); + + return info->type; +} + +const char* adi_romtable_full(AppFSM* const ctx, uint32_t base) { + pidr_data_t data; + + if(!adi_get_pidr(ctx, base, &data)) { + return "fail"; + } + const struct dap_part_nums* info = adi_part_num(data.designer, data.part); + + return info->full; +} + +uint32_t adi_romtable_entry_count(AppFSM* const ctx, uint32_t base) { + uint32_t count = 0; + uint32_t entry = 0; + + furi_mutex_acquire(ctx->swd_mutex, FuriWaitForever); + for(size_t pos = 0; pos < 960; pos++) { + uint8_t ret = 0; + for(int tries = 0; tries < 10 && ret != 1; tries++) { + ret = swd_read_memory(ctx, ctx->ap_pos, base + pos * 4, &entry); + } + if(ret != 1) { + DBGS("Read failed"); + break; + } + if(!(entry & 1)) { + break; + } + if(entry & 0x00000FFC) { + break; + } + count++; + } + furi_mutex_release(ctx->swd_mutex); + return count; +} + +uint32_t adi_romtable_get(AppFSM* const ctx, uint32_t base, uint32_t pos) { + uint32_t entry = 0; + + furi_mutex_acquire(ctx->swd_mutex, FuriWaitForever); + uint8_t ret = swd_read_memory(ctx, ctx->ap_pos, base + pos * 4, &entry); + if(ret != 1) { + DBGS("Read failed"); + furi_mutex_release(ctx->swd_mutex); + return 0; + } + furi_mutex_release(ctx->swd_mutex); + + return base + (entry & 0xFFFFF000); +} + +bool adi_is_romtable(AppFSM* const ctx, uint32_t base) { + uint8_t class = 0; + + if(!adi_get_class(ctx, base, &class)) { + return false; + } + + if(class != CIDR_CLASS_ROMTABLE) { + return false; + } + + return true; +} diff --git a/applications/plugins/swd_probe/adi.h b/applications/plugins/swd_probe/adi.h new file mode 100644 index 000000000..bade7736a --- /dev/null +++ b/applications/plugins/swd_probe/adi.h @@ -0,0 +1,34 @@ + +#ifndef __ADI_H__ +#define __ADI_H__ + +#include "swd_probe_app.h" + +#define ARM_ID 0x23B + +#define ARCH_ID(architect, archid) ((architect) << 21) | (archid) + +#define BIT(nr) (1UL << (nr)) +#define ARM_CS_C9_DEVARCH_PRESENT BIT(20) +#define ARM_CS_C9_DEVARCH_ARCHITECT_MASK (0xFFE00000) +#define ARM_CS_C9_DEVARCH_ARCHID_MASK (0x0000FFFF) +#define DEVARCH_ID_MASK (ARM_CS_C9_DEVARCH_ARCHITECT_MASK | ARM_CS_C9_DEVARCH_ARCHID_MASK) + +typedef struct { + uint16_t designer; + uint16_t part; + uint8_t revision; + uint8_t cmod; + uint8_t revand; + uint8_t size; +} pidr_data_t; + +typedef enum { CIDR_CLASS_ROMTABLE = 0x01, CIDR_CLASS_CORESIGHT = 0x09 } cidr_classes_t; + +uint32_t adi_romtable_entry_count(AppFSM* const ctx, uint32_t base); +uint32_t adi_romtable_get(AppFSM* const ctx, uint32_t base, uint32_t pos); +bool adi_is_romtable(AppFSM* const ctx, uint32_t base); +const char* adi_romtable_type(AppFSM* const ctx, uint32_t base); +const char* adi_romtable_full(AppFSM* const ctx, uint32_t base); + +#endif diff --git a/applications/plugins/swd_probe/application.fam b/applications/plugins/swd_probe/application.fam new file mode 100644 index 000000000..64140d130 --- /dev/null +++ b/applications/plugins/swd_probe/application.fam @@ -0,0 +1,13 @@ +App( + appid="swd_probe", + name="SWD Probe", + apptype=FlipperAppType.PLUGIN, + entry_point="swd_probe_app_main", + cdefines=["APP_SWD_PROBE"], + requires=["notification", "gui", "storage", "dialogs", "cli"], + stack_size=2 * 1024, + order=10, + fap_icon="icons/app.png", + fap_category="Tools", + fap_icon_assets="icons" +) diff --git a/applications/plugins/swd_probe/icons/ButtonDown_7x4.png b/applications/plugins/swd_probe/icons/ButtonDown_7x4.png new file mode 100644 index 0000000000000000000000000000000000000000..2954bb6a67d1c23c0bb5d765e8d2aa04b9b5adec GIT binary patch literal 102 zcmeAS@N?(olHy`uVBq!ia0vp^>_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/plugins/swd_probe/icons/ButtonUp_7x4.png b/applications/plugins/swd_probe/icons/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/plugins/swd_probe/icons/app.png b/applications/plugins/swd_probe/icons/app.png new file mode 100644 index 0000000000000000000000000000000000000000..6949ce78d11d5aa0a40b3cf5253e0e297aab47ad GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4u_bxCy8vk*`02d69!PN(ctjR6 zFz_7#VaBQ2e9}Nc_7YEDSN7*jtc=XO_pYWl0)-qrT^vIsE^qBKf4aTa()7BevL9RXp+soH$fK*4BF z7sn8Z%f0;vc^eFPm~)Q^Wqy}moBgCBgtd|Diu`fUl$SgUSaXvl{^#fIx+ax-f7<3f z-a(qKYfZ04oquest;Ep5VKn*7oHXV&CRGz^7;nBaIKXL8{2=SkWkwE#2tRl4D<^=~ OFnGH9xvX 126) { + return ""; + } + + /* index is zero based */ + id--; + + if(bank >= 14 || jep106[bank][id] == 0) return ""; + + return jep106[bank][id]; +} diff --git a/applications/plugins/swd_probe/jep106.h b/applications/plugins/swd_probe/jep106.h new file mode 100644 index 000000000..17c87feaa --- /dev/null +++ b/applications/plugins/swd_probe/jep106.h @@ -0,0 +1,26 @@ +/* https://github.com/openocd-org/openocd/blob/master/src/helper/ */ +/* SPDX-License-Identifier: GPL-2.0-or-later */ + +/*************************************************************************** + * Copyright (C) 2015 Andreas Fritiofson * + * andreas.fritiofson@gmail.com * + ***************************************************************************/ + +#ifndef OPENOCD_HELPER_JEP106_H +#define OPENOCD_HELPER_JEP106_H + +/** + * Get the manufacturer name associated with a JEP106 ID. + * @param bank The bank (number of continuation codes) of the manufacturer ID. + * @param id The 7-bit manufacturer ID (i.e. with parity stripped). + * @return A pointer to static const storage containing the name of the + * manufacturer associated with bank and id, or one of the strings + * "" and "". + */ +const char* jep106_table_manufacturer(unsigned int bank, unsigned int id); + +static inline const char* jep106_manufacturer(unsigned int manufacturer) { + return jep106_table_manufacturer(manufacturer >> 7, manufacturer & 0x7f); +} + +#endif /* OPENOCD_HELPER_JEP106_H */ diff --git a/applications/plugins/swd_probe/jep106.inc b/applications/plugins/swd_probe/jep106.inc new file mode 100644 index 000000000..3adc131be --- /dev/null +++ b/applications/plugins/swd_probe/jep106.inc @@ -0,0 +1,1791 @@ +/* https://github.com/openocd-org/openocd/blob/master/src/helper/ */ + +/* SPDX-License-Identifier: GPL-2.0-or-later */ + +/* + * The manufacturer's standard identification code list appears in JEP106. + * Copyright (c) 2022 JEDEC. All rights reserved. + * + * JEP106 is regularly updated. For the current manufacturer's standard + * identification code list, please visit the JEDEC website at www.jedec.org . + */ + +/* This file is aligned to revision JEP106BF.01 October 2022. */ + +[0][0x01 - 1] = "AMD", +[0][0x02 - 1] = "AMI", +[0][0x03 - 1] = "Fairchild", +[0][0x04 - 1] = "Fujitsu", +[0][0x05 - 1] = "GTE", +[0][0x06 - 1] = "Harris", +[0][0x07 - 1] = "Hitachi", +[0][0x08 - 1] = "Inmos", +[0][0x09 - 1] = "Intel", +[0][0x0a - 1] = "I.T.T.", +[0][0x0b - 1] = "Intersil", +[0][0x0c - 1] = "Monolithic Memories", +[0][0x0d - 1] = "Mostek", +[0][0x0e - 1] = "Freescale (Motorola)", +[0][0x0f - 1] = "National", +[0][0x10 - 1] = "NEC", +[0][0x11 - 1] = "RCA", +[0][0x12 - 1] = "Raytheon", +[0][0x13 - 1] = "Conexant (Rockwell)", +[0][0x14 - 1] = "Seeq", +[0][0x15 - 1] = "NXP (Philips)", +[0][0x16 - 1] = "Synertek", +[0][0x17 - 1] = "Texas Instruments", +[0][0x18 - 1] = "Kioxia Corporation", +[0][0x19 - 1] = "Xicor", +[0][0x1a - 1] = "Zilog", +[0][0x1b - 1] = "Eurotechnique", +[0][0x1c - 1] = "Mitsubishi", +[0][0x1d - 1] = "Lucent (AT&T)", +[0][0x1e - 1] = "Exel", +[0][0x1f - 1] = "Atmel", +[0][0x20 - 1] = "STMicroelectronics", +[0][0x21 - 1] = "Lattice Semi.", +[0][0x22 - 1] = "NCR", +[0][0x23 - 1] = "Wafer Scale Integration", +[0][0x24 - 1] = "IBM", +[0][0x25 - 1] = "Tristar", +[0][0x26 - 1] = "Visic", +[0][0x27 - 1] = "Intl. CMOS Technology", +[0][0x28 - 1] = "SSSI", +[0][0x29 - 1] = "Microchip Technology", +[0][0x2a - 1] = "Ricoh Ltd", +[0][0x2b - 1] = "VLSI", +[0][0x2c - 1] = "Micron Technology", +[0][0x2d - 1] = "SK Hynix", +[0][0x2e - 1] = "OKI Semiconductor", +[0][0x2f - 1] = "ACTEL", +[0][0x30 - 1] = "Sharp", +[0][0x31 - 1] = "Catalyst", +[0][0x32 - 1] = "Panasonic", +[0][0x33 - 1] = "IDT", +[0][0x34 - 1] = "Cypress", +[0][0x35 - 1] = "DEC", +[0][0x36 - 1] = "LSI Logic", +[0][0x37 - 1] = "Zarlink (Plessey)", +[0][0x38 - 1] = "UTMC", +[0][0x39 - 1] = "Thinking Machine", +[0][0x3a - 1] = "Thomson CSF", +[0][0x3b - 1] = "Integrated CMOS (Vertex)", +[0][0x3c - 1] = "Honeywell", +[0][0x3d - 1] = "Tektronix", +[0][0x3e - 1] = "Oracle Corporation", +[0][0x3f - 1] = "Silicon Storage Technology", +[0][0x40 - 1] = "ProMos/Mosel Vitelic", +[0][0x41 - 1] = "Infineon (Siemens)", +[0][0x42 - 1] = "Macronix", +[0][0x43 - 1] = "Xerox", +[0][0x44 - 1] = "Plus Logic", +[0][0x45 - 1] = "Western Digital Technologies Inc", +[0][0x46 - 1] = "Elan Circuit Tech.", +[0][0x47 - 1] = "European Silicon Str.", +[0][0x48 - 1] = "Apple Computer", +[0][0x49 - 1] = "Xilinx", +[0][0x4a - 1] = "Compaq", +[0][0x4b - 1] = "Protocol Engines", +[0][0x4c - 1] = "SCI", +[0][0x4d - 1] = "Seiko Instruments", +[0][0x4e - 1] = "Samsung", +[0][0x4f - 1] = "I3 Design System", +[0][0x50 - 1] = "Klic", +[0][0x51 - 1] = "Crosspoint Solutions", +[0][0x52 - 1] = "Alliance Memory Inc", +[0][0x53 - 1] = "Tandem", +[0][0x54 - 1] = "Hewlett-Packard", +[0][0x55 - 1] = "Integrated Silicon Solutions", +[0][0x56 - 1] = "Brooktree", +[0][0x57 - 1] = "New Media", +[0][0x58 - 1] = "MHS Electronic", +[0][0x59 - 1] = "Performance Semi.", +[0][0x5a - 1] = "Winbond Electronic", +[0][0x5b - 1] = "Kawasaki Steel", +[0][0x5c - 1] = "Bright Micro", +[0][0x5d - 1] = "TECMAR", +[0][0x5e - 1] = "Exar", +[0][0x5f - 1] = "PCMCIA", +[0][0x60 - 1] = "LG Semi (Goldstar)", +[0][0x61 - 1] = "Northern Telecom", +[0][0x62 - 1] = "Sanyo", +[0][0x63 - 1] = "Array Microsystems", +[0][0x64 - 1] = "Crystal Semiconductor", +[0][0x65 - 1] = "Analog Devices", +[0][0x66 - 1] = "PMC-Sierra", +[0][0x67 - 1] = "Asparix", +[0][0x68 - 1] = "Convex Computer", +[0][0x69 - 1] = "Quality Semiconductor", +[0][0x6a - 1] = "Nimbus Technology", +[0][0x6b - 1] = "Transwitch", +[0][0x6c - 1] = "Micronas (ITT Intermetall)", +[0][0x6d - 1] = "Cannon", +[0][0x6e - 1] = "Altera", +[0][0x6f - 1] = "NEXCOM", +[0][0x70 - 1] = "Qualcomm", +[0][0x71 - 1] = "Sony", +[0][0x72 - 1] = "Cray Research", +[0][0x73 - 1] = "AMS(Austria Micro)", +[0][0x74 - 1] = "Vitesse", +[0][0x75 - 1] = "Aster Electronics", +[0][0x76 - 1] = "Bay Networks (Synoptic)", +[0][0x77 - 1] = "Zentrum/ZMD", +[0][0x78 - 1] = "TRW", +[0][0x79 - 1] = "Thesys", +[0][0x7a - 1] = "Solbourne Computer", +[0][0x7b - 1] = "Allied-Signal", +[0][0x7c - 1] = "Dialog Semiconductor", +[0][0x7d - 1] = "Media Vision", +[0][0x7e - 1] = "Numonyx Corporation", +[1][0x01 - 1] = "Cirrus Logic", +[1][0x02 - 1] = "National Instruments", +[1][0x03 - 1] = "ILC Data Device", +[1][0x04 - 1] = "Alcatel Mietec", +[1][0x05 - 1] = "Micro Linear", +[1][0x06 - 1] = "Univ. of NC", +[1][0x07 - 1] = "JTAG Technologies", +[1][0x08 - 1] = "BAE Systems (Loral)", +[1][0x09 - 1] = "Nchip", +[1][0x0a - 1] = "Galileo Tech", +[1][0x0b - 1] = "Bestlink Systems", +[1][0x0c - 1] = "Graychip", +[1][0x0d - 1] = "GENNUM", +[1][0x0e - 1] = "Imagination Technologies Limited", +[1][0x0f - 1] = "Robert Bosch", +[1][0x10 - 1] = "Chip Express", +[1][0x11 - 1] = "DATARAM", +[1][0x12 - 1] = "United Microelectronics Corp", +[1][0x13 - 1] = "TCSI", +[1][0x14 - 1] = "Smart Modular", +[1][0x15 - 1] = "Hughes Aircraft", +[1][0x16 - 1] = "Lanstar Semiconductor", +[1][0x17 - 1] = "Qlogic", +[1][0x18 - 1] = "Kingston", +[1][0x19 - 1] = "Music Semi", +[1][0x1a - 1] = "Ericsson Components", +[1][0x1b - 1] = "SpaSE", +[1][0x1c - 1] = "Eon Silicon Devices", +[1][0x1d - 1] = "Integrated Silicon Solution (ISSI)", +[1][0x1e - 1] = "DoD", +[1][0x1f - 1] = "Integ. Memories Tech.", +[1][0x20 - 1] = "Corollary Inc", +[1][0x21 - 1] = "Dallas Semiconductor", +[1][0x22 - 1] = "Omnivision", +[1][0x23 - 1] = "EIV(Switzerland)", +[1][0x24 - 1] = "Novatel Wireless", +[1][0x25 - 1] = "Zarlink (Mitel)", +[1][0x26 - 1] = "Clearpoint", +[1][0x27 - 1] = "Cabletron", +[1][0x28 - 1] = "STEC (Silicon Tech)", +[1][0x29 - 1] = "Vanguard", +[1][0x2a - 1] = "Hagiwara Sys-Com", +[1][0x2b - 1] = "Vantis", +[1][0x2c - 1] = "Celestica", +[1][0x2d - 1] = "Century", +[1][0x2e - 1] = "Hal Computers", +[1][0x2f - 1] = "Rohm Company Ltd", +[1][0x30 - 1] = "Juniper Networks", +[1][0x31 - 1] = "Libit Signal Processing", +[1][0x32 - 1] = "Mushkin Enhanced Memory", +[1][0x33 - 1] = "Tundra Semiconductor", +[1][0x34 - 1] = "Adaptec Inc", +[1][0x35 - 1] = "LightSpeed Semi.", +[1][0x36 - 1] = "ZSP Corp", +[1][0x37 - 1] = "AMIC Technology", +[1][0x38 - 1] = "Adobe Systems", +[1][0x39 - 1] = "Dynachip", +[1][0x3a - 1] = "PNY Technologies Inc", +[1][0x3b - 1] = "Newport Digital", +[1][0x3c - 1] = "MMC Networks", +[1][0x3d - 1] = "T Square", +[1][0x3e - 1] = "Seiko Epson", +[1][0x3f - 1] = "Broadcom", +[1][0x40 - 1] = "Viking Components", +[1][0x41 - 1] = "V3 Semiconductor", +[1][0x42 - 1] = "Flextronics (Orbit Semiconductor)", +[1][0x43 - 1] = "Suwa Electronics", +[1][0x44 - 1] = "Transmeta", +[1][0x45 - 1] = "Micron CMS", +[1][0x46 - 1] = "American Computer & Digital Components Inc", +[1][0x47 - 1] = "Enhance 3000 Inc", +[1][0x48 - 1] = "Tower Semiconductor", +[1][0x49 - 1] = "CPU Design", +[1][0x4a - 1] = "Price Point", +[1][0x4b - 1] = "Maxim Integrated Product", +[1][0x4c - 1] = "Tellabs", +[1][0x4d - 1] = "Centaur Technology", +[1][0x4e - 1] = "Unigen Corporation", +[1][0x4f - 1] = "Transcend Information", +[1][0x50 - 1] = "Memory Card Technology", +[1][0x51 - 1] = "CKD Corporation Ltd", +[1][0x52 - 1] = "Capital Instruments Inc", +[1][0x53 - 1] = "Aica Kogyo Ltd", +[1][0x54 - 1] = "Linvex Technology", +[1][0x55 - 1] = "MSC Vertriebs GmbH", +[1][0x56 - 1] = "AKM Company Ltd", +[1][0x57 - 1] = "Dynamem Inc", +[1][0x58 - 1] = "NERA ASA", +[1][0x59 - 1] = "GSI Technology", +[1][0x5a - 1] = "Dane-Elec (C Memory)", +[1][0x5b - 1] = "Acorn Computers", +[1][0x5c - 1] = "Lara Technology", +[1][0x5d - 1] = "Oak Technology Inc", +[1][0x5e - 1] = "Itec Memory", +[1][0x5f - 1] = "Tanisys Technology", +[1][0x60 - 1] = "Truevision", +[1][0x61 - 1] = "Wintec Industries", +[1][0x62 - 1] = "Super PC Memory", +[1][0x63 - 1] = "MGV Memory", +[1][0x64 - 1] = "Galvantech", +[1][0x65 - 1] = "Gadzoox Networks", +[1][0x66 - 1] = "Multi Dimensional Cons.", +[1][0x67 - 1] = "GateField", +[1][0x68 - 1] = "Integrated Memory System", +[1][0x69 - 1] = "Triscend", +[1][0x6a - 1] = "XaQti", +[1][0x6b - 1] = "Goldenram", +[1][0x6c - 1] = "Clear Logic", +[1][0x6d - 1] = "Cimaron Communications", +[1][0x6e - 1] = "Nippon Steel Semi. Corp", +[1][0x6f - 1] = "Advantage Memory", +[1][0x70 - 1] = "AMCC", +[1][0x71 - 1] = "LeCroy", +[1][0x72 - 1] = "Yamaha Corporation", +[1][0x73 - 1] = "Digital Microwave", +[1][0x74 - 1] = "NetLogic Microsystems", +[1][0x75 - 1] = "MIMOS Semiconductor", +[1][0x76 - 1] = "Advanced Fibre", +[1][0x77 - 1] = "BF Goodrich Data.", +[1][0x78 - 1] = "Epigram", +[1][0x79 - 1] = "Acbel Polytech Inc", +[1][0x7a - 1] = "Apacer Technology", +[1][0x7b - 1] = "Admor Memory", +[1][0x7c - 1] = "FOXCONN", +[1][0x7d - 1] = "Quadratics Superconductor", +[1][0x7e - 1] = "3COM", +[2][0x01 - 1] = "Camintonn Corporation", +[2][0x02 - 1] = "ISOA Incorporated", +[2][0x03 - 1] = "Agate Semiconductor", +[2][0x04 - 1] = "ADMtek Incorporated", +[2][0x05 - 1] = "HYPERTEC", +[2][0x06 - 1] = "Adhoc Technologies", +[2][0x07 - 1] = "MOSAID Technologies", +[2][0x08 - 1] = "Ardent Technologies", +[2][0x09 - 1] = "Switchcore", +[2][0x0a - 1] = "Cisco Systems Inc", +[2][0x0b - 1] = "Allayer Technologies", +[2][0x0c - 1] = "WorkX AG (Wichman)", +[2][0x0d - 1] = "Oasis Semiconductor", +[2][0x0e - 1] = "Novanet Semiconductor", +[2][0x0f - 1] = "E-M Solutions", +[2][0x10 - 1] = "Power General", +[2][0x11 - 1] = "Advanced Hardware Arch.", +[2][0x12 - 1] = "Inova Semiconductors GmbH", +[2][0x13 - 1] = "Telocity", +[2][0x14 - 1] = "Delkin Devices", +[2][0x15 - 1] = "Symagery Microsystems", +[2][0x16 - 1] = "C-Port Corporation", +[2][0x17 - 1] = "SiberCore Technologies", +[2][0x18 - 1] = "Southland Microsystems", +[2][0x19 - 1] = "Malleable Technologies", +[2][0x1a - 1] = "Kendin Communications", +[2][0x1b - 1] = "Great Technology Microcomputer", +[2][0x1c - 1] = "Sanmina Corporation", +[2][0x1d - 1] = "HADCO Corporation", +[2][0x1e - 1] = "Corsair", +[2][0x1f - 1] = "Actrans System Inc", +[2][0x20 - 1] = "ALPHA Technologies", +[2][0x21 - 1] = "Silicon Laboratories Inc (Cygnal)", +[2][0x22 - 1] = "Artesyn Technologies", +[2][0x23 - 1] = "Align Manufacturing", +[2][0x24 - 1] = "Peregrine Semiconductor", +[2][0x25 - 1] = "Chameleon Systems", +[2][0x26 - 1] = "Aplus Flash Technology", +[2][0x27 - 1] = "MIPS Technologies", +[2][0x28 - 1] = "Chrysalis ITS", +[2][0x29 - 1] = "ADTEC Corporation", +[2][0x2a - 1] = "Kentron Technologies", +[2][0x2b - 1] = "Win Technologies", +[2][0x2c - 1] = "Tezzaron Semiconductor", +[2][0x2d - 1] = "Extreme Packet Devices", +[2][0x2e - 1] = "RF Micro Devices", +[2][0x2f - 1] = "Siemens AG", +[2][0x30 - 1] = "Sarnoff Corporation", +[2][0x31 - 1] = "Itautec SA", +[2][0x32 - 1] = "Radiata Inc", +[2][0x33 - 1] = "Benchmark Elect. (AVEX)", +[2][0x34 - 1] = "Legend", +[2][0x35 - 1] = "SpecTek Incorporated", +[2][0x36 - 1] = "Hi/fn", +[2][0x37 - 1] = "Enikia Incorporated", +[2][0x38 - 1] = "SwitchOn Networks", +[2][0x39 - 1] = "AANetcom Incorporated", +[2][0x3a - 1] = "Micro Memory Bank", +[2][0x3b - 1] = "ESS Technology", +[2][0x3c - 1] = "Virata Corporation", +[2][0x3d - 1] = "Excess Bandwidth", +[2][0x3e - 1] = "West Bay Semiconductor", +[2][0x3f - 1] = "DSP Group", +[2][0x40 - 1] = "Newport Communications", +[2][0x41 - 1] = "Chip2Chip Incorporated", +[2][0x42 - 1] = "Phobos Corporation", +[2][0x43 - 1] = "Intellitech Corporation", +[2][0x44 - 1] = "Nordic VLSI ASA", +[2][0x45 - 1] = "Ishoni Networks", +[2][0x46 - 1] = "Silicon Spice", +[2][0x47 - 1] = "Alchemy Semiconductor", +[2][0x48 - 1] = "Agilent Technologies", +[2][0x49 - 1] = "Centillium Communications", +[2][0x4a - 1] = "W.L. Gore", +[2][0x4b - 1] = "HanBit Electronics", +[2][0x4c - 1] = "GlobeSpan", +[2][0x4d - 1] = "Element 14", +[2][0x4e - 1] = "Pycon", +[2][0x4f - 1] = "Saifun Semiconductors", +[2][0x50 - 1] = "Sibyte Incorporated", +[2][0x51 - 1] = "MetaLink Technologies", +[2][0x52 - 1] = "Feiya Technology", +[2][0x53 - 1] = "I & C Technology", +[2][0x54 - 1] = "Shikatronics", +[2][0x55 - 1] = "Elektrobit", +[2][0x56 - 1] = "Megic", +[2][0x57 - 1] = "Com-Tier", +[2][0x58 - 1] = "Malaysia Micro Solutions", +[2][0x59 - 1] = "Hyperchip", +[2][0x5a - 1] = "Gemstone Communications", +[2][0x5b - 1] = "Anadigm (Anadyne)", +[2][0x5c - 1] = "3ParData", +[2][0x5d - 1] = "Mellanox Technologies", +[2][0x5e - 1] = "Tenx Technologies", +[2][0x5f - 1] = "Helix AG", +[2][0x60 - 1] = "Domosys", +[2][0x61 - 1] = "Skyup Technology", +[2][0x62 - 1] = "HiNT Corporation", +[2][0x63 - 1] = "Chiaro", +[2][0x64 - 1] = "MDT Technologies GmbH", +[2][0x65 - 1] = "Exbit Technology A/S", +[2][0x66 - 1] = "Integrated Technology Express", +[2][0x67 - 1] = "AVED Memory", +[2][0x68 - 1] = "Legerity", +[2][0x69 - 1] = "Jasmine Networks", +[2][0x6a - 1] = "Caspian Networks", +[2][0x6b - 1] = "nCUBE", +[2][0x6c - 1] = "Silicon Access Networks", +[2][0x6d - 1] = "FDK Corporation", +[2][0x6e - 1] = "High Bandwidth Access", +[2][0x6f - 1] = "MultiLink Technology", +[2][0x70 - 1] = "BRECIS", +[2][0x71 - 1] = "World Wide Packets", +[2][0x72 - 1] = "APW", +[2][0x73 - 1] = "Chicory Systems", +[2][0x74 - 1] = "Xstream Logic", +[2][0x75 - 1] = "Fast-Chip", +[2][0x76 - 1] = "Zucotto Wireless", +[2][0x77 - 1] = "Realchip", +[2][0x78 - 1] = "Galaxy Power", +[2][0x79 - 1] = "eSilicon", +[2][0x7a - 1] = "Morphics Technology", +[2][0x7b - 1] = "Accelerant Networks", +[2][0x7c - 1] = "Silicon Wave", +[2][0x7d - 1] = "SandCraft", +[2][0x7e - 1] = "Elpida", +[3][0x01 - 1] = "Solectron", +[3][0x02 - 1] = "Optosys Technologies", +[3][0x03 - 1] = "Buffalo (Formerly Melco)", +[3][0x04 - 1] = "TriMedia Technologies", +[3][0x05 - 1] = "Cyan Technologies", +[3][0x06 - 1] = "Global Locate", +[3][0x07 - 1] = "Optillion", +[3][0x08 - 1] = "Terago Communications", +[3][0x09 - 1] = "Ikanos Communications", +[3][0x0a - 1] = "Princeton Technology", +[3][0x0b - 1] = "Nanya Technology", +[3][0x0c - 1] = "Elite Flash Storage", +[3][0x0d - 1] = "Mysticom", +[3][0x0e - 1] = "LightSand Communications", +[3][0x0f - 1] = "ATI Technologies", +[3][0x10 - 1] = "Agere Systems", +[3][0x11 - 1] = "NeoMagic", +[3][0x12 - 1] = "AuroraNetics", +[3][0x13 - 1] = "Golden Empire", +[3][0x14 - 1] = "Mushkin", +[3][0x15 - 1] = "Tioga Technologies", +[3][0x16 - 1] = "Netlist", +[3][0x17 - 1] = "TeraLogic", +[3][0x18 - 1] = "Cicada Semiconductor", +[3][0x19 - 1] = "Centon Electronics", +[3][0x1a - 1] = "Tyco Electronics", +[3][0x1b - 1] = "Magis Works", +[3][0x1c - 1] = "Zettacom", +[3][0x1d - 1] = "Cogency Semiconductor", +[3][0x1e - 1] = "Chipcon AS", +[3][0x1f - 1] = "Aspex Technology", +[3][0x20 - 1] = "F5 Networks", +[3][0x21 - 1] = "Programmable Silicon Solutions", +[3][0x22 - 1] = "ChipWrights", +[3][0x23 - 1] = "Acorn Networks", +[3][0x24 - 1] = "Quicklogic", +[3][0x25 - 1] = "Kingmax Semiconductor", +[3][0x26 - 1] = "BOPS", +[3][0x27 - 1] = "Flasys", +[3][0x28 - 1] = "BitBlitz Communications", +[3][0x29 - 1] = "eMemory Technology", +[3][0x2a - 1] = "Procket Networks", +[3][0x2b - 1] = "Purple Ray", +[3][0x2c - 1] = "Trebia Networks", +[3][0x2d - 1] = "Delta Electronics", +[3][0x2e - 1] = "Onex Communications", +[3][0x2f - 1] = "Ample Communications", +[3][0x30 - 1] = "Memory Experts Intl", +[3][0x31 - 1] = "Astute Networks", +[3][0x32 - 1] = "Azanda Network Devices", +[3][0x33 - 1] = "Dibcom", +[3][0x34 - 1] = "Tekmos", +[3][0x35 - 1] = "API NetWorks", +[3][0x36 - 1] = "Bay Microsystems", +[3][0x37 - 1] = "Firecron Ltd", +[3][0x38 - 1] = "Resonext Communications", +[3][0x39 - 1] = "Tachys Technologies", +[3][0x3a - 1] = "Equator Technology", +[3][0x3b - 1] = "Concept Computer", +[3][0x3c - 1] = "SILCOM", +[3][0x3d - 1] = "3Dlabs", +[3][0x3e - 1] = "c't Magazine", +[3][0x3f - 1] = "Sanera Systems", +[3][0x40 - 1] = "Silicon Packets", +[3][0x41 - 1] = "Viasystems Group", +[3][0x42 - 1] = "Simtek", +[3][0x43 - 1] = "Semicon Devices Singapore", +[3][0x44 - 1] = "Satron Handelsges", +[3][0x45 - 1] = "Improv Systems", +[3][0x46 - 1] = "INDUSYS GmbH", +[3][0x47 - 1] = "Corrent", +[3][0x48 - 1] = "Infrant Technologies", +[3][0x49 - 1] = "Ritek Corp", +[3][0x4a - 1] = "empowerTel Networks", +[3][0x4b - 1] = "Hypertec", +[3][0x4c - 1] = "Cavium Networks", +[3][0x4d - 1] = "PLX Technology", +[3][0x4e - 1] = "Massana Design", +[3][0x4f - 1] = "Intrinsity", +[3][0x50 - 1] = "Valence Semiconductor", +[3][0x51 - 1] = "Terawave Communications", +[3][0x52 - 1] = "IceFyre Semiconductor", +[3][0x53 - 1] = "Primarion", +[3][0x54 - 1] = "Picochip Designs Ltd", +[3][0x55 - 1] = "Silverback Systems", +[3][0x56 - 1] = "Jade Star Technologies", +[3][0x57 - 1] = "Pijnenburg Securealink", +[3][0x58 - 1] = "takeMS - Ultron AG", +[3][0x59 - 1] = "Cambridge Silicon Radio", +[3][0x5a - 1] = "Swissbit", +[3][0x5b - 1] = "Nazomi Communications", +[3][0x5c - 1] = "eWave System", +[3][0x5d - 1] = "Rockwell Collins", +[3][0x5e - 1] = "Picocel Co Ltd (Paion)", +[3][0x5f - 1] = "Alphamosaic Ltd", +[3][0x60 - 1] = "Sandburst", +[3][0x61 - 1] = "SiCon Video", +[3][0x62 - 1] = "NanoAmp Solutions", +[3][0x63 - 1] = "Ericsson Technology", +[3][0x64 - 1] = "PrairieComm", +[3][0x65 - 1] = "Mitac International", +[3][0x66 - 1] = "Layer N Networks", +[3][0x67 - 1] = "MtekVision (Atsana)", +[3][0x68 - 1] = "Allegro Networks", +[3][0x69 - 1] = "Marvell Semiconductors", +[3][0x6a - 1] = "Netergy Microelectronic", +[3][0x6b - 1] = "NVIDIA", +[3][0x6c - 1] = "Internet Machines", +[3][0x6d - 1] = "Memorysolution GmbH", +[3][0x6e - 1] = "Litchfield Communication", +[3][0x6f - 1] = "Accton Technology", +[3][0x70 - 1] = "Teradiant Networks", +[3][0x71 - 1] = "Scaleo Chip", +[3][0x72 - 1] = "Cortina Systems", +[3][0x73 - 1] = "RAM Components", +[3][0x74 - 1] = "Raqia Networks", +[3][0x75 - 1] = "ClearSpeed", +[3][0x76 - 1] = "Matsushita Battery", +[3][0x77 - 1] = "Xelerated", +[3][0x78 - 1] = "SimpleTech", +[3][0x79 - 1] = "Utron Technology", +[3][0x7a - 1] = "Astec International", +[3][0x7b - 1] = "AVM gmbH", +[3][0x7c - 1] = "Redux Communications", +[3][0x7d - 1] = "Dot Hill Systems", +[3][0x7e - 1] = "TeraChip", +[4][0x01 - 1] = "T-RAM Incorporated", +[4][0x02 - 1] = "Innovics Wireless", +[4][0x03 - 1] = "Teknovus", +[4][0x04 - 1] = "KeyEye Communications", +[4][0x05 - 1] = "Runcom Technologies", +[4][0x06 - 1] = "RedSwitch", +[4][0x07 - 1] = "Dotcast", +[4][0x08 - 1] = "Silicon Mountain Memory", +[4][0x09 - 1] = "Signia Technologies", +[4][0x0a - 1] = "Pixim", +[4][0x0b - 1] = "Galazar Networks", +[4][0x0c - 1] = "White Electronic Designs", +[4][0x0d - 1] = "Patriot Scientific", +[4][0x0e - 1] = "Neoaxiom Corporation", +[4][0x0f - 1] = "3Y Power Technology", +[4][0x10 - 1] = "Scaleo Chip", +[4][0x11 - 1] = "Potentia Power Systems", +[4][0x12 - 1] = "C-guys Incorporated", +[4][0x13 - 1] = "Digital Communications Technology Inc", +[4][0x14 - 1] = "Silicon-Based Technology", +[4][0x15 - 1] = "Fulcrum Microsystems", +[4][0x16 - 1] = "Positivo Informatica Ltd", +[4][0x17 - 1] = "XIOtech Corporation", +[4][0x18 - 1] = "PortalPlayer", +[4][0x19 - 1] = "Zhiying Software", +[4][0x1a - 1] = "ParkerVision Inc", +[4][0x1b - 1] = "Phonex Broadband", +[4][0x1c - 1] = "Skyworks Solutions", +[4][0x1d - 1] = "Entropic Communications", +[4][0x1e - 1] = "I'M Intelligent Memory Ltd", +[4][0x1f - 1] = "Zensys A/S", +[4][0x20 - 1] = "Legend Silicon Corp", +[4][0x21 - 1] = "Sci-worx GmbH", +[4][0x22 - 1] = "SMSC (Standard Microsystems)", +[4][0x23 - 1] = "Renesas Electronics", +[4][0x24 - 1] = "Raza Microelectronics", +[4][0x25 - 1] = "Phyworks", +[4][0x26 - 1] = "MediaTek", +[4][0x27 - 1] = "Non-cents Productions", +[4][0x28 - 1] = "US Modular", +[4][0x29 - 1] = "Wintegra Ltd", +[4][0x2a - 1] = "Mathstar", +[4][0x2b - 1] = "StarCore", +[4][0x2c - 1] = "Oplus Technologies", +[4][0x2d - 1] = "Mindspeed", +[4][0x2e - 1] = "Just Young Computer", +[4][0x2f - 1] = "Radia Communications", +[4][0x30 - 1] = "OCZ", +[4][0x31 - 1] = "Emuzed", +[4][0x32 - 1] = "LOGIC Devices", +[4][0x33 - 1] = "Inphi Corporation", +[4][0x34 - 1] = "Quake Technologies", +[4][0x35 - 1] = "Vixel", +[4][0x36 - 1] = "SolusTek", +[4][0x37 - 1] = "Kongsberg Maritime", +[4][0x38 - 1] = "Faraday Technology", +[4][0x39 - 1] = "Altium Ltd", +[4][0x3a - 1] = "Insyte", +[4][0x3b - 1] = "ARM Ltd", +[4][0x3c - 1] = "DigiVision", +[4][0x3d - 1] = "Vativ Technologies", +[4][0x3e - 1] = "Endicott Interconnect Technologies", +[4][0x3f - 1] = "Pericom", +[4][0x40 - 1] = "Bandspeed", +[4][0x41 - 1] = "LeWiz Communications", +[4][0x42 - 1] = "CPU Technology", +[4][0x43 - 1] = "Ramaxel Technology", +[4][0x44 - 1] = "DSP Group", +[4][0x45 - 1] = "Axis Communications", +[4][0x46 - 1] = "Legacy Electronics", +[4][0x47 - 1] = "Chrontel", +[4][0x48 - 1] = "Powerchip Semiconductor", +[4][0x49 - 1] = "MobilEye Technologies", +[4][0x4a - 1] = "Excel Semiconductor", +[4][0x4b - 1] = "A-DATA Technology", +[4][0x4c - 1] = "VirtualDigm", +[4][0x4d - 1] = "G Skill Intl", +[4][0x4e - 1] = "Quanta Computer", +[4][0x4f - 1] = "Yield Microelectronics", +[4][0x50 - 1] = "Afa Technologies", +[4][0x51 - 1] = "KINGBOX Technology Co Ltd", +[4][0x52 - 1] = "Ceva", +[4][0x53 - 1] = "iStor Networks", +[4][0x54 - 1] = "Advance Modules", +[4][0x55 - 1] = "Microsoft", +[4][0x56 - 1] = "Open-Silicon", +[4][0x57 - 1] = "Goal Semiconductor", +[4][0x58 - 1] = "ARC International", +[4][0x59 - 1] = "Simmtec", +[4][0x5a - 1] = "Metanoia", +[4][0x5b - 1] = "Key Stream", +[4][0x5c - 1] = "Lowrance Electronics", +[4][0x5d - 1] = "Adimos", +[4][0x5e - 1] = "SiGe Semiconductor", +[4][0x5f - 1] = "Fodus Communications", +[4][0x60 - 1] = "Credence Systems Corp", +[4][0x61 - 1] = "Genesis Microchip Inc", +[4][0x62 - 1] = "Vihana Inc", +[4][0x63 - 1] = "WIS Technologies", +[4][0x64 - 1] = "GateChange Technologies", +[4][0x65 - 1] = "High Density Devices AS", +[4][0x66 - 1] = "Synopsys", +[4][0x67 - 1] = "Gigaram", +[4][0x68 - 1] = "Enigma Semiconductor Inc", +[4][0x69 - 1] = "Century Micro Inc", +[4][0x6a - 1] = "Icera Semiconductor", +[4][0x6b - 1] = "Mediaworks Integrated Systems", +[4][0x6c - 1] = "O'Neil Product Development", +[4][0x6d - 1] = "Supreme Top Technology Ltd", +[4][0x6e - 1] = "MicroDisplay Corporation", +[4][0x6f - 1] = "Team Group Inc", +[4][0x70 - 1] = "Sinett Corporation", +[4][0x71 - 1] = "Toshiba Corporation", +[4][0x72 - 1] = "Tensilica", +[4][0x73 - 1] = "SiRF Technology", +[4][0x74 - 1] = "Bacoc Inc", +[4][0x75 - 1] = "SMaL Camera Technologies", +[4][0x76 - 1] = "Thomson SC", +[4][0x77 - 1] = "Airgo Networks", +[4][0x78 - 1] = "Wisair Ltd", +[4][0x79 - 1] = "SigmaTel", +[4][0x7a - 1] = "Arkados", +[4][0x7b - 1] = "Compete IT gmbH Co KG", +[4][0x7c - 1] = "Eudar Technology Inc", +[4][0x7d - 1] = "Focus Enhancements", +[4][0x7e - 1] = "Xyratex", +[5][0x01 - 1] = "Specular Networks", +[5][0x02 - 1] = "Patriot Memory (PDP Systems)", +[5][0x03 - 1] = "U-Chip Technology Corp", +[5][0x04 - 1] = "Silicon Optix", +[5][0x05 - 1] = "Greenfield Networks", +[5][0x06 - 1] = "CompuRAM GmbH", +[5][0x07 - 1] = "Stargen Inc", +[5][0x08 - 1] = "NetCell Corporation", +[5][0x09 - 1] = "Excalibrus Technologies Ltd", +[5][0x0a - 1] = "SCM Microsystems", +[5][0x0b - 1] = "Xsigo Systems Inc", +[5][0x0c - 1] = "CHIPS & Systems Inc", +[5][0x0d - 1] = "Tier 1 Multichip Solutions", +[5][0x0e - 1] = "CWRL Labs", +[5][0x0f - 1] = "Teradici", +[5][0x10 - 1] = "Gigaram Inc", +[5][0x11 - 1] = "g2 Microsystems", +[5][0x12 - 1] = "PowerFlash Semiconductor", +[5][0x13 - 1] = "P.A. Semi Inc", +[5][0x14 - 1] = "NovaTech Solutions S.A.", +[5][0x15 - 1] = "c2 Microsystems Inc", +[5][0x16 - 1] = "Level5 Networks", +[5][0x17 - 1] = "COS Memory AG", +[5][0x18 - 1] = "Innovasic Semiconductor", +[5][0x19 - 1] = "02IC Co Ltd", +[5][0x1a - 1] = "Tabula Inc", +[5][0x1b - 1] = "Crucial Technology", +[5][0x1c - 1] = "Chelsio Communications", +[5][0x1d - 1] = "Solarflare Communications", +[5][0x1e - 1] = "Xambala Inc", +[5][0x1f - 1] = "EADS Astrium", +[5][0x20 - 1] = "Terra Semiconductor Inc", +[5][0x21 - 1] = "Imaging Works Inc", +[5][0x22 - 1] = "Astute Networks Inc", +[5][0x23 - 1] = "Tzero", +[5][0x24 - 1] = "Emulex", +[5][0x25 - 1] = "Power-One", +[5][0x26 - 1] = "Pulse~LINK Inc", +[5][0x27 - 1] = "Hon Hai Precision Industry", +[5][0x28 - 1] = "White Rock Networks Inc", +[5][0x29 - 1] = "Telegent Systems USA Inc", +[5][0x2a - 1] = "Atrua Technologies Inc", +[5][0x2b - 1] = "Acbel Polytech Inc", +[5][0x2c - 1] = "eRide Inc", +[5][0x2d - 1] = "ULi Electronics Inc", +[5][0x2e - 1] = "Magnum Semiconductor Inc", +[5][0x2f - 1] = "neoOne Technology Inc", +[5][0x30 - 1] = "Connex Technology Inc", +[5][0x31 - 1] = "Stream Processors Inc", +[5][0x32 - 1] = "Focus Enhancements", +[5][0x33 - 1] = "Telecis Wireless Inc", +[5][0x34 - 1] = "uNav Microelectronics", +[5][0x35 - 1] = "Tarari Inc", +[5][0x36 - 1] = "Ambric Inc", +[5][0x37 - 1] = "Newport Media Inc", +[5][0x38 - 1] = "VMTS", +[5][0x39 - 1] = "Enuclia Semiconductor Inc", +[5][0x3a - 1] = "Virtium Technology Inc", +[5][0x3b - 1] = "Solid State System Co Ltd", +[5][0x3c - 1] = "Kian Tech LLC", +[5][0x3d - 1] = "Artimi", +[5][0x3e - 1] = "Power Quotient International", +[5][0x3f - 1] = "Avago Technologies", +[5][0x40 - 1] = "ADTechnology", +[5][0x41 - 1] = "Sigma Designs", +[5][0x42 - 1] = "SiCortex Inc", +[5][0x43 - 1] = "Ventura Technology Group", +[5][0x44 - 1] = "eASIC", +[5][0x45 - 1] = "M.H.S. SAS", +[5][0x46 - 1] = "Micro Star International", +[5][0x47 - 1] = "Rapport Inc", +[5][0x48 - 1] = "Makway International", +[5][0x49 - 1] = "Broad Reach Engineering Co", +[5][0x4a - 1] = "Semiconductor Mfg Intl Corp", +[5][0x4b - 1] = "SiConnect", +[5][0x4c - 1] = "FCI USA Inc", +[5][0x4d - 1] = "Validity Sensors", +[5][0x4e - 1] = "Coney Technology Co Ltd", +[5][0x4f - 1] = "Spans Logic", +[5][0x50 - 1] = "Neterion Inc", +[5][0x51 - 1] = "Qimonda", +[5][0x52 - 1] = "New Japan Radio Co Ltd", +[5][0x53 - 1] = "Velogix", +[5][0x54 - 1] = "Montalvo Systems", +[5][0x55 - 1] = "iVivity Inc", +[5][0x56 - 1] = "Walton Chaintech", +[5][0x57 - 1] = "AENEON", +[5][0x58 - 1] = "Lorom Industrial Co Ltd", +[5][0x59 - 1] = "Radiospire Networks", +[5][0x5a - 1] = "Sensio Technologies Inc", +[5][0x5b - 1] = "Nethra Imaging", +[5][0x5c - 1] = "Hexon Technology Pte Ltd", +[5][0x5d - 1] = "CompuStocx (CSX)", +[5][0x5e - 1] = "Methode Electronics Inc", +[5][0x5f - 1] = "Connect One Ltd", +[5][0x60 - 1] = "Opulan Technologies", +[5][0x61 - 1] = "Septentrio NV", +[5][0x62 - 1] = "Goldenmars Technology Inc", +[5][0x63 - 1] = "Kreton Corporation", +[5][0x64 - 1] = "Cochlear Ltd", +[5][0x65 - 1] = "Altair Semiconductor", +[5][0x66 - 1] = "NetEffect Inc", +[5][0x67 - 1] = "Spansion Inc", +[5][0x68 - 1] = "Taiwan Semiconductor Mfg", +[5][0x69 - 1] = "Emphany Systems Inc", +[5][0x6a - 1] = "ApaceWave Technologies", +[5][0x6b - 1] = "Mobilygen Corporation", +[5][0x6c - 1] = "Tego", +[5][0x6d - 1] = "Cswitch Corporation", +[5][0x6e - 1] = "Haier (Beijing) IC Design Co", +[5][0x6f - 1] = "MetaRAM", +[5][0x70 - 1] = "Axel Electronics Co Ltd", +[5][0x71 - 1] = "Tilera Corporation", +[5][0x72 - 1] = "Aquantia", +[5][0x73 - 1] = "Vivace Semiconductor", +[5][0x74 - 1] = "Redpine Signals", +[5][0x75 - 1] = "Octalica", +[5][0x76 - 1] = "InterDigital Communications", +[5][0x77 - 1] = "Avant Technology", +[5][0x78 - 1] = "Asrock Inc", +[5][0x79 - 1] = "Availink", +[5][0x7a - 1] = "Quartics Inc", +[5][0x7b - 1] = "Element CXI", +[5][0x7c - 1] = "Innovaciones Microelectronicas", +[5][0x7d - 1] = "VeriSilicon Microelectronics", +[5][0x7e - 1] = "W5 Networks", +[6][0x01 - 1] = "MOVEKING", +[6][0x02 - 1] = "Mavrix Technology Inc", +[6][0x03 - 1] = "CellGuide Ltd", +[6][0x04 - 1] = "Faraday Technology", +[6][0x05 - 1] = "Diablo Technologies Inc", +[6][0x06 - 1] = "Jennic", +[6][0x07 - 1] = "Octasic", +[6][0x08 - 1] = "Molex Incorporated", +[6][0x09 - 1] = "3Leaf Networks", +[6][0x0a - 1] = "Bright Micron Technology", +[6][0x0b - 1] = "Netxen", +[6][0x0c - 1] = "NextWave Broadband Inc", +[6][0x0d - 1] = "DisplayLink", +[6][0x0e - 1] = "ZMOS Technology", +[6][0x0f - 1] = "Tec-Hill", +[6][0x10 - 1] = "Multigig Inc", +[6][0x11 - 1] = "Amimon", +[6][0x12 - 1] = "Euphonic Technologies Inc", +[6][0x13 - 1] = "BRN Phoenix", +[6][0x14 - 1] = "InSilica", +[6][0x15 - 1] = "Ember Corporation", +[6][0x16 - 1] = "Avexir Technologies Corporation", +[6][0x17 - 1] = "Echelon Corporation", +[6][0x18 - 1] = "Edgewater Computer Systems", +[6][0x19 - 1] = "XMOS Semiconductor Ltd", +[6][0x1a - 1] = "GENUSION Inc", +[6][0x1b - 1] = "Memory Corp NV", +[6][0x1c - 1] = "SiliconBlue Technologies", +[6][0x1d - 1] = "Rambus Inc", +[6][0x1e - 1] = "Andes Technology Corporation", +[6][0x1f - 1] = "Coronis Systems", +[6][0x20 - 1] = "Achronix Semiconductor", +[6][0x21 - 1] = "Siano Mobile Silicon Ltd", +[6][0x22 - 1] = "Semtech Corporation", +[6][0x23 - 1] = "Pixelworks Inc", +[6][0x24 - 1] = "Gaisler Research AB", +[6][0x25 - 1] = "Teranetics", +[6][0x26 - 1] = "Toppan Printing Co Ltd", +[6][0x27 - 1] = "Kingxcon", +[6][0x28 - 1] = "Silicon Integrated Systems", +[6][0x29 - 1] = "I-O Data Device Inc", +[6][0x2a - 1] = "NDS Americas Inc", +[6][0x2b - 1] = "Solomon Systech Limited", +[6][0x2c - 1] = "On Demand Microelectronics", +[6][0x2d - 1] = "Amicus Wireless Inc", +[6][0x2e - 1] = "SMARDTV SNC", +[6][0x2f - 1] = "Comsys Communication Ltd", +[6][0x30 - 1] = "Movidia Ltd", +[6][0x31 - 1] = "Javad GNSS Inc", +[6][0x32 - 1] = "Montage Technology Group", +[6][0x33 - 1] = "Trident Microsystems", +[6][0x34 - 1] = "Super Talent", +[6][0x35 - 1] = "Optichron Inc", +[6][0x36 - 1] = "Future Waves UK Ltd", +[6][0x37 - 1] = "SiBEAM Inc", +[6][0x38 - 1] = "InicoreInc", +[6][0x39 - 1] = "Virident Systems", +[6][0x3a - 1] = "M2000 Inc", +[6][0x3b - 1] = "ZeroG Wireless Inc", +[6][0x3c - 1] = "Gingle Technology Co Ltd", +[6][0x3d - 1] = "Space Micro Inc", +[6][0x3e - 1] = "Wilocity", +[6][0x3f - 1] = "Novafora Inc", +[6][0x40 - 1] = "iKoa Corporation", +[6][0x41 - 1] = "ASint Technology", +[6][0x42 - 1] = "Ramtron", +[6][0x43 - 1] = "Plato Networks Inc", +[6][0x44 - 1] = "IPtronics AS", +[6][0x45 - 1] = "Infinite-Memories", +[6][0x46 - 1] = "Parade Technologies Inc", +[6][0x47 - 1] = "Dune Networks", +[6][0x48 - 1] = "GigaDevice Semiconductor", +[6][0x49 - 1] = "Modu Ltd", +[6][0x4a - 1] = "CEITEC", +[6][0x4b - 1] = "Northrop Grumman", +[6][0x4c - 1] = "XRONET Corporation", +[6][0x4d - 1] = "Sicon Semiconductor AB", +[6][0x4e - 1] = "Atla Electronics Co Ltd", +[6][0x4f - 1] = "TOPRAM Technology", +[6][0x50 - 1] = "Silego Technology Inc", +[6][0x51 - 1] = "Kinglife", +[6][0x52 - 1] = "Ability Industries Ltd", +[6][0x53 - 1] = "Silicon Power Computer & Communications", +[6][0x54 - 1] = "Augusta Technology Inc", +[6][0x55 - 1] = "Nantronics Semiconductors", +[6][0x56 - 1] = "Hilscher Gesellschaft", +[6][0x57 - 1] = "Quixant Ltd", +[6][0x58 - 1] = "Percello Ltd", +[6][0x59 - 1] = "NextIO Inc", +[6][0x5a - 1] = "Scanimetrics Inc", +[6][0x5b - 1] = "FS-Semi Company Ltd", +[6][0x5c - 1] = "Infinera Corporation", +[6][0x5d - 1] = "SandForce Inc", +[6][0x5e - 1] = "Lexar Media", +[6][0x5f - 1] = "Teradyne Inc", +[6][0x60 - 1] = "Memory Exchange Corp", +[6][0x61 - 1] = "Suzhou Smartek Electronics", +[6][0x62 - 1] = "Avantium Corporation", +[6][0x63 - 1] = "ATP Electronics Inc", +[6][0x64 - 1] = "Valens Semiconductor Ltd", +[6][0x65 - 1] = "Agate Logic Inc", +[6][0x66 - 1] = "Netronome", +[6][0x67 - 1] = "Zenverge Inc", +[6][0x68 - 1] = "N-trig Ltd", +[6][0x69 - 1] = "SanMax Technologies Inc", +[6][0x6a - 1] = "Contour Semiconductor Inc", +[6][0x6b - 1] = "TwinMOS", +[6][0x6c - 1] = "Silicon Systems Inc", +[6][0x6d - 1] = "V-Color Technology Inc", +[6][0x6e - 1] = "Certicom Corporation", +[6][0x6f - 1] = "JSC ICC Milandr", +[6][0x70 - 1] = "PhotoFast Global Inc", +[6][0x71 - 1] = "InnoDisk Corporation", +[6][0x72 - 1] = "Muscle Power", +[6][0x73 - 1] = "Energy Micro", +[6][0x74 - 1] = "Innofidei", +[6][0x75 - 1] = "CopperGate Communications", +[6][0x76 - 1] = "Holtek Semiconductor Inc", +[6][0x77 - 1] = "Myson Century Inc", +[6][0x78 - 1] = "FIDELIX", +[6][0x79 - 1] = "Red Digital Cinema", +[6][0x7a - 1] = "Densbits Technology", +[6][0x7b - 1] = "Zempro", +[6][0x7c - 1] = "MoSys", +[6][0x7d - 1] = "Provigent", +[6][0x7e - 1] = "Triad Semiconductor Inc", +[7][0x01 - 1] = "Siklu Communication Ltd", +[7][0x02 - 1] = "A Force Manufacturing Ltd", +[7][0x03 - 1] = "Strontium", +[7][0x04 - 1] = "ALi Corp (Abilis Systems)", +[7][0x05 - 1] = "Siglead Inc", +[7][0x06 - 1] = "Ubicom Inc", +[7][0x07 - 1] = "Unifosa Corporation", +[7][0x08 - 1] = "Stretch Inc", +[7][0x09 - 1] = "Lantiq Deutschland GmbH", +[7][0x0a - 1] = "Visipro.", +[7][0x0b - 1] = "EKMemory", +[7][0x0c - 1] = "Microelectronics Institute ZTE", +[7][0x0d - 1] = "u-blox AG", +[7][0x0e - 1] = "Carry Technology Co Ltd", +[7][0x0f - 1] = "Nokia", +[7][0x10 - 1] = "King Tiger Technology", +[7][0x11 - 1] = "Sierra Wireless", +[7][0x12 - 1] = "HT Micron", +[7][0x13 - 1] = "Albatron Technology Co Ltd", +[7][0x14 - 1] = "Leica Geosystems AG", +[7][0x15 - 1] = "BroadLight", +[7][0x16 - 1] = "AEXEA", +[7][0x17 - 1] = "ClariPhy Communications Inc", +[7][0x18 - 1] = "Green Plug", +[7][0x19 - 1] = "Design Art Networks", +[7][0x1a - 1] = "Mach Xtreme Technology Ltd", +[7][0x1b - 1] = "ATO Solutions Co Ltd", +[7][0x1c - 1] = "Ramsta", +[7][0x1d - 1] = "Greenliant Systems Ltd", +[7][0x1e - 1] = "Teikon", +[7][0x1f - 1] = "Antec Hadron", +[7][0x20 - 1] = "NavCom Technology Inc", +[7][0x21 - 1] = "Shanghai Fudan Microelectronics", +[7][0x22 - 1] = "Calxeda Inc", +[7][0x23 - 1] = "JSC EDC Electronics", +[7][0x24 - 1] = "Kandit Technology Co Ltd", +[7][0x25 - 1] = "Ramos Technology", +[7][0x26 - 1] = "Goldenmars Technology", +[7][0x27 - 1] = "XeL Technology Inc", +[7][0x28 - 1] = "Newzone Corporation", +[7][0x29 - 1] = "ShenZhen MercyPower Tech", +[7][0x2a - 1] = "Nanjing Yihuo Technology", +[7][0x2b - 1] = "Nethra Imaging Inc", +[7][0x2c - 1] = "SiTel Semiconductor BV", +[7][0x2d - 1] = "SolidGear Corporation", +[7][0x2e - 1] = "Topower Computer Ind Co Ltd", +[7][0x2f - 1] = "Wilocity", +[7][0x30 - 1] = "Profichip GmbH", +[7][0x31 - 1] = "Gerad Technologies", +[7][0x32 - 1] = "Ritek Corporation", +[7][0x33 - 1] = "Gomos Technology Limited", +[7][0x34 - 1] = "Memoright Corporation", +[7][0x35 - 1] = "D-Broad Inc", +[7][0x36 - 1] = "HiSilicon Technologies", +[7][0x37 - 1] = "Syndiant Inc.", +[7][0x38 - 1] = "Enverv Inc", +[7][0x39 - 1] = "Cognex", +[7][0x3a - 1] = "Xinnova Technology Inc", +[7][0x3b - 1] = "Ultron AG", +[7][0x3c - 1] = "Concord Idea Corporation", +[7][0x3d - 1] = "AIM Corporation", +[7][0x3e - 1] = "Lifetime Memory Products", +[7][0x3f - 1] = "Ramsway", +[7][0x40 - 1] = "Recore Systems B.V.", +[7][0x41 - 1] = "Haotian Jinshibo Science Tech", +[7][0x42 - 1] = "Being Advanced Memory", +[7][0x43 - 1] = "Adesto Technologies", +[7][0x44 - 1] = "Giantec Semiconductor Inc", +[7][0x45 - 1] = "HMD Electronics AG", +[7][0x46 - 1] = "Gloway International (HK)", +[7][0x47 - 1] = "Kingcore", +[7][0x48 - 1] = "Anucell Technology Holding", +[7][0x49 - 1] = "Accord Software & Systems Pvt. Ltd", +[7][0x4a - 1] = "Active-Semi Inc", +[7][0x4b - 1] = "Denso Corporation", +[7][0x4c - 1] = "TLSI Inc", +[7][0x4d - 1] = "Qidan", +[7][0x4e - 1] = "Mustang", +[7][0x4f - 1] = "Orca Systems", +[7][0x50 - 1] = "Passif Semiconductor", +[7][0x51 - 1] = "GigaDevice Semiconductor (Beijing) Inc", +[7][0x52 - 1] = "Memphis Electronic", +[7][0x53 - 1] = "Beckhoff Automation GmbH", +[7][0x54 - 1] = "Harmony Semiconductor Corp", +[7][0x55 - 1] = "Air Computers SRL", +[7][0x56 - 1] = "TMT Memory", +[7][0x57 - 1] = "Eorex Corporation", +[7][0x58 - 1] = "Xingtera", +[7][0x59 - 1] = "Netsol", +[7][0x5a - 1] = "Bestdon Technology Co Ltd", +[7][0x5b - 1] = "Baysand Inc", +[7][0x5c - 1] = "Uroad Technology Co Ltd", +[7][0x5d - 1] = "Wilk Elektronik S.A.", +[7][0x5e - 1] = "AAI", +[7][0x5f - 1] = "Harman", +[7][0x60 - 1] = "Berg Microelectronics Inc", +[7][0x61 - 1] = "ASSIA Inc", +[7][0x62 - 1] = "Visiontek Products LLC", +[7][0x63 - 1] = "OCMEMORY", +[7][0x64 - 1] = "Welink Solution Inc", +[7][0x65 - 1] = "Shark Gaming", +[7][0x66 - 1] = "Avalanche Technology", +[7][0x67 - 1] = "R&D Center ELVEES OJSC", +[7][0x68 - 1] = "KingboMars Technology Co Ltd", +[7][0x69 - 1] = "High Bridge Solutions Industria Eletronica", +[7][0x6a - 1] = "Transcend Technology Co Ltd", +[7][0x6b - 1] = "Everspin Technologies", +[7][0x6c - 1] = "Hon-Hai Precision", +[7][0x6d - 1] = "Smart Storage Systems", +[7][0x6e - 1] = "Toumaz Group", +[7][0x6f - 1] = "Zentel Electronics Corporation", +[7][0x70 - 1] = "Panram International Corporation", +[7][0x71 - 1] = "Silicon Space Technology", +[7][0x72 - 1] = "LITE-ON IT Corporation", +[7][0x73 - 1] = "Inuitive", +[7][0x74 - 1] = "HMicro", +[7][0x75 - 1] = "BittWare Inc", +[7][0x76 - 1] = "GLOBALFOUNDRIES", +[7][0x77 - 1] = "ACPI Digital Co Ltd", +[7][0x78 - 1] = "Annapurna Labs", +[7][0x79 - 1] = "AcSiP Technology Corporation", +[7][0x7a - 1] = "Idea! Electronic Systems", +[7][0x7b - 1] = "Gowe Technology Co Ltd", +[7][0x7c - 1] = "Hermes Testing Solutions Inc", +[7][0x7d - 1] = "Positivo BGH", +[7][0x7e - 1] = "Intelligence Silicon Technology", +[8][0x01 - 1] = "3D PLUS", +[8][0x02 - 1] = "Diehl Aerospace", +[8][0x03 - 1] = "Fairchild", +[8][0x04 - 1] = "Mercury Systems", +[8][0x05 - 1] = "Sonics Inc", +[8][0x06 - 1] = "Emerson Automation Solutions", +[8][0x07 - 1] = "Shenzhen Jinge Information Co Ltd", +[8][0x08 - 1] = "SCWW", +[8][0x09 - 1] = "Silicon Motion Inc", +[8][0x0a - 1] = "Anurag", +[8][0x0b - 1] = "King Kong", +[8][0x0c - 1] = "FROM30 Co Ltd", +[8][0x0d - 1] = "Gowin Semiconductor Corp", +[8][0x0e - 1] = "Fremont Micro Devices Ltd", +[8][0x0f - 1] = "Ericsson Modems", +[8][0x10 - 1] = "Exelis", +[8][0x11 - 1] = "Satixfy Ltd", +[8][0x12 - 1] = "Galaxy Microsystems Ltd", +[8][0x13 - 1] = "Gloway International Co Ltd", +[8][0x14 - 1] = "Lab", +[8][0x15 - 1] = "Smart Energy Instruments", +[8][0x16 - 1] = "Approved Memory Corporation", +[8][0x17 - 1] = "Axell Corporation", +[8][0x18 - 1] = "Essencore Limited", +[8][0x19 - 1] = "Phytium", +[8][0x1a - 1] = "Xi'an UniIC Semiconductors Co Ltd", +[8][0x1b - 1] = "Ambiq Micro", +[8][0x1c - 1] = "eveRAM Technology Inc", +[8][0x1d - 1] = "Infomax", +[8][0x1e - 1] = "Butterfly Network Inc", +[8][0x1f - 1] = "Shenzhen City Gcai Electronics", +[8][0x20 - 1] = "Stack Devices Corporation", +[8][0x21 - 1] = "ADK Media Group", +[8][0x22 - 1] = "TSP Global Co Ltd", +[8][0x23 - 1] = "HighX", +[8][0x24 - 1] = "Shenzhen Elicks Technology", +[8][0x25 - 1] = "XinKai/Silicon Kaiser", +[8][0x26 - 1] = "Google Inc", +[8][0x27 - 1] = "Dasima International Development", +[8][0x28 - 1] = "Leahkinn Technology Limited", +[8][0x29 - 1] = "HIMA Paul Hildebrandt GmbH Co KG", +[8][0x2a - 1] = "Keysight Technologies", +[8][0x2b - 1] = "Techcomp International (Fastable)", +[8][0x2c - 1] = "Ancore Technology Corporation", +[8][0x2d - 1] = "Nuvoton", +[8][0x2e - 1] = "Korea Uhbele International Group Ltd", +[8][0x2f - 1] = "Ikegami Tsushinki Co Ltd", +[8][0x30 - 1] = "RelChip Inc", +[8][0x31 - 1] = "Baikal Electronics", +[8][0x32 - 1] = "Nemostech Inc", +[8][0x33 - 1] = "Memorysolution GmbH", +[8][0x34 - 1] = "Silicon Integrated Systems Corporation", +[8][0x35 - 1] = "Xiede", +[8][0x36 - 1] = "BRC", +[8][0x37 - 1] = "Flash Chi", +[8][0x38 - 1] = "Jone", +[8][0x39 - 1] = "GCT Semiconductor Inc", +[8][0x3a - 1] = "Hong Kong Zetta Device Technology", +[8][0x3b - 1] = "Unimemory Technology(s) Pte Ltd", +[8][0x3c - 1] = "Cuso", +[8][0x3d - 1] = "Kuso", +[8][0x3e - 1] = "Uniquify Inc", +[8][0x3f - 1] = "Skymedi Corporation", +[8][0x40 - 1] = "Core Chance Co Ltd", +[8][0x41 - 1] = "Tekism Co Ltd", +[8][0x42 - 1] = "Seagate Technology PLC", +[8][0x43 - 1] = "Hong Kong Gaia Group Co Limited", +[8][0x44 - 1] = "Gigacom Semiconductor LLC", +[8][0x45 - 1] = "V2 Technologies", +[8][0x46 - 1] = "TLi", +[8][0x47 - 1] = "Neotion", +[8][0x48 - 1] = "Lenovo", +[8][0x49 - 1] = "Shenzhen Zhongteng Electronic Corp Ltd", +[8][0x4a - 1] = "Compound Photonics", +[8][0x4b - 1] = "in2H2 inc", +[8][0x4c - 1] = "Shenzhen Pango Microsystems Co Ltd", +[8][0x4d - 1] = "Vasekey", +[8][0x4e - 1] = "Cal-Comp Industria de Semicondutores", +[8][0x4f - 1] = "Eyenix Co Ltd", +[8][0x50 - 1] = "Heoriady", +[8][0x51 - 1] = "Accelerated Memory Production Inc", +[8][0x52 - 1] = "INVECAS Inc", +[8][0x53 - 1] = "AP Memory", +[8][0x54 - 1] = "Douqi Technology", +[8][0x55 - 1] = "Etron Technology Inc", +[8][0x56 - 1] = "Indie Semiconductor", +[8][0x57 - 1] = "Socionext Inc", +[8][0x58 - 1] = "HGST", +[8][0x59 - 1] = "EVGA", +[8][0x5a - 1] = "Audience Inc", +[8][0x5b - 1] = "EpicGear", +[8][0x5c - 1] = "Vitesse Enterprise Co", +[8][0x5d - 1] = "Foxtronn International Corporation", +[8][0x5e - 1] = "Bretelon Inc", +[8][0x5f - 1] = "Graphcore", +[8][0x60 - 1] = "Eoplex Inc", +[8][0x61 - 1] = "MaxLinear Inc", +[8][0x62 - 1] = "ETA Devices", +[8][0x63 - 1] = "LOKI", +[8][0x64 - 1] = "IMS Electronics Co Ltd", +[8][0x65 - 1] = "Dosilicon Co Ltd", +[8][0x66 - 1] = "Dolphin Integration", +[8][0x67 - 1] = "Shenzhen Mic Electronics Technolog", +[8][0x68 - 1] = "Boya Microelectronics Inc", +[8][0x69 - 1] = "Geniachip (Roche)", +[8][0x6a - 1] = "Axign", +[8][0x6b - 1] = "Kingred Electronic Technology Ltd", +[8][0x6c - 1] = "Chao Yue Zhuo Computer Business Dept.", +[8][0x6d - 1] = "Guangzhou Si Nuo Electronic Technology.", +[8][0x6e - 1] = "Crocus Technology Inc", +[8][0x6f - 1] = "Creative Chips GmbH", +[8][0x70 - 1] = "GE Aviation Systems LLC.", +[8][0x71 - 1] = "Asgard", +[8][0x72 - 1] = "Good Wealth Technology Ltd", +[8][0x73 - 1] = "TriCor Technologies", +[8][0x74 - 1] = "Nova-Systems GmbH", +[8][0x75 - 1] = "JUHOR", +[8][0x76 - 1] = "Zhuhai Douke Commerce Co Ltd", +[8][0x77 - 1] = "DSL Memory", +[8][0x78 - 1] = "Anvo-Systems Dresden GmbH", +[8][0x79 - 1] = "Realtek", +[8][0x7a - 1] = "AltoBeam", +[8][0x7b - 1] = "Wave Computing", +[8][0x7c - 1] = "Beijing TrustNet Technology Co Ltd", +[8][0x7d - 1] = "Innovium Inc", +[8][0x7e - 1] = "Starsway Technology Limited", +[9][0x01 - 1] = "Weltronics Co LTD", +[9][0x02 - 1] = "VMware Inc", +[9][0x03 - 1] = "Hewlett Packard Enterprise", +[9][0x04 - 1] = "INTENSO", +[9][0x05 - 1] = "Puya Semiconductor", +[9][0x06 - 1] = "MEMORFI", +[9][0x07 - 1] = "MSC Technologies GmbH", +[9][0x08 - 1] = "Txrui", +[9][0x09 - 1] = "SiFive Inc", +[9][0x0a - 1] = "Spreadtrum Communications", +[9][0x0b - 1] = "XTX Technology Limited", +[9][0x0c - 1] = "UMAX Technology", +[9][0x0d - 1] = "Shenzhen Yong Sheng Technology", +[9][0x0e - 1] = "SNOAMOO (Shenzhen Kai Zhuo Yue)", +[9][0x0f - 1] = "Daten Tecnologia LTDA", +[9][0x10 - 1] = "Shenzhen XinRuiYan Electronics", +[9][0x11 - 1] = "Eta Compute", +[9][0x12 - 1] = "Energous", +[9][0x13 - 1] = "Raspberry Pi Trading Ltd", +[9][0x14 - 1] = "Shenzhen Chixingzhe Tech Co Ltd", +[9][0x15 - 1] = "Silicon Mobility", +[9][0x16 - 1] = "IQ-Analog Corporation", +[9][0x17 - 1] = "Uhnder Inc", +[9][0x18 - 1] = "Impinj", +[9][0x19 - 1] = "DEPO Computers", +[9][0x1a - 1] = "Nespeed Sysems", +[9][0x1b - 1] = "Yangtze Memory Technologies Co Ltd", +[9][0x1c - 1] = "MemxPro Inc", +[9][0x1d - 1] = "Tammuz Co Ltd", +[9][0x1e - 1] = "Allwinner Technology", +[9][0x1f - 1] = "Shenzhen City Futian District Qing Xuan Tong Computer Trading Firm", +[9][0x20 - 1] = "XMC", +[9][0x21 - 1] = "Teclast", +[9][0x22 - 1] = "Maxsun", +[9][0x23 - 1] = "Haiguang Integrated Circuit Design", +[9][0x24 - 1] = "RamCENTER Technology", +[9][0x25 - 1] = "Phison Electronics Corporation", +[9][0x26 - 1] = "Guizhou Huaxintong Semi-Conductor", +[9][0x27 - 1] = "Network Intelligence", +[9][0x28 - 1] = "Continental Technology (Holdings)", +[9][0x29 - 1] = "Guangzhou Huayan Suning Electronic", +[9][0x2a - 1] = "Guangzhou Zhouji Electronic Co Ltd", +[9][0x2b - 1] = "Shenzhen Giant Hui Kang Tech Co Ltd", +[9][0x2c - 1] = "Shenzhen Yilong Innovative Co Ltd", +[9][0x2d - 1] = "Neo Forza", +[9][0x2e - 1] = "Lyontek Inc", +[9][0x2f - 1] = "Shanghai Kuxin Microelectronics Ltd", +[9][0x30 - 1] = "Shenzhen Larix Technology Co Ltd", +[9][0x31 - 1] = "Qbit Semiconductor Ltd", +[9][0x32 - 1] = "Insignis Technology Corporation", +[9][0x33 - 1] = "Lanson Memory Co Ltd", +[9][0x34 - 1] = "Shenzhen Superway Electronics Co Ltd", +[9][0x35 - 1] = "Canaan-Creative Co Ltd", +[9][0x36 - 1] = "Black Diamond Memory", +[9][0x37 - 1] = "Shenzhen City Parker Baking Electronics", +[9][0x38 - 1] = "Shenzhen Baihong Technology Co Ltd", +[9][0x39 - 1] = "GEO Semiconductors", +[9][0x3a - 1] = "OCPC", +[9][0x3b - 1] = "Artery Technology Co Ltd", +[9][0x3c - 1] = "Jinyu", +[9][0x3d - 1] = "ShenzhenYing Chi Technology Development", +[9][0x3e - 1] = "Shenzhen Pengcheng Xin Technology", +[9][0x3f - 1] = "Pegasus Semiconductor (Shanghai) Co", +[9][0x40 - 1] = "Mythic Inc", +[9][0x41 - 1] = "Elmos Semiconductor AG", +[9][0x42 - 1] = "Kllisre", +[9][0x43 - 1] = "Shenzhen Winconway Technology", +[9][0x44 - 1] = "Shenzhen Xingmem Technology Corp", +[9][0x45 - 1] = "Gold Key Technology Co Ltd", +[9][0x46 - 1] = "Habana Labs Ltd", +[9][0x47 - 1] = "Hoodisk Electronics Co Ltd", +[9][0x48 - 1] = "SemsoTai (SZ) Technology Co Ltd", +[9][0x49 - 1] = "OM Nanotech Pvt. Ltd", +[9][0x4a - 1] = "Shenzhen Zhifeng Weiye Technology", +[9][0x4b - 1] = "Xinshirui (Shenzhen) Electronics Co", +[9][0x4c - 1] = "Guangzhou Zhong Hao Tian Electronic", +[9][0x4d - 1] = "Shenzhen Longsys Electronics Co Ltd", +[9][0x4e - 1] = "Deciso B.V.", +[9][0x4f - 1] = "Puya Semiconductor (Shenzhen)", +[9][0x50 - 1] = "Shenzhen Veineda Technology Co Ltd", +[9][0x51 - 1] = "Antec Memory", +[9][0x52 - 1] = "Cortus SAS", +[9][0x53 - 1] = "Dust Leopard", +[9][0x54 - 1] = "MyWo AS", +[9][0x55 - 1] = "J&A Information Inc", +[9][0x56 - 1] = "Shenzhen JIEPEI Technology Co Ltd", +[9][0x57 - 1] = "Heidelberg University", +[9][0x58 - 1] = "Flexxon PTE Ltd", +[9][0x59 - 1] = "Wiliot", +[9][0x5a - 1] = "Raysun Electronics International Ltd", +[9][0x5b - 1] = "Aquarius Production Company LLC", +[9][0x5c - 1] = "MACNICA DHW LTDA", +[9][0x5d - 1] = "Intelimem", +[9][0x5e - 1] = "Zbit Semiconductor Inc", +[9][0x5f - 1] = "Shenzhen Technology Co Ltd", +[9][0x60 - 1] = "Signalchip", +[9][0x61 - 1] = "Shenzen Recadata Storage Technology", +[9][0x62 - 1] = "Hyundai Technology", +[9][0x63 - 1] = "Shanghai Fudi Investment Development", +[9][0x64 - 1] = "Aixi Technology", +[9][0x65 - 1] = "Tecon MT", +[9][0x66 - 1] = "Onda Electric Co Ltd", +[9][0x67 - 1] = "Jinshen", +[9][0x68 - 1] = "Kimtigo Semiconductor (HK) Limited", +[9][0x69 - 1] = "IIT Madras", +[9][0x6a - 1] = "Shenshan (Shenzhen) Electronic", +[9][0x6b - 1] = "Hefei Core Storage Electronic Limited", +[9][0x6c - 1] = "Colorful Technology Ltd", +[9][0x6d - 1] = "Visenta (Xiamen) Technology Co Ltd", +[9][0x6e - 1] = "Roa Logic BV", +[9][0x6f - 1] = "NSITEXE Inc", +[9][0x70 - 1] = "Hong Kong Hyunion Electronics", +[9][0x71 - 1] = "ASK Technology Group Limited", +[9][0x72 - 1] = "GIGA-BYTE Technology Co Ltd", +[9][0x73 - 1] = "Terabyte Co Ltd", +[9][0x74 - 1] = "Hyundai Inc", +[9][0x75 - 1] = "EXCELERAM", +[9][0x76 - 1] = "PsiKick", +[9][0x77 - 1] = "Netac Technology Co Ltd", +[9][0x78 - 1] = "PCCOOLER", +[9][0x79 - 1] = "Jiangsu Huacun Electronic Technology", +[9][0x7a - 1] = "Shenzhen Micro Innovation Industry", +[9][0x7b - 1] = "Beijing Tongfang Microelectronics Co", +[9][0x7c - 1] = "XZN Storage Technology", +[9][0x7d - 1] = "ChipCraft Sp. z.o.o.", +[9][0x7e - 1] = "ALLFLASH Technology Limited", +[10][0x01 - 1] = "Foerd Technology Co Ltd", +[10][0x02 - 1] = "KingSpec", +[10][0x03 - 1] = "Codasip GmbH", +[10][0x04 - 1] = "SL Link Co Ltd", +[10][0x05 - 1] = "Shenzhen Kefu Technology Co Limited", +[10][0x06 - 1] = "Shenzhen ZST Electronics Technology", +[10][0x07 - 1] = "Kyokuto Electronic Inc", +[10][0x08 - 1] = "Warrior Technology", +[10][0x09 - 1] = "TRINAMIC Motion Control GmbH & Co", +[10][0x0a - 1] = "PixelDisplay Inc", +[10][0x0b - 1] = "Shenzhen Futian District Bo Yueda Elec", +[10][0x0c - 1] = "Richtek Power", +[10][0x0d - 1] = "Shenzhen LianTeng Electronics Co Ltd", +[10][0x0e - 1] = "AITC Memory", +[10][0x0f - 1] = "UNIC Memory Technology Co Ltd", +[10][0x10 - 1] = "Shenzhen Huafeng Science Technology", +[10][0x11 - 1] = "CXMT", +[10][0x12 - 1] = "Guangzhou Xinyi Heng Computer Trading Firm", +[10][0x13 - 1] = "SambaNova Systems", +[10][0x14 - 1] = "V-GEN", +[10][0x15 - 1] = "Jump Trading", +[10][0x16 - 1] = "Ampere Computing", +[10][0x17 - 1] = "Shenzhen Zhongshi Technology Co Ltd", +[10][0x18 - 1] = "Shenzhen Zhongtian Bozhong Technology", +[10][0x19 - 1] = "Tri-Tech International", +[10][0x1a - 1] = "Silicon Intergrated Systems Corporation", +[10][0x1b - 1] = "Shenzhen HongDingChen Information", +[10][0x1c - 1] = "Plexton Holdings Limited", +[10][0x1d - 1] = "AMS (Jiangsu Advanced Memory Semi)", +[10][0x1e - 1] = "Wuhan Jing Tian Interconnected Tech Co", +[10][0x1f - 1] = "Axia Memory Technology", +[10][0x20 - 1] = "Chipset Technology Holding Limited", +[10][0x21 - 1] = "Shenzhen Xinshida Technology Co Ltd", +[10][0x22 - 1] = "Shenzhen Chuangshifeida Technology", +[10][0x23 - 1] = "Guangzhou MiaoYuanJi Technology", +[10][0x24 - 1] = "ADVAN Inc", +[10][0x25 - 1] = "Shenzhen Qianhai Weishengda Electronic Commerce Company Ltd", +[10][0x26 - 1] = "Guangzhou Guang Xie Cheng Trading", +[10][0x27 - 1] = "StarRam International Co Ltd", +[10][0x28 - 1] = "Shen Zhen XinShenHua Tech Co Ltd", +[10][0x29 - 1] = "UltraMemory Inc", +[10][0x2a - 1] = "New Coastline Global Tech Industry Co", +[10][0x2b - 1] = "Sinker", +[10][0x2c - 1] = "Diamond", +[10][0x2d - 1] = "PUSKILL", +[10][0x2e - 1] = "Guangzhou Hao Jia Ye Technology Co", +[10][0x2f - 1] = "Ming Xin Limited", +[10][0x30 - 1] = "Barefoot Networks", +[10][0x31 - 1] = "Biwin Semiconductor (HK) Co Ltd", +[10][0x32 - 1] = "UD INFO Corporation", +[10][0x33 - 1] = "Trek Technology (S) PTE Ltd", +[10][0x34 - 1] = "Xiamen Kingblaze Technology Co Ltd", +[10][0x35 - 1] = "Shenzhen Lomica Technology Co Ltd", +[10][0x36 - 1] = "Nuclei System Technology Co Ltd", +[10][0x37 - 1] = "Wuhan Xun Zhan Electronic Technology", +[10][0x38 - 1] = "Shenzhen Ingacom Semiconductor Ltd", +[10][0x39 - 1] = "Zotac Technology Ltd", +[10][0x3a - 1] = "Foxline", +[10][0x3b - 1] = "Shenzhen Farasia Science Technology", +[10][0x3c - 1] = "Efinix Inc", +[10][0x3d - 1] = "Hua Nan San Xian Technology Co Ltd", +[10][0x3e - 1] = "Goldtech Electronics Co Ltd", +[10][0x3f - 1] = "Shanghai Han Rong Microelectronics Co", +[10][0x40 - 1] = "Shenzhen Zhongguang Yunhe Trading", +[10][0x41 - 1] = "Smart Shine(QingDao) Microelectronics", +[10][0x42 - 1] = "Thermaltake Technology Co Ltd", +[10][0x43 - 1] = "Shenzhen O'Yang Maile Technology Ltd", +[10][0x44 - 1] = "UPMEM", +[10][0x45 - 1] = "Chun Well Technology Holding Limited", +[10][0x46 - 1] = "Astera Labs Inc", +[10][0x47 - 1] = "Winconway", +[10][0x48 - 1] = "Advantech Co Ltd", +[10][0x49 - 1] = "Chengdu Fengcai Electronic Technology", +[10][0x4a - 1] = "The Boeing Company", +[10][0x4b - 1] = "Blaize Inc", +[10][0x4c - 1] = "Ramonster Technology Co Ltd", +[10][0x4d - 1] = "Wuhan Naonongmai Technology Co Ltd", +[10][0x4e - 1] = "Shenzhen Hui ShingTong Technology", +[10][0x4f - 1] = "Yourlyon", +[10][0x50 - 1] = "Fabu Technology", +[10][0x51 - 1] = "Shenzhen Yikesheng Technology Co Ltd", +[10][0x52 - 1] = "NOR-MEM", +[10][0x53 - 1] = "Cervoz Co Ltd", +[10][0x54 - 1] = "Bitmain Technologies Inc.", +[10][0x55 - 1] = "Facebook Inc", +[10][0x56 - 1] = "Shenzhen Longsys Electronics Co Ltd", +[10][0x57 - 1] = "Guangzhou Siye Electronic Technology", +[10][0x58 - 1] = "Silergy", +[10][0x59 - 1] = "Adamway", +[10][0x5a - 1] = "PZG", +[10][0x5b - 1] = "Shenzhen King Power Electronics", +[10][0x5c - 1] = "Guangzhou ZiaoFu Tranding Co Ltd", +[10][0x5d - 1] = "Shenzhen SKIHOTAR Semiconductor", +[10][0x5e - 1] = "PulseRain Technology", +[10][0x5f - 1] = "Seeker Technology Limited", +[10][0x60 - 1] = "Shenzhen OSCOO Tech Co Ltd", +[10][0x61 - 1] = "Shenzhen Yze Technology Co Ltd", +[10][0x62 - 1] = "Shenzhen Jieshuo Electronic Commerce", +[10][0x63 - 1] = "Gazda", +[10][0x64 - 1] = "Hua Wei Technology Co Ltd", +[10][0x65 - 1] = "Esperanto Technologies", +[10][0x66 - 1] = "JinSheng Electronic (Shenzhen) Co Ltd", +[10][0x67 - 1] = "Shenzhen Shi Bolunshuai Technology", +[10][0x68 - 1] = "Shanghai Rei Zuan Information Tech", +[10][0x69 - 1] = "Fraunhofer IIS", +[10][0x6a - 1] = "Kandou Bus SA", +[10][0x6b - 1] = "Acer", +[10][0x6c - 1] = "Artmem Technology Co Ltd", +[10][0x6d - 1] = "Gstar Semiconductor Co Ltd", +[10][0x6e - 1] = "ShineDisk", +[10][0x6f - 1] = "Shenzhen CHN Technology Co Ltd", +[10][0x70 - 1] = "UnionChip Semiconductor Co Ltd", +[10][0x71 - 1] = "Tanbassh", +[10][0x72 - 1] = "Shenzhen Tianyu Jieyun Intl Logistics", +[10][0x73 - 1] = "MCLogic Inc", +[10][0x74 - 1] = "Eorex Corporation", +[10][0x75 - 1] = "Arm Technology (China) Co Ltd", +[10][0x76 - 1] = "Lexar Co Limited", +[10][0x77 - 1] = "QinetiQ Group plc", +[10][0x78 - 1] = "Exascend", +[10][0x79 - 1] = "Hong Kong Hyunion Electronics Co Ltd", +[10][0x7a - 1] = "Shenzhen Banghong Electronics Co Ltd", +[10][0x7b - 1] = "MBit Wireless Inc", +[10][0x7c - 1] = "Hex Five Security Inc", +[10][0x7d - 1] = "ShenZhen Juhor Precision Tech Co Ltd", +[10][0x7e - 1] = "Shenzhen Reeinno Technology Co Ltd", +[11][0x01 - 1] = "ABIT Electronics (Shenzhen) Co Ltd", +[11][0x02 - 1] = "Semidrive", +[11][0x03 - 1] = "MyTek Electronics Corp", +[11][0x04 - 1] = "Wxilicon Technology Co Ltd", +[11][0x05 - 1] = "Shenzhen Meixin Electronics Ltd", +[11][0x06 - 1] = "Ghost Wolf", +[11][0x07 - 1] = "LiSion Technologies Inc", +[11][0x08 - 1] = "Power Active Co Ltd", +[11][0x09 - 1] = "Pioneer High Fidelity Taiwan Co. Ltd", +[11][0x0a - 1] = "LuoSilk", +[11][0x0b - 1] = "Shenzhen Chuangshifeida Technology", +[11][0x0c - 1] = "Black Sesame Technologies Inc", +[11][0x0d - 1] = "Jiangsu Xinsheng Intelligent Technology", +[11][0x0e - 1] = "MLOONG", +[11][0x0f - 1] = "Quadratica LLC", +[11][0x10 - 1] = "Anpec Electronics", +[11][0x11 - 1] = "Xi'an Morebeck Semiconductor Tech Co", +[11][0x12 - 1] = "Kingbank Technology Co Ltd", +[11][0x13 - 1] = "ITRenew Inc", +[11][0x14 - 1] = "Shenzhen Eaget Innovation Tech Ltd", +[11][0x15 - 1] = "Jazer", +[11][0x16 - 1] = "Xiamen Semiconductor Investment Group", +[11][0x17 - 1] = "Guangzhou Longdao Network Tech Co", +[11][0x18 - 1] = "Shenzhen Futian SEC Electronic Market", +[11][0x19 - 1] = "Allegro Microsystems LLC", +[11][0x1a - 1] = "Hunan RunCore Innovation Technology", +[11][0x1b - 1] = "C-Corsa Technology", +[11][0x1c - 1] = "Zhuhai Chuangfeixin Technology Co Ltd", +[11][0x1d - 1] = "Beijing InnoMem Technologies Co Ltd", +[11][0x1e - 1] = "YooTin", +[11][0x1f - 1] = "Shenzhen Pengxiong Technology Co Ltd", +[11][0x20 - 1] = "Dongguan Yingbang Commercial Trading Co", +[11][0x21 - 1] = "Shenzhen Ronisys Electronics Co Ltd", +[11][0x22 - 1] = "Hongkong Xinlan Guangke Co Ltd", +[11][0x23 - 1] = "Apex Microelectronics Co Ltd", +[11][0x24 - 1] = "Beijing Hongda Jinming Technology Co Ltd", +[11][0x25 - 1] = "Ling Rui Technology (Shenzhen) Co Ltd", +[11][0x26 - 1] = "Hongkong Hyunion Electronics Co Ltd", +[11][0x27 - 1] = "Starsystems Inc", +[11][0x28 - 1] = "Shenzhen Yingjiaxun Industrial Co Ltd", +[11][0x29 - 1] = "Dongguan Crown Code Electronic Commerce", +[11][0x2a - 1] = "Monolithic Power Systems Inc", +[11][0x2b - 1] = "WuHan SenNaiBo E-Commerce Co Ltd", +[11][0x2c - 1] = "Hangzhou Hikstorage Technology Co", +[11][0x2d - 1] = "Shenzhen Goodix Technology Co Ltd", +[11][0x2e - 1] = "Aigo Electronic Technology Co Ltd", +[11][0x2f - 1] = "Hefei Konsemi Storage Technology Co Ltd", +[11][0x30 - 1] = "Cactus Technologies Limited", +[11][0x31 - 1] = "DSIN", +[11][0x32 - 1] = "Blu Wireless Technology", +[11][0x33 - 1] = "Nanjing UCUN Technology Inc", +[11][0x34 - 1] = "Acacia Communications", +[11][0x35 - 1] = "Beijinjinshengyihe Technology Co Ltd", +[11][0x36 - 1] = "Zyzyx", +[11][0x37 - 1] = "T-HEAD Semiconductor Co Ltd", +[11][0x38 - 1] = "Shenzhen Hystou Technology Co Ltd", +[11][0x39 - 1] = "Syzexion", +[11][0x3a - 1] = "Kembona", +[11][0x3b - 1] = "Qingdao Thunderobot Technology Co Ltd", +[11][0x3c - 1] = "Morse Micro", +[11][0x3d - 1] = "Shenzhen Envida Technology Co Ltd", +[11][0x3e - 1] = "UDStore Solution Limited", +[11][0x3f - 1] = "Shunlie", +[11][0x40 - 1] = "Shenzhen Xin Hong Rui Tech Ltd", +[11][0x41 - 1] = "Shenzhen Yze Technology Co Ltd", +[11][0x42 - 1] = "Shenzhen Huang Pu He Xin Technology", +[11][0x43 - 1] = "Xiamen Pengpai Microelectronics Co Ltd", +[11][0x44 - 1] = "JISHUN", +[11][0x45 - 1] = "Shenzhen WODPOSIT Technology Co", +[11][0x46 - 1] = "Unistar", +[11][0x47 - 1] = "UNICORE Electronic (Suzhou) Co Ltd", +[11][0x48 - 1] = "Axonne Inc", +[11][0x49 - 1] = "Shenzhen SOVERECA Technology Co", +[11][0x4a - 1] = "Dire Wolf", +[11][0x4b - 1] = "Whampoa Core Technology Co Ltd", +[11][0x4c - 1] = "CSI Halbleiter GmbH", +[11][0x4d - 1] = "ONE Semiconductor", +[11][0x4e - 1] = "SimpleMachines Inc", +[11][0x4f - 1] = "Shenzhen Chengyi Qingdian Electronic", +[11][0x50 - 1] = "Shenzhen Xinlianxin Network Technology", +[11][0x51 - 1] = "Vayyar Imaging Ltd", +[11][0x52 - 1] = "Paisen Network Technology Co Ltd", +[11][0x53 - 1] = "Shenzhen Fengwensi Technology Co Ltd", +[11][0x54 - 1] = "Caplink Technology Limited", +[11][0x55 - 1] = "JJT Solution Co Ltd", +[11][0x56 - 1] = "HOSIN Global Electronics Co Ltd", +[11][0x57 - 1] = "Shenzhen KingDisk Century Technology", +[11][0x58 - 1] = "SOYO", +[11][0x59 - 1] = "DIT Technology Co Ltd", +[11][0x5a - 1] = "iFound", +[11][0x5b - 1] = "Aril Computer Company", +[11][0x5c - 1] = "ASUS", +[11][0x5d - 1] = "Shenzhen Ruiyingtong Technology Co", +[11][0x5e - 1] = "HANA Micron", +[11][0x5f - 1] = "RANSOR", +[11][0x60 - 1] = "Axiado Corporation", +[11][0x61 - 1] = "Tesla Corporation", +[11][0x62 - 1] = "Pingtouge (Shanghai) Semiconductor Co", +[11][0x63 - 1] = "S3Plus Technologies SA", +[11][0x64 - 1] = "Integrated Silicon Solution Israel Ltd", +[11][0x65 - 1] = "GreenWaves Technologies", +[11][0x66 - 1] = "NUVIA Inc", +[11][0x67 - 1] = "Guangzhou Shuvrwine Technology Co", +[11][0x68 - 1] = "Shenzhen Hangshun Chip Technology", +[11][0x69 - 1] = "Chengboliwei Electronic Business", +[11][0x6a - 1] = "Kowin Technology HK Limited", +[11][0x6b - 1] = "Euronet Technology Inc", +[11][0x6c - 1] = "SCY", +[11][0x6d - 1] = "Shenzhen Xinhongyusheng Electrical", +[11][0x6e - 1] = "PICOCOM", +[11][0x6f - 1] = "Shenzhen Toooogo Memory Technology", +[11][0x70 - 1] = "VLSI Solution", +[11][0x71 - 1] = "Costar Electronics Inc", +[11][0x72 - 1] = "Shenzhen Huatop Technology Co Ltd", +[11][0x73 - 1] = "Inspur Electronic Information Industry", +[11][0x74 - 1] = "Shenzhen Boyuan Computer Technology", +[11][0x75 - 1] = "Beijing Welldisk Electronics Co Ltd", +[11][0x76 - 1] = "Suzhou EP Semicon Co Ltd", +[11][0x77 - 1] = "Zhejiang Dahua Memory Technology", +[11][0x78 - 1] = "Virtu Financial", +[11][0x79 - 1] = "Datotek International Co Ltd", +[11][0x7a - 1] = "Telecom and Microelectronics Industries", +[11][0x7b - 1] = "Echow Technology Ltd", +[11][0x7c - 1] = "APEX-INFO", +[11][0x7d - 1] = "Yingpark", +[11][0x7e - 1] = "Shenzhen Bigway Tech Co Ltd", +[12][0x01 - 1] = "Beijing Haawking Technology Co Ltd", +[12][0x02 - 1] = "Open HW Group", +[12][0x03 - 1] = "JHICC", +[12][0x04 - 1] = "ncoder AG", +[12][0x05 - 1] = "ThinkTech Information Technology Co", +[12][0x06 - 1] = "Shenzhen Chixingzhe Technology Co Ltd", +[12][0x07 - 1] = "Biao Ram Technology Co Ltd", +[12][0x08 - 1] = "Shenzhen Kaizhuoyue Electronics Co Ltd", +[12][0x09 - 1] = "Shenzhen YC Storage Technology Co Ltd", +[12][0x0a - 1] = "Shenzhen Chixingzhe Technology Co", +[12][0x0b - 1] = "Wink Semiconductor (Shenzhen) Co Ltd", +[12][0x0c - 1] = "AISTOR", +[12][0x0d - 1] = "Palma Ceia SemiDesign", +[12][0x0e - 1] = "EM Microelectronic-Marin SA", +[12][0x0f - 1] = "Shenzhen Monarch Memory Technology", +[12][0x10 - 1] = "Reliance Memory Inc", +[12][0x11 - 1] = "Jesis", +[12][0x12 - 1] = "Espressif Systems (Shanghai) Co Ltd", +[12][0x13 - 1] = "Shenzhen Sati Smart Technology Co Ltd", +[12][0x14 - 1] = "NeuMem Co Ltd", +[12][0x15 - 1] = "Lifelong", +[12][0x16 - 1] = "Beijing Oitech Technology Co Ltd", +[12][0x17 - 1] = "Groupe LDLC", +[12][0x18 - 1] = "Semidynamics Technology Services SLU", +[12][0x19 - 1] = "swordbill", +[12][0x1a - 1] = "YIREN", +[12][0x1b - 1] = "Shenzhen Yinxiang Technology Co Ltd", +[12][0x1c - 1] = "PoweV Electronic Technology Co Ltd", +[12][0x1d - 1] = "LEORICE", +[12][0x1e - 1] = "Waymo LLC", +[12][0x1f - 1] = "Ventana Micro Systems", +[12][0x20 - 1] = "Hefei Guangxin Microelectronics Co Ltd", +[12][0x21 - 1] = "Shenzhen Sooner Industrial Co Ltd", +[12][0x22 - 1] = "Horizon Robotics", +[12][0x23 - 1] = "Tangem AG", +[12][0x24 - 1] = "FuturePath Technology (Shenzhen) Co", +[12][0x25 - 1] = "RC Module", +[12][0x26 - 1] = "Timetec International Inc", +[12][0x27 - 1] = "ICMAX Technologies Co Limited", +[12][0x28 - 1] = "Lynxi Technologies Ltd Co", +[12][0x29 - 1] = "Guangzhou Taisupanke Computer Equipment", +[12][0x2a - 1] = "Ceremorphic Inc", +[12][0x2b - 1] = "Biwin Storage Technology Co Ltd", +[12][0x2c - 1] = "Beijing ESWIN Computing Technology", +[12][0x2d - 1] = "WeForce Co Ltd", +[12][0x2e - 1] = "Shenzhen Fanxiang Information Technology", +[12][0x2f - 1] = "Unisoc", +[12][0x30 - 1] = "YingChu", +[12][0x31 - 1] = "GUANCUN", +[12][0x32 - 1] = "IPASON", +[12][0x33 - 1] = "Ayar Labs", +[12][0x34 - 1] = "Amazon", +[12][0x35 - 1] = "Shenzhen Xinxinshun Technology Co", +[12][0x36 - 1] = "Galois Inc", +[12][0x37 - 1] = "Ubilite Inc", +[12][0x38 - 1] = "Shenzhen Quanxing Technology Co Ltd", +[12][0x39 - 1] = "Group RZX Technology LTDA", +[12][0x3a - 1] = "Yottac Technology (XI'AN) Cooperation", +[12][0x3b - 1] = "Shenzhen RuiRen Technology Co Ltd", +[12][0x3c - 1] = "Group Star Technology Co Ltd", +[12][0x3d - 1] = "RWA (Hong Kong) Ltd", +[12][0x3e - 1] = "Genesys Logic Inc", +[12][0x3f - 1] = "T3 Robotics Inc.", +[12][0x40 - 1] = "Biostar Microtech International Corp", +[12][0x41 - 1] = "Shenzhen SXmicro Technology Co Ltd", +[12][0x42 - 1] = "Shanghai Yili Computer Technology Co", +[12][0x43 - 1] = "Zhixin Semicoducotor Co Ltd", +[12][0x44 - 1] = "uFound", +[12][0x45 - 1] = "Aigo Data Security Technology Co. Ltd", +[12][0x46 - 1] = ".GXore Technologies", +[12][0x47 - 1] = "Shenzhen Pradeon Intelligent Technology", +[12][0x48 - 1] = "Power LSI", +[12][0x49 - 1] = "PRIME", +[12][0x4a - 1] = "Shenzhen Juyang Innovative Technology", +[12][0x4b - 1] = "CERVO", +[12][0x4c - 1] = "SiEngine Technology Co., Ltd.", +[12][0x4d - 1] = "Beijing Unigroup Tsingteng MicroSystem", +[12][0x4e - 1] = "Brainsao GmbH", +[12][0x4f - 1] = "Credo Technology Group Ltd", +[12][0x50 - 1] = "Shanghai Biren Technology Co Ltd", +[12][0x51 - 1] = "Nucleu Semiconductor", +[12][0x52 - 1] = "Shenzhen Guangshuo Electronics Co Ltd", +[12][0x53 - 1] = "ZhongsihangTechnology Co Ltd", +[12][0x54 - 1] = "Suzhou Mainshine Electronic Co Ltd.", +[12][0x55 - 1] = "Guangzhou Riss Electronic Technology", +[12][0x56 - 1] = "Shenzhen Cloud Security Storage Co", +[12][0x57 - 1] = "ROG", +[12][0x58 - 1] = "Perceive", +[12][0x59 - 1] = "e-peas", +[12][0x5a - 1] = "Fraunhofer IPMS", +[12][0x5b - 1] = "Shenzhen Daxinlang Electronic Tech Co", +[12][0x5c - 1] = "Abacus Peripherals Private Limited", +[12][0x5d - 1] = "OLOy Technology", +[12][0x5e - 1] = "Wuhan P&S Semiconductor Co Ltd", +[12][0x5f - 1] = "Sitrus Technology", +[12][0x60 - 1] = "AnHui Conner Storage Co Ltd", +[12][0x61 - 1] = "Rochester Electronics", +[12][0x62 - 1] = "Wuxi Petabyte Technologies Co Ltd", +[12][0x63 - 1] = "Star Memory", +[12][0x64 - 1] = "Agile Memory Technology Co Ltd", +[12][0x65 - 1] = "MEJEC", +[12][0x66 - 1] = "Rockchip Electronics Co Ltd", +[12][0x67 - 1] = "Dongguan Guanma e-commerce Co Ltd", +[12][0x68 - 1] = "Rayson Hi-Tech (SZ) Limited", +[12][0x69 - 1] = "MINRES Technologies GmbH", +[12][0x6a - 1] = "Himax Technologies Inc", +[12][0x6b - 1] = "Shenzhen Cwinner Technology Co Ltd", +[12][0x6c - 1] = "Tecmiyo", +[12][0x6d - 1] = "Shenzhen Suhuicun Technology Co Ltd", +[12][0x6e - 1] = "Vickter Electronics Co. Ltd.", +[12][0x6f - 1] = "lowRISC", +[12][0x70 - 1] = "EXEGate FZE", +[12][0x71 - 1] = "Shenzhen 9 Chapter Technologies Co", +[12][0x72 - 1] = "Addlink", +[12][0x73 - 1] = "Starsway", +[12][0x74 - 1] = "Pensando Systems Inc.", +[12][0x75 - 1] = "AirDisk", +[12][0x76 - 1] = "Shenzhen Speedmobile Technology Co", +[12][0x77 - 1] = "PEZY Computing", +[12][0x78 - 1] = "Extreme Engineering Solutions Inc", +[12][0x79 - 1] = "Shangxin Technology Co Ltd", +[12][0x7a - 1] = "Shanghai Zhaoxin Semiconductor Co", +[12][0x7b - 1] = "Xsight Labs Ltd", +[12][0x7c - 1] = "Hangzhou Hikstorage Technology Co", +[12][0x7d - 1] = "Dell Technologies", +[12][0x7e - 1] = "Guangdong StarFive Technology Co", +[13][0x01 - 1] = "TECOTON", +[13][0x02 - 1] = "Abko Co Ltd", +[13][0x03 - 1] = "Shenzhen Feisrike Technology Co Ltd", +[13][0x04 - 1] = "Shenzhen Sunhome Electronics Co Ltd", +[13][0x05 - 1] = "Global Mixed-mode Technology Inc", +[13][0x06 - 1] = "Shenzhen Weien Electronics Co. Ltd.", +[13][0x07 - 1] = "Shenzhen Cooyes Technology Co Ltd", +[13][0x08 - 1] = "Keymos Electronics Co., Limited", +[13][0x09 - 1] = "E-Rockic Technology Company Limited", +[13][0x0a - 1] = "Aerospace Science Memory Shenzhen", +[13][0x0b - 1] = "Shenzhen Quanji Technology Co Ltd", +[13][0x0c - 1] = "Dukosi", +[13][0x0d - 1] = "Maxell Corporation of America", +[13][0x0e - 1] = "Shenshen Xinxintao Electronics Co Ltd", +[13][0x0f - 1] = "Zhuhai Sanxia Semiconductor Co Ltd", +[13][0x10 - 1] = "Groq Inc", +[13][0x11 - 1] = "AstraTek", +[13][0x12 - 1] = "Shenzhen Xinyuze Technology Co Ltd", +[13][0x13 - 1] = "All Bit Semiconductor", +[13][0x14 - 1] = "ACFlow", +[13][0x15 - 1] = "Shenzhen Sipeed Technology Co Ltd", +[13][0x16 - 1] = "Linzhi Hong Kong Co Limited", +[13][0x17 - 1] = "Supreme Wise Limited", +[13][0x18 - 1] = "Blue Cheetah Analog Design Inc", +[13][0x19 - 1] = "Hefei Laiku Technology Co Ltd", +[13][0x1a - 1] = "Zord", +[13][0x1b - 1] = "SBO Hearing A/S", +[13][0x1c - 1] = "Regent Sharp International Limited", +[13][0x1d - 1] = "Permanent Potential Limited", +[13][0x1e - 1] = "Creative World International Limited", +[13][0x1f - 1] = "Base Creation International Limited", +[13][0x20 - 1] = "Shenzhen Zhixin Chuanglian Technology", +[13][0x21 - 1] = "Protected Logic Corporation", +[13][0x22 - 1] = "Sabrent", +[13][0x23 - 1] = "Union Memory", +[13][0x24 - 1] = "NEUCHIPS Corporation", +[13][0x25 - 1] = "Ingenic Semiconductor Co Ltd", +[13][0x26 - 1] = "SiPearl", +[13][0x27 - 1] = "Shenzhen Actseno Information Technology", +[13][0x28 - 1] = "RIVAI Technologies (Shenzhen) Co Ltd", +[13][0x29 - 1] = "Shenzhen Sunny Technology Co Ltd", +[13][0x2a - 1] = "Cott Electronics Ltd", +[13][0x2b - 1] = "Shanghai Synsense Technologies Co Ltd", +[13][0x2c - 1] = "Shenzhen Jintang Fuming Optoelectronics", +[13][0x2d - 1] = "CloudBEAR LLC", +[13][0x2e - 1] = "Emzior, LLC", +[13][0x2f - 1] = "Ehiway Microelectronic Science Tech Co", +[13][0x30 - 1] = "UNIM Innovation Technology (Wu XI)", +[13][0x31 - 1] = "GDRAMARS", +[13][0x32 - 1] = "Meminsights Technology", +[13][0x33 - 1] = "Zhuzhou Hongda Electronics Corp Ltd", +[13][0x34 - 1] = "Luminous Computing Inc", +[13][0x35 - 1] = "PROXMEM", +[13][0x36 - 1] = "Draper Labs", +[13][0x37 - 1] = "ORICO Technologies Co. Ltd.", +[13][0x38 - 1] = "Space Exploration Technologies Corp", +[13][0x39 - 1] = "AONDEVICES Inc", +[13][0x3a - 1] = "Shenzhen Netforward Micro Electronic", +[13][0x3b - 1] = "Syntacore Ltd", +[13][0x3c - 1] = "Shenzhen Secmem Microelectronics Co", +[13][0x3d - 1] = "ONiO As", +[13][0x3e - 1] = "Shenzhen Peladn Technology Co Ltd", +[13][0x3f - 1] = "O-Cubes Shanghai Microelectronics", +[13][0x40 - 1] = "ASTC", +[13][0x41 - 1] = "UMIS", +[13][0x42 - 1] = "Paradromics", +[13][0x43 - 1] = "Sinh Micro Co Ltd", +[13][0x44 - 1] = "Metorage Semiconductor Technology Co", +[13][0x45 - 1] = "Aeva Inc", +[13][0x46 - 1] = "HongKong Hyunion Electronics Co Ltd", +[13][0x47 - 1] = "China Flash Co Ltd", +[13][0x48 - 1] = "Sunplus Technology Co Ltd", +[13][0x49 - 1] = "Idaho Scientific", +[13][0x4a - 1] = "Suzhou SF Micro Electronics Co Ltd", +[13][0x4b - 1] = "IMEX Cap AG", +[13][0x4c - 1] = "Fitipower Integrated Technology Co Ltd", +[13][0x4d - 1] = "ShenzhenWooacme Technology Co Ltd", +[13][0x4e - 1] = "KeepData Original Chips", +[13][0x4f - 1] = "Rivos Inc", +[13][0x50 - 1] = "Big Innovation Company Limited", +[13][0x51 - 1] = "Wuhan YuXin Semiconductor Co Ltd", +[13][0x52 - 1] = "United Memory Technology (Jiangsu)", +[13][0x53 - 1] = "PQShield Ltd", +[13][0x54 - 1] = "ArchiTek Corporation", +[13][0x55 - 1] = "ShenZhen AZW Technology Co Ltd", +[13][0x56 - 1] = "Hengchi Zhixin (Dongguan) Technology", +[13][0x57 - 1] = "Eggtronic Engineering Spa", +[13][0x58 - 1] = "Fusontai Technology", +[13][0x59 - 1] = "PULP Platform", +[13][0x5a - 1] = "Koitek Electronic Technology (Shenzhen) Co", +[13][0x5b - 1] = "Shenzhen Jiteng Network Technology Co", +[13][0x5c - 1] = "Aviva Links Inc", +[13][0x5d - 1] = "Trilinear Technologies Inc", +[13][0x5e - 1] = "Shenzhen Developer Microelectronics Co", +[13][0x5f - 1] = "Guangdong OPPO Mobile Telecommunication", +[13][0x60 - 1] = "Akeana", +[13][0x61 - 1] = "Lyczar", +[13][0x62 - 1] = "Shenzhen Qiji Technology Co Ltd", +[13][0x63 - 1] = "Shenzhen Shangzhaoyuan Technology", +[13][0x64 - 1] = "Han Stor", +[13][0x65 - 1] = "China Micro Semicon Co., Ltd.", +[13][0x66 - 1] = "Shenzhen Zhuqin Technology Co Ltd", +[13][0x67 - 1] = "Shanghai Ningyuan Electronic Technology", +[13][0x68 - 1] = "Auradine", +[13][0x69 - 1] = "Suzhou Yishuo Electronics Co Ltd", +[13][0x6a - 1] = "Faurecia Clarion Electronics", +[13][0x6b - 1] = "SiMa Technologies", +[13][0x6c - 1] = "CFD Sales Inc", +[13][0x6d - 1] = "Suzhou Comay Information Co Ltd", +[13][0x6e - 1] = "Yentek", +[13][0x6f - 1] = "Qorvo Inc", +[13][0x70 - 1] = "Shenzhen Youzhi Computer Technology", +[13][0x71 - 1] = "Sychw Technology (Shenzhen) Co Ltd", +[13][0x72 - 1] = "MK Founder Technology Co Ltd", +[13][0x73 - 1] = "Siliconwaves Technologies Co Ltd", +[13][0x74 - 1] = "Hongkong Hyunion Electronics Co Ltd", +[13][0x75 - 1] = "Shenzhen Xinxinzhitao Electronics Business", +[13][0x76 - 1] = "Shenzhen HenQi Electronic Commerce Co", +[13][0x77 - 1] = "Shenzhen Jingyi Technology Co Ltd", +[13][0x78 - 1] = "Xiaohua Semiconductor Co. Ltd.", +[13][0x79 - 1] = "Shenzhen Dalu Semiconductor Technology", +[13][0x7a - 1] = "Shenzhen Ninespeed Electronics Co Ltd", +[13][0x7b - 1] = "ICYC Semiconductor Co Ltd", +[13][0x7c - 1] = "Shenzhen Jaguar Microsystems Co Ltd", +[13][0x7d - 1] = "Beijing EC-Founder Co Ltd", +[13][0x7e - 1] = "Shenzhen Taike Industrial Automation Co", +[14][0x01 - 1] = "Kalray SA", +[14][0x02 - 1] = "Shanghai Iluvatar CoreX Semiconductor Co", +[14][0x03 - 1] = "Fungible Inc", +[14][0x04 - 1] = "Song Industria E Comercio de Eletronicos", +[14][0x05 - 1] = "DreamBig Semiconductor Inc", +[14][0x06 - 1] = "ChampTek Electronics Corp", +[14][0x07 - 1] = "Fusontai Technology", +[14][0x08 - 1] = "Endress Hauser AG", +[14][0x09 - 1] = "altec ComputerSysteme GmbH", +[14][0x0a - 1] = "UltraRISC Technology (Shanghai) Co Ltd", +[14][0x0b - 1] = "Shenzhen Jing Da Kang Technology Co Ltd", +[14][0x0c - 1] = "Hangzhou Hongjun Microelectronics Co Ltd", +/* EOF */ diff --git a/applications/plugins/swd_probe/model/chip.ply b/applications/plugins/swd_probe/model/chip.ply new file mode 100644 index 000000000..7dc20abfa --- /dev/null +++ b/applications/plugins/swd_probe/model/chip.ply @@ -0,0 +1,216 @@ +ply +format ascii 1.0 +comment Created by Blender 3.3.1 - www.blender.org +element vertex 136 +property float x +property float y +property float z +element face 70 +property list uchar uint vertex_indices +end_header +1.000000 1.000000 0.152153 +-1.000000 1.000000 0.152153 +-1.000000 -1.000000 0.152153 +1.000000 -1.000000 0.152153 +1.000000 -1.000000 -0.185787 +-1.000000 -1.000000 -0.185787 +-1.000000 1.000000 -0.185787 +1.000000 1.000000 -0.185787 +-1.000043 -0.785071 -0.015780 +-1.155724 -0.785071 -0.015780 +-1.155724 -0.918718 -0.015780 +-1.000043 -0.918718 -0.015780 +-1.155724 -0.785071 0.127052 +-1.000043 -0.785071 0.127052 +-1.000043 -0.918718 0.127052 +-1.155724 -0.918718 0.127052 +-1.234192 -0.918846 -0.087021 +-1.234397 -0.785201 -0.086336 +-1.235319 -0.784943 -0.229143 +-1.235114 -0.918588 -0.229828 +-1.388133 -0.919573 -0.078673 +-1.389056 -0.919314 -0.221479 +-1.389261 -0.785669 -0.220795 +-1.388338 -0.785927 -0.077988 +-1.000043 -0.219627 -0.015780 +-1.155724 -0.219627 -0.015780 +-1.155724 -0.353273 -0.015780 +-1.000043 -0.353273 -0.015780 +-1.155724 -0.219627 0.127052 +-1.000043 -0.219627 0.127052 +-1.000043 -0.353273 0.127052 +-1.155724 -0.353273 0.127052 +-1.234192 -0.353402 -0.087021 +-1.234397 -0.219756 -0.086336 +-1.235319 -0.219498 -0.229143 +-1.235114 -0.353143 -0.229828 +-1.388133 -0.354128 -0.078673 +-1.389056 -0.353870 -0.221479 +-1.389261 -0.220224 -0.220795 +-1.388338 -0.220482 -0.077988 +-1.000043 0.345818 -0.015780 +-1.155724 0.345818 -0.015780 +-1.155724 0.212172 -0.015780 +-1.000043 0.212172 -0.015780 +-1.155724 0.345818 0.127052 +-1.000043 0.345818 0.127052 +-1.000043 0.212172 0.127052 +-1.155724 0.212172 0.127052 +-1.234192 0.212043 -0.087021 +-1.234397 0.345689 -0.086336 +-1.235319 0.345947 -0.229143 +-1.235114 0.212301 -0.229828 +-1.388133 0.211317 -0.078673 +-1.389056 0.211575 -0.221479 +-1.389261 0.345221 -0.220795 +-1.388338 0.344962 -0.077988 +-1.000043 0.911263 -0.015780 +-1.155724 0.911263 -0.015780 +-1.155724 0.777617 -0.015780 +-1.000043 0.777617 -0.015780 +-1.155724 0.911263 0.127052 +-1.000043 0.911263 0.127052 +-1.000043 0.777617 0.127052 +-1.155724 0.777617 0.127052 +-1.234192 0.777488 -0.087021 +-1.234397 0.911133 -0.086336 +-1.235319 0.911392 -0.229143 +-1.235114 0.777746 -0.229828 +-1.388133 0.776762 -0.078673 +-1.389056 0.777020 -0.221479 +-1.389261 0.910665 -0.220795 +-1.388338 0.910407 -0.077988 +1.000043 -0.785071 -0.015780 +1.000043 -0.918718 -0.015780 +1.155723 -0.918718 -0.015780 +1.155723 -0.785071 -0.015780 +1.155723 -0.785071 0.127052 +1.155723 -0.918718 0.127052 +1.000043 -0.918718 0.127052 +1.000043 -0.785071 0.127052 +1.234397 -0.785201 -0.086336 +1.234192 -0.918846 -0.087021 +1.235114 -0.918588 -0.229828 +1.235319 -0.784943 -0.229143 +1.388133 -0.919573 -0.078673 +1.388338 -0.785927 -0.077988 +1.389260 -0.785669 -0.220795 +1.389056 -0.919314 -0.221479 +1.000043 -0.219627 -0.015780 +1.000043 -0.353273 -0.015780 +1.155723 -0.353273 -0.015780 +1.155723 -0.219627 -0.015780 +1.155723 -0.219627 0.127052 +1.155723 -0.353273 0.127052 +1.000043 -0.353273 0.127052 +1.000043 -0.219627 0.127052 +1.234397 -0.219756 -0.086336 +1.234192 -0.353402 -0.087021 +1.235114 -0.353143 -0.229828 +1.235319 -0.219498 -0.229143 +1.388133 -0.354128 -0.078673 +1.388338 -0.220482 -0.077988 +1.389260 -0.220224 -0.220795 +1.389056 -0.353870 -0.221479 +1.000043 0.345818 -0.015780 +1.000043 0.212172 -0.015780 +1.155723 0.212172 -0.015780 +1.155723 0.345818 -0.015780 +1.155723 0.345818 0.127052 +1.155723 0.212172 0.127052 +1.000043 0.212172 0.127052 +1.000043 0.345818 0.127052 +1.234397 0.345689 -0.086336 +1.234192 0.212043 -0.087021 +1.235114 0.212301 -0.229828 +1.235319 0.345947 -0.229143 +1.388133 0.211317 -0.078673 +1.388338 0.344962 -0.077988 +1.389260 0.345221 -0.220795 +1.389056 0.211575 -0.221479 +1.000043 0.911263 -0.015780 +1.000043 0.777616 -0.015780 +1.155723 0.777616 -0.015780 +1.155723 0.911263 -0.015780 +1.155723 0.911263 0.127052 +1.155723 0.777616 0.127052 +1.000043 0.777616 0.127052 +1.000043 0.911263 0.127052 +1.234397 0.911133 -0.086336 +1.234192 0.777488 -0.087021 +1.235114 0.777746 -0.229828 +1.235319 0.911392 -0.229143 +1.388133 0.776762 -0.078673 +1.388338 0.910407 -0.077988 +1.389260 0.910665 -0.220795 +1.389056 0.777020 -0.221479 +4 0 1 2 3 +4 4 3 2 5 +4 5 2 1 6 +4 6 7 4 5 +4 7 0 3 4 +4 6 1 0 7 +4 8 9 10 11 +4 12 13 14 15 +4 13 8 11 14 +4 12 15 16 17 +4 10 9 18 19 +4 20 21 22 23 +4 17 16 20 23 +4 19 18 22 21 +4 24 25 26 27 +4 28 29 30 31 +4 29 24 27 30 +4 28 31 32 33 +4 26 25 34 35 +4 36 37 38 39 +4 33 32 36 39 +4 35 34 38 37 +4 40 41 42 43 +4 44 45 46 47 +4 45 40 43 46 +4 44 47 48 49 +4 42 41 50 51 +4 52 53 54 55 +4 49 48 52 55 +4 51 50 54 53 +4 56 57 58 59 +4 60 61 62 63 +4 61 56 59 62 +4 60 63 64 65 +4 58 57 66 67 +4 68 69 70 71 +4 65 64 68 71 +4 67 66 70 69 +4 72 73 74 75 +4 76 77 78 79 +4 79 78 73 72 +4 76 80 81 77 +4 74 82 83 75 +4 84 85 86 87 +4 80 85 84 81 +4 82 87 86 83 +4 88 89 90 91 +4 92 93 94 95 +4 95 94 89 88 +4 92 96 97 93 +4 90 98 99 91 +4 100 101 102 103 +4 96 101 100 97 +4 98 103 102 99 +4 104 105 106 107 +4 108 109 110 111 +4 111 110 105 104 +4 108 112 113 109 +4 106 114 115 107 +4 116 117 118 119 +4 112 117 116 113 +4 114 119 118 115 +4 120 121 122 123 +4 124 125 126 127 +4 127 126 121 120 +4 124 128 129 125 +4 122 130 131 123 +4 132 133 134 135 +4 128 133 132 129 +4 130 135 134 131 diff --git a/applications/plugins/swd_probe/model/convert.py b/applications/plugins/swd_probe/model/convert.py new file mode 100644 index 000000000..7c99ca215 --- /dev/null +++ b/applications/plugins/swd_probe/model/convert.py @@ -0,0 +1,39 @@ +#!/usr/bin/python + +import plyfile +import argparse + +parser = argparse.ArgumentParser(description='Convert a PLY file to C arrays.') +parser.add_argument('input_file', help='the input PLY file') +parser.add_argument('output_file', help='the output C file') +args = parser.parse_args() + +# Open the PLY file +plydata = plyfile.PlyData.read(args.input_file) + +# Extract the vertices +vertices = plydata['vertex'].data +num_vertices = len(vertices) + +with open(args.output_file, 'w') as f: + f.write('#define NUM_VERTICES %d\n' % num_vertices) + f.write('float vertexCoords[NUM_VERTICES][3] = {\n') + for i in range(num_vertices): + x, y, z = vertices[i][0], vertices[i][1], vertices[i][2] + f.write(' {%f, %f, %f},\n' % (x, y, z)) + f.write('};') + + # Extract the faces + faces = plydata['face'].data + num_faces = len(faces) + f.write('int edgeIndices[][3] = {\n') + for i in range(num_faces): + face = faces[i][0] + if len(face) == 3: + f.write(' {%d, %d, %d},\n' % (face[0], face[1], face[2])) + elif len(face) == 4: + # Convert 4-index face to 2-index edges + edges = [(face[0], face[1]), (face[1], face[2]), (face[2], face[3]), (face[3], face[0])] + for edge in edges: + f.write(' {%d, %d},\n' % (edge[0], edge[1])) + f.write('};\n') diff --git a/applications/plugins/swd_probe/model/model_chip.h b/applications/plugins/swd_probe/model/model_chip.h new file mode 100644 index 000000000..ed96105af --- /dev/null +++ b/applications/plugins/swd_probe/model/model_chip.h @@ -0,0 +1,420 @@ +#define NUM_VERTICES 136 +float vertexCoords[NUM_VERTICES][3] = { + {1.000000, 1.000000, 0.152153}, + {-1.000000, 1.000000, 0.152153}, + {-1.000000, -1.000000, 0.152153}, + {1.000000, -1.000000, 0.152153}, + {1.000000, -1.000000, -0.185787}, + {-1.000000, -1.000000, -0.185787}, + {-1.000000, 1.000000, -0.185787}, + {1.000000, 1.000000, -0.185787}, + {-1.000043, -0.785071, -0.015780}, + {-1.155724, -0.785071, -0.015780}, + {-1.155724, -0.918718, -0.015780}, + {-1.000043, -0.918718, -0.015780}, + {-1.155724, -0.785071, 0.127052}, + {-1.000043, -0.785071, 0.127052}, + {-1.000043, -0.918718, 0.127052}, + {-1.155724, -0.918718, 0.127052}, + {-1.234192, -0.918846, -0.087021}, + {-1.234397, -0.785201, -0.086336}, + {-1.235319, -0.784943, -0.229143}, + {-1.235114, -0.918588, -0.229828}, + {-1.388133, -0.919573, -0.078673}, + {-1.389056, -0.919314, -0.221479}, + {-1.389261, -0.785669, -0.220795}, + {-1.388338, -0.785927, -0.077988}, + {-1.000043, -0.219627, -0.015780}, + {-1.155724, -0.219627, -0.015780}, + {-1.155724, -0.353273, -0.015780}, + {-1.000043, -0.353273, -0.015780}, + {-1.155724, -0.219627, 0.127052}, + {-1.000043, -0.219627, 0.127052}, + {-1.000043, -0.353273, 0.127052}, + {-1.155724, -0.353273, 0.127052}, + {-1.234192, -0.353402, -0.087021}, + {-1.234397, -0.219756, -0.086336}, + {-1.235319, -0.219498, -0.229143}, + {-1.235114, -0.353143, -0.229828}, + {-1.388133, -0.354128, -0.078673}, + {-1.389056, -0.353870, -0.221479}, + {-1.389261, -0.220224, -0.220795}, + {-1.388338, -0.220482, -0.077988}, + {-1.000043, 0.345818, -0.015780}, + {-1.155724, 0.345818, -0.015780}, + {-1.155724, 0.212172, -0.015780}, + {-1.000043, 0.212172, -0.015780}, + {-1.155724, 0.345818, 0.127052}, + {-1.000043, 0.345818, 0.127052}, + {-1.000043, 0.212172, 0.127052}, + {-1.155724, 0.212172, 0.127052}, + {-1.234192, 0.212043, -0.087021}, + {-1.234397, 0.345689, -0.086336}, + {-1.235319, 0.345947, -0.229143}, + {-1.235114, 0.212301, -0.229828}, + {-1.388133, 0.211317, -0.078673}, + {-1.389056, 0.211575, -0.221479}, + {-1.389261, 0.345221, -0.220795}, + {-1.388338, 0.344962, -0.077988}, + {-1.000043, 0.911263, -0.015780}, + {-1.155724, 0.911263, -0.015780}, + {-1.155724, 0.777617, -0.015780}, + {-1.000043, 0.777617, -0.015780}, + {-1.155724, 0.911263, 0.127052}, + {-1.000043, 0.911263, 0.127052}, + {-1.000043, 0.777617, 0.127052}, + {-1.155724, 0.777617, 0.127052}, + {-1.234192, 0.777488, -0.087021}, + {-1.234397, 0.911133, -0.086336}, + {-1.235319, 0.911392, -0.229143}, + {-1.235114, 0.777746, -0.229828}, + {-1.388133, 0.776762, -0.078673}, + {-1.389056, 0.777020, -0.221479}, + {-1.389261, 0.910665, -0.220795}, + {-1.388338, 0.910407, -0.077988}, + {1.000043, -0.785071, -0.015780}, + {1.000043, -0.918718, -0.015780}, + {1.155723, -0.918718, -0.015780}, + {1.155723, -0.785071, -0.015780}, + {1.155723, -0.785071, 0.127052}, + {1.155723, -0.918718, 0.127052}, + {1.000043, -0.918718, 0.127052}, + {1.000043, -0.785071, 0.127052}, + {1.234397, -0.785201, -0.086336}, + {1.234192, -0.918846, -0.087021}, + {1.235114, -0.918588, -0.229828}, + {1.235319, -0.784943, -0.229143}, + {1.388133, -0.919573, -0.078673}, + {1.388338, -0.785927, -0.077988}, + {1.389260, -0.785669, -0.220795}, + {1.389056, -0.919314, -0.221479}, + {1.000043, -0.219627, -0.015780}, + {1.000043, -0.353273, -0.015780}, + {1.155723, -0.353273, -0.015780}, + {1.155723, -0.219627, -0.015780}, + {1.155723, -0.219627, 0.127052}, + {1.155723, -0.353273, 0.127052}, + {1.000043, -0.353273, 0.127052}, + {1.000043, -0.219627, 0.127052}, + {1.234397, -0.219756, -0.086336}, + {1.234192, -0.353402, -0.087021}, + {1.235114, -0.353143, -0.229828}, + {1.235319, -0.219498, -0.229143}, + {1.388133, -0.354128, -0.078673}, + {1.388338, -0.220482, -0.077988}, + {1.389260, -0.220224, -0.220795}, + {1.389056, -0.353870, -0.221479}, + {1.000043, 0.345818, -0.015780}, + {1.000043, 0.212172, -0.015780}, + {1.155723, 0.212172, -0.015780}, + {1.155723, 0.345818, -0.015780}, + {1.155723, 0.345818, 0.127052}, + {1.155723, 0.212172, 0.127052}, + {1.000043, 0.212172, 0.127052}, + {1.000043, 0.345818, 0.127052}, + {1.234397, 0.345689, -0.086336}, + {1.234192, 0.212043, -0.087021}, + {1.235114, 0.212301, -0.229828}, + {1.235319, 0.345947, -0.229143}, + {1.388133, 0.211317, -0.078673}, + {1.388338, 0.344962, -0.077988}, + {1.389260, 0.345221, -0.220795}, + {1.389056, 0.211575, -0.221479}, + {1.000043, 0.911263, -0.015780}, + {1.000043, 0.777616, -0.015780}, + {1.155723, 0.777616, -0.015780}, + {1.155723, 0.911263, -0.015780}, + {1.155723, 0.911263, 0.127052}, + {1.155723, 0.777616, 0.127052}, + {1.000043, 0.777616, 0.127052}, + {1.000043, 0.911263, 0.127052}, + {1.234397, 0.911133, -0.086336}, + {1.234192, 0.777488, -0.087021}, + {1.235114, 0.777746, -0.229828}, + {1.235319, 0.911392, -0.229143}, + {1.388133, 0.776762, -0.078673}, + {1.388338, 0.910407, -0.077988}, + {1.389260, 0.910665, -0.220795}, + {1.389056, 0.777020, -0.221479}, +};int edgeIndices[][3] = { + {0, 1}, + {1, 2}, + {2, 3}, + {3, 0}, + {4, 3}, + {3, 2}, + {2, 5}, + {5, 4}, + {5, 2}, + {2, 1}, + {1, 6}, + {6, 5}, + {6, 7}, + {7, 4}, + {4, 5}, + {5, 6}, + {7, 0}, + {0, 3}, + {3, 4}, + {4, 7}, + {6, 1}, + {1, 0}, + {0, 7}, + {7, 6}, + {8, 9}, + {9, 10}, + {10, 11}, + {11, 8}, + {12, 13}, + {13, 14}, + {14, 15}, + {15, 12}, + {13, 8}, + {8, 11}, + {11, 14}, + {14, 13}, + {12, 15}, + {15, 16}, + {16, 17}, + {17, 12}, + {10, 9}, + {9, 18}, + {18, 19}, + {19, 10}, + {20, 21}, + {21, 22}, + {22, 23}, + {23, 20}, + {17, 16}, + {16, 20}, + {20, 23}, + {23, 17}, + {19, 18}, + {18, 22}, + {22, 21}, + {21, 19}, + {24, 25}, + {25, 26}, + {26, 27}, + {27, 24}, + {28, 29}, + {29, 30}, + {30, 31}, + {31, 28}, + {29, 24}, + {24, 27}, + {27, 30}, + {30, 29}, + {28, 31}, + {31, 32}, + {32, 33}, + {33, 28}, + {26, 25}, + {25, 34}, + {34, 35}, + {35, 26}, + {36, 37}, + {37, 38}, + {38, 39}, + {39, 36}, + {33, 32}, + {32, 36}, + {36, 39}, + {39, 33}, + {35, 34}, + {34, 38}, + {38, 37}, + {37, 35}, + {40, 41}, + {41, 42}, + {42, 43}, + {43, 40}, + {44, 45}, + {45, 46}, + {46, 47}, + {47, 44}, + {45, 40}, + {40, 43}, + {43, 46}, + {46, 45}, + {44, 47}, + {47, 48}, + {48, 49}, + {49, 44}, + {42, 41}, + {41, 50}, + {50, 51}, + {51, 42}, + {52, 53}, + {53, 54}, + {54, 55}, + {55, 52}, + {49, 48}, + {48, 52}, + {52, 55}, + {55, 49}, + {51, 50}, + {50, 54}, + {54, 53}, + {53, 51}, + {56, 57}, + {57, 58}, + {58, 59}, + {59, 56}, + {60, 61}, + {61, 62}, + {62, 63}, + {63, 60}, + {61, 56}, + {56, 59}, + {59, 62}, + {62, 61}, + {60, 63}, + {63, 64}, + {64, 65}, + {65, 60}, + {58, 57}, + {57, 66}, + {66, 67}, + {67, 58}, + {68, 69}, + {69, 70}, + {70, 71}, + {71, 68}, + {65, 64}, + {64, 68}, + {68, 71}, + {71, 65}, + {67, 66}, + {66, 70}, + {70, 69}, + {69, 67}, + {72, 73}, + {73, 74}, + {74, 75}, + {75, 72}, + {76, 77}, + {77, 78}, + {78, 79}, + {79, 76}, + {79, 78}, + {78, 73}, + {73, 72}, + {72, 79}, + {76, 80}, + {80, 81}, + {81, 77}, + {77, 76}, + {74, 82}, + {82, 83}, + {83, 75}, + {75, 74}, + {84, 85}, + {85, 86}, + {86, 87}, + {87, 84}, + {80, 85}, + {85, 84}, + {84, 81}, + {81, 80}, + {82, 87}, + {87, 86}, + {86, 83}, + {83, 82}, + {88, 89}, + {89, 90}, + {90, 91}, + {91, 88}, + {92, 93}, + {93, 94}, + {94, 95}, + {95, 92}, + {95, 94}, + {94, 89}, + {89, 88}, + {88, 95}, + {92, 96}, + {96, 97}, + {97, 93}, + {93, 92}, + {90, 98}, + {98, 99}, + {99, 91}, + {91, 90}, + {100, 101}, + {101, 102}, + {102, 103}, + {103, 100}, + {96, 101}, + {101, 100}, + {100, 97}, + {97, 96}, + {98, 103}, + {103, 102}, + {102, 99}, + {99, 98}, + {104, 105}, + {105, 106}, + {106, 107}, + {107, 104}, + {108, 109}, + {109, 110}, + {110, 111}, + {111, 108}, + {111, 110}, + {110, 105}, + {105, 104}, + {104, 111}, + {108, 112}, + {112, 113}, + {113, 109}, + {109, 108}, + {106, 114}, + {114, 115}, + {115, 107}, + {107, 106}, + {116, 117}, + {117, 118}, + {118, 119}, + {119, 116}, + {112, 117}, + {117, 116}, + {116, 113}, + {113, 112}, + {114, 119}, + {119, 118}, + {118, 115}, + {115, 114}, + {120, 121}, + {121, 122}, + {122, 123}, + {123, 120}, + {124, 125}, + {125, 126}, + {126, 127}, + {127, 124}, + {127, 126}, + {126, 121}, + {121, 120}, + {120, 127}, + {124, 128}, + {128, 129}, + {129, 125}, + {125, 124}, + {122, 130}, + {130, 131}, + {131, 123}, + {123, 122}, + {132, 133}, + {133, 134}, + {134, 135}, + {135, 132}, + {128, 133}, + {133, 132}, + {132, 129}, + {129, 128}, + {130, 135}, + {135, 134}, + {134, 131}, + {131, 130}, +}; diff --git a/applications/plugins/swd_probe/swd_probe_app.c b/applications/plugins/swd_probe/swd_probe_app.c new file mode 100644 index 000000000..fcebd8348 --- /dev/null +++ b/applications/plugins/swd_probe/swd_probe_app.c @@ -0,0 +1,2840 @@ + + +#include "swd_probe_app.h" +#include "swd_probe_icons.h" +#include "jep106.h" +#include "adi.h" + +static void render_callback(Canvas* const canvas, void* cb_ctx); +static bool swd_message_process(AppFSM* ctx); +static uint8_t swd_transfer(AppFSM* const ctx, bool ap, bool write, uint8_t a23, uint32_t* data); +static bool swd_execute_script(AppFSM* const ctx, const char* filename); + +static const GpioPin* gpios[] = { + &gpio_ext_pc0, + &gpio_ext_pc1, + &gpio_ext_pc3, + &gpio_ext_pb2, + &gpio_ext_pb3, + &gpio_ext_pa4, + &gpio_ext_pa6, + &gpio_ext_pa7}; + +static const char* gpio_names[] = {"PC0", "PC1", "PC3", "PB2", "PB3", "PA4", "PA6", "PA7"}; + +/* bit set: clock, else data */ +static const uint8_t gpio_direction_mask[6] = + {0b10101010, 0b01010101, 0b11001100, 0b00110011, 0b11110000, 0b00001111}; + +const NotificationSequence seq_c_minor = { + &message_note_c4, + &message_delay_100, + &message_sound_off, + &message_delay_10, + + &message_note_ds4, + &message_delay_100, + &message_sound_off, + &message_delay_10, + + &message_note_g4, + &message_delay_100, + &message_sound_off, + &message_delay_10, + + &message_vibro_on, + &message_delay_50, + &message_vibro_off, + NULL, +}; + +const NotificationSequence seq_error = { + + &message_vibro_on, + &message_delay_50, + &message_vibro_off, + + &message_note_g4, + &message_delay_100, + &message_sound_off, + &message_delay_10, + + &message_note_c4, + &message_delay_500, + &message_sound_off, + &message_delay_10, + NULL, +}; + +const NotificationSequence* seq_sounds[] = {&seq_c_minor, &seq_error}; + +static bool has_multiple_bits(uint8_t x) { + return (x & (x - 1)) != 0; +} + +static uint8_t get_bit_num(uint8_t x) { + return (uint8_t)__builtin_ctz(x); +} + +static const char* gpio_name(uint8_t mask) { + if(has_multiple_bits(mask)) { + return "Pxx"; + } + uint8_t io = get_bit_num(mask); + if(io >= COUNT(gpio_names)) { + return "Pxx"; + } + + return gpio_names[io]; +} + +static void swd_configure_pins(AppFSM* const ctx, bool output) { + if(ctx->mode_page > ModePageFound && ctx->io_num_swc < 8 && ctx->io_num_swd < 8) { + furi_hal_gpio_init( + gpios[ctx->io_num_swc], GpioModeOutputPushPull, GpioPullNo, GpioSpeedVeryHigh); + if(!output) { + furi_hal_gpio_init( + gpios[ctx->io_num_swd], GpioModeInput, GpioPullUp, GpioSpeedVeryHigh); + } else { + furi_hal_gpio_init( + gpios[ctx->io_num_swd], GpioModeOutputOpenDrain, GpioPullUp, GpioSpeedVeryHigh); + } + return; + } + + for(int io = 0; io < 8; io++) { + uint8_t bitmask = 1 << io; + + /* if neither candidate for SWC nor SWD then skip */ + if(!(ctx->io_swc & bitmask) && !(ctx->io_swd & bitmask)) { + furi_hal_gpio_init(gpios[io], GpioModeInput, GpioPullUp, GpioSpeedVeryHigh); + continue; + } + + if(ctx->current_mask & bitmask) { + /* set for clock */ + furi_hal_gpio_init(gpios[io], GpioModeOutputPushPull, GpioPullNo, GpioSpeedVeryHigh); + } else { + /* set for data */ + if(!output) { + furi_hal_gpio_init(gpios[io], GpioModeInput, GpioPullUp, GpioSpeedVeryHigh); + } else { + furi_hal_gpio_init( + gpios[io], GpioModeOutputOpenDrain, GpioPullUp, GpioSpeedVeryHigh); + } + } + } +} + +static void swd_set_clock(AppFSM* const ctx, const uint8_t level) { + if(ctx->mode_page > ModePageFound && ctx->io_num_swc < 8) { + furi_hal_gpio_write(gpios[ctx->io_num_swc], level); + return; + } + + for(int io = 0; io < 8; io++) { + uint8_t bitmask = 1 << io; + + /* if no candidate for SWC then skip */ + if(!(ctx->io_swc & bitmask)) { + continue; + } + + if(ctx->current_mask & bitmask) { + furi_hal_gpio_write(gpios[io], level); + } + } +} + +static void swd_set_data(AppFSM* const ctx, const uint8_t level) { + if(ctx->mode_page > ModePageFound && ctx->io_num_swd < 8) { + furi_hal_gpio_write(gpios[ctx->io_num_swd], level); + return; + } + + for(int io = 0; io < 8; io++) { + uint8_t bitmask = 1 << io; + + /* if no candidate for SWD then skip */ + if(!(ctx->io_swd & bitmask)) { + continue; + } + + if(!(ctx->current_mask & bitmask)) { + furi_hal_gpio_write(gpios[io], level); + } + } +} + +static uint8_t swd_get_data(AppFSM* const ctx) { + if(ctx->mode_page > ModePageFound && ctx->io_num_swd < 8) { + return furi_hal_gpio_read(gpios[ctx->io_num_swd]); + } + + uint8_t bits = 0; + for(int io = 0; io < 8; io++) { + uint8_t bitmask = 1 << io; + + /* if no candidate for SWD then skip */ + if(!(ctx->io_swd & bitmask)) { + continue; + } + bits |= furi_hal_gpio_read(gpios[io]) ? bitmask : 0; + } + return bits; +} + +static void swd_clock_delay(AppFSM* const ctx) { + if(ctx->swd_clock_delay) { + furi_delay_us(ctx->swd_clock_delay); + } +} + +static void swd_write_bit(AppFSM* const ctx, bool level) { + swd_set_clock(ctx, 0); + swd_set_data(ctx, level); + swd_clock_delay(ctx); + swd_set_clock(ctx, 1); + swd_clock_delay(ctx); + swd_set_clock(ctx, 0); +} + +static uint8_t swd_read_bit(AppFSM* const ctx) { + swd_set_clock(ctx, 1); + swd_clock_delay(ctx); + swd_set_clock(ctx, 0); + uint8_t bits = swd_get_data(ctx); + swd_clock_delay(ctx); + swd_set_clock(ctx, 1); + + return bits; +} + +/* send a byte or less LSB-first */ +static void swd_write_byte(AppFSM* const ctx, const uint8_t data, size_t bits) { + for(size_t pos = 0; pos < bits; pos++) { + swd_write_bit(ctx, data & (1 << pos)); + } +} + +/* send a sequence of bytes LSB-first */ +static void swd_write(AppFSM* const ctx, const uint8_t* data, size_t bits) { + size_t byte_pos = 0; + while(bits > 0) { + size_t remain = (bits > 8) ? 8 : bits; + swd_write_byte(ctx, data[byte_pos++], remain); + bits -= remain; + } +} + +static uint8_t swd_transfer(AppFSM* const ctx, bool ap, bool write, uint8_t a23, uint32_t* data) { + //notification_message(ctx->notification, &sequence_set_blue_255); + //notification_message(ctx->notification, &sequence_reset_red); + + swd_set_data(ctx, false); + swd_configure_pins(ctx, true); + + uint32_t idle = 0; + swd_write(ctx, (uint8_t*)&idle, ctx->swd_idle_bits); + + uint8_t request[] = {0}; + + request[0] |= 0x01; /* start bit*/ + request[0] |= ap ? 0x02 : 0; /* APnDP */ + request[0] |= write ? 0 : 0x04; /* operation */ + request[0] |= (a23 & 0x01) ? 0x08 : 0; /* A[2:3] */ + request[0] |= (a23 & 0x02) ? 0x10 : 0; /* A[2:3] */ + request[0] |= 0x80; /* park bit */ + request[0] |= __builtin_parity(request[0]) ? 0x20 : 0; /* parity */ + + swd_write(ctx, request, sizeof(request) * 8); + + /* turnaround cycle */ + swd_configure_pins(ctx, false); + + uint8_t ack = 0; + + /* receive 3 ACK bits */ + for(int pos = 0; pos < 3; pos++) { + ack >>= 1; + ack |= swd_read_bit(ctx) ? 0x04 : 0; + } + + /* force ABORT/CTRL to always work */ + if(!ap && a23 == 0) { + ack = 1; + } + + if(ack != 0x01) { + //notification_message(ctx->notification, &sequence_reset_blue); + //notification_message(ctx->notification, &sequence_set_red_255); + return ack; + } + + if(write) { + swd_write_bit(ctx, 0); + swd_configure_pins(ctx, true); + + /* send 32 WDATA bits */ + for(int pos = 0; pos < 32; pos++) { + swd_write_bit(ctx, *data & (1 << pos)); + } + + /* send parity bit */ + swd_write_bit(ctx, __builtin_parity(*data)); + } else { + *data = 0; + /* receive 32 RDATA bits */ + for(int pos = 0; pos < 32; pos++) { + *data >>= 1; + *data |= swd_read_bit(ctx) ? 0x80000000 : 0; + } + + /* receive parity bit */ + bool parity = swd_read_bit(ctx); + + if(parity != __builtin_parity(*data)) { + //notification_message(ctx->notification, &sequence_reset_blue); + //notification_message(ctx->notification, &sequence_set_red_255); + return 8; + } + } + swd_set_data(ctx, false); + swd_configure_pins(ctx, true); + //notification_message(ctx->notification, &sequence_reset_blue); + + return ack; +} + +/* A line reset is achieved by holding the data signal HIGH for at least 50 clock cycles, followed by at least two idle cycles. */ +static void swd_line_reset(AppFSM* const ctx) { + //notification_message(ctx->notification, &sequence_set_red_255); + for(int bitcount = 0; bitcount < 50; bitcount += 8) { + swd_write_byte(ctx, 0xFF, 8); + } + swd_write_byte(ctx, 0, 8); + ctx->dp_regs.select_ok = false; + //notification_message(ctx->notification, &sequence_reset_red); +} + +static void swd_abort(AppFSM* const ctx) { + uint32_t dpidr; + + /* first reset the line */ + swd_line_reset(ctx); + swd_transfer(ctx, false, false, 0, &dpidr); + uint32_t abort = 0x0E; + swd_transfer(ctx, false, true, 0, &abort); +} + +static void swd_abort_simple(AppFSM* const ctx) { + uint32_t abort = 0x0E; + swd_transfer(ctx, false, true, 0, &abort); + + uint32_t dpidr; + if(swd_transfer(ctx, false, false, 0, &dpidr) != 1) { + swd_abort(ctx); + } +} + +static uint8_t swd_select(AppFSM* const ctx, uint8_t ap_sel, uint8_t ap_bank, uint8_t dp_bank) { + uint32_t bank_reg = (ap_sel << 24) | ((ap_bank & 0x0F) << 4) | (dp_bank & 0x0F); + + if(ctx->dp_regs.select_ok && bank_reg == ctx->dp_regs.select) { + return 1; + } + + uint8_t ret = swd_transfer(ctx, false, true, REG_SELECT, &bank_reg); + if(ret != 1) { + ctx->dp_regs.select_ok = false; + DBG("failed: %d", ret); + return ret; + } + + ctx->dp_regs.select = bank_reg; + ctx->dp_regs.select_ok = true; + return ret; +} + +static uint8_t + swd_read_dpbank(AppFSM* const ctx, uint8_t dp_off, uint8_t dp_bank, uint32_t* data) { + uint8_t ret = 0; + + /* select target bank */ + if(dp_bank < 0x10) { + uint8_t ret = swd_select(ctx, 0, 0, dp_bank); + if(ret != 1) { + DBGS("swd_select failed"); + return ret; + } + } + + /* read data from it */ + *data = 0; + ret = swd_transfer(ctx, false, false, dp_off, data); + if(ret != 1) { + DBG("failed: %d", ret); + return ret; + } + return ret; +} + +static uint8_t + swd_write_dpbank(AppFSM* const ctx, uint8_t dp_off, uint8_t dp_bank, uint32_t* data) { + uint8_t ret = 0; + + /* select target bank */ + if(dp_bank < 0x10) { + ret = swd_select(ctx, 0, 0, dp_bank); + if(ret != 1) { + DBGS("swd_select failed"); + return ret; + } + } + + /* write it */ + ret = swd_transfer(ctx, false, true, dp_off, data); + if(ret != 1) { + DBG("failed: %d", ret); + return ret; + } + return ret; +} + +static uint8_t swd_read_ap(AppFSM* const ctx, uint8_t ap, uint8_t ap_off, uint32_t* data) { + /* select target bank */ + uint8_t ret = swd_select(ctx, ap, (ap_off >> 4) & 0x0F, 0); + if(ret != 1) { + DBGS("swd_select failed"); + return ret; + } + ret = swd_transfer(ctx, true, false, (ap_off >> 2) & 3, data); + *data = 0; + ret = swd_transfer(ctx, true, false, (ap_off >> 2) & 3, data); + if(ret != 1) { + DBG("failed: %d", ret); + return ret; + } + return ret; +} + +static uint8_t swd_read_ap_single(AppFSM* const ctx, uint8_t ap, uint8_t ap_off, uint32_t* data) { + uint8_t ret = swd_select(ctx, ap, (ap_off >> 4) & 0x0F, 0); + if(ret != 1) { + DBGS("swd_select failed"); + return ret; + } + *data = 0; + ret = swd_transfer(ctx, true, false, (ap_off >> 2) & 3, data); + if(ret != 1) { + DBG("failed: %d", ret); + return ret; + } + return ret; +} + +static uint8_t swd_write_ap(AppFSM* const ctx, uint8_t ap, uint8_t ap_off, uint32_t data) { + uint8_t ret = swd_select(ctx, ap, (ap_off >> 4) & 0x0F, 0); + if(ret != 1) { + DBGS("swd_select failed"); + return ret; + } + ret = swd_transfer(ctx, true, true, (ap_off >> 2) & 3, &data); + if(ret != 1) { + DBG("failed: %d", ret); + return ret; + } + return ret; +} + +static uint8_t swd_write_memory(AppFSM* const ctx, uint8_t ap, uint32_t address, uint32_t data) { + uint8_t ret = 0; + uint32_t csw = 0x23000002; + + ret |= swd_write_ap(ctx, ap, MEMAP_CSW, csw); + ret |= swd_write_ap(ctx, ap, MEMAP_TAR, address); + ret |= swd_write_ap(ctx, ap, MEMAP_DRW, data); + DBG("write 0x%08lX to 0x%08lX", data, address); + + if(ret != 1) { + swd_abort(ctx); + } + return ret; +} + +uint8_t swd_read_memory(AppFSM* const ctx, uint8_t ap, uint32_t address, uint32_t* data) { + uint8_t ret = 0; + uint32_t csw = 0x23000002; + + ret |= swd_write_ap(ctx, ap, MEMAP_CSW, csw); + ret |= swd_write_ap(ctx, ap, MEMAP_TAR, address); + ret |= swd_read_ap(ctx, ap, MEMAP_DRW, data); + + if(ret != 1) { + swd_abort(ctx); + } + return ret; +} + +static uint8_t swd_read_memory_block( + AppFSM* const ctx, + uint8_t ap, + uint32_t address, + uint8_t* buf, + uint32_t len) { + uint8_t ret = 0; + uint32_t data = 0; + uint32_t csw = 0x23000012; + + ret |= swd_write_ap(ctx, ap, MEMAP_CSW, csw); + ret |= swd_write_ap(ctx, ap, MEMAP_TAR, address); + ret |= swd_read_ap_single(ctx, ap, MEMAP_DRW, &data); + + for(size_t pos = 0; pos < len; pos += 4) { + data = 0xDEADBEEF; + ret |= swd_read_ap_single(ctx, ap, MEMAP_DRW, &data); + DBG("read %lX", data); + + memcpy(&buf[pos], &data, 4); + + if(ret != 1) { + swd_abort(ctx); + return ret; + } + } + return ret; +} + +static uint32_t swd_detect(AppFSM* const ctx) { + swd_set_data(ctx, false); + swd_configure_pins(ctx, true); + + uint8_t data[] = {0xA5}; + swd_write(ctx, data, sizeof(data) * 8); + + /* turnaround cycle */ + swd_configure_pins(ctx, false); + + uint8_t ack_bits[3]; + uint8_t rdata[32]; + + /* receive 3 ACK bits */ + for(int pos = 0; pos < 3; pos++) { + ack_bits[pos] = swd_read_bit(ctx); + } + + /* receive 32 RDATA bits */ + for(int pos = 0; pos < 32; pos++) { + rdata[pos] = swd_read_bit(ctx); + } + + /* receive parity bit */ + uint8_t parity = swd_read_bit(ctx); + + for(int io = 0; io < 8; io++) { + uint8_t bitmask = 1 << io; + + /* skip if it's a clock */ + if(ctx->current_mask & bitmask) { + continue; + } + + uint8_t ack = 0; + for(int pos = 0; pos < 3; pos++) { + ack >>= 1; + ack |= (ack_bits[pos] & bitmask) ? 4 : 0; + } + + uint32_t dpidr = 0; + for(int pos = 0; pos < 32; pos++) { + dpidr >>= 1; + dpidr |= (rdata[pos] & bitmask) ? 0x80000000 : 0; + } + + if(ack == 1 && dpidr != 0 && dpidr != 0xFFFFFFFF) { + bool received_parity = (parity & bitmask); + if(__builtin_parity(dpidr) == received_parity) { + ctx->dp_regs.dpidr = dpidr; + ctx->dp_regs.dpidr_ok = true; + ctx->detected = true; + ctx->io_swd = bitmask; + ctx->io_swc &= ctx->current_mask; + LOG("swd_detect: data: %08lX, io_swd %02X, io_swc %02X", + dpidr, + ctx->io_swd, + ctx->io_swc); + + if(!has_multiple_bits(ctx->io_swc)) { + ctx->io_num_swd = get_bit_num(ctx->io_swd); + ctx->io_num_swc = get_bit_num(ctx->io_swc); + } + } + } + } + swd_set_data(ctx, false); + swd_configure_pins(ctx, true); + + return 0; +} + +static void swd_scan(AppFSM* const ctx) { + /* To switch SWJ-DP from JTAG to SWD operation: + 1. Send at least 50 SWCLKTCK cycles with SWDIOTMS HIGH. This ensures that the current interface is in its reset state. The JTAG interface only detects the 16-bit JTAG-to-SWD sequence starting from the Test-Logic-Reset state. + 2. Send the 16-bit JTAG-to-SWD select sequence 0x79e7 on SWDIOTMS. + 3. Send at least 50 SWCLKTCK cycles with SWDIOTMS HIGH. This ensures that if SWJ-DP was already in SWD operation before sending the select sequence, the SWD interface enters line reset state. + */ + swd_configure_pins(ctx, true); + + /* reset JTAG interface */ + for(int bitcount = 0; bitcount < 50; bitcount += 8) { + swd_write_byte(ctx, 0xFF, 8); + } + + /* Send the 16-bit JTAG-to-SWD select sequence */ + swd_write_byte(ctx, 0x9E, 8); + swd_write_byte(ctx, 0xE7, 8); + + /* resynchronize SWD */ + swd_line_reset(ctx); + + swd_detect(ctx); +} + +static bool swd_ensure_powerup(AppFSM* const ctx) { + bool ret = true; + + if(!(ctx->dp_regs.ctrlstat & (CSYSPWRUPREQ | CDBGPWRUPREQ))) { + DBGS("no (CSYSPWRUPREQ | CDBGPWRUPREQ)"); + + /* fetch current CTRL/STAT */ + DBGS(" - Fetch CTRL/STAT"); + ctx->dp_regs.ctrlstat_ok = + swd_read_dpbank(ctx, REG_CTRLSTAT, REG_CTRLSTAT_BANK, &ctx->dp_regs.ctrlstat) == 1; + DBG(" %08lX %s", ctx->dp_regs.ctrlstat, ctx->dp_regs.ctrlstat_ok ? "OK" : "FAIL"); + /* enable requests */ + ctx->dp_regs.ctrlstat |= (CSYSPWRUPREQ | CDBGPWRUPREQ); + + swd_write_dpbank(ctx, REG_CTRLSTAT, REG_CTRLSTAT_BANK, &ctx->dp_regs.ctrlstat); + + ret = false; + } + if(!(ctx->dp_regs.ctrlstat & CDBGPWRUPACK)) { + DBGS("no CDBGPWRUPACK"); + /* fetch current CTRL/STAT */ + swd_read_dpbank(ctx, REG_CTRLSTAT, REG_CTRLSTAT_BANK, &ctx->dp_regs.ctrlstat); + ret = false; + } + + if(!ret) { + DBGS(" - Fetch CTRL/STAT"); + ctx->dp_regs.ctrlstat_ok = + swd_read_dpbank(ctx, REG_CTRLSTAT, REG_CTRLSTAT_BANK, &ctx->dp_regs.ctrlstat) == 1; + DBG(" %08lX %s", ctx->dp_regs.ctrlstat, ctx->dp_regs.ctrlstat_ok ? "OK" : "FAIL"); + } + + return ret; +} + +static void swd_apscan_reset(AppFSM* const ctx) { + for(size_t reset_ap = 0; reset_ap < COUNT(ctx->apidr_info); reset_ap++) { + ctx->apidr_info[reset_ap].tested = false; + } +} + +static bool swd_apscan_test(AppFSM* const ctx, uint32_t ap) { + furi_assert(ctx); + furi_assert(ap < sizeof(ctx->apidr_info)); + bool ret = true; + + ctx->apidr_info[ap].tested = true; + + uint32_t data = 0; + if(swd_read_ap(ctx, ap, AP_IDR, &data) != 1) { + swd_abort(ctx); + return false; + } + if(data == 0) { + return false; + } + DBG("AP%lu detected", ap); + ctx->apidr_info[ap].ok = true; + ctx->apidr_info[ap].revision = (data >> 24) & 0x0F; + ctx->apidr_info[ap].designer = (data >> 17) & 0x3FF; + ctx->apidr_info[ap].class = (data >> 13) & 0x0F; + ctx->apidr_info[ap].variant = (data >> 4) & 0x0F; + ctx->apidr_info[ap].type = (data >> 0) & 0x0F; + + if(swd_read_ap(ctx, ap, AP_BASE, &ctx->apidr_info[ap].base) != 1) { + swd_abort(ctx); + ret = false; + } + return ret; +} + +/************************** script helpers **************************/ + +static void swd_script_log(ScriptContext* ctx, FuriLogLevel level, const char* format, ...) { + bool commandline = false; + ScriptContext* cur = ctx; + char buffer[256]; + va_list argp; + va_start(argp, format); + + do { + if(cur == ctx->app->commandline) { + commandline = true; + } + cur = cur->parent; + } while(cur); + + if(commandline) { + const char* prefix = ""; + + switch(level) { + case FuriLogLevelWarn: + prefix = "Warning: "; + break; + case FuriLogLevelError: + prefix = "ERROR: "; + break; + default: + break; + } + + strcpy(buffer, prefix); + size_t pos = strlen(buffer); + vsnprintf(&buffer[pos], sizeof(buffer) - pos - 2, format, argp); + strcat(buffer, "\n"); + usb_uart_tx_data(ctx->app->uart, (uint8_t*)buffer, strlen(buffer)); + } else { + LOG(buffer); + } + va_end(argp); +} + +/* read characters until newline was read */ +static bool swd_script_seek_newline(ScriptContext* ctx) { + while(true) { + uint8_t ch = 0; + + if(ctx->script_file) { + if(storage_file_read(ctx->script_file, &ch, 1) != 1) { + return false; + } + } else { + ch = ctx->line_data[ctx->line_pos]; + if(ch == 0) { + return false; + } + ctx->line_pos++; + } + if(ch == '\n') { + return true; + } + } +} + +/* read whitespaces until the next character is read. + returns false if EOF or newline was read */ +static bool swd_script_skip_whitespace(ScriptContext* ctx) { + while(true) { + uint8_t ch = 0; + uint64_t start_pos = 0; + + if(ctx->script_file) { + start_pos = storage_file_tell(ctx->script_file); + + if(storage_file_read(ctx->script_file, &ch, 1) != 1) { + return false; + } + } else { + start_pos = ctx->line_pos; + ch = ctx->line_data[ctx->line_pos]; + + if(ch == 0) { + return false; + } + ctx->line_pos++; + } + if(ch == '\n') { + return false; + } + if(ch != ' ') { + if(ctx->script_file) { + storage_file_seek(ctx->script_file, start_pos, true); + } else { + ctx->line_pos = start_pos; + } + return true; + } + } +} + +static bool swd_script_get_string(ScriptContext* ctx, char* str, size_t max_length) { + bool quot = false; + size_t pos = 0; + + str[pos] = '\000'; + + while(true) { + char ch = 0; + uint64_t start_pos = 0; + + if(ctx->script_file) { + start_pos = storage_file_tell(ctx->script_file); + + if(storage_file_read(ctx->script_file, &ch, 1) != 1) { + DBGS("end reached"); + return false; + } + } else { + start_pos = ctx->line_pos; + ch = ctx->line_data[ctx->line_pos]; + + if(ch == 0) { + DBGS("end reached"); + return false; + } + ctx->line_pos++; + } + + if(ch == '"') { + quot = !quot; + continue; + } + if(!quot) { + if(ch == ' ') { + break; + } + if(ch == '\r' || ch == '\n') { + if(ctx->script_file) { + storage_file_seek(ctx->script_file, start_pos, true); + } else { + ctx->line_pos = start_pos; + } + break; + } + } + if(pos + 2 > max_length) { + DBGS("too long"); + return false; + } + str[pos++] = ch; + str[pos] = '\000'; + } + DBG("got '%s'", str); + + return true; +} + +static bool swd_script_get_number(ScriptContext* ctx, uint32_t* number) { + char str[16]; + + if(!swd_script_get_string(ctx, str, sizeof(str))) { + DBGS("could not get string"); + return false; + } + DBG("got '%s'", str); + + size_t pos = 0; + *number = 0; + + /* hex number? */ + if(!strncmp(str, "0x", 2)) { + pos += 2; + while(str[pos]) { + uint8_t ch = str[pos++]; + uint8_t ch_num = ch - '0'; + uint8_t ch_hex = (ch & ~0x20) - 'A'; + + *number <<= 4; + + if(ch_num <= 10) { + *number += ch_num; + } else if(ch_hex <= 5) { + *number += 10 + ch_hex; + } else { + return false; + } + } + } else { + while(str[pos]) { + uint8_t ch = str[pos++]; + uint8_t ch_num = ch - '0'; + + *number *= 10; + + if(ch_num < 10) { + *number += ch_num; + } else { + return false; + } + } + } + + return true; +} + +static void swd_script_gui_refresh(ScriptContext* ctx) { + if(furi_message_queue_get_count(ctx->app->event_queue) > 0) { + swd_message_process(ctx->app); + } + if(!ctx->status_ignore) { + DBG("Status: %s", ctx->app->state_string); + view_port_update(ctx->app->view_port); + } +} + +/************************** script functions **************************/ + +static bool swd_scriptfunc_comment(ScriptContext* ctx) { + DBGS("comment"); + + swd_script_seek_newline(ctx); + + return true; +} + +static bool swd_scriptfunc_label(ScriptContext* ctx) { + char label[256]; + DBGS("label"); + + swd_script_skip_whitespace(ctx); + if(!swd_script_get_string(ctx, label, sizeof(label))) { + swd_script_log(ctx, FuriLogLevelError, "failed to parse label"); + return false; + } + + if(!strcmp(label, ctx->goto_label)) { + ctx->goto_active = false; + DBG("matches '%s'", ctx->goto_label); + } + + swd_script_seek_newline(ctx); + + return true; +} + +static bool swd_scriptfunc_goto(ScriptContext* ctx) { + DBGS("goto"); + + swd_script_skip_whitespace(ctx); + + if(!swd_script_get_string(ctx, ctx->goto_label, sizeof(ctx->goto_label))) { + swd_script_log(ctx, FuriLogLevelError, "failed to parse target label"); + return false; + } + + /* start from beginning and rerun starting from label */ + ctx->goto_active = true; + ctx->restart = true; + + swd_script_seek_newline(ctx); + + return true; +} + +static bool swd_scriptfunc_call(ScriptContext* ctx) { + DBGS("call"); + + swd_script_skip_whitespace(ctx); + + /* fetch previous file directory */ + char filename[MAX_FILE_LENGTH]; + strncpy(filename, ctx->filename, sizeof(filename)); + char* path = strrchr(filename, '/'); + path[1] = '\000'; + + /* append filename */ + if(!swd_script_get_string(ctx, &path[1], sizeof(filename) - strlen(path))) { + swd_script_log(ctx, FuriLogLevelError, "failed to parse filename"); + return false; + } + + swd_script_seek_newline(ctx); + + /* append extension */ + if(strlen(filename) + 5 >= sizeof(filename)) { + swd_script_log(ctx, FuriLogLevelError, "name too long"); + return false; + } + + strcat(filename, ".swd"); + + bool ret = swd_execute_script(ctx->app, filename); + + if(!ret) { + swd_script_log(ctx, FuriLogLevelError, "failed to exec '%s'", filename); + return false; + } + + return true; +} + +static bool swd_scriptfunc_status(ScriptContext* ctx) { + uint32_t status = 1; + DBGS("status"); + + swd_script_skip_whitespace(ctx); + swd_script_get_number(ctx, &status); + + ctx->status_ignore = (status == 0); + + swd_script_seek_newline(ctx); + + return true; +} + +static bool swd_scriptfunc_errors(ScriptContext* ctx) { + char type[32]; + DBGS("errors"); + + swd_script_skip_whitespace(ctx); + + if(!swd_script_get_string(ctx, type, sizeof(type))) { + swd_script_log(ctx, FuriLogLevelError, "failed to parse"); + return false; + } + + if(!strcmp(type, "ignore")) { + ctx->errors_ignore = true; + } + if(!strcmp(type, "fail")) { + ctx->errors_ignore = false; + } + swd_script_seek_newline(ctx); + + return true; +} + +static bool swd_scriptfunc_beep(ScriptContext* ctx) { + uint32_t sound = 0; + DBGS("beep"); + + swd_script_skip_whitespace(ctx); + swd_script_get_number(ctx, &sound); + + notification_message_block(ctx->app->notification, seq_sounds[sound]); + + swd_script_seek_newline(ctx); + + return true; +} + +static bool swd_scriptfunc_message(ScriptContext* ctx) { + uint32_t wait_time = 0; + char message[256]; + char type[256]; + bool success = true; + bool show_dialog = false; + + if(!swd_script_skip_whitespace(ctx)) { + swd_script_log(ctx, FuriLogLevelError, "missing whitespace"); + return false; + } + + if(!swd_script_get_number(ctx, &wait_time)) { + swd_script_log(ctx, FuriLogLevelError, "failed to parse wait_time"); + return false; + } + + if(!swd_script_get_string(ctx, message, sizeof(message))) { + swd_script_log(ctx, FuriLogLevelError, "failed to parse message"); + return false; + } + + if(swd_script_get_string(ctx, type, sizeof(type))) { + if(!strcmp(type, "dialog")) { + show_dialog = true; + } + } + + if(wait_time <= 60 * 1000) { + strncpy(ctx->app->state_string, message, sizeof(ctx->app->state_string)); + swd_script_gui_refresh(ctx); + furi_delay_ms(wait_time); + if(show_dialog) { + DialogMessage* message = dialog_message_alloc(); + dialog_message_set_header(message, "SWD Probe", 16, 2, AlignLeft, AlignTop); + dialog_message_set_icon(message, &I_app, 3, 2); + dialog_message_set_text(message, ctx->app->state_string, 3, 16, AlignLeft, AlignTop); + dialog_message_set_buttons(message, "Abort", "Ok", NULL); + success = dialog_message_show(ctx->app->dialogs, message) == DialogMessageButtonCenter; + dialog_message_free(message); + } + } + + swd_script_seek_newline(ctx); + + return success; +} + +static bool swd_scriptfunc_swd_idle_bits(ScriptContext* ctx) { + uint32_t swd_idle_bits = 0; + + if(!swd_script_skip_whitespace(ctx)) { + swd_script_log(ctx, FuriLogLevelError, "missing whitespace"); + return false; + } + + if(!swd_script_get_number(ctx, &swd_idle_bits)) { + swd_script_log(ctx, FuriLogLevelError, "failed to parse"); + return false; + } + + if(swd_idle_bits <= 32) { + ctx->app->swd_idle_bits = swd_idle_bits; + } else { + swd_script_log(ctx, FuriLogLevelError, "value must be between 1 and 32"); + } + + swd_script_seek_newline(ctx); + + return true; +} + +static bool swd_scriptfunc_swd_clock_delay(ScriptContext* ctx) { + uint32_t swd_clock_delay = 0; + + if(!swd_script_skip_whitespace(ctx)) { + swd_script_log(ctx, FuriLogLevelError, "missing whitespace"); + return false; + } + + if(!swd_script_get_number(ctx, &swd_clock_delay)) { + swd_script_log(ctx, FuriLogLevelError, "failed to parse"); + return false; + } + + if(swd_clock_delay <= 1000000) { + ctx->app->swd_clock_delay = swd_clock_delay; + } else { + swd_script_log(ctx, FuriLogLevelError, "value must be between 1 and 1000000"); + } + + swd_script_seek_newline(ctx); + + return true; +} + +static bool swd_scriptfunc_maxtries(ScriptContext* ctx) { + uint32_t max_tries = 0; + + if(!swd_script_skip_whitespace(ctx)) { + swd_script_log(ctx, FuriLogLevelError, "missing whitespace"); + return false; + } + + if(!swd_script_get_number(ctx, &max_tries)) { + swd_script_log(ctx, FuriLogLevelError, "failed to parse"); + return false; + } + + if(max_tries >= 1 && max_tries <= 1024) { + ctx->max_tries = max_tries; + } else { + DBGS("value must be between 1 and 1024"); + } + + swd_script_seek_newline(ctx); + + return true; +} + +static bool swd_scriptfunc_blocksize(ScriptContext* ctx) { + uint32_t block_size = 0; + + if(!swd_script_skip_whitespace(ctx)) { + swd_script_log(ctx, FuriLogLevelError, "missing whitespace"); + return false; + } + + if(!swd_script_get_number(ctx, &block_size)) { + swd_script_log(ctx, FuriLogLevelError, "failed to parse"); + return false; + } + + if(block_size >= 4 && block_size <= 0x1000) { + ctx->block_size = block_size; + } else { + swd_script_log(ctx, FuriLogLevelError, "value must be between 4 and 4096"); + } + + swd_script_seek_newline(ctx); + + return true; +} + +static bool swd_scriptfunc_apselect(ScriptContext* ctx) { + uint32_t ap = 0; + + if(!swd_script_skip_whitespace(ctx)) { + swd_script_log(ctx, FuriLogLevelError, "missing whitespace"); + return false; + } + + if(!swd_script_get_number(ctx, &ap)) { + swd_script_log(ctx, FuriLogLevelError, "failed to parse AP"); + return false; + } + + if(!swd_apscan_test(ctx->app, ap)) { + swd_script_log(ctx, FuriLogLevelError, "no selected AP"); + return false; + } + + ctx->selected_ap = ap; + + swd_script_seek_newline(ctx); + + return true; +} + +static bool swd_scriptfunc_apscan(ScriptContext* ctx) { + DBGS("Scanning APs"); + for(uint32_t ap = 0; ap < 255; ap++) { + snprintf(ctx->app->state_string, sizeof(ctx->app->state_string), "Scan AP %lu", ap); + swd_script_gui_refresh(ctx); + if(swd_apscan_test(ctx->app, ap)) { + DBG(" AP%lu detected", ap); + } + } + swd_script_seek_newline(ctx); + + return true; +} + +static bool swd_scriptfunc_abort(ScriptContext* ctx) { + DBGS("Aborting"); + swd_abort(ctx->app); + swd_script_seek_newline(ctx); + + return true; +} + +static bool swd_scriptfunc_mem_dump(ScriptContext* ctx) { + char filename[MAX_FILE_LENGTH]; + uint32_t address = 0; + uint32_t length = 0; + uint32_t flags = 0; + bool success = true; + + /* get file */ + if(!swd_script_skip_whitespace(ctx)) { + swd_script_log(ctx, FuriLogLevelError, "missing whitespace"); + return false; + } + + if(!swd_script_get_string(ctx, filename, sizeof(filename))) { + swd_script_log(ctx, FuriLogLevelError, "failed to parse filename"); + return false; + } + /* get address */ + if(!swd_script_get_number(ctx, &address)) { + swd_script_log(ctx, FuriLogLevelError, "failed to parse address"); + return false; + } + + /* get length */ + if(!swd_script_get_number(ctx, &length)) { + swd_script_log(ctx, FuriLogLevelError, "failed to parse length"); + return false; + } + + /* get flags */ + if(swd_script_get_number(ctx, &flags)) { + DBGS("found extra flags"); + } + + LOG("would dump %08lX, len %08lX into %s", address, length, filename); + + File* dump = storage_file_alloc(ctx->app->storage); + + if(!storage_file_open(dump, filename, FSAM_WRITE, FSOM_CREATE_ALWAYS)) { + storage_file_free(dump); + snprintf(ctx->app->state_string, sizeof(ctx->app->state_string), "Failed to create file"); + swd_script_gui_refresh(ctx); + notification_message_block(ctx->app->notification, &seq_error); + return false; + } + + if(ctx->block_size == 0) { + ctx->block_size = 0x100; + } + if(ctx->block_size > 0x1000) { + ctx->block_size = 0x1000; + } + + uint8_t* buffer = malloc(ctx->block_size); + + furi_mutex_acquire(ctx->app->swd_mutex, FuriWaitForever); + + for(uint32_t pos = 0; pos < length; pos += ctx->block_size) { + if((pos & 0xFF) == 0) { + int pct = pos * 100 / length; + snprintf( + ctx->app->state_string, + sizeof(ctx->app->state_string), + "Dump %08lX (%d%%)", + pos, + pct); + swd_script_gui_refresh(ctx); + } + + bool read_ok = false; + + for(uint32_t tries = 0; tries < ctx->max_tries; tries++) { + if(ctx->abort) { + DBGS("aborting read"); + break; + } + uint32_t ret = 0; + + if(ctx->block_size > 4) { + ret = swd_read_memory_block( + ctx->app, ctx->selected_ap, address + pos, buffer, ctx->block_size); + } else { + ret = + swd_read_memory(ctx->app, ctx->selected_ap, address + pos, (uint32_t*)buffer); + } + read_ok = (ret == 1); + + if(!read_ok) { + snprintf( + ctx->app->state_string, + sizeof(ctx->app->state_string), + "Failed at 0x%08lX", + address + pos); + swd_script_gui_refresh(ctx); + furi_delay_ms(100); + } else { + break; + } + } + if(ctx->abort) { + DBGS("aborting"); + break; + } + + if(!read_ok) { + /* flags == 1: "continue reading even if it fails" */ + /* flags == 2: "its okay if cannot dump fully" */ + if(flags & 1) { + /* set all content to a known value as indication */ + for(size_t fill_pos = 0; fill_pos < ctx->block_size; fill_pos += 4) { + *((uint32_t*)&buffer[fill_pos]) = 0xDEADFACE; + } + } else if(flags & 2) { + success = (pos > 0); + break; + } else { + notification_message_block(ctx->app->notification, &seq_error); + success = false; + break; + } + } + storage_file_write(dump, buffer, ctx->block_size); + } + + furi_mutex_release(ctx->app->swd_mutex); + + storage_file_close(dump); + swd_script_seek_newline(ctx); + free(buffer); + + return success; +} + +static bool swd_scriptfunc_mem_write(ScriptContext* ctx) { + uint32_t address = 0; + uint32_t data = 0; + bool success = true; + + /* get file */ + if(!swd_script_skip_whitespace(ctx)) { + swd_script_log(ctx, FuriLogLevelError, "missing whitespace"); + return false; + } + + /* get address */ + if(!swd_script_get_number(ctx, &address)) { + swd_script_log(ctx, FuriLogLevelError, "failed to parse address"); + return false; + } + + /* get data */ + if(!swd_script_get_number(ctx, &data)) { + swd_script_log(ctx, FuriLogLevelError, "failed to parse data"); + return false; + } + + DBG("write %08lX to %08lX", data, address); + + bool access_ok = false; + for(uint32_t tries = 0; tries < ctx->max_tries; tries++) { + if(ctx->abort) { + DBGS("aborting"); + break; + } + + furi_mutex_acquire(ctx->app->swd_mutex, FuriWaitForever); + access_ok = swd_write_memory(ctx->app, ctx->selected_ap, address, data) == 1; + furi_mutex_release(ctx->app->swd_mutex); + access_ok |= ctx->errors_ignore; + swd_read_memory(ctx->app, ctx->selected_ap, address, &data); + DBG("read %08lX from %08lX", data, address); + + if(!access_ok) { + snprintf( + ctx->app->state_string, + sizeof(ctx->app->state_string), + "Failed write 0x%08lX", + address); + swd_script_gui_refresh(ctx); + } else { + break; + } + } + + if(!access_ok) { + notification_message_block(ctx->app->notification, &seq_error); + success = false; + } + + swd_script_seek_newline(ctx); + + return success; +} + +static bool swd_scriptfunc_mem_ldmst(ScriptContext* ctx) { + uint32_t address = 0; + uint32_t data = 0; + uint32_t mask = 0; + bool success = true; + + if(!swd_script_skip_whitespace(ctx)) { + swd_script_log(ctx, FuriLogLevelError, "missing whitespace"); + return false; + } + + /* get address */ + if(!swd_script_get_number(ctx, &address)) { + swd_script_log(ctx, FuriLogLevelError, "failed to parse address"); + return false; + } + + /* get data */ + if(!swd_script_get_number(ctx, &data)) { + swd_script_log(ctx, FuriLogLevelError, "failed to parse data"); + return false; + } + + /* get mask */ + if(!swd_script_get_number(ctx, &mask)) { + swd_script_log(ctx, FuriLogLevelError, "failed to parse mask"); + return false; + } + + LOG("write %08lX to %08lX, mask %08lX", data, address, mask); + + bool access_ok = false; + uint32_t modified = 0; + for(uint32_t tries = 0; tries < ctx->max_tries; tries++) { + if(ctx->abort) { + DBGS("aborting"); + break; + } + furi_mutex_acquire(ctx->app->swd_mutex, FuriWaitForever); + + access_ok = swd_read_memory(ctx->app, ctx->selected_ap, address, &modified) == 1; + modified = (modified & mask) | data; + access_ok &= swd_write_memory(ctx->app, ctx->selected_ap, address, modified) == 1; + + furi_mutex_release(ctx->app->swd_mutex); + access_ok |= ctx->errors_ignore; + + if(!access_ok) { + snprintf( + ctx->app->state_string, + sizeof(ctx->app->state_string), + "Failed access 0x%08lX", + address); + swd_script_gui_refresh(ctx); + } else { + break; + } + } + + if(!access_ok) { + notification_message_block(ctx->app->notification, &seq_error); + success = false; + } + + swd_script_seek_newline(ctx); + + return success; +} + +static bool swd_scriptfunc_dp_write(ScriptContext* ctx) { + uint32_t dp_bank = 0; + uint32_t dp_off = 0; + uint32_t data = 0; + bool success = true; + + if(!swd_script_skip_whitespace(ctx)) { + swd_script_log(ctx, FuriLogLevelError, "missing whitespace"); + return false; + } + + /* get data */ + if(!swd_script_get_number(ctx, &data)) { + swd_script_log(ctx, FuriLogLevelError, "failed to parse data"); + return false; + } + + /* get dp_off */ + if(!swd_script_get_number(ctx, &dp_off)) { + swd_script_log(ctx, FuriLogLevelError, "failed to parse DP offset"); + return false; + } + + /* get dp_bank */ + if(!swd_script_get_number(ctx, &dp_bank)) { + dp_bank = 0xFF; + } + + swd_script_log( + ctx, FuriLogLevelDefault, "write %08lX to reg %08lX / bank %08lX", data, dp_off, dp_bank); + + furi_mutex_acquire(ctx->app->swd_mutex, FuriWaitForever); + + uint8_t ret = swd_write_dpbank(ctx->app, dp_off, dp_bank, &data); + if(ret != 1) { + swd_script_log(ctx, FuriLogLevelError, "swd_write_dpbank failed"); + success = false; + } + + furi_mutex_release(ctx->app->swd_mutex); + + swd_script_seek_newline(ctx); + + return success; +} + +static bool swd_scriptfunc_dp_read(ScriptContext* ctx) { + uint32_t dp_bank = 0; + uint32_t dp_off = 0; + uint32_t data = 0; + bool success = true; + + if(!swd_script_skip_whitespace(ctx)) { + swd_script_log(ctx, FuriLogLevelError, "missing whitespace"); + return false; + } + + /* get dp_off */ + if(!swd_script_get_number(ctx, &dp_off)) { + swd_script_log(ctx, FuriLogLevelError, "failed to parse DP offset"); + return false; + } + + /* get dp_bank */ + if(!swd_script_get_number(ctx, &dp_bank)) { + dp_bank = 0xFF; + } + + swd_script_log(ctx, FuriLogLevelDefault, "read reg %02lX / bank %02lX", dp_off, dp_bank); + + furi_mutex_acquire(ctx->app->swd_mutex, FuriWaitForever); + + uint8_t ret = swd_read_dpbank(ctx->app, dp_off, dp_bank, &data); + if(ret != 1) { + swd_script_log(ctx, FuriLogLevelError, "swd_read_dpbank failed"); + success = false; + } else { + swd_script_log(ctx, FuriLogLevelDefault, "result: 0x%08lX", data); + } + furi_mutex_release(ctx->app->swd_mutex); + + swd_script_seek_newline(ctx); + + return success; +} + +static bool swd_scriptfunc_ap_write(ScriptContext* ctx) { + uint32_t ap_reg = 0; + uint32_t data = 0; + bool success = true; + + if(!swd_script_skip_whitespace(ctx)) { + swd_script_log(ctx, FuriLogLevelError, "missing whitespace"); + return false; + } + + /* get data */ + if(!swd_script_get_number(ctx, &data)) { + swd_script_log(ctx, FuriLogLevelError, "failed to parse data"); + return false; + } + + /* get ap_reg */ + if(!swd_script_get_number(ctx, &ap_reg)) { + swd_script_log(ctx, FuriLogLevelError, "failed to parse AP register"); + return false; + } + + swd_script_log( + ctx, FuriLogLevelDefault, "AP%d %08lX -> %02lX", ctx->selected_ap, data, ap_reg); + + furi_mutex_acquire(ctx->app->swd_mutex, FuriWaitForever); + + uint8_t ret = swd_write_ap(ctx->app, ctx->selected_ap, ap_reg, data); + if(ret != 1) { + swd_script_log(ctx, FuriLogLevelError, "swd_write_ap failed"); + success = false; + } + furi_mutex_release(ctx->app->swd_mutex); + + swd_script_seek_newline(ctx); + + return success; +} + +static bool swd_scriptfunc_ap_read(ScriptContext* ctx) { + uint32_t ap_reg = 0; + uint32_t data = 0; + bool success = true; + + if(!swd_script_skip_whitespace(ctx)) { + swd_script_log(ctx, FuriLogLevelError, "missing whitespace"); + return false; + } + + /* get ap_reg */ + if(!swd_script_get_number(ctx, &ap_reg)) { + swd_script_log(ctx, FuriLogLevelError, "failed to parse AP register"); + return false; + } + + furi_mutex_acquire(ctx->app->swd_mutex, FuriWaitForever); + + uint8_t ret = swd_read_ap(ctx->app, ctx->selected_ap, ap_reg, &data); + if(ret != 1) { + swd_script_log(ctx, FuriLogLevelError, "swd_read_ap failed"); + success = false; + } else { + swd_script_log( + ctx, FuriLogLevelDefault, "AP%d %02lX: %08lX", ctx->selected_ap, ap_reg, data); + } + furi_mutex_release(ctx->app->swd_mutex); + + swd_script_seek_newline(ctx); + + return success; +} + +static const ScriptFunctionInfo script_funcs[] = { + {"#", &swd_scriptfunc_comment}, + {".label", &swd_scriptfunc_label}, + {"goto", &swd_scriptfunc_goto}, + {"call", &swd_scriptfunc_call}, + {"status", &swd_scriptfunc_status}, + {"errors", &swd_scriptfunc_errors}, + {"message", &swd_scriptfunc_message}, + {"beep", &swd_scriptfunc_beep}, + {"max_tries", &swd_scriptfunc_maxtries}, + {"swd_clock_delay", &swd_scriptfunc_swd_clock_delay}, + {"swd_idle_bits", &swd_scriptfunc_swd_idle_bits}, + {"block_size", &swd_scriptfunc_blocksize}, + {"abort", &swd_scriptfunc_abort}, + {"mem_dump", &swd_scriptfunc_mem_dump}, + {"mem_ldmst", &swd_scriptfunc_mem_ldmst}, + {"mem_write", &swd_scriptfunc_mem_write}, + {"dp_write", &swd_scriptfunc_dp_write}, + {"dp_read", &swd_scriptfunc_dp_read}, + {"ap_scan", &swd_scriptfunc_apscan}, + {"ap_select", &swd_scriptfunc_apselect}, + {"ap_read", &swd_scriptfunc_ap_read}, + {"ap_write", &swd_scriptfunc_ap_write}}; + +/************************** script main code **************************/ + +static bool swd_execute_script_line(ScriptContext* const ctx) { + char buffer[64]; + uint64_t start_pos = 0; + + if(ctx->script_file) { + start_pos = storage_file_tell(ctx->script_file); + uint16_t ret = storage_file_read(ctx->script_file, buffer, 2); + storage_file_seek(ctx->script_file, start_pos, true); + + if(ret < 2) { + return true; + } + } else { + start_pos = ctx->line_pos; + strncpy(buffer, ctx->line_data, 2); + + if(buffer[0] == 0 || buffer[1] == 0) { + return true; + } + } + + if(buffer[0] == '\n' || (buffer[0] == '\r' && buffer[1] == '\n')) { + swd_script_seek_newline(ctx); + return true; + } + + for(size_t entry = 0; entry < COUNT(script_funcs); entry++) { + if(ctx->abort) { + DBGS("aborting"); + break; + } + size_t expected = strlen(script_funcs[entry].prefix); + + if(ctx->script_file) { + storage_file_seek(ctx->script_file, start_pos, true); + + if(storage_file_read(ctx->script_file, buffer, expected) != expected) { + continue; + } + } else { + ctx->line_pos = start_pos; + + if(strlen(ctx->line_data) < expected) { + continue; + } + strncpy(buffer, ctx->line_data, expected); + ctx->line_pos += expected; + } + + buffer[expected] = '\000'; + if(strncmp(buffer, script_funcs[entry].prefix, expected)) { + continue; + } + bool success = true; + + if(ctx->goto_active) { + DBG("ignore: '%s'", script_funcs[entry].prefix); + + /* only execute label handlers */ + if(buffer[0] == '.') { + success = script_funcs[entry].func(ctx); + } else { + swd_script_seek_newline(ctx); + } + } else { + DBG("command: '%s'", script_funcs[entry].prefix); + + if(!ctx->status_ignore) { + snprintf( + ctx->app->state_string, + sizeof(ctx->app->state_string), + "CMD: %s", + script_funcs[entry].prefix); + } + swd_script_gui_refresh(ctx); + + /* function, execute */ + success = script_funcs[entry].func(ctx); + + if(!success && !ctx->errors_ignore) { + swd_script_log( + ctx, FuriLogLevelError, "Command failed: %s", script_funcs[entry].prefix); + snprintf( + ctx->app->state_string, + sizeof(ctx->app->state_string), + "Command failed: %s", + script_funcs[entry].prefix); + return false; + } + } + + return true; + } + swd_script_log(ctx, FuriLogLevelError, "unknown command '%s'", buffer); + + return false; +} + +static bool swd_execute_script(AppFSM* const ctx, const char* filename) { + bool success = true; + + /* fetch current script and set as parent */ + ScriptContext* parent = ctx->script; + + ctx->script = malloc(sizeof(ScriptContext)); + ctx->script->app = ctx; + ctx->script->max_tries = 1; + ctx->script->parent = parent; + strcpy(ctx->script->filename, filename); + + if(!storage_file_exists(ctx->storage, filename)) { + DBG("Does not exist '%s'", filename); + parent = ctx->script->parent; + free(ctx->script); + ctx->script = parent; + return false; + } + + /* first allocate a file object */ + ctx->script->script_file = storage_file_alloc(ctx->storage); + + /* then get our script opened */ + if(!storage_file_open(ctx->script->script_file, filename, FSAM_READ, FSOM_OPEN_EXISTING)) { + FURI_LOG_E(TAG, "open, %s", storage_file_get_error_desc(ctx->script->script_file)); + DBG("Failed to open '%s'", filename); + storage_file_free(ctx->script->script_file); + parent = ctx->script->parent; + free(ctx->script); + ctx->script = parent; + return false; + } + + do { + success = true; + ctx->script->restart = false; + + storage_file_seek(ctx->script->script_file, 0, true); + + uint32_t line = 1; + while(line < SCRIPT_MAX_LINES) { + if(ctx->script->abort) { + DBGS("Abort requested"); + break; + } + if(storage_file_eof(ctx->script->script_file)) { + break; + } + DBG("line %lu", line); + if(!swd_execute_script_line(ctx->script)) { + success = false; + break; + } + if(ctx->script->restart) { + break; + } + line++; + } + + if(ctx->script->restart) { + DBGS("Restarting"); + } else { + DBGS("Finished"); + } + + if(line >= SCRIPT_MAX_LINES) { + success = true; + char text_buf[128]; + + snprintf(text_buf, sizeof(text_buf), "aborting after %d lines", SCRIPT_MAX_LINES); + DialogMessage* message = dialog_message_alloc(); + dialog_message_set_header(message, "SWD Probe", 16, 2, AlignLeft, AlignTop); + dialog_message_set_icon(message, &I_app, 3, 2); + dialog_message_set_text(message, text_buf, 3, 16, AlignLeft, AlignTop); + dialog_message_set_buttons(message, "Back", NULL, NULL); + dialog_message_free(message); + + ctx->script->restart = false; + } + + if(!success) { + char text_buf[128]; + + snprintf(text_buf, sizeof(text_buf), "Line %lu failed:\n%s", line, ctx->state_string); + DialogMessage* message = dialog_message_alloc(); + dialog_message_set_header(message, "SWD Probe", 16, 2, AlignLeft, AlignTop); + dialog_message_set_icon(message, &I_app, 3, 2); + dialog_message_set_text(message, text_buf, 3, 16, AlignLeft, AlignTop); + dialog_message_set_buttons(message, "Back", "Retry", NULL); + if(dialog_message_show(ctx->dialogs, message) == DialogMessageButtonCenter) { + ctx->script->restart = true; + } + dialog_message_free(message); + } + } while(ctx->script->restart); + + storage_file_close(ctx->script->script_file); + storage_file_free(ctx->script->script_file); + + parent = ctx->script->parent; + free(ctx->script); + ctx->script = parent; + + return success; +} + +/************************** UI functions **************************/ + +#define CANVAS_WIDTH 128 +#define CANVAS_HEIGHT 64 + +#define COERCE(d, min, max) \ + do { \ + if(d < (min)) { \ + d = (min); \ + } \ + if(d > (max)) { \ + d = (max); \ + } \ + } while(0) + +#define COERCE_COORDS(x1, y1, x2, y2) \ + do { \ + COERCE(x1, 0, CANVAS_WIDTH); \ + COERCE(x2, 0, CANVAS_WIDTH); \ + COERCE(y1, 0, CANVAS_HEIGHT); \ + COERCE(y1, 0, CANVAS_HEIGHT); \ + } while(0) + +#include "model/model_chip.h" + +static int rotatedVertexCoords[NUM_VERTICES][3]; + +static void draw_model(Canvas* const canvas) { + static float xAngle = 0; + static float yAngle = 0; + static float zAngle = 0; + static float zoom = 0; + static float speed = 0.6f; + + float cosXAngle = cosf(xAngle); + float sinXAngle = sinf(xAngle); + float cosYAngle = cosf(yAngle); + float sinYAngle = sinf(yAngle); + float cosZAngle = cosf(zAngle); + float sinZAngle = sinf(zAngle); + float sinZoom = 1.2f + sinf(zoom) * 0.25f; + + int centerX = CANVAS_WIDTH / 2; + int centerY = CANVAS_HEIGHT / 2 + 5; + + for(int i = 0; i < NUM_VERTICES; i++) { + int x = vertexCoords[i][0] * sinZoom * 16; + int y = vertexCoords[i][1] * sinZoom * 16; + int z = vertexCoords[i][2] * sinZoom * 16; + + int y1 = y * cosXAngle - z * sinXAngle; + int z1 = y * sinXAngle + z * cosXAngle; + + int x2 = x * cosYAngle + z1 * sinYAngle; + int z2 = -x * sinYAngle + z1 * cosYAngle; + + int x3 = x2 * cosZAngle - y1 * sinZAngle; + int y3 = x2 * sinZAngle + y1 * cosZAngle; + + rotatedVertexCoords[i][0] = x3 + centerX; + rotatedVertexCoords[i][1] = y3 + centerY; + rotatedVertexCoords[i][2] = z2; + } + + for(size_t i = 0; i < COUNT(edgeIndices); i++) { + int v1Index = edgeIndices[i][0]; + int v2Index = edgeIndices[i][1]; + int x1 = rotatedVertexCoords[v1Index][0]; + int y1 = rotatedVertexCoords[v1Index][1]; + int x2 = rotatedVertexCoords[v2Index][0]; + int y2 = rotatedVertexCoords[v2Index][1]; + + COERCE_COORDS(x1, y1, x2, y2); + canvas_draw_line(canvas, x1, y1, x2, y2); + } + + xAngle += speed * 0.02 / sinZoom; + yAngle += speed * 0.023 / sinZoom; + zAngle += speed * 0.029 * sinZoom; + zoom += speed * 0.005; +} + +static void render_callback(Canvas* const canvas, void* ctx_in) { + furi_assert(canvas); + furi_assert(ctx_in); + + AppFSM* ctx = ctx_in; + furi_mutex_acquire(ctx->gui_mutex, FuriWaitForever); + + char buffer[64]; + int y = 10; + + canvas_draw_frame(canvas, 0, 0, 128, 64); + canvas_set_font(canvas, FontPrimary); + + if(!ctx->detected_device) { + ctx->mode_page = ModePageScan; + } else if(ctx->mode_page == ModePageScan) { + ctx->mode_page = ModePageFound; + } + + /* if seen less than a quarter second ago */ + switch(ctx->mode_page) { + case ModePageScan: { + draw_model(canvas); + + canvas_draw_str_aligned(canvas, 64, y, AlignCenter, AlignBottom, "Searching"); + y += 14; + + canvas_set_font(canvas, FontSecondary); + + bool info_page = (ctx->loop_count % 500) >= 250; + if(info_page) { + canvas_draw_str(canvas, 2, y, "Connect GND with target GND"); + y += 10; + canvas_draw_str(canvas, 2, y, "and any two GPIOs with pads"); + y += 10; + canvas_draw_str(canvas, 2, y, "you want to check for SWD"); + + canvas_set_font(canvas, FontPrimary); + canvas_draw_str(canvas, 111, 62, "2/2"); + } else { + const char* filename = ""; + if(strlen(ctx->script_detected) > 0) { + const char* slash = strrchr(ctx->script_detected, '/'); + if(slash) { + filename = &slash[1]; + } else { + filename = ctx->script_detected; + } + } + + canvas_set_font(canvas, FontSecondary); + canvas_draw_str_aligned(canvas, 64, y, AlignCenter, AlignBottom, "Autoexec Script"); + y += 10; + canvas_set_font(canvas, FontKeyboard); + canvas_draw_str_aligned(canvas, 64, y, AlignCenter, AlignBottom, filename); + y += 16; + + canvas_set_font(canvas, FontSecondary); + canvas_draw_icon(canvas, 14, y - 5, &I_ButtonUp_7x4); + canvas_draw_icon(canvas, 78, y - 5, &I_ButtonDown_7x4); + canvas_draw_str(canvas, 23, y, "Clear"); + canvas_draw_str(canvas, 87, y, "Choose"); + + canvas_set_font(canvas, FontPrimary); + canvas_draw_str(canvas, 111, 62, "1/2"); + } + canvas_set_font(canvas, FontSecondary); + elements_button_left(canvas, "Script"); + break; + } + case ModePageFound: { + if((ctx->detected_timeout + TIMER_HZ / 4) >= TIMER_HZ * TIMEOUT) { + snprintf(buffer, sizeof(buffer), "FOUND!"); + } else { + /* if it was seen more than a quarter second ago, show countdown */ + snprintf( + buffer, sizeof(buffer), "FOUND! (%lus)", (ctx->detected_timeout / TIMER_HZ) + 1); + } + canvas_draw_str_aligned(canvas, 64, y, AlignCenter, AlignBottom, buffer); + y += 10; + canvas_set_font(canvas, FontKeyboard); + + snprintf( + buffer, + sizeof(buffer), + "SWC/SWD: %s/%s", + gpio_name(ctx->io_swc), + gpio_name(ctx->io_swd)); + canvas_draw_str_aligned(canvas, 5, y, AlignLeft, AlignBottom, buffer); + y += 10; + snprintf(buffer, sizeof(buffer), "DPIDR 0x%08lX", ctx->dp_regs.dpidr); + canvas_draw_str_aligned(canvas, 5, y, AlignLeft, AlignBottom, buffer); + y += 10; + + snprintf( + buffer, + sizeof(buffer), + "Part %02X Rev %X DAPv%d", + ctx->dpidr_info.partno, + ctx->dpidr_info.revision, + ctx->dpidr_info.version); + canvas_draw_str_aligned(canvas, 5, y, AlignLeft, AlignBottom, buffer); + y += 10; + + canvas_set_font(canvas, FontSecondary); + snprintf(buffer, sizeof(buffer), "%s", jep106_manufacturer(ctx->dpidr_info.designer)); + canvas_draw_str_aligned(canvas, 5, y, AlignLeft, AlignBottom, buffer); + y += 10; + + canvas_set_font(canvas, FontSecondary); + elements_button_left(canvas, "Script"); + elements_button_right(canvas, "DP Regs"); + + break; + } + case ModePageDPRegs: { + canvas_draw_str_aligned(canvas, 64, y, AlignCenter, AlignBottom, "DP Registers"); + y += 10; + canvas_set_font(canvas, FontKeyboard); + if(ctx->dp_regs.dpidr_ok) { + snprintf(buffer, sizeof(buffer), "DPIDR %08lX", ctx->dp_regs.dpidr); + canvas_draw_str_aligned(canvas, 5, y, AlignLeft, AlignBottom, buffer); + } + y += 10; + + if(ctx->dp_regs.ctrlstat_ok) { + snprintf(buffer, sizeof(buffer), "CTRL %08lX", ctx->dp_regs.ctrlstat); + canvas_draw_str_aligned(canvas, 5, y, AlignLeft, AlignBottom, buffer); + } + y += 10; + + if(ctx->dp_regs.targetid_ok) { + snprintf(buffer, sizeof(buffer), "TGTID %08lX", ctx->dp_regs.targetid); + canvas_draw_str_aligned(canvas, 5, y, AlignLeft, AlignBottom, buffer); + } + y += 10; + + if(ctx->dp_regs.eventstat_ok) { + snprintf(buffer, sizeof(buffer), "EVTST %08lX", ctx->dp_regs.eventstat); + canvas_draw_str_aligned(canvas, 5, y, AlignLeft, AlignBottom, buffer); + } + y += 10; + canvas_set_font(canvas, FontSecondary); + elements_button_left(canvas, "Scan"); + elements_button_right(canvas, "DPID"); + + break; + } + + case ModePageDPID: { + canvas_draw_str_aligned(canvas, 64, y, AlignCenter, AlignBottom, "DP ID Register"); + y += 10; + canvas_set_font(canvas, FontKeyboard); + if(ctx->dpidr_info.version != 2) { + snprintf(buffer, sizeof(buffer), "TARGETID not supported"); + canvas_draw_str_aligned(canvas, 5, y, AlignLeft, AlignBottom, buffer); + y += 10; + } else { + if(ctx->dp_regs.targetid_ok) { + snprintf(buffer, sizeof(buffer), "TGTID %08lX", ctx->dp_regs.targetid); + canvas_draw_str_aligned(canvas, 5, y, AlignLeft, AlignBottom, buffer); + y += 10; + + snprintf(buffer, sizeof(buffer), "Part No. %04X", ctx->targetid_info.partno); + canvas_draw_str_aligned(canvas, 5, y, AlignLeft, AlignBottom, buffer); + y += 10; + snprintf( + buffer, sizeof(buffer), "%s", jep106_manufacturer(ctx->targetid_info.designer)); + canvas_draw_str_aligned(canvas, 5, y, AlignLeft, AlignBottom, buffer); + y += 10; + } + } + canvas_set_font(canvas, FontSecondary); + elements_button_left(canvas, "DP Regs"); + elements_button_right(canvas, "APs"); + break; + } + + case ModePageAPID: { + canvas_draw_str_aligned(canvas, 64, y, AlignCenter, AlignBottom, "AP Menu"); + y += 10; + canvas_set_font(canvas, FontKeyboard); + + char state = ' '; + if(ctx->ap_pos >= ctx->ap_scanned && ctx->ap_pos <= ctx->ap_scanned + 10) { + state = '*'; + } + + if(!ctx->apidr_info[ctx->ap_pos].ok) { + snprintf(buffer, sizeof(buffer), "[%d]%c", ctx->ap_pos, state); + canvas_draw_str_aligned(canvas, 5, y, AlignLeft, AlignBottom, buffer); + y += 10; + + if(ctx->ap_pos == 0) { + for(size_t pos = 0; pos < COUNT(ctx->apidr_info); pos++) { + if(ctx->apidr_info[pos].ok) { + ctx->ap_pos = pos; + } + } + } + } else { + const char* class = ""; + + switch(ctx->apidr_info[ctx->ap_pos].class) { + case 0: + class = "und"; + break; + case 1: + class = "COM"; + break; + case 8: + class = "MEM"; + break; + default: + class = "unk"; + break; + } + + const char* types[] = { + "COM-AP", + "AHB3", + "APB2 or APB3", + "Type unknown", + "AXI3 or AXI4", + "AHB5", + "APB4 and APB5", + "AXI5", + "AHB5 enh.", + }; + const char* type = "Type unk"; + + if(ctx->apidr_info[ctx->ap_pos].type < COUNT(types)) { + type = types[ctx->apidr_info[ctx->ap_pos].type]; + } + + snprintf(buffer, sizeof(buffer), "[%d]%c%s, %s", ctx->ap_pos, state, class, type); + canvas_draw_str_aligned(canvas, 5, y, AlignLeft, AlignBottom, buffer); + y += 10; + + snprintf(buffer, sizeof(buffer), "Base 0x%08lX", ctx->apidr_info[ctx->ap_pos].base); + canvas_draw_str_aligned(canvas, 5, y, AlignLeft, AlignBottom, buffer); + y += 10; + + snprintf( + buffer, + sizeof(buffer), + "Rev %d Var %d", + ctx->apidr_info[ctx->ap_pos].revision, + ctx->apidr_info[ctx->ap_pos].variant); + canvas_draw_str_aligned(canvas, 5, y, AlignLeft, AlignBottom, buffer); + y += 10; + + snprintf( + buffer, + sizeof(buffer), + "%s", + jep106_manufacturer(ctx->apidr_info[ctx->ap_pos].designer)); + canvas_draw_str_aligned(canvas, 5, y, AlignLeft, AlignBottom, buffer); + y += 10; + + elements_button_center(canvas, "Show"); + } + canvas_set_font(canvas, FontSecondary); + elements_button_left(canvas, "DPID"); + elements_button_right(canvas, "CoreS."); + elements_scrollbar_pos(canvas, 4, 10, 40, ctx->ap_pos / 32, COUNT(ctx->apidr_info) / 32); + break; + } + + /* hex dump view */ + case ModePageHexDump: { + canvas_draw_str_aligned(canvas, 64, y, AlignCenter, AlignBottom, "Hex dump"); + y += 10; + canvas_set_font(canvas, FontKeyboard); + + canvas_draw_str_aligned(canvas, 5, y, AlignLeft, AlignBottom, "Addr:"); + + snprintf(buffer, sizeof(buffer), "%08lX", ctx->hex_addr); + canvas_draw_str_aligned(canvas, 38, y, AlignLeft, AlignBottom, buffer); + uint32_t font_width = canvas_glyph_width(canvas, '0'); + uint32_t x = 37 + (7 - ctx->hex_select) * font_width; + + /* draw selection */ + canvas_draw_line(canvas, x, y + 1, x + font_width, y + 1); + y += 10; + + uint32_t byte_num = 0; + for(int line = 0; line < 4; line++) { + uint32_t x_pos = 5; + + for(int byte_pos = 0; byte_pos < 8; byte_pos++) { + if(ctx->hex_buffer_valid[byte_num / 4]) { + snprintf(buffer, sizeof(buffer), "%02X", ctx->hex_buffer[byte_num]); + } else { + snprintf(buffer, sizeof(buffer), "--"); + } + byte_num++; + canvas_draw_str_aligned(canvas, x_pos, y, AlignLeft, AlignBottom, buffer); + x_pos += font_width * 2 + font_width / 2; + } + y += 10; + } + break; + } + + case ModePageCoresight: { + canvas_draw_str_aligned(canvas, 64, y, AlignCenter, AlignBottom, "Coresight"); + y += 10; + canvas_set_font(canvas, FontSecondary); + + uint32_t base = ctx->coresight_bases[ctx->coresight_level]; + uint32_t base_next = adi_romtable_get(ctx, base, ctx->coresight_pos[ctx->coresight_level]); + + snprintf(buffer, sizeof(buffer), "Base: %08lX", base); + canvas_draw_str_aligned(canvas, 5, y, AlignLeft, AlignBottom, buffer); + y += 10; + snprintf(buffer, sizeof(buffer), "Type: %s", adi_romtable_type(ctx, base)); + canvas_draw_str_aligned(canvas, 5, y, AlignLeft, AlignBottom, buffer); + y += 10; + snprintf(buffer, sizeof(buffer), "Full: %s", adi_romtable_full(ctx, base)); + canvas_draw_str_aligned(canvas, 5, y, AlignLeft, AlignBottom, buffer); + y += 10; + + if(adi_is_romtable(ctx, base)) { + snprintf( + buffer, + sizeof(buffer), + "[%lu/%lu] -> %08lX", + ctx->coresight_pos[ctx->coresight_level] + 1, + ctx->coresight_count[ctx->coresight_level], + base_next); + canvas_draw_str_aligned(canvas, 5, y, AlignLeft, AlignBottom, buffer); + canvas_set_font(canvas, FontSecondary); + elements_button_center(canvas, "Enter"); + } + y += 10; + + canvas_set_font(canvas, FontSecondary); + + if(ctx->coresight_level) { + elements_button_left(canvas, "Prev"); + } else { + elements_button_left(canvas, "APs"); + } + elements_scrollbar_pos( + canvas, + 4, + 10, + 40, + ctx->coresight_pos[ctx->coresight_level], + ctx->coresight_count[ctx->coresight_level]); + + break; + } + + /* hex dump view */ + case ModePageScript: { + canvas_draw_str_aligned(canvas, 64, y, AlignCenter, AlignBottom, "Script"); + y += 10; + y += 10; + canvas_draw_str_aligned(canvas, 10, y, AlignLeft, AlignBottom, "Status:"); + y += 10; + canvas_set_font(canvas, FontKeyboard); + canvas_draw_str_aligned(canvas, 64, y, AlignCenter, AlignBottom, ctx->state_string); + y += 10; + break; + } + } + + furi_mutex_release(ctx->gui_mutex); +} + +static void input_callback(InputEvent* input_event, void* ctx_in) { + furi_assert(input_event); + furi_assert(ctx_in); + AppFSM* ctx = ctx_in; + + int entries = furi_message_queue_get_count(ctx->event_queue); + + /* better skip than sorry */ + if(entries < QUEUE_SIZE) { + AppEvent event = {.type = EventKeyPress, .input = *input_event}; + furi_message_queue_put(ctx->event_queue, &event, 0); + } +} + +static void app_init(AppFSM* const app) { + furi_assert(app); + + app->loop_count = 0; + app->current_mask_id = 0; + app->current_mask = gpio_direction_mask[app->current_mask_id]; + app->io_swd = 0xFF; + app->io_swc = 0xFF; + app->hex_addr = 0x40002800; + app->hex_addr = 0xE000EDF0; + app->swd_clock_delay = CLOCK_DELAY; + app->swd_idle_bits = IDLE_BITS; + + strcpy(app->state_string, "none"); + strcpy(app->script_detected, ""); +} + +static void app_deinit(AppFSM* const app) { + furi_assert(app); + + strcpy(app->state_string, "exiting"); +} + +static void swd_main_loop(AppFSM* ctx) { + furi_assert(ctx); + + ctx->loop_count++; + + switch(ctx->mode_page) { + case ModePageScan: + case ModePageFound: { + /* reset after timeout */ + if(ctx->detected_timeout > 0) { + ctx->detected_timeout--; + } else { + DBGS("Reset detected flag"); + ctx->detected_device = false; + ctx->io_swd = 0xFF; + ctx->io_swc = 0xFF; + ctx->io_num_swd = 0xFF; + ctx->io_num_swc = 0xFF; + ctx->ap_scanned = 0; + memset(&ctx->dp_regs, 0x00, sizeof(ctx->dp_regs)); + memset(&ctx->targetid_info, 0x00, sizeof(ctx->targetid_info)); + memset(&ctx->apidr_info, 0x00, sizeof(ctx->apidr_info)); + ctx->script_detected_executed = false; + } + + ctx->detected = false; + ctx->current_mask = gpio_direction_mask[ctx->current_mask_id]; + + /* when SWD was already detected, set it to data pin regardless of the mask */ + if(ctx->detected_device) { + ctx->current_mask &= ~ctx->io_swd; + } + + /* do the scan */ + furi_mutex_acquire(ctx->swd_mutex, FuriWaitForever); + swd_scan(ctx); + furi_mutex_release(ctx->swd_mutex); + + /* now when detected a device, set the timeout */ + if(ctx->detected) { + DBGS("Set detected flag"); + ctx->detected_device = true; + ctx->detected_timeout = TIMER_HZ * TIMEOUT; + + /* update DPIDR fields */ + ctx->dpidr_info.revision = (ctx->dp_regs.dpidr >> 28) & 0x0F; + ctx->dpidr_info.partno = (ctx->dp_regs.dpidr >> 20) & 0xFF; + ctx->dpidr_info.version = (ctx->dp_regs.dpidr >> 12) & 0x0F; + ctx->dpidr_info.designer = (ctx->dp_regs.dpidr >> 1) & 0x3FF; + + if(!has_multiple_bits(ctx->io_swc)) { + DBGS(" - Detected pins"); + DBGS(" - Resetting error"); + + furi_mutex_acquire(ctx->swd_mutex, FuriWaitForever); + /* reset error */ + /* first make sure we have the correct bank by invalidating the current select cache */ + ctx->dp_regs.select_ok = false; + uint8_t ack = + swd_read_dpbank(ctx, REG_CTRLSTAT, REG_CTRLSTAT_BANK, &ctx->dp_regs.ctrlstat); + + if(ack != 1 || (ctx->dp_regs.ctrlstat & STAT_ERROR_FLAGS)) { + DBGS(" - send ABORT"); + swd_abort(ctx); + } + DBGS(" - Fetch CTRL/STAT"); + ctx->dp_regs.ctrlstat_ok = + swd_read_dpbank( + ctx, REG_CTRLSTAT, REG_CTRLSTAT_BANK, &ctx->dp_regs.ctrlstat) == 1; + DBG(" %08lX %s", + ctx->dp_regs.ctrlstat, + ctx->dp_regs.ctrlstat_ok ? "OK" : "FAIL"); + + if(ctx->dpidr_info.version >= 1) { + DBGS(" - DAPv1, read DLCR"); + ctx->dp_regs.dlcr_ok = + swd_read_dpbank(ctx, REG_DLCR, REG_DLCR_BANK, &ctx->dp_regs.dlcr) == 1; + DBG(" %08lX %s", ctx->dp_regs.dlcr, ctx->dp_regs.dlcr_ok ? "OK" : "FAIL"); + } + + if(ctx->dpidr_info.version >= 2) { + DBGS(" - DAPv2, read TARGETID"); + ctx->dp_regs.targetid_ok = + swd_read_dpbank( + ctx, REG_TARGETID, REG_TARGETID_BANK, &ctx->dp_regs.targetid) == 1; + DBG(" %08lX %s", + ctx->dp_regs.targetid, + ctx->dp_regs.targetid_ok ? "OK" : "FAIL"); + DBGS(" - DAPv2, read EVENTSTAT"); + ctx->dp_regs.eventstat_ok = + swd_read_dpbank( + ctx, REG_EVENTSTAT, REG_EVENTSTAT_BANK, &ctx->dp_regs.eventstat) == 1; + DBG(" %08lX %s", + ctx->dp_regs.eventstat, + ctx->dp_regs.eventstat_ok ? "OK" : "FAIL"); + DBGS(" - DAPv2, read DLPIDR"); + ctx->dp_regs.dlpidr_ok = + swd_read_dpbank(ctx, REG_DLPIDR, REG_DLPIDR_BANK, &ctx->dp_regs.dlpidr) == + 1; + DBG(" %08lX %s", + ctx->dp_regs.dlpidr, + ctx->dp_regs.dlpidr_ok ? "OK" : "FAIL"); + } + + if(ctx->dp_regs.targetid_ok) { + ctx->targetid_info.revision = (ctx->dp_regs.targetid >> 28) & 0x0F; + ctx->targetid_info.partno = (ctx->dp_regs.targetid >> 12) & 0xFFFF; + ctx->targetid_info.designer = (ctx->dp_regs.targetid >> 1) & 0x3FF; + } + + if(!ctx->script_detected_executed && strlen(ctx->script_detected) > 0) { + DBG(" - Run script '%s'", ctx->script_detected); + + ctx->script_detected_executed = true; + + ctx->mode_page = ModePageScript; + swd_execute_script(ctx, ctx->script_detected); + ctx->mode_page = ModePageFound; + } + furi_mutex_release(ctx->swd_mutex); + } + } else { + if(!has_multiple_bits(ctx->io_swc)) { + DBGS(" - Lost device"); + } + } + + ctx->current_mask_id = (ctx->current_mask_id + 1) % COUNT(gpio_direction_mask); + break; + } + + case ModePageDPRegs: + case ModePageDPID: + case ModePageAPID: { + furi_mutex_acquire(ctx->swd_mutex, FuriWaitForever); + /* set debug enable request */ + if(!swd_ensure_powerup(ctx)) { + furi_mutex_release(ctx->swd_mutex); + break; + } + + /* only scan a few APs at once to stay responsive */ + for(int pos = 0; pos < 8; pos++) { + if(ctx->ap_scanned == 0) { + swd_apscan_reset(ctx); + } + + uint8_t ap = ctx->ap_scanned++; + + if(ctx->apidr_info[ap].tested) { + continue; + } + if(swd_apscan_test(ctx, ap)) { + break; + } + } + furi_mutex_release(ctx->swd_mutex); + break; + } + + case ModePageHexDump: { + furi_mutex_acquire(ctx->swd_mutex, FuriWaitForever); + + for(size_t byte_pos = 0; byte_pos < sizeof(ctx->hex_buffer); byte_pos += 4) { + uint32_t* data = (uint32_t*)&ctx->hex_buffer[byte_pos]; + bool ret = swd_read_memory(ctx, ctx->ap_pos, ctx->hex_addr + byte_pos, data) == 1; + + ctx->hex_buffer_valid[byte_pos / 4] = ret; + + if(!ret) { + swd_abort_simple(ctx); + } + } + furi_mutex_release(ctx->swd_mutex); + break; + } + + case ModePageCoresight: + furi_delay_ms(50); + break; + } +} + +static bool swd_message_process(AppFSM* ctx) { + bool processing = true; + AppEvent event; + + /* wait to make sure the OS can do its stuff */ + FuriStatus event_status = furi_message_queue_get(ctx->event_queue, &event, 1000 / TIMER_HZ); + + if(event_status != FuriStatusOk) { + return processing; + } + + if(event.type == EventKeyPress) { + if(event.input.type == InputTypePress) { + switch(event.input.key) { + case InputKeyUp: + switch(ctx->mode_page) { + default: + break; + + case ModePageScan: + case ModePageFound: { + strcpy(ctx->script_detected, ""); + break; + } + + case ModePageAPID: + if(ctx->ap_pos > 0) { + ctx->ap_pos--; + } + break; + + case ModePageHexDump: { + ctx->hex_addr += ((ctx->hex_select) ? 1 : 8) * (1 << (4 * ctx->hex_select)); + break; + } + + case ModePageCoresight: { + if(ctx->coresight_pos[ctx->coresight_level] > 0) { + ctx->coresight_pos[ctx->coresight_level]--; + } + break; + } + } + break; + + case InputKeyDown: { + switch(ctx->mode_page) { + default: + break; + + case ModePageScan: { + FuriString* result_path = furi_string_alloc_printf(ANY_PATH("swd")); + FuriString* preselected = furi_string_alloc_printf( + (strlen(ctx->script_detected) > 0) ? ctx->script_detected : + ANY_PATH("swd")); + DialogsFileBrowserOptions options; + + dialog_file_browser_set_basic_options(&options, "swd", &I_swd); + + if(dialog_file_browser_show(ctx->dialogs, result_path, preselected, &options)) { + const char* path = furi_string_get_cstr(result_path); + strcpy(ctx->script_detected, path); + } + + furi_string_free(result_path); + furi_string_free(preselected); + break; + } + + case ModePageAPID: + if(ctx->ap_pos + 1U < COUNT(ctx->apidr_info)) { + ctx->ap_pos++; + } + break; + + case ModePageHexDump: { + ctx->hex_addr -= ((ctx->hex_select) ? 1 : 8) * (1 << (4 * ctx->hex_select)); + break; + } + + case ModePageCoresight: { + if(ctx->coresight_pos[ctx->coresight_level] + 1 < + ctx->coresight_count[ctx->coresight_level]) { + ctx->coresight_pos[ctx->coresight_level]++; + } + break; + } + } + break; + } + + case InputKeyRight: + if(ctx->mode_page == ModePageHexDump) { + if(ctx->hex_select > 0) { + ctx->hex_select--; + } + } else if(ctx->mode_page == ModePageAPID && ctx->apidr_info[ctx->ap_pos].ok) { + ctx->mode_page = ModePageCoresight; + uint32_t base = ctx->apidr_info[ctx->ap_pos].base & 0xFFFFF000; + ctx->coresight_level = 0; + ctx->coresight_bases[ctx->coresight_level] = base; + ctx->coresight_pos[ctx->coresight_level] = 0; + ctx->coresight_count[ctx->coresight_level] = + adi_romtable_entry_count(ctx, base); + } else if(ctx->detected) { + if(ctx->mode_page + 1 < ModePageCount) { + ctx->mode_page++; + } + } + break; + + case InputKeyLeft: + if(ctx->mode_page == ModePageHexDump) { + if(ctx->hex_select < 7) { + ctx->hex_select++; + } + } else if(ctx->mode_page == ModePageCoresight) { + if(ctx->coresight_level > 0) { + ctx->coresight_level--; + } else { + ctx->mode_page = ModePageAPID; + } + } else if((ctx->mode_page == ModePageScan) || (ctx->mode_page == ModePageFound)) { + uint32_t mode_page = ctx->mode_page; + FuriString* result_path = furi_string_alloc_printf(ANY_PATH("swd")); + FuriString* preselected = furi_string_alloc_printf( + (strlen(ctx->script_detected) > 0) ? ctx->script_detected : + ANY_PATH("swd")); + DialogsFileBrowserOptions options; + + dialog_file_browser_set_basic_options(&options, "swd", &I_swd); + + if(dialog_file_browser_show(ctx->dialogs, result_path, preselected, &options)) { + const char* path = furi_string_get_cstr(result_path); + ctx->mode_page = ModePageScript; + swd_execute_script(ctx, path); + ctx->mode_page = mode_page; + } + + furi_string_free(result_path); + furi_string_free(preselected); + break; + } else { + if(ctx->mode_page > 0) { + ctx->mode_page--; + } + } + break; + + case InputKeyOk: + if(ctx->mode_page == ModePageAPID && ctx->apidr_info[ctx->ap_pos].ok) { + ctx->mode_page = ModePageHexDump; + } else if(ctx->mode_page == ModePageCoresight) { + uint32_t base = ctx->coresight_bases[ctx->coresight_level]; + + if(!adi_is_romtable(ctx, base)) { + break; + } + + uint32_t cur_pos = ctx->coresight_pos[ctx->coresight_level]; + uint32_t base_next = adi_romtable_get(ctx, base, cur_pos); + uint32_t new_count = adi_romtable_entry_count(ctx, base_next); + + ctx->coresight_level++; + ctx->coresight_pos[ctx->coresight_level] = 0; + ctx->coresight_count[ctx->coresight_level] = new_count; + ctx->coresight_bases[ctx->coresight_level] = base_next; + } + break; + + case InputKeyBack: + if(ctx->mode_page == ModePageHexDump) { + ctx->mode_page = ModePageAPID; + } else if(ctx->mode_page == ModePageScript) { + ctx->script->abort = true; + } else if(ctx->mode_page > ModePageFound) { + ctx->mode_page = ModePageScan; + } else if(ctx->mode_page == ModePageScan) { + processing = false; + } else if(ctx->mode_page == ModePageFound) { + processing = false; + } + break; + + default: + break; + } + } + } + return processing; +} + +size_t data_received(void* ctx, uint8_t* data, size_t length) { + AppFSM* app = (AppFSM*)ctx; + + strncpy(app->commandline->line_data, (const char*)data, length); + app->commandline->line_pos = 0; + + for(size_t pos = 0; pos < length; pos++) { + uint8_t ch = app->commandline->line_data[pos]; + + if((ch == '\r') || (ch == '\n')) { + app->commandline->line_data[pos++] = '\n'; + app->commandline->line_data[pos] = 0; + LOG("direct command '%s'", app->commandline->line_data); + swd_execute_script_line(app->commandline); + return pos; + } + } + + return 0; +} + +int32_t swd_probe_app_main(void* p) { + UNUSED(p); + + AppFSM* app = malloc(sizeof(AppFSM)); + + DBGS("App init"); + app_init(app); + + DBGS("furi_record_open"); + app->notification = furi_record_open(RECORD_NOTIFICATION); + app->gui = furi_record_open(RECORD_GUI); + app->dialogs = furi_record_open(RECORD_DIALOGS); + app->storage = furi_record_open(RECORD_STORAGE); + + DBGS("furi_mutex_alloc"); + app->swd_mutex = furi_mutex_alloc(FuriMutexTypeNormal); + app->gui_mutex = furi_mutex_alloc(FuriMutexTypeNormal); + app->event_queue = furi_message_queue_alloc(QUEUE_SIZE, sizeof(AppEvent)); + + DBGS("usb_uart_enable"); + UsbUartConfig uart_config; + uart_config.vcp_ch = 1; + uart_config.rx_data = &data_received; + uart_config.rx_data_ctx = app; + app->uart = usb_uart_enable(&uart_config); + + app->commandline = malloc(sizeof(ScriptContext)); + app->commandline->max_tries = 1; + app->commandline->app = app; + + DBGS("view_port_alloc"); + app->view_port = view_port_alloc(); + view_port_draw_callback_set(app->view_port, render_callback, app); + view_port_input_callback_set(app->view_port, input_callback, app); + gui_add_view_port(app->gui, app->view_port, GuiLayerFullscreen); + + DBGS("notification_message_block"); + notification_message(app->notification, &sequence_display_backlight_enforce_on); + + DBGS("swd_execute_script"); + swd_execute_script(app, ANY_PATH("swd_scripts/startup.swd")); + + DOLPHIN_DEED(DolphinDeedPluginGameStart); + + DBGS("processing"); + for(bool processing = true; processing;) { + swd_main_loop(app); + view_port_update(app->view_port); + + processing = swd_message_process(app); + + bool beep = false; + + if(app->detected_device && !app->detected_notified) { + app->detected_notified = true; + beep = true; + } + if(!app->detected_device && app->detected_notified) { + app->detected_notified = false; + } + if(beep) { + notification_message_block(app->notification, &seq_c_minor); + } + } + + view_port_enabled_set(app->view_port, false); + gui_remove_view_port(app->gui, app->view_port); + view_port_free(app->view_port); + + app_deinit(app); + + notification_message(app->notification, &sequence_display_backlight_enforce_auto); + + usb_uart_disable(app->uart); + + furi_message_queue_free(app->event_queue); + furi_mutex_free(app->gui_mutex); + furi_mutex_free(app->swd_mutex); + free(app); + + furi_record_close(RECORD_GUI); + furi_record_close(RECORD_NOTIFICATION); + furi_record_close(RECORD_DIALOGS); + furi_record_close(RECORD_STORAGE); + + return 0; +} diff --git a/applications/plugins/swd_probe/swd_probe_app.h b/applications/plugins/swd_probe/swd_probe_app.h new file mode 100644 index 000000000..152088925 --- /dev/null +++ b/applications/plugins/swd_probe/swd_probe_app.h @@ -0,0 +1,233 @@ +#ifndef __ARHA_FLIPPERAPP_DEMO +#define __ARHA_FLIPPERAPP_DEMO + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "usb_uart.h" + +#define TAG "SWD" + +/* short debug message */ +#define DBGS(format) furi_log_print_format(FuriLogLevelDebug, TAG, "%s: " format, __FUNCTION__) +/* formatted debug message */ +#define DBG(format, ...) \ + furi_log_print_format(FuriLogLevelDebug, TAG, "%s: " format, __FUNCTION__, __VA_ARGS__) +/* log message*/ +#define LOG(...) furi_log_print_format(FuriLogLevelDefault, TAG, __VA_ARGS__) + +#define COUNT(x) ((size_t)(sizeof(x) / sizeof((x)[0]))) +#define ARRAY_SIZE(x) COUNT(x) + +#define SWD_DELAY_US 0 +#define TIMER_HZ 25 +#define TIMEOUT 3 +#define QUEUE_SIZE 8 +#define IDLE_BITS 8 +#define CLOCK_DELAY 0 + +#define MAX_FILE_LENGTH 128 +#define SCRIPT_MAX_LINES 1000 + +typedef enum { + ModePageScan = 0, + ModePageFound = 1, + ModePageDPRegs = 2, + ModePageDPID = 3, + ModePageAPID = 4, + ModePageCount = 5, + ModePageHexDump = 0x100, + ModePageScript = 0x101, + ModePageCoresight = 0x102, +} ModePages; + +#define CDBGPWRUPREQ (1 << 28) +#define CDBGPWRUPACK (1 << 29) +#define CSYSPWRUPREQ (1 << 30) +#define CSYSPWRUPACK (1 << 31) +#define WDATAERR (1 << 7) +#define STICKYERR (1 << 5) +#define STAT_ERROR_FLAGS (WDATAERR | STICKYERR) + +#define REG_IDCODE 0x00 +#define REG_CTRLSTAT 0x01 +#define REG_CTRLSTAT_BANK 0x00 +#define REG_DLCR 0x01 +#define REG_DLCR_BANK 0x01 +#define REG_TARGETID 0x01 +#define REG_TARGETID_BANK 0x02 +#define REG_DLPIDR 0x01 +#define REG_DLPIDR_BANK 0x03 +#define REG_EVENTSTAT 0x01 +#define REG_EVENTSTAT_BANK 0x04 + +#define REG_SELECT 0x02 + +#define MEMAP_CSW 0x00 +#define MEMAP_TAR 0x04 +#define MEMAP_DRW 0x0C +#define AP_IDR 0xFC +#define AP_BASE 0xF8 + +typedef enum { KeyNone, KeyUp, KeyRight, KeyDown, KeyLeft, KeyOK } KeyCode; + +typedef enum { + EventTimerTick, + EventKeyPress, +} EventType; + +typedef struct { + EventType type; + InputEvent input; +} AppEvent; + +typedef struct { + uint32_t ctrlstat; + bool ctrlstat_ok; + uint32_t dlcr; + bool dlcr_ok; + uint32_t dlpidr; + bool dlpidr_ok; + uint32_t dpidr; + bool dpidr_ok; + uint32_t eventstat; + bool eventstat_ok; + uint32_t select; + bool select_ok; + uint32_t targetid; + bool targetid_ok; +} swd_dpreg_t; + +typedef struct { + bool ok; + bool tested; + uint8_t revision; + uint16_t designer; + uint8_t class; + uint8_t variant; + uint8_t type; + uint32_t base; +} swd_apidr_info_t; + +typedef struct { + uint8_t revision; + uint8_t partno; + uint8_t version; + uint16_t designer; +} swd_dpidr_info_t; + +typedef struct { + uint8_t revision; + uint16_t partno; + uint16_t designer; +} swd_targetid_info_t; + +typedef struct sScriptContext ScriptContext; + +typedef struct { + Storage* storage; + Gui* gui; + DialogsApp* dialogs; + NotificationApp* notification; + + FuriTimer* timer; + UsbUart* uart; + ViewPort* view_port; + + FuriMessageQueue* event_queue; + FuriMutex* swd_mutex; + FuriMutex* gui_mutex; + + swd_targetid_info_t targetid_info; + swd_dpidr_info_t dpidr_info; + swd_dpreg_t dp_regs; + swd_apidr_info_t apidr_info[256]; + + ScriptContext* script; + ScriptContext* commandline; + + uint8_t timeout_overdue; + uint32_t loop_count; + uint8_t current_mask_id; + uint32_t current_mask; + uint8_t io_swc; + uint8_t io_swd; + uint8_t io_num_swc; + uint8_t io_num_swd; + int32_t detected_timeout; + uint32_t swd_clock_delay; + uint32_t swd_idle_bits; + bool detected; + bool detected_device; + bool detected_notified; + uint32_t mode_page; + uint8_t ap_pos; + uint8_t ap_scanned; + + uint32_t coresight_pos[16]; + uint32_t coresight_count[16]; + uint8_t coresight_level; + uint32_t coresight_bases[16]; + + uint32_t hex_addr; + uint8_t hex_select; + uint8_t hex_buffer[32]; + uint8_t hex_buffer_valid[8]; + + char state_string[64]; + char script_detected[MAX_FILE_LENGTH]; + bool script_detected_executed; +} AppFSM; + +struct sScriptContext { + AppFSM* app; + ScriptContext* parent; + char filename[MAX_FILE_LENGTH]; + + /* when used with string input */ + char line_data[128]; + uint64_t line_pos; + + /* when used with file input */ + File* script_file; + + uint64_t position; + uint32_t selected_ap; + uint32_t max_tries; + uint32_t block_size; + + bool abort; + bool restart; + bool errors_ignore; + bool status_ignore; + bool goto_active; + char goto_label[64]; +}; + +typedef struct { + const char* prefix; + bool (*func)(ScriptContext* ctx); +} ScriptFunctionInfo; + +uint8_t swd_read_memory(AppFSM* const ctx, uint8_t ap, uint32_t address, uint32_t* data); + +#endif \ No newline at end of file diff --git a/applications/plugins/swd_probe/usb_uart.c b/applications/plugins/swd_probe/usb_uart.c new file mode 100644 index 000000000..76841cf11 --- /dev/null +++ b/applications/plugins/swd_probe/usb_uart.c @@ -0,0 +1,223 @@ + +#include + +#include "usb_uart.h" +#include "furi_hal.h" +#include +#include "usb_cdc.h" +#include "cli/cli_vcp.h" +#include +#include "cli/cli.h" + +#define USB_CDC_PKT_LEN CDC_DATA_SZ +#define USB_UART_RX_BUF_SIZE (USB_CDC_PKT_LEN * 5) + +#define USB_CDC_BIT_DTR (1 << 0) +#define USB_CDC_BIT_RTS (1 << 1) + +typedef enum { + WorkerEvtStop = (1 << 0), + WorkerEvtCdcRx = (1 << 1), + WorkerEvtCfgChange = (1 << 2) + +} WorkerEvtFlags; + +#define WORKER_ALL_EVENTS (WorkerEvtStop | WorkerEvtCfgChange | WorkerEvtCdcRx) + +struct UsbUart { + UsbUartConfig cfg; + UsbUartConfig cfg_new; + + FuriThread* thread; + FuriMutex* usb_mutex; + FuriSemaphore* tx_sem; + UsbUartState st; + FuriApiLock cfg_lock; + + uint8_t rx_buf[USB_CDC_PKT_LEN]; +}; + +static void vcp_on_cdc_tx_complete(void* context); +static void vcp_on_cdc_rx(void* context); +static void vcp_state_callback(void* context, uint8_t state); +static void vcp_on_cdc_control_line(void* context, uint8_t state); +static void vcp_on_line_config(void* context, struct usb_cdc_line_coding* config); + +static const CdcCallbacks cdc_cb = { + .tx_ep_callback = &vcp_on_cdc_tx_complete, + .rx_ep_callback = &vcp_on_cdc_rx, + .state_callback = &vcp_state_callback, + .ctrl_line_callback = &vcp_on_cdc_control_line, + .config_callback = &vcp_on_line_config}; + +static void usb_uart_vcp_init(UsbUart* usb_uart, uint8_t vcp_ch) { + furi_hal_usb_unlock(); + + Cli* cli = furi_record_open(RECORD_CLI); + cli_session_close(cli); + + if(vcp_ch == 0) { + furi_check(furi_hal_usb_set_config(&usb_cdc_single, NULL) == true); + } else { + furi_check(furi_hal_usb_set_config(&usb_cdc_dual, NULL) == true); + cli_session_open(cli, &cli_vcp); + } + furi_record_close(RECORD_CLI); + furi_hal_cdc_set_callbacks(vcp_ch, (CdcCallbacks*)&cdc_cb, usb_uart); +} + +static void usb_uart_vcp_deinit(UsbUart* usb_uart, uint8_t vcp_ch) { + UNUSED(usb_uart); + furi_hal_cdc_set_callbacks(vcp_ch, NULL, NULL); + if(vcp_ch != 0) { + Cli* cli = furi_record_open(RECORD_CLI); + cli_session_close(cli); + furi_record_close(RECORD_CLI); + } +} + +void usb_uart_tx_data(UsbUart* usb_uart, uint8_t* data, size_t length) { + uint32_t pos = 0; + while(pos < length) { + size_t pkt_size = length - pos; + + if(pkt_size > USB_CDC_PKT_LEN) { + pkt_size = USB_CDC_PKT_LEN; + } + + if(furi_semaphore_acquire(usb_uart->tx_sem, 100) == FuriStatusOk) { + furi_check(furi_mutex_acquire(usb_uart->usb_mutex, FuriWaitForever) == FuriStatusOk); + furi_hal_cdc_send(usb_uart->cfg.vcp_ch, &data[pos], pkt_size); + furi_check(furi_mutex_release(usb_uart->usb_mutex) == FuriStatusOk); + usb_uart->st.tx_cnt += pkt_size; + pos += pkt_size; + } + } +} + +static int32_t usb_uart_worker(void* context) { + UsbUart* usb_uart = (UsbUart*)context; + + memcpy(&usb_uart->cfg, &usb_uart->cfg_new, sizeof(UsbUartConfig)); + + usb_uart->tx_sem = furi_semaphore_alloc(1, 1); + usb_uart->usb_mutex = furi_mutex_alloc(FuriMutexTypeNormal); + + usb_uart_vcp_init(usb_uart, usb_uart->cfg.vcp_ch); + + uint8_t data[2 * USB_CDC_PKT_LEN]; + size_t remain = 0; + + while(1) { + uint32_t events = + furi_thread_flags_wait(WORKER_ALL_EVENTS, FuriFlagWaitAny, FuriWaitForever); + furi_check(!(events & FuriFlagError)); + + if(events & WorkerEvtStop) { + break; + } + + if(events & WorkerEvtCdcRx) { + furi_check(furi_mutex_acquire(usb_uart->usb_mutex, FuriWaitForever) == FuriStatusOk); + size_t len = + furi_hal_cdc_receive(usb_uart->cfg.vcp_ch, &data[remain], USB_CDC_PKT_LEN); + furi_check(furi_mutex_release(usb_uart->usb_mutex) == FuriStatusOk); + + if(len > 0) { + usb_uart->st.rx_cnt += len; + remain += len; + + size_t handled = usb_uart->cfg.rx_data(usb_uart->cfg.rx_data_ctx, data, remain); + + memcpy(data, &data[handled], remain - handled); + remain -= handled; + } + } + + if(events & WorkerEvtCfgChange) { + if(usb_uart->cfg.vcp_ch != usb_uart->cfg_new.vcp_ch) { + usb_uart_vcp_deinit(usb_uart, usb_uart->cfg.vcp_ch); + usb_uart_vcp_init(usb_uart, usb_uart->cfg_new.vcp_ch); + + usb_uart->cfg.vcp_ch = usb_uart->cfg_new.vcp_ch; + } + api_lock_unlock(usb_uart->cfg_lock); + } + } + usb_uart_vcp_deinit(usb_uart, usb_uart->cfg.vcp_ch); + + furi_mutex_free(usb_uart->usb_mutex); + furi_semaphore_free(usb_uart->tx_sem); + + furi_hal_usb_unlock(); + furi_check(furi_hal_usb_set_config(&usb_cdc_single, NULL) == true); + Cli* cli = furi_record_open(RECORD_CLI); + cli_session_open(cli, &cli_vcp); + furi_record_close(RECORD_CLI); + + return 0; +} + +/* VCP callbacks */ +static void vcp_on_cdc_tx_complete(void* context) { + UsbUart* usb_uart = (UsbUart*)context; + furi_semaphore_release(usb_uart->tx_sem); +} + +static void vcp_on_cdc_rx(void* context) { + UsbUart* usb_uart = (UsbUart*)context; + furi_thread_flags_set(furi_thread_get_id(usb_uart->thread), WorkerEvtCdcRx); +} + +static void vcp_state_callback(void* context, uint8_t state) { + UNUSED(context); + UNUSED(state); +} + +static void vcp_on_cdc_control_line(void* context, uint8_t state) { + UNUSED(context); + UNUSED(state); +} + +static void vcp_on_line_config(void* context, struct usb_cdc_line_coding* config) { + UNUSED(context); + UNUSED(config); +} + +UsbUart* usb_uart_enable(UsbUartConfig* cfg) { + UsbUart* usb_uart = malloc(sizeof(UsbUart)); + memcpy(&(usb_uart->cfg_new), cfg, sizeof(UsbUartConfig)); + + usb_uart->thread = furi_thread_alloc_ex("UsbUartWorker", 1024, usb_uart_worker, usb_uart); + furi_thread_start(usb_uart->thread); + return usb_uart; +} + +void usb_uart_disable(UsbUart* usb_uart) { + furi_assert(usb_uart); + furi_thread_flags_set(furi_thread_get_id(usb_uart->thread), WorkerEvtStop); + furi_thread_join(usb_uart->thread); + furi_thread_free(usb_uart->thread); + free(usb_uart); +} + +void usb_uart_set_config(UsbUart* usb_uart, UsbUartConfig* cfg) { + furi_assert(usb_uart); + furi_assert(cfg); + usb_uart->cfg_lock = api_lock_alloc_locked(); + memcpy(&(usb_uart->cfg_new), cfg, sizeof(UsbUartConfig)); + furi_thread_flags_set(furi_thread_get_id(usb_uart->thread), WorkerEvtCfgChange); + api_lock_wait_unlock_and_free(usb_uart->cfg_lock); +} + +void usb_uart_get_config(UsbUart* usb_uart, UsbUartConfig* cfg) { + furi_assert(usb_uart); + furi_assert(cfg); + memcpy(cfg, &(usb_uart->cfg_new), sizeof(UsbUartConfig)); +} + +void usb_uart_get_state(UsbUart* usb_uart, UsbUartState* st) { + furi_assert(usb_uart); + furi_assert(st); + memcpy(st, &(usb_uart->st), sizeof(UsbUartState)); +} diff --git a/applications/plugins/swd_probe/usb_uart.h b/applications/plugins/swd_probe/usb_uart.h new file mode 100644 index 000000000..a82f36a05 --- /dev/null +++ b/applications/plugins/swd_probe/usb_uart.h @@ -0,0 +1,29 @@ +#pragma once + +#include +#include + +typedef struct UsbUart UsbUart; + +typedef struct { + uint8_t vcp_ch; + size_t (*rx_data)(void* ctx, uint8_t* data, size_t length); + void* rx_data_ctx; +} UsbUartConfig; + +typedef struct { + uint32_t rx_cnt; + uint32_t tx_cnt; +} UsbUartState; + +UsbUart* usb_uart_enable(UsbUartConfig* cfg); + +void usb_uart_disable(UsbUart* usb_uart); + +void usb_uart_set_config(UsbUart* usb_uart, UsbUartConfig* cfg); + +void usb_uart_get_config(UsbUart* usb_uart, UsbUartConfig* cfg); + +void usb_uart_get_state(UsbUart* usb_uart, UsbUartState* st); + +void usb_uart_tx_data(UsbUart* usb_uart, uint8_t* data, size_t length); diff --git a/assets/resources/swd_scripts/100us.swd b/assets/resources/swd_scripts/100us.swd new file mode 100644 index 000000000..3ad89a0ab --- /dev/null +++ b/assets/resources/swd_scripts/100us.swd @@ -0,0 +1 @@ +swd_clock_delay 100 diff --git a/assets/resources/swd_scripts/call_test_1.swd b/assets/resources/swd_scripts/call_test_1.swd new file mode 100644 index 000000000..03f5575f4 --- /dev/null +++ b/assets/resources/swd_scripts/call_test_1.swd @@ -0,0 +1,6 @@ + +message 0 "gonna call call_test_2" dialog + +call call_test_2 + +message 0 "back now" dialog diff --git a/assets/resources/swd_scripts/call_test_2.swd b/assets/resources/swd_scripts/call_test_2.swd new file mode 100644 index 000000000..f358b6ece --- /dev/null +++ b/assets/resources/swd_scripts/call_test_2.swd @@ -0,0 +1,7 @@ + +# first do a beeeeeep +beep 1 + +message 0 "Seems to work" dialog + +beep 0 diff --git a/assets/resources/swd_scripts/dump_0x00000000_1k.swd b/assets/resources/swd_scripts/dump_0x00000000_1k.swd new file mode 100644 index 000000000..a8870fe30 --- /dev/null +++ b/assets/resources/swd_scripts/dump_0x00000000_1k.swd @@ -0,0 +1,6 @@ +ap_select 0 +max_tries 50 +block_size 4 +mem_dump /ext/swd_scripts/flash.bin 0x00000000 0x100000 2 +beep 1 +message 5 "Reading sucessful" diff --git a/assets/resources/swd_scripts/dump_0x00000000_4b.swd b/assets/resources/swd_scripts/dump_0x00000000_4b.swd new file mode 100644 index 000000000..a8870fe30 --- /dev/null +++ b/assets/resources/swd_scripts/dump_0x00000000_4b.swd @@ -0,0 +1,6 @@ +ap_select 0 +max_tries 50 +block_size 4 +mem_dump /ext/swd_scripts/flash.bin 0x00000000 0x100000 2 +beep 1 +message 5 "Reading sucessful" diff --git a/assets/resources/swd_scripts/dump_STM32.swd b/assets/resources/swd_scripts/dump_STM32.swd new file mode 100644 index 000000000..e675537c9 --- /dev/null +++ b/assets/resources/swd_scripts/dump_STM32.swd @@ -0,0 +1,6 @@ +ap_select 0 +max_tries 50 +block_size 1024 +mem_dump /ext/swd_scripts/flash.bin 0x08000000 0x100000 2 +beep 1 +message 0 "Reading finished" dialog diff --git a/assets/resources/swd_scripts/goto_test.swd b/assets/resources/swd_scripts/goto_test.swd new file mode 100644 index 000000000..680285653 --- /dev/null +++ b/assets/resources/swd_scripts/goto_test.swd @@ -0,0 +1,7 @@ +beep 1 +goto l2 +.label l1 +beep 0 +.label l2 +beep 1 +goto l1 diff --git a/assets/resources/swd_scripts/halt.swd b/assets/resources/swd_scripts/halt.swd new file mode 100644 index 000000000..6aad4c194 --- /dev/null +++ b/assets/resources/swd_scripts/halt.swd @@ -0,0 +1,11 @@ + +# make sure errors do not cause a script abort +errors ignore + +message 0 "HAMMER TIME! Trying to halt CPU" +ap_select 0 + +# loop writing the halt bits +.label l1 +mem_write 0xE000EDF0 0xA05F0003 +goto l1 diff --git a/assets/resources/swd_scripts/reset.swd b/assets/resources/swd_scripts/reset.swd new file mode 100644 index 000000000..1872757fb --- /dev/null +++ b/assets/resources/swd_scripts/reset.swd @@ -0,0 +1,8 @@ +errors ignore +status 0 +message 0 "HAMMER TIME! Try to halt the CPU" +.label l1 +ap_select 0 +mem_write 0xE000EDF0 0xA05F0001 +mem_write 0xE000ED0C 0x05FA0004 +goto l1 diff --git a/assets/resources/swd_scripts/test_write.swd b/assets/resources/swd_scripts/test_write.swd new file mode 100644 index 000000000..df69461fd --- /dev/null +++ b/assets/resources/swd_scripts/test_write.swd @@ -0,0 +1,3 @@ +mem_write 0x20002000 0xdeadbeef +mem_write 0xE000EDF0 0xA05F0001 +mem_write 0xE000EDF0 0xA05F0007 From 72fd448541a5c91250d7cf215eacca7b60ebe174 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Fri, 24 Feb 2023 03:04:12 +0300 Subject: [PATCH 328/506] replace paths --- applications/plugins/swd_probe/swd_probe_app.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/applications/plugins/swd_probe/swd_probe_app.c b/applications/plugins/swd_probe/swd_probe_app.c index fcebd8348..0561cbde7 100644 --- a/applications/plugins/swd_probe/swd_probe_app.c +++ b/applications/plugins/swd_probe/swd_probe_app.c @@ -2589,10 +2589,10 @@ static bool swd_message_process(AppFSM* ctx) { break; case ModePageScan: { - FuriString* result_path = furi_string_alloc_printf(ANY_PATH("swd")); + FuriString* result_path = furi_string_alloc_printf(ANY_PATH("swd_scripts")); FuriString* preselected = furi_string_alloc_printf( (strlen(ctx->script_detected) > 0) ? ctx->script_detected : - ANY_PATH("swd")); + ANY_PATH("swd_scripts")); DialogsFileBrowserOptions options; dialog_file_browser_set_basic_options(&options, "swd", &I_swd); @@ -2662,10 +2662,10 @@ static bool swd_message_process(AppFSM* ctx) { } } else if((ctx->mode_page == ModePageScan) || (ctx->mode_page == ModePageFound)) { uint32_t mode_page = ctx->mode_page; - FuriString* result_path = furi_string_alloc_printf(ANY_PATH("swd")); + FuriString* result_path = furi_string_alloc_printf(ANY_PATH("swd_scripts")); FuriString* preselected = furi_string_alloc_printf( (strlen(ctx->script_detected) > 0) ? ctx->script_detected : - ANY_PATH("swd")); + ANY_PATH("swd_scripts")); DialogsFileBrowserOptions options; dialog_file_browser_set_basic_options(&options, "swd", &I_swd); From c230d09dad6c0d72b52af565d4b0a44bae77ebf2 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Fri, 24 Feb 2023 03:04:36 +0300 Subject: [PATCH 329/506] Faster Turn OFF hold time --- applications/services/desktop/views/desktop_view_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/services/desktop/views/desktop_view_main.c b/applications/services/desktop/views/desktop_view_main.c index 52a67f9a3..7e68cd4ca 100644 --- a/applications/services/desktop/views/desktop_view_main.c +++ b/applications/services/desktop/views/desktop_view_main.c @@ -17,7 +17,7 @@ struct DesktopMainView { bool dummy_mode; }; -#define DESKTOP_MAIN_VIEW_POWEROFF_TIMEOUT 2000 +#define DESKTOP_MAIN_VIEW_POWEROFF_TIMEOUT 1300 static void desktop_main_poweroff_timer_callback(TimerHandle_t timer) { DesktopMainView* main_view = pvTimerGetTimerID(timer); From 02591c12b7edb85321430961603e5e4429449c02 Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Fri, 24 Feb 2023 00:10:04 +0000 Subject: [PATCH 330/506] Fix keyboard capitalization bug (_ and space) --- applications/services/gui/modules/text_input.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/applications/services/gui/modules/text_input.c b/applications/services/gui/modules/text_input.c index 9004304cb..d98128c6d 100644 --- a/applications/services/gui/modules/text_input.c +++ b/applications/services/gui/modules/text_input.c @@ -237,8 +237,7 @@ static void text_input_view_draw_callback(Canvas* canvas, void* _model) { canvas_set_color(canvas, ColorBlack); } - if(model->clear_default_text || - (text_length == 0 && char_is_lowercase(keys[column].text))) { + if((model->clear_default_text || text_length == 0) && char_is_lowercase(keys[column].text)) { canvas_draw_glyph( canvas, keyboard_origin_x + keys[column].x, @@ -309,10 +308,6 @@ static void text_input_handle_ok(TextInput* text_input, TextInputModel* model, b char selected = get_selected_char(model); size_t text_length = strlen(model->text_buffer); - if(shift) { - selected = char_to_uppercase(selected); - } - if(selected == ENTER_KEY) { if(model->validator_callback && (!model->validator_callback( @@ -329,7 +324,7 @@ static void text_input_handle_ok(TextInput* text_input, TextInputModel* model, b text_length = 0; } if(text_length < (model->text_buffer_size - 1)) { - if(text_length == 0 && char_is_lowercase(selected)) { + if(shift || (text_length == 0 && char_is_lowercase(selected))) { selected = char_to_uppercase(selected); } model->text_buffer[text_length] = selected; @@ -568,4 +563,4 @@ void* text_input_get_validator_callback_context(TextInput* text_input) { void text_input_set_header_text(TextInput* text_input, const char* text) { with_view_model( text_input->view, TextInputModel * model, { model->header = text; }, true); -} \ No newline at end of file +} From f3e3e828aa6e695986e604ccbd47b896d9e338b2 Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Fri, 24 Feb 2023 00:10:04 +0000 Subject: [PATCH 331/506] Fix keyboard capitalization bug --- applications/services/gui/modules/text_input.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/applications/services/gui/modules/text_input.c b/applications/services/gui/modules/text_input.c index 60700f12a..ebe32b7a5 100644 --- a/applications/services/gui/modules/text_input.c +++ b/applications/services/gui/modules/text_input.c @@ -138,7 +138,7 @@ static bool char_is_lowercase(char letter) { static char char_to_uppercase(const char letter) { if(letter == '_') { return 0x20; - } else if(islower(letter)) { + } else if(char_is_lowercase(letter)) { return (letter - 0x20); } else { return letter; @@ -237,8 +237,7 @@ static void text_input_view_draw_callback(Canvas* canvas, void* _model) { canvas_set_color(canvas, ColorBlack); } - if(model->clear_default_text || - (text_length == 0 && char_is_lowercase(keys[column].text))) { + if((model->clear_default_text || text_length == 0) && char_is_lowercase(keys[column].text)) { canvas_draw_glyph( canvas, keyboard_origin_x + keys[column].x, @@ -309,12 +308,6 @@ static void text_input_handle_ok(TextInput* text_input, TextInputModel* model, b char selected = get_selected_char(model); size_t text_length = strlen(model->text_buffer); - bool toggle_case = text_length == 0; - if(shift) toggle_case = !toggle_case; - if(toggle_case) { - selected = char_to_uppercase(selected); - } - if(selected == ENTER_KEY) { if(model->validator_callback && (!model->validator_callback( @@ -331,6 +324,9 @@ static void text_input_handle_ok(TextInput* text_input, TextInputModel* model, b text_length = 0; } if(text_length < (model->text_buffer_size - 1)) { + if(shift || (text_length == 0 && char_is_lowercase(selected))) { + selected = char_to_uppercase(selected); + } model->text_buffer[text_length] = selected; model->text_buffer[text_length + 1] = 0; } From d23f396c44327ff2dd116eb8cba20bfb9ac68c89 Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Fri, 24 Feb 2023 00:23:33 +0000 Subject: [PATCH 332/506] Keyboard lowercase check fix --- applications/services/gui/modules/text_input.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/services/gui/modules/text_input.c b/applications/services/gui/modules/text_input.c index d98128c6d..ebe32b7a5 100644 --- a/applications/services/gui/modules/text_input.c +++ b/applications/services/gui/modules/text_input.c @@ -138,7 +138,7 @@ static bool char_is_lowercase(char letter) { static char char_to_uppercase(const char letter) { if(letter == '_') { return 0x20; - } else if(isalpha(letter)) { + } else if(char_is_lowercase(letter)) { return (letter - 0x20); } else { return letter; From fd7620202a9e50e8c8c54746a600ba3b9809869f Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Fri, 24 Feb 2023 00:49:41 +0000 Subject: [PATCH 333/506] Keyboard long press first char for lowercase --- applications/services/gui/modules/text_input.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/applications/services/gui/modules/text_input.c b/applications/services/gui/modules/text_input.c index ebe32b7a5..5fd306aa6 100644 --- a/applications/services/gui/modules/text_input.c +++ b/applications/services/gui/modules/text_input.c @@ -237,7 +237,7 @@ static void text_input_view_draw_callback(Canvas* canvas, void* _model) { canvas_set_color(canvas, ColorBlack); } - if((model->clear_default_text || text_length == 0) && char_is_lowercase(keys[column].text)) { + if(model->clear_default_text || text_length == 0) { canvas_draw_glyph( canvas, keyboard_origin_x + keys[column].x, @@ -324,7 +324,7 @@ static void text_input_handle_ok(TextInput* text_input, TextInputModel* model, b text_length = 0; } if(text_length < (model->text_buffer_size - 1)) { - if(shift || (text_length == 0 && char_is_lowercase(selected))) { + if(shift != (text_length == 0)) { selected = char_to_uppercase(selected); } model->text_buffer[text_length] = selected; From f8eda660d2e5a47bf631e1d33382285c6cf3c7a0 Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Fri, 24 Feb 2023 00:49:41 +0000 Subject: [PATCH 334/506] Keyboard long press first char for lowercase --- applications/services/gui/modules/text_input.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/applications/services/gui/modules/text_input.c b/applications/services/gui/modules/text_input.c index ebe32b7a5..5fd306aa6 100644 --- a/applications/services/gui/modules/text_input.c +++ b/applications/services/gui/modules/text_input.c @@ -237,7 +237,7 @@ static void text_input_view_draw_callback(Canvas* canvas, void* _model) { canvas_set_color(canvas, ColorBlack); } - if((model->clear_default_text || text_length == 0) && char_is_lowercase(keys[column].text)) { + if(model->clear_default_text || text_length == 0) { canvas_draw_glyph( canvas, keyboard_origin_x + keys[column].x, @@ -324,7 +324,7 @@ static void text_input_handle_ok(TextInput* text_input, TextInputModel* model, b text_length = 0; } if(text_length < (model->text_buffer_size - 1)) { - if(shift || (text_length == 0 && char_is_lowercase(selected))) { + if(shift != (text_length == 0)) { selected = char_to_uppercase(selected); } model->text_buffer[text_length] = selected; From 86da6a7ffe4429a1ff58db540237a3ff0dd88efe Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Fri, 24 Feb 2023 04:15:32 +0300 Subject: [PATCH 335/506] Update changelog --- CHANGELOG.md | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 96f3c65d6..d9fd54ba0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,12 +1,19 @@ ### New changes -* SubGHz: **Nice ON2E (Nice One)** support (by @assasinfil | PR #335) -* SubGHz: Remove 467.75 From freq analyzer since it has too much noise (Frequency is still can be used, just excluded from FA to avoid false detections) -* Archive and FileBrowser: **Fixed more navigation issues** (by @Willy-JL | PR #334) -* Plugins -> SubGHz Bruteforcer: Fix Linear Delta 3 repeats (now its more stable and we will be sure signal is received correctly) -* Plugins: Updated TOTP (Authenticator) [(by akopachov)](https://github.com/akopachov/flipper-zero_authenticator) -* OFW: **Fix Cyfral & Metakom emulation (My temp fix removed and proper fix from OFW applied)** -* OFW: BadUSB: disable CDC mode, USB mode switch fix -* OFW: Updater visual fixes +* Desktop: Autolock with PIN Code (by @Willy-JL | PR #338) - **Desktop settings (pin code, favourite app, autolock time) will be resetted!!! Only one time after installing - due to changes in settings structure, after installing of this release desktop settings will not be reset with next release** +* Desktop: Faster back button hold time for power off, was 2 seconds, now 1.3sec +* GUI: Fix keyboard capitalization bug (by @Willy-JL | PR #362) (fixes #361) +* Plugins: Added **SWD Probe** [(by g3gg0)](https://github.com/g3gg0/flipper-swd_probe) (moved from extra pack into main FW) +* Plugins: Show RSSI in Weather Station app and in POCSAG Pager app +* Plugins: Improve Tetris fall speed algorithm (by @p3ngu19z | PR #343) +* Plugins: Add missing buttons into HID app, remove old keyboard app, move Bluetooth remote to Misc +* Infrared: Assets update (by @amec0e | PR #340 / #357 / #358) +* Misc: Typo combing (by @Round-Pi | PR #352) +* OFW: Dolphin: drop holiday animation +* OFW: fbt: FBT_QUIET option; docs on environment +* OFW: Delete rwfiletest.bin on exit SDcard benchmark +* OFW: Re-init NFC when starting the worker +* OFW: Up toolchain version to 21 +* OFW: Display Mifare Classic data in NFC app #### [🎲 Download latest extra apps pack](https://download-directory.github.io/?url=https://github.com/xMasterX/unleashed-extra-pack/tree/main/apps) From 568e27159977fb2b38c94e4fc02c6da33f037f0d Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Fri, 24 Feb 2023 01:17:14 +0000 Subject: [PATCH 336/506] Remove game xp from SWD probe (fix build) --- applications/plugins/swd_probe/swd_probe_app.c | 2 -- applications/plugins/swd_probe/swd_probe_app.h | 3 +-- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/applications/plugins/swd_probe/swd_probe_app.c b/applications/plugins/swd_probe/swd_probe_app.c index 0561cbde7..2d3beaa7c 100644 --- a/applications/plugins/swd_probe/swd_probe_app.c +++ b/applications/plugins/swd_probe/swd_probe_app.c @@ -2793,8 +2793,6 @@ int32_t swd_probe_app_main(void* p) { DBGS("swd_execute_script"); swd_execute_script(app, ANY_PATH("swd_scripts/startup.swd")); - DOLPHIN_DEED(DolphinDeedPluginGameStart); - DBGS("processing"); for(bool processing = true; processing;) { swd_main_loop(app); diff --git a/applications/plugins/swd_probe/swd_probe_app.h b/applications/plugins/swd_probe/swd_probe_app.h index 152088925..93e4aa360 100644 --- a/applications/plugins/swd_probe/swd_probe_app.h +++ b/applications/plugins/swd_probe/swd_probe_app.h @@ -15,7 +15,6 @@ #include #include #include -#include #include #include #include @@ -230,4 +229,4 @@ typedef struct { uint8_t swd_read_memory(AppFSM* const ctx, uint8_t ap, uint32_t address, uint32_t* data); -#endif \ No newline at end of file +#endif From c8e9e9bc9ef1926c529b8956c4fd50b89ce8f405 Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Fri, 24 Feb 2023 04:02:09 +0000 Subject: [PATCH 337/506] Secondary symbol keyboard pane + switch key Original idea & code by @edrethardo, update and fix by @Willy-JL --- .../services/gui/modules/text_input.c | 224 +++++++++++++----- .../Keyboard/KeyKeyboardSelected_10x11.png | Bin 0 -> 7210 bytes assets/icons/Keyboard/KeyKeyboard_10x11.png | Bin 0 -> 7763 bytes 3 files changed, 170 insertions(+), 54 deletions(-) create mode 100644 assets/icons/Keyboard/KeyKeyboardSelected_10x11.png create mode 100644 assets/icons/Keyboard/KeyKeyboard_10x11.png diff --git a/applications/services/gui/modules/text_input.c b/applications/services/gui/modules/text_input.c index 5fd306aa6..432a2e10c 100644 --- a/applications/services/gui/modules/text_input.c +++ b/applications/services/gui/modules/text_input.c @@ -14,6 +14,11 @@ typedef struct { const uint8_t y; } TextInputKey; +typedef struct { + const TextInputKey* rows[3]; + const uint8_t keyboard_index; +} Keyboard; + typedef struct { const char* header; char* text_buffer; @@ -25,6 +30,7 @@ typedef struct { uint8_t selected_row; uint8_t selected_column; + uint8_t selected_keyboard; TextInputValidatorCallback validator_callback; void* validator_callback_context; @@ -35,9 +41,12 @@ typedef struct { static const uint8_t keyboard_origin_x = 1; static const uint8_t keyboard_origin_y = 29; static const uint8_t keyboard_row_count = 3; +static const uint8_t keyboard_count = 2; + #define ENTER_KEY '\r' #define BACKSPACE_KEY '\b' +#define SWITCH_KEYBOARD_KEY 0xfe static const TextInputKey keyboard_keys_row_1[] = { {'q', 1, 8}, @@ -73,54 +82,140 @@ static const TextInputKey keyboard_keys_row_2[] = { }; static const TextInputKey keyboard_keys_row_3[] = { - {'z', 1, 32}, - {'x', 10, 32}, - {'c', 19, 32}, - {'v', 28, 32}, - {'b', 37, 32}, - {'n', 46, 32}, - {'m', 55, 32}, - {'_', 64, 32}, + {SWITCH_KEYBOARD_KEY, 1, 23}, + {'z', 13, 32}, + {'x', 21, 32}, + {'c', 28, 32}, + {'v', 36, 32}, + {'b', 44, 32}, + {'n', 52, 32}, + {'m', 59, 32}, + {'_', 67, 32}, {ENTER_KEY, 74, 23}, {'7', 100, 32}, {'8', 110, 32}, {'9', 120, 32}, }; -static uint8_t get_row_size(uint8_t row_index) { - uint8_t row_size = 0; +static const TextInputKey symbol_keyboard_keys_row_1[] = { + {'!', 1, 8}, + {'"', 10, 8}, + {'#', 19, 8}, + {'$', 28, 8}, + {'%', 37, 8}, + {'&', 46, 8}, + {'/', 55, 8}, + {'(', 64, 8}, + {')', 73, 8}, + {'=', 82, 8}, + {'0', 91, 8}, + {'1', 100, 8}, + {'2', 110, 8}, + {'3', 120, 8}, +}; - switch(row_index + 1) { - case 1: - row_size = COUNT_OF(keyboard_keys_row_1); - break; - case 2: - row_size = COUNT_OF(keyboard_keys_row_2); - break; - case 3: - row_size = COUNT_OF(keyboard_keys_row_3); - break; - default: - furi_crash(NULL); +static const TextInputKey symbol_keyboard_keys_row_2[] = { + {'{', 1, 20}, + {'}', 10, 20}, + {'[', 19, 20}, + {']', 28, 20}, + {'<', 37, 20}, + {'>', 46, 20}, + {'\\', 55, 20}, + {'@', 64, 20}, + {'?', 73, 20}, + {BACKSPACE_KEY, 82, 12}, + {'4', 100, 20}, + {'5', 110, 20}, + {'6', 120, 20}, +}; + +static const TextInputKey symbol_keyboard_keys_row_3[] = { + {SWITCH_KEYBOARD_KEY, 1, 23}, + {'+', 13, 32}, + {'`', 21, 32}, + {'\'',28, 32}, + {'^', 36, 32}, + {'*', 44, 32}, + {',', 52, 32}, + {'.', 59, 32}, + {'-', 67, 32}, + {ENTER_KEY, 74, 23}, + {'7', 100, 32}, + {'8', 110, 32}, + {'9', 120, 32}, +}; + + +static const Keyboard keyboard = { + .rows = { + keyboard_keys_row_1, + keyboard_keys_row_2, + keyboard_keys_row_3, + }, + .keyboard_index = 0, +}; + +static const Keyboard symbol_keyboard = { + .rows = { + symbol_keyboard_keys_row_1, + symbol_keyboard_keys_row_2, + symbol_keyboard_keys_row_3, + }, + .keyboard_index = 1, +}; + + +static const Keyboard* keyboards[] = { + &keyboard, + &symbol_keyboard, +}; + +static void switch_keyboard(TextInputModel* model) +{ + model->selected_keyboard = (model->selected_keyboard + 1) % keyboard_count; +} + +static uint8_t get_row_size(const Keyboard* keyboard, uint8_t row_index) { + uint8_t row_size = 0; + if(keyboard == &symbol_keyboard) { + switch(row_index + 1) { + case 1: + row_size = COUNT_OF(symbol_keyboard_keys_row_1); + break; + case 2: + row_size = COUNT_OF(symbol_keyboard_keys_row_2); + break; + case 3: + row_size = COUNT_OF(symbol_keyboard_keys_row_3); + break; + default: + furi_crash(NULL); + } + } else { + switch(row_index + 1) { + case 1: + row_size = COUNT_OF(keyboard_keys_row_1); + break; + case 2: + row_size = COUNT_OF(keyboard_keys_row_2); + break; + case 3: + row_size = COUNT_OF(keyboard_keys_row_3); + break; + default: + furi_crash(NULL); + } } return row_size; } -static const TextInputKey* get_row(uint8_t row_index) { +static const TextInputKey* get_row(const Keyboard* keyboard, uint8_t row_index) { const TextInputKey* row = NULL; - - switch(row_index + 1) { - case 1: - row = keyboard_keys_row_1; - break; - case 2: - row = keyboard_keys_row_2; - break; - case 3: - row = keyboard_keys_row_3; - break; - default: + if(row_index < 3) { + row = keyboard->rows[row_index]; + } else { furi_crash(NULL); } @@ -128,7 +223,7 @@ static const TextInputKey* get_row(uint8_t row_index) { } static char get_selected_char(TextInputModel* model) { - return get_row(model->selected_row)[model->selected_column].text; + return get_row(keyboards[model->selected_keyboard], model->selected_row)[model->selected_column].text; } static bool char_is_lowercase(char letter) { @@ -189,8 +284,8 @@ static void text_input_view_draw_callback(Canvas* canvas, void* _model) { canvas_set_font(canvas, FontKeyboard); for(uint8_t row = 0; row < keyboard_row_count; row++) { - const uint8_t column_count = get_row_size(row); - const TextInputKey* keys = get_row(row); + const uint8_t column_count = get_row_size(keyboards[model->selected_keyboard], row); + const TextInputKey* keys = get_row(keyboards[model->selected_keyboard], row); for(size_t column = 0; column < column_count; column++) { if(keys[column].text == ENTER_KEY) { @@ -208,6 +303,21 @@ static void text_input_view_draw_callback(Canvas* canvas, void* _model) { keyboard_origin_y + keys[column].y, &I_KeySave_24x11); } + } else if(keys[column].text == SWITCH_KEYBOARD_KEY) { + canvas_set_color(canvas, ColorBlack); + if(model->selected_row == row && model->selected_column == column) { + canvas_draw_icon( + canvas, + keyboard_origin_x + keys[column].x, + keyboard_origin_y + keys[column].y, + &I_KeyKeyboardSelected_10x11); + } else { + canvas_draw_icon( + canvas, + keyboard_origin_x + keys[column].x, + keyboard_origin_y + keys[column].y, + &I_KeyKeyboard_10x11); + } } else if(keys[column].text == BACKSPACE_KEY) { canvas_set_color(canvas, ColorBlack); if(model->selected_row == row && model->selected_column == column) { @@ -270,7 +380,7 @@ static void text_input_handle_up(TextInput* text_input, TextInputModel* model) { UNUSED(text_input); if(model->selected_row > 0) { model->selected_row--; - if(model->selected_column > get_row_size(model->selected_row) - 6) { + if(model->selected_column > get_row_size(keyboards[model->selected_keyboard], model->selected_row) - 6) { model->selected_column = model->selected_column + 1; } } @@ -280,7 +390,7 @@ static void text_input_handle_down(TextInput* text_input, TextInputModel* model) UNUSED(text_input); if(model->selected_row < keyboard_row_count - 1) { model->selected_row++; - if(model->selected_column > get_row_size(model->selected_row) - 4) { + if(model->selected_column > get_row_size(keyboards[model->selected_keyboard], model->selected_row) - 4) { model->selected_column = model->selected_column - 1; } } @@ -291,13 +401,13 @@ static void text_input_handle_left(TextInput* text_input, TextInputModel* model) if(model->selected_column > 0) { model->selected_column--; } else { - model->selected_column = get_row_size(model->selected_row) - 1; + model->selected_column = get_row_size(keyboards[model->selected_keyboard], model->selected_row) - 1; } } static void text_input_handle_right(TextInput* text_input, TextInputModel* model) { UNUSED(text_input); - if(model->selected_column < get_row_size(model->selected_row) - 1) { + if(model->selected_column < get_row_size(keyboards[model->selected_keyboard], model->selected_row) - 1) { model->selected_column++; } else { model->selected_column = 0; @@ -317,21 +427,25 @@ static void text_input_handle_ok(TextInput* text_input, TextInputModel* model, b } else if(model->callback != 0 && text_length > 0) { model->callback(model->callback_context); } - } else if(selected == BACKSPACE_KEY) { - text_input_backspace_cb(model); + } else if(selected == SWITCH_KEYBOARD_KEY) { + switch_keyboard(model); } else { - if(model->clear_default_text) { - text_length = 0; - } - if(text_length < (model->text_buffer_size - 1)) { - if(shift != (text_length == 0)) { - selected = char_to_uppercase(selected); + if(selected == BACKSPACE_KEY) { + text_input_backspace_cb(model); + } else { + if(model->clear_default_text) { + text_length = 0; + } + if(text_length < (model->text_buffer_size - 1)) { + if(shift != (text_length == 0)) { + selected = char_to_uppercase(selected); + } + model->text_buffer[text_length] = selected; + model->text_buffer[text_length + 1] = 0; } - model->text_buffer[text_length] = selected; - model->text_buffer[text_length + 1] = 0; } + model->clear_default_text = false; } - model->clear_default_text = false; } static bool text_input_view_input_callback(InputEvent* event, void* context) { @@ -483,6 +597,7 @@ void text_input_reset(TextInput* text_input) { model->header = ""; model->selected_row = 0; model->selected_column = 0; + model->selected_keyboard = 0; model->clear_default_text = false; model->text_buffer = NULL; model->text_buffer_size = 0; @@ -520,7 +635,8 @@ void text_input_set_result_callback( if(text_buffer && text_buffer[0] != '\0') { // Set focus on Save model->selected_row = 2; - model->selected_column = 8; + model->selected_column = 9; + model->selected_keyboard = 0; } }, true); diff --git a/assets/icons/Keyboard/KeyKeyboardSelected_10x11.png b/assets/icons/Keyboard/KeyKeyboardSelected_10x11.png new file mode 100644 index 0000000000000000000000000000000000000000..231880386a9d9e83911088c9fcd083f84a7f75bb GIT binary patch literal 7210 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 literal 0 HcmV?d00001 diff --git a/assets/icons/Keyboard/KeyKeyboard_10x11.png b/assets/icons/Keyboard/KeyKeyboard_10x11.png new file mode 100644 index 0000000000000000000000000000000000000000..1f4c03478f68cb15c74ef99888ce4faf50e0a140 GIT binary patch literal 7763 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 Date: Fri, 24 Feb 2023 04:03:12 +0000 Subject: [PATCH 338/506] Fix rounded corner on keyboard save button --- .../icons/Keyboard/KeySaveSelected_24x11.png | Bin 1853 -> 8011 bytes assets/icons/Keyboard/KeySave_24x11.png | Bin 1863 -> 8330 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/icons/Keyboard/KeySaveSelected_24x11.png b/assets/icons/Keyboard/KeySaveSelected_24x11.png index eeb3569d3accc5a5c56829b12c85079172b56729..6e5c9ac076287ff9110788ee7000aa5fb864f174 100644 GIT binary patch literal 8011 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 delta 615 zcmX?Yx0i2%q#_do1H-HETeE-^XMsm#F#`j)FbFd;%$g&?z`)i&`5CW2qrzk}K3xaL zl>DSrg$UmO1?T*tR0T6V1Knf;10w}w&53@yq@25awxx! z08p~P%DE^tu_V7JBtJiAa)hwrWELUq$$>&*lO=@2CpQX-fM^boLSJ7i&&l6}Ehak) z_)Wep;31(#8IXksPAvF(ZUy+i% z-Sceq_rRzQ@pN$v(U|yj(nhWZ2OekPkN@j`T8gZm&}7cRm*!Qin0cD>0zbo-Wpgy{ zoekmBJL$go%hWBVoA=iJn3J(z{Aud%iyEfkv7BpP9C+0uyIy;u{G+M!d1aP;3piiY SQgsDr0fVQjpUXO@geCx<3(EZf diff --git a/assets/icons/Keyboard/KeySave_24x11.png b/assets/icons/Keyboard/KeySave_24x11.png index e7dba987a04dad7dd96001913c55566dbde96c8e..6945c7e8f8f935d790c5870b9ad28847680c2b6d 100644 GIT binary patch literal 8330 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 Q{(_69MpndY273?x4?FT~g#Z8m delta 633 zcmeBjJkB>kQjv*)f#Fs7tyw^dv%n*=n1O*?7=#%aX3ddcU|{Q?titcls4%&NU)RAg zB|j-uA;LF6!8yMuRl!WpKsVXIz(~Q|QqR!L#Kg=%N5ROz$Uxt~RNv4@*U-$$z{JYX zTmcG{>?ZHvcbfc%Uye(mA~z?m*s3D8V6vg0*klI*4o0QPasqmj0|e|RzZEc@JXt_T z0H~@dt@;@QX$q7PY%61Ai5Pcq* z#Xy@Xf&8MBG^^m$LMSUIbF#dM_+%Rqhsk?I)F(HIn9A$Jr4))wT+2$V5|c|Z^Yd(# ziWAFHQfPSCqEREsfP-=q!uR^Wfp*JhnX7W;s#lqPdXD_A59rM&y3iCL`!tr3Y*vaHW zybO0*JSKgy2&!Lm=D Date: Fri, 24 Feb 2023 04:46:14 +0000 Subject: [PATCH 339/506] Keyboard hold backspace to keep deleting --- applications/services/gui/modules/text_input.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/applications/services/gui/modules/text_input.c b/applications/services/gui/modules/text_input.c index 432a2e10c..06ee5953a 100644 --- a/applications/services/gui/modules/text_input.c +++ b/applications/services/gui/modules/text_input.c @@ -414,7 +414,9 @@ static void text_input_handle_right(TextInput* text_input, TextInputModel* model } } -static void text_input_handle_ok(TextInput* text_input, TextInputModel* model, bool shift) { +static void text_input_handle_ok(TextInput* text_input, TextInputModel* model, InputType type) { + bool shift = type == InputTypeLong; + bool repeat = type == InputTypeRepeat; char selected = get_selected_char(model); size_t text_length = strlen(model->text_buffer); @@ -432,7 +434,7 @@ static void text_input_handle_ok(TextInput* text_input, TextInputModel* model, b } else { if(selected == BACKSPACE_KEY) { text_input_backspace_cb(model); - } else { + } else if(!repeat) { if(model->clear_default_text) { text_length = 0; } @@ -477,7 +479,7 @@ static bool text_input_view_input_callback(InputEvent* event, void* context) { text_input_handle_right(text_input, model); break; case InputKeyOk: - text_input_handle_ok(text_input, model, false); + text_input_handle_ok(text_input, model, event->type); break; default: consumed = false; @@ -499,7 +501,7 @@ static bool text_input_view_input_callback(InputEvent* event, void* context) { text_input_handle_right(text_input, model); break; case InputKeyOk: - text_input_handle_ok(text_input, model, true); + text_input_handle_ok(text_input, model, event->type); break; case InputKeyBack: text_input_backspace_cb(model); @@ -523,6 +525,9 @@ static bool text_input_view_input_callback(InputEvent* event, void* context) { case InputKeyRight: text_input_handle_right(text_input, model); break; + case InputKeyOk: + text_input_handle_ok(text_input, model, event->type); + break; case InputKeyBack: text_input_backspace_cb(model); break; From 62dd0aded2f76d69c33578a4695678ebe99a4b8b Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Sat, 25 Feb 2023 03:25:31 +0000 Subject: [PATCH 340/506] Subtly show PIN in BadKB --- applications/main/bad_kb/bad_kb_script.h | 1 + applications/main/bad_kb/views/bad_kb_view.c | 9 +++++++++ applications/services/bt/bt_service/bt.c | 4 ++++ applications/services/bt/bt_service/bt_i.h | 1 + 4 files changed, 15 insertions(+) diff --git a/applications/main/bad_kb/bad_kb_script.h b/applications/main/bad_kb/bad_kb_script.h index 0ea701eb8..0773cf05e 100644 --- a/applications/main/bad_kb/bad_kb_script.h +++ b/applications/main/bad_kb/bad_kb_script.h @@ -23,6 +23,7 @@ typedef enum { typedef struct { BadKbWorkerState state; + uint32_t pin; uint16_t line_cur; uint16_t line_nb; uint32_t delay_remain; diff --git a/applications/main/bad_kb/views/bad_kb_view.c b/applications/main/bad_kb/views/bad_kb_view.c index 1ffe58e9c..1e131a1ee 100644 --- a/applications/main/bad_kb/views/bad_kb_view.c +++ b/applications/main/bad_kb/views/bad_kb_view.c @@ -1,5 +1,6 @@ #include "bad_kb_view.h" #include "../bad_kb_script.h" +#include "../bad_kb_app_i.h" #include #include #include @@ -38,6 +39,9 @@ static void bad_kb_draw_callback(Canvas* canvas, void* _model) { furi_string_push_back(disp_str, model->layout[i]); furi_string_push_back(disp_str, ')'); } + if(model->state.pin) { + furi_string_cat_printf(disp_str, " PIN: %ld", model->state.pin); + } elements_string_fit_width(canvas, disp_str, 128 - 2); canvas_draw_str( canvas, 2, 8 + canvas_current_font_height(canvas), furi_string_get_cstr(disp_str)); @@ -214,6 +218,11 @@ void bad_kb_set_layout(BadKb* bad_kb, const char* layout) { void bad_kb_set_state(BadKb* bad_kb, BadKbState* st) { furi_assert(st); + if(bad_kb->context != NULL && ((BadKbApp*)bad_kb->context)->bt != NULL) { + st->pin = ((BadKbApp*)bad_kb->context)->bt->pin; + } else { + st->pin = 0; + } with_view_model( bad_kb->view, BadKbModel * model, diff --git a/applications/services/bt/bt_service/bt.c b/applications/services/bt/bt_service/bt.c index 7abef0e68..2d97ea7e5 100644 --- a/applications/services/bt/bt_service/bt.c +++ b/applications/services/bt/bt_service/bt.c @@ -76,6 +76,7 @@ static void bt_pin_code_hide(Bt* bt) { static bool bt_pin_code_verify_event_handler(Bt* bt, uint32_t pin) { furi_assert(bt); + bt->pin = pin; if(bt_get_profile_pairing_method(bt) == GapPairingNone) return true; @@ -154,6 +155,8 @@ Bt* bt_alloc() { // API evnent bt->api_event = furi_event_flag_alloc(); + bt->pin = 0; + return bt; } @@ -219,6 +222,7 @@ static bool bt_on_gap_event_callback(GapEvent event, void* context) { furi_assert(context); Bt* bt = context; bool ret = false; + bt->pin = 0; if(event.type == GapEventTypeConnected) { // Update status bar diff --git a/applications/services/bt/bt_service/bt_i.h b/applications/services/bt/bt_service/bt_i.h index c8a0e9965..8b81b6e51 100644 --- a/applications/services/bt/bt_service/bt_i.h +++ b/applications/services/bt/bt_service/bt_i.h @@ -76,4 +76,5 @@ struct Bt { FuriEventFlag* api_event; BtStatusChangedCallback status_changed_cb; void* status_changed_ctx; + uint32_t pin; }; From 82ad44a8631bd9fa9c9876d519500f8e331446aa Mon Sep 17 00:00:00 2001 From: Konstantin Volkov <72250702+doomwastaken@users.noreply.github.com> Date: Sat, 25 Feb 2023 15:05:02 +0300 Subject: [PATCH 341/506] changed updater and unit benches (#2427) * changed updater and unit benches * switched flipper name from macos style to searching Co-authored-by: Konstantin Volkov --- .github/workflows/unit_tests.yml | 2 +- .github/workflows/updater_test.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/unit_tests.yml b/.github/workflows/unit_tests.yml index 7e625229a..527e9a71e 100644 --- a/.github/workflows/unit_tests.yml +++ b/.github/workflows/unit_tests.yml @@ -10,7 +10,7 @@ env: jobs: run_units_on_bench: - runs-on: [self-hosted, FlipperZeroTest] + runs-on: [self-hosted, FlipperZeroUnitTest] steps: - name: 'Decontaminate previous build leftovers' run: | diff --git a/.github/workflows/updater_test.yml b/.github/workflows/updater_test.yml index 0b02920fa..300440aae 100644 --- a/.github/workflows/updater_test.yml +++ b/.github/workflows/updater_test.yml @@ -10,7 +10,7 @@ env: jobs: test_updater_on_bench: - runs-on: [self-hosted, FlipperZeroTestMac1] + runs-on: [self-hosted, FlipperZeroUpdaterTest] steps: - name: 'Decontaminate previous build leftovers' run: | @@ -27,7 +27,7 @@ jobs: - name: 'Get flipper from device manager (mock)' id: device run: | - echo "flipper=/dev/tty.usbmodemflip_Rekigyn1" >> $GITHUB_OUTPUT + echo "flipper=Rekigyn" >> $GITHUB_OUTPUT echo "stlink=0F020D026415303030303032" >> $GITHUB_OUTPUT - name: 'Flashing target firmware' From 203adabc46ff70f7179de849c165001dd6c1abaa Mon Sep 17 00:00:00 2001 From: Mathie <62908057+MathieDev@users.noreply.github.com> Date: Sat, 25 Feb 2023 08:41:49 -0500 Subject: [PATCH 342/506] Update update.py (#2426) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixed grammar mistake Co-authored-by: あく --- scripts/update.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/update.py b/scripts/update.py index 3259c5b09..2b0157260 100755 --- a/scripts/update.py +++ b/scripts/update.py @@ -199,7 +199,7 @@ class Main(App): def disclaimer(self): self.logger.error( - "You might brick you device into a state in which you'd need an SWD programmer to fix it." + "You might brick your device into a state in which you'd need an SWD programmer to fix it." ) self.logger.error( "Please confirm that you REALLY want to do that with --I-understand-what-I-am-doing=yes" From e999c3574977db5243cf011d21673b4d1a929819 Mon Sep 17 00:00:00 2001 From: Logandev_ Date: Sat, 25 Feb 2023 05:49:53 -0800 Subject: [PATCH 343/506] Grammar fix in CLI (#2390) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fixed grammar * Update cli_commands.c: made it a little nicer Co-authored-by: あく --- applications/services/cli/cli_commands.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/applications/services/cli/cli_commands.c b/applications/services/cli/cli_commands.c index 4414d365f..b0f1bdbdf 100644 --- a/applications/services/cli/cli_commands.c +++ b/applications/services/cli/cli_commands.c @@ -31,7 +31,7 @@ void cli_command_device_info(Cli* cli, FuriString* args, void* context) { void cli_command_help(Cli* cli, FuriString* args, void* context) { UNUSED(args); UNUSED(context); - printf("Commands we have:"); + printf("Commands available:"); // Command count const size_t commands_count = CliCommandTree_size(cli->commands); @@ -61,9 +61,9 @@ void cli_command_help(Cli* cli, FuriString* args, void* context) { if(furi_string_size(args) > 0) { cli_nl(); - printf("Also I have no clue what '"); + printf("`"); printf("%s", furi_string_get_cstr(args)); - printf("' is."); + printf("` command not found"); } } From eaf965c66f7e57855f2cd9be8247882070bf6453 Mon Sep 17 00:00:00 2001 From: n30f0x <87524177+n30f0x@users.noreply.github.com> Date: Sat, 25 Feb 2023 20:34:48 +0300 Subject: [PATCH 344/506] BadUsb: STRINGDELAY feature, worker signal handling refactoring (#2269) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * BadUsb: Added stringdelay feature * BadUsb: added stringdelay feature, fixed delay * BadUsb: fix cursed delay structure * BadUsb: long delay check added * BadUsb: long delay distribution * furi_delay_ms(0) edgecase fix, add documentation entry * additional documentation entry * BadUsb: get rid of bad logic, fixed documentation * BadUSB script: fix events handling * Delay value fix * Script execution fix Co-authored-by: あく Co-authored-by: nminaylov --- applications/main/bad_usb/bad_usb_script.c | 81 ++++++++++++++----- .../scenes/bad_usb_scene_file_select.c | 2 - .../file_formats/BadUsbScriptFormat.md | 8 ++ 3 files changed, 69 insertions(+), 22 deletions(-) diff --git a/applications/main/bad_usb/bad_usb_script.c b/applications/main/bad_usb/bad_usb_script.c index 34dfec2ca..d66ce8a91 100644 --- a/applications/main/bad_usb/bad_usb_script.c +++ b/applications/main/bad_usb/bad_usb_script.c @@ -32,6 +32,7 @@ struct BadUsbScript { FuriString* file_path; uint32_t defdelay; uint16_t layout[128]; + uint32_t stringdelay; FuriThread* thread; uint8_t file_buf[FILE_BUFFER_LEN + 1]; uint8_t buf_start; @@ -113,6 +114,8 @@ static const char ducky_cmd_delay[] = {"DELAY "}; static const char ducky_cmd_string[] = {"STRING "}; static const char ducky_cmd_defdelay_1[] = {"DEFAULT_DELAY "}; static const char ducky_cmd_defdelay_2[] = {"DEFAULTDELAY "}; +static const char ducky_cmd_stringdelay_1[] = {"STRINGDELAY "}; +static const char ducky_cmd_stringdelay_2[] = {"STRING_DELAY "}; static const char ducky_cmd_repeat[] = {"REPEAT "}; static const char ducky_cmd_sysrq[] = {"SYSRQ "}; @@ -211,14 +214,19 @@ static bool ducky_altstring(const char* param) { static bool ducky_string(BadUsbScript* bad_usb, const char* param) { uint32_t i = 0; + while(param[i] != '\0') { uint16_t keycode = BADUSB_ASCII_TO_KEY(bad_usb, param[i]); if(keycode != HID_KEYBOARD_NONE) { furi_hal_hid_kb_press(keycode); furi_hal_hid_kb_release(keycode); + if(bad_usb->stringdelay > 0) { + furi_delay_ms(bad_usb->stringdelay); + } } i++; } + bad_usb->stringdelay = 0; return true; } @@ -277,6 +285,20 @@ static int32_t snprintf(error, error_len, "Invalid number %s", line_tmp); } return (state) ? (0) : SCRIPT_STATE_ERROR; + } else if( + (strncmp(line_tmp, ducky_cmd_stringdelay_1, strlen(ducky_cmd_stringdelay_1)) == 0) || + (strncmp(line_tmp, ducky_cmd_stringdelay_2, strlen(ducky_cmd_stringdelay_2)) == 0)) { + //STRINGDELAY, finally it's here + line_tmp = &line_tmp[ducky_get_command_len(line_tmp) + 1]; + state = ducky_get_number(line_tmp, &bad_usb->stringdelay); + if((state) && (bad_usb->stringdelay > 0)) { + return state; + } + if(error != NULL) { + snprintf(error, error_len, "Invalid number %s", line_tmp); + } + return SCRIPT_STATE_ERROR; + } else if(strncmp(line_tmp, ducky_cmd_string, strlen(ducky_cmd_string)) == 0) { // STRING line_tmp = &line_tmp[ducky_get_command_len(line_tmp) + 1]; @@ -484,6 +506,19 @@ static void bad_usb_hid_state_callback(bool state, void* context) { furi_thread_flags_set(furi_thread_get_id(bad_usb->thread), WorkerEvtDisconnect); } +static uint32_t bad_usb_flags_get(uint32_t flags_mask, uint32_t timeout) { + uint32_t flags = furi_thread_flags_get(); + furi_check((flags & FuriFlagError) == 0); + if(flags == 0) { + flags = furi_thread_flags_wait(flags_mask, FuriFlagWaitAny, timeout); + furi_check(((flags & FuriFlagError) == 0) || (flags == FuriFlagErrorTimeout)); + } else { + uint32_t state = furi_thread_flags_clear(flags); + furi_check((state & FuriFlagError) == 0); + } + return flags; +} + static int32_t bad_usb_worker(void* context) { BadUsbScript* bad_usb = context; @@ -520,11 +555,9 @@ static int32_t bad_usb_worker(void* context) { bad_usb->st.state = worker_state; } else if(worker_state == BadUsbStateNotConnected) { // State: USB not connected - uint32_t flags = furi_thread_flags_wait( - WorkerEvtEnd | WorkerEvtConnect | WorkerEvtToggle, - FuriFlagWaitAny, - FuriWaitForever); - furi_check((flags & FuriFlagError) == 0); + uint32_t flags = bad_usb_flags_get( + WorkerEvtEnd | WorkerEvtConnect | WorkerEvtToggle, FuriWaitForever); + if(flags & WorkerEvtEnd) { break; } else if(flags & WorkerEvtConnect) { @@ -535,11 +568,9 @@ static int32_t bad_usb_worker(void* context) { bad_usb->st.state = worker_state; } else if(worker_state == BadUsbStateIdle) { // State: ready to start - uint32_t flags = furi_thread_flags_wait( - WorkerEvtEnd | WorkerEvtToggle | WorkerEvtDisconnect, - FuriFlagWaitAny, - FuriWaitForever); - furi_check((flags & FuriFlagError) == 0); + uint32_t flags = bad_usb_flags_get( + WorkerEvtEnd | WorkerEvtToggle | WorkerEvtDisconnect, FuriWaitForever); + if(flags & WorkerEvtEnd) { break; } else if(flags & WorkerEvtToggle) { // Start executing script @@ -548,6 +579,7 @@ static int32_t bad_usb_worker(void* context) { bad_usb->buf_len = 0; bad_usb->st.line_cur = 0; bad_usb->defdelay = 0; + bad_usb->stringdelay = 0; bad_usb->repeat_cnt = 0; bad_usb->file_end = false; storage_file_seek(script_file, 0, true); @@ -558,11 +590,9 @@ static int32_t bad_usb_worker(void* context) { bad_usb->st.state = worker_state; } else if(worker_state == BadUsbStateWillRun) { // State: start on connection - uint32_t flags = furi_thread_flags_wait( - WorkerEvtEnd | WorkerEvtConnect | WorkerEvtToggle, - FuriFlagWaitAny, - FuriWaitForever); - furi_check((flags & FuriFlagError) == 0); + uint32_t flags = bad_usb_flags_get( + WorkerEvtEnd | WorkerEvtConnect | WorkerEvtToggle, FuriWaitForever); + if(flags & WorkerEvtEnd) { break; } else if(flags & WorkerEvtConnect) { // Start executing script @@ -571,12 +601,22 @@ static int32_t bad_usb_worker(void* context) { bad_usb->buf_len = 0; bad_usb->st.line_cur = 0; bad_usb->defdelay = 0; + bad_usb->stringdelay = 0; bad_usb->repeat_cnt = 0; bad_usb->file_end = false; storage_file_seek(script_file, 0, true); // extra time for PC to recognize Flipper as keyboard - furi_thread_flags_wait(0, FuriFlagWaitAny, 1500); - worker_state = BadUsbStateRunning; + flags = furi_thread_flags_wait( + WorkerEvtEnd | WorkerEvtDisconnect | WorkerEvtToggle, + FuriFlagWaitAny | FuriFlagNoClear, + 1500); + if(flags == FuriFlagErrorTimeout) { + // If nothing happened - start script execution + worker_state = BadUsbStateRunning; + } else if(flags & WorkerEvtToggle) { + worker_state = BadUsbStateIdle; + furi_thread_flags_clear(WorkerEvtToggle); + } } else if(flags & WorkerEvtToggle) { // Cancel scheduled execution worker_state = BadUsbStateNotConnected; } @@ -586,6 +626,7 @@ static int32_t bad_usb_worker(void* context) { uint16_t delay_cur = (delay_val > 1000) ? (1000) : (delay_val); uint32_t flags = furi_thread_flags_wait( WorkerEvtEnd | WorkerEvtToggle | WorkerEvtDisconnect, FuriFlagWaitAny, delay_cur); + delay_val -= delay_cur; if(!(flags & FuriFlagError)) { if(flags & WorkerEvtEnd) { @@ -629,9 +670,9 @@ static int32_t bad_usb_worker(void* context) { } else if( (worker_state == BadUsbStateFileError) || (worker_state == BadUsbStateScriptError)) { // State: error - uint32_t flags = furi_thread_flags_wait( - WorkerEvtEnd, FuriFlagWaitAny, FuriWaitForever); // Waiting for exit command - furi_check((flags & FuriFlagError) == 0); + uint32_t flags = + bad_usb_flags_get(WorkerEvtEnd, FuriWaitForever); // Waiting for exit command + if(flags & WorkerEvtEnd) { break; } diff --git a/applications/main/bad_usb/scenes/bad_usb_scene_file_select.c b/applications/main/bad_usb/scenes/bad_usb_scene_file_select.c index b04669252..d6f05a1ed 100644 --- a/applications/main/bad_usb/scenes/bad_usb_scene_file_select.c +++ b/applications/main/bad_usb/scenes/bad_usb_scene_file_select.c @@ -22,7 +22,6 @@ static bool bad_usb_file_select(BadUsbApp* bad_usb) { void bad_usb_scene_file_select_on_enter(void* context) { BadUsbApp* bad_usb = context; - furi_hal_usb_disable(); if(bad_usb->bad_usb_script) { bad_usb_script_close(bad_usb->bad_usb_script); bad_usb->bad_usb_script = NULL; @@ -34,7 +33,6 @@ void bad_usb_scene_file_select_on_enter(void* context) { scene_manager_next_scene(bad_usb->scene_manager, BadUsbSceneWork); } else { - furi_hal_usb_enable(); view_dispatcher_stop(bad_usb->view_dispatcher); } } diff --git a/documentation/file_formats/BadUsbScriptFormat.md b/documentation/file_formats/BadUsbScriptFormat.md index 2ef1d3135..94dee5943 100644 --- a/documentation/file_formats/BadUsbScriptFormat.md +++ b/documentation/file_formats/BadUsbScriptFormat.md @@ -75,6 +75,14 @@ Can be combined with a special key command or a single character. | ------- | ----------- | ----------------- | | STRING | Text string | Print text string | +## String delay + +Delay between keypresses. +|Command|Parameters|Notes| +|-|-|-| +|STRING_DELAY|Delay value in ms|Applied once to next appearing string| +|STRINGDELAY|Delay value in ms|Same as STRING_DELAY| + ## Repeat | Command | Parameters | Notes | From ba09da107a65b2489439d23b599c0ee4cd21b331 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sat, 25 Feb 2023 22:28:35 +0300 Subject: [PATCH 345/506] Worst code ever subghz imporvements - hold right to delete signal in read - extra buttons in saved signals - ability to change counter increase value in debug --- .../main/subghz/helpers/subghz_custom_event.h | 1 + .../scenes/subghz_scene_ext_module_settings.c | 50 ++ .../subghz/scenes/subghz_scene_receiver.c | 17 + .../scenes/subghz_scene_receiver_info.c | 3 + .../main/subghz/scenes/subghz_scene_rpc.c | 3 + .../subghz/scenes/subghz_scene_transmitter.c | 19 + applications/main/subghz/subghz_history.c | 24 + applications/main/subghz/subghz_history.h | 2 + applications/main/subghz/views/receiver.c | 48 ++ applications/main/subghz/views/transmitter.c | 128 +++++ applications/main/unirfremix/unirfremix_app.c | 3 + .../plugins/swd_probe/model/model_chip.h | 522 ++++-------------- firmware/targets/f7/api_symbols.csv | 10 + .../targets/f7/furi_hal/furi_hal_subghz.c | 9 + .../targets/f7/furi_hal/furi_hal_subghz.h | 11 + lib/subghz/protocols/alutech_at_4n.c | 130 ++++- lib/subghz/protocols/alutech_at_4n.h | 8 + lib/subghz/protocols/came_atomo.c | 2 +- lib/subghz/protocols/faac_slh.c | 2 +- lib/subghz/protocols/keeloq.c | 149 ++++- lib/subghz/protocols/keeloq.h | 7 + lib/subghz/protocols/kinggates_stylo_4k.c | 2 +- lib/subghz/protocols/nice_flor_s.c | 2 +- lib/subghz/protocols/secplus_v2.c | 2 +- lib/subghz/protocols/somfy_keytis.c | 2 +- lib/subghz/protocols/somfy_telis.c | 2 +- lib/subghz/protocols/star_line.c | 2 +- 27 files changed, 719 insertions(+), 441 deletions(-) diff --git a/applications/main/subghz/helpers/subghz_custom_event.h b/applications/main/subghz/helpers/subghz_custom_event.h index 350e68ee6..9ac4552f5 100644 --- a/applications/main/subghz/helpers/subghz_custom_event.h +++ b/applications/main/subghz/helpers/subghz_custom_event.h @@ -64,6 +64,7 @@ typedef enum { SubGhzCustomEventViewReceiverBack, SubGhzCustomEventViewReceiverOffDisplay, SubGhzCustomEventViewReceiverUnlock, + SubGhzCustomEventViewReceiverDeleteItem, SubGhzCustomEventViewReadRAWBack, SubGhzCustomEventViewReadRAWIDLE, diff --git a/applications/main/subghz/scenes/subghz_scene_ext_module_settings.c b/applications/main/subghz/scenes/subghz_scene_ext_module_settings.c index 4627c57be..86e1ff2a0 100644 --- a/applications/main/subghz/scenes/subghz_scene_ext_module_settings.c +++ b/applications/main/subghz/scenes/subghz_scene_ext_module_settings.c @@ -3,6 +3,7 @@ uint8_t value_index; uint8_t value_index2; +uint8_t value_index3; #define EXT_MODULES_COUNT (sizeof(radio_modules_variables_text) / sizeof(char* const)) const char* const radio_modules_variables_text[] = { @@ -16,6 +17,13 @@ const char* const debug_pin_text[DEBUG_P_COUNT] = { "17(1W)", }; +#define DEBUG_COUNTER_COUNT 3 +const char* const debug_counter_text[DEBUG_COUNTER_COUNT] = { + "+1", + "+5", + "+10", +}; + static void subghz_scene_ext_module_changed(VariableItem* item) { SubGhz* subghz = variable_item_get_context(item); value_index = variable_item_get_current_value_index(item); @@ -37,6 +45,26 @@ static void subghz_scene_receiver_config_set_debug_pin(VariableItem* item) { subghz->txrx->debug_pin_state = index == 1; } +static void subghz_scene_receiver_config_set_debug_counter(VariableItem* item) { + uint8_t index = variable_item_get_current_value_index(item); + + variable_item_set_current_value_text(item, debug_counter_text[index]); + + switch(index) { + case 0: + furi_hal_subghz_set_rolling_counter_mult(1); + break; + case 1: + furi_hal_subghz_set_rolling_counter_mult(5); + break; + case 2: + furi_hal_subghz_set_rolling_counter_mult(10); + break; + default: + break; + } +} + void subghz_scene_ext_module_settings_on_enter(void* context) { SubGhz* subghz = context; @@ -62,6 +90,28 @@ void subghz_scene_ext_module_settings_on_enter(void* context) { value_index2 = subghz->txrx->debug_pin_state; variable_item_set_current_value_index(item, value_index2); variable_item_set_current_value_text(item, debug_pin_text[value_index2]); + + item = variable_item_list_add( + subghz->variable_item_list, + "Counter Mult:", + DEBUG_COUNTER_COUNT, + subghz_scene_receiver_config_set_debug_counter, + subghz); + switch(furi_hal_subghz_get_rolling_counter_mult()) { + case 1: + value_index3 = 0; + break; + case 5: + value_index3 = 1; + break; + case 10: + value_index3 = 2; + break; + default: + break; + } + variable_item_set_current_value_index(item, value_index3); + variable_item_set_current_value_text(item, debug_counter_text[value_index3]); } view_dispatcher_switch_to_view(subghz->view_dispatcher, SubGhzViewIdVariableItemList); diff --git a/applications/main/subghz/scenes/subghz_scene_receiver.c b/applications/main/subghz/scenes/subghz_scene_receiver.c index e1ea08497..ba1e2faed 100644 --- a/applications/main/subghz/scenes/subghz_scene_receiver.c +++ b/applications/main/subghz/scenes/subghz_scene_receiver.c @@ -204,6 +204,23 @@ bool subghz_scene_receiver_on_event(void* context, SceneManagerEvent event) { DOLPHIN_DEED(DolphinDeedSubGhzReceiverInfo); consumed = true; break; + case SubGhzCustomEventViewReceiverDeleteItem: + subghz->txrx->idx_menu_chosen = + subghz_view_receiver_get_idx_menu(subghz->subghz_receiver); + if(subghz->txrx->idx_menu_chosen == 0) { + subghz_history_delete_item(subghz->txrx->history, subghz->txrx->idx_menu_chosen); + subghz_view_receiver_set_idx_menu( + subghz->subghz_receiver, subghz->txrx->idx_menu_chosen); + } else { + subghz_history_delete_item( + subghz->txrx->history, subghz->txrx->idx_menu_chosen + 1); + subghz_view_receiver_set_idx_menu( + subghz->subghz_receiver, subghz->txrx->idx_menu_chosen); + } + + subghz_scene_receiver_update_statusbar(subghz); + consumed = true; + break; case SubGhzCustomEventViewReceiverConfig: subghz->state_notifications = SubGhzNotificationStateIDLE; subghz->txrx->idx_menu_chosen = diff --git a/applications/main/subghz/scenes/subghz_scene_receiver_info.c b/applications/main/subghz/scenes/subghz_scene_receiver_info.c index e5b037f2e..4f4924b06 100644 --- a/applications/main/subghz/scenes/subghz_scene_receiver_info.c +++ b/applications/main/subghz/scenes/subghz_scene_receiver_info.c @@ -2,6 +2,7 @@ #include "../helpers/subghz_custom_event.h" #include #include +#include void subghz_scene_receiver_info_callback(GuiButtonType result, InputType type, void* context) { furi_assert(context); @@ -233,6 +234,8 @@ void subghz_scene_receiver_info_on_exit(void* context) { widget_reset(subghz->widget); keeloq_reset_mfname(); keeloq_reset_kl_type(); + keeloq_reset_original_btn(); + alutech_reset_original_btn(); star_line_reset_mfname(); star_line_reset_kl_type(); } diff --git a/applications/main/subghz/scenes/subghz_scene_rpc.c b/applications/main/subghz/scenes/subghz_scene_rpc.c index 68f2e0199..0ff801d79 100644 --- a/applications/main/subghz/scenes/subghz_scene_rpc.c +++ b/applications/main/subghz/scenes/subghz_scene_rpc.c @@ -1,6 +1,7 @@ #include "../subghz_i.h" #include #include +#include typedef enum { SubGhzRpcStateIdle, @@ -110,6 +111,8 @@ void subghz_scene_rpc_on_exit(void* context) { keeloq_reset_mfname(); keeloq_reset_kl_type(); + keeloq_reset_original_btn(); + alutech_reset_original_btn(); star_line_reset_mfname(); star_line_reset_kl_type(); } diff --git a/applications/main/subghz/scenes/subghz_scene_transmitter.c b/applications/main/subghz/scenes/subghz_scene_transmitter.c index dff4f8384..b1d1f467b 100644 --- a/applications/main/subghz/scenes/subghz_scene_transmitter.c +++ b/applications/main/subghz/scenes/subghz_scene_transmitter.c @@ -2,6 +2,7 @@ #include "../views/transmitter.h" #include #include +#include #include void subghz_scene_transmitter_callback(SubGhzCustomEvent event, void* context) { @@ -89,6 +90,22 @@ bool subghz_scene_transmitter_on_event(void* context, SceneManagerEvent event) { subghz_tx_stop(subghz); subghz_sleep(subghz); } + if(keeloq_get_custom_btn() != 0) { + keeloq_set_btn(0); + alutech_set_btn(0); + // Calling restore! + if(subghz->txrx->txrx_state == SubGhzTxRxStateRx) { + subghz_rx_end(subghz); + } + if((subghz->txrx->txrx_state == SubGhzTxRxStateIDLE) || + (subghz->txrx->txrx_state == SubGhzTxRxStateSleep)) { + if(!subghz_tx_start(subghz, subghz->txrx->fff_data)) { + scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowOnlyRx); + } + } + subghz_tx_stop(subghz); + subghz_sleep(subghz); + } return true; } else if(event.event == SubGhzCustomEventViewTransmitterBack) { subghz->state_notifications = SubGhzNotificationStateIDLE; @@ -113,6 +130,8 @@ void subghz_scene_transmitter_on_exit(void* context) { subghz->state_notifications = SubGhzNotificationStateIDLE; keeloq_reset_mfname(); keeloq_reset_kl_type(); + keeloq_reset_original_btn(); + alutech_reset_original_btn(); star_line_reset_mfname(); star_line_reset_kl_type(); } diff --git a/applications/main/subghz/subghz_history.c b/applications/main/subghz/subghz_history.c index 184146698..1df7d0238 100644 --- a/applications/main/subghz/subghz_history.c +++ b/applications/main/subghz/subghz_history.c @@ -88,6 +88,30 @@ void subghz_history_reset(SubGhzHistory* instance) { instance->code_last_hash_data = 0; } +void subghz_history_delete_item(SubGhzHistory* instance, uint16_t item_id) { + furi_assert(instance); + + SubGhzHistoryItemArray_it_t it; + SubGhzHistoryItem* target_item = SubGhzHistoryItemArray_get(instance->history->data, item_id); + SubGhzHistoryItemArray_it_last(it, instance->history->data); + while(!SubGhzHistoryItemArray_end_p(it)) { + SubGhzHistoryItem* item = SubGhzHistoryItemArray_ref(it); + + if(strcmp( + furi_string_get_cstr(item->item_str), + furi_string_get_cstr(target_item->item_str)) == 0) { + furi_string_free(item->item_str); + furi_string_free(item->preset->name); + free(item->preset); + flipper_format_free(item->flipper_string); + item->type = 0; + SubGhzHistoryItemArray_remove(instance->history->data, it); + } + SubGhzHistoryItemArray_previous(it); + } + instance->last_index_write--; +} + uint16_t subghz_history_get_item(SubGhzHistory* instance) { furi_assert(instance); return instance->last_index_write; diff --git a/applications/main/subghz/subghz_history.h b/applications/main/subghz/subghz_history.h index 4b01f5aef..1f2f8d246 100644 --- a/applications/main/subghz/subghz_history.h +++ b/applications/main/subghz/subghz_history.h @@ -27,6 +27,8 @@ void subghz_history_free(SubGhzHistory* instance); */ void subghz_history_reset(SubGhzHistory* instance); +void subghz_history_delete_item(SubGhzHistory* instance, uint16_t item_id); + /** Get frequency to history[idx] * * @param instance - SubGhzHistory instance diff --git a/applications/main/subghz/views/receiver.c b/applications/main/subghz/views/receiver.c index f981a2eef..74c7d749b 100644 --- a/applications/main/subghz/views/receiver.c +++ b/applications/main/subghz/views/receiver.c @@ -427,6 +427,54 @@ bool subghz_view_receiver_input(InputEvent* event, void* context) { true); } else if(event->key == InputKeyLeft && event->type == InputTypeShort) { subghz_receiver->callback(SubGhzCustomEventViewReceiverConfig, subghz_receiver->context); + } else if(event->key == InputKeyRight && event->type == InputTypeLong) { + with_view_model( + subghz_receiver->view, + SubGhzViewReceiverModel * model, + { + if(model->history_item != 0) { + SubGhzReceiverMenuItemArray_it_t it; + SubGhzReceiverMenuItem* target_item = + SubGhzReceiverMenuItemArray_get(model->history->data, model->idx); + SubGhzReceiverMenuItemArray_it_last(it, model->history->data); + while(!SubGhzReceiverMenuItemArray_end_p(it)) { + SubGhzReceiverMenuItem* item = SubGhzReceiverMenuItemArray_ref(it); + + if(strcmp( + furi_string_get_cstr(item->item_str), + furi_string_get_cstr(target_item->item_str)) == 0) { + furi_string_free(item->item_str); + item->type = 0; + SubGhzReceiverMenuItemArray_remove(model->history->data, it); + if(model->history_item == 5) { + if(model->idx >= 2) { + model->idx = model->history_item - 1; + } + } + if(model->idx == model->history_item - 1) { + if(model->idx != 0) { + model->idx--; + } + } + } + + SubGhzReceiverMenuItemArray_previous(it); + } + } + }, + true); + + with_view_model( + subghz_receiver->view, + SubGhzViewReceiverModel * model, + { + if(model->history_item != 0) { + subghz_receiver->callback( + SubGhzCustomEventViewReceiverDeleteItem, subghz_receiver->context); + model->history_item--; + } + }, + true); } else if(event->key == InputKeyOk && event->type == InputTypeShort) { with_view_model( subghz_receiver->view, diff --git a/applications/main/subghz/views/transmitter.c b/applications/main/subghz/views/transmitter.c index 102639924..218bf8f7e 100644 --- a/applications/main/subghz/views/transmitter.c +++ b/applications/main/subghz/views/transmitter.c @@ -4,6 +4,9 @@ #include #include +#include +#include + struct SubGhzViewTransmitter { View* view; SubGhzViewTransmitterCallback callback; @@ -15,6 +18,8 @@ typedef struct { FuriString* preset_str; FuriString* key_str; uint8_t show_button; + FuriString* temp_button_id; + bool draw_temp_button; } SubGhzViewTransmitterModel; void subghz_view_transmitter_set_callback( @@ -89,6 +94,12 @@ void subghz_view_transmitter_draw(Canvas* canvas, SubGhzViewTransmitterModel* mo canvas_draw_str(canvas, 78, 7, furi_string_get_cstr(model->frequency_str)); canvas_draw_str(canvas, 113, 7, furi_string_get_cstr(model->preset_str)); + if(model->draw_temp_button) { + canvas_set_font(canvas, FontBatteryPercent); + canvas_draw_str(canvas, 117, 40, furi_string_get_cstr(model->temp_button_id)); + canvas_set_font(canvas, FontSecondary); + } + if(model->show_button) { canvas_draw_str(canvas, 58, 62, furi_hal_subghz_get_radio_type() ? "R: Ext" : "R: Int"); subghz_view_transmitter_button_right(canvas, "Send"); @@ -108,7 +119,9 @@ bool subghz_view_transmitter_input(InputEvent* event, void* context) { furi_string_reset(model->frequency_str); furi_string_reset(model->preset_str); furi_string_reset(model->key_str); + furi_string_reset(model->temp_button_id); model->show_button = 0; + model->draw_temp_button = false; }, false); return false; @@ -125,6 +138,14 @@ bool subghz_view_transmitter_input(InputEvent* event, void* context) { true); if(can_be_sent && event->key == InputKeyOk && event->type == InputTypePress) { + with_view_model( + subghz_transmitter->view, + SubGhzViewTransmitterModel * model, + { + furi_string_reset(model->temp_button_id); + model->draw_temp_button = false; + }, + true); subghz_transmitter->callback( SubGhzCustomEventViewTransmitterSendStart, subghz_transmitter->context); return true; @@ -134,6 +155,111 @@ bool subghz_view_transmitter_input(InputEvent* event, void* context) { return true; } + // Temp Buttons (UP) + if(can_be_sent && event->key == InputKeyUp && event->type == InputTypePress) { + keeloq_set_btn(1); + alutech_set_btn(1); + with_view_model( + subghz_transmitter->view, + SubGhzViewTransmitterModel * model, + { + furi_string_reset(model->temp_button_id); + if(keeloq_get_original_btn() != 0) { + furi_string_printf(model->temp_button_id, "%01X", keeloq_get_original_btn()); + model->draw_temp_button = true; + } else if(alutech_get_original_btn() != 0) { + furi_string_printf(model->temp_button_id, "%01X", alutech_get_original_btn()); + model->draw_temp_button = true; + } + }, + true); + subghz_transmitter->callback( + SubGhzCustomEventViewTransmitterSendStart, subghz_transmitter->context); + return true; + } else if(can_be_sent && event->key == InputKeyUp && event->type == InputTypeRelease) { + subghz_transmitter->callback( + SubGhzCustomEventViewTransmitterSendStop, subghz_transmitter->context); + return true; + } + // Down + if(can_be_sent && event->key == InputKeyDown && event->type == InputTypePress) { + keeloq_set_btn(2); + alutech_set_btn(2); + with_view_model( + subghz_transmitter->view, + SubGhzViewTransmitterModel * model, + { + furi_string_reset(model->temp_button_id); + if(keeloq_get_original_btn() != 0) { + furi_string_printf(model->temp_button_id, "%01X", keeloq_get_original_btn()); + model->draw_temp_button = true; + } else if(alutech_get_original_btn() != 0) { + furi_string_printf(model->temp_button_id, "%01X", alutech_get_original_btn()); + model->draw_temp_button = true; + } + }, + true); + subghz_transmitter->callback( + SubGhzCustomEventViewTransmitterSendStart, subghz_transmitter->context); + return true; + } else if(can_be_sent && event->key == InputKeyDown && event->type == InputTypeRelease) { + subghz_transmitter->callback( + SubGhzCustomEventViewTransmitterSendStop, subghz_transmitter->context); + return true; + } + // Left + if(can_be_sent && event->key == InputKeyLeft && event->type == InputTypePress) { + keeloq_set_btn(3); + alutech_set_btn(3); + with_view_model( + subghz_transmitter->view, + SubGhzViewTransmitterModel * model, + { + furi_string_reset(model->temp_button_id); + if(keeloq_get_original_btn() != 0) { + furi_string_printf(model->temp_button_id, "%01X", keeloq_get_original_btn()); + model->draw_temp_button = true; + } else if(alutech_get_original_btn() != 0) { + furi_string_printf(model->temp_button_id, "%01X", alutech_get_original_btn()); + model->draw_temp_button = true; + } + }, + true); + subghz_transmitter->callback( + SubGhzCustomEventViewTransmitterSendStart, subghz_transmitter->context); + return true; + } else if(can_be_sent && event->key == InputKeyLeft && event->type == InputTypeRelease) { + subghz_transmitter->callback( + SubGhzCustomEventViewTransmitterSendStop, subghz_transmitter->context); + return true; + } + // Right + if(can_be_sent && event->key == InputKeyRight && event->type == InputTypePress) { + keeloq_set_btn(4); + alutech_set_btn(4); + with_view_model( + subghz_transmitter->view, + SubGhzViewTransmitterModel * model, + { + furi_string_reset(model->temp_button_id); + if(keeloq_get_original_btn() != 0) { + furi_string_printf(model->temp_button_id, "%01X", keeloq_get_original_btn()); + model->draw_temp_button = true; + } else if(alutech_get_original_btn() != 0) { + furi_string_printf(model->temp_button_id, "%01X", alutech_get_original_btn()); + model->draw_temp_button = true; + } + }, + true); + subghz_transmitter->callback( + SubGhzCustomEventViewTransmitterSendStart, subghz_transmitter->context); + return true; + } else if(can_be_sent && event->key == InputKeyRight && event->type == InputTypeRelease) { + subghz_transmitter->callback( + SubGhzCustomEventViewTransmitterSendStop, subghz_transmitter->context); + return true; + } + return true; } @@ -166,6 +292,7 @@ SubGhzViewTransmitter* subghz_view_transmitter_alloc() { model->frequency_str = furi_string_alloc(); model->preset_str = furi_string_alloc(); model->key_str = furi_string_alloc(); + model->temp_button_id = furi_string_alloc(); }, true); return subghz_transmitter; @@ -181,6 +308,7 @@ void subghz_view_transmitter_free(SubGhzViewTransmitter* subghz_transmitter) { furi_string_free(model->frequency_str); furi_string_free(model->preset_str); furi_string_free(model->key_str); + furi_string_free(model->temp_button_id); }, true); view_free(subghz_transmitter->view); diff --git a/applications/main/unirfremix/unirfremix_app.c b/applications/main/unirfremix/unirfremix_app.c index 1db9a13c5..81d8ceb1a 100644 --- a/applications/main/unirfremix/unirfremix_app.c +++ b/applications/main/unirfremix/unirfremix_app.c @@ -19,6 +19,7 @@ #include #include #include +#include #define UNIRFMAP_FOLDER "/ext/unirf" #define UNIRFMAP_EXTENSION ".txt" @@ -481,6 +482,8 @@ void unirfremix_tx_stop(UniRFRemix* app) { keeloq_reset_mfname(); keeloq_reset_kl_type(); + keeloq_reset_original_btn(); + alutech_reset_original_btn(); star_line_reset_mfname(); star_line_reset_kl_type(); } diff --git a/applications/plugins/swd_probe/model/model_chip.h b/applications/plugins/swd_probe/model/model_chip.h index ed96105af..4061b8522 100644 --- a/applications/plugins/swd_probe/model/model_chip.h +++ b/applications/plugins/swd_probe/model/model_chip.h @@ -1,420 +1,108 @@ #define NUM_VERTICES 136 float vertexCoords[NUM_VERTICES][3] = { - {1.000000, 1.000000, 0.152153}, - {-1.000000, 1.000000, 0.152153}, - {-1.000000, -1.000000, 0.152153}, - {1.000000, -1.000000, 0.152153}, - {1.000000, -1.000000, -0.185787}, - {-1.000000, -1.000000, -0.185787}, - {-1.000000, 1.000000, -0.185787}, - {1.000000, 1.000000, -0.185787}, - {-1.000043, -0.785071, -0.015780}, - {-1.155724, -0.785071, -0.015780}, - {-1.155724, -0.918718, -0.015780}, - {-1.000043, -0.918718, -0.015780}, - {-1.155724, -0.785071, 0.127052}, - {-1.000043, -0.785071, 0.127052}, - {-1.000043, -0.918718, 0.127052}, - {-1.155724, -0.918718, 0.127052}, - {-1.234192, -0.918846, -0.087021}, - {-1.234397, -0.785201, -0.086336}, - {-1.235319, -0.784943, -0.229143}, - {-1.235114, -0.918588, -0.229828}, - {-1.388133, -0.919573, -0.078673}, - {-1.389056, -0.919314, -0.221479}, - {-1.389261, -0.785669, -0.220795}, - {-1.388338, -0.785927, -0.077988}, - {-1.000043, -0.219627, -0.015780}, - {-1.155724, -0.219627, -0.015780}, - {-1.155724, -0.353273, -0.015780}, - {-1.000043, -0.353273, -0.015780}, - {-1.155724, -0.219627, 0.127052}, - {-1.000043, -0.219627, 0.127052}, - {-1.000043, -0.353273, 0.127052}, - {-1.155724, -0.353273, 0.127052}, - {-1.234192, -0.353402, -0.087021}, - {-1.234397, -0.219756, -0.086336}, - {-1.235319, -0.219498, -0.229143}, - {-1.235114, -0.353143, -0.229828}, - {-1.388133, -0.354128, -0.078673}, - {-1.389056, -0.353870, -0.221479}, - {-1.389261, -0.220224, -0.220795}, - {-1.388338, -0.220482, -0.077988}, - {-1.000043, 0.345818, -0.015780}, - {-1.155724, 0.345818, -0.015780}, - {-1.155724, 0.212172, -0.015780}, - {-1.000043, 0.212172, -0.015780}, - {-1.155724, 0.345818, 0.127052}, - {-1.000043, 0.345818, 0.127052}, - {-1.000043, 0.212172, 0.127052}, - {-1.155724, 0.212172, 0.127052}, - {-1.234192, 0.212043, -0.087021}, - {-1.234397, 0.345689, -0.086336}, - {-1.235319, 0.345947, -0.229143}, - {-1.235114, 0.212301, -0.229828}, - {-1.388133, 0.211317, -0.078673}, - {-1.389056, 0.211575, -0.221479}, - {-1.389261, 0.345221, -0.220795}, - {-1.388338, 0.344962, -0.077988}, - {-1.000043, 0.911263, -0.015780}, - {-1.155724, 0.911263, -0.015780}, - {-1.155724, 0.777617, -0.015780}, - {-1.000043, 0.777617, -0.015780}, - {-1.155724, 0.911263, 0.127052}, - {-1.000043, 0.911263, 0.127052}, - {-1.000043, 0.777617, 0.127052}, - {-1.155724, 0.777617, 0.127052}, - {-1.234192, 0.777488, -0.087021}, - {-1.234397, 0.911133, -0.086336}, - {-1.235319, 0.911392, -0.229143}, - {-1.235114, 0.777746, -0.229828}, - {-1.388133, 0.776762, -0.078673}, - {-1.389056, 0.777020, -0.221479}, - {-1.389261, 0.910665, -0.220795}, - {-1.388338, 0.910407, -0.077988}, - {1.000043, -0.785071, -0.015780}, - {1.000043, -0.918718, -0.015780}, - {1.155723, -0.918718, -0.015780}, - {1.155723, -0.785071, -0.015780}, - {1.155723, -0.785071, 0.127052}, - {1.155723, -0.918718, 0.127052}, - {1.000043, -0.918718, 0.127052}, - {1.000043, -0.785071, 0.127052}, - {1.234397, -0.785201, -0.086336}, - {1.234192, -0.918846, -0.087021}, - {1.235114, -0.918588, -0.229828}, - {1.235319, -0.784943, -0.229143}, - {1.388133, -0.919573, -0.078673}, - {1.388338, -0.785927, -0.077988}, - {1.389260, -0.785669, -0.220795}, - {1.389056, -0.919314, -0.221479}, - {1.000043, -0.219627, -0.015780}, - {1.000043, -0.353273, -0.015780}, - {1.155723, -0.353273, -0.015780}, - {1.155723, -0.219627, -0.015780}, - {1.155723, -0.219627, 0.127052}, - {1.155723, -0.353273, 0.127052}, - {1.000043, -0.353273, 0.127052}, - {1.000043, -0.219627, 0.127052}, - {1.234397, -0.219756, -0.086336}, - {1.234192, -0.353402, -0.087021}, - {1.235114, -0.353143, -0.229828}, - {1.235319, -0.219498, -0.229143}, - {1.388133, -0.354128, -0.078673}, - {1.388338, -0.220482, -0.077988}, - {1.389260, -0.220224, -0.220795}, - {1.389056, -0.353870, -0.221479}, - {1.000043, 0.345818, -0.015780}, - {1.000043, 0.212172, -0.015780}, - {1.155723, 0.212172, -0.015780}, - {1.155723, 0.345818, -0.015780}, - {1.155723, 0.345818, 0.127052}, - {1.155723, 0.212172, 0.127052}, - {1.000043, 0.212172, 0.127052}, - {1.000043, 0.345818, 0.127052}, - {1.234397, 0.345689, -0.086336}, - {1.234192, 0.212043, -0.087021}, - {1.235114, 0.212301, -0.229828}, - {1.235319, 0.345947, -0.229143}, - {1.388133, 0.211317, -0.078673}, - {1.388338, 0.344962, -0.077988}, - {1.389260, 0.345221, -0.220795}, - {1.389056, 0.211575, -0.221479}, - {1.000043, 0.911263, -0.015780}, - {1.000043, 0.777616, -0.015780}, - {1.155723, 0.777616, -0.015780}, - {1.155723, 0.911263, -0.015780}, - {1.155723, 0.911263, 0.127052}, - {1.155723, 0.777616, 0.127052}, - {1.000043, 0.777616, 0.127052}, - {1.000043, 0.911263, 0.127052}, - {1.234397, 0.911133, -0.086336}, - {1.234192, 0.777488, -0.087021}, - {1.235114, 0.777746, -0.229828}, - {1.235319, 0.911392, -0.229143}, - {1.388133, 0.776762, -0.078673}, - {1.388338, 0.910407, -0.077988}, - {1.389260, 0.910665, -0.220795}, - {1.389056, 0.777020, -0.221479}, -};int edgeIndices[][3] = { - {0, 1}, - {1, 2}, - {2, 3}, - {3, 0}, - {4, 3}, - {3, 2}, - {2, 5}, - {5, 4}, - {5, 2}, - {2, 1}, - {1, 6}, - {6, 5}, - {6, 7}, - {7, 4}, - {4, 5}, - {5, 6}, - {7, 0}, - {0, 3}, - {3, 4}, - {4, 7}, - {6, 1}, - {1, 0}, - {0, 7}, - {7, 6}, - {8, 9}, - {9, 10}, - {10, 11}, - {11, 8}, - {12, 13}, - {13, 14}, - {14, 15}, - {15, 12}, - {13, 8}, - {8, 11}, - {11, 14}, - {14, 13}, - {12, 15}, - {15, 16}, - {16, 17}, - {17, 12}, - {10, 9}, - {9, 18}, - {18, 19}, - {19, 10}, - {20, 21}, - {21, 22}, - {22, 23}, - {23, 20}, - {17, 16}, - {16, 20}, - {20, 23}, - {23, 17}, - {19, 18}, - {18, 22}, - {22, 21}, - {21, 19}, - {24, 25}, - {25, 26}, - {26, 27}, - {27, 24}, - {28, 29}, - {29, 30}, - {30, 31}, - {31, 28}, - {29, 24}, - {24, 27}, - {27, 30}, - {30, 29}, - {28, 31}, - {31, 32}, - {32, 33}, - {33, 28}, - {26, 25}, - {25, 34}, - {34, 35}, - {35, 26}, - {36, 37}, - {37, 38}, - {38, 39}, - {39, 36}, - {33, 32}, - {32, 36}, - {36, 39}, - {39, 33}, - {35, 34}, - {34, 38}, - {38, 37}, - {37, 35}, - {40, 41}, - {41, 42}, - {42, 43}, - {43, 40}, - {44, 45}, - {45, 46}, - {46, 47}, - {47, 44}, - {45, 40}, - {40, 43}, - {43, 46}, - {46, 45}, - {44, 47}, - {47, 48}, - {48, 49}, - {49, 44}, - {42, 41}, - {41, 50}, - {50, 51}, - {51, 42}, - {52, 53}, - {53, 54}, - {54, 55}, - {55, 52}, - {49, 48}, - {48, 52}, - {52, 55}, - {55, 49}, - {51, 50}, - {50, 54}, - {54, 53}, - {53, 51}, - {56, 57}, - {57, 58}, - {58, 59}, - {59, 56}, - {60, 61}, - {61, 62}, - {62, 63}, - {63, 60}, - {61, 56}, - {56, 59}, - {59, 62}, - {62, 61}, - {60, 63}, - {63, 64}, - {64, 65}, - {65, 60}, - {58, 57}, - {57, 66}, - {66, 67}, - {67, 58}, - {68, 69}, - {69, 70}, - {70, 71}, - {71, 68}, - {65, 64}, - {64, 68}, - {68, 71}, - {71, 65}, - {67, 66}, - {66, 70}, - {70, 69}, - {69, 67}, - {72, 73}, - {73, 74}, - {74, 75}, - {75, 72}, - {76, 77}, - {77, 78}, - {78, 79}, - {79, 76}, - {79, 78}, - {78, 73}, - {73, 72}, - {72, 79}, - {76, 80}, - {80, 81}, - {81, 77}, - {77, 76}, - {74, 82}, - {82, 83}, - {83, 75}, - {75, 74}, - {84, 85}, - {85, 86}, - {86, 87}, - {87, 84}, - {80, 85}, - {85, 84}, - {84, 81}, - {81, 80}, - {82, 87}, - {87, 86}, - {86, 83}, - {83, 82}, - {88, 89}, - {89, 90}, - {90, 91}, - {91, 88}, - {92, 93}, - {93, 94}, - {94, 95}, - {95, 92}, - {95, 94}, - {94, 89}, - {89, 88}, - {88, 95}, - {92, 96}, - {96, 97}, - {97, 93}, - {93, 92}, - {90, 98}, - {98, 99}, - {99, 91}, - {91, 90}, - {100, 101}, - {101, 102}, - {102, 103}, - {103, 100}, - {96, 101}, - {101, 100}, - {100, 97}, - {97, 96}, - {98, 103}, - {103, 102}, - {102, 99}, - {99, 98}, - {104, 105}, - {105, 106}, - {106, 107}, - {107, 104}, - {108, 109}, - {109, 110}, - {110, 111}, - {111, 108}, - {111, 110}, - {110, 105}, - {105, 104}, - {104, 111}, - {108, 112}, - {112, 113}, - {113, 109}, - {109, 108}, - {106, 114}, - {114, 115}, - {115, 107}, - {107, 106}, - {116, 117}, - {117, 118}, - {118, 119}, - {119, 116}, - {112, 117}, - {117, 116}, - {116, 113}, - {113, 112}, - {114, 119}, - {119, 118}, - {118, 115}, - {115, 114}, - {120, 121}, - {121, 122}, - {122, 123}, - {123, 120}, - {124, 125}, - {125, 126}, - {126, 127}, - {127, 124}, - {127, 126}, - {126, 121}, - {121, 120}, - {120, 127}, - {124, 128}, - {128, 129}, - {129, 125}, - {125, 124}, - {122, 130}, - {130, 131}, - {131, 123}, - {123, 122}, - {132, 133}, - {133, 134}, - {134, 135}, - {135, 132}, - {128, 133}, - {133, 132}, - {132, 129}, - {129, 128}, - {130, 135}, - {135, 134}, - {134, 131}, - {131, 130}, + {1.000000, 1.000000, 0.152153}, {-1.000000, 1.000000, 0.152153}, + {-1.000000, -1.000000, 0.152153}, {1.000000, -1.000000, 0.152153}, + {1.000000, -1.000000, -0.185787}, {-1.000000, -1.000000, -0.185787}, + {-1.000000, 1.000000, -0.185787}, {1.000000, 1.000000, -0.185787}, + {-1.000043, -0.785071, -0.015780}, {-1.155724, -0.785071, -0.015780}, + {-1.155724, -0.918718, -0.015780}, {-1.000043, -0.918718, -0.015780}, + {-1.155724, -0.785071, 0.127052}, {-1.000043, -0.785071, 0.127052}, + {-1.000043, -0.918718, 0.127052}, {-1.155724, -0.918718, 0.127052}, + {-1.234192, -0.918846, -0.087021}, {-1.234397, -0.785201, -0.086336}, + {-1.235319, -0.784943, -0.229143}, {-1.235114, -0.918588, -0.229828}, + {-1.388133, -0.919573, -0.078673}, {-1.389056, -0.919314, -0.221479}, + {-1.389261, -0.785669, -0.220795}, {-1.388338, -0.785927, -0.077988}, + {-1.000043, -0.219627, -0.015780}, {-1.155724, -0.219627, -0.015780}, + {-1.155724, -0.353273, -0.015780}, {-1.000043, -0.353273, -0.015780}, + {-1.155724, -0.219627, 0.127052}, {-1.000043, -0.219627, 0.127052}, + {-1.000043, -0.353273, 0.127052}, {-1.155724, -0.353273, 0.127052}, + {-1.234192, -0.353402, -0.087021}, {-1.234397, -0.219756, -0.086336}, + {-1.235319, -0.219498, -0.229143}, {-1.235114, -0.353143, -0.229828}, + {-1.388133, -0.354128, -0.078673}, {-1.389056, -0.353870, -0.221479}, + {-1.389261, -0.220224, -0.220795}, {-1.388338, -0.220482, -0.077988}, + {-1.000043, 0.345818, -0.015780}, {-1.155724, 0.345818, -0.015780}, + {-1.155724, 0.212172, -0.015780}, {-1.000043, 0.212172, -0.015780}, + {-1.155724, 0.345818, 0.127052}, {-1.000043, 0.345818, 0.127052}, + {-1.000043, 0.212172, 0.127052}, {-1.155724, 0.212172, 0.127052}, + {-1.234192, 0.212043, -0.087021}, {-1.234397, 0.345689, -0.086336}, + {-1.235319, 0.345947, -0.229143}, {-1.235114, 0.212301, -0.229828}, + {-1.388133, 0.211317, -0.078673}, {-1.389056, 0.211575, -0.221479}, + {-1.389261, 0.345221, -0.220795}, {-1.388338, 0.344962, -0.077988}, + {-1.000043, 0.911263, -0.015780}, {-1.155724, 0.911263, -0.015780}, + {-1.155724, 0.777617, -0.015780}, {-1.000043, 0.777617, -0.015780}, + {-1.155724, 0.911263, 0.127052}, {-1.000043, 0.911263, 0.127052}, + {-1.000043, 0.777617, 0.127052}, {-1.155724, 0.777617, 0.127052}, + {-1.234192, 0.777488, -0.087021}, {-1.234397, 0.911133, -0.086336}, + {-1.235319, 0.911392, -0.229143}, {-1.235114, 0.777746, -0.229828}, + {-1.388133, 0.776762, -0.078673}, {-1.389056, 0.777020, -0.221479}, + {-1.389261, 0.910665, -0.220795}, {-1.388338, 0.910407, -0.077988}, + {1.000043, -0.785071, -0.015780}, {1.000043, -0.918718, -0.015780}, + {1.155723, -0.918718, -0.015780}, {1.155723, -0.785071, -0.015780}, + {1.155723, -0.785071, 0.127052}, {1.155723, -0.918718, 0.127052}, + {1.000043, -0.918718, 0.127052}, {1.000043, -0.785071, 0.127052}, + {1.234397, -0.785201, -0.086336}, {1.234192, -0.918846, -0.087021}, + {1.235114, -0.918588, -0.229828}, {1.235319, -0.784943, -0.229143}, + {1.388133, -0.919573, -0.078673}, {1.388338, -0.785927, -0.077988}, + {1.389260, -0.785669, -0.220795}, {1.389056, -0.919314, -0.221479}, + {1.000043, -0.219627, -0.015780}, {1.000043, -0.353273, -0.015780}, + {1.155723, -0.353273, -0.015780}, {1.155723, -0.219627, -0.015780}, + {1.155723, -0.219627, 0.127052}, {1.155723, -0.353273, 0.127052}, + {1.000043, -0.353273, 0.127052}, {1.000043, -0.219627, 0.127052}, + {1.234397, -0.219756, -0.086336}, {1.234192, -0.353402, -0.087021}, + {1.235114, -0.353143, -0.229828}, {1.235319, -0.219498, -0.229143}, + {1.388133, -0.354128, -0.078673}, {1.388338, -0.220482, -0.077988}, + {1.389260, -0.220224, -0.220795}, {1.389056, -0.353870, -0.221479}, + {1.000043, 0.345818, -0.015780}, {1.000043, 0.212172, -0.015780}, + {1.155723, 0.212172, -0.015780}, {1.155723, 0.345818, -0.015780}, + {1.155723, 0.345818, 0.127052}, {1.155723, 0.212172, 0.127052}, + {1.000043, 0.212172, 0.127052}, {1.000043, 0.345818, 0.127052}, + {1.234397, 0.345689, -0.086336}, {1.234192, 0.212043, -0.087021}, + {1.235114, 0.212301, -0.229828}, {1.235319, 0.345947, -0.229143}, + {1.388133, 0.211317, -0.078673}, {1.388338, 0.344962, -0.077988}, + {1.389260, 0.345221, -0.220795}, {1.389056, 0.211575, -0.221479}, + {1.000043, 0.911263, -0.015780}, {1.000043, 0.777616, -0.015780}, + {1.155723, 0.777616, -0.015780}, {1.155723, 0.911263, -0.015780}, + {1.155723, 0.911263, 0.127052}, {1.155723, 0.777616, 0.127052}, + {1.000043, 0.777616, 0.127052}, {1.000043, 0.911263, 0.127052}, + {1.234397, 0.911133, -0.086336}, {1.234192, 0.777488, -0.087021}, + {1.235114, 0.777746, -0.229828}, {1.235319, 0.911392, -0.229143}, + {1.388133, 0.776762, -0.078673}, {1.388338, 0.910407, -0.077988}, + {1.389260, 0.910665, -0.220795}, {1.389056, 0.777020, -0.221479}, +}; +int edgeIndices[][3] = { + {0, 1}, {1, 2}, {2, 3}, {3, 0}, {4, 3}, {3, 2}, {2, 5}, {5, 4}, + {5, 2}, {2, 1}, {1, 6}, {6, 5}, {6, 7}, {7, 4}, {4, 5}, {5, 6}, + {7, 0}, {0, 3}, {3, 4}, {4, 7}, {6, 1}, {1, 0}, {0, 7}, {7, 6}, + {8, 9}, {9, 10}, {10, 11}, {11, 8}, {12, 13}, {13, 14}, {14, 15}, {15, 12}, + {13, 8}, {8, 11}, {11, 14}, {14, 13}, {12, 15}, {15, 16}, {16, 17}, {17, 12}, + {10, 9}, {9, 18}, {18, 19}, {19, 10}, {20, 21}, {21, 22}, {22, 23}, {23, 20}, + {17, 16}, {16, 20}, {20, 23}, {23, 17}, {19, 18}, {18, 22}, {22, 21}, {21, 19}, + {24, 25}, {25, 26}, {26, 27}, {27, 24}, {28, 29}, {29, 30}, {30, 31}, {31, 28}, + {29, 24}, {24, 27}, {27, 30}, {30, 29}, {28, 31}, {31, 32}, {32, 33}, {33, 28}, + {26, 25}, {25, 34}, {34, 35}, {35, 26}, {36, 37}, {37, 38}, {38, 39}, {39, 36}, + {33, 32}, {32, 36}, {36, 39}, {39, 33}, {35, 34}, {34, 38}, {38, 37}, {37, 35}, + {40, 41}, {41, 42}, {42, 43}, {43, 40}, {44, 45}, {45, 46}, {46, 47}, {47, 44}, + {45, 40}, {40, 43}, {43, 46}, {46, 45}, {44, 47}, {47, 48}, {48, 49}, {49, 44}, + {42, 41}, {41, 50}, {50, 51}, {51, 42}, {52, 53}, {53, 54}, {54, 55}, {55, 52}, + {49, 48}, {48, 52}, {52, 55}, {55, 49}, {51, 50}, {50, 54}, {54, 53}, {53, 51}, + {56, 57}, {57, 58}, {58, 59}, {59, 56}, {60, 61}, {61, 62}, {62, 63}, {63, 60}, + {61, 56}, {56, 59}, {59, 62}, {62, 61}, {60, 63}, {63, 64}, {64, 65}, {65, 60}, + {58, 57}, {57, 66}, {66, 67}, {67, 58}, {68, 69}, {69, 70}, {70, 71}, {71, 68}, + {65, 64}, {64, 68}, {68, 71}, {71, 65}, {67, 66}, {66, 70}, {70, 69}, {69, 67}, + {72, 73}, {73, 74}, {74, 75}, {75, 72}, {76, 77}, {77, 78}, {78, 79}, {79, 76}, + {79, 78}, {78, 73}, {73, 72}, {72, 79}, {76, 80}, {80, 81}, {81, 77}, {77, 76}, + {74, 82}, {82, 83}, {83, 75}, {75, 74}, {84, 85}, {85, 86}, {86, 87}, {87, 84}, + {80, 85}, {85, 84}, {84, 81}, {81, 80}, {82, 87}, {87, 86}, {86, 83}, {83, 82}, + {88, 89}, {89, 90}, {90, 91}, {91, 88}, {92, 93}, {93, 94}, {94, 95}, {95, 92}, + {95, 94}, {94, 89}, {89, 88}, {88, 95}, {92, 96}, {96, 97}, {97, 93}, {93, 92}, + {90, 98}, {98, 99}, {99, 91}, {91, 90}, {100, 101}, {101, 102}, {102, 103}, {103, 100}, + {96, 101}, {101, 100}, {100, 97}, {97, 96}, {98, 103}, {103, 102}, {102, 99}, {99, 98}, + {104, 105}, {105, 106}, {106, 107}, {107, 104}, {108, 109}, {109, 110}, {110, 111}, {111, 108}, + {111, 110}, {110, 105}, {105, 104}, {104, 111}, {108, 112}, {112, 113}, {113, 109}, {109, 108}, + {106, 114}, {114, 115}, {115, 107}, {107, 106}, {116, 117}, {117, 118}, {118, 119}, {119, 116}, + {112, 117}, {117, 116}, {116, 113}, {113, 112}, {114, 119}, {119, 118}, {118, 115}, {115, 114}, + {120, 121}, {121, 122}, {122, 123}, {123, 120}, {124, 125}, {125, 126}, {126, 127}, {127, 124}, + {127, 126}, {126, 121}, {121, 120}, {120, 127}, {124, 128}, {128, 129}, {129, 125}, {125, 124}, + {122, 130}, {130, 131}, {131, 123}, {123, 122}, {132, 133}, {133, 134}, {134, 135}, {135, 132}, + {128, 133}, {133, 132}, {132, 129}, {129, 128}, {130, 135}, {135, 134}, {134, 131}, {131, 130}, }; diff --git a/firmware/targets/f7/api_symbols.csv b/firmware/targets/f7/api_symbols.csv index d0df7c79d..d0948b9a8 100644 --- a/firmware/targets/f7/api_symbols.csv +++ b/firmware/targets/f7/api_symbols.csv @@ -498,6 +498,10 @@ Function,+,acquire_mutex,void*,"ValueMutex*, uint32_t" Function,-,aligned_alloc,void*,"size_t, size_t" Function,+,aligned_free,void,void* Function,+,aligned_malloc,void*,"size_t, size_t" +Function,-,alutech_get_custom_btn,uint8_t, +Function,-,alutech_get_original_btn,uint8_t, +Function,-,alutech_reset_original_btn,void, +Function,-,alutech_set_btn,void,uint8_t Function,-,arc4random,__uint32_t, Function,-,arc4random_buf,void,"void*, size_t" Function,-,arc4random_uniform,__uint32_t,__uint32_t @@ -1351,6 +1355,7 @@ Function,+,furi_hal_subghz_flush_rx,void, Function,+,furi_hal_subghz_flush_tx,void, Function,+,furi_hal_subghz_get_lqi,uint8_t, Function,+,furi_hal_subghz_get_radio_type,SubGhzRadioType, +Function,+,furi_hal_subghz_get_rolling_counter_mult,uint8_t, Function,+,furi_hal_subghz_get_rssi,float, Function,+,furi_hal_subghz_idle,void, Function,-,furi_hal_subghz_init,void, @@ -1372,6 +1377,7 @@ Function,+,furi_hal_subghz_set_frequency,uint32_t,uint32_t Function,+,furi_hal_subghz_set_frequency_and_path,uint32_t,uint32_t Function,+,furi_hal_subghz_set_path,void,FuriHalSubGhzPath Function,+,furi_hal_subghz_set_radio_type,_Bool,SubGhzRadioType +Function,+,furi_hal_subghz_set_rolling_counter_mult,void,uint8_t Function,-,furi_hal_subghz_shutdown,void, Function,+,furi_hal_subghz_sleep,void, Function,+,furi_hal_subghz_start_async_rx,void,"FuriHalSubGhzCaptureCallback, void*" @@ -1742,8 +1748,12 @@ Function,-,j1f,float,float Function,-,jn,double,"int, double" Function,-,jnf,float,"int, float" Function,-,jrand48,long,unsigned short[3] +Function,-,keeloq_get_custom_btn,uint8_t, +Function,-,keeloq_get_original_btn,uint8_t, Function,-,keeloq_reset_kl_type,void, Function,-,keeloq_reset_mfname,void, +Function,-,keeloq_reset_original_btn,void, +Function,-,keeloq_set_btn,void,uint8_t Function,-,l64a,char*,long Function,-,labs,long,long Function,-,lcong48,void,unsigned short[7] diff --git a/firmware/targets/f7/furi_hal/furi_hal_subghz.c b/firmware/targets/f7/furi_hal/furi_hal_subghz.c index 20b8d0839..451cda439 100644 --- a/firmware/targets/f7/furi_hal/furi_hal_subghz.c +++ b/firmware/targets/f7/furi_hal/furi_hal_subghz.c @@ -39,6 +39,7 @@ volatile FuriHalSubGhz furi_hal_subghz = { .radio_type = SubGhzRadioInternal, .spi_bus_handle = &furi_hal_spi_bus_handle_subghz, .cc1101_g0_pin = &gpio_cc1101_g0, + .rolling_counter_mult = 1, }; bool furi_hal_subghz_set_radio_type(SubGhzRadioType state) { @@ -62,6 +63,14 @@ SubGhzRadioType furi_hal_subghz_get_radio_type(void) { return furi_hal_subghz.radio_type; } +uint8_t furi_hal_subghz_get_rolling_counter_mult(void) { + return furi_hal_subghz.rolling_counter_mult; +} + +void furi_hal_subghz_set_rolling_counter_mult(uint8_t mult) { + furi_hal_subghz.rolling_counter_mult = mult; +} + void furi_hal_subghz_set_async_mirror_pin(const GpioPin* pin) { furi_hal_subghz.async_mirror_pin = pin; } diff --git a/firmware/targets/f7/furi_hal/furi_hal_subghz.h b/firmware/targets/f7/furi_hal/furi_hal_subghz.h index b19a71f9a..8ede17d32 100644 --- a/firmware/targets/f7/furi_hal/furi_hal_subghz.h +++ b/firmware/targets/f7/furi_hal/furi_hal_subghz.h @@ -77,6 +77,7 @@ typedef struct { SubGhzRadioType radio_type; FuriHalSpiBusHandle* spi_bus_handle; const GpioPin* cc1101_g0_pin; + uint8_t rolling_counter_mult; } FuriHalSubGhz; extern volatile FuriHalSubGhz furi_hal_subghz; @@ -309,6 +310,16 @@ void furi_hal_subghz_enable_ext_power(void); */ void furi_hal_subghz_disable_ext_power(void); +/** Get the current rolling protocols counter ++ value + * @return uint8_t current value + */ +uint8_t furi_hal_subghz_get_rolling_counter_mult(void); + +/** Set the current rolling protocols counter ++ value + * @param mult uint8_t = 1, 2, 4, 8 + */ +void furi_hal_subghz_set_rolling_counter_mult(uint8_t mult); + #ifdef __cplusplus } #endif diff --git a/lib/subghz/protocols/alutech_at_4n.c b/lib/subghz/protocols/alutech_at_4n.c index f8e6eb873..a3d5a4dd4 100644 --- a/lib/subghz/protocols/alutech_at_4n.c +++ b/lib/subghz/protocols/alutech_at_4n.c @@ -77,6 +77,25 @@ const SubGhzProtocol subghz_protocol_alutech_at_4n = { .encoder = &subghz_protocol_alutech_at_4n_encoder, }; +static uint8_t al_btn_temp_id; +static uint8_t al_btn_temp_id_original; + +void alutech_set_btn(uint8_t b) { + al_btn_temp_id = b; +} + +uint8_t alutech_get_original_btn() { + return al_btn_temp_id_original; +} + +uint8_t alutech_get_custom_btn() { + return al_btn_temp_id; +} + +void alutech_reset_original_btn() { + al_btn_temp_id_original = 0; +} + void* subghz_protocol_encoder_alutech_at_4n_alloc(SubGhzEnvironment* environment) { UNUSED(environment); SubGhzProtocolEncoderAlutech_at_4n* instance = @@ -255,8 +274,6 @@ static uint64_t subghz_protocol_alutech_at_4n_encrypt(uint64_t data, const char* static bool subghz_protocol_alutech_at_4n_gen_data( SubGhzProtocolEncoderAlutech_at_4n* instance, uint8_t btn) { - UNUSED(btn); - uint64_t data = subghz_protocol_blocks_reverse_key(instance->generic.data, 64); data = subghz_protocol_alutech_at_4n_decrypt( @@ -269,13 +286,13 @@ static bool subghz_protocol_alutech_at_4n_gen_data( } if(instance->generic.cnt < 0xFFFF) { - instance->generic.cnt++; + instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); } else if(instance->generic.cnt >= 0xFFFF) { instance->generic.cnt = 0; } crc = subghz_protocol_alutech_at_4n_decrypt_data_crc((uint8_t)(instance->generic.cnt & 0xFF)); data = (uint64_t)crc << 56 | (uint64_t)instance->generic.serial << 24 | - (uint32_t)instance->generic.cnt << 8 | instance->generic.btn; + (uint32_t)instance->generic.cnt << 8 | btn; data = subghz_protocol_alutech_at_4n_encrypt( data, instance->alutech_at_4n_rainbow_table_file_name); @@ -306,7 +323,7 @@ bool subghz_protocol_alutech_at_4n_create_data( /** * Generating an upload from data. - * @param instance Pointer to a SubGhzProtocolEncoderKeeloq instance + * @param instance Pointer to a SubGhzProtocolEncoderAlutech instance * @return true On success */ static bool subghz_protocol_encoder_alutech_at_4n_get_upload( @@ -314,6 +331,104 @@ static bool subghz_protocol_encoder_alutech_at_4n_get_upload( uint8_t btn) { furi_assert(instance); + // Save original button for later use + if(al_btn_temp_id_original == 0) { + al_btn_temp_id_original = btn; + } + + // Set custom button + if(al_btn_temp_id == 1) { + switch(al_btn_temp_id_original) { + case 0x11: + btn = 0x22; + break; + case 0x22: + btn = 0x11; + break; + case 0xFF: + btn = 0x11; + break; + case 0x44: + btn = 0x11; + break; + case 0x33: + btn = 0x11; + break; + + default: + break; + } + } + if(al_btn_temp_id == 2) { + switch(al_btn_temp_id_original) { + case 0x11: + btn = 0x44; + break; + case 0x22: + btn = 0x44; + break; + case 0xFF: + btn = 0x44; + break; + case 0x44: + btn = 0xFF; + break; + case 0x33: + btn = 0x44; + break; + + default: + break; + } + } + if(al_btn_temp_id == 3) { + switch(al_btn_temp_id_original) { + case 0x11: + btn = 0x33; + break; + case 0x22: + btn = 0x33; + break; + case 0xFF: + btn = 0x33; + break; + case 0x44: + btn = 0x33; + break; + case 0x33: + btn = 0x22; + break; + + default: + break; + } + } + if(al_btn_temp_id == 4) { + switch(al_btn_temp_id_original) { + case 0x11: + btn = 0xFF; + break; + case 0x22: + btn = 0xFF; + break; + case 0xFF: + btn = 0x22; + break; + case 0x44: + btn = 0x22; + break; + case 0x33: + btn = 0xFF; + break; + + default: + break; + } + } + + if((al_btn_temp_id == 0) && (al_btn_temp_id_original != 0)) { + btn = al_btn_temp_id_original; + } //gen new key if(subghz_protocol_alutech_at_4n_gen_data(instance, btn)) { //ToDo if you need to add a callback to automatically update the data on the display @@ -608,6 +723,11 @@ static void subghz_protocol_alutech_at_4n_remote_controller( instance->cnt = 0; instance->serial = 0; } + + // Save original button for later use + if(al_btn_temp_id_original == 0) { + al_btn_temp_id_original = instance->btn; + } } uint8_t subghz_protocol_decoder_alutech_at_4n_get_hash_data(void* context) { diff --git a/lib/subghz/protocols/alutech_at_4n.h b/lib/subghz/protocols/alutech_at_4n.h index 520e7289d..b0ac056dd 100644 --- a/lib/subghz/protocols/alutech_at_4n.h +++ b/lib/subghz/protocols/alutech_at_4n.h @@ -10,6 +10,14 @@ extern const SubGhzProtocolDecoder subghz_protocol_alutech_at_4n_decoder; extern const SubGhzProtocolEncoder subghz_protocol_alutech_at_4n_encoder; extern const SubGhzProtocol subghz_protocol_alutech_at_4n; +// Custom buttons +void alutech_set_btn(uint8_t b); + +uint8_t alutech_get_original_btn(); +uint8_t alutech_get_custom_btn(); + +void alutech_reset_original_btn(); + /** * Allocate SubGhzProtocolEncoderAlutech_at_4n. * @param environment Pointer to a SubGhzEnvironment instance diff --git a/lib/subghz/protocols/came_atomo.c b/lib/subghz/protocols/came_atomo.c index d12e5976c..e50130a75 100644 --- a/lib/subghz/protocols/came_atomo.c +++ b/lib/subghz/protocols/came_atomo.c @@ -136,7 +136,7 @@ static void uint8_t pack[8] = {}; if(instance->generic.cnt < 0xFFFF) { - instance->generic.cnt++; + instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); } else if(instance->generic.cnt >= 0xFFFF) { instance->generic.cnt = 0; } diff --git a/lib/subghz/protocols/faac_slh.c b/lib/subghz/protocols/faac_slh.c index 7572bd8ab..4b69ae73d 100644 --- a/lib/subghz/protocols/faac_slh.c +++ b/lib/subghz/protocols/faac_slh.c @@ -110,7 +110,7 @@ void subghz_protocol_encoder_faac_slh_free(void* context) { } static bool subghz_protocol_faac_slh_gen_data(SubGhzProtocolEncoderFaacSLH* instance) { - instance->generic.cnt++; + instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); uint32_t fix = instance->generic.serial << 4 | instance->generic.btn; uint32_t hop = 0; uint32_t decrypt = 0; diff --git a/lib/subghz/protocols/keeloq.c b/lib/subghz/protocols/keeloq.c index a0970de4d..0c601c256 100644 --- a/lib/subghz/protocols/keeloq.c +++ b/lib/subghz/protocols/keeloq.c @@ -85,7 +85,25 @@ const SubGhzProtocol subghz_protocol_keeloq = { }; static const char* mfname; -static int kl_type; +static uint8_t kl_type; +static uint8_t btn_temp_id; +static uint8_t btn_temp_id_original; + +void keeloq_set_btn(uint8_t b) { + btn_temp_id = b; +} + +uint8_t keeloq_get_original_btn() { + return btn_temp_id_original; +} + +uint8_t keeloq_get_custom_btn() { + return btn_temp_id; +} + +void keeloq_reset_original_btn() { + btn_temp_id_original = 0; +} void keeloq_reset_mfname() { mfname = ""; @@ -136,11 +154,16 @@ void subghz_protocol_encoder_keeloq_free(void* context) { * @param instance Pointer to a SubGhzProtocolEncoderKeeloq* instance * @param btn Button number, 4 bit */ -static bool subghz_protocol_keeloq_gen_data(SubGhzProtocolEncoderKeeloq* instance, uint8_t btn) { - if(instance->generic.cnt < 0xFFFF) { - instance->generic.cnt++; - } else if(instance->generic.cnt >= 0xFFFF) { - instance->generic.cnt = 0; +static bool subghz_protocol_keeloq_gen_data( + SubGhzProtocolEncoderKeeloq* instance, + uint8_t btn, + bool counter_up) { + if(counter_up) { + if(instance->generic.cnt < 0xFFFF) { + instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); + } else if(instance->generic.cnt >= 0xFFFF) { + instance->generic.cnt = 0; + } } uint32_t fix = (uint32_t)btn << 28 | instance->generic.serial; uint32_t decrypt = (uint32_t)btn << 28 | @@ -176,9 +199,9 @@ static bool subghz_protocol_keeloq_gen_data(SubGhzProtocolEncoderKeeloq* instanc hop = code_found_reverse & 0x00000000ffffffff; } else if(strcmp(instance->manufacture_name, "AN-Motors") == 0) { hop = (instance->generic.cnt & 0xFF) << 24 | (instance->generic.cnt & 0xFF) << 16 | - (instance->generic.btn & 0xF) << 12 | 0x404; + (btn & 0xF) << 12 | 0x404; } else if(strcmp(instance->manufacture_name, "HCS101") == 0) { - hop = instance->generic.cnt << 16 | (instance->generic.btn & 0xF) << 12 | 0x000; + hop = instance->generic.cnt << 16 | (btn & 0xF) << 12 | 0x000; } else { for M_EACH(manufacture_code, *subghz_keystore_get_data(instance->keystore), SubGhzKeyArray_t) { @@ -261,7 +284,7 @@ bool subghz_protocol_keeloq_create_data( instance->generic.cnt = cnt; instance->manufacture_name = manufacture_name; instance->generic.data_count_bit = 64; - bool res = subghz_protocol_keeloq_gen_data(instance, btn); + bool res = subghz_protocol_keeloq_gen_data(instance, btn, false); if(res) { res = subghz_block_generic_serialize(&instance->generic, flipper_format, preset); } @@ -286,7 +309,7 @@ bool subghz_protocol_keeloq_bft_create_data( instance->manufacture_name = manufacture_name; instance->generic.data_count_bit = 64; // roguuemaster don't steal.!!!! - bool res = subghz_protocol_keeloq_gen_data(instance, btn); + bool res = subghz_protocol_keeloq_gen_data(instance, btn, false); if(res) { res = subghz_block_generic_serialize(&instance->generic, flipper_format, preset); } @@ -302,8 +325,107 @@ static bool subghz_protocol_encoder_keeloq_get_upload(SubGhzProtocolEncoderKeeloq* instance, uint8_t btn) { furi_assert(instance); + // Save original button + if(btn_temp_id_original == 0) { + btn_temp_id_original = btn; + } + + // Set custom button + if(btn_temp_id == 1) { + switch(btn_temp_id_original) { + case 0x1: + btn = 0x2; + break; + case 0x2: + btn = 0x1; + break; + case 0xA: + btn = 0x1; + break; + case 0x4: + btn = 0x1; + break; + case 0x8: + btn = 0x1; + break; + + default: + break; + } + } + if(btn_temp_id == 2) { + switch(btn_temp_id_original) { + case 0x1: + btn = 0x4; + break; + case 0x2: + btn = 0x4; + break; + case 0xA: + btn = 0x4; + break; + case 0x4: + btn = 0xA; + break; + case 0x8: + btn = 0x4; + break; + + default: + break; + } + } + if(btn_temp_id == 3) { + switch(btn_temp_id_original) { + case 0x1: + btn = 0x8; + break; + case 0x2: + btn = 0x8; + break; + case 0xA: + btn = 0x8; + break; + case 0x4: + btn = 0x8; + break; + case 0x8: + btn = 0x2; + break; + + default: + break; + } + } + if(btn_temp_id == 4) { + switch(btn_temp_id_original) { + case 0x1: + btn = 0xA; + break; + case 0x2: + btn = 0xA; + break; + case 0xA: + btn = 0x2; + break; + case 0x4: + btn = 0x2; + break; + case 0x8: + btn = 0xA; + break; + + default: + break; + } + } + + if((btn_temp_id == 0) && (btn_temp_id_original != 0)) { + btn = btn_temp_id_original; + } + //gen new key - if(subghz_protocol_keeloq_gen_data(instance, btn)) { + if(subghz_protocol_keeloq_gen_data(instance, btn, true)) { //ToDo if you need to add a callback to automatically update the data on the display } else { return false; @@ -974,6 +1096,11 @@ static void subghz_protocol_keeloq_check_remote_controller( instance->serial = key_fix & 0x0FFFFFFF; instance->btn = key_fix >> 28; + + // Save original button for later use + if(btn_temp_id_original == 0) { + btn_temp_id_original = instance->btn; + } } uint8_t subghz_protocol_decoder_keeloq_get_hash_data(void* context) { diff --git a/lib/subghz/protocols/keeloq.h b/lib/subghz/protocols/keeloq.h index 7b0cfc3bd..9ddf17d89 100644 --- a/lib/subghz/protocols/keeloq.h +++ b/lib/subghz/protocols/keeloq.h @@ -15,6 +15,13 @@ void keeloq_reset_mfname(); void keeloq_reset_kl_type(); +void keeloq_set_btn(uint8_t b); + +uint8_t keeloq_get_original_btn(); +uint8_t keeloq_get_custom_btn(); + +void keeloq_reset_original_btn(); + /** * Allocate SubGhzProtocolEncoderKeeloq. * @param environment Pointer to a SubGhzEnvironment instance diff --git a/lib/subghz/protocols/kinggates_stylo_4k.c b/lib/subghz/protocols/kinggates_stylo_4k.c index 5f2a83d77..28af1b7c9 100644 --- a/lib/subghz/protocols/kinggates_stylo_4k.c +++ b/lib/subghz/protocols/kinggates_stylo_4k.c @@ -156,7 +156,7 @@ static bool subghz_protocol_kinggates_stylo_4k_gen_data( instance->generic.cnt = decrypt & 0xFFFF; if(instance->generic.cnt < 0xFFFF) { - instance->generic.cnt++; + instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); } else if(instance->generic.cnt >= 0xFFFF) { instance->generic.cnt = 0; } diff --git a/lib/subghz/protocols/nice_flor_s.c b/lib/subghz/protocols/nice_flor_s.c index 2d31c46af..67d3311cf 100644 --- a/lib/subghz/protocols/nice_flor_s.c +++ b/lib/subghz/protocols/nice_flor_s.c @@ -136,7 +136,7 @@ static void subghz_protocol_encoder_nice_flor_s_get_upload( } if(instance->generic.cnt < 0xFFFF) { - instance->generic.cnt++; + instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); } else if(instance->generic.cnt >= 0xFFFF) { instance->generic.cnt = 0; } diff --git a/lib/subghz/protocols/secplus_v2.c b/lib/subghz/protocols/secplus_v2.c index bcef90dad..d4fd9d13c 100644 --- a/lib/subghz/protocols/secplus_v2.c +++ b/lib/subghz/protocols/secplus_v2.c @@ -379,7 +379,7 @@ static void subghz_protocol_secplus_v2_encode(SubGhzProtocolEncoderSecPlus_v2* i uint8_t roll_1[9] = {0}; uint8_t roll_2[9] = {0}; - instance->generic.cnt++; + instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); //ToDo it is not known what value the counter starts if(instance->generic.cnt > 0xFFFFFFF) instance->generic.cnt = 0xE500000; uint32_t rolling = subghz_protocol_blocks_reverse_key(instance->generic.cnt, 28); diff --git a/lib/subghz/protocols/somfy_keytis.c b/lib/subghz/protocols/somfy_keytis.c index ab9202cc3..5d3516570 100644 --- a/lib/subghz/protocols/somfy_keytis.c +++ b/lib/subghz/protocols/somfy_keytis.c @@ -131,7 +131,7 @@ static bool instance->generic.serial = data & 0xFFFFFF; if(instance->generic.cnt < 0xFFFF) { - instance->generic.cnt++; + instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); } else if(instance->generic.cnt >= 0xFFFF) { instance->generic.cnt = 0; } diff --git a/lib/subghz/protocols/somfy_telis.c b/lib/subghz/protocols/somfy_telis.c index 96997c581..db44c0661 100644 --- a/lib/subghz/protocols/somfy_telis.c +++ b/lib/subghz/protocols/somfy_telis.c @@ -104,7 +104,7 @@ static bool instance->generic.serial = data & 0xFFFFFF; // address if(instance->generic.cnt < 0xFFFF) { - instance->generic.cnt++; + instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); } else if(instance->generic.cnt >= 0xFFFF) { instance->generic.cnt = 0; } diff --git a/lib/subghz/protocols/star_line.c b/lib/subghz/protocols/star_line.c index 3066c6e2b..7d5fbb2be 100644 --- a/lib/subghz/protocols/star_line.c +++ b/lib/subghz/protocols/star_line.c @@ -139,7 +139,7 @@ void subghz_protocol_encoder_star_line_free(void* context) { static bool subghz_protocol_star_line_gen_data(SubGhzProtocolEncoderStarLine* instance, uint8_t btn) { if(instance->generic.cnt < 0xFFFF) { - instance->generic.cnt++; + instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); } else if(instance->generic.cnt >= 0xFFFF) { instance->generic.cnt = 0; } From 4dbb55d74035556c25ce021f0b5de0eba474e63c Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sat, 25 Feb 2023 23:10:59 +0300 Subject: [PATCH 346/506] Beninca support --- ReadMe.md | 1 + lib/subghz/protocols/keeloq.c | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/ReadMe.md b/ReadMe.md index f5c9c20bb..154676cd8 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -68,6 +68,7 @@ Encoders/sending made by Eng1n33r & @xMasterX: - Keeloq: FAAC RC,XT - Keeloq: Mutancode - Keeloq: Normstahl +- Keeloq: Beninca - CAME Atomo - Nice Flor S - FAAC SLH (Spa) [External seed calculation required (For info contact me in Discord: Nano#8998)] diff --git a/lib/subghz/protocols/keeloq.c b/lib/subghz/protocols/keeloq.c index 0c601c256..a8bb7b39f 100644 --- a/lib/subghz/protocols/keeloq.c +++ b/lib/subghz/protocols/keeloq.c @@ -193,6 +193,11 @@ static bool subghz_protocol_keeloq_gen_data( decrypt = btn << 28 | (instance->generic.serial & 0xFF) << 16 | instance->generic.cnt; } + // Beninca -> 4bit serial - simple XOR + if(strcmp(instance->manufacture_name, "Beninca") == 0) { + decrypt = btn << 28 | (instance->generic.serial & 0xF) << 16 | instance->generic.cnt; + } + if(strcmp(instance->manufacture_name, "Unknown") == 0) { code_found_reverse = subghz_protocol_blocks_reverse_key( instance->generic.data, instance->generic.data_count_bit); From 172c0e077fcae840c1f87c5c0f02f9109f379886 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sat, 25 Feb 2023 23:25:32 +0300 Subject: [PATCH 347/506] Fix counter --- lib/subghz/protocols/alutech_at_4n.c | 6 +++++- lib/subghz/protocols/came_atomo.c | 6 +++++- lib/subghz/protocols/faac_slh.c | 6 +++++- lib/subghz/protocols/keeloq.c | 6 +++++- lib/subghz/protocols/kinggates_stylo_4k.c | 6 +++++- lib/subghz/protocols/nice_flor_s.c | 6 +++++- lib/subghz/protocols/secplus_v2.c | 6 +++++- lib/subghz/protocols/somfy_keytis.c | 6 +++++- lib/subghz/protocols/somfy_telis.c | 6 +++++- lib/subghz/protocols/star_line.c | 6 +++++- 10 files changed, 50 insertions(+), 10 deletions(-) diff --git a/lib/subghz/protocols/alutech_at_4n.c b/lib/subghz/protocols/alutech_at_4n.c index a3d5a4dd4..15887cd6d 100644 --- a/lib/subghz/protocols/alutech_at_4n.c +++ b/lib/subghz/protocols/alutech_at_4n.c @@ -286,7 +286,11 @@ static bool subghz_protocol_alutech_at_4n_gen_data( } if(instance->generic.cnt < 0xFFFF) { - instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); + if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) >= 0xFFFF) { + instance->generic.cnt = 0; + } else { + instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); + } } else if(instance->generic.cnt >= 0xFFFF) { instance->generic.cnt = 0; } diff --git a/lib/subghz/protocols/came_atomo.c b/lib/subghz/protocols/came_atomo.c index e50130a75..45403d279 100644 --- a/lib/subghz/protocols/came_atomo.c +++ b/lib/subghz/protocols/came_atomo.c @@ -136,7 +136,11 @@ static void uint8_t pack[8] = {}; if(instance->generic.cnt < 0xFFFF) { - instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); + if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) >= 0xFFFF) { + instance->generic.cnt = 0; + } else { + instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); + } } else if(instance->generic.cnt >= 0xFFFF) { instance->generic.cnt = 0; } diff --git a/lib/subghz/protocols/faac_slh.c b/lib/subghz/protocols/faac_slh.c index 4b69ae73d..6918101a9 100644 --- a/lib/subghz/protocols/faac_slh.c +++ b/lib/subghz/protocols/faac_slh.c @@ -110,7 +110,11 @@ void subghz_protocol_encoder_faac_slh_free(void* context) { } static bool subghz_protocol_faac_slh_gen_data(SubGhzProtocolEncoderFaacSLH* instance) { - instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); + if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) >= 0xFFFF) { + instance->generic.cnt = 0; + } else { + instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); + } uint32_t fix = instance->generic.serial << 4 | instance->generic.btn; uint32_t hop = 0; uint32_t decrypt = 0; diff --git a/lib/subghz/protocols/keeloq.c b/lib/subghz/protocols/keeloq.c index a8bb7b39f..efab023bc 100644 --- a/lib/subghz/protocols/keeloq.c +++ b/lib/subghz/protocols/keeloq.c @@ -160,7 +160,11 @@ static bool subghz_protocol_keeloq_gen_data( bool counter_up) { if(counter_up) { if(instance->generic.cnt < 0xFFFF) { - instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); + if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) >= 0xFFFF) { + instance->generic.cnt = 0; + } else { + instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); + } } else if(instance->generic.cnt >= 0xFFFF) { instance->generic.cnt = 0; } diff --git a/lib/subghz/protocols/kinggates_stylo_4k.c b/lib/subghz/protocols/kinggates_stylo_4k.c index 28af1b7c9..1823a072a 100644 --- a/lib/subghz/protocols/kinggates_stylo_4k.c +++ b/lib/subghz/protocols/kinggates_stylo_4k.c @@ -156,7 +156,11 @@ static bool subghz_protocol_kinggates_stylo_4k_gen_data( instance->generic.cnt = decrypt & 0xFFFF; if(instance->generic.cnt < 0xFFFF) { - instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); + if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) >= 0xFFFF) { + instance->generic.cnt = 0; + } else { + instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); + } } else if(instance->generic.cnt >= 0xFFFF) { instance->generic.cnt = 0; } diff --git a/lib/subghz/protocols/nice_flor_s.c b/lib/subghz/protocols/nice_flor_s.c index 67d3311cf..5120573f0 100644 --- a/lib/subghz/protocols/nice_flor_s.c +++ b/lib/subghz/protocols/nice_flor_s.c @@ -136,7 +136,11 @@ static void subghz_protocol_encoder_nice_flor_s_get_upload( } if(instance->generic.cnt < 0xFFFF) { - instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); + if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) >= 0xFFFF) { + instance->generic.cnt = 0; + } else { + instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); + } } else if(instance->generic.cnt >= 0xFFFF) { instance->generic.cnt = 0; } diff --git a/lib/subghz/protocols/secplus_v2.c b/lib/subghz/protocols/secplus_v2.c index d4fd9d13c..593be0494 100644 --- a/lib/subghz/protocols/secplus_v2.c +++ b/lib/subghz/protocols/secplus_v2.c @@ -379,7 +379,11 @@ static void subghz_protocol_secplus_v2_encode(SubGhzProtocolEncoderSecPlus_v2* i uint8_t roll_1[9] = {0}; uint8_t roll_2[9] = {0}; - instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); + if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) >= 0xFFFF) { + instance->generic.cnt = 0; + } else { + instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); + } //ToDo it is not known what value the counter starts if(instance->generic.cnt > 0xFFFFFFF) instance->generic.cnt = 0xE500000; uint32_t rolling = subghz_protocol_blocks_reverse_key(instance->generic.cnt, 28); diff --git a/lib/subghz/protocols/somfy_keytis.c b/lib/subghz/protocols/somfy_keytis.c index 5d3516570..1bcd89f42 100644 --- a/lib/subghz/protocols/somfy_keytis.c +++ b/lib/subghz/protocols/somfy_keytis.c @@ -131,7 +131,11 @@ static bool instance->generic.serial = data & 0xFFFFFF; if(instance->generic.cnt < 0xFFFF) { - instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); + if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) >= 0xFFFF) { + instance->generic.cnt = 0; + } else { + instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); + } } else if(instance->generic.cnt >= 0xFFFF) { instance->generic.cnt = 0; } diff --git a/lib/subghz/protocols/somfy_telis.c b/lib/subghz/protocols/somfy_telis.c index db44c0661..143171a05 100644 --- a/lib/subghz/protocols/somfy_telis.c +++ b/lib/subghz/protocols/somfy_telis.c @@ -104,7 +104,11 @@ static bool instance->generic.serial = data & 0xFFFFFF; // address if(instance->generic.cnt < 0xFFFF) { - instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); + if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) >= 0xFFFF) { + instance->generic.cnt = 0; + } else { + instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); + } } else if(instance->generic.cnt >= 0xFFFF) { instance->generic.cnt = 0; } diff --git a/lib/subghz/protocols/star_line.c b/lib/subghz/protocols/star_line.c index 7d5fbb2be..e09e7e951 100644 --- a/lib/subghz/protocols/star_line.c +++ b/lib/subghz/protocols/star_line.c @@ -139,7 +139,11 @@ void subghz_protocol_encoder_star_line_free(void* context) { static bool subghz_protocol_star_line_gen_data(SubGhzProtocolEncoderStarLine* instance, uint8_t btn) { if(instance->generic.cnt < 0xFFFF) { - instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); + if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) >= 0xFFFF) { + instance->generic.cnt = 0; + } else { + instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); + } } else if(instance->generic.cnt >= 0xFFFF) { instance->generic.cnt = 0; } From 098d6944c46d321d413e6e55ccced0404578c109 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sun, 26 Feb 2023 00:38:11 +0300 Subject: [PATCH 348/506] Update changelog --- CHANGELOG.md | 19 ++++--------------- ReadMe.md | 4 ++++ 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d9fd54ba0..dc2122e23 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,19 +1,8 @@ ### New changes -* Desktop: Autolock with PIN Code (by @Willy-JL | PR #338) - **Desktop settings (pin code, favourite app, autolock time) will be resetted!!! Only one time after installing - due to changes in settings structure, after installing of this release desktop settings will not be reset with next release** -* Desktop: Faster back button hold time for power off, was 2 seconds, now 1.3sec -* GUI: Fix keyboard capitalization bug (by @Willy-JL | PR #362) (fixes #361) -* Plugins: Added **SWD Probe** [(by g3gg0)](https://github.com/g3gg0/flipper-swd_probe) (moved from extra pack into main FW) -* Plugins: Show RSSI in Weather Station app and in POCSAG Pager app -* Plugins: Improve Tetris fall speed algorithm (by @p3ngu19z | PR #343) -* Plugins: Add missing buttons into HID app, remove old keyboard app, move Bluetooth remote to Misc -* Infrared: Assets update (by @amec0e | PR #340 / #357 / #358) -* Misc: Typo combing (by @Round-Pi | PR #352) -* OFW: Dolphin: drop holiday animation -* OFW: fbt: FBT_QUIET option; docs on environment -* OFW: Delete rwfiletest.bin on exit SDcard benchmark -* OFW: Re-init NFC when starting the worker -* OFW: Up toolchain version to 21 -* OFW: Display Mifare Classic data in NFC app +* SubGHz: **Beninca protocol support** +* SubGHz: **Hold right in received signal list to delete selected signal** +* SubGHz: **Custom buttons for Keeloq and Alutech AT4N** - now you can use arrow buttons to send signal with different button code +* SubGHz: Debug mode counter increase settings (+5, +10, default: +1) #### [🎲 Download latest extra apps pack](https://download-directory.github.io/?url=https://github.com/xMasterX/unleashed-extra-pack/tree/main/apps) diff --git a/ReadMe.md b/ReadMe.md index 154676cd8..4343d7803 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -165,6 +165,10 @@ Games: - Sub-GHz -> Press OK in frequency analyzer to use detected frequency in Read modes [(by derskythe)](https://github.com/DarkFlippers/unleashed-firmware/pull/77) - Sub-GHz -> Long press OK button in Sub-GHz Frequency analyzer to switch to Read menu [(by derskythe)](https://github.com/DarkFlippers/unleashed-firmware/pull/79) - Lock device with pin(or regular lock if pin not set) by holding UP button on main screen [(by an4tur0r)](https://github.com/DarkFlippers/unleashed-firmware/pull/107) +* SubGHz: **Hold right in received signal list to delete selected signal** +* SubGHz: **Custom buttons for Keeloq and Alutech AT4N** - now you can use arrow buttons to send signal with different button code +* SubGHz: Debug mode counter increase settings (+5, +10, default: +1) +* SubGHz: Debug PIN output settings for protocol development # Instructions ## [- How to install firmware](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/HowToInstall.md) From f676072e155cc4c0a87354ffb5726ef60d63cf7c Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sun, 26 Feb 2023 01:09:08 +0300 Subject: [PATCH 349/506] Fix custom button counter bug --- applications/main/subghz/scenes/subghz_scene_transmitter.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/applications/main/subghz/scenes/subghz_scene_transmitter.c b/applications/main/subghz/scenes/subghz_scene_transmitter.c index b1d1f467b..a036ea68c 100644 --- a/applications/main/subghz/scenes/subghz_scene_transmitter.c +++ b/applications/main/subghz/scenes/subghz_scene_transmitter.c @@ -93,6 +93,7 @@ bool subghz_scene_transmitter_on_event(void* context, SceneManagerEvent event) { if(keeloq_get_custom_btn() != 0) { keeloq_set_btn(0); alutech_set_btn(0); + furi_hal_subghz_set_rolling_counter_mult(0); // Calling restore! if(subghz->txrx->txrx_state == SubGhzTxRxStateRx) { subghz_rx_end(subghz); @@ -105,6 +106,7 @@ bool subghz_scene_transmitter_on_event(void* context, SceneManagerEvent event) { } subghz_tx_stop(subghz); subghz_sleep(subghz); + furi_hal_subghz_set_rolling_counter_mult(1); } return true; } else if(event.event == SubGhzCustomEventViewTransmitterBack) { From 20f9e1102f0d08d48cecf876d45a94a346b979ce Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Sat, 25 Feb 2023 23:24:09 +0000 Subject: [PATCH 350/506] Better bt pin code detection --- applications/services/bt/bt_service/bt.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/applications/services/bt/bt_service/bt.c b/applications/services/bt/bt_service/bt.c index 2d97ea7e5..7cef8e140 100644 --- a/applications/services/bt/bt_service/bt.c +++ b/applications/services/bt/bt_service/bt.c @@ -76,7 +76,6 @@ static void bt_pin_code_hide(Bt* bt) { static bool bt_pin_code_verify_event_handler(Bt* bt, uint32_t pin) { furi_assert(bt); - bt->pin = pin; if(bt_get_profile_pairing_method(bt) == GapPairingNone) return true; @@ -279,12 +278,14 @@ static bool bt_on_gap_event_callback(GapEvent event, void* context) { furi_message_queue_put(bt->message_queue, &message, FuriWaitForever) == FuriStatusOk); ret = true; } else if(event.type == GapEventTypePinCodeShow) { + bt->pin = event.data.pin_code; BtMessage message = { .type = BtMessageTypePinCodeShow, .data.pin_code = event.data.pin_code}; furi_check( furi_message_queue_put(bt->message_queue, &message, FuriWaitForever) == FuriStatusOk); ret = true; } else if(event.type == GapEventTypePinCodeVerify) { + bt->pin = event.data.pin_code; ret = bt_pin_code_verify_event_handler(bt, event.data.pin_code); } else if(event.type == GapEventTypeUpdateMTU) { bt->max_packet_size = event.data.max_packet_size; From 4aeec153c4253bc716d2832248a806b1838c8d72 Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Sun, 26 Feb 2023 00:55:49 +0000 Subject: [PATCH 351/506] Fix BadKB connection management and persistence --- applications/main/bad_kb/bad_kb_app.c | 2 +- applications/main/bad_kb/bad_kb_script.c | 143 ++++++------------ applications/main/bad_kb/bad_kb_script.h | 4 +- .../bad_kb/scenes/bad_kb_scene_config_bt.c | 2 +- .../bad_kb/scenes/bad_kb_scene_config_usb.c | 2 +- 5 files changed, 54 insertions(+), 99 deletions(-) diff --git a/applications/main/bad_kb/bad_kb_app.c b/applications/main/bad_kb/bad_kb_app.c index 5f1f17d78..8b694cadd 100644 --- a/applications/main/bad_kb/bad_kb_app.c +++ b/applications/main/bad_kb/bad_kb_app.c @@ -208,7 +208,7 @@ void bad_kb_app_free(BadKbApp* app) { // restores bt config // BtProfile have already been switched to the previous one // so we directly modify the right profile - bad_kb_connection_deinit(app->bt); + bad_kb_connection_deinit(app->bt, true); if(strcmp(app->bt_old_config.name, app->name) != 0) { furi_hal_bt_set_profile_adv_name(FuriHalBtProfileHidKeyboard, app->bt_old_config.name); } diff --git a/applications/main/bad_kb/bad_kb_script.c b/applications/main/bad_kb/bad_kb_script.c index 99622ff7c..f38f76c88 100644 --- a/applications/main/bad_kb/bad_kb_script.c +++ b/applications/main/bad_kb/bad_kb_script.c @@ -41,12 +41,6 @@ typedef enum { LevelRssiError = 0xFF, } LevelRssiRange; -typedef enum { - BadKbConnectionModeNone, - BadKbConnectionModeUsb, - BadKbConnectionModeBt, -} BadKbConnectionMode; - /** * Delays for waiting between HID key press and key release */ @@ -170,11 +164,10 @@ static const uint8_t numpad_keys[10] = { HID_KEYPAD_9, }; -BadKbConnectionMode connection_mode = BadKbConnectionModeNone; FuriHalUsbInterface* usb_mode_prev = NULL; GapPairing bt_mode_prev = GapPairingNone; -bool bt_connected = false; -bool usb_connected = false; +bool usb_initialized = false; +bool bt_initialized = false; uint8_t bt_timeout = 0; static LevelRssiRange bt_remote_rssi_range(Bt* bt) { @@ -607,10 +600,8 @@ static void bad_kb_bt_hid_state_callback(BtStatus status, void* context) { if(r != LevelRssiError) { bt_timeout = bt_hid_delays[r]; } - bt_connected = true; furi_thread_flags_set(furi_thread_get_id(bad_kb->thread), WorkerEvtConnect); } else { - bt_connected = false; furi_thread_flags_set(furi_thread_get_id(bad_kb->thread), WorkerEvtDisconnect); } } @@ -620,82 +611,48 @@ static void bad_kb_usb_hid_state_callback(bool state, void* context) { BadKbScript* bad_kb = context; if(state == true) { - usb_connected = true; furi_thread_flags_set(furi_thread_get_id(bad_kb->thread), WorkerEvtConnect); } else { - usb_connected = false; furi_thread_flags_set(furi_thread_get_id(bad_kb->thread), WorkerEvtDisconnect); } } -void bad_kb_bt_init(Bt* bt) { - bt_timeout = bt_hid_delays[LevelRssi39_0]; - bt_disconnect(bt); - furi_delay_ms(200); - bt_keys_storage_set_storage_path(bt, HID_BT_KEYS_STORAGE_PATH); - furi_assert(bt_set_profile(bt, BtProfileHidKeyboard)); - bt_mode_prev = bt_get_profile_pairing_method(bt); - bt_set_profile_pairing_method(bt, GapPairingNone); - furi_hal_bt_start_advertising(); - // disable peer key adding to bt SRAM storage - bt_disable_peer_key_update(bt); - - connection_mode = BadKbConnectionModeBt; -} - -void bad_kb_bt_deinit(Bt* bt) { - // release all keys - // bt_hid_hold_while_keyboard_buffer_full(6, 3000); - - // stop ble - bt_disconnect(bt); - - // Wait 2nd core to update nvm storage - furi_delay_ms(200); - - bt_keys_storage_set_default_path(bt); - - bt_set_profile_pairing_method(bt, bt_mode_prev); - - // fails if ble radio stack isn't ready when switching profile - // if it happens, maybe we should increase the delay after bt_disconnect - bt_set_profile(bt, BtProfileSerial); - - // starts saving peer keys (bounded devices) - bt_enable_peer_key_update(bt); - - connection_mode = BadKbConnectionModeNone; -} - -void bad_kb_usb_init() { - usb_mode_prev = furi_hal_usb_get_config(); - - connection_mode = BadKbConnectionModeUsb; -} - -void bad_kb_usb_deinit() { - furi_hal_usb_set_config(usb_mode_prev, NULL); - - connection_mode = BadKbConnectionModeNone; -} - void bad_kb_connection_init(Bt* bt) { - if(connection_mode != BadKbConnectionModeNone) return; - - if(bt) { - bad_kb_bt_init(bt); - } else { - bad_kb_usb_init(); + if(bt && !bt_initialized) { + bt_timeout = bt_hid_delays[LevelRssi39_0]; + bt_disconnect(bt); + furi_delay_ms(200); + bt_keys_storage_set_storage_path(bt, HID_BT_KEYS_STORAGE_PATH); + furi_assert(bt_set_profile(bt, BtProfileHidKeyboard)); + bt_mode_prev = bt_get_profile_pairing_method(bt); + bt_set_profile_pairing_method(bt, GapPairingNone); + furi_hal_bt_start_advertising(); + // disable peer key adding to bt SRAM storage + bt_disable_peer_key_update(bt); + bt_initialized = true; + } + if(!bt && !usb_initialized) { + usb_mode_prev = furi_hal_usb_get_config(); + usb_initialized = true; } } -void bad_kb_connection_deinit(Bt* bt) { - if(connection_mode == BadKbConnectionModeNone) return; - - if(connection_mode == BadKbConnectionModeBt) { - bad_kb_bt_deinit(bt); - } else { - bad_kb_usb_deinit(); +void bad_kb_connection_deinit(Bt* bt, bool reset_bt) { + if(bt_initialized && reset_bt && bt) { + // bt_hid_hold_while_keyboard_buffer_full(6, 3000); // release all keys + bt_disconnect(bt); // stop ble + furi_delay_ms(200); // Wait 2nd core to update nvm storage + bt_keys_storage_set_default_path(bt); + bt_set_profile_pairing_method(bt, bt_mode_prev); + // fails if ble radio stack isn't ready when switching profile + // if it happens, maybe we should increase the delay after bt_disconnect + bt_set_profile(bt, BtProfileSerial); + bt_enable_peer_key_update(bt); // starts saving peer keys (bounded devices) + bt_initialized = false; + } + if(usb_initialized) { + furi_hal_usb_set_config(usb_mode_prev, NULL); + usb_initialized = false; } } @@ -706,7 +663,6 @@ static int32_t bad_kb_worker(void* context) { int32_t delay_val = 0; bad_kb_connection_init(bad_kb->bt); - if(bad_kb->bt) { bt_set_status_changed_callback(bad_kb->bt, bad_kb_bt_hid_state_callback, bad_kb); } else { @@ -727,7 +683,11 @@ static int32_t bad_kb_worker(void* context) { FSOM_OPEN_EXISTING)) { if((ducky_script_preload(bad_kb, script_file)) && (bad_kb->st.line_nb > 0)) { if(bad_kb->bt) { - worker_state = BadKbStateNotConnected; // Ready to run + if(furi_hal_bt_is_connected()) { + worker_state = BadKbStateIdle; // Ready to run + } else { + worker_state = BadKbStateNotConnected; // Not connected + } } else { if(furi_hal_hid_is_connected()) { worker_state = BadKbStateIdle; // Ready to run @@ -745,21 +705,17 @@ static int32_t bad_kb_worker(void* context) { bad_kb->st.state = worker_state; } else if(worker_state == BadKbStateNotConnected) { // State: Not connected - if((bad_kb->bt && bt_connected) || (!bad_kb->bt && usb_connected)) { + uint32_t flags = furi_thread_flags_wait( + WorkerEvtEnd | WorkerEvtConnect | WorkerEvtToggle, + FuriFlagWaitAny, + FuriWaitForever); + furi_check((flags & FuriFlagError) == 0); + if(flags & WorkerEvtEnd) { + break; + } else if(flags & WorkerEvtConnect) { worker_state = BadKbStateIdle; // Ready to run - } else { - uint32_t flags = furi_thread_flags_wait( - WorkerEvtEnd | WorkerEvtConnect | WorkerEvtToggle, - FuriFlagWaitAny, - FuriWaitForever); - furi_check((flags & FuriFlagError) == 0); - if(flags & WorkerEvtEnd) { - break; - } else if(flags & WorkerEvtConnect) { - worker_state = BadKbStateIdle; // Ready to run - } else if(flags & WorkerEvtToggle) { - worker_state = BadKbStateWillRun; // Will run when connected - } + } else if(flags & WorkerEvtToggle) { + worker_state = BadKbStateWillRun; // Will run when connected } bad_kb->st.state = worker_state; @@ -892,6 +848,7 @@ static int32_t bad_kb_worker(void* context) { } else { furi_hal_hid_set_state_callback(NULL, NULL); } + bad_kb_connection_deinit(bad_kb->bt, false); storage_file_close(script_file); storage_file_free(script_file); diff --git a/applications/main/bad_kb/bad_kb_script.h b/applications/main/bad_kb/bad_kb_script.h index 0773cf05e..bdfd6bb8a 100644 --- a/applications/main/bad_kb/bad_kb_script.h +++ b/applications/main/bad_kb/bad_kb_script.h @@ -31,9 +31,7 @@ typedef struct { char error[64]; } BadKbState; -void bad_kb_connection_init(Bt* bt); - -void bad_kb_connection_deinit(Bt* bt); +void bad_kb_connection_deinit(Bt* bt, bool reset_bt); BadKbScript* bad_kb_script_open(FuriString* file_path, Bt* bt); diff --git a/applications/main/bad_kb/scenes/bad_kb_scene_config_bt.c b/applications/main/bad_kb/scenes/bad_kb_scene_config_bt.c index 4412f0796..b3b0ec2bb 100644 --- a/applications/main/bad_kb/scenes/bad_kb_scene_config_bt.c +++ b/applications/main/bad_kb/scenes/bad_kb_scene_config_bt.c @@ -57,7 +57,7 @@ bool bad_kb_scene_config_bt_on_event(void* context, SceneManagerEvent event) { scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigLayout); } else if(event.event == VarItemListIndexConnection) { bad_kb_script_close(bad_kb->bad_kb_script); - bad_kb_connection_deinit(bad_kb->bt); + bad_kb_connection_deinit(bad_kb->bt, true); bad_kb->bad_kb_script = bad_kb_script_open(bad_kb->file_path, bad_kb->is_bt ? bad_kb->bt : NULL); bad_kb_script_set_keyboard_layout(bad_kb->bad_kb_script, bad_kb->keyboard_layout); diff --git a/applications/main/bad_kb/scenes/bad_kb_scene_config_usb.c b/applications/main/bad_kb/scenes/bad_kb_scene_config_usb.c index 232ef8796..2fa264e7c 100644 --- a/applications/main/bad_kb/scenes/bad_kb_scene_config_usb.c +++ b/applications/main/bad_kb/scenes/bad_kb_scene_config_usb.c @@ -51,7 +51,7 @@ bool bad_kb_scene_config_usb_on_event(void* context, SceneManagerEvent event) { scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigLayout); } else if(event.event == VarItemListIndexConnection) { bad_kb_script_close(bad_kb->bad_kb_script); - bad_kb_connection_deinit(bad_kb->bt); + bad_kb_connection_deinit(bad_kb->bt, true); bad_kb->bad_kb_script = bad_kb_script_open(bad_kb->file_path, bad_kb->is_bt ? bad_kb->bt : NULL); bad_kb_script_set_keyboard_layout(bad_kb->bad_kb_script, bad_kb->keyboard_layout); From d33b092a9d03ff897aafae2a4f4b81b58d7a7483 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sun, 26 Feb 2023 04:13:28 +0300 Subject: [PATCH 352/506] Fix Subghz item removal bug --- .../subghz/scenes/subghz_scene_receiver.c | 13 ++--- applications/main/subghz/subghz_history.c | 6 +-- applications/main/subghz/views/receiver.c | 51 ++++++++++--------- applications/main/subghz/views/receiver.h | 2 + 4 files changed, 33 insertions(+), 39 deletions(-) diff --git a/applications/main/subghz/scenes/subghz_scene_receiver.c b/applications/main/subghz/scenes/subghz_scene_receiver.c index ba1e2faed..c0112199c 100644 --- a/applications/main/subghz/scenes/subghz_scene_receiver.c +++ b/applications/main/subghz/scenes/subghz_scene_receiver.c @@ -207,16 +207,9 @@ bool subghz_scene_receiver_on_event(void* context, SceneManagerEvent event) { case SubGhzCustomEventViewReceiverDeleteItem: subghz->txrx->idx_menu_chosen = subghz_view_receiver_get_idx_menu(subghz->subghz_receiver); - if(subghz->txrx->idx_menu_chosen == 0) { - subghz_history_delete_item(subghz->txrx->history, subghz->txrx->idx_menu_chosen); - subghz_view_receiver_set_idx_menu( - subghz->subghz_receiver, subghz->txrx->idx_menu_chosen); - } else { - subghz_history_delete_item( - subghz->txrx->history, subghz->txrx->idx_menu_chosen + 1); - subghz_view_receiver_set_idx_menu( - subghz->subghz_receiver, subghz->txrx->idx_menu_chosen); - } + + subghz_history_delete_item(subghz->txrx->history, subghz->txrx->idx_menu_chosen); + subghz_view_receiver_delete_element_callback(subghz->subghz_receiver); subghz_scene_receiver_update_statusbar(subghz); consumed = true; diff --git a/applications/main/subghz/subghz_history.c b/applications/main/subghz/subghz_history.c index 1df7d0238..f6530238e 100644 --- a/applications/main/subghz/subghz_history.c +++ b/applications/main/subghz/subghz_history.c @@ -92,14 +92,12 @@ void subghz_history_delete_item(SubGhzHistory* instance, uint16_t item_id) { furi_assert(instance); SubGhzHistoryItemArray_it_t it; - SubGhzHistoryItem* target_item = SubGhzHistoryItemArray_get(instance->history->data, item_id); + //SubGhzHistoryItem* target_item = SubGhzHistoryItemArray_get(instance->history->data, item_id); SubGhzHistoryItemArray_it_last(it, instance->history->data); while(!SubGhzHistoryItemArray_end_p(it)) { SubGhzHistoryItem* item = SubGhzHistoryItemArray_ref(it); - if(strcmp( - furi_string_get_cstr(item->item_str), - furi_string_get_cstr(target_item->item_str)) == 0) { + if(it->index == (size_t)(item_id)) { furi_string_free(item->item_str); furi_string_free(item->preset->name); free(item->preset); diff --git a/applications/main/subghz/views/receiver.c b/applications/main/subghz/views/receiver.c index 74c7d749b..71ff85448 100644 --- a/applications/main/subghz/views/receiver.c +++ b/applications/main/subghz/views/receiver.c @@ -434,44 +434,24 @@ bool subghz_view_receiver_input(InputEvent* event, void* context) { { if(model->history_item != 0) { SubGhzReceiverMenuItemArray_it_t it; - SubGhzReceiverMenuItem* target_item = - SubGhzReceiverMenuItemArray_get(model->history->data, model->idx); + // SubGhzReceiverMenuItem* target_item = + // SubGhzReceiverMenuItemArray_get(model->history->data, model->idx); SubGhzReceiverMenuItemArray_it_last(it, model->history->data); while(!SubGhzReceiverMenuItemArray_end_p(it)) { SubGhzReceiverMenuItem* item = SubGhzReceiverMenuItemArray_ref(it); - if(strcmp( - furi_string_get_cstr(item->item_str), - furi_string_get_cstr(target_item->item_str)) == 0) { + if(it->index == (size_t)(model->idx)) { furi_string_free(item->item_str); item->type = 0; SubGhzReceiverMenuItemArray_remove(model->history->data, it); - if(model->history_item == 5) { - if(model->idx >= 2) { - model->idx = model->history_item - 1; - } - } - if(model->idx == model->history_item - 1) { - if(model->idx != 0) { - model->idx--; - } - } } SubGhzReceiverMenuItemArray_previous(it); } - } - }, - true); - with_view_model( - subghz_receiver->view, - SubGhzViewReceiverModel * model, - { - if(model->history_item != 0) { + // Callback subghz_receiver->callback( SubGhzCustomEventViewReceiverDeleteItem, subghz_receiver->context); - model->history_item--; } }, true); @@ -588,12 +568,33 @@ View* subghz_view_receiver_get_view(SubGhzViewReceiver* subghz_receiver) { uint16_t subghz_view_receiver_get_idx_menu(SubGhzViewReceiver* subghz_receiver) { furi_assert(subghz_receiver); - uint32_t idx = 0; + uint16_t idx = 0; with_view_model( subghz_receiver->view, SubGhzViewReceiverModel * model, { idx = model->idx; }, false); return idx; } +void subghz_view_receiver_delete_element_callback(SubGhzViewReceiver* subghz_receiver) { + furi_assert(subghz_receiver); + + with_view_model( + subghz_receiver->view, + SubGhzViewReceiverModel * model, + { + if(model->history_item == 5) { + if(model->idx >= 2) { + model->idx = model->history_item - 1; + } + } + model->history_item--; + + if(model->idx != 0) { + model->idx--; + } + }, + true); +} + void subghz_view_receiver_set_idx_menu(SubGhzViewReceiver* subghz_receiver, uint16_t idx) { furi_assert(subghz_receiver); with_view_model( diff --git a/applications/main/subghz/views/receiver.h b/applications/main/subghz/views/receiver.h index 37eb473de..ad8c31eda 100644 --- a/applications/main/subghz/views/receiver.h +++ b/applications/main/subghz/views/receiver.h @@ -46,4 +46,6 @@ uint16_t subghz_view_receiver_get_idx_menu(SubGhzViewReceiver* subghz_receiver); void subghz_view_receiver_set_idx_menu(SubGhzViewReceiver* subghz_receiver, uint16_t idx); +void subghz_view_receiver_delete_element_callback(SubGhzViewReceiver* subghz_receiver); + void subghz_view_receiver_exit(void* context); From a435959ee3a46023dbf7ae4345e60b24d582dad0 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sun, 26 Feb 2023 04:14:55 +0300 Subject: [PATCH 353/506] Fix counter settings being reset w custom btns --- applications/main/subghz/scenes/subghz_scene_transmitter.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/applications/main/subghz/scenes/subghz_scene_transmitter.c b/applications/main/subghz/scenes/subghz_scene_transmitter.c index a036ea68c..53fc95981 100644 --- a/applications/main/subghz/scenes/subghz_scene_transmitter.c +++ b/applications/main/subghz/scenes/subghz_scene_transmitter.c @@ -93,6 +93,7 @@ bool subghz_scene_transmitter_on_event(void* context, SceneManagerEvent event) { if(keeloq_get_custom_btn() != 0) { keeloq_set_btn(0); alutech_set_btn(0); + uint8_t tmp_counter = furi_hal_subghz_get_rolling_counter_mult(); furi_hal_subghz_set_rolling_counter_mult(0); // Calling restore! if(subghz->txrx->txrx_state == SubGhzTxRxStateRx) { @@ -106,7 +107,7 @@ bool subghz_scene_transmitter_on_event(void* context, SceneManagerEvent event) { } subghz_tx_stop(subghz); subghz_sleep(subghz); - furi_hal_subghz_set_rolling_counter_mult(1); + furi_hal_subghz_set_rolling_counter_mult(tmp_counter); } return true; } else if(event.event == SubGhzCustomEventViewTransmitterBack) { From 543346f885259432ae7e700f9fe9e7a029100a46 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sun, 26 Feb 2023 04:22:06 +0300 Subject: [PATCH 354/506] Fix BadUSB bug (#365) --- applications/main/bad_usb/scenes/bad_usb_scene_work.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/applications/main/bad_usb/scenes/bad_usb_scene_work.c b/applications/main/bad_usb/scenes/bad_usb_scene_work.c index 187b83bd9..337c329dd 100644 --- a/applications/main/bad_usb/scenes/bad_usb_scene_work.c +++ b/applications/main/bad_usb/scenes/bad_usb_scene_work.c @@ -31,6 +31,8 @@ bool bad_usb_scene_work_on_event(void* context, SceneManagerEvent event) { void bad_usb_scene_work_on_enter(void* context) { BadUsbApp* app = context; + furi_check(furi_hal_usb_set_config(NULL, NULL)); + FuriString* file_name; file_name = furi_string_alloc(); path_extract_filename(app->file_path, file_name, true); From 3207fbab3f05f97de0aebab357b2756ae08a389e Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Sun, 26 Feb 2023 01:41:07 +0000 Subject: [PATCH 355/506] Show BadKB connection mode in main view --- applications/main/bad_kb/bad_kb_script.c | 1 + applications/main/bad_kb/bad_kb_script.h | 1 + applications/main/bad_kb/views/bad_kb_view.c | 3 ++- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/applications/main/bad_kb/bad_kb_script.c b/applications/main/bad_kb/bad_kb_script.c index f38f76c88..018dbb51b 100644 --- a/applications/main/bad_kb/bad_kb_script.c +++ b/applications/main/bad_kb/bad_kb_script.c @@ -878,6 +878,7 @@ BadKbScript* bad_kb_script_open(FuriString* file_path, Bt* bt) { bad_kb->st.state = BadKbStateInit; bad_kb->st.error[0] = '\0'; + bad_kb->st.is_bt = !!bt; bad_kb->bt = bt; diff --git a/applications/main/bad_kb/bad_kb_script.h b/applications/main/bad_kb/bad_kb_script.h index bdfd6bb8a..fde99556e 100644 --- a/applications/main/bad_kb/bad_kb_script.h +++ b/applications/main/bad_kb/bad_kb_script.h @@ -23,6 +23,7 @@ typedef enum { typedef struct { BadKbWorkerState state; + bool is_bt; uint32_t pin; uint16_t line_cur; uint16_t line_nb; diff --git a/applications/main/bad_kb/views/bad_kb_view.c b/applications/main/bad_kb/views/bad_kb_view.c index 1e131a1ee..d20969d00 100644 --- a/applications/main/bad_kb/views/bad_kb_view.c +++ b/applications/main/bad_kb/views/bad_kb_view.c @@ -25,7 +25,8 @@ static void bad_kb_draw_callback(Canvas* canvas, void* _model) { BadKbModel* model = _model; FuriString* disp_str; - disp_str = furi_string_alloc_set(model->file_name); + disp_str = furi_string_alloc_set(model->state.is_bt ? "(BT) " : "(USB) "); + furi_string_cat_str(disp_str, model->file_name); elements_string_fit_width(canvas, disp_str, 128 - 2); canvas_set_font(canvas, FontSecondary); canvas_draw_str(canvas, 2, 8, furi_string_get_cstr(disp_str)); From 9ff49110a0c72571a0351892182fcb928d6adc3a Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Sun, 26 Feb 2023 01:41:40 +0000 Subject: [PATCH 356/506] Cleaner BadKB pin sync --- applications/main/bad_kb/views/bad_kb_view.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/applications/main/bad_kb/views/bad_kb_view.c b/applications/main/bad_kb/views/bad_kb_view.c index d20969d00..3f5ec131d 100644 --- a/applications/main/bad_kb/views/bad_kb_view.c +++ b/applications/main/bad_kb/views/bad_kb_view.c @@ -219,11 +219,14 @@ void bad_kb_set_layout(BadKb* bad_kb, const char* layout) { void bad_kb_set_state(BadKb* bad_kb, BadKbState* st) { furi_assert(st); - if(bad_kb->context != NULL && ((BadKbApp*)bad_kb->context)->bt != NULL) { - st->pin = ((BadKbApp*)bad_kb->context)->bt->pin; - } else { - st->pin = 0; + uint32_t pin = 0; + if(bad_kb->context != NULL) { + BadKbApp* app = bad_kb->context; + if(app->bt != NULL) { + pin = app->bt->pin; + } } + st->pin = pin; with_view_model( bad_kb->view, BadKbModel * model, From 27976b0bd2eb656517a6f6861198b594b64ec8cc Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Sun, 26 Feb 2023 01:42:34 +0000 Subject: [PATCH 357/506] Cleaner BT HID name set --- firmware/targets/f7/furi_hal/furi_hal_bt.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/firmware/targets/f7/furi_hal/furi_hal_bt.c b/firmware/targets/f7/furi_hal/furi_hal_bt.c index 20c4b25ee..6bb083873 100644 --- a/firmware/targets/f7/furi_hal/furi_hal_bt.c +++ b/firmware/targets/f7/furi_hal/furi_hal_bt.c @@ -222,9 +222,7 @@ bool furi_hal_bt_start_app(FuriHalBtProfile profile, GapEventCallback event_cb, } // Change name Flipper -> Control if(strlen(&config->adv_name[1]) == 0) { - const char* clicker_str = "Control "; - memcpy(&config->adv_name[1], clicker_str, strlen(clicker_str)); - strlcat(&config->adv_name[1], furi_hal_version_get_ble_local_device_name_ptr(), FURI_HAL_VERSION_DEVICE_NAME_LENGTH); + snprintf(&config->adv_name[1], strlen("Control ") + FURI_HAL_VERSION_DEVICE_NAME_LENGTH, "Control %s", furi_hal_version_get_ble_local_device_name_ptr()); } } if(!gap_init(config, event_cb, context)) { From 991d49733f292d260971616406b3295b9d0d4fff Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Sun, 26 Feb 2023 01:44:32 +0000 Subject: [PATCH 358/506] Format --- .../main/nfc/scenes/nfc_scene_nfc_data_info.c | 3 +- applications/main/subghz/views/receiver.c | 6 +- .../scenes/xtreme_app_scene_dolphin.c | 13 +- .../scenes/xtreme_app_scene_graphics.c | 3 +- .../xtreme_app/scenes/xtreme_app_scene_misc.c | 16 +- .../scenes/xtreme_app_scene_misc_rename.c | 13 +- .../scenes/xtreme_app_scene_start.c | 40 +- applications/main/xtreme_app/xtreme_app.c | 27 +- .../plugins/minesweeper/minesweeper.c | 1 - .../plugins/swd_probe/model/model_chip.h | 522 ++++-------------- applications/services/dolphin/dolphin.c | 6 +- applications/services/gui/gui.c | 6 +- .../services/gui/modules/text_input.c | 90 +-- .../services/namechangersrv/namechangersrv.c | 1 - applications/services/xtreme/settings.c | 1 - .../scenes/desktop_settings_scene_start.c | 6 +- .../targets/f7/furi_hal/furi_hal_subghz.c | 70 +-- 17 files changed, 264 insertions(+), 560 deletions(-) diff --git a/applications/main/nfc/scenes/nfc_scene_nfc_data_info.c b/applications/main/nfc/scenes/nfc_scene_nfc_data_info.c index bcc8a2122..d6cb48047 100644 --- a/applications/main/nfc/scenes/nfc_scene_nfc_data_info.c +++ b/applications/main/nfc/scenes/nfc_scene_nfc_data_info.c @@ -26,8 +26,7 @@ void nfc_scene_nfc_data_info_on_enter(void* context) { NfcProtocol protocol = dev_data->protocol; uint8_t text_scroll_height = 0; if((protocol == NfcDeviceProtocolMifareDesfire) || (protocol == NfcDeviceProtocolMifareUl) || - (protocol == NfcDeviceProtocolNfcV) || - (protocol == NfcDeviceProtocolMifareClassic)) { + (protocol == NfcDeviceProtocolNfcV) || (protocol == NfcDeviceProtocolMifareClassic)) { widget_add_button_element( widget, GuiButtonTypeRight, "More", nfc_scene_nfc_data_info_widget_callback, nfc); text_scroll_height = 52; diff --git a/applications/main/subghz/views/receiver.c b/applications/main/subghz/views/receiver.c index f5c48598b..be683be28 100644 --- a/applications/main/subghz/views/receiver.c +++ b/applications/main/subghz/views/receiver.c @@ -265,7 +265,8 @@ void subghz_view_receiver_draw(Canvas* canvas, SubGhzViewReceiverModel* model) { canvas, 0, 0, - furi_hal_subghz_get_radio_type() ? XTREME_ASSETS()->I_Fishing_123x52 : XTREME_ASSETS()->I_Scanning_123x52); + furi_hal_subghz_get_radio_type() ? XTREME_ASSETS()->I_Fishing_123x52 : + XTREME_ASSETS()->I_Scanning_123x52); canvas_set_font(canvas, FontPrimary); canvas_draw_str(canvas, 63, 46, "Scanning..."); //canvas_draw_line(canvas, 46, 51, 125, 51); @@ -275,7 +276,8 @@ void subghz_view_receiver_draw(Canvas* canvas, SubGhzViewReceiverModel* model) { canvas, 0, 0, - furi_hal_subghz_get_radio_type() ? XTREME_ASSETS()->I_Fishing_123x52 : XTREME_ASSETS()->I_Scanning_123x52); + furi_hal_subghz_get_radio_type() ? XTREME_ASSETS()->I_Fishing_123x52 : + XTREME_ASSETS()->I_Scanning_123x52); canvas_set_font(canvas, FontPrimary); canvas_draw_str(canvas, 63, 46, "Decoding..."); canvas_set_font(canvas, FontSecondary); diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_dolphin.c b/applications/main/xtreme_app/scenes/xtreme_app_scene_dolphin.c index 2926de539..2a4943e45 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_dolphin.c +++ b/applications/main/xtreme_app/scenes/xtreme_app_scene_dolphin.c @@ -9,17 +9,8 @@ static void xtreme_app_scene_dolphin_xp_level_changed(VariableItem* item) { app->save_level = true; } -const char* const butthurt_timer_names[] = { - "OFF", - "30 M", - "1 H", - "2 H", - "4 H", - "6 H", - "8 H", - "12 H", - "24 H", - "48 H"}; +const char* const butthurt_timer_names[] = + {"OFF", "30 M", "1 H", "2 H", "4 H", "6 H", "8 H", "12 H", "24 H", "48 H"}; const int32_t butthurt_timer_values[COUNT_OF(butthurt_timer_names)] = {-1, 1800, 3600, 7200, 14400, 21600, 28800, 43200, 86400, 172800}; static void xtreme_app_scene_dolphin_butthurt_timer_changed(VariableItem* item) { diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_graphics.c b/applications/main/xtreme_app/scenes/xtreme_app_scene_graphics.c index 9d3b20dd2..4698a9d21 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_graphics.c +++ b/applications/main/xtreme_app/scenes/xtreme_app_scene_graphics.c @@ -73,7 +73,8 @@ void xtreme_app_scene_graphics_on_enter(void* context) { app); variable_item_set_current_value_index(item, app->asset_pack); variable_item_set_current_value_text( - item, app->asset_pack == 0 ? "SFW" : *asset_packs_get(app->asset_packs, app->asset_pack - 1)); + item, + app->asset_pack == 0 ? "SFW" : *asset_packs_get(app->asset_packs, app->asset_pack - 1)); item = variable_item_list_add( var_item_list, diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_misc.c b/applications/main/xtreme_app/scenes/xtreme_app_scene_misc.c index cdd3c1622..c9b5e9d5e 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_misc.c +++ b/applications/main/xtreme_app/scenes/xtreme_app_scene_misc.c @@ -35,9 +35,11 @@ void xtreme_app_scene_misc_on_enter(void* context) { variable_item_list_add(var_item_list, "Change Device Name", 0, NULL, app); - variable_item_list_set_enter_callback(var_item_list, xtreme_app_scene_misc_var_item_list_callback, app); + variable_item_list_set_enter_callback( + var_item_list, xtreme_app_scene_misc_var_item_list_callback, app); - variable_item_list_set_selected_item(var_item_list, scene_manager_get_scene_state(app->scene_manager, XtremeAppSceneMisc)); + variable_item_list_set_selected_item( + var_item_list, scene_manager_get_scene_state(app->scene_manager, XtremeAppSceneMisc)); view_dispatcher_switch_to_view(app->view_dispatcher, XtremeAppViewVarItemList); } @@ -50,11 +52,11 @@ bool xtreme_app_scene_misc_on_event(void* context, SceneManagerEvent event) { scene_manager_set_scene_state(app->scene_manager, XtremeAppSceneMisc, event.event); consumed = true; switch(event.event) { - case VarItemListIndexChangeDeviceName: - scene_manager_next_scene(app->scene_manager, XtremeAppSceneMiscRename); - break; - default: - break; + case VarItemListIndexChangeDeviceName: + scene_manager_next_scene(app->scene_manager, XtremeAppSceneMiscRename); + break; + default: + break; } } diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_misc_rename.c b/applications/main/xtreme_app/scenes/xtreme_app_scene_misc_rename.c index 6ff05ab8a..4aff7e8ad 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_misc_rename.c +++ b/applications/main/xtreme_app/scenes/xtreme_app_scene_misc_rename.c @@ -9,8 +9,7 @@ static void xtreme_app_scene_misc_rename_text_input_callback(void* context) { app->save_name = true; app->require_reboot = true; - view_dispatcher_send_custom_event( - app->view_dispatcher, TextInputIndexResult); + view_dispatcher_send_custom_event(app->view_dispatcher, TextInputIndexResult); } void xtreme_app_scene_misc_rename_on_enter(void* context) { @@ -37,11 +36,11 @@ bool xtreme_app_scene_misc_rename_on_event(void* context, SceneManagerEvent even if(event.type == SceneManagerEventTypeCustom) { consumed = true; switch(event.event) { - case TextInputIndexResult: - scene_manager_previous_scene(app->scene_manager); - break; - default: - break; + case TextInputIndexResult: + scene_manager_previous_scene(app->scene_manager); + break; + default: + break; } } diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_start.c b/applications/main/xtreme_app/scenes/xtreme_app_scene_start.c index e39ce00c8..c1c7659fc 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_start.c +++ b/applications/main/xtreme_app/scenes/xtreme_app_scene_start.c @@ -25,9 +25,11 @@ void xtreme_app_scene_start_on_enter(void* context) { variable_item_list_add(var_item_list, furi_string_get_cstr(app->version_tag), 0, NULL, app); - variable_item_list_set_enter_callback(var_item_list, xtreme_app_scene_start_var_item_list_callback, app); + variable_item_list_set_enter_callback( + var_item_list, xtreme_app_scene_start_var_item_list_callback, app); - variable_item_list_set_selected_item(var_item_list, scene_manager_get_scene_state(app->scene_manager, XtremeAppSceneStart)); + variable_item_list_set_selected_item( + var_item_list, scene_manager_get_scene_state(app->scene_manager, XtremeAppSceneStart)); view_dispatcher_switch_to_view(app->view_dispatcher, XtremeAppViewVarItemList); } @@ -40,23 +42,23 @@ bool xtreme_app_scene_start_on_event(void* context, SceneManagerEvent event) { scene_manager_set_scene_state(app->scene_manager, XtremeAppSceneStart, event.event); consumed = true; switch(event.event) { - case VarItemListIndexGraphics: - scene_manager_next_scene(app->scene_manager, XtremeAppSceneGraphics); - break; - case VarItemListIndexStatusbar: - scene_manager_next_scene(app->scene_manager, XtremeAppSceneStatusbar); - break; - case VarItemListIndexProtocols: - scene_manager_next_scene(app->scene_manager, XtremeAppSceneProtocols); - break; - case VarItemListIndexDolphin: - scene_manager_next_scene(app->scene_manager, XtremeAppSceneDolphin); - break; - case VarItemListIndexMisc: - scene_manager_next_scene(app->scene_manager, XtremeAppSceneMisc); - break; - default: - break; + case VarItemListIndexGraphics: + scene_manager_next_scene(app->scene_manager, XtremeAppSceneGraphics); + break; + case VarItemListIndexStatusbar: + scene_manager_next_scene(app->scene_manager, XtremeAppSceneStatusbar); + break; + case VarItemListIndexProtocols: + scene_manager_next_scene(app->scene_manager, XtremeAppSceneProtocols); + break; + case VarItemListIndexDolphin: + scene_manager_next_scene(app->scene_manager, XtremeAppSceneDolphin); + break; + case VarItemListIndexMisc: + scene_manager_next_scene(app->scene_manager, XtremeAppSceneMisc); + break; + default: + break; } } diff --git a/applications/main/xtreme_app/xtreme_app.c b/applications/main/xtreme_app/xtreme_app.c index 872f0e90a..0309c4cae 100644 --- a/applications/main/xtreme_app/xtreme_app.c +++ b/applications/main/xtreme_app/xtreme_app.c @@ -20,7 +20,8 @@ static bool xtreme_app_back_event_callback(void* context) { if(app->save_subghz) { FlipperFormat* subghz_range = flipper_format_file_alloc(storage); - if(flipper_format_file_open_existing(subghz_range, "/ext/subghz/assets/extend_range.txt")) { + if(flipper_format_file_open_existing( + subghz_range, "/ext/subghz/assets/extend_range.txt")) { flipper_format_insert_or_update_bool( subghz_range, "use_ext_range_at_own_risk", &app->subghz_extend, 1); flipper_format_insert_or_update_bool( @@ -49,9 +50,17 @@ static bool xtreme_app_back_event_callback(void* context) { if(!flipper_format_write_header_cstr(file, NAMECHANGER_HEADER, 1)) break; - if(!flipper_format_write_comment_cstr(file, "Changing the value below will change your FlipperZero device name.")) break; - if(!flipper_format_write_comment_cstr(file, "Note: This is limited to 8 characters using the following: a-z, A-Z, 0-9, and _")) break; - if(!flipper_format_write_comment_cstr(file, "It cannot contain any other characters.")) break; + if(!flipper_format_write_comment_cstr( + file, + "Changing the value below will change your FlipperZero device name.")) + break; + if(!flipper_format_write_comment_cstr( + file, + "Note: This is limited to 8 characters using the following: a-z, A-Z, 0-9, and _")) + break; + if(!flipper_format_write_comment_cstr( + file, "It cannot contain any other characters.")) + break; if(!flipper_format_write_string_cstr(file, "Name", app->device_name)) break; @@ -108,9 +117,7 @@ XtremeApp* xtreme_app_alloc() { app->text_input = text_input_alloc(); view_dispatcher_add_view( - app->view_dispatcher, - XtremeAppViewTextInput, - text_input_get_view(app->text_input)); + app->view_dispatcher, XtremeAppViewTextInput, text_input_get_view(app->text_input)); app->popup = popup_alloc(); view_dispatcher_add_view(app->view_dispatcher, XtremeAppViewPopup, popup_get_view(app->popup)); @@ -124,7 +131,8 @@ XtremeApp* xtreme_app_alloc() { app->subghz_extend = false; app->subghz_bypass = false; if(flipper_format_file_open_existing(subghz_range, "/ext/subghz/assets/extend_range.txt")) { - flipper_format_read_bool(subghz_range, "use_ext_range_at_own_risk", &app->subghz_extend, 1); + flipper_format_read_bool( + subghz_range, "use_ext_range_at_own_risk", &app->subghz_extend, 1); flipper_format_read_bool(subghz_range, "ignore_default_tx_region", &app->subghz_bypass, 1); } flipper_format_free(subghz_range); @@ -168,7 +176,8 @@ XtremeApp* xtreme_app_alloc() { storage_file_free(folder); furi_record_close(RECORD_STORAGE); - app->version_tag = furi_string_alloc_printf("%s %s", version_get_gitbranchnum(NULL), version_get_builddate(NULL)); + app->version_tag = furi_string_alloc_printf( + "%s %s", version_get_gitbranchnum(NULL), version_get_builddate(NULL)); return app; } diff --git a/applications/plugins/minesweeper/minesweeper.c b/applications/plugins/minesweeper/minesweeper.c index cbfeb2aa1..75fb32e56 100644 --- a/applications/plugins/minesweeper/minesweeper.c +++ b/applications/plugins/minesweeper/minesweeper.c @@ -8,7 +8,6 @@ #include #include - #include "assets.h" #define PLAYFIELD_WIDTH 16 diff --git a/applications/plugins/swd_probe/model/model_chip.h b/applications/plugins/swd_probe/model/model_chip.h index ed96105af..4061b8522 100644 --- a/applications/plugins/swd_probe/model/model_chip.h +++ b/applications/plugins/swd_probe/model/model_chip.h @@ -1,420 +1,108 @@ #define NUM_VERTICES 136 float vertexCoords[NUM_VERTICES][3] = { - {1.000000, 1.000000, 0.152153}, - {-1.000000, 1.000000, 0.152153}, - {-1.000000, -1.000000, 0.152153}, - {1.000000, -1.000000, 0.152153}, - {1.000000, -1.000000, -0.185787}, - {-1.000000, -1.000000, -0.185787}, - {-1.000000, 1.000000, -0.185787}, - {1.000000, 1.000000, -0.185787}, - {-1.000043, -0.785071, -0.015780}, - {-1.155724, -0.785071, -0.015780}, - {-1.155724, -0.918718, -0.015780}, - {-1.000043, -0.918718, -0.015780}, - {-1.155724, -0.785071, 0.127052}, - {-1.000043, -0.785071, 0.127052}, - {-1.000043, -0.918718, 0.127052}, - {-1.155724, -0.918718, 0.127052}, - {-1.234192, -0.918846, -0.087021}, - {-1.234397, -0.785201, -0.086336}, - {-1.235319, -0.784943, -0.229143}, - {-1.235114, -0.918588, -0.229828}, - {-1.388133, -0.919573, -0.078673}, - {-1.389056, -0.919314, -0.221479}, - {-1.389261, -0.785669, -0.220795}, - {-1.388338, -0.785927, -0.077988}, - {-1.000043, -0.219627, -0.015780}, - {-1.155724, -0.219627, -0.015780}, - {-1.155724, -0.353273, -0.015780}, - {-1.000043, -0.353273, -0.015780}, - {-1.155724, -0.219627, 0.127052}, - {-1.000043, -0.219627, 0.127052}, - {-1.000043, -0.353273, 0.127052}, - {-1.155724, -0.353273, 0.127052}, - {-1.234192, -0.353402, -0.087021}, - {-1.234397, -0.219756, -0.086336}, - {-1.235319, -0.219498, -0.229143}, - {-1.235114, -0.353143, -0.229828}, - {-1.388133, -0.354128, -0.078673}, - {-1.389056, -0.353870, -0.221479}, - {-1.389261, -0.220224, -0.220795}, - {-1.388338, -0.220482, -0.077988}, - {-1.000043, 0.345818, -0.015780}, - {-1.155724, 0.345818, -0.015780}, - {-1.155724, 0.212172, -0.015780}, - {-1.000043, 0.212172, -0.015780}, - {-1.155724, 0.345818, 0.127052}, - {-1.000043, 0.345818, 0.127052}, - {-1.000043, 0.212172, 0.127052}, - {-1.155724, 0.212172, 0.127052}, - {-1.234192, 0.212043, -0.087021}, - {-1.234397, 0.345689, -0.086336}, - {-1.235319, 0.345947, -0.229143}, - {-1.235114, 0.212301, -0.229828}, - {-1.388133, 0.211317, -0.078673}, - {-1.389056, 0.211575, -0.221479}, - {-1.389261, 0.345221, -0.220795}, - {-1.388338, 0.344962, -0.077988}, - {-1.000043, 0.911263, -0.015780}, - {-1.155724, 0.911263, -0.015780}, - {-1.155724, 0.777617, -0.015780}, - {-1.000043, 0.777617, -0.015780}, - {-1.155724, 0.911263, 0.127052}, - {-1.000043, 0.911263, 0.127052}, - {-1.000043, 0.777617, 0.127052}, - {-1.155724, 0.777617, 0.127052}, - {-1.234192, 0.777488, -0.087021}, - {-1.234397, 0.911133, -0.086336}, - {-1.235319, 0.911392, -0.229143}, - {-1.235114, 0.777746, -0.229828}, - {-1.388133, 0.776762, -0.078673}, - {-1.389056, 0.777020, -0.221479}, - {-1.389261, 0.910665, -0.220795}, - {-1.388338, 0.910407, -0.077988}, - {1.000043, -0.785071, -0.015780}, - {1.000043, -0.918718, -0.015780}, - {1.155723, -0.918718, -0.015780}, - {1.155723, -0.785071, -0.015780}, - {1.155723, -0.785071, 0.127052}, - {1.155723, -0.918718, 0.127052}, - {1.000043, -0.918718, 0.127052}, - {1.000043, -0.785071, 0.127052}, - {1.234397, -0.785201, -0.086336}, - {1.234192, -0.918846, -0.087021}, - {1.235114, -0.918588, -0.229828}, - {1.235319, -0.784943, -0.229143}, - {1.388133, -0.919573, -0.078673}, - {1.388338, -0.785927, -0.077988}, - {1.389260, -0.785669, -0.220795}, - {1.389056, -0.919314, -0.221479}, - {1.000043, -0.219627, -0.015780}, - {1.000043, -0.353273, -0.015780}, - {1.155723, -0.353273, -0.015780}, - {1.155723, -0.219627, -0.015780}, - {1.155723, -0.219627, 0.127052}, - {1.155723, -0.353273, 0.127052}, - {1.000043, -0.353273, 0.127052}, - {1.000043, -0.219627, 0.127052}, - {1.234397, -0.219756, -0.086336}, - {1.234192, -0.353402, -0.087021}, - {1.235114, -0.353143, -0.229828}, - {1.235319, -0.219498, -0.229143}, - {1.388133, -0.354128, -0.078673}, - {1.388338, -0.220482, -0.077988}, - {1.389260, -0.220224, -0.220795}, - {1.389056, -0.353870, -0.221479}, - {1.000043, 0.345818, -0.015780}, - {1.000043, 0.212172, -0.015780}, - {1.155723, 0.212172, -0.015780}, - {1.155723, 0.345818, -0.015780}, - {1.155723, 0.345818, 0.127052}, - {1.155723, 0.212172, 0.127052}, - {1.000043, 0.212172, 0.127052}, - {1.000043, 0.345818, 0.127052}, - {1.234397, 0.345689, -0.086336}, - {1.234192, 0.212043, -0.087021}, - {1.235114, 0.212301, -0.229828}, - {1.235319, 0.345947, -0.229143}, - {1.388133, 0.211317, -0.078673}, - {1.388338, 0.344962, -0.077988}, - {1.389260, 0.345221, -0.220795}, - {1.389056, 0.211575, -0.221479}, - {1.000043, 0.911263, -0.015780}, - {1.000043, 0.777616, -0.015780}, - {1.155723, 0.777616, -0.015780}, - {1.155723, 0.911263, -0.015780}, - {1.155723, 0.911263, 0.127052}, - {1.155723, 0.777616, 0.127052}, - {1.000043, 0.777616, 0.127052}, - {1.000043, 0.911263, 0.127052}, - {1.234397, 0.911133, -0.086336}, - {1.234192, 0.777488, -0.087021}, - {1.235114, 0.777746, -0.229828}, - {1.235319, 0.911392, -0.229143}, - {1.388133, 0.776762, -0.078673}, - {1.388338, 0.910407, -0.077988}, - {1.389260, 0.910665, -0.220795}, - {1.389056, 0.777020, -0.221479}, -};int edgeIndices[][3] = { - {0, 1}, - {1, 2}, - {2, 3}, - {3, 0}, - {4, 3}, - {3, 2}, - {2, 5}, - {5, 4}, - {5, 2}, - {2, 1}, - {1, 6}, - {6, 5}, - {6, 7}, - {7, 4}, - {4, 5}, - {5, 6}, - {7, 0}, - {0, 3}, - {3, 4}, - {4, 7}, - {6, 1}, - {1, 0}, - {0, 7}, - {7, 6}, - {8, 9}, - {9, 10}, - {10, 11}, - {11, 8}, - {12, 13}, - {13, 14}, - {14, 15}, - {15, 12}, - {13, 8}, - {8, 11}, - {11, 14}, - {14, 13}, - {12, 15}, - {15, 16}, - {16, 17}, - {17, 12}, - {10, 9}, - {9, 18}, - {18, 19}, - {19, 10}, - {20, 21}, - {21, 22}, - {22, 23}, - {23, 20}, - {17, 16}, - {16, 20}, - {20, 23}, - {23, 17}, - {19, 18}, - {18, 22}, - {22, 21}, - {21, 19}, - {24, 25}, - {25, 26}, - {26, 27}, - {27, 24}, - {28, 29}, - {29, 30}, - {30, 31}, - {31, 28}, - {29, 24}, - {24, 27}, - {27, 30}, - {30, 29}, - {28, 31}, - {31, 32}, - {32, 33}, - {33, 28}, - {26, 25}, - {25, 34}, - {34, 35}, - {35, 26}, - {36, 37}, - {37, 38}, - {38, 39}, - {39, 36}, - {33, 32}, - {32, 36}, - {36, 39}, - {39, 33}, - {35, 34}, - {34, 38}, - {38, 37}, - {37, 35}, - {40, 41}, - {41, 42}, - {42, 43}, - {43, 40}, - {44, 45}, - {45, 46}, - {46, 47}, - {47, 44}, - {45, 40}, - {40, 43}, - {43, 46}, - {46, 45}, - {44, 47}, - {47, 48}, - {48, 49}, - {49, 44}, - {42, 41}, - {41, 50}, - {50, 51}, - {51, 42}, - {52, 53}, - {53, 54}, - {54, 55}, - {55, 52}, - {49, 48}, - {48, 52}, - {52, 55}, - {55, 49}, - {51, 50}, - {50, 54}, - {54, 53}, - {53, 51}, - {56, 57}, - {57, 58}, - {58, 59}, - {59, 56}, - {60, 61}, - {61, 62}, - {62, 63}, - {63, 60}, - {61, 56}, - {56, 59}, - {59, 62}, - {62, 61}, - {60, 63}, - {63, 64}, - {64, 65}, - {65, 60}, - {58, 57}, - {57, 66}, - {66, 67}, - {67, 58}, - {68, 69}, - {69, 70}, - {70, 71}, - {71, 68}, - {65, 64}, - {64, 68}, - {68, 71}, - {71, 65}, - {67, 66}, - {66, 70}, - {70, 69}, - {69, 67}, - {72, 73}, - {73, 74}, - {74, 75}, - {75, 72}, - {76, 77}, - {77, 78}, - {78, 79}, - {79, 76}, - {79, 78}, - {78, 73}, - {73, 72}, - {72, 79}, - {76, 80}, - {80, 81}, - {81, 77}, - {77, 76}, - {74, 82}, - {82, 83}, - {83, 75}, - {75, 74}, - {84, 85}, - {85, 86}, - {86, 87}, - {87, 84}, - {80, 85}, - {85, 84}, - {84, 81}, - {81, 80}, - {82, 87}, - {87, 86}, - {86, 83}, - {83, 82}, - {88, 89}, - {89, 90}, - {90, 91}, - {91, 88}, - {92, 93}, - {93, 94}, - {94, 95}, - {95, 92}, - {95, 94}, - {94, 89}, - {89, 88}, - {88, 95}, - {92, 96}, - {96, 97}, - {97, 93}, - {93, 92}, - {90, 98}, - {98, 99}, - {99, 91}, - {91, 90}, - {100, 101}, - {101, 102}, - {102, 103}, - {103, 100}, - {96, 101}, - {101, 100}, - {100, 97}, - {97, 96}, - {98, 103}, - {103, 102}, - {102, 99}, - {99, 98}, - {104, 105}, - {105, 106}, - {106, 107}, - {107, 104}, - {108, 109}, - {109, 110}, - {110, 111}, - {111, 108}, - {111, 110}, - {110, 105}, - {105, 104}, - {104, 111}, - {108, 112}, - {112, 113}, - {113, 109}, - {109, 108}, - {106, 114}, - {114, 115}, - {115, 107}, - {107, 106}, - {116, 117}, - {117, 118}, - {118, 119}, - {119, 116}, - {112, 117}, - {117, 116}, - {116, 113}, - {113, 112}, - {114, 119}, - {119, 118}, - {118, 115}, - {115, 114}, - {120, 121}, - {121, 122}, - {122, 123}, - {123, 120}, - {124, 125}, - {125, 126}, - {126, 127}, - {127, 124}, - {127, 126}, - {126, 121}, - {121, 120}, - {120, 127}, - {124, 128}, - {128, 129}, - {129, 125}, - {125, 124}, - {122, 130}, - {130, 131}, - {131, 123}, - {123, 122}, - {132, 133}, - {133, 134}, - {134, 135}, - {135, 132}, - {128, 133}, - {133, 132}, - {132, 129}, - {129, 128}, - {130, 135}, - {135, 134}, - {134, 131}, - {131, 130}, + {1.000000, 1.000000, 0.152153}, {-1.000000, 1.000000, 0.152153}, + {-1.000000, -1.000000, 0.152153}, {1.000000, -1.000000, 0.152153}, + {1.000000, -1.000000, -0.185787}, {-1.000000, -1.000000, -0.185787}, + {-1.000000, 1.000000, -0.185787}, {1.000000, 1.000000, -0.185787}, + {-1.000043, -0.785071, -0.015780}, {-1.155724, -0.785071, -0.015780}, + {-1.155724, -0.918718, -0.015780}, {-1.000043, -0.918718, -0.015780}, + {-1.155724, -0.785071, 0.127052}, {-1.000043, -0.785071, 0.127052}, + {-1.000043, -0.918718, 0.127052}, {-1.155724, -0.918718, 0.127052}, + {-1.234192, -0.918846, -0.087021}, {-1.234397, -0.785201, -0.086336}, + {-1.235319, -0.784943, -0.229143}, {-1.235114, -0.918588, -0.229828}, + {-1.388133, -0.919573, -0.078673}, {-1.389056, -0.919314, -0.221479}, + {-1.389261, -0.785669, -0.220795}, {-1.388338, -0.785927, -0.077988}, + {-1.000043, -0.219627, -0.015780}, {-1.155724, -0.219627, -0.015780}, + {-1.155724, -0.353273, -0.015780}, {-1.000043, -0.353273, -0.015780}, + {-1.155724, -0.219627, 0.127052}, {-1.000043, -0.219627, 0.127052}, + {-1.000043, -0.353273, 0.127052}, {-1.155724, -0.353273, 0.127052}, + {-1.234192, -0.353402, -0.087021}, {-1.234397, -0.219756, -0.086336}, + {-1.235319, -0.219498, -0.229143}, {-1.235114, -0.353143, -0.229828}, + {-1.388133, -0.354128, -0.078673}, {-1.389056, -0.353870, -0.221479}, + {-1.389261, -0.220224, -0.220795}, {-1.388338, -0.220482, -0.077988}, + {-1.000043, 0.345818, -0.015780}, {-1.155724, 0.345818, -0.015780}, + {-1.155724, 0.212172, -0.015780}, {-1.000043, 0.212172, -0.015780}, + {-1.155724, 0.345818, 0.127052}, {-1.000043, 0.345818, 0.127052}, + {-1.000043, 0.212172, 0.127052}, {-1.155724, 0.212172, 0.127052}, + {-1.234192, 0.212043, -0.087021}, {-1.234397, 0.345689, -0.086336}, + {-1.235319, 0.345947, -0.229143}, {-1.235114, 0.212301, -0.229828}, + {-1.388133, 0.211317, -0.078673}, {-1.389056, 0.211575, -0.221479}, + {-1.389261, 0.345221, -0.220795}, {-1.388338, 0.344962, -0.077988}, + {-1.000043, 0.911263, -0.015780}, {-1.155724, 0.911263, -0.015780}, + {-1.155724, 0.777617, -0.015780}, {-1.000043, 0.777617, -0.015780}, + {-1.155724, 0.911263, 0.127052}, {-1.000043, 0.911263, 0.127052}, + {-1.000043, 0.777617, 0.127052}, {-1.155724, 0.777617, 0.127052}, + {-1.234192, 0.777488, -0.087021}, {-1.234397, 0.911133, -0.086336}, + {-1.235319, 0.911392, -0.229143}, {-1.235114, 0.777746, -0.229828}, + {-1.388133, 0.776762, -0.078673}, {-1.389056, 0.777020, -0.221479}, + {-1.389261, 0.910665, -0.220795}, {-1.388338, 0.910407, -0.077988}, + {1.000043, -0.785071, -0.015780}, {1.000043, -0.918718, -0.015780}, + {1.155723, -0.918718, -0.015780}, {1.155723, -0.785071, -0.015780}, + {1.155723, -0.785071, 0.127052}, {1.155723, -0.918718, 0.127052}, + {1.000043, -0.918718, 0.127052}, {1.000043, -0.785071, 0.127052}, + {1.234397, -0.785201, -0.086336}, {1.234192, -0.918846, -0.087021}, + {1.235114, -0.918588, -0.229828}, {1.235319, -0.784943, -0.229143}, + {1.388133, -0.919573, -0.078673}, {1.388338, -0.785927, -0.077988}, + {1.389260, -0.785669, -0.220795}, {1.389056, -0.919314, -0.221479}, + {1.000043, -0.219627, -0.015780}, {1.000043, -0.353273, -0.015780}, + {1.155723, -0.353273, -0.015780}, {1.155723, -0.219627, -0.015780}, + {1.155723, -0.219627, 0.127052}, {1.155723, -0.353273, 0.127052}, + {1.000043, -0.353273, 0.127052}, {1.000043, -0.219627, 0.127052}, + {1.234397, -0.219756, -0.086336}, {1.234192, -0.353402, -0.087021}, + {1.235114, -0.353143, -0.229828}, {1.235319, -0.219498, -0.229143}, + {1.388133, -0.354128, -0.078673}, {1.388338, -0.220482, -0.077988}, + {1.389260, -0.220224, -0.220795}, {1.389056, -0.353870, -0.221479}, + {1.000043, 0.345818, -0.015780}, {1.000043, 0.212172, -0.015780}, + {1.155723, 0.212172, -0.015780}, {1.155723, 0.345818, -0.015780}, + {1.155723, 0.345818, 0.127052}, {1.155723, 0.212172, 0.127052}, + {1.000043, 0.212172, 0.127052}, {1.000043, 0.345818, 0.127052}, + {1.234397, 0.345689, -0.086336}, {1.234192, 0.212043, -0.087021}, + {1.235114, 0.212301, -0.229828}, {1.235319, 0.345947, -0.229143}, + {1.388133, 0.211317, -0.078673}, {1.388338, 0.344962, -0.077988}, + {1.389260, 0.345221, -0.220795}, {1.389056, 0.211575, -0.221479}, + {1.000043, 0.911263, -0.015780}, {1.000043, 0.777616, -0.015780}, + {1.155723, 0.777616, -0.015780}, {1.155723, 0.911263, -0.015780}, + {1.155723, 0.911263, 0.127052}, {1.155723, 0.777616, 0.127052}, + {1.000043, 0.777616, 0.127052}, {1.000043, 0.911263, 0.127052}, + {1.234397, 0.911133, -0.086336}, {1.234192, 0.777488, -0.087021}, + {1.235114, 0.777746, -0.229828}, {1.235319, 0.911392, -0.229143}, + {1.388133, 0.776762, -0.078673}, {1.388338, 0.910407, -0.077988}, + {1.389260, 0.910665, -0.220795}, {1.389056, 0.777020, -0.221479}, +}; +int edgeIndices[][3] = { + {0, 1}, {1, 2}, {2, 3}, {3, 0}, {4, 3}, {3, 2}, {2, 5}, {5, 4}, + {5, 2}, {2, 1}, {1, 6}, {6, 5}, {6, 7}, {7, 4}, {4, 5}, {5, 6}, + {7, 0}, {0, 3}, {3, 4}, {4, 7}, {6, 1}, {1, 0}, {0, 7}, {7, 6}, + {8, 9}, {9, 10}, {10, 11}, {11, 8}, {12, 13}, {13, 14}, {14, 15}, {15, 12}, + {13, 8}, {8, 11}, {11, 14}, {14, 13}, {12, 15}, {15, 16}, {16, 17}, {17, 12}, + {10, 9}, {9, 18}, {18, 19}, {19, 10}, {20, 21}, {21, 22}, {22, 23}, {23, 20}, + {17, 16}, {16, 20}, {20, 23}, {23, 17}, {19, 18}, {18, 22}, {22, 21}, {21, 19}, + {24, 25}, {25, 26}, {26, 27}, {27, 24}, {28, 29}, {29, 30}, {30, 31}, {31, 28}, + {29, 24}, {24, 27}, {27, 30}, {30, 29}, {28, 31}, {31, 32}, {32, 33}, {33, 28}, + {26, 25}, {25, 34}, {34, 35}, {35, 26}, {36, 37}, {37, 38}, {38, 39}, {39, 36}, + {33, 32}, {32, 36}, {36, 39}, {39, 33}, {35, 34}, {34, 38}, {38, 37}, {37, 35}, + {40, 41}, {41, 42}, {42, 43}, {43, 40}, {44, 45}, {45, 46}, {46, 47}, {47, 44}, + {45, 40}, {40, 43}, {43, 46}, {46, 45}, {44, 47}, {47, 48}, {48, 49}, {49, 44}, + {42, 41}, {41, 50}, {50, 51}, {51, 42}, {52, 53}, {53, 54}, {54, 55}, {55, 52}, + {49, 48}, {48, 52}, {52, 55}, {55, 49}, {51, 50}, {50, 54}, {54, 53}, {53, 51}, + {56, 57}, {57, 58}, {58, 59}, {59, 56}, {60, 61}, {61, 62}, {62, 63}, {63, 60}, + {61, 56}, {56, 59}, {59, 62}, {62, 61}, {60, 63}, {63, 64}, {64, 65}, {65, 60}, + {58, 57}, {57, 66}, {66, 67}, {67, 58}, {68, 69}, {69, 70}, {70, 71}, {71, 68}, + {65, 64}, {64, 68}, {68, 71}, {71, 65}, {67, 66}, {66, 70}, {70, 69}, {69, 67}, + {72, 73}, {73, 74}, {74, 75}, {75, 72}, {76, 77}, {77, 78}, {78, 79}, {79, 76}, + {79, 78}, {78, 73}, {73, 72}, {72, 79}, {76, 80}, {80, 81}, {81, 77}, {77, 76}, + {74, 82}, {82, 83}, {83, 75}, {75, 74}, {84, 85}, {85, 86}, {86, 87}, {87, 84}, + {80, 85}, {85, 84}, {84, 81}, {81, 80}, {82, 87}, {87, 86}, {86, 83}, {83, 82}, + {88, 89}, {89, 90}, {90, 91}, {91, 88}, {92, 93}, {93, 94}, {94, 95}, {95, 92}, + {95, 94}, {94, 89}, {89, 88}, {88, 95}, {92, 96}, {96, 97}, {97, 93}, {93, 92}, + {90, 98}, {98, 99}, {99, 91}, {91, 90}, {100, 101}, {101, 102}, {102, 103}, {103, 100}, + {96, 101}, {101, 100}, {100, 97}, {97, 96}, {98, 103}, {103, 102}, {102, 99}, {99, 98}, + {104, 105}, {105, 106}, {106, 107}, {107, 104}, {108, 109}, {109, 110}, {110, 111}, {111, 108}, + {111, 110}, {110, 105}, {105, 104}, {104, 111}, {108, 112}, {112, 113}, {113, 109}, {109, 108}, + {106, 114}, {114, 115}, {115, 107}, {107, 106}, {116, 117}, {117, 118}, {118, 119}, {119, 116}, + {112, 117}, {117, 116}, {116, 113}, {113, 112}, {114, 119}, {119, 118}, {118, 115}, {115, 114}, + {120, 121}, {121, 122}, {122, 123}, {123, 120}, {124, 125}, {125, 126}, {126, 127}, {127, 124}, + {127, 126}, {126, 121}, {121, 120}, {120, 127}, {124, 128}, {128, 129}, {129, 125}, {125, 124}, + {122, 130}, {130, 131}, {131, 123}, {123, 122}, {132, 133}, {133, 134}, {134, 135}, {135, 132}, + {128, 133}, {133, 132}, {132, 129}, {129, 128}, {130, 135}, {135, 134}, {134, 131}, {131, 130}, }; diff --git a/applications/services/dolphin/dolphin.c b/applications/services/dolphin/dolphin.c index 8421f6815..bd81ff1ab 100644 --- a/applications/services/dolphin/dolphin.c +++ b/applications/services/dolphin/dolphin.c @@ -95,7 +95,11 @@ Dolphin* dolphin_alloc() { dolphin->pubsub = furi_pubsub_alloc(); int32_t butthurt = XTREME_SETTINGS()->butthurt_timer; dolphin->butthurt_timer = xTimerCreate( - NULL, (butthurt > 0) ? (butthurt * 1000) : -1, pdTRUE, dolphin, dolphin_butthurt_timer_callback); + NULL, + (butthurt > 0) ? (butthurt * 1000) : -1, + pdTRUE, + dolphin, + dolphin_butthurt_timer_callback); dolphin->flush_timer = xTimerCreate(NULL, 30 * 1000, pdFALSE, dolphin, dolphin_flush_timer_callback); dolphin->clear_limits_timer = xTimerCreate( diff --git a/applications/services/gui/gui.c b/applications/services/gui/gui.c index 3eadb41f9..1c2a5bfc5 100644 --- a/applications/services/gui/gui.c +++ b/applications/services/gui/gui.c @@ -99,7 +99,11 @@ static void gui_redraw_status_bar(Gui* gui, bool need_attention) { if(xtreme_settings->bar_borders) { canvas_set_color(gui->canvas, ColorWhite); canvas_draw_box( - gui->canvas, -1, 0, canvas_width(gui->canvas) + 1, canvas_height(gui->canvas)); + gui->canvas, + -1, + 0, + canvas_width(gui->canvas) + 1, + canvas_height(gui->canvas)); } canvas_set_color(gui->canvas, ColorBlack); // ViewPort draw diff --git a/applications/services/gui/modules/text_input.c b/applications/services/gui/modules/text_input.c index 06ee5953a..f39adcd9c 100644 --- a/applications/services/gui/modules/text_input.c +++ b/applications/services/gui/modules/text_input.c @@ -43,7 +43,6 @@ static const uint8_t keyboard_origin_y = 29; static const uint8_t keyboard_row_count = 3; static const uint8_t keyboard_count = 2; - #define ENTER_KEY '\r' #define BACKSPACE_KEY '\b' #define SWITCH_KEYBOARD_KEY 0xfe @@ -134,7 +133,7 @@ static const TextInputKey symbol_keyboard_keys_row_3[] = { {SWITCH_KEYBOARD_KEY, 1, 23}, {'+', 13, 32}, {'`', 21, 32}, - {'\'',28, 32}, + {'\'', 28, 32}, {'^', 36, 32}, {'*', 44, 32}, {',', 52, 32}, @@ -146,33 +145,32 @@ static const TextInputKey symbol_keyboard_keys_row_3[] = { {'9', 120, 32}, }; - static const Keyboard keyboard = { - .rows = { - keyboard_keys_row_1, - keyboard_keys_row_2, - keyboard_keys_row_3, - }, + .rows = + { + keyboard_keys_row_1, + keyboard_keys_row_2, + keyboard_keys_row_3, + }, .keyboard_index = 0, }; static const Keyboard symbol_keyboard = { - .rows = { - symbol_keyboard_keys_row_1, - symbol_keyboard_keys_row_2, - symbol_keyboard_keys_row_3, - }, + .rows = + { + symbol_keyboard_keys_row_1, + symbol_keyboard_keys_row_2, + symbol_keyboard_keys_row_3, + }, .keyboard_index = 1, }; - static const Keyboard* keyboards[] = { &keyboard, &symbol_keyboard, }; -static void switch_keyboard(TextInputModel* model) -{ +static void switch_keyboard(TextInputModel* model) { model->selected_keyboard = (model->selected_keyboard + 1) % keyboard_count; } @@ -180,31 +178,31 @@ static uint8_t get_row_size(const Keyboard* keyboard, uint8_t row_index) { uint8_t row_size = 0; if(keyboard == &symbol_keyboard) { switch(row_index + 1) { - case 1: - row_size = COUNT_OF(symbol_keyboard_keys_row_1); - break; - case 2: - row_size = COUNT_OF(symbol_keyboard_keys_row_2); - break; - case 3: - row_size = COUNT_OF(symbol_keyboard_keys_row_3); - break; - default: - furi_crash(NULL); + case 1: + row_size = COUNT_OF(symbol_keyboard_keys_row_1); + break; + case 2: + row_size = COUNT_OF(symbol_keyboard_keys_row_2); + break; + case 3: + row_size = COUNT_OF(symbol_keyboard_keys_row_3); + break; + default: + furi_crash(NULL); } } else { switch(row_index + 1) { - case 1: - row_size = COUNT_OF(keyboard_keys_row_1); - break; - case 2: - row_size = COUNT_OF(keyboard_keys_row_2); - break; - case 3: - row_size = COUNT_OF(keyboard_keys_row_3); - break; - default: - furi_crash(NULL); + case 1: + row_size = COUNT_OF(keyboard_keys_row_1); + break; + case 2: + row_size = COUNT_OF(keyboard_keys_row_2); + break; + case 3: + row_size = COUNT_OF(keyboard_keys_row_3); + break; + default: + furi_crash(NULL); } } @@ -223,7 +221,9 @@ static const TextInputKey* get_row(const Keyboard* keyboard, uint8_t row_index) } static char get_selected_char(TextInputModel* model) { - return get_row(keyboards[model->selected_keyboard], model->selected_row)[model->selected_column].text; + return get_row( + keyboards[model->selected_keyboard], model->selected_row)[model->selected_column] + .text; } static bool char_is_lowercase(char letter) { @@ -380,7 +380,8 @@ static void text_input_handle_up(TextInput* text_input, TextInputModel* model) { UNUSED(text_input); if(model->selected_row > 0) { model->selected_row--; - if(model->selected_column > get_row_size(keyboards[model->selected_keyboard], model->selected_row) - 6) { + if(model->selected_column > + get_row_size(keyboards[model->selected_keyboard], model->selected_row) - 6) { model->selected_column = model->selected_column + 1; } } @@ -390,7 +391,8 @@ static void text_input_handle_down(TextInput* text_input, TextInputModel* model) UNUSED(text_input); if(model->selected_row < keyboard_row_count - 1) { model->selected_row++; - if(model->selected_column > get_row_size(keyboards[model->selected_keyboard], model->selected_row) - 4) { + if(model->selected_column > + get_row_size(keyboards[model->selected_keyboard], model->selected_row) - 4) { model->selected_column = model->selected_column - 1; } } @@ -401,13 +403,15 @@ static void text_input_handle_left(TextInput* text_input, TextInputModel* model) if(model->selected_column > 0) { model->selected_column--; } else { - model->selected_column = get_row_size(keyboards[model->selected_keyboard], model->selected_row) - 1; + model->selected_column = + get_row_size(keyboards[model->selected_keyboard], model->selected_row) - 1; } } static void text_input_handle_right(TextInput* text_input, TextInputModel* model) { UNUSED(text_input); - if(model->selected_column < get_row_size(keyboards[model->selected_keyboard], model->selected_row) - 1) { + if(model->selected_column < + get_row_size(keyboards[model->selected_keyboard], model->selected_row) - 1) { model->selected_column++; } else { model->selected_column = 0; diff --git a/applications/services/namechangersrv/namechangersrv.c b/applications/services/namechangersrv/namechangersrv.c index f866fa41a..fe25906ae 100644 --- a/applications/services/namechangersrv/namechangersrv.c +++ b/applications/services/namechangersrv/namechangersrv.c @@ -13,7 +13,6 @@ void namechanger_on_system_start() { FuriString* NAMEHEADER; NAMEHEADER = furi_string_alloc_set("Flipper Name File"); - bool result = false; FuriString* data; diff --git a/applications/services/xtreme/settings.c b/applications/services/xtreme/settings.c index 14ef740d5..05d0892dd 100644 --- a/applications/services/xtreme/settings.c +++ b/applications/services/xtreme/settings.c @@ -13,7 +13,6 @@ XtremeSettings* XTREME_SETTINGS() { void XTREME_SETTINGS_LOAD() { if(xtreme_settings == NULL) { - xtreme_settings = malloc(sizeof(XtremeSettings)); bool loaded; diff --git a/applications/settings/desktop_settings/scenes/desktop_settings_scene_start.c b/applications/settings/desktop_settings/scenes/desktop_settings_scene_start.c index 6253ddacd..a3ebe5ffc 100644 --- a/applications/settings/desktop_settings/scenes/desktop_settings_scene_start.c +++ b/applications/settings/desktop_settings/scenes/desktop_settings_scene_start.c @@ -96,12 +96,14 @@ bool desktop_settings_scene_start_on_event(void* context, SceneManagerEvent sme) if(sme.type == SceneManagerEventTypeCustom) { switch(sme.event) { case SCENE_EVENT_SELECT_FAVORITE_PRIMARY: - scene_manager_set_scene_state(app->scene_manager, DesktopSettingsAppSceneFavorite, true); + scene_manager_set_scene_state( + app->scene_manager, DesktopSettingsAppSceneFavorite, true); scene_manager_next_scene(app->scene_manager, DesktopSettingsAppSceneFavorite); consumed = true; break; case SCENE_EVENT_SELECT_FAVORITE_SECONDARY: - scene_manager_set_scene_state(app->scene_manager, DesktopSettingsAppSceneFavorite, false); + scene_manager_set_scene_state( + app->scene_manager, DesktopSettingsAppSceneFavorite, false); scene_manager_next_scene(app->scene_manager, DesktopSettingsAppSceneFavorite); consumed = true; break; diff --git a/firmware/targets/f7/furi_hal/furi_hal_subghz.c b/firmware/targets/f7/furi_hal/furi_hal_subghz.c index 415bb325e..d48dd5457 100644 --- a/firmware/targets/f7/furi_hal/furi_hal_subghz.c +++ b/firmware/targets/f7/furi_hal/furi_hal_subghz.c @@ -427,42 +427,42 @@ bool furi_hal_subghz_is_tx_allowed(uint32_t value) { furi_record_close(RECORD_STORAGE); switch(furi_hal_version_get_hw_region_otp()) { - case FuriHalVersionRegionEuRu: - //433,05..434,79; 868,15..868,55 - if(!(value >= 433050000 && value <= 434790000) && - !(value >= 868150000 && value <= 868550000)) { - } else { - is_allowed = true; - } - break; - case FuriHalVersionRegionUsCaAu: - //304,10..321,95; 433,05..434,79; 915,00..928,00 - if(!(value >= 304100000 && value <= 321950000) && - !(value >= 433050000 && value <= 434790000) && - !(value >= 915000000 && value <= 928000000)) { - } else { - if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) { - if(value <= 321950000 && - ((furi_hal_subghz.preset == FuriHalSubGhzPresetOok270Async) || - (furi_hal_subghz.preset == FuriHalSubGhzPresetOok650Async))) { - furi_hal_subghz_load_patable(furi_hal_subghz_preset_ook_async_patable_au); - } - } - is_allowed = true; - } - break; - case FuriHalVersionRegionJp: - //312,00..315,25; 920,50..923,50 - if(!(value >= 312000000 && value <= 315250000) && - !(value >= 920500000 && value <= 923500000)) { - } else { - is_allowed = true; - } - break; - - default: + case FuriHalVersionRegionEuRu: + //433,05..434,79; 868,15..868,55 + if(!(value >= 433050000 && value <= 434790000) && + !(value >= 868150000 && value <= 868550000)) { + } else { is_allowed = true; - break; + } + break; + case FuriHalVersionRegionUsCaAu: + //304,10..321,95; 433,05..434,79; 915,00..928,00 + if(!(value >= 304100000 && value <= 321950000) && + !(value >= 433050000 && value <= 434790000) && + !(value >= 915000000 && value <= 928000000)) { + } else { + if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) { + if(value <= 321950000 && + ((furi_hal_subghz.preset == FuriHalSubGhzPresetOok270Async) || + (furi_hal_subghz.preset == FuriHalSubGhzPresetOok650Async))) { + furi_hal_subghz_load_patable(furi_hal_subghz_preset_ook_async_patable_au); + } + } + is_allowed = true; + } + break; + case FuriHalVersionRegionJp: + //312,00..315,25; 920,50..923,50 + if(!(value >= 312000000 && value <= 315250000) && + !(value >= 920500000 && value <= 923500000)) { + } else { + is_allowed = true; + } + break; + + default: + is_allowed = true; + break; } // No flag - test original range, flag set, test extended range if(!(value >= 299999755 && value <= 350000335) && // was increased from 348 to 350 From 6b9eb8f350a313a991d45efc74df149ad26e9c81 Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Sun, 26 Feb 2023 01:45:02 +0000 Subject: [PATCH 359/506] Format --- applications/main/bad_kb/scenes/bad_kb_scene_config_mac.c | 4 ++-- firmware/targets/f7/furi_hal/furi_hal_bt.c | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/applications/main/bad_kb/scenes/bad_kb_scene_config_mac.c b/applications/main/bad_kb/scenes/bad_kb_scene_config_mac.c index 2b71ec91b..d7027537a 100644 --- a/applications/main/bad_kb/scenes/bad_kb_scene_config_mac.c +++ b/applications/main/bad_kb/scenes/bad_kb_scene_config_mac.c @@ -2,7 +2,7 @@ #define TAG "BadKbConfigMac" -static uint8_t* reverse_mac_addr(uint8_t* mac, uint8_t *out) { +static uint8_t* reverse_mac_addr(uint8_t* mac, uint8_t* out) { uint8_t tmp; for(int i = 0; i < 3; i++) { tmp = mac[i]; @@ -29,7 +29,7 @@ void bad_kb_scene_config_mac_on_enter(void* context) { bad_kb_scene_config_mac_byte_input_callback, NULL, bad_kb, - reverse_mac_addr(bad_kb->mac, bad_kb->mac), + reverse_mac_addr(bad_kb->mac, bad_kb->mac), GAP_MAC_ADDR_SIZE); view_dispatcher_switch_to_view(bad_kb->view_dispatcher, BadKbAppViewConfigMac); } diff --git a/firmware/targets/f7/furi_hal/furi_hal_bt.c b/firmware/targets/f7/furi_hal/furi_hal_bt.c index 6bb083873..4d2e4bc4e 100644 --- a/firmware/targets/f7/furi_hal/furi_hal_bt.c +++ b/firmware/targets/f7/furi_hal/furi_hal_bt.c @@ -222,7 +222,11 @@ bool furi_hal_bt_start_app(FuriHalBtProfile profile, GapEventCallback event_cb, } // Change name Flipper -> Control if(strlen(&config->adv_name[1]) == 0) { - snprintf(&config->adv_name[1], strlen("Control ") + FURI_HAL_VERSION_DEVICE_NAME_LENGTH, "Control %s", furi_hal_version_get_ble_local_device_name_ptr()); + snprintf( + &config->adv_name[1], + strlen("Control ") + FURI_HAL_VERSION_DEVICE_NAME_LENGTH, + "Control %s", + furi_hal_version_get_ble_local_device_name_ptr()); } } if(!gap_init(config, event_cb, context)) { @@ -473,7 +477,7 @@ void furi_hal_bt_set_profile_adv_name( furi_assert(profile < FuriHalBtProfileNumber); furi_assert(name); - if (strlen(name) == 0) { + if(strlen(name) == 0) { memset( &(profile_config[profile].config.adv_name[1]), 0, From b53924c27ab00dd584456efe3268060e142c1ae7 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sun, 26 Feb 2023 05:23:26 +0300 Subject: [PATCH 360/506] Infrared debug settings - output pin --- applications/main/infrared/infrared.c | 9 ++ applications/main/infrared/infrared_i.h | 3 + .../infrared/scenes/infrared_scene_config.h | 1 + .../scenes/infrared_scene_debug_settings.c | 59 ++++++++++++ .../infrared/scenes/infrared_scene_start.c | 18 +++- firmware/targets/f7/api_symbols.csv | 2 + .../targets/f7/furi_hal/furi_hal_infrared.c | 90 +++++++++++-------- .../furi_hal_include/furi_hal_infrared.h | 6 ++ 8 files changed, 150 insertions(+), 38 deletions(-) create mode 100644 applications/main/infrared/scenes/infrared_scene_debug_settings.c diff --git a/applications/main/infrared/infrared.c b/applications/main/infrared/infrared.c index 9d78a09b6..14729e0d8 100644 --- a/applications/main/infrared/infrared.c +++ b/applications/main/infrared/infrared.c @@ -148,6 +148,12 @@ static Infrared* infrared_alloc() { view_dispatcher_add_view( view_dispatcher, InfraredViewTextInput, text_input_get_view(infrared->text_input)); + infrared->variable_item_list = variable_item_list_alloc(); + view_dispatcher_add_view( + infrared->view_dispatcher, + InfraredViewVariableItemList, + variable_item_list_get_view(infrared->variable_item_list)); + infrared->dialog_ex = dialog_ex_alloc(); view_dispatcher_add_view( view_dispatcher, InfraredViewDialogEx, dialog_ex_get_view(infrared->dialog_ex)); @@ -195,6 +201,9 @@ static void infrared_free(Infrared* infrared) { view_dispatcher_remove_view(view_dispatcher, InfraredViewTextInput); text_input_free(infrared->text_input); + view_dispatcher_remove_view(infrared->view_dispatcher, InfraredViewVariableItemList); + variable_item_list_free(infrared->variable_item_list); + view_dispatcher_remove_view(view_dispatcher, InfraredViewDialogEx); dialog_ex_free(infrared->dialog_ex); diff --git a/applications/main/infrared/infrared_i.h b/applications/main/infrared/infrared_i.h index 5b555e4bb..72800d994 100644 --- a/applications/main/infrared/infrared_i.h +++ b/applications/main/infrared/infrared_i.h @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -86,6 +87,7 @@ struct Infrared { Submenu* submenu; TextInput* text_input; + VariableItemList* variable_item_list; DialogEx* dialog_ex; ButtonMenu* button_menu; Popup* popup; @@ -107,6 +109,7 @@ struct Infrared { typedef enum { InfraredViewSubmenu, InfraredViewTextInput, + InfraredViewVariableItemList, InfraredViewDialogEx, InfraredViewButtonMenu, InfraredViewPopup, diff --git a/applications/main/infrared/scenes/infrared_scene_config.h b/applications/main/infrared/scenes/infrared_scene_config.h index 551485295..b15974941 100644 --- a/applications/main/infrared/scenes/infrared_scene_config.h +++ b/applications/main/infrared/scenes/infrared_scene_config.h @@ -21,4 +21,5 @@ ADD_SCENE(infrared, universal_audio, UniversalAudio) ADD_SCENE(infrared, universal_projector, UniversalProjector) ADD_SCENE(infrared, debug, Debug) ADD_SCENE(infrared, error_databases, ErrorDatabases) +ADD_SCENE(infrared, debug_settings, DebugSettings) ADD_SCENE(infrared, rpc, Rpc) diff --git a/applications/main/infrared/scenes/infrared_scene_debug_settings.c b/applications/main/infrared/scenes/infrared_scene_debug_settings.c new file mode 100644 index 000000000..0bc830788 --- /dev/null +++ b/applications/main/infrared/scenes/infrared_scene_debug_settings.c @@ -0,0 +1,59 @@ +#include "../infrared_i.h" +#include + +uint8_t value_index_ir; + +#define DEB_PINS_COUNT (sizeof(infrared_debug_cfg_variables_text) / sizeof(char* const)) +const char* const infrared_debug_cfg_variables_text[] = { + "Internal", + "2 (A7)", +}; + +static void infrared_scene_debug_settings_changed(VariableItem* item) { + Infrared* infrared = variable_item_get_context(item); + value_index_ir = variable_item_get_current_value_index(item); + UNUSED(infrared); + + variable_item_set_current_value_text(item, infrared_debug_cfg_variables_text[value_index_ir]); + + furi_hal_infrared_set_debug_out(value_index_ir); +} +static void infrared_debug_settings_start_var_list_enter_callback(void* context, uint32_t index) { + Infrared* infrared = context; + view_dispatcher_send_custom_event(infrared->view_dispatcher, index); +} + +void infrared_scene_debug_settings_on_enter(void* context) { + Infrared* infrared = context; + + VariableItemList* variable_item_list = infrared->variable_item_list; + + value_index_ir = furi_hal_infrared_get_debug_out_status(); + VariableItem* item = variable_item_list_add( + variable_item_list, + "Send signal to", + DEB_PINS_COUNT, + infrared_scene_debug_settings_changed, + infrared); + + variable_item_list_set_enter_callback( + variable_item_list, infrared_debug_settings_start_var_list_enter_callback, infrared); + + variable_item_set_current_value_index(item, value_index_ir); + variable_item_set_current_value_text(item, infrared_debug_cfg_variables_text[value_index_ir]); + + view_dispatcher_switch_to_view(infrared->view_dispatcher, InfraredViewVariableItemList); +} + +bool infrared_scene_debug_settings_on_event(void* context, SceneManagerEvent event) { + Infrared* infrared = context; + UNUSED(infrared); + UNUSED(event); + + return false; +} + +void infrared_scene_debug_settings_on_exit(void* context) { + Infrared* infrared = context; + variable_item_list_reset(infrared->variable_item_list); +} diff --git a/applications/main/infrared/scenes/infrared_scene_start.c b/applications/main/infrared/scenes/infrared_scene_start.c index 28aa384c4..816d57294 100644 --- a/applications/main/infrared/scenes/infrared_scene_start.c +++ b/applications/main/infrared/scenes/infrared_scene_start.c @@ -5,7 +5,8 @@ enum SubmenuIndex { SubmenuIndexLearnNewRemote, SubmenuIndexLearnNewRemoteRaw, SubmenuIndexSavedRemotes, - SubmenuIndexDebug + SubmenuIndexDebug, + SubmenuIndexDebugSettings }; static void infrared_scene_start_submenu_callback(void* context, uint32_t index) { @@ -45,7 +46,17 @@ void infrared_scene_start_on_enter(void* context) { infrared_scene_start_submenu_callback, infrared); submenu_add_item( - submenu, "Debug", SubmenuIndexDebug, infrared_scene_start_submenu_callback, infrared); + submenu, + "Debug RX", + SubmenuIndexDebug, + infrared_scene_start_submenu_callback, + infrared); + submenu_add_item( + submenu, + "Debug Settings", + SubmenuIndexDebugSettings, + infrared_scene_start_submenu_callback, + infrared); } const uint32_t submenu_index = @@ -86,6 +97,9 @@ bool infrared_scene_start_on_event(void* context, SceneManagerEvent event) { } else if(submenu_index == SubmenuIndexDebug) { scene_manager_next_scene(scene_manager, InfraredSceneDebug); consumed = true; + } else if(submenu_index == SubmenuIndexDebugSettings) { + scene_manager_next_scene(scene_manager, InfraredSceneDebugSettings); + consumed = true; } } diff --git a/firmware/targets/f7/api_symbols.csv b/firmware/targets/f7/api_symbols.csv index d0948b9a8..a2f851f28 100644 --- a/firmware/targets/f7/api_symbols.csv +++ b/firmware/targets/f7/api_symbols.csv @@ -1168,7 +1168,9 @@ Function,+,furi_hal_infrared_async_tx_set_signal_sent_isr_callback,void,"FuriHal Function,+,furi_hal_infrared_async_tx_start,void,"uint32_t, float" Function,+,furi_hal_infrared_async_tx_stop,void, Function,+,furi_hal_infrared_async_tx_wait_termination,void, +Function,+,furi_hal_infrared_get_debug_out_status,_Bool, Function,+,furi_hal_infrared_is_busy,_Bool, +Function,+,furi_hal_infrared_set_debug_out,void,_Bool Function,-,furi_hal_init,void, Function,-,furi_hal_init_early,void, Function,-,furi_hal_interrupt_init,void, diff --git a/firmware/targets/f7/furi_hal/furi_hal_infrared.c b/firmware/targets/f7/furi_hal/furi_hal_infrared.c index c1d24f803..b65ea42e1 100644 --- a/firmware/targets/f7/furi_hal/furi_hal_infrared.c +++ b/firmware/targets/f7/furi_hal/furi_hal_infrared.c @@ -13,13 +13,6 @@ #include #include -#define INFRARED_TX_DEBUG 0 - -#if INFRARED_TX_DEBUG == 1 -#define gpio_infrared_tx gpio_infrared_tx_debug -const GpioPin gpio_infrared_tx_debug = {.port = GPIOA, .pin = GPIO_PIN_7}; -#endif - #define INFRARED_TIM_TX_DMA_BUFFER_SIZE 200 #define INFRARED_POLARITY_SHIFT 1 @@ -79,6 +72,7 @@ typedef enum { static volatile InfraredState furi_hal_infrared_state = InfraredStateIdle; static InfraredTimTx infrared_tim_tx; static InfraredTimRx infrared_tim_rx; +static bool infrared_external_output; static void furi_hal_infrared_tx_fill_buffer(uint8_t buf_num, uint8_t polarity_shift); static void furi_hal_infrared_async_tx_free_resources(void); @@ -89,6 +83,14 @@ static uint8_t furi_hal_infrared_get_current_dma_tx_buffer(void); static void furi_hal_infrared_tx_dma_polarity_isr(); static void furi_hal_infrared_tx_dma_isr(); +void furi_hal_infrared_set_debug_out(bool enable) { + infrared_external_output = enable; +} + +bool furi_hal_infrared_get_debug_out_status(void) { + return infrared_external_output; +} + static void furi_hal_infrared_tim_rx_isr() { static uint32_t previous_captured_ch2 = 0; @@ -340,25 +342,25 @@ static void furi_hal_infrared_configure_tim_pwm_tx(uint32_t freq, float duty_cyc LL_TIM_EnableARRPreload(TIM1); LL_TIM_SetAutoReload( TIM1, __LL_TIM_CALC_ARR(SystemCoreClock, LL_TIM_GetPrescaler(TIM1), freq)); -#if INFRARED_TX_DEBUG == 1 - LL_TIM_OC_SetCompareCH1(TIM1, ((LL_TIM_GetAutoReload(TIM1) + 1) * (1 - duty_cycle))); - LL_TIM_OC_EnablePreload(TIM1, LL_TIM_CHANNEL_CH1); - /* LL_TIM_OCMODE_PWM2 set by DMA */ - LL_TIM_OC_SetMode(TIM1, LL_TIM_CHANNEL_CH1, LL_TIM_OCMODE_FORCED_INACTIVE); - LL_TIM_OC_SetPolarity(TIM1, LL_TIM_CHANNEL_CH1N, LL_TIM_OCPOLARITY_HIGH); - LL_TIM_OC_DisableFast(TIM1, LL_TIM_CHANNEL_CH1); - LL_TIM_CC_EnableChannel(TIM1, LL_TIM_CHANNEL_CH1N); - LL_TIM_DisableIT_CC1(TIM1); -#else - LL_TIM_OC_SetCompareCH3(TIM1, ((LL_TIM_GetAutoReload(TIM1) + 1) * (1 - duty_cycle))); - LL_TIM_OC_EnablePreload(TIM1, LL_TIM_CHANNEL_CH3); - /* LL_TIM_OCMODE_PWM2 set by DMA */ - LL_TIM_OC_SetMode(TIM1, LL_TIM_CHANNEL_CH3, LL_TIM_OCMODE_FORCED_INACTIVE); - LL_TIM_OC_SetPolarity(TIM1, LL_TIM_CHANNEL_CH3N, LL_TIM_OCPOLARITY_HIGH); - LL_TIM_OC_DisableFast(TIM1, LL_TIM_CHANNEL_CH3); - LL_TIM_CC_EnableChannel(TIM1, LL_TIM_CHANNEL_CH3N); - LL_TIM_DisableIT_CC3(TIM1); -#endif + if(infrared_external_output) { + LL_TIM_OC_SetCompareCH1(TIM1, ((LL_TIM_GetAutoReload(TIM1) + 1) * (1 - duty_cycle))); + LL_TIM_OC_EnablePreload(TIM1, LL_TIM_CHANNEL_CH1); + /* LL_TIM_OCMODE_PWM2 set by DMA */ + LL_TIM_OC_SetMode(TIM1, LL_TIM_CHANNEL_CH1, LL_TIM_OCMODE_FORCED_INACTIVE); + LL_TIM_OC_SetPolarity(TIM1, LL_TIM_CHANNEL_CH1N, LL_TIM_OCPOLARITY_HIGH); + LL_TIM_OC_DisableFast(TIM1, LL_TIM_CHANNEL_CH1); + LL_TIM_CC_EnableChannel(TIM1, LL_TIM_CHANNEL_CH1N); + LL_TIM_DisableIT_CC1(TIM1); + } else { + LL_TIM_OC_SetCompareCH3(TIM1, ((LL_TIM_GetAutoReload(TIM1) + 1) * (1 - duty_cycle))); + LL_TIM_OC_EnablePreload(TIM1, LL_TIM_CHANNEL_CH3); + /* LL_TIM_OCMODE_PWM2 set by DMA */ + LL_TIM_OC_SetMode(TIM1, LL_TIM_CHANNEL_CH3, LL_TIM_OCMODE_FORCED_INACTIVE); + LL_TIM_OC_SetPolarity(TIM1, LL_TIM_CHANNEL_CH3N, LL_TIM_OCPOLARITY_HIGH); + LL_TIM_OC_DisableFast(TIM1, LL_TIM_CHANNEL_CH3); + LL_TIM_CC_EnableChannel(TIM1, LL_TIM_CHANNEL_CH3N); + LL_TIM_DisableIT_CC3(TIM1); + } LL_TIM_DisableMasterSlaveMode(TIM1); LL_TIM_EnableAllOutputs(TIM1); LL_TIM_DisableIT_UPDATE(TIM1); @@ -370,11 +372,11 @@ static void furi_hal_infrared_configure_tim_pwm_tx(uint32_t freq, float duty_cyc static void furi_hal_infrared_configure_tim_cmgr2_dma_tx(void) { LL_DMA_InitTypeDef dma_config = {0}; -#if INFRARED_TX_DEBUG == 1 - dma_config.PeriphOrM2MSrcAddress = (uint32_t) & (TIM1->CCMR1); -#else - dma_config.PeriphOrM2MSrcAddress = (uint32_t) & (TIM1->CCMR2); -#endif + if(infrared_external_output) { + dma_config.PeriphOrM2MSrcAddress = (uint32_t) & (TIM1->CCMR1); + } else { + dma_config.PeriphOrM2MSrcAddress = (uint32_t) & (TIM1->CCMR2); + } dma_config.MemoryOrM2MDstAddress = (uint32_t)NULL; dma_config.Direction = LL_DMA_DIRECTION_MEMORY_TO_PERIPH; dma_config.Mode = LL_DMA_MODE_NORMAL; @@ -567,7 +569,11 @@ static void furi_hal_infrared_async_tx_free_resources(void) { (furi_hal_infrared_state == InfraredStateIdle) || (furi_hal_infrared_state == InfraredStateAsyncTxStopped)); - furi_hal_gpio_init(&gpio_infrared_tx, GpioModeOutputOpenDrain, GpioPullDown, GpioSpeedLow); + if(infrared_external_output) { + furi_hal_gpio_init(&gpio_ext_pa7, GpioModeOutputOpenDrain, GpioPullDown, GpioSpeedLow); + } else { + furi_hal_gpio_init(&gpio_infrared_tx, GpioModeOutputOpenDrain, GpioPullDown, GpioSpeedLow); + } furi_hal_interrupt_set_isr(IR_DMA_CH1_IRQ, NULL, NULL); furi_hal_interrupt_set_isr(IR_DMA_CH2_IRQ, NULL, NULL); LL_TIM_DeInit(TIM1); @@ -625,10 +631,22 @@ void furi_hal_infrared_async_tx_start(uint32_t freq, float duty_cycle) { furi_delay_us(5); LL_TIM_GenerateEvent_UPDATE(TIM1); /* DMA -> TIMx_RCR */ furi_delay_us(5); - LL_GPIO_ResetOutputPin( - gpio_infrared_tx.port, gpio_infrared_tx.pin); /* when disable it prevents false pulse */ - furi_hal_gpio_init_ex( - &gpio_infrared_tx, GpioModeAltFunctionPushPull, GpioPullUp, GpioSpeedHigh, GpioAltFn1TIM1); + if(infrared_external_output) { + LL_GPIO_ResetOutputPin( + gpio_ext_pa7.port, gpio_ext_pa7.pin); /* when disable it prevents false pulse */ + furi_hal_gpio_init_ex( + &gpio_ext_pa7, GpioModeAltFunctionPushPull, GpioPullUp, GpioSpeedHigh, GpioAltFn1TIM1); + } else { + LL_GPIO_ResetOutputPin( + gpio_infrared_tx.port, + gpio_infrared_tx.pin); /* when disable it prevents false pulse */ + furi_hal_gpio_init_ex( + &gpio_infrared_tx, + GpioModeAltFunctionPushPull, + GpioPullUp, + GpioSpeedHigh, + GpioAltFn1TIM1); + } FURI_CRITICAL_ENTER(); LL_TIM_GenerateEvent_UPDATE(TIM1); /* TIMx_RCR -> Repetition counter */ diff --git a/firmware/targets/furi_hal_include/furi_hal_infrared.h b/firmware/targets/furi_hal_include/furi_hal_infrared.h index 5fcea0661..bac3aba1e 100644 --- a/firmware/targets/furi_hal_include/furi_hal_infrared.h +++ b/firmware/targets/furi_hal_include/furi_hal_infrared.h @@ -48,6 +48,12 @@ typedef void (*FuriHalInfraredRxCaptureCallback)(void* ctx, bool level, uint32_t */ typedef void (*FuriHalInfraredRxTimeoutCallback)(void* ctx); +// Debug TX pin set +void furi_hal_infrared_set_debug_out(bool enable); + +// Debug TX pin get status +bool furi_hal_infrared_get_debug_out_status(void); + /** Initialize INFRARED RX timer to receive interrupts. * * It provides interrupts for every RX-signal edge changing with its duration. From a71abedd2507840cf7321d2e29f87baa61ffdfab Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sun, 26 Feb 2023 05:25:22 +0300 Subject: [PATCH 361/506] Rename some vars --- .../scenes/subghz_scene_ext_module_settings.c | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/applications/main/subghz/scenes/subghz_scene_ext_module_settings.c b/applications/main/subghz/scenes/subghz_scene_ext_module_settings.c index 86e1ff2a0..8d1154a13 100644 --- a/applications/main/subghz/scenes/subghz_scene_ext_module_settings.c +++ b/applications/main/subghz/scenes/subghz_scene_ext_module_settings.c @@ -1,9 +1,9 @@ #include "../subghz_i.h" #include "../helpers/subghz_custom_event.h" -uint8_t value_index; -uint8_t value_index2; -uint8_t value_index3; +uint8_t value_index_exm; +uint8_t value_index_dpin; +uint8_t value_index_cnt; #define EXT_MODULES_COUNT (sizeof(radio_modules_variables_text) / sizeof(char* const)) const char* const radio_modules_variables_text[] = { @@ -26,10 +26,10 @@ const char* const debug_counter_text[DEBUG_COUNTER_COUNT] = { static void subghz_scene_ext_module_changed(VariableItem* item) { SubGhz* subghz = variable_item_get_context(item); - value_index = variable_item_get_current_value_index(item); + value_index_exm = variable_item_get_current_value_index(item); UNUSED(subghz); - variable_item_set_current_value_text(item, radio_modules_variables_text[value_index]); + variable_item_set_current_value_text(item, radio_modules_variables_text[value_index_exm]); } static void subghz_ext_module_start_var_list_enter_callback(void* context, uint32_t index) { SubGhz* subghz = context; @@ -70,15 +70,15 @@ void subghz_scene_ext_module_settings_on_enter(void* context) { VariableItemList* variable_item_list = subghz->variable_item_list; - value_index = furi_hal_subghz.radio_type; + value_index_exm = furi_hal_subghz.radio_type; VariableItem* item = variable_item_list_add( variable_item_list, "Module", EXT_MODULES_COUNT, subghz_scene_ext_module_changed, subghz); variable_item_list_set_enter_callback( variable_item_list, subghz_ext_module_start_var_list_enter_callback, subghz); - variable_item_set_current_value_index(item, value_index); - variable_item_set_current_value_text(item, radio_modules_variables_text[value_index]); + variable_item_set_current_value_index(item, value_index_exm); + variable_item_set_current_value_text(item, radio_modules_variables_text[value_index_exm]); if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) { item = variable_item_list_add( @@ -87,9 +87,9 @@ void subghz_scene_ext_module_settings_on_enter(void* context) { DEBUG_P_COUNT, subghz_scene_receiver_config_set_debug_pin, subghz); - value_index2 = subghz->txrx->debug_pin_state; - variable_item_set_current_value_index(item, value_index2); - variable_item_set_current_value_text(item, debug_pin_text[value_index2]); + value_index_dpin = subghz->txrx->debug_pin_state; + variable_item_set_current_value_index(item, value_index_dpin); + variable_item_set_current_value_text(item, debug_pin_text[value_index_dpin]); item = variable_item_list_add( subghz->variable_item_list, @@ -99,19 +99,19 @@ void subghz_scene_ext_module_settings_on_enter(void* context) { subghz); switch(furi_hal_subghz_get_rolling_counter_mult()) { case 1: - value_index3 = 0; + value_index_cnt = 0; break; case 5: - value_index3 = 1; + value_index_cnt = 1; break; case 10: - value_index3 = 2; + value_index_cnt = 2; break; default: break; } - variable_item_set_current_value_index(item, value_index3); - variable_item_set_current_value_text(item, debug_counter_text[value_index3]); + variable_item_set_current_value_index(item, value_index_cnt); + variable_item_set_current_value_text(item, debug_counter_text[value_index_cnt]); } view_dispatcher_switch_to_view(subghz->view_dispatcher, SubGhzViewIdVariableItemList); @@ -123,12 +123,12 @@ bool subghz_scene_ext_module_settings_on_event(void* context, SceneManagerEvent UNUSED(event); // Set selected radio module - furi_hal_subghz_set_radio_type(value_index); + furi_hal_subghz_set_radio_type(value_index_exm); // Check if module is present, if no -> show error if(!furi_hal_subghz_check_radio()) { - value_index = 0; - furi_hal_subghz_set_radio_type(value_index); + value_index_exm = 0; + furi_hal_subghz_set_radio_type(value_index_exm); furi_string_set(subghz->error_str, "Please connect\nexternal radio"); scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowErrorSub); } From 115257ea5906df97fecf897c15cee71224332923 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sun, 26 Feb 2023 05:29:18 +0300 Subject: [PATCH 362/506] Update readme and changelog --- CHANGELOG.md | 2 ++ ReadMe.md | 9 +++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc2122e23..0d06c1fdd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ * SubGHz: **Hold right in received signal list to delete selected signal** * SubGHz: **Custom buttons for Keeloq and Alutech AT4N** - now you can use arrow buttons to send signal with different button code * SubGHz: Debug mode counter increase settings (+5, +10, default: +1) +* Infrared: Debug TX PIN output settings (ability to move tx signal out to GPIO) +* BadUSB: Fixed #365 (BadUSB won't detect connection and/or hangs) #### [🎲 Download latest extra apps pack](https://download-directory.github.io/?url=https://github.com/xMasterX/unleashed-extra-pack/tree/main/apps) diff --git a/ReadMe.md b/ReadMe.md index 4343d7803..a78f749e0 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -165,10 +165,11 @@ Games: - Sub-GHz -> Press OK in frequency analyzer to use detected frequency in Read modes [(by derskythe)](https://github.com/DarkFlippers/unleashed-firmware/pull/77) - Sub-GHz -> Long press OK button in Sub-GHz Frequency analyzer to switch to Read menu [(by derskythe)](https://github.com/DarkFlippers/unleashed-firmware/pull/79) - Lock device with pin(or regular lock if pin not set) by holding UP button on main screen [(by an4tur0r)](https://github.com/DarkFlippers/unleashed-firmware/pull/107) -* SubGHz: **Hold right in received signal list to delete selected signal** -* SubGHz: **Custom buttons for Keeloq and Alutech AT4N** - now you can use arrow buttons to send signal with different button code -* SubGHz: Debug mode counter increase settings (+5, +10, default: +1) -* SubGHz: Debug PIN output settings for protocol development +* SubGHz -> **Hold right in received signal list to delete selected signal** +* SubGHz -> **Custom buttons for Keeloq and Alutech AT4N** - now you can use arrow buttons to send signal with different button code +* SubGHz -> Debug mode counter increase settings (+5, +10, default: +1) +* SubGHz -> Debug PIN output settings for protocol development +* Infrared -> Debug TX PIN output settings # Instructions ## [- How to install firmware](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/HowToInstall.md) From 39329eb4224147a033f758e0230bef6dcc563a58 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sun, 26 Feb 2023 05:46:50 +0300 Subject: [PATCH 363/506] Update lightmeter plugin --- CHANGELOG.md | 1 + .../gui/scenes/lightmeter_scene_config.c | 64 +++++++++++- .../gui/scenes/lightmeter_scene_help.c | 2 + .../plugins/lightmeter/gui/views/main_view.c | 98 ++++++++++++------ .../plugins/lightmeter/gui/views/main_view.h | 5 + .../plugins/lightmeter/images/framed_gui.gif | Bin 205286 -> 0 bytes .../lightmeter/images/framed_gui_config.png | Bin 250802 -> 0 bytes .../lightmeter/images/framed_gui_main.png | Bin 251397 -> 0 bytes .../plugins/lightmeter/images/gui_config.png | Bin 1848 -> 0 bytes .../plugins/lightmeter/images/gui_main.png | Bin 2015 -> 0 bytes .../plugins/lightmeter/lib/BH1750/BH1750.c | 18 ++-- .../plugins/lightmeter/lib/BH1750/BH1750.h | 7 ++ applications/plugins/lightmeter/lightmeter.c | 14 +-- applications/plugins/lightmeter/lightmeter.h | 2 + .../plugins/lightmeter/lightmeter_config.h | 11 +- .../plugins/lightmeter/lightmeter_helper.c | 34 +----- 16 files changed, 179 insertions(+), 77 deletions(-) delete mode 100644 applications/plugins/lightmeter/images/framed_gui.gif delete mode 100644 applications/plugins/lightmeter/images/framed_gui_config.png delete mode 100644 applications/plugins/lightmeter/images/framed_gui_main.png delete mode 100644 applications/plugins/lightmeter/images/gui_config.png delete mode 100644 applications/plugins/lightmeter/images/gui_main.png diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d06c1fdd..cf8b0b687 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ * SubGHz: Debug mode counter increase settings (+5, +10, default: +1) * Infrared: Debug TX PIN output settings (ability to move tx signal out to GPIO) * BadUSB: Fixed #365 (BadUSB won't detect connection and/or hangs) +* Plugins: Updated -> [BH1750] Lightmeter [(by oleksiikutuzov)](https://github.com/oleksiikutuzov/flipperzero-lightmeter) #### [🎲 Download latest extra apps pack](https://download-directory.github.io/?url=https://github.com/xMasterX/unleashed-extra-pack/tree/main/apps) diff --git a/applications/plugins/lightmeter/gui/scenes/lightmeter_scene_config.c b/applications/plugins/lightmeter/gui/scenes/lightmeter_scene_config.c index 42952562b..3d6bd5803 100644 --- a/applications/plugins/lightmeter/gui/scenes/lightmeter_scene_config.c +++ b/applications/plugins/lightmeter/gui/scenes/lightmeter_scene_config.c @@ -1,5 +1,7 @@ #include "../../lightmeter.h" +#define TAG "Scene Config" + static const char* iso_numbers[] = { [ISO_6] = "6", [ISO_12] = "12", @@ -39,10 +41,24 @@ static const char* diffusion_dome[] = { [WITH_DOME] = "Yes", }; +static const char* backlight[] = { + [BACKLIGHT_AUTO] = "Auto", + [BACKLIGHT_ON] = "On", +}; + +static const char* lux_only[] = { + [LUX_ONLY_OFF] = "Off", + [LUX_ONLY_ON] = "On", +}; + enum LightMeterSubmenuIndex { LightMeterSubmenuIndexISO, LightMeterSubmenuIndexND, LightMeterSubmenuIndexDome, + LightMeterSubmenuIndexBacklight, + LightMeterSubmenuIndexLuxMeter, + LightMeterSubmenuIndexHelp, + LightMeterSubmenuIndexAbout, }; static void iso_numbers_cb(VariableItem* item) { @@ -78,14 +94,47 @@ static void dome_presence_cb(VariableItem* item) { lightmeter_app_set_config(app, config); } +static void backlight_cb(VariableItem* item) { + LightMeterApp* app = variable_item_get_context(item); + uint8_t index = variable_item_get_current_value_index(item); + + variable_item_set_current_value_text(item, backlight[index]); + + LightMeterConfig* config = app->config; + if(index != config->backlight) { + if(index == BACKLIGHT_ON) { + notification_message( + app->notifications, + &sequence_display_backlight_enforce_on); // force on backlight + } else { + notification_message( + app->notifications, + &sequence_display_backlight_enforce_auto); // force auto backlight + } + } + config->backlight = index; + lightmeter_app_set_config(app, config); +} + +static void lux_only_cb(VariableItem* item) { + LightMeterApp* app = variable_item_get_context(item); + uint8_t index = variable_item_get_current_value_index(item); + + variable_item_set_current_value_text(item, lux_only[index]); + + LightMeterConfig* config = app->config; + config->lux_only = index; + lightmeter_app_set_config(app, config); +} + static void ok_cb(void* context, uint32_t index) { LightMeterApp* app = context; UNUSED(app); switch(index) { - case 3: + case LightMeterSubmenuIndexHelp: view_dispatcher_send_custom_event(app->view_dispatcher, LightMeterAppCustomEventHelp); break; - case 4: + case LightMeterSubmenuIndexAbout: view_dispatcher_send_custom_event(app->view_dispatcher, LightMeterAppCustomEventAbout); break; default: @@ -114,6 +163,16 @@ void lightmeter_scene_config_on_enter(void* context) { variable_item_set_current_value_index(item, config->dome); variable_item_set_current_value_text(item, diffusion_dome[config->dome]); + item = + variable_item_list_add(var_item_list, "Backlight", COUNT_OF(backlight), backlight_cb, app); + variable_item_set_current_value_index(item, config->backlight); + variable_item_set_current_value_text(item, backlight[config->backlight]); + + item = variable_item_list_add( + var_item_list, "Lux meter only", COUNT_OF(lux_only), lux_only_cb, app); + variable_item_set_current_value_index(item, config->lux_only); + variable_item_set_current_value_text(item, lux_only[config->lux_only]); + item = variable_item_list_add(var_item_list, "Help and Pinout", 0, NULL, NULL); item = variable_item_list_add(var_item_list, "About", 0, NULL, NULL); @@ -153,4 +212,5 @@ void lightmeter_scene_config_on_exit(void* context) { main_view_set_iso(app->main_view, app->config->iso); main_view_set_nd(app->main_view, app->config->nd); main_view_set_dome(app->main_view, app->config->dome); + main_view_set_lux_only(app->main_view, app->config->lux_only); } diff --git a/applications/plugins/lightmeter/gui/scenes/lightmeter_scene_help.c b/applications/plugins/lightmeter/gui/scenes/lightmeter_scene_help.c index 7b6d45864..0441f0925 100644 --- a/applications/plugins/lightmeter/gui/scenes/lightmeter_scene_help.c +++ b/applications/plugins/lightmeter/gui/scenes/lightmeter_scene_help.c @@ -10,6 +10,8 @@ void lightmeter_scene_help_on_enter(void* context) { furi_string_cat(temp_str, "\e#Pinout:\r\n"); furi_string_cat( temp_str, + " VCC: 3.3V\r\n" + " GND: GND\r\n" " SDA: 15 [C1]\r\n" " SCL: 16 [C0]\r\n"); diff --git a/applications/plugins/lightmeter/gui/views/main_view.c b/applications/plugins/lightmeter/gui/views/main_view.c index 756346fa4..8b3e2989f 100644 --- a/applications/plugins/lightmeter/gui/views/main_view.c +++ b/applications/plugins/lightmeter/gui/views/main_view.c @@ -41,7 +41,7 @@ static const int nd_numbers[] = { [ND_4096] = 4096, }; -static const float aperture_numbers[] = { +const float aperture_numbers[] = { [AP_1] = 1.0, [AP_1_4] = 1.4, [AP_2] = 2.0, @@ -59,14 +59,14 @@ static const float aperture_numbers[] = { [AP_128] = 128, }; -static const float speed_numbers[] = { +const float speed_numbers[] = { [SPEED_8000] = 1.0 / 8000, [SPEED_4000] = 1.0 / 4000, [SPEED_2000] = 1.0 / 2000, [SPEED_1000] = 1.0 / 1000, [SPEED_500] = 1.0 / 500, [SPEED_250] = 1.0 / 250, - [SPEED_125] = 1.0 / 125, [SPEED_60] = 1.0 / 60, [SPEED_30] = 1.0 / 30, - [SPEED_15] = 1.0 / 15, [SPEED_8] = 1.0 / 8, [SPEED_4] = 1.0 / 4, - [SPEED_2] = 1.0 / 2, [SPEED_1S] = 1.0, [SPEED_2S] = 2.0, - [SPEED_4S] = 4.0, [SPEED_8S] = 8.0, [SPEED_15S] = 15.0, - [SPEED_30S] = 30.0, + [SPEED_125] = 1.0 / 125, [SPEED_60] = 1.0 / 60, [SPEED_48] = 1.0 / 48, + [SPEED_30] = 1.0 / 30, [SPEED_15] = 1.0 / 15, [SPEED_8] = 1.0 / 8, + [SPEED_4] = 1.0 / 4, [SPEED_2] = 1.0 / 2, [SPEED_1S] = 1.0, + [SPEED_2S] = 2.0, [SPEED_4S] = 4.0, [SPEED_8S] = 8.0, + [SPEED_15S] = 15.0, [SPEED_30S] = 30.0, }; struct MainView { @@ -94,37 +94,39 @@ static void main_view_draw_callback(Canvas* canvas, void* context) { furi_assert(context); MainViewModel* model = context; - // FURI_LOG_D("MAIN VIEW", "Drawing"); - canvas_clear(canvas); - // top row - draw_top_row(canvas, model); - - // add f, T values - canvas_set_font(canvas, FontBigNumbers); - - // draw f icon and number - canvas_draw_icon(canvas, 15, 17, &I_f_10x14); - draw_aperture(canvas, model); - - // draw T icon and number - canvas_draw_icon(canvas, 15, 34, &I_T_10x14); - draw_speed(canvas, model); - // draw button canvas_set_font(canvas, FontSecondary); elements_button_left(canvas, "Config"); - // draw ND number - draw_nd_number(canvas, model); + if(!model->lux_only) { + // top row + draw_top_row(canvas, model); - // draw EV number - canvas_set_font(canvas, FontSecondary); - draw_EV_number(canvas, model); + // add f, T values + canvas_set_font(canvas, FontBigNumbers); - // draw mode indicator - draw_mode_indicator(canvas, model); + // draw f icon and number + canvas_draw_icon(canvas, 15, 17, &I_f_10x14); + draw_aperture(canvas, model); + + // draw T icon and number + canvas_draw_icon(canvas, 15, 34, &I_T_10x14); + draw_speed(canvas, model); + + // draw ND number + draw_nd_number(canvas, model); + + // draw EV number + canvas_set_font(canvas, FontSecondary); + draw_EV_number(canvas, model); + + // draw mode indicator + draw_mode_indicator(canvas, model); + } else { + draw_lux_only_mode(canvas, model); + } } static void main_view_process(MainView* main_view, InputEvent* event) { @@ -267,6 +269,12 @@ void main_view_set_dome(MainView* main_view, bool dome) { main_view->view, MainViewModel * model, { model->dome = dome; }, true); } +void main_view_set_lux_only(MainView* main_view, bool lux_only) { + furi_assert(main_view); + with_view_model( + main_view->view, MainViewModel * model, { model->lux_only = lux_only; }, true); +} + bool main_view_get_dome(MainView* main_view) { furi_assert(main_view); bool val = false; @@ -307,7 +315,7 @@ void draw_top_row(Canvas* canvas, MainViewModel* context) { canvas_set_font(canvas, FontPrimary); // metering mode A – ambient, F – flash - canvas_draw_str_aligned(canvas, 1, 1, AlignLeft, AlignTop, "A"); + // canvas_draw_str_aligned(canvas, 1, 1, AlignLeft, AlignTop, "A"); snprintf(str, sizeof(str), "ISO: %d", iso_numbers[model->iso]); canvas_draw_str_aligned(canvas, 19, 1, AlignLeft, AlignTop, str); @@ -412,6 +420,8 @@ void draw_nd_number(Canvas* canvas, MainViewModel* context) { char str[9]; + canvas_set_font(canvas, FontSecondary); + if(model->response) { snprintf(str, sizeof(str), "ND: %d", nd_numbers[model->nd]); } else { @@ -432,3 +442,29 @@ void draw_EV_number(Canvas* canvas, MainViewModel* context) { canvas_draw_str_aligned(canvas, 87, 29, AlignLeft, AlignBottom, "EV: --"); } } + +void draw_lux_only_mode(Canvas* canvas, MainViewModel* context) { + MainViewModel* model = context; + + if(!model->response) { + canvas_draw_box(canvas, 0, 0, 128, 12); + canvas_set_color(canvas, ColorWhite); + canvas_set_font(canvas, FontPrimary); + canvas_draw_str(canvas, 24, 10, "No sensor found"); + canvas_set_color(canvas, ColorBlack); + } else { + char str[12]; + + canvas_set_font(canvas, FontPrimary); + + canvas_draw_line(canvas, 0, 10, 128, 10); + canvas_draw_str_aligned(canvas, 64, 1, AlignCenter, AlignTop, "Lux meter mode"); + + canvas_set_font(canvas, FontBigNumbers); + snprintf(str, sizeof(str), "%.0f", (double)model->lux); + canvas_draw_str_aligned(canvas, 80, 32, AlignRight, AlignCenter, str); + + canvas_set_font(canvas, FontSecondary); + canvas_draw_str_aligned(canvas, 85, 39, AlignLeft, AlignBottom, "Lux"); + } +} diff --git a/applications/plugins/lightmeter/gui/views/main_view.h b/applications/plugins/lightmeter/gui/views/main_view.h index 4586e6a54..038cd3065 100644 --- a/applications/plugins/lightmeter/gui/views/main_view.h +++ b/applications/plugins/lightmeter/gui/views/main_view.h @@ -27,6 +27,7 @@ typedef struct { int aperture; int speed; bool dome; + bool lux_only; } MainViewModel; typedef void (*LightMeterMainViewButtonCallback)(void* context); @@ -58,6 +59,8 @@ void main_view_set_speed(MainView* main_view, int val); void main_view_set_dome(MainView* main_view, bool val); +void main_view_set_lux_only(MainView* main_view, bool val); + bool main_view_get_dome(MainView* main_view); void draw_top_row(Canvas* canvas, MainViewModel* context); @@ -71,3 +74,5 @@ void draw_mode_indicator(Canvas* canvas, MainViewModel* context); void draw_nd_number(Canvas* canvas, MainViewModel* context); void draw_EV_number(Canvas* canvas, MainViewModel* context); + +void draw_lux_only_mode(Canvas* canvas, MainViewModel* context); diff --git a/applications/plugins/lightmeter/images/framed_gui.gif b/applications/plugins/lightmeter/images/framed_gui.gif deleted file mode 100644 index 86c4d79a51b4ddf08d9ab752ad8a3c7f9183a48d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 205286 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 z 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%0D9e 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 Td3`~Tk*&eM%@jN8&?WSMO(FOIl=Fi^OoZY$6 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�Sg%9zj4r$D<2<+*%!X{r8Z^* zYRtL-IEg0f;XGGWTn9DRvrMC;d%-9EZC)cePD_4#VL{IO_{22QhIltZcfo$z`t=Mw z@uC{5)%HFhcEhHhCR1{QEBXalCy9|e@HNX$HefnHR4FkQ8+>jGp%kUyaOJNRjl$QvgO;iN zlfi(s2aKwI%Rsm87X$IS%FG`Z7OMO3Q8ta4tq$*5qwGu`{X>#k?e)#LX^gJ-szD+@ zfOAlZfb2W3fUbmg4;RNE8g6adMz*@gz_#AA6KDwdY3es{bWXxHs8Nm+qQ1O$p6 zojb49+z6*KXx09E=f8dsFG?^%%D@^n@uTYN?81eI_Nut95ue{BTIOT^TBR_ z&1IHB%=j~BNI=^;WNbriyzJ9xYVcYb6dzfx|L%&(iUbn|Y3bl=d5RyWWMpyIxAkqV zODxHSp%z;)LC%VR!rWE|nGz@C3kt}x0Nk5~?&`&*kIrB7^4lZHFRyq5)RqnDi?>&Ak7rvKZNc^TON{AiQboKmJ@CDbZyG5Wfg( z4=XgBH#SC`{ylF!_U)UP>2WJfWc0gG;I#G?;KdghS$E3p{0FBK3c1M?TRmJU?z?D| zfVg(RCaa>l&?La2tq$Fq@`gs;<;y|WcZ@*>A2v5|z)*M6Q3@d&;JVf(cGkyGnY9mT z=+PZ*U%00d4008jwVED=Ia-IYHZFDEKX4+;Ci7(QifJ8yP>q``uuRx za_V)aNSzV_RO3ssL`gcGRM7fEU+>e_*bxynEzcz1=rL)~*Ij^7^LLKKtZ=OM7&);a%d#!2$w$Y$yw zWF>nSo7v(*VW->+dh7V7d5u;S?|nF|L}R0G90cwN0}I63D=<-NYVh4of2-J?uq$!? z-tcMGxf`N^6?C#`{Ae<9plb)1%RBW4{AjaNe`3~s_k2}x$C(mSEWMMtSqM2?awbPG z3L@M!z>=FnKnJ|)X=fF>*ds7*TmTo3v)oCq^Ts#}J)AU#EVd7u+jWx3+VvU^8-bC8 z-FD;A+cB0c^3DT|py&B&;cv2jK_)P3kmUu6cQNu2fVw0y_xVCyM8;Ce8#xHs4Kz7< z0K+XN)Fm2n5mo}FndFwdphmLb6J<`=t^1jqzFBio%@x`U-i$mp9k<5*a{j%N4F|8L z3U68!iie9->Ef&7;MTssEAI>;Z+N`|WsCl8^kFH+*4tjbY|Nv;v5@?JoQ!%pR0l_1 z{7e!1o7)e!#a?klMkFT0$c%I)DLus{`O%W`6T zyjuSEHNN_q21Ca+-K>HN998J=a3gaU<*Xf z9jJhshu7LaO6>~r>>L()@22(eQj+m88S;nuH=Z|T5J?V0xsj@GCwl~mlhF*TfKgD% zJqxAm-q7)%K$x~%pSL6pl|s$}*|U_sAG~q%=wTVuFN04Vc z_P$VPhIPJ4)!{NUZHXwzVV9f>Lb!y)xOTdH6YIRjRPbA*81A}vu+MG4Xry1Ie$U6P zTn`O>P$R#g`Ju)8EY5|NF3YL@1^?~zNKHuLq3r`6syIKNd=4J|>d<#j$_>BF3l~utHDosX ztS+rEzq~pPm%0|qn(JfkUQT%XH+`Wus&iq!YklGC$cV4w-p0dKzi`3wY+lti2%|YQ zbz*fklXPHrU_O8S&-Y`2S}aS=vpx=LtRXJaT@0u!aKfl27ily(^ZWA0l|VIBoPI*y z;y`ZMbpQIQ3dv+~PYiH{@^E_w@?Kd`#~V>cwYOP0SFU_5++CxOcA8&O%d0&uloz~| z6x^+QDAh>k+^2Nhg-cQ`eiI#Sz;<>_hd!JLzbc!=80GS|%%FVQi1I0AJ^pK0*9Fa^ zYsK&{PiIZ;VBtDjW#V9EQseULZgM?4$v@_v-PdhfGgPq4Q8m}l_^QQ=_zhq?WuaUeHSXWa>w1!=-It* zOcSe~l#_kmuGD4(ug?&bR&;ZsWD*S(1)LP#>CB(oRvy<5O{h!6s`NK$1)3uK`~QC> z@UH~^mB7Ce_*Vk|O5k4!{40U~{}On^w!BWKByC{-SoCKOGK`kS`BORSRyY3-?oR*7 diff --git a/applications/plugins/lightmeter/images/framed_gui_main.png b/applications/plugins/lightmeter/images/framed_gui_main.png deleted file mode 100644 index 89aa1a11f8f7a7d89b1c2bd53c8646e2463d0b89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 251397 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 c^jK^v`jtsD(R_5xLD$=li|R zcbZDxG#7`*0l?g(%?Td@c%ZKc_{@~#k+e{>%+A@ImJ9Iu8#50A|4oD$5;1mVpO3q~!8l`x~qD%`S)48`?+u zj2rXwZ_hG8)Ck=0jjRnBVz*1;!TA{ zR-pLN)*)>%o-J!13UJM%`NbDuKtw9NLTh&v%pr@ZO9r*Nyi2*dhOmLi_SGRwzv>GJ zoSd2V8j!>$CR|~uaICQPRXdz{y3_4Lw??Pw6@5P(G$WbMdS-|{xf8>e4;YY@v|3kN zmvz#>vgG~vl~$F70jK5?;O%Qu?3ObO{n1j+wn=M*=L^;n#>#T;bkn}^G*ihaWal{? z_Nb>ixo?pEQ_KvMAmk`IWoI)LeYd`bUSR zl-2uI()X4Vr_HXS?f$NTG70TiRw(mfu7%4ZhQDxp+YR5{8Si|oAI|C8YCIQnG5gJi z6b#l#sTZ~Ck*rlc+Nuy;BJv*c2JMWXjjcCUauX-gCGGucy<#e_N4fy0XWYmF(mch~ zQGA$`@OwYoso$HbYCOC}rths;mA{x=W-x_JRtS|xP(JUW=KgKmL^>&i;}nh8l<$qJ zKex+}aVTpE2XQ8&I9B*PgQ~e~^rjvo_9V}ik(H%a1JBm|WUj@?Q8G>Lp;!n~X=>QW z6}jqo@6ZEbwK8$sgI$}$K(*Zed`@i~7st;<)#{kvgvsl)AFSF06x$w*!G&W; zod&0MCYiXc2QbrV*A;xSKAtk>f1G8XC>B{RShRkVoeYzR=u+QZbuGovY{M5g@+nf!%d-LGCYVGs~uL^1ue=a-rALEDZPa5icvN zw!N|i|Jxe$uzy{{LuSv%+Oi`7`FrM2WFtESk1vhZ*jzRGSugutP-0zb{Y;#M*{oFx zuMSQO_o^;>L^ze~WRE-Ks_-et^Z`Sp=}$AGKcy_-N(Bsxr>2{az6Fb(-wT^`kb3Zs z5LWjBdE17lHioIw%HfbDr9$O>25Yi2jFf@VM^hZZXS6rcIc>xf_;t}m82z`g-(6*DY7&Y`;pkn}z|p&@Sf7k>efGPFbh diff --git a/applications/plugins/lightmeter/images/gui_main.png b/applications/plugins/lightmeter/images/gui_main.png deleted file mode 100644 index ae523aa2ff300063c279fe8742b08c74b47ce37a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2015 zcmY+Ee^8Ql9LK+eN@C3}vZOzK`2-XfsP$>mT2pN=}U!S|@p6Bj)p3n1szdrBJry!mj zyBNI^4FFgiw>5ef01I5V2(Zw7**1|7?7DboY)!}nzz5?#5#S2n9{|+FxaiG$PV>hG zA6!&_yTmiTXxoeLh^QBDmld_4rb(Ccm#zj!@|@zy@pE~+9?`hh14U%6a~cJh5-e=3r#zVW~)O!%RIXl874XkdAS@5AErQGxp|nNMNEBA?Gu4@9h;o9Ms!I{h4Az zpI5qrSWh__G_xVlWnlqWT@1iNOG4JE)(!fcTEor8LW#CiCHi+JqBo<5U)^tA9JqT< zVO3G-2GVD9rd$nm9rw@KT}b*oJ>Da9cVbqqo9O$-5IKm#O}f4|5(oP0M~<^1bVM$) zw%@L0UEP^3*0 zA(-PKv3Id8G==q+qY1-yGDahgi-!vw$BmDwx)g7U6$d;&blk0PO)7|(VhLy!L4D!L zx*g<^feIe4&&>Bxc5AhqjTdfn!QD$PPHx3p~2Te~B zNI?D3@O3IMcbjH9!uiGys;A(jS26knX?F#2npbeY;AY0g*t2w6--+Wh1u?1z{FIw$ z#p{x$6_pd(i}PP@xi53bA`*V3jwKC5L^jK`n7Ibzvw9Yl>1)SI1=_J z3o($lq)=p8vMz_wfGvIcdCfDOj;W+?5ZDofmhXu`P%FIvlFJ z8A9*x-#~T!LXe#Uo^N62F3_ih_11tCm>m!CI&e6olL8r(gXNvcUh^h1wgVhsiy3UX z$Y~Z&3hQ!vtcKz&B!n&eq!$p5maI=q?#6RvP^t{KZ^S12l+0`}Hg#_=YM!vkvnvSn zfBsu_MrMqIlArGyXXGE$rI*@kofd{5T!@aTp7Xg!wJ3$52*0*o)4f7-;um=h=Z)Xm zY|0QBvK*Qf&_Xl4El$Fjdi!rj;_^ZSLon)|P$bO~vfpCH*vbjiCu?gTRSnX6aK0tX z9aY;Q|9Iaa1nY6u=-sd%TY2RAJSaRn2)-$P_Log8!!!ox+-D4JN6!1SVjSsD_>^Yl zMO6k*Rvk@susc|1(jXdX1||@$HA~pGhtJqg+qVqmKn8S7@LIsb7K)wxt&kp~x4l+4 z79z^fI6e{Dh8Z~+-G;<94|sMpJ^dx0NhRH+~F8PcCpTT?XP5JX+6config = malloc(sizeof(LightMeterConfig)); @@ -39,12 +38,11 @@ LightMeterApp* lightmeter_app_alloc(uint32_t first_scene) { app->config->nd = DEFAULT_ND; app->config->aperture = DEFAULT_APERTURE; app->config->dome = DEFAULT_DOME; + app->config->backlight = DEFAULT_BACKLIGHT; // Records app->gui = furi_record_open(RECORD_GUI); app->notifications = furi_record_open(RECORD_NOTIFICATION); - notification_message( - app->notifications, &sequence_display_backlight_enforce_on); // force on backlight // View dispatcher app->view_dispatcher = view_dispatcher_alloc(); @@ -112,9 +110,11 @@ void lightmeter_app_free(LightMeterApp* app) { // Records furi_record_close(RECORD_GUI); - notification_message( - app->notifications, - &sequence_display_backlight_enforce_auto); // set backlight back to auto + if(app->config->backlight != BACKLIGHT_AUTO) { + notification_message( + app->notifications, + &sequence_display_backlight_enforce_auto); // set backlight back to auto + } furi_record_close(RECORD_NOTIFICATION); bh1750_set_power_state(0); diff --git a/applications/plugins/lightmeter/lightmeter.h b/applications/plugins/lightmeter/lightmeter.h index 679b32d15..2558be3c5 100644 --- a/applications/plugins/lightmeter/lightmeter.h +++ b/applications/plugins/lightmeter/lightmeter.h @@ -24,6 +24,8 @@ typedef struct { int nd; int aperture; int dome; + int backlight; + int lux_only; } LightMeterConfig; typedef struct { diff --git a/applications/plugins/lightmeter/lightmeter_config.h b/applications/plugins/lightmeter/lightmeter_config.h index 023235cff..5edbdce0a 100644 --- a/applications/plugins/lightmeter/lightmeter_config.h +++ b/applications/plugins/lightmeter/lightmeter_config.h @@ -1,6 +1,6 @@ #pragma once -#define LM_VERSION_APP "0.5" +#define LM_VERSION_APP "0.7" #define LM_DEVELOPED "Oleksii Kutuzov" #define LM_GITHUB "https://github.com/oleksiikutuzov/flipperzero-lightmeter" @@ -10,6 +10,7 @@ #define DEFAULT_APERTURE AP_2_8 #define DEFAULT_SPEED SPEED_125 #define DEFAULT_DOME WITHOUT_DOME +#define DEFAULT_BACKLIGHT BACKLIGHT_AUTO typedef enum { ISO_6, @@ -78,6 +79,7 @@ typedef enum { SPEED_250, SPEED_125, SPEED_60, + SPEED_48, SPEED_30, SPEED_15, SPEED_8, @@ -97,3 +99,10 @@ typedef enum { WITHOUT_DOME, WITH_DOME, } LightMeterDomePresence; + +typedef enum { + LUX_ONLY_OFF, + LUX_ONLY_ON, +} LightMeterLuxOnlyMode; + +typedef enum { BACKLIGHT_AUTO, BACKLIGHT_ON } LightMeterBacklight; diff --git a/applications/plugins/lightmeter/lightmeter_helper.c b/applications/plugins/lightmeter/lightmeter_helper.c index 1cdddfca9..465ccbce1 100644 --- a/applications/plugins/lightmeter/lightmeter_helper.c +++ b/applications/plugins/lightmeter/lightmeter_helper.c @@ -1,33 +1,8 @@ #include "lightmeter_helper.h" #include "lightmeter_config.h" -static const float aperture_numbers[] = { - [AP_1] = 1.0, - [AP_1_4] = 1.4, - [AP_2] = 2.0, - [AP_2_8] = 2.8, - [AP_4] = 4.0, - [AP_5_6] = 5.6, - [AP_8] = 8, - [AP_11] = 11, - [AP_16] = 16, - [AP_22] = 22, - [AP_32] = 32, - [AP_45] = 45, - [AP_64] = 64, - [AP_90] = 90, - [AP_128] = 128, -}; - -static const float time_numbers[] = { - [SPEED_8000] = 1.0 / 8000, [SPEED_4000] = 1.0 / 4000, [SPEED_2000] = 1.0 / 2000, - [SPEED_1000] = 1.0 / 1000, [SPEED_500] = 1.0 / 500, [SPEED_250] = 1.0 / 250, - [SPEED_125] = 1.0 / 125, [SPEED_60] = 1.0 / 60, [SPEED_30] = 1.0 / 30, - [SPEED_15] = 1.0 / 15, [SPEED_8] = 1.0 / 8, [SPEED_4] = 1.0 / 4, - [SPEED_2] = 1.0 / 2, [SPEED_1S] = 1.0, [SPEED_2S] = 2.0, - [SPEED_4S] = 4.0, [SPEED_8S] = 8.0, [SPEED_15S] = 15.0, - [SPEED_30S] = 30.0, -}; +extern const float aperture_numbers[]; +extern const float speed_numbers[]; float lux2ev(float lux) { return log2(lux / 2.5); @@ -41,7 +16,6 @@ float getMinDistance(float x, float v1, float v2) { return v1; } -// Convert calculated aperture value to photography style aperture value. float normalizeAperture(float a) { for(int i = 0; i < AP_NUM; i++) { float a1 = aperture_numbers[i]; @@ -57,8 +31,8 @@ float normalizeAperture(float a) { float normalizeTime(float a) { for(int i = 0; i < SPEED_NUM; i++) { - float a1 = time_numbers[i]; - float a2 = time_numbers[i + 1]; + float a1 = speed_numbers[i]; + float a2 = speed_numbers[i + 1]; if(a1 < a && a2 >= a) { return getMinDistance(a, a1, a2); From b15a15411fa969d567191fee4dc292c991478ea1 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sun, 26 Feb 2023 04:22:06 +0300 Subject: [PATCH 364/506] Revert "Fix BadUSB bug (#365)" This reverts commit 543346f885259432ae7e700f9fe9e7a029100a46. --- applications/main/bad_usb/scenes/bad_usb_scene_work.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/applications/main/bad_usb/scenes/bad_usb_scene_work.c b/applications/main/bad_usb/scenes/bad_usb_scene_work.c index 337c329dd..187b83bd9 100644 --- a/applications/main/bad_usb/scenes/bad_usb_scene_work.c +++ b/applications/main/bad_usb/scenes/bad_usb_scene_work.c @@ -31,8 +31,6 @@ bool bad_usb_scene_work_on_event(void* context, SceneManagerEvent event) { void bad_usb_scene_work_on_enter(void* context) { BadUsbApp* app = context; - furi_check(furi_hal_usb_set_config(NULL, NULL)); - FuriString* file_name; file_name = furi_string_alloc(); path_extract_filename(app->file_path, file_name, true); From b3559bf0587c5600905b41fab03aeb7f7441cd77 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sun, 26 Feb 2023 05:56:31 +0300 Subject: [PATCH 365/506] Update changelog --- CHANGELOG.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cf8b0b687..d0dbad315 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,12 @@ ### New changes -* SubGHz: **Beninca protocol support** +* SubGHz: **Keeloq: Beninca - protocol support** * SubGHz: **Hold right in received signal list to delete selected signal** * SubGHz: **Custom buttons for Keeloq and Alutech AT4N** - now you can use arrow buttons to send signal with different button code * SubGHz: Debug mode counter increase settings (+5, +10, default: +1) * Infrared: Debug TX PIN output settings (ability to move tx signal out to GPIO) -* BadUSB: Fixed #365 (BadUSB won't detect connection and/or hangs) * Plugins: Updated -> [BH1750] Lightmeter [(by oleksiikutuzov)](https://github.com/oleksiikutuzov/flipperzero-lightmeter) +* OFW: BadUSB -> STRINGDELAY(STRING_DELAY) feature, worker signal handling refactoring -> (Fixed #365 (BadUSB won't detect connection and/or hangs)) +* OFW: Grammar fixes #### [🎲 Download latest extra apps pack](https://download-directory.github.io/?url=https://github.com/xMasterX/unleashed-extra-pack/tree/main/apps) From 0bf0267edd11b81c892c2ea722c928fad8837031 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sun, 26 Feb 2023 06:07:31 +0300 Subject: [PATCH 366/506] Fix pvs warnings from OFW --- applications/main/bad_usb/bad_usb_script.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/applications/main/bad_usb/bad_usb_script.c b/applications/main/bad_usb/bad_usb_script.c index d66ce8a91..beb35b894 100644 --- a/applications/main/bad_usb/bad_usb_script.c +++ b/applications/main/bad_usb/bad_usb_script.c @@ -511,7 +511,7 @@ static uint32_t bad_usb_flags_get(uint32_t flags_mask, uint32_t timeout) { furi_check((flags & FuriFlagError) == 0); if(flags == 0) { flags = furi_thread_flags_wait(flags_mask, FuriFlagWaitAny, timeout); - furi_check(((flags & FuriFlagError) == 0) || (flags == FuriFlagErrorTimeout)); + furi_check(((flags & FuriFlagError) == 0) || (flags == (unsigned)FuriFlagErrorTimeout)); } else { uint32_t state = furi_thread_flags_clear(flags); furi_check((state & FuriFlagError) == 0); @@ -610,7 +610,7 @@ static int32_t bad_usb_worker(void* context) { WorkerEvtEnd | WorkerEvtDisconnect | WorkerEvtToggle, FuriFlagWaitAny | FuriFlagNoClear, 1500); - if(flags == FuriFlagErrorTimeout) { + if(flags == (unsigned)FuriFlagErrorTimeout) { // If nothing happened - start script execution worker_state = BadUsbStateRunning; } else if(flags & WorkerEvtToggle) { From a19768e37632c3d18ddc0e2e3ba1fa1ea87cd7ae Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sun, 26 Feb 2023 06:39:42 +0300 Subject: [PATCH 367/506] Throw small delay --- applications/main/subghz/views/receiver.c | 1 + 1 file changed, 1 insertion(+) diff --git a/applications/main/subghz/views/receiver.c b/applications/main/subghz/views/receiver.c index 71ff85448..8dbb22b86 100644 --- a/applications/main/subghz/views/receiver.c +++ b/applications/main/subghz/views/receiver.c @@ -593,6 +593,7 @@ void subghz_view_receiver_delete_element_callback(SubGhzViewReceiver* subghz_rec } }, true); + furi_delay_ms(200); } void subghz_view_receiver_set_idx_menu(SubGhzViewReceiver* subghz_receiver, uint16_t idx) { From 0bc995bfabcfa238913ac1b566c0a537b8365cf6 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sun, 26 Feb 2023 06:41:50 +0300 Subject: [PATCH 368/506] Update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d0dbad315..128c9465a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ * SubGHz: **Hold right in received signal list to delete selected signal** * SubGHz: **Custom buttons for Keeloq and Alutech AT4N** - now you can use arrow buttons to send signal with different button code * SubGHz: Debug mode counter increase settings (+5, +10, default: +1) -* Infrared: Debug TX PIN output settings (ability to move tx signal out to GPIO) +* Infrared: Debug TX PIN output settings (ability to move tx signal out to GPIO) (implemented #364) * Plugins: Updated -> [BH1750] Lightmeter [(by oleksiikutuzov)](https://github.com/oleksiikutuzov/flipperzero-lightmeter) * OFW: BadUSB -> STRINGDELAY(STRING_DELAY) feature, worker signal handling refactoring -> (Fixed #365 (BadUSB won't detect connection and/or hangs)) * OFW: Grammar fixes From fb08674a9964536936ffc4bd24c1fa5cbb23c2cf Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Sun, 26 Feb 2023 06:49:08 +0000 Subject: [PATCH 369/506] BadKB handle connection at app level + fix crash --- applications/main/bad_kb/bad_kb_app.c | 23 ++--- applications/main/bad_kb/bad_kb_app.h | 2 - applications/main/bad_kb/bad_kb_app_i.h | 4 + applications/main/bad_kb/bad_kb_script.c | 84 ++++++++++--------- applications/main/bad_kb/bad_kb_script.h | 8 +- .../bad_kb/scenes/bad_kb_scene_config_bt.c | 14 +--- .../bad_kb/scenes/bad_kb_scene_config_usb.c | 14 +--- .../bad_kb/scenes/bad_kb_scene_file_select.c | 2 - 8 files changed, 67 insertions(+), 84 deletions(-) diff --git a/applications/main/bad_kb/bad_kb_app.c b/applications/main/bad_kb/bad_kb_app.c index 8b694cadd..2f5ee75ff 100644 --- a/applications/main/bad_kb/bad_kb_app.c +++ b/applications/main/bad_kb/bad_kb_app.c @@ -72,17 +72,6 @@ static void bad_kb_save_settings(BadKbApp* app) { storage_file_free(settings_file); } -void bad_kb_set_name(BadKbApp* app, const char* fmt, ...) { - furi_assert(app); - - va_list args; - va_start(args, fmt); - - vsnprintf(app->name, BAD_KB_ADV_NAME_MAX_LEN, fmt, args); - - va_end(args); -} - BadKbApp* bad_kb_app_alloc(char* arg) { BadKbApp* app = malloc(sizeof(BadKbApp)); @@ -113,6 +102,8 @@ BadKbApp* bad_kb_app_alloc(char* arg) { view_dispatcher_set_navigation_event_callback( app->view_dispatcher, bad_kb_app_back_event_callback); + app->connection_init = false; + Bt* bt = furi_record_open(RECORD_BT); app->bt = bt; app->is_bt = XTREME_SETTINGS()->bad_bt; @@ -158,6 +149,7 @@ BadKbApp* bad_kb_app_alloc(char* arg) { app->error = BadKbAppErrorCloseRpc; scene_manager_next_scene(app->scene_manager, BadKbSceneError); } else { + bad_kb_connection_init(app); if(!furi_string_empty(app->file_path)) { app->bad_kb_script = bad_kb_script_open(app->file_path, app->is_bt ? app->bt : NULL); bad_kb_script_set_keyboard_layout(app->bad_kb_script, app->keyboard_layout); @@ -179,6 +171,8 @@ void bad_kb_app_free(BadKbApp* app) { app->bad_kb_script = NULL; } + bad_kb_connection_deinit(app); + // Views view_dispatcher_remove_view(app->view_dispatcher, BadKbAppViewWork); bad_kb_free(app->bad_kb_view); @@ -205,10 +199,9 @@ void bad_kb_app_free(BadKbApp* app) { view_dispatcher_free(app->view_dispatcher); scene_manager_free(app->scene_manager); - // restores bt config - // BtProfile have already been switched to the previous one - // so we directly modify the right profile - bad_kb_connection_deinit(app->bt, true); + // Restore bt config + // BtProfile has already been switched to the previous one + // So we directly modify the right profile if(strcmp(app->bt_old_config.name, app->name) != 0) { furi_hal_bt_set_profile_adv_name(FuriHalBtProfileHidKeyboard, app->bt_old_config.name); } diff --git a/applications/main/bad_kb/bad_kb_app.h b/applications/main/bad_kb/bad_kb_app.h index e75a94651..af64be253 100644 --- a/applications/main/bad_kb/bad_kb_app.h +++ b/applications/main/bad_kb/bad_kb_app.h @@ -6,8 +6,6 @@ extern "C" { typedef struct BadKbApp BadKbApp; -void bad_kb_set_name(BadKbApp* app, const char* fmt, ...); - #ifdef __cplusplus } #endif diff --git a/applications/main/bad_kb/bad_kb_app_i.h b/applications/main/bad_kb/bad_kb_app_i.h index 38cae44c5..b16eb159d 100644 --- a/applications/main/bad_kb/bad_kb_app_i.h +++ b/applications/main/bad_kb/bad_kb_app_i.h @@ -68,6 +68,10 @@ struct BadKbApp { BadKbScript* bad_kb_script; bool is_bt; + + bool connection_init; + FuriHalUsbInterface* usb_prev_mode; + GapPairing bt_prev_mode; }; typedef enum { diff --git a/applications/main/bad_kb/bad_kb_script.c b/applications/main/bad_kb/bad_kb_script.c index 018dbb51b..d6cb6fae6 100644 --- a/applications/main/bad_kb/bad_kb_script.c +++ b/applications/main/bad_kb/bad_kb_script.c @@ -11,6 +11,8 @@ #include +#include "bad_kb_app_i.h" + #define HID_BT_KEYS_STORAGE_PATH EXT_PATH("apps/Tools/.bt_hid.keys") #define TAG "BadKB" @@ -164,10 +166,6 @@ static const uint8_t numpad_keys[10] = { HID_KEYPAD_9, }; -FuriHalUsbInterface* usb_mode_prev = NULL; -GapPairing bt_mode_prev = GapPairingNone; -bool usb_initialized = false; -bool bt_initialized = false; uint8_t bt_timeout = 0; static LevelRssiRange bt_remote_rssi_range(Bt* bt) { @@ -617,43 +615,55 @@ static void bad_kb_usb_hid_state_callback(bool state, void* context) { } } -void bad_kb_connection_init(Bt* bt) { - if(bt && !bt_initialized) { - bt_timeout = bt_hid_delays[LevelRssi39_0]; - bt_disconnect(bt); - furi_delay_ms(200); - bt_keys_storage_set_storage_path(bt, HID_BT_KEYS_STORAGE_PATH); - furi_assert(bt_set_profile(bt, BtProfileHidKeyboard)); - bt_mode_prev = bt_get_profile_pairing_method(bt); - bt_set_profile_pairing_method(bt, GapPairingNone); +void bad_kb_config_switch_mode(BadKbApp* app) { + bad_kb_script_close(app->bad_kb_script); + app->bad_kb_script = bad_kb_script_open(app->file_path, app->is_bt ? app->bt : NULL); + bad_kb_script_set_keyboard_layout(app->bad_kb_script, app->keyboard_layout); + scene_manager_previous_scene(app->scene_manager); + if(app->is_bt) { furi_hal_bt_start_advertising(); - // disable peer key adding to bt SRAM storage - bt_disable_peer_key_update(bt); - bt_initialized = true; - } - if(!bt && !usb_initialized) { - usb_mode_prev = furi_hal_usb_get_config(); - usb_initialized = true; + scene_manager_next_scene(app->scene_manager, BadKbSceneConfigBt); + } else { + furi_hal_bt_stop_advertising(); + scene_manager_next_scene(app->scene_manager, BadKbSceneConfigUsb); } } -void bad_kb_connection_deinit(Bt* bt, bool reset_bt) { - if(bt_initialized && reset_bt && bt) { - // bt_hid_hold_while_keyboard_buffer_full(6, 3000); // release all keys - bt_disconnect(bt); // stop ble - furi_delay_ms(200); // Wait 2nd core to update nvm storage - bt_keys_storage_set_default_path(bt); - bt_set_profile_pairing_method(bt, bt_mode_prev); - // fails if ble radio stack isn't ready when switching profile - // if it happens, maybe we should increase the delay after bt_disconnect - bt_set_profile(bt, BtProfileSerial); - bt_enable_peer_key_update(bt); // starts saving peer keys (bounded devices) - bt_initialized = false; - } - if(usb_initialized) { - furi_hal_usb_set_config(usb_mode_prev, NULL); - usb_initialized = false; +void bad_kb_connection_init(BadKbApp* app) { + app->usb_prev_mode = furi_hal_usb_get_config(); + furi_hal_usb_set_config(NULL, NULL); + + bt_timeout = bt_hid_delays[LevelRssi39_0]; + bt_disconnect(app->bt); + // furi_delay_ms(200); + bt_keys_storage_set_storage_path(app->bt, HID_BT_KEYS_STORAGE_PATH); + bt_set_profile(app->bt, BtProfileHidKeyboard); + app->bt_prev_mode = bt_get_profile_pairing_method(app->bt); + bt_set_profile_pairing_method(app->bt, GapPairingNone); + bt_disable_peer_key_update(app->bt); // disable peer key adding to bt SRAM storage + if(app->is_bt) { + furi_hal_bt_start_advertising(); + } else { + furi_hal_bt_stop_advertising(); } + + app->connection_init = true; +} + +void bad_kb_connection_deinit(BadKbApp* app) { + if(!app->connection_init) return; + + furi_hal_usb_set_config(app->usb_prev_mode, NULL); + + // bt_hid_hold_while_keyboard_buffer_full(6, 3000); // release all keys + bt_disconnect(app->bt); // stop ble + // furi_delay_ms(200); // Wait 2nd core to update nvm storage + bt_keys_storage_set_default_path(app->bt); + bt_set_profile_pairing_method(app->bt, app->bt_prev_mode); + // fails if ble radio stack isn't ready when switching profile + // if it happens, maybe we should increase the delay after bt_disconnect + bt_set_profile(app->bt, BtProfileSerial); + bt_enable_peer_key_update(app->bt); // starts saving peer keys (bounded devices) } static int32_t bad_kb_worker(void* context) { @@ -662,7 +672,6 @@ static int32_t bad_kb_worker(void* context) { BadKbWorkerState worker_state = BadKbStateInit; int32_t delay_val = 0; - bad_kb_connection_init(bad_kb->bt); if(bad_kb->bt) { bt_set_status_changed_callback(bad_kb->bt, bad_kb_bt_hid_state_callback, bad_kb); } else { @@ -848,7 +857,6 @@ static int32_t bad_kb_worker(void* context) { } else { furi_hal_hid_set_state_callback(NULL, NULL); } - bad_kb_connection_deinit(bad_kb->bt, false); storage_file_close(script_file); storage_file_free(script_file); diff --git a/applications/main/bad_kb/bad_kb_script.h b/applications/main/bad_kb/bad_kb_script.h index fde99556e..5699e4189 100644 --- a/applications/main/bad_kb/bad_kb_script.h +++ b/applications/main/bad_kb/bad_kb_script.h @@ -7,6 +7,8 @@ extern "C" { #include #include +typedef struct BadKbApp BadKbApp; + typedef struct BadKbScript BadKbScript; typedef enum { @@ -32,7 +34,11 @@ typedef struct { char error[64]; } BadKbState; -void bad_kb_connection_deinit(Bt* bt, bool reset_bt); +void bad_kb_config_switch_mode(BadKbApp* app); + +void bad_kb_connection_init(BadKbApp* app); + +void bad_kb_connection_deinit(BadKbApp* app); BadKbScript* bad_kb_script_open(FuriString* file_path, Bt* bt); diff --git a/applications/main/bad_kb/scenes/bad_kb_scene_config_bt.c b/applications/main/bad_kb/scenes/bad_kb_scene_config_bt.c index b3b0ec2bb..1a867f877 100644 --- a/applications/main/bad_kb/scenes/bad_kb_scene_config_bt.c +++ b/applications/main/bad_kb/scenes/bad_kb_scene_config_bt.c @@ -56,23 +56,11 @@ bool bad_kb_scene_config_bt_on_event(void* context, SceneManagerEvent event) { if(event.event == VarItemListIndexKeyboardLayout) { scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigLayout); } else if(event.event == VarItemListIndexConnection) { - bad_kb_script_close(bad_kb->bad_kb_script); - bad_kb_connection_deinit(bad_kb->bt, true); - bad_kb->bad_kb_script = - bad_kb_script_open(bad_kb->file_path, bad_kb->is_bt ? bad_kb->bt : NULL); - bad_kb_script_set_keyboard_layout(bad_kb->bad_kb_script, bad_kb->keyboard_layout); - scene_manager_previous_scene(bad_kb->scene_manager); - if(bad_kb->is_bt) { - scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigBt); - } else { - scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigUsb); - } + bad_kb_config_switch_mode(bad_kb); } else if(event.event == VarItemListIndexAdvertisementName) { scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigName); } else if(event.event == VarItemListIndexMacAddress) { scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigMac); - // } else { - // furi_crash("Unknown key type"); } } diff --git a/applications/main/bad_kb/scenes/bad_kb_scene_config_usb.c b/applications/main/bad_kb/scenes/bad_kb_scene_config_usb.c index 2fa264e7c..d3ff35fc8 100644 --- a/applications/main/bad_kb/scenes/bad_kb_scene_config_usb.c +++ b/applications/main/bad_kb/scenes/bad_kb_scene_config_usb.c @@ -50,19 +50,7 @@ bool bad_kb_scene_config_usb_on_event(void* context, SceneManagerEvent event) { if(event.event == VarItemListIndexKeyboardLayout) { scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigLayout); } else if(event.event == VarItemListIndexConnection) { - bad_kb_script_close(bad_kb->bad_kb_script); - bad_kb_connection_deinit(bad_kb->bt, true); - bad_kb->bad_kb_script = - bad_kb_script_open(bad_kb->file_path, bad_kb->is_bt ? bad_kb->bt : NULL); - bad_kb_script_set_keyboard_layout(bad_kb->bad_kb_script, bad_kb->keyboard_layout); - scene_manager_previous_scene(bad_kb->scene_manager); - if(bad_kb->is_bt) { - scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigBt); - } else { - scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigUsb); - } - // } else { - // furi_crash("Unknown key type"); + bad_kb_config_switch_mode(bad_kb); } } diff --git a/applications/main/bad_kb/scenes/bad_kb_scene_file_select.c b/applications/main/bad_kb/scenes/bad_kb_scene_file_select.c index bb2ddf6ca..ba238f390 100644 --- a/applications/main/bad_kb/scenes/bad_kb_scene_file_select.c +++ b/applications/main/bad_kb/scenes/bad_kb_scene_file_select.c @@ -22,7 +22,6 @@ static bool bad_kb_file_select(BadKbApp* bad_kb) { void bad_kb_scene_file_select_on_enter(void* context) { BadKbApp* bad_kb = context; - furi_hal_usb_disable(); if(bad_kb->bad_kb_script) { bad_kb_script_close(bad_kb->bad_kb_script); bad_kb->bad_kb_script = NULL; @@ -35,7 +34,6 @@ void bad_kb_scene_file_select_on_enter(void* context) { scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneWork); } else { - furi_hal_usb_enable(); view_dispatcher_stop(bad_kb->view_dispatcher); } } From 03f889962bc6fec3ed19ef558ef65e9683f6fd86 Mon Sep 17 00:00:00 2001 From: Eric Betts Date: Sat, 25 Feb 2023 23:59:50 -0800 Subject: [PATCH 370/506] Picopass: factory key support, app rename and move to NFC category, minor code cleanup (#2417) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * message on successful card write * auth using factory key * auth using factory default * factory default screen * write standard iclass key * pass block explicitly * Fix array indexing, add empty detection * PicoPass: rename app and move to NFC group, minor code cleanup Co-authored-by: あく --- applications/plugins/picopass/application.fam | 4 +- applications/plugins/picopass/picopass.c | 10 ++ .../plugins/picopass/picopass_device.c | 2 +- .../plugins/picopass/picopass_device.h | 1 + applications/plugins/picopass/picopass_i.h | 12 ++ .../plugins/picopass/picopass_worker.c | 165 +++++++++++++++++- .../plugins/picopass/picopass_worker.h | 1 + .../plugins/picopass/picopass_worker_i.h | 1 + .../picopass/scenes/picopass_scene_config.h | 2 + .../scenes/picopass_scene_read_card.c | 11 +- .../scenes/picopass_scene_read_card_success.c | 41 +++-- .../picopass_scene_read_factory_success.c | 78 +++++++++ .../picopass_scene_write_card_success.c | 13 ++ .../scenes/picopass_scene_write_key.c | 53 ++++++ 14 files changed, 367 insertions(+), 27 deletions(-) create mode 100644 applications/plugins/picopass/scenes/picopass_scene_read_factory_success.c create mode 100644 applications/plugins/picopass/scenes/picopass_scene_write_key.c diff --git a/applications/plugins/picopass/application.fam b/applications/plugins/picopass/application.fam index f2da6a9fa..c5087b804 100644 --- a/applications/plugins/picopass/application.fam +++ b/applications/plugins/picopass/application.fam @@ -1,6 +1,6 @@ App( appid="picopass", - name="PicoPass Reader", + name="PicoPass", apptype=FlipperAppType.EXTERNAL, targets=["f7"], entry_point="picopass_app", @@ -11,7 +11,7 @@ App( stack_size=4 * 1024, order=30, fap_icon="125_10px.png", - fap_category="Tools", + fap_category="NFC", fap_libs=["mbedtls"], fap_private_libs=[ Lib( diff --git a/applications/plugins/picopass/picopass.c b/applications/plugins/picopass/picopass.c index 217f963d3..96ea82c3d 100644 --- a/applications/plugins/picopass/picopass.c +++ b/applications/plugins/picopass/picopass.c @@ -171,6 +171,16 @@ void picopass_show_loading_popup(void* context, bool show) { } } +bool picopass_is_memset(const uint8_t* data, const uint8_t pattern, size_t size) { + bool result = size > 0; + while(size > 0) { + result &= (*data == pattern); + data++; + size--; + } + return result; +} + int32_t picopass_app(void* p) { UNUSED(p); Picopass* picopass = picopass_alloc(); diff --git a/applications/plugins/picopass/picopass_device.c b/applications/plugins/picopass/picopass_device.c index fd8ddbfbd..e3940698c 100644 --- a/applications/plugins/picopass/picopass_device.c +++ b/applications/plugins/picopass/picopass_device.c @@ -368,7 +368,7 @@ ReturnCode picopass_device_parse_wiegand(uint8_t* data, PicopassWiegandRecord* r record->CardNumber = (bot >> 1) & 0xFFFF; record->FacilityCode = (bot >> 17) & 0xFF; - FURI_LOG_D(TAG, "FC:%u CN: %u\n", record->FacilityCode, record->CardNumber); + FURI_LOG_D(TAG, "FC: %u CN: %u", record->FacilityCode, record->CardNumber); record->valid = true; } else { record->CardNumber = 0; diff --git a/applications/plugins/picopass/picopass_device.h b/applications/plugins/picopass/picopass_device.h index 150b095a7..99f1ceea6 100644 --- a/applications/plugins/picopass/picopass_device.h +++ b/applications/plugins/picopass/picopass_device.h @@ -22,6 +22,7 @@ #define PICOPASS_KD_BLOCK_INDEX 3 #define PICOPASS_KC_BLOCK_INDEX 4 #define PICOPASS_AIA_BLOCK_INDEX 5 +#define PICOPASS_PACS_CFG_BLOCK_INDEX 6 #define PICOPASS_APP_FOLDER ANY_PATH("picopass") #define PICOPASS_APP_EXTENSION ".picopass" diff --git a/applications/plugins/picopass/picopass_i.h b/applications/plugins/picopass/picopass_i.h index 469a672b7..54533e823 100644 --- a/applications/plugins/picopass/picopass_i.h +++ b/applications/plugins/picopass/picopass_i.h @@ -81,3 +81,15 @@ void picopass_blink_start(Picopass* picopass); void picopass_blink_stop(Picopass* picopass); void picopass_show_loading_popup(void* context, bool show); + +/** Check if memory is set to pattern + * + * @warning zero size will return false + * + * @param[in] data Pointer to the byte array + * @param[in] pattern The pattern + * @param[in] size The byte array size + * + * @return True if memory is set to pattern, false otherwise + */ +bool picopass_is_memset(const uint8_t* data, const uint8_t pattern, size_t size); diff --git a/applications/plugins/picopass/picopass_worker.c b/applications/plugins/picopass/picopass_worker.c index 1ee814aa5..6d904478c 100644 --- a/applications/plugins/picopass/picopass_worker.c +++ b/applications/plugins/picopass/picopass_worker.c @@ -5,7 +5,8 @@ #define TAG "PicopassWorker" const uint8_t picopass_iclass_key[] = {0xaf, 0xa7, 0x85, 0xa7, 0xda, 0xb3, 0x33, 0x78}; -const uint8_t picopass_factory_key[] = {0x76, 0x65, 0x54, 0x43, 0x32, 0x21, 0x10, 0x00}; +const uint8_t picopass_factory_credit_key[] = {0x76, 0x65, 0x54, 0x43, 0x32, 0x21, 0x10, 0x00}; +const uint8_t picopass_factory_debit_key[] = {0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87}; static void picopass_worker_enable_field() { furi_hal_nfc_ll_txrx_on(); @@ -197,6 +198,28 @@ static ReturnCode picopass_auth_standard(uint8_t* csn, uint8_t* div_key) { return rfalPicoPassPollerCheck(mac, &chkRes); } +static ReturnCode picopass_auth_factory(uint8_t* csn, uint8_t* div_key) { + rfalPicoPassReadCheckRes rcRes; + rfalPicoPassCheckRes chkRes; + + ReturnCode err; + + uint8_t mac[4] = {0}; + uint8_t ccnr[12] = {0}; + + err = rfalPicoPassPollerReadCheck(&rcRes); + if(err != ERR_NONE) { + FURI_LOG_E(TAG, "rfalPicoPassPollerReadCheck error %d", err); + return err; + } + memcpy(ccnr, rcRes.CCNR, sizeof(rcRes.CCNR)); // last 4 bytes left 0 + + loclass_diversifyKey(csn, picopass_factory_debit_key, div_key); + loclass_opt_doReaderMAC(ccnr, div_key, mac); + + return rfalPicoPassPollerCheck(mac, &chkRes); +} + static ReturnCode picopass_auth_dict( uint8_t* csn, PicopassPacs* pacs, @@ -264,14 +287,23 @@ static ReturnCode picopass_auth_dict( ReturnCode picopass_auth(PicopassBlock* AA1, PicopassPacs* pacs) { ReturnCode err; - FURI_LOG_E(TAG, "Trying standard legacy key"); + FURI_LOG_I(TAG, "Trying standard legacy key"); err = picopass_auth_standard( AA1[PICOPASS_CSN_BLOCK_INDEX].data, AA1[PICOPASS_KD_BLOCK_INDEX].data); if(err == ERR_NONE) { + memcpy(pacs->key, picopass_iclass_key, PICOPASS_BLOCK_LEN); return ERR_NONE; } - FURI_LOG_E(TAG, "Starting user dictionary attack"); + FURI_LOG_I(TAG, "Trying factory default key"); + err = picopass_auth_factory( + AA1[PICOPASS_CSN_BLOCK_INDEX].data, AA1[PICOPASS_KD_BLOCK_INDEX].data); + if(err == ERR_NONE) { + memcpy(pacs->key, picopass_factory_debit_key, PICOPASS_BLOCK_LEN); + return ERR_NONE; + } + + FURI_LOG_I(TAG, "Starting user dictionary attack"); err = picopass_auth_dict( AA1[PICOPASS_CSN_BLOCK_INDEX].data, pacs, @@ -281,7 +313,7 @@ ReturnCode picopass_auth(PicopassBlock* AA1, PicopassPacs* pacs) { return ERR_NONE; } - FURI_LOG_E(TAG, "Starting in-built dictionary attack"); + FURI_LOG_I(TAG, "Starting system dictionary attack"); err = picopass_auth_dict( AA1[PICOPASS_CSN_BLOCK_INDEX].data, pacs, @@ -406,6 +438,84 @@ ReturnCode picopass_write_card(PicopassBlock* AA1) { return ERR_NONE; } +ReturnCode picopass_write_block(PicopassPacs* pacs, uint8_t blockNo, uint8_t* newBlock) { + rfalPicoPassIdentifyRes idRes; + rfalPicoPassSelectRes selRes; + rfalPicoPassReadCheckRes rcRes; + rfalPicoPassCheckRes chkRes; + + ReturnCode err; + + uint8_t div_key[8] = {0}; + uint8_t mac[4] = {0}; + uint8_t ccnr[12] = {0}; + + err = rfalPicoPassPollerIdentify(&idRes); + if(err != ERR_NONE) { + FURI_LOG_E(TAG, "rfalPicoPassPollerIdentify error %d", err); + return err; + } + + err = rfalPicoPassPollerSelect(idRes.CSN, &selRes); + if(err != ERR_NONE) { + FURI_LOG_E(TAG, "rfalPicoPassPollerSelect error %d", err); + return err; + } + + err = rfalPicoPassPollerReadCheck(&rcRes); + if(err != ERR_NONE) { + FURI_LOG_E(TAG, "rfalPicoPassPollerReadCheck error %d", err); + return err; + } + memcpy(ccnr, rcRes.CCNR, sizeof(rcRes.CCNR)); // last 4 bytes left 0 + + loclass_diversifyKey(selRes.CSN, pacs->key, div_key); + loclass_opt_doReaderMAC(ccnr, div_key, mac); + + err = rfalPicoPassPollerCheck(mac, &chkRes); + if(err != ERR_NONE) { + FURI_LOG_E(TAG, "rfalPicoPassPollerCheck error %d", err); + return err; + } + + FURI_LOG_D(TAG, "rfalPicoPassPollerWriteBlock %d", blockNo); + uint8_t data[9] = { + blockNo, + newBlock[0], + newBlock[1], + newBlock[2], + newBlock[3], + newBlock[4], + newBlock[5], + newBlock[6], + newBlock[7]}; + loclass_doMAC_N(data, sizeof(data), div_key, mac); + FURI_LOG_D( + TAG, + "loclass_doMAC_N %d %02x%02x%02x%02x%02x%02x%02x%02x %02x%02x%02x%02x", + blockNo, + data[1], + data[2], + data[3], + data[4], + data[5], + data[6], + data[7], + data[8], + mac[0], + mac[1], + mac[2], + mac[3]); + + err = rfalPicoPassPollerWriteBlock(data[0], data + 1, mac); + if(err != ERR_NONE) { + FURI_LOG_E(TAG, "rfalPicoPassPollerWriteBlock error %d", err); + return err; + } + + return ERR_NONE; +} + int32_t picopass_worker_task(void* context) { PicopassWorker* picopass_worker = context; @@ -414,6 +524,8 @@ int32_t picopass_worker_task(void* context) { picopass_worker_detect(picopass_worker); } else if(picopass_worker->state == PicopassWorkerStateWrite) { picopass_worker_write(picopass_worker); + } else if(picopass_worker->state == PicopassWorkerStateWriteStandardKey) { + picopass_worker_write_standard_key(picopass_worker); } picopass_worker_disable_field(ERR_NONE); @@ -448,7 +560,7 @@ void picopass_worker_detect(PicopassWorker* picopass_worker) { } // Thank you proxmark! - pacs->legacy = (memcmp(AA1[5].data, "\xff\xff\xff\xff\xff\xff\xff\xff", 8) == 0); + pacs->legacy = picopass_is_memset(AA1[5].data, 0xFF, 8); pacs->se_enabled = (memcmp(AA1[5].data, "\xff\xff\xff\x00\x06\xff\xff\xff", 8) == 0); if(pacs->se_enabled) { FURI_LOG_D(TAG, "SE enabled"); @@ -520,3 +632,46 @@ void picopass_worker_write(PicopassWorker* picopass_worker) { furi_delay_ms(100); } } + +void picopass_worker_write_standard_key(PicopassWorker* picopass_worker) { + PicopassDeviceData* dev_data = picopass_worker->dev_data; + PicopassBlock* AA1 = dev_data->AA1; + PicopassPacs* pacs = &dev_data->pacs; + ReturnCode err; + PicopassWorkerEvent nextState = PicopassWorkerEventSuccess; + + uint8_t* csn = AA1[PICOPASS_CSN_BLOCK_INDEX].data; + uint8_t* configBlock = AA1[PICOPASS_CONFIG_BLOCK_INDEX].data; + uint8_t fuses = configBlock[7]; + uint8_t* oldKey = AA1[PICOPASS_KD_BLOCK_INDEX].data; + + uint8_t newKey[PICOPASS_BLOCK_LEN] = {0}; + loclass_diversifyKey(csn, picopass_iclass_key, newKey); + + if((fuses & 0x80) == 0x80) { + FURI_LOG_D(TAG, "Plain write for personalized mode key change"); + } else { + FURI_LOG_D(TAG, "XOR write for application mode key change"); + // XOR when in application mode + for(size_t i = 0; i < PICOPASS_BLOCK_LEN; i++) { + newKey[i] ^= oldKey[i]; + } + } + + while(picopass_worker->state == PicopassWorkerStateWriteStandardKey) { + if(picopass_detect_card(1000) == ERR_NONE) { + err = picopass_write_block(pacs, PICOPASS_KD_BLOCK_INDEX, newKey); + if(err != ERR_NONE) { + FURI_LOG_E(TAG, "picopass_write_block error %d", err); + nextState = PicopassWorkerEventFail; + } + + // Notify caller and exit + if(picopass_worker->callback) { + picopass_worker->callback(nextState, picopass_worker->context); + } + break; + } + furi_delay_ms(100); + } +} diff --git a/applications/plugins/picopass/picopass_worker.h b/applications/plugins/picopass/picopass_worker.h index 29a890a18..775212c66 100644 --- a/applications/plugins/picopass/picopass_worker.h +++ b/applications/plugins/picopass/picopass_worker.h @@ -12,6 +12,7 @@ typedef enum { // Main worker states PicopassWorkerStateDetect, PicopassWorkerStateWrite, + PicopassWorkerStateWriteStandardKey, // Transition PicopassWorkerStateStop, } PicopassWorkerState; diff --git a/applications/plugins/picopass/picopass_worker_i.h b/applications/plugins/picopass/picopass_worker_i.h index ded40e6c6..cf55fbdf5 100644 --- a/applications/plugins/picopass/picopass_worker_i.h +++ b/applications/plugins/picopass/picopass_worker_i.h @@ -31,3 +31,4 @@ int32_t picopass_worker_task(void* context); void picopass_worker_detect(PicopassWorker* picopass_worker); void picopass_worker_write(PicopassWorker* picopass_worker); +void picopass_worker_write_standard_key(PicopassWorker* picopass_worker); diff --git a/applications/plugins/picopass/scenes/picopass_scene_config.h b/applications/plugins/picopass/scenes/picopass_scene_config.h index 27d6bbcd7..95700787f 100644 --- a/applications/plugins/picopass/scenes/picopass_scene_config.h +++ b/applications/plugins/picopass/scenes/picopass_scene_config.h @@ -11,3 +11,5 @@ ADD_SCENE(picopass, delete, Delete) ADD_SCENE(picopass, delete_success, DeleteSuccess) ADD_SCENE(picopass, write_card, WriteCard) ADD_SCENE(picopass, write_card_success, WriteCardSuccess) +ADD_SCENE(picopass, read_factory_success, ReadFactorySuccess) +ADD_SCENE(picopass, write_key, WriteKey) diff --git a/applications/plugins/picopass/scenes/picopass_scene_read_card.c b/applications/plugins/picopass/scenes/picopass_scene_read_card.c index 8188207a2..90422a2e7 100644 --- a/applications/plugins/picopass/scenes/picopass_scene_read_card.c +++ b/applications/plugins/picopass/scenes/picopass_scene_read_card.c @@ -1,6 +1,8 @@ #include "../picopass_i.h" #include +const uint8_t picopass_factory_key_check[] = {0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87}; + void picopass_read_card_worker_callback(PicopassWorkerEvent event, void* context) { UNUSED(event); Picopass* picopass = context; @@ -34,7 +36,14 @@ bool picopass_scene_read_card_on_event(void* context, SceneManagerEvent event) { if(event.type == SceneManagerEventTypeCustom) { if(event.event == PicopassCustomEventWorkerExit) { - scene_manager_next_scene(picopass->scene_manager, PicopassSceneReadCardSuccess); + if(memcmp( + picopass->dev->dev_data.pacs.key, + picopass_factory_key_check, + PICOPASS_BLOCK_LEN) == 0) { + scene_manager_next_scene(picopass->scene_manager, PicopassSceneReadFactorySuccess); + } else { + scene_manager_next_scene(picopass->scene_manager, PicopassSceneReadCardSuccess); + } consumed = true; } } diff --git a/applications/plugins/picopass/scenes/picopass_scene_read_card_success.c b/applications/plugins/picopass/scenes/picopass_scene_read_card_success.c index d89a5d89b..f078d460a 100644 --- a/applications/plugins/picopass/scenes/picopass_scene_read_card_success.c +++ b/applications/plugins/picopass/scenes/picopass_scene_read_card_success.c @@ -15,6 +15,7 @@ void picopass_scene_read_card_success_widget_callback( void picopass_scene_read_card_success_on_enter(void* context) { Picopass* picopass = context; + FuriString* csn_str = furi_string_alloc_set("CSN:"); FuriString* credential_str = furi_string_alloc(); FuriString* wiegand_str = furi_string_alloc(); @@ -30,27 +31,31 @@ void picopass_scene_read_card_success_on_enter(void* context) { PicopassPacs* pacs = &picopass->dev->dev_data.pacs; Widget* widget = picopass->widget; - uint8_t csn[PICOPASS_BLOCK_LEN]; - memcpy(csn, &AA1->data[PICOPASS_CSN_BLOCK_INDEX], PICOPASS_BLOCK_LEN); + uint8_t csn[PICOPASS_BLOCK_LEN] = {0}; + memcpy(csn, AA1[PICOPASS_CSN_BLOCK_INDEX].data, PICOPASS_BLOCK_LEN); for(uint8_t i = 0; i < PICOPASS_BLOCK_LEN; i++) { furi_string_cat_printf(csn_str, "%02X ", csn[i]); } - // Neither of these are valid. Indicates the block was all 0x00 or all 0xff - if(pacs->record.bitLength == 0 || pacs->record.bitLength == 255) { + bool no_key = picopass_is_memset(pacs->key, 0x00, PICOPASS_BLOCK_LEN); + bool empty = + picopass_is_memset(AA1[PICOPASS_PACS_CFG_BLOCK_INDEX].data, 0xFF, PICOPASS_BLOCK_LEN); + + if(no_key) { furi_string_cat_printf(wiegand_str, "Read Failed"); if(pacs->se_enabled) { furi_string_cat_printf(credential_str, "SE enabled"); } + } else if(empty) { + furi_string_cat_printf(wiegand_str, "Empty"); + } else if(pacs->record.bitLength == 0 || pacs->record.bitLength == 255) { + // Neither of these are valid. Indicates the block was all 0x00 or all 0xff + furi_string_cat_printf(wiegand_str, "Invalid PACS"); - widget_add_button_element( - widget, - GuiButtonTypeLeft, - "Retry", - picopass_scene_read_card_success_widget_callback, - picopass); - + if(pacs->se_enabled) { + furi_string_cat_printf(credential_str, "SE enabled"); + } } else { size_t bytesLength = 1 + pacs->record.bitLength / 8; furi_string_set(credential_str, ""); @@ -82,13 +87,6 @@ void picopass_scene_read_card_success_on_enter(void* context) { } } - widget_add_button_element( - widget, - GuiButtonTypeLeft, - "Retry", - picopass_scene_read_card_success_widget_callback, - picopass); - widget_add_button_element( widget, GuiButtonTypeRight, @@ -97,6 +95,13 @@ void picopass_scene_read_card_success_on_enter(void* context) { picopass); } + widget_add_button_element( + widget, + GuiButtonTypeLeft, + "Retry", + picopass_scene_read_card_success_widget_callback, + picopass); + widget_add_string_element( widget, 64, 5, AlignCenter, AlignCenter, FontSecondary, furi_string_get_cstr(csn_str)); widget_add_string_element( diff --git a/applications/plugins/picopass/scenes/picopass_scene_read_factory_success.c b/applications/plugins/picopass/scenes/picopass_scene_read_factory_success.c new file mode 100644 index 000000000..8e32d21f7 --- /dev/null +++ b/applications/plugins/picopass/scenes/picopass_scene_read_factory_success.c @@ -0,0 +1,78 @@ +#include "../picopass_i.h" +#include + +void picopass_scene_read_factory_success_widget_callback( + GuiButtonType result, + InputType type, + void* context) { + furi_assert(context); + Picopass* picopass = context; + + if(type == InputTypeShort) { + view_dispatcher_send_custom_event(picopass->view_dispatcher, result); + } +} + +void picopass_scene_read_factory_success_on_enter(void* context) { + Picopass* picopass = context; + FuriString* title = furi_string_alloc_set("Factory Default"); + FuriString* subtitle = furi_string_alloc_set(""); + + DOLPHIN_DEED(DolphinDeedNfcReadSuccess); + + // Send notification + notification_message(picopass->notifications, &sequence_success); + + // Setup view + Widget* widget = picopass->widget; + //PicopassPacs* pacs = &picopass->dev->dev_data.pacs; + PicopassBlock* AA1 = picopass->dev->dev_data.AA1; + + uint8_t* configBlock = AA1[PICOPASS_CONFIG_BLOCK_INDEX].data; + uint8_t fuses = configBlock[7]; + + if((fuses & 0x80) == 0x80) { + furi_string_cat_printf(subtitle, "Personalization mode"); + } else { + furi_string_cat_printf(subtitle, "Application mode"); + } + + widget_add_button_element( + widget, + GuiButtonTypeCenter, + "Write Standard iClass Key", + picopass_scene_read_factory_success_widget_callback, + picopass); + + widget_add_string_element( + widget, 64, 5, AlignCenter, AlignCenter, FontSecondary, furi_string_get_cstr(title)); + widget_add_string_element( + widget, 64, 20, AlignCenter, AlignCenter, FontPrimary, furi_string_get_cstr(subtitle)); + + furi_string_free(title); + furi_string_free(subtitle); + + view_dispatcher_switch_to_view(picopass->view_dispatcher, PicopassViewWidget); +} + +bool picopass_scene_read_factory_success_on_event(void* context, SceneManagerEvent event) { + Picopass* picopass = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + if(event.event == GuiButtonTypeLeft) { + consumed = scene_manager_previous_scene(picopass->scene_manager); + } else if(event.event == GuiButtonTypeCenter) { + scene_manager_next_scene(picopass->scene_manager, PicopassSceneWriteKey); + consumed = true; + } + } + return consumed; +} + +void picopass_scene_read_factory_success_on_exit(void* context) { + Picopass* picopass = context; + + // Clear view + widget_reset(picopass->widget); +} diff --git a/applications/plugins/picopass/scenes/picopass_scene_write_card_success.c b/applications/plugins/picopass/scenes/picopass_scene_write_card_success.c index 108e7d1ce..4bbca816a 100644 --- a/applications/plugins/picopass/scenes/picopass_scene_write_card_success.c +++ b/applications/plugins/picopass/scenes/picopass_scene_write_card_success.c @@ -16,6 +16,7 @@ void picopass_scene_write_card_success_widget_callback( void picopass_scene_write_card_success_on_enter(void* context) { Picopass* picopass = context; Widget* widget = picopass->widget; + FuriString* str = furi_string_alloc_set("Write Success!"); DOLPHIN_DEED(DolphinDeedNfcReadSuccess); @@ -29,6 +30,18 @@ void picopass_scene_write_card_success_on_enter(void* context) { picopass_scene_write_card_success_widget_callback, picopass); + widget_add_button_element( + widget, + GuiButtonTypeRight, + "Menu", + picopass_scene_write_card_success_widget_callback, + picopass); + + widget_add_string_element( + widget, 64, 5, AlignCenter, AlignCenter, FontSecondary, furi_string_get_cstr(str)); + + furi_string_free(str); + view_dispatcher_switch_to_view(picopass->view_dispatcher, PicopassViewWidget); } diff --git a/applications/plugins/picopass/scenes/picopass_scene_write_key.c b/applications/plugins/picopass/scenes/picopass_scene_write_key.c new file mode 100644 index 000000000..83d594ca2 --- /dev/null +++ b/applications/plugins/picopass/scenes/picopass_scene_write_key.c @@ -0,0 +1,53 @@ +#include "../picopass_i.h" +#include + +void picopass_write_key_worker_callback(PicopassWorkerEvent event, void* context) { + UNUSED(event); + Picopass* picopass = context; + view_dispatcher_send_custom_event(picopass->view_dispatcher, PicopassCustomEventWorkerExit); +} + +void picopass_scene_write_key_on_enter(void* context) { + Picopass* picopass = context; + DOLPHIN_DEED(DolphinDeedNfcSave); + + // Setup view + Popup* popup = picopass->popup; + popup_set_header(popup, "Writing\niClass\nkey", 68, 30, AlignLeft, AlignTop); + popup_set_icon(popup, 0, 3, &I_RFIDDolphinSend_97x61); + + // Start worker + view_dispatcher_switch_to_view(picopass->view_dispatcher, PicopassViewPopup); + picopass_worker_start( + picopass->worker, + PicopassWorkerStateWriteStandardKey, + &picopass->dev->dev_data, + picopass_write_key_worker_callback, + picopass); + + picopass_blink_start(picopass); +} + +bool picopass_scene_write_key_on_event(void* context, SceneManagerEvent event) { + Picopass* picopass = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + if(event.event == PicopassCustomEventWorkerExit) { + scene_manager_next_scene(picopass->scene_manager, PicopassSceneWriteCardSuccess); + consumed = true; + } + } + return consumed; +} + +void picopass_scene_write_key_on_exit(void* context) { + Picopass* picopass = context; + + // Stop worker + picopass_worker_stop(picopass->worker); + // Clear view + popup_reset(picopass->popup); + + picopass_blink_stop(picopass); +} From 12c1ec37a20a2b4f3a4ed5359bb708fcab79ca6c Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sun, 26 Feb 2023 11:08:05 +0300 Subject: [PATCH 371/506] Fix PVS warnings (#2430) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: あく --- applications/main/bad_usb/bad_usb_script.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/applications/main/bad_usb/bad_usb_script.c b/applications/main/bad_usb/bad_usb_script.c index d66ce8a91..beb35b894 100644 --- a/applications/main/bad_usb/bad_usb_script.c +++ b/applications/main/bad_usb/bad_usb_script.c @@ -511,7 +511,7 @@ static uint32_t bad_usb_flags_get(uint32_t flags_mask, uint32_t timeout) { furi_check((flags & FuriFlagError) == 0); if(flags == 0) { flags = furi_thread_flags_wait(flags_mask, FuriFlagWaitAny, timeout); - furi_check(((flags & FuriFlagError) == 0) || (flags == FuriFlagErrorTimeout)); + furi_check(((flags & FuriFlagError) == 0) || (flags == (unsigned)FuriFlagErrorTimeout)); } else { uint32_t state = furi_thread_flags_clear(flags); furi_check((state & FuriFlagError) == 0); @@ -610,7 +610,7 @@ static int32_t bad_usb_worker(void* context) { WorkerEvtEnd | WorkerEvtDisconnect | WorkerEvtToggle, FuriFlagWaitAny | FuriFlagNoClear, 1500); - if(flags == FuriFlagErrorTimeout) { + if(flags == (unsigned)FuriFlagErrorTimeout) { // If nothing happened - start script execution worker_state = BadUsbStateRunning; } else if(flags & WorkerEvtToggle) { From 33dd256dfbdab13e26a56147edcdbdfb4d2514b0 Mon Sep 17 00:00:00 2001 From: matthisc Date: Sun, 26 Feb 2023 10:10:00 +0100 Subject: [PATCH 372/506] Correcting bug on DEL and DELETE key --- applications/plugins/mousejacker/mousejacker_ducky.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/plugins/mousejacker/mousejacker_ducky.c b/applications/plugins/mousejacker/mousejacker_ducky.c index b3b04d836..b57330c0d 100644 --- a/applications/plugins/mousejacker/mousejacker_ducky.c +++ b/applications/plugins/mousejacker/mousejacker_ducky.c @@ -89,7 +89,7 @@ static uint32_t mj_ducky_get_command_len(const char* line) { static bool mj_get_ducky_key(char* key, size_t keylen, MJDuckyKey* dk) { //FURI_LOG_D(TAG, "looking up key %s with length %d", key, keylen); for(uint i = 0; i < sizeof(mj_ducky_keys) / sizeof(MJDuckyKey); i++) { - if(!strncmp(mj_ducky_keys[i].name, key, keylen)) { + if(strncmp(mj_ducky_keys[i].name, key, keylen) == 0) { memcpy(dk, &mj_ducky_keys[i], sizeof(MJDuckyKey)); return true; } From 2bb76e09c6255f8ae3581e5816aa33173f4545d3 Mon Sep 17 00:00:00 2001 From: matthisc Date: Sun, 26 Feb 2023 10:14:14 +0100 Subject: [PATCH 373/506] Adding TAB command --- applications/plugins/mousejacker/mousejacker_ducky.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/applications/plugins/mousejacker/mousejacker_ducky.c b/applications/plugins/mousejacker/mousejacker_ducky.c index b57330c0d..3a6cc3f46 100644 --- a/applications/plugins/mousejacker/mousejacker_ducky.c +++ b/applications/plugins/mousejacker/mousejacker_ducky.c @@ -344,7 +344,11 @@ static bool mj_process_ducky_line( if(!mj_get_ducky_key("SPACE", 5, &dk)) return false; send_hid_packet(handle, addr, addr_size, rate, dk.mod, dk.hid, plugin_state); return true; - } + } else if(strncmp(line_tmp, "TAB", strlen("TAB")) == 0) { + if(!mj_get_ducky_key("TAB", 3, &dk)) return false; + send_hid_packet(handle, addr, addr_size, rate, dk.mod, dk.hid, plugin_state); + return true; + } return false; } From 958797062dc88fcead7dd0fcd7503e466da54879 Mon Sep 17 00:00:00 2001 From: matthisc Date: Sun, 26 Feb 2023 10:23:33 +0100 Subject: [PATCH 374/506] Improving logic of mod keys when releasing a key --- .../plugins/mousejacker/mousejacker_ducky.c | 77 +++++++++++++++---- 1 file changed, 60 insertions(+), 17 deletions(-) diff --git a/applications/plugins/mousejacker/mousejacker_ducky.c b/applications/plugins/mousejacker/mousejacker_ducky.c index 3a6cc3f46..b30bc6e4a 100644 --- a/applications/plugins/mousejacker/mousejacker_ducky.c +++ b/applications/plugins/mousejacker/mousejacker_ducky.c @@ -11,6 +11,10 @@ static uint8_t LOGITECH_HELLO[] = {0x00, 0x4F, 0x00, 0x04, 0xB0, 0x10, 0x00, 0x0 static uint8_t LOGITECH_KEEPALIVE[] = {0x00, 0x40, 0x00, 0x55, 0x6B}; uint8_t prev_hid = 0; +static bool holding_ctrl = false; +static bool holding_shift = false; +static bool holding_alt = false; +static bool holding_gui = false; #define RT_THRESHOLD 50 #define LOGITECH_MIN_CHANNEL 2 @@ -152,6 +156,33 @@ static void build_hid_packet(uint8_t mod, uint8_t hid, uint8_t* payload) { checksum(payload, LOGITECH_HID_TEMPLATE_SIZE); } +static void release_key( + FuriHalSpiBusHandle* handle, + uint8_t* addr, + uint8_t addr_size, + uint8_t rate, + PluginState* plugin_state +) { + // This function release keys currently pressed, but keep pressing special keys + // if holding mod keys variable are set to true + + uint8_t hid_payload[LOGITECH_HID_TEMPLATE_SIZE] = {0}; + build_hid_packet( + 0 | holding_ctrl + | holding_shift << 1 + | holding_alt << 2 + | holding_gui << 3, + 0, hid_payload); + inject_packet( + handle, + addr, + addr_size, + rate, + hid_payload, + LOGITECH_HID_TEMPLATE_SIZE, + plugin_state); // empty hid packet +} + static void send_hid_packet( FuriHalSpiBusHandle* handle, uint8_t* addr, @@ -161,19 +192,15 @@ static void send_hid_packet( uint8_t hid, PluginState* plugin_state) { uint8_t hid_payload[LOGITECH_HID_TEMPLATE_SIZE] = {0}; - build_hid_packet(0, 0, hid_payload); - if(hid == prev_hid) - inject_packet( - handle, - addr, - addr_size, - rate, - hid_payload, - LOGITECH_HID_TEMPLATE_SIZE, - plugin_state); // empty hid packet + if(hid == prev_hid ) + release_key(handle, addr, addr_size, rate, plugin_state); prev_hid = hid; - build_hid_packet(mod, hid, hid_payload); + build_hid_packet(mod + | holding_ctrl + | holding_shift << 1 + | holding_alt << 2 + | holding_gui << 3, hid, hid_payload); inject_packet( handle, addr, addr_size, rate, hid_payload, LOGITECH_HID_TEMPLATE_SIZE, plugin_state); furi_delay_ms(12); @@ -269,7 +296,9 @@ static bool mj_process_ducky_line( } else if(strncmp(line_tmp, "ALT", strlen("ALT")) == 0) { line_tmp = &line_tmp[mj_ducky_get_command_len(line_tmp) + 1]; if(!mj_get_ducky_key(line_tmp, strlen(line_tmp), &dk)) return false; - send_hid_packet(handle, addr, addr_size, rate, dk.mod | 4, dk.hid, plugin_state); + holding_alt = true; + send_hid_packet(handle, addr, addr_size, rate, dk.mod, dk.hid, plugin_state); + holding_alt = false; return true; } else if( strncmp(line_tmp, "GUI", strlen("GUI")) == 0 || @@ -277,33 +306,47 @@ static bool mj_process_ducky_line( strncmp(line_tmp, "COMMAND", strlen("COMMAND")) == 0) { line_tmp = &line_tmp[mj_ducky_get_command_len(line_tmp) + 1]; if(!mj_get_ducky_key(line_tmp, strlen(line_tmp), &dk)) return false; - send_hid_packet(handle, addr, addr_size, rate, dk.mod | 8, dk.hid, plugin_state); + holding_gui = true; + send_hid_packet(handle, addr, addr_size, rate, dk.mod, dk.hid, plugin_state); + holding_gui = false; return true; } else if( strncmp(line_tmp, "CTRL-ALT", strlen("CTRL-ALT")) == 0 || strncmp(line_tmp, "CONTROL-ALT", strlen("CONTROL-ALT")) == 0) { line_tmp = &line_tmp[mj_ducky_get_command_len(line_tmp) + 1]; if(!mj_get_ducky_key(line_tmp, strlen(line_tmp), &dk)) return false; - send_hid_packet(handle, addr, addr_size, rate, dk.mod | 4 | 1, dk.hid, plugin_state); + holding_ctrl = true; + holding_alt = true; + send_hid_packet(handle, addr, addr_size, rate, dk.mod, dk.hid, plugin_state); + holding_ctrl = false; + holding_alt = false; return true; } else if( strncmp(line_tmp, "CTRL-SHIFT", strlen("CTRL-SHIFT")) == 0 || strncmp(line_tmp, "CONTROL-SHIFT", strlen("CONTROL-SHIFT")) == 0) { line_tmp = &line_tmp[mj_ducky_get_command_len(line_tmp) + 1]; if(!mj_get_ducky_key(line_tmp, strlen(line_tmp), &dk)) return false; - send_hid_packet(handle, addr, addr_size, rate, dk.mod | 1 | 2, dk.hid, plugin_state); + holding_ctrl = true; + holding_shift = true; + send_hid_packet(handle, addr, addr_size, rate, dk.mod, dk.hid, plugin_state); + holding_ctrl = false; + holding_shift = false; return true; } else if( strncmp(line_tmp, "CTRL", strlen("CTRL")) == 0 || strncmp(line_tmp, "CONTROL", strlen("CONTROL")) == 0) { line_tmp = &line_tmp[mj_ducky_get_command_len(line_tmp) + 1]; if(!mj_get_ducky_key(line_tmp, strlen(line_tmp), &dk)) return false; - send_hid_packet(handle, addr, addr_size, rate, dk.mod | 1, dk.hid, plugin_state); + holding_ctrl = true; + send_hid_packet(handle, addr, addr_size, rate, dk.mod, dk.hid, plugin_state); + holding_ctrl = false; return true; } else if(strncmp(line_tmp, "SHIFT", strlen("SHIFT")) == 0) { line_tmp = &line_tmp[mj_ducky_get_command_len(line_tmp) + 1]; if(!mj_get_ducky_key(line_tmp, strlen(line_tmp), &dk)) return false; - send_hid_packet(handle, addr, addr_size, rate, dk.mod | 2, dk.hid, plugin_state); + holding_shift = true; + send_hid_packet(handle, addr, addr_size, rate, dk.mod, dk.hid, plugin_state); + holding_shift = false; return true; } else if( strncmp(line_tmp, "ESC", strlen("ESC")) == 0 || From 16fe62e98db853ca1659ea4d8885ac1b5c55e09c Mon Sep 17 00:00:00 2001 From: matthisc Date: Sun, 26 Feb 2023 10:29:56 +0100 Subject: [PATCH 375/506] Adding ALTSTRING feature for non-qwerty keyboards --- .../plugins/mousejacker/mousejacker_ducky.c | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/applications/plugins/mousejacker/mousejacker_ducky.c b/applications/plugins/mousejacker/mousejacker_ducky.c index b30bc6e4a..79d8bbec5 100644 --- a/applications/plugins/mousejacker/mousejacker_ducky.c +++ b/applications/plugins/mousejacker/mousejacker_ducky.c @@ -3,6 +3,7 @@ static const char ducky_cmd_comment[] = {"REM"}; static const char ducky_cmd_delay[] = {"DELAY "}; static const char ducky_cmd_string[] = {"STRING "}; +static const char ducky_cmd_altstring[] = {"ALTSTRING "}; static const char ducky_cmd_repeat[] = {"REPEAT "}; static uint8_t LOGITECH_HID_TEMPLATE[] = @@ -69,7 +70,10 @@ MJDuckyKey mj_ducky_keys[] = {{" ", 44, 0}, {"!", 30, 2}, {"\"" {"LEFTARROW", 80, 0}, {"RIGHTARROW", 79, 0}, {"PAGEDOWN", 78, 0}, {"PAUSE", 72, 0}, {"SPACE", 44, 0}, {"UPARROW", 82, 0}, {"F11", 68, 0}, {"F7", 64, 0}, {"UP", 82, 0}, - {"LEFT", 80, 0}}; + {"LEFT", 80, 0}, {"NUM 1", 89, 0}, {"NUM 2", 90, 0}, + {"NUM 3", 91, 0}, {"NUM 4", 92, 0}, {"NUM 5", 93, 0}, + {"NUM 6", 94, 0}, {"NUM 7", 95, 0}, {"NUM 8", 96, 0}, + {"NUM 9", 97, 0}, {"NUM 0", 98, 0}}; /* static bool mj_ducky_get_number(const char* param, uint32_t* val) { @@ -278,6 +282,32 @@ static bool mj_process_ducky_line( send_hid_packet(handle, addr, addr_size, rate, dk.mod, dk.hid, plugin_state); } + return true; + } else if(strncmp(line_tmp, ducky_cmd_altstring, strlen(ducky_cmd_altstring)) == 0) { + // ALTSTRING + line_tmp = &line_tmp[mj_ducky_get_command_len(line_tmp) + 1]; + for(size_t i = 0; i < strlen(line_tmp); i++) { + if((line_tmp[i] < ' ') || (line_tmp[i] > '~')) { + continue; // Skip non-printable chars + } + + char alt_code[4]; + // Getting altcode of the char + snprintf(alt_code, 4, "%u", line_tmp[i]); + + uint8_t j = 0; + while(!ducky_end_line(alt_code[j])) { + char pad_num[5] = {'N', 'U', 'M', ' ', alt_code[j]}; + if(!mj_get_ducky_key(pad_num, 5, &dk)) return false; + holding_alt = true; + FURI_LOG_D(TAG, "Sending %s", pad_num); + send_hid_packet(handle, addr, addr_size, rate, dk.mod, dk.hid, plugin_state); + j++; + } + holding_alt = false; + release_key(handle, addr, addr_size, rate, plugin_state); + } + return true; } else if(strncmp(line_tmp, ducky_cmd_repeat, strlen(ducky_cmd_repeat)) == 0) { // REPEAT From 905273e066e49313e2335b41d5d19a2436a929fc Mon Sep 17 00:00:00 2001 From: matthisc Date: Sun, 26 Feb 2023 10:38:40 +0100 Subject: [PATCH 376/506] Adding function to detect end of altcode --- applications/plugins/mousejacker/mousejacker_ducky.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/applications/plugins/mousejacker/mousejacker_ducky.c b/applications/plugins/mousejacker/mousejacker_ducky.c index 79d8bbec5..d5a32c484 100644 --- a/applications/plugins/mousejacker/mousejacker_ducky.c +++ b/applications/plugins/mousejacker/mousejacker_ducky.c @@ -210,6 +210,10 @@ static void send_hid_packet( furi_delay_ms(12); } +static bool ducky_end_line(const char chr) { + return ((chr == ' ') || (chr == '\0') || (chr == '\r') || (chr == '\n')); +} + // returns false if there was an error processing script line static bool mj_process_ducky_line( FuriHalSpiBusHandle* handle, @@ -307,7 +311,7 @@ static bool mj_process_ducky_line( holding_alt = false; release_key(handle, addr, addr_size, rate, plugin_state); } - + return true; } else if(strncmp(line_tmp, ducky_cmd_repeat, strlen(ducky_cmd_repeat)) == 0) { // REPEAT From 9bda3e62eec4d81cc59352431ee468024c5921ed Mon Sep 17 00:00:00 2001 From: Sergey Gavrilov Date: Sun, 26 Feb 2023 14:28:51 +0300 Subject: [PATCH 377/506] SD Cache: moved to diskio layer, invalidation in case of error (#2428) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: あく --- firmware/targets/f7/fatfs/sd_spi_io.c | 38 +------------------------ firmware/targets/f7/fatfs/sd_spi_io.h | 1 + firmware/targets/f7/fatfs/user_diskio.c | 37 ++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 37 deletions(-) diff --git a/firmware/targets/f7/fatfs/sd_spi_io.c b/firmware/targets/f7/fatfs/sd_spi_io.c index 93b837e85..68903acfb 100644 --- a/firmware/targets/f7/fatfs/sd_spi_io.c +++ b/firmware/targets/f7/fatfs/sd_spi_io.c @@ -17,7 +17,6 @@ #define SD_DUMMY_BYTE 0xFF #define SD_ANSWER_RETRY_COUNT 8 #define SD_IDLE_RETRY_COUNT 100 -#define SD_BLOCK_SIZE 512 #define FLAG_SET(x, y) (((x) & (y)) == (y)) @@ -598,23 +597,6 @@ static SdSpiStatus sd_spi_get_cid(SD_CID* Cid) { return ret; } -static inline bool sd_cache_get(uint32_t address, uint32_t* data) { - uint8_t* cached_data = sector_cache_get(address); - if(cached_data) { - memcpy(data, cached_data, SD_BLOCK_SIZE); - return true; - } - return false; -} - -static inline void sd_cache_put(uint32_t address, uint32_t* data) { - sector_cache_put(address, (uint8_t*)data); -} - -static inline void sd_cache_invalidate_range(uint32_t start_sector, uint32_t end_sector) { - sector_cache_invalidate_range(start_sector, end_sector); -} - static SdSpiStatus sd_spi_cmd_read_blocks(uint32_t* data, uint32_t address, uint32_t blocks, uint32_t timeout_ms) { uint32_t block_address = address; @@ -833,30 +815,12 @@ SdSpiStatus sd_get_card_info(SD_CardInfo* card_info) { SdSpiStatus sd_read_blocks(uint32_t* data, uint32_t address, uint32_t blocks, uint32_t timeout_ms) { - SdSpiStatus status = SdSpiStatusError; - - bool single_sector_read = (blocks == 1); - - if(single_sector_read) { - if(sd_cache_get(address, data)) { - return SdSpiStatusOK; - } - - status = sd_spi_cmd_read_blocks(data, address, blocks, timeout_ms); - - if(status == SdSpiStatusOK) { - sd_cache_put(address, data); - } - } else { - status = sd_spi_cmd_read_blocks(data, address, blocks, timeout_ms); - } - + SdSpiStatus status = sd_spi_cmd_read_blocks(data, address, blocks, timeout_ms); return status; } SdSpiStatus sd_write_blocks(uint32_t* data, uint32_t address, uint32_t blocks, uint32_t timeout_ms) { - sd_cache_invalidate_range(address, address + blocks); SdSpiStatus status = sd_spi_cmd_write_blocks(data, address, blocks, timeout_ms); return status; } diff --git a/firmware/targets/f7/fatfs/sd_spi_io.h b/firmware/targets/f7/fatfs/sd_spi_io.h index 8850eceb7..954c78c40 100644 --- a/firmware/targets/f7/fatfs/sd_spi_io.h +++ b/firmware/targets/f7/fatfs/sd_spi_io.h @@ -5,6 +5,7 @@ #define __IO volatile #define SD_TIMEOUT_MS (1000) +#define SD_BLOCK_SIZE 512 typedef enum { SdSpiStatusOK, diff --git a/firmware/targets/f7/fatfs/user_diskio.c b/firmware/targets/f7/fatfs/user_diskio.c index 16ac78e4d..d7be09c53 100644 --- a/firmware/targets/f7/fatfs/user_diskio.c +++ b/firmware/targets/f7/fatfs/user_diskio.c @@ -36,6 +36,7 @@ /* Includes ------------------------------------------------------------------*/ #include "user_diskio.h" #include +#include "sector_cache.h" /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ @@ -79,6 +80,26 @@ Diskio_drvTypeDef USER_Driver = { }; /* Private functions ---------------------------------------------------------*/ +static inline bool sd_cache_get(uint32_t address, uint32_t* data) { + uint8_t* cached_data = sector_cache_get(address); + if(cached_data) { + memcpy(data, cached_data, SD_BLOCK_SIZE); + return true; + } + return false; +} + +static inline void sd_cache_put(uint32_t address, uint32_t* data) { + sector_cache_put(address, (uint8_t*)data); +} + +static inline void sd_cache_invalidate_range(uint32_t start_sector, uint32_t end_sector) { + sector_cache_invalidate_range(start_sector, end_sector); +} + +static inline void sd_cache_invalidate_all() { + sector_cache_init(); +} /** * @brief Initializes a Drive @@ -125,6 +146,14 @@ DRESULT USER_read(BYTE pdrv, BYTE* buff, DWORD sector, UINT count) { UNUSED(pdrv); DRESULT res = RES_ERROR; + bool single_sector = count == 1; + + if(single_sector) { + if(sd_cache_get(sector, (uint32_t*)buff)) { + return RES_OK; + } + } + furi_hal_spi_acquire(&furi_hal_spi_bus_handle_sd_fast); furi_hal_sd_spi_handle = &furi_hal_spi_bus_handle_sd_fast; @@ -145,6 +174,10 @@ DRESULT USER_read(BYTE pdrv, BYTE* buff, DWORD sector, UINT count) { furi_hal_sd_spi_handle = NULL; furi_hal_spi_release(&furi_hal_spi_bus_handle_sd_fast); + if(single_sector && res == RES_OK) { + sd_cache_put(sector, (uint32_t*)buff); + } + return res; /* USER CODE END READ */ } @@ -164,6 +197,8 @@ DRESULT USER_write(BYTE pdrv, const BYTE* buff, DWORD sector, UINT count) { UNUSED(pdrv); DRESULT res = RES_ERROR; + sd_cache_invalidate_range(sector, sector + count); + furi_hal_spi_acquire(&furi_hal_spi_bus_handle_sd_fast); furi_hal_sd_spi_handle = &furi_hal_spi_bus_handle_sd_fast; @@ -175,6 +210,8 @@ DRESULT USER_write(BYTE pdrv, const BYTE* buff, DWORD sector, UINT count) { res = RES_OK; while(sd_get_card_state() != SdSpiStatusOK) { if(furi_hal_cortex_timer_is_expired(timer)) { + sd_cache_invalidate_all(); + res = RES_ERROR; break; } From 0c06e54831f85e0b4d11efda860e44a6db2a4a8e Mon Sep 17 00:00:00 2001 From: Astra <93453568+Astrrra@users.noreply.github.com> Date: Sun, 26 Feb 2023 14:28:52 +0200 Subject: [PATCH 378/506] [FL-3105] Unify power info, power debug, and device_info into one info command (#2393) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Unify power info, power debug, and device_info into one info command * Fix the storage script * Cli: return device_info command for compatibility, rollback storage script * Cli: remove unused context in info_get calls * Cli: cleanup device info callbacks, switch to new separator Co-authored-by: あく --- applications/services/cli/cli_commands.c | 41 ++++++++++++++++++------ applications/services/power/power_cli.c | 30 ----------------- 2 files changed, 32 insertions(+), 39 deletions(-) diff --git a/applications/services/cli/cli_commands.c b/applications/services/cli/cli_commands.c index b0f1bdbdf..ca9d8b98a 100644 --- a/applications/services/cli/cli_commands.c +++ b/applications/services/cli/cli_commands.c @@ -12,20 +12,42 @@ // Close to ISO, `date +'%Y-%m-%d %H:%M:%S %u'` #define CLI_DATE_FORMAT "%.4d-%.2d-%.2d %.2d:%.2d:%.2d %d" -void cli_command_device_info_callback(const char* key, const char* value, bool last, void* context) { - UNUSED(context); +void cli_command_info_callback(const char* key, const char* value, bool last, void* context) { UNUSED(last); + UNUSED(context); printf("%-30s: %s\r\n", key, value); } -/* - * Device Info Command +/** Info Command + * * This command is intended to be used by humans + * + * Arguments: + * - device - print device info + * - power - print power info + * - power_debug - print power debug info + * + * @param cli The cli instance + * @param args The arguments + * @param context The context */ -void cli_command_device_info(Cli* cli, FuriString* args, void* context) { +void cli_command_info(Cli* cli, FuriString* args, void* context) { UNUSED(cli); - UNUSED(args); - furi_hal_info_get(cli_command_device_info_callback, '_', context); + + if(context) { + furi_hal_info_get(cli_command_info_callback, '_', NULL); + return; + } + + if(!furi_string_cmp(args, "device")) { + furi_hal_info_get(cli_command_info_callback, '.', NULL); + } else if(!furi_string_cmp(args, "power")) { + furi_hal_power_info_get(cli_command_info_callback, '.', NULL); + } else if(!furi_string_cmp(args, "power_debug")) { + furi_hal_power_debug_get(cli_command_info_callback, NULL); + } else { + cli_print_usage("info", "", furi_string_get_cstr(args)); + } } void cli_command_help(Cli* cli, FuriString* args, void* context) { @@ -410,8 +432,9 @@ void cli_command_i2c(Cli* cli, FuriString* args, void* context) { } void cli_commands_init(Cli* cli) { - cli_add_command(cli, "!", CliCommandFlagParallelSafe, cli_command_device_info, NULL); - cli_add_command(cli, "device_info", CliCommandFlagParallelSafe, cli_command_device_info, NULL); + cli_add_command(cli, "!", CliCommandFlagParallelSafe, cli_command_info, (void*)true); + cli_add_command(cli, "info", CliCommandFlagParallelSafe, cli_command_info, NULL); + cli_add_command(cli, "device_info", CliCommandFlagParallelSafe, cli_command_info, (void*)true); cli_add_command(cli, "?", CliCommandFlagParallelSafe, cli_command_help, NULL); cli_add_command(cli, "help", CliCommandFlagParallelSafe, cli_command_help, NULL); diff --git a/applications/services/power/power_cli.c b/applications/services/power/power_cli.c index f4a10f0a9..021ce3553 100644 --- a/applications/services/power/power_cli.c +++ b/applications/services/power/power_cli.c @@ -26,24 +26,6 @@ void power_cli_reboot2dfu(Cli* cli, FuriString* args) { power_reboot(PowerBootModeDfu); } -static void power_cli_callback(const char* key, const char* value, bool last, void* context) { - UNUSED(last); - UNUSED(context); - printf("%-24s: %s\r\n", key, value); -} - -void power_cli_info(Cli* cli, FuriString* args) { - UNUSED(cli); - UNUSED(args); - furi_hal_power_info_get(power_cli_callback, '_', NULL); -} - -void power_cli_debug(Cli* cli, FuriString* args) { - UNUSED(cli); - UNUSED(args); - furi_hal_power_debug_get(power_cli_callback, NULL); -} - void power_cli_5v(Cli* cli, FuriString* args) { UNUSED(cli); if(!furi_string_cmp(args, "0")) { @@ -74,8 +56,6 @@ static void power_cli_command_print_usage() { printf("\toff\t - shutdown power\r\n"); printf("\treboot\t - reboot\r\n"); printf("\treboot2dfu\t - reboot to dfu bootloader\r\n"); - printf("\tinfo\t - show power info\r\n"); - printf("\tdebug\t - show debug information\r\n"); printf("\t5v <0 or 1>\t - enable or disable 5v ext\r\n"); if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) { printf("\t3v3 <0 or 1>\t - enable or disable 3v3 ext\r\n"); @@ -108,16 +88,6 @@ void power_cli(Cli* cli, FuriString* args, void* context) { break; } - if(furi_string_cmp_str(cmd, "info") == 0) { - power_cli_info(cli, args); - break; - } - - if(furi_string_cmp_str(cmd, "debug") == 0) { - power_cli_debug(cli, args); - break; - } - if(furi_string_cmp_str(cmd, "5v") == 0) { power_cli_5v(cli, args); break; From 3efb7d4050ef3183a43e59fd65dc2ef24fd4f604 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=82=E3=81=8F?= Date: Mon, 27 Feb 2023 00:15:26 +0900 Subject: [PATCH 379/506] Updater: handle storage errors when removing files, fix folder remove routine, prevent unused services from starting (#2432) * Updater: handle storage errors when removing files * Updater: properly handle folder removal in post update cleanup stage. Prevent power, desktop and dolphin services from starting on update. * Desktop, Dolphin, Power: proper handling and message for special boot mode. * Desktop, Power: add missing TAG * Updater: unify start skip message and fix double delete in backup worker * Cli: unify special boot mode message --- applications/services/bt/bt_service/bt.c | 2 +- applications/services/cli/cli.c | 2 +- applications/services/desktop/desktop.c | 8 +++++ applications/services/dolphin/dolphin.c | 6 ++++ .../services/power/power_service/power.c | 7 ++++ .../updater/util/update_task_worker_backup.c | 33 ++++++++++--------- furi/core/thread.c | 4 +-- furi/flipper.c | 7 ++-- 8 files changed, 46 insertions(+), 23 deletions(-) diff --git a/applications/services/bt/bt_service/bt.c b/applications/services/bt/bt_service/bt.c index 9e5782690..16b60231b 100644 --- a/applications/services/bt/bt_service/bt.c +++ b/applications/services/bt/bt_service/bt.c @@ -373,7 +373,7 @@ int32_t bt_srv(void* p) { Bt* bt = bt_alloc(); if(furi_hal_rtc_get_boot_mode() != FuriHalRtcBootModeNormal) { - FURI_LOG_W(TAG, "Skipped BT init: device in special startup mode"); + FURI_LOG_W(TAG, "Skipping start in special boot mode"); ble_glue_wait_for_c2_start(FURI_HAL_BT_C2_START_TIMEOUT); furi_record_create(RECORD_BT, bt); return 0; diff --git a/applications/services/cli/cli.c b/applications/services/cli/cli.c index 384d17808..b68505c51 100644 --- a/applications/services/cli/cli.c +++ b/applications/services/cli/cli.c @@ -461,7 +461,7 @@ int32_t cli_srv(void* p) { if(furi_hal_rtc_get_boot_mode() == FuriHalRtcBootModeNormal) { cli_session_open(cli, &cli_vcp); } else { - FURI_LOG_W(TAG, "Skipped CLI session open: device in special startup mode"); + FURI_LOG_W(TAG, "Skipping start in special boot mode"); } while(1) { diff --git a/applications/services/desktop/desktop.c b/applications/services/desktop/desktop.c index 848f5cb63..f8716e6cb 100644 --- a/applications/services/desktop/desktop.c +++ b/applications/services/desktop/desktop.c @@ -17,6 +17,8 @@ #include "helpers/pin_lock.h" #include "helpers/slideshow_filename.h" +#define TAG "Desktop" + static void desktop_auto_lock_arm(Desktop*); static void desktop_auto_lock_inhibit(Desktop*); static void desktop_start_auto_lock_timer(Desktop*); @@ -321,6 +323,12 @@ static bool desktop_check_file_flag(const char* flag_path) { int32_t desktop_srv(void* p) { UNUSED(p); + + if(furi_hal_rtc_get_boot_mode() != FuriHalRtcBootModeNormal) { + FURI_LOG_W(TAG, "Skipping start in special boot mode"); + return 0; + } + Desktop* desktop = desktop_alloc(); bool loaded = DESKTOP_SETTINGS_LOAD(&desktop->settings); diff --git a/applications/services/dolphin/dolphin.c b/applications/services/dolphin/dolphin.c index 41eeef3b1..dd8b7105f 100644 --- a/applications/services/dolphin/dolphin.c +++ b/applications/services/dolphin/dolphin.c @@ -154,6 +154,12 @@ static void dolphin_update_clear_limits_timer_period(Dolphin* dolphin) { int32_t dolphin_srv(void* p) { UNUSED(p); + + if(furi_hal_rtc_get_boot_mode() != FuriHalRtcBootModeNormal) { + FURI_LOG_W(TAG, "Skipping start in special boot mode"); + return 0; + } + Dolphin* dolphin = dolphin_alloc(); furi_record_create(RECORD_DOLPHIN, dolphin); diff --git a/applications/services/power/power_service/power.c b/applications/services/power/power_service/power.c index 5df611a74..d9319d3d9 100644 --- a/applications/services/power/power_service/power.c +++ b/applications/services/power/power_service/power.c @@ -4,6 +4,7 @@ #include #define POWER_OFF_TIMEOUT 90 +#define TAG "Power" void power_draw_battery_callback(Canvas* canvas, void* context) { furi_assert(context); @@ -217,6 +218,12 @@ static void power_check_battery_level_change(Power* power) { int32_t power_srv(void* p) { UNUSED(p); + + if(furi_hal_rtc_get_boot_mode() != FuriHalRtcBootModeNormal) { + FURI_LOG_W(TAG, "Skipping start in special boot mode"); + return 0; + } + Power* power = power_alloc(); power_update_info(power); furi_record_create(RECORD_POWER, power); diff --git a/applications/system/updater/util/update_task_worker_backup.c b/applications/system/updater/util/update_task_worker_backup.c index ed53c353b..f2c33c2ed 100644 --- a/applications/system/updater/util/update_task_worker_backup.c +++ b/applications/system/updater/util/update_task_worker_backup.c @@ -97,7 +97,16 @@ static void update_task_cleanup_resources(UpdateTask* update_task, const uint32_ path_concat( STORAGE_EXT_PATH_PREFIX, furi_string_get_cstr(entry_ptr->name), file_path); FURI_LOG_D(TAG, "Removing %s", furi_string_get_cstr(file_path)); - storage_simply_remove(update_task->storage, furi_string_get_cstr(file_path)); + + FS_Error result = + storage_common_remove(update_task->storage, furi_string_get_cstr(file_path)); + if(result != FSE_OK && result != FSE_EXIST) { + FURI_LOG_E( + TAG, + "%s remove failed, cause %s", + furi_string_get_cstr(file_path), + storage_error_get_desc(result)); + } furi_string_free(file_path); } else if(entry_ptr->type == ResourceManifestEntryTypeDirectory) { n_dir_entries++; @@ -116,7 +125,6 @@ static void update_task_cleanup_resources(UpdateTask* update_task, const uint32_ n_dir_entries); FuriString* folder_path = furi_string_alloc(); - File* folder_file = storage_file_alloc(update_task->storage); do { path_concat( @@ -125,24 +133,17 @@ static void update_task_cleanup_resources(UpdateTask* update_task, const uint32_ folder_path); FURI_LOG_D(TAG, "Removing folder %s", furi_string_get_cstr(folder_path)); - if(!storage_dir_open(folder_file, furi_string_get_cstr(folder_path))) { - FURI_LOG_W( + FS_Error result = storage_common_remove( + update_task->storage, furi_string_get_cstr(folder_path)); + if(result != FSE_OK && result != FSE_EXIST) { + FURI_LOG_E( TAG, - "%s can't be opened, skipping", - furi_string_get_cstr(folder_path)); - break; + "%s remove failed, cause %s", + furi_string_get_cstr(folder_path), + storage_error_get_desc(result)); } - - if(storage_dir_read(folder_file, NULL, NULL, 0)) { - FURI_LOG_I( - TAG, "%s is not empty, skipping", furi_string_get_cstr(folder_path)); - break; - } - - storage_simply_remove(update_task->storage, furi_string_get_cstr(folder_path)); } while(false); - storage_file_free(folder_file); furi_string_free(folder_path); } } diff --git a/furi/core/thread.c b/furi/core/thread.c index 9a112d9a8..ea9f45e84 100644 --- a/furi/core/thread.c +++ b/furi/core/thread.c @@ -96,9 +96,9 @@ static void furi_thread_body(void* context) { furi_assert(thread->state == FuriThreadStateRunning); if(thread->is_service) { - FURI_LOG_E( + FURI_LOG_W( TAG, - "%s service thread exited. Thread memory cannot be reclaimed.", + "%s service thread TCB memory will not be reclaimed", thread->name ? thread->name : ""); } diff --git a/furi/flipper.c b/furi/flipper.c index 73899e58b..d16a84a10 100644 --- a/furi/flipper.c +++ b/furi/flipper.c @@ -3,6 +3,7 @@ #include #include #include +#include #define TAG "Flipper" @@ -29,10 +30,10 @@ static void flipper_print_version(const char* target, const Version* version) { void flipper_init() { flipper_print_version("Firmware", furi_hal_version_get_firmware_version()); - FURI_LOG_I(TAG, "starting services"); + FURI_LOG_I(TAG, "Boot mode %d, starting services", furi_hal_rtc_get_boot_mode()); for(size_t i = 0; i < FLIPPER_SERVICES_COUNT; i++) { - FURI_LOG_I(TAG, "starting service %s", FLIPPER_SERVICES[i].name); + FURI_LOG_I(TAG, "Starting service %s", FLIPPER_SERVICES[i].name); FuriThread* thread = furi_thread_alloc_ex( FLIPPER_SERVICES[i].name, @@ -44,7 +45,7 @@ void flipper_init() { furi_thread_start(thread); } - FURI_LOG_I(TAG, "services startup complete"); + FURI_LOG_I(TAG, "Startup complete"); } void vApplicationGetIdleTaskMemory( From 1d55aee39cbb329758a50f0110f6d69bc0d00274 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=82=E3=81=8F?= Date: Mon, 27 Feb 2023 01:29:42 +0900 Subject: [PATCH 380/506] Fix incorrect type choise condition in image compressor (#2434) --- scripts/flipper/assets/icon.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/flipper/assets/icon.py b/scripts/flipper/assets/icon.py index ed85b024e..f0dae25be 100644 --- a/scripts/flipper/assets/icon.py +++ b/scripts/flipper/assets/icon.py @@ -105,7 +105,7 @@ def file2image(file): data_enc = bytearray([len(data_enc) & 0xFF, len(data_enc) >> 8]) + data_enc # Use encoded data only if its length less than original, including header - if len(data_enc) < len(data_bin) + 1: + if len(data_enc) + 2 < len(data_bin) + 1: data = b"\x01\x00" + data_enc else: data = b"\x00" + data_bin From 09edf66a2a00c20bce65203c84c6081c9d129aa7 Mon Sep 17 00:00:00 2001 From: Shane Synan Date: Sun, 26 Feb 2023 12:23:39 -0500 Subject: [PATCH 381/506] FuriHal, Power, UnitTests: fix, rename battery charging voltage limit API (#2228) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * FuriHal, Power, UnitTests: rename battery charge voltage limit API * FuriHal: bump API, power info major versions * Power: fix battery charge voltage limit for > 7.935v Co-authored-by: あく --- .../debug/unit_tests/power/power_test.c | 61 +++++++++++-------- .../services/power/power_service/power.c | 6 +- .../services/power/power_service/power.h | 2 +- .../power_settings_scene_battery_info.c | 2 +- .../power_settings_app/views/battery_info.c | 6 +- .../power_settings_app/views/battery_info.h | 2 +- firmware/targets/f7/api_symbols.csv | 4 +- firmware/targets/f7/furi_hal/furi_hal_power.c | 12 ++-- .../targets/furi_hal_include/furi_hal_power.h | 10 +-- lib/drivers/bq25896.c | 17 +++--- lib/drivers/bq25896.h | 4 +- 11 files changed, 69 insertions(+), 57 deletions(-) diff --git a/applications/debug/unit_tests/power/power_test.c b/applications/debug/unit_tests/power/power_test.c index ce2c7aad7..a9b66b221 100644 --- a/applications/debug/unit_tests/power/power_test.c +++ b/applications/debug/unit_tests/power/power_test.c @@ -3,56 +3,63 @@ #include "../minunit.h" static void power_test_deinit(void) { - // Try to reset to default charging voltage - furi_hal_power_set_battery_charging_voltage(4.208f); + // Try to reset to default charge voltage limit + furi_hal_power_set_battery_charge_voltage_limit(4.208f); } -MU_TEST(test_power_charge_voltage_exact) { - // Power of 16mV charge voltages get applied exactly +MU_TEST(test_power_charge_voltage_limit_exact) { + // Power of 16mV charge voltage limits get applied exactly // (bq25896 charge controller works in 16mV increments) // // This test may need adapted if other charge controllers are used in the future. for(uint16_t charge_mv = 3840; charge_mv <= 4208; charge_mv += 16) { float charge_volt = (float)charge_mv / 1000.0f; - furi_hal_power_set_battery_charging_voltage(charge_volt); - mu_assert_double_eq(charge_volt, furi_hal_power_get_battery_charging_voltage()); + furi_hal_power_set_battery_charge_voltage_limit(charge_volt); + mu_assert_double_eq(charge_volt, furi_hal_power_get_battery_charge_voltage_limit()); } } -MU_TEST(test_power_charge_voltage_floating_imprecision) { +MU_TEST(test_power_charge_voltage_limit_floating_imprecision) { // 4.016f should act as 4.016 V, even with floating point imprecision - furi_hal_power_set_battery_charging_voltage(4.016f); - mu_assert_double_eq(4.016f, furi_hal_power_get_battery_charging_voltage()); + furi_hal_power_set_battery_charge_voltage_limit(4.016f); + mu_assert_double_eq(4.016f, furi_hal_power_get_battery_charge_voltage_limit()); } -MU_TEST(test_power_charge_voltage_inexact) { - // Charge voltages that are not power of 16mV get truncated down - furi_hal_power_set_battery_charging_voltage(3.841f); - mu_assert_double_eq(3.840, furi_hal_power_get_battery_charging_voltage()); +MU_TEST(test_power_charge_voltage_limit_inexact) { + // Charge voltage limits that are not power of 16mV get truncated down + furi_hal_power_set_battery_charge_voltage_limit(3.841f); + mu_assert_double_eq(3.840, furi_hal_power_get_battery_charge_voltage_limit()); - furi_hal_power_set_battery_charging_voltage(3.900f); - mu_assert_double_eq(3.888, furi_hal_power_get_battery_charging_voltage()); + furi_hal_power_set_battery_charge_voltage_limit(3.900f); + mu_assert_double_eq(3.888, furi_hal_power_get_battery_charge_voltage_limit()); - furi_hal_power_set_battery_charging_voltage(4.200f); - mu_assert_double_eq(4.192, furi_hal_power_get_battery_charging_voltage()); + furi_hal_power_set_battery_charge_voltage_limit(4.200f); + mu_assert_double_eq(4.192, furi_hal_power_get_battery_charge_voltage_limit()); } -MU_TEST(test_power_charge_voltage_invalid_clamped) { - // Out-of-range charge voltages get clamped to 3.840 V and 4.208 V - furi_hal_power_set_battery_charging_voltage(3.808f); - mu_assert_double_eq(3.840, furi_hal_power_get_battery_charging_voltage()); +MU_TEST(test_power_charge_voltage_limit_invalid_clamped) { + // Out-of-range charge voltage limits get clamped to 3.840 V and 4.208 V + furi_hal_power_set_battery_charge_voltage_limit(3.808f); + mu_assert_double_eq(3.840, furi_hal_power_get_battery_charge_voltage_limit()); + furi_hal_power_set_battery_charge_voltage_limit(1.0f); + mu_assert_double_eq(3.840, furi_hal_power_get_battery_charge_voltage_limit()); // NOTE: Intentionally picking a small increment above 4.208 V to reduce the risk of an // unhappy battery if this fails. - furi_hal_power_set_battery_charging_voltage(4.240f); - mu_assert_double_eq(4.208, furi_hal_power_get_battery_charging_voltage()); + furi_hal_power_set_battery_charge_voltage_limit(4.240f); + mu_assert_double_eq(4.208, furi_hal_power_get_battery_charge_voltage_limit()); + // Likewise, picking a number that the uint8_t wraparound in the driver would result in a + // VREG value under 23 if this test fails. + // E.g. (uint8_t)((8105-3840)/16) -> 10 + furi_hal_power_set_battery_charge_voltage_limit(8.105f); + mu_assert_double_eq(4.208, furi_hal_power_get_battery_charge_voltage_limit()); } MU_TEST_SUITE(test_power_suite) { - MU_RUN_TEST(test_power_charge_voltage_exact); - MU_RUN_TEST(test_power_charge_voltage_floating_imprecision); - MU_RUN_TEST(test_power_charge_voltage_inexact); - MU_RUN_TEST(test_power_charge_voltage_invalid_clamped); + MU_RUN_TEST(test_power_charge_voltage_limit_exact); + MU_RUN_TEST(test_power_charge_voltage_limit_floating_imprecision); + MU_RUN_TEST(test_power_charge_voltage_limit_inexact); + MU_RUN_TEST(test_power_charge_voltage_limit_invalid_clamped); power_test_deinit(); } diff --git a/applications/services/power/power_service/power.c b/applications/services/power/power_service/power.c index d9319d3d9..56dbd0f87 100644 --- a/applications/services/power/power_service/power.c +++ b/applications/services/power/power_service/power.c @@ -13,8 +13,8 @@ void power_draw_battery_callback(Canvas* canvas, void* context) { if(power->info.gauge_is_ok) { canvas_draw_box(canvas, 2, 2, (power->info.charge + 4) / 5, 4); - if(power->info.voltage_battery_charging < 4.2) { - // Battery charging voltage is modified, indicate with cross pattern + if(power->info.voltage_battery_charge_limit < 4.2) { + // Battery charge voltage limit is modified, indicate with cross pattern canvas_invert_color(canvas); uint8_t battery_bar_width = (power->info.charge + 4) / 5; bool cross_odd = false; @@ -147,7 +147,7 @@ static bool power_update_info(Power* power) { info.capacity_full = furi_hal_power_get_battery_full_capacity(); info.current_charger = furi_hal_power_get_battery_current(FuriHalPowerICCharger); info.current_gauge = furi_hal_power_get_battery_current(FuriHalPowerICFuelGauge); - info.voltage_battery_charging = furi_hal_power_get_battery_charging_voltage(); + info.voltage_battery_charge_limit = furi_hal_power_get_battery_charge_voltage_limit(); info.voltage_charger = furi_hal_power_get_battery_voltage(FuriHalPowerICCharger); info.voltage_gauge = furi_hal_power_get_battery_voltage(FuriHalPowerICFuelGauge); info.voltage_vbus = furi_hal_power_get_usb_voltage(); diff --git a/applications/services/power/power_service/power.h b/applications/services/power/power_service/power.h index 8b9019c42..c7f5d7e35 100644 --- a/applications/services/power/power_service/power.h +++ b/applications/services/power/power_service/power.h @@ -41,7 +41,7 @@ typedef struct { float current_charger; float current_gauge; - float voltage_battery_charging; + float voltage_battery_charge_limit; float voltage_charger; float voltage_gauge; float voltage_vbus; diff --git a/applications/settings/power_settings_app/scenes/power_settings_scene_battery_info.c b/applications/settings/power_settings_app/scenes/power_settings_scene_battery_info.c index 5fa38df72..5181c93f7 100644 --- a/applications/settings/power_settings_app/scenes/power_settings_scene_battery_info.c +++ b/applications/settings/power_settings_app/scenes/power_settings_scene_battery_info.c @@ -7,7 +7,7 @@ static void power_settings_scene_battery_info_update_model(PowerSettingsApp* app .gauge_voltage = app->info.voltage_gauge, .gauge_current = app->info.current_gauge, .gauge_temperature = app->info.temperature_gauge, - .charging_voltage = app->info.voltage_battery_charging, + .charge_voltage_limit = app->info.voltage_battery_charge_limit, .charge = app->info.charge, .health = app->info.health, }; diff --git a/applications/settings/power_settings_app/views/battery_info.c b/applications/settings/power_settings_app/views/battery_info.c index d29769d21..7394fd3c5 100644 --- a/applications/settings/power_settings_app/views/battery_info.c +++ b/applications/settings/power_settings_app/views/battery_info.c @@ -69,7 +69,7 @@ static void draw_battery(Canvas* canvas, BatteryInfoModel* data, int x, int y) { drain_current > HIGH_DRAIN_CURRENT_THRESHOLD ? "mA!" : "mA"); } else if(drain_current != 0) { snprintf(header, 20, "..."); - } else if(data->charging_voltage < 4.2) { + } else if(data->charge_voltage_limit < 4.2) { // Non-default battery charging limit, mention it snprintf(emote, sizeof(emote), "Charged!"); snprintf(header, sizeof(header), "Limited to"); @@ -77,8 +77,8 @@ static void draw_battery(Canvas* canvas, BatteryInfoModel* data, int x, int y) { value, sizeof(value), "%lu.%luV", - (uint32_t)(data->charging_voltage), - (uint32_t)(data->charging_voltage * 10) % 10); + (uint32_t)(data->charge_voltage_limit), + (uint32_t)(data->charge_voltage_limit * 10) % 10); } else { snprintf(header, sizeof(header), "Charged!"); } diff --git a/applications/settings/power_settings_app/views/battery_info.h b/applications/settings/power_settings_app/views/battery_info.h index 7bfacf69e..e52d1844c 100644 --- a/applications/settings/power_settings_app/views/battery_info.h +++ b/applications/settings/power_settings_app/views/battery_info.h @@ -9,7 +9,7 @@ typedef struct { float gauge_voltage; float gauge_current; float gauge_temperature; - float charging_voltage; + float charge_voltage_limit; uint8_t charge; uint8_t health; } BatteryInfoModel; diff --git a/firmware/targets/f7/api_symbols.csv b/firmware/targets/f7/api_symbols.csv index e320fc92b..8a76f8c94 100644 --- a/firmware/targets/f7/api_symbols.csv +++ b/firmware/targets/f7/api_symbols.csv @@ -1211,7 +1211,7 @@ Function,+,furi_hal_power_enable_external_3_3v,void, Function,+,furi_hal_power_enable_otg,void, Function,+,furi_hal_power_gauge_is_ok,_Bool, Function,+,furi_hal_power_get_bat_health_pct,uint8_t, -Function,+,furi_hal_power_get_battery_charging_voltage,float, +Function,+,furi_hal_power_get_battery_charge_voltage_limit,float, Function,+,furi_hal_power_get_battery_current,float,FuriHalPowerIC Function,+,furi_hal_power_get_battery_design_capacity,uint32_t, Function,+,furi_hal_power_get_battery_full_capacity,uint32_t, @@ -1230,7 +1230,7 @@ Function,+,furi_hal_power_is_charging_done,_Bool, Function,+,furi_hal_power_is_otg_enabled,_Bool, Function,+,furi_hal_power_off,void, Function,+,furi_hal_power_reset,void, -Function,+,furi_hal_power_set_battery_charging_voltage,void,float +Function,+,furi_hal_power_set_battery_charge_voltage_limit,void,float Function,+,furi_hal_power_shutdown,void, Function,+,furi_hal_power_sleep,void, Function,+,furi_hal_power_sleep_available,_Bool, diff --git a/firmware/targets/f7/furi_hal/furi_hal_power.c b/firmware/targets/f7/furi_hal/furi_hal_power.c index 2d709620d..dd7c34ae7 100644 --- a/firmware/targets/f7/furi_hal/furi_hal_power.c +++ b/firmware/targets/f7/furi_hal/furi_hal_power.c @@ -341,14 +341,14 @@ bool furi_hal_power_is_otg_enabled() { return ret; } -float furi_hal_power_get_battery_charging_voltage() { +float furi_hal_power_get_battery_charge_voltage_limit() { furi_hal_i2c_acquire(&furi_hal_i2c_handle_power); float ret = (float)bq25896_get_vreg_voltage(&furi_hal_i2c_handle_power) / 1000.0f; furi_hal_i2c_release(&furi_hal_i2c_handle_power); return ret; } -void furi_hal_power_set_battery_charging_voltage(float voltage) { +void furi_hal_power_set_battery_charge_voltage_limit(float voltage) { furi_hal_i2c_acquire(&furi_hal_i2c_handle_power); // Adding 0.0005 is necessary because 4.016f is 4.015999794000, which gets truncated bq25896_set_vreg_voltage(&furi_hal_i2c_handle_power, (uint16_t)(voltage * 1000.0f + 0.0005f)); @@ -486,7 +486,7 @@ void furi_hal_power_info_get(PropertyValueCallback out, char sep, void* context) property_value_out(&property_context, NULL, 2, "format", "major", "2"); property_value_out(&property_context, NULL, 2, "format", "minor", "1"); } else { - property_value_out(&property_context, NULL, 3, "power", "info", "major", "1"); + property_value_out(&property_context, NULL, 3, "power", "info", "major", "2"); property_value_out(&property_context, NULL, 3, "power", "info", "minor", "1"); } @@ -505,8 +505,10 @@ void furi_hal_power_info_get(PropertyValueCallback out, char sep, void* context) } property_value_out(&property_context, NULL, 2, "charge", "state", charge_state); - uint16_t charge_voltage = (uint16_t)(furi_hal_power_get_battery_charging_voltage() * 1000.f); - property_value_out(&property_context, "%u", 2, "charge", "voltage", charge_voltage); + uint16_t charge_voltage_limit = + (uint16_t)(furi_hal_power_get_battery_charge_voltage_limit() * 1000.f); + property_value_out( + &property_context, "%u", 3, "charge", "voltage", "limit", charge_voltage_limit); uint16_t voltage = (uint16_t)(furi_hal_power_get_battery_voltage(FuriHalPowerICFuelGauge) * 1000.f); property_value_out(&property_context, "%u", 2, "battery", "voltage", voltage); diff --git a/firmware/targets/furi_hal_include/furi_hal_power.h b/firmware/targets/furi_hal_include/furi_hal_power.h index 39a11e99f..462e20e41 100644 --- a/firmware/targets/furi_hal_include/furi_hal_power.h +++ b/firmware/targets/furi_hal_include/furi_hal_power.h @@ -121,21 +121,21 @@ void furi_hal_power_check_otg_status(); */ bool furi_hal_power_is_otg_enabled(); -/** Get battery charging voltage in V +/** Get battery charge voltage limit in V * * @return voltage in V */ -float furi_hal_power_get_battery_charging_voltage(); +float furi_hal_power_get_battery_charge_voltage_limit(); -/** Set battery charging voltage in V +/** Set battery charge voltage limit in V * - * Invalid values will be clamped to the nearest valid value. + * Invalid values will be clamped downward to the nearest valid value. * * @param voltage[in] voltage in V * * @return voltage in V */ -void furi_hal_power_set_battery_charging_voltage(float voltage); +void furi_hal_power_set_battery_charge_voltage_limit(float voltage); /** Get remaining battery battery capacity in mAh * diff --git a/lib/drivers/bq25896.c b/lib/drivers/bq25896.c index 7e3008d62..99534fb13 100644 --- a/lib/drivers/bq25896.c +++ b/lib/drivers/bq25896.c @@ -140,15 +140,18 @@ uint16_t bq25896_get_vreg_voltage(FuriHalI2cBusHandle* handle) { void bq25896_set_vreg_voltage(FuriHalI2cBusHandle* handle, uint16_t vreg_voltage) { if(vreg_voltage < 3840) { - // Minimum value is 3840 mV - bq25896_regs.r06.VREG = 0; - } else { - // Find the nearest voltage value (subtract offset, divide into sections) - // Values are truncated downward as needed (e.g. 4200mV -> 4192 mV) - bq25896_regs.r06.VREG = (uint8_t)((vreg_voltage - 3840) / 16); + // Minimum valid value is 3840 mV + vreg_voltage = 3840; + } else if(vreg_voltage > 4208) { + // Maximum safe value is 4208 mV + vreg_voltage = 4208; } - // Do not allow values above 23 (0x17, 4208mV) + // Find the nearest voltage value (subtract offset, divide into sections) + // Values are truncated downward as needed (e.g. 4200mV -> 4192 mV) + bq25896_regs.r06.VREG = (uint8_t)((vreg_voltage - 3840) / 16); + + // Double check: do not allow values above 23 (0x17, 4208mV) // Exceeding 4.2v will overcharge the battery! if(bq25896_regs.r06.VREG > 23) { bq25896_regs.r06.VREG = 23; diff --git a/lib/drivers/bq25896.h b/lib/drivers/bq25896.h index c8a8526a1..f3d1d0e05 100644 --- a/lib/drivers/bq25896.h +++ b/lib/drivers/bq25896.h @@ -36,10 +36,10 @@ void bq25896_disable_otg(FuriHalI2cBusHandle* handle); /** Is otg enabled */ bool bq25896_is_otg_enabled(FuriHalI2cBusHandle* handle); -/** Get VREG (charging) voltage in mV */ +/** Get VREG (charging limit) voltage in mV */ uint16_t bq25896_get_vreg_voltage(FuriHalI2cBusHandle* handle); -/** Set VREG (charging) voltage in mV +/** Set VREG (charging limit) voltage in mV * * Valid range: 3840mV - 4208mV, in steps of 16mV */ From b054912167764e37e968a8996fc50047392c6be5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=82=E3=81=8F?= Date: Mon, 27 Feb 2023 02:39:26 +0900 Subject: [PATCH 382/506] F8, F18: bump API symbols version (#2435) --- firmware/targets/f18/api_symbols.csv | 6 +++--- firmware/targets/f7/api_symbols.csv | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/firmware/targets/f18/api_symbols.csv b/firmware/targets/f18/api_symbols.csv index 462fbf739..549d38129 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,+,14.0,, +Version,+,15.0,, Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/cli/cli.h,, Header,+,applications/services/cli/cli_vcp.h,, @@ -979,7 +979,7 @@ Function,+,furi_hal_power_enable_external_3_3v,void, Function,+,furi_hal_power_enable_otg,void, Function,+,furi_hal_power_gauge_is_ok,_Bool, Function,+,furi_hal_power_get_bat_health_pct,uint8_t, -Function,+,furi_hal_power_get_battery_charging_voltage,float, +Function,+,furi_hal_power_get_battery_charge_voltage_limit,float, Function,+,furi_hal_power_get_battery_current,float,FuriHalPowerIC Function,+,furi_hal_power_get_battery_design_capacity,uint32_t, Function,+,furi_hal_power_get_battery_full_capacity,uint32_t, @@ -998,7 +998,7 @@ Function,+,furi_hal_power_is_charging_done,_Bool, Function,+,furi_hal_power_is_otg_enabled,_Bool, Function,+,furi_hal_power_off,void, Function,+,furi_hal_power_reset,void, -Function,+,furi_hal_power_set_battery_charging_voltage,void,float +Function,+,furi_hal_power_set_battery_charge_voltage_limit,void,float Function,+,furi_hal_power_shutdown,void, Function,+,furi_hal_power_sleep,void, Function,+,furi_hal_power_sleep_available,_Bool, diff --git a/firmware/targets/f7/api_symbols.csv b/firmware/targets/f7/api_symbols.csv index 8a76f8c94..8152095dc 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,+,14.1,, +Version,+,15.0,, Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/cli/cli.h,, Header,+,applications/services/cli/cli_vcp.h,, From 478390de191f876ef12ed9a54301390a01e8ce40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=82=E3=81=8F?= Date: Mon, 27 Feb 2023 03:06:19 +0900 Subject: [PATCH 383/506] Drivers: remove excessive check in bq25896 and make PVS happy (#2436) --- lib/drivers/bq25896.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/lib/drivers/bq25896.c b/lib/drivers/bq25896.c index 99534fb13..4c1d687cb 100644 --- a/lib/drivers/bq25896.c +++ b/lib/drivers/bq25896.c @@ -151,12 +151,6 @@ void bq25896_set_vreg_voltage(FuriHalI2cBusHandle* handle, uint16_t vreg_voltage // Values are truncated downward as needed (e.g. 4200mV -> 4192 mV) bq25896_regs.r06.VREG = (uint8_t)((vreg_voltage - 3840) / 16); - // Double check: do not allow values above 23 (0x17, 4208mV) - // Exceeding 4.2v will overcharge the battery! - if(bq25896_regs.r06.VREG > 23) { - bq25896_regs.r06.VREG = 23; - } - // Apply changes furi_hal_i2c_write_reg_8( handle, BQ25896_ADDRESS, 0x06, *(uint8_t*)&bq25896_regs.r06, BQ25896_I2C_TIMEOUT); From cd14380dbaa38628a8c68e3ab99a76dfa7d54641 Mon Sep 17 00:00:00 2001 From: matthisc Date: Sun, 26 Feb 2023 20:09:05 +0100 Subject: [PATCH 384/506] Correcting bug on DEL and DELETE --- applications/plugins/mousejacker/mousejacker_ducky.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/plugins/mousejacker/mousejacker_ducky.c b/applications/plugins/mousejacker/mousejacker_ducky.c index d5a32c484..f9ded2d03 100644 --- a/applications/plugins/mousejacker/mousejacker_ducky.c +++ b/applications/plugins/mousejacker/mousejacker_ducky.c @@ -97,7 +97,7 @@ static uint32_t mj_ducky_get_command_len(const char* line) { static bool mj_get_ducky_key(char* key, size_t keylen, MJDuckyKey* dk) { //FURI_LOG_D(TAG, "looking up key %s with length %d", key, keylen); for(uint i = 0; i < sizeof(mj_ducky_keys) / sizeof(MJDuckyKey); i++) { - if(strncmp(mj_ducky_keys[i].name, key, keylen) == 0) { + if(strlen(mj_ducky_keys[i].name) == keylen && !strncmp(mj_ducky_keys[i].name, key, keylen)) { memcpy(dk, &mj_ducky_keys[i], sizeof(MJDuckyKey)); return true; } From 182296d8af1a61b21b72e7451c4c8ff78f0f1244 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Mon, 27 Feb 2023 01:13:21 +0300 Subject: [PATCH 385/506] Nice flor s - custom buttons --- CHANGELOG.md | 18 ++-- ReadMe.md | 2 +- .../scenes/subghz_scene_receiver_info.c | 2 + .../main/subghz/scenes/subghz_scene_rpc.c | 2 + .../subghz/scenes/subghz_scene_transmitter.c | 3 + applications/main/subghz/views/transmitter.c | 16 ++++ applications/main/unirfremix/unirfremix_app.c | 2 + firmware/targets/f7/api_symbols.csv | 4 + lib/subghz/protocols/nice_flor_s.c | 92 +++++++++++++++++++ lib/subghz/protocols/nice_flor_s.h | 8 ++ 10 files changed, 140 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 128c9465a..6cc844c23 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,12 +1,14 @@ ### New changes -* SubGHz: **Keeloq: Beninca - protocol support** -* SubGHz: **Hold right in received signal list to delete selected signal** -* SubGHz: **Custom buttons for Keeloq and Alutech AT4N** - now you can use arrow buttons to send signal with different button code -* SubGHz: Debug mode counter increase settings (+5, +10, default: +1) -* Infrared: Debug TX PIN output settings (ability to move tx signal out to GPIO) (implemented #364) -* Plugins: Updated -> [BH1750] Lightmeter [(by oleksiikutuzov)](https://github.com/oleksiikutuzov/flipperzero-lightmeter) -* OFW: BadUSB -> STRINGDELAY(STRING_DELAY) feature, worker signal handling refactoring -> (Fixed #365 (BadUSB won't detect connection and/or hangs)) -* OFW: Grammar fixes +* SubGHz: **Custom buttons for Nice Flor S** - now you can use arrow buttons to send signal with different button code +* OFW: Drivers: remove excessive check in bq25896 and make PVS happy +* OFW: FuriHal, Power, UnitTests: fix, rename battery charging voltage limit API -> **Breaking API change, api was changed from 14.x to 15.x** +**(this will make your manually copied plugins not work, update them in same way you installed them, or delete `apps` folder and then install firmware, if you using extra pack builds (with `e` in version) all apps in _Extra will be updated automatically)** + +* OFW: Fix incorrect type choise condition in image compressor +* OFW: Updater: handle storage errors when removing files, fix folder remove routine, prevent unused services from starting +* OFW: Unify power info, power debug, and device_info into one info command +* OFW: SD Cache: moved to diskio layer, invalidation in case of error +* OFW: Picopass: factory key support, minor code cleanup #### [🎲 Download latest extra apps pack](https://download-directory.github.io/?url=https://github.com/xMasterX/unleashed-extra-pack/tree/main/apps) diff --git a/ReadMe.md b/ReadMe.md index a78f749e0..6f99a1993 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -166,7 +166,7 @@ Games: - Sub-GHz -> Long press OK button in Sub-GHz Frequency analyzer to switch to Read menu [(by derskythe)](https://github.com/DarkFlippers/unleashed-firmware/pull/79) - Lock device with pin(or regular lock if pin not set) by holding UP button on main screen [(by an4tur0r)](https://github.com/DarkFlippers/unleashed-firmware/pull/107) * SubGHz -> **Hold right in received signal list to delete selected signal** -* SubGHz -> **Custom buttons for Keeloq and Alutech AT4N** - now you can use arrow buttons to send signal with different button code +* SubGHz -> **Custom buttons for Keeloq / Alutech AT4N / Nice Flor S** - now you can use arrow buttons to send signal with different button code * SubGHz -> Debug mode counter increase settings (+5, +10, default: +1) * SubGHz -> Debug PIN output settings for protocol development * Infrared -> Debug TX PIN output settings diff --git a/applications/main/subghz/scenes/subghz_scene_receiver_info.c b/applications/main/subghz/scenes/subghz_scene_receiver_info.c index 4f4924b06..c654ad0c5 100644 --- a/applications/main/subghz/scenes/subghz_scene_receiver_info.c +++ b/applications/main/subghz/scenes/subghz_scene_receiver_info.c @@ -3,6 +3,7 @@ #include #include #include +#include void subghz_scene_receiver_info_callback(GuiButtonType result, InputType type, void* context) { furi_assert(context); @@ -236,6 +237,7 @@ void subghz_scene_receiver_info_on_exit(void* context) { keeloq_reset_kl_type(); keeloq_reset_original_btn(); alutech_reset_original_btn(); + nice_flors_reset_original_btn(); star_line_reset_mfname(); star_line_reset_kl_type(); } diff --git a/applications/main/subghz/scenes/subghz_scene_rpc.c b/applications/main/subghz/scenes/subghz_scene_rpc.c index 0ff801d79..b64f92de2 100644 --- a/applications/main/subghz/scenes/subghz_scene_rpc.c +++ b/applications/main/subghz/scenes/subghz_scene_rpc.c @@ -2,6 +2,7 @@ #include #include #include +#include typedef enum { SubGhzRpcStateIdle, @@ -113,6 +114,7 @@ void subghz_scene_rpc_on_exit(void* context) { keeloq_reset_kl_type(); keeloq_reset_original_btn(); alutech_reset_original_btn(); + nice_flors_reset_original_btn(); star_line_reset_mfname(); star_line_reset_kl_type(); } diff --git a/applications/main/subghz/scenes/subghz_scene_transmitter.c b/applications/main/subghz/scenes/subghz_scene_transmitter.c index 53fc95981..a10e10a37 100644 --- a/applications/main/subghz/scenes/subghz_scene_transmitter.c +++ b/applications/main/subghz/scenes/subghz_scene_transmitter.c @@ -4,6 +4,7 @@ #include #include #include +#include void subghz_scene_transmitter_callback(SubGhzCustomEvent event, void* context) { furi_assert(context); @@ -93,6 +94,7 @@ bool subghz_scene_transmitter_on_event(void* context, SceneManagerEvent event) { if(keeloq_get_custom_btn() != 0) { keeloq_set_btn(0); alutech_set_btn(0); + nice_flors_set_btn(0); uint8_t tmp_counter = furi_hal_subghz_get_rolling_counter_mult(); furi_hal_subghz_set_rolling_counter_mult(0); // Calling restore! @@ -135,6 +137,7 @@ void subghz_scene_transmitter_on_exit(void* context) { keeloq_reset_kl_type(); keeloq_reset_original_btn(); alutech_reset_original_btn(); + nice_flors_reset_original_btn(); star_line_reset_mfname(); star_line_reset_kl_type(); } diff --git a/applications/main/subghz/views/transmitter.c b/applications/main/subghz/views/transmitter.c index 218bf8f7e..5a64f27e2 100644 --- a/applications/main/subghz/views/transmitter.c +++ b/applications/main/subghz/views/transmitter.c @@ -6,6 +6,7 @@ #include #include +#include struct SubGhzViewTransmitter { View* view; @@ -159,6 +160,7 @@ bool subghz_view_transmitter_input(InputEvent* event, void* context) { if(can_be_sent && event->key == InputKeyUp && event->type == InputTypePress) { keeloq_set_btn(1); alutech_set_btn(1); + nice_flors_set_btn(1); with_view_model( subghz_transmitter->view, SubGhzViewTransmitterModel * model, @@ -170,6 +172,10 @@ bool subghz_view_transmitter_input(InputEvent* event, void* context) { } else if(alutech_get_original_btn() != 0) { furi_string_printf(model->temp_button_id, "%01X", alutech_get_original_btn()); model->draw_temp_button = true; + } else if(nice_flors_get_original_btn() != 0) { + furi_string_printf( + model->temp_button_id, "%01X", nice_flors_get_original_btn()); + model->draw_temp_button = true; } }, true); @@ -185,6 +191,7 @@ bool subghz_view_transmitter_input(InputEvent* event, void* context) { if(can_be_sent && event->key == InputKeyDown && event->type == InputTypePress) { keeloq_set_btn(2); alutech_set_btn(2); + nice_flors_set_btn(2); with_view_model( subghz_transmitter->view, SubGhzViewTransmitterModel * model, @@ -196,6 +203,10 @@ bool subghz_view_transmitter_input(InputEvent* event, void* context) { } else if(alutech_get_original_btn() != 0) { furi_string_printf(model->temp_button_id, "%01X", alutech_get_original_btn()); model->draw_temp_button = true; + } else if(nice_flors_get_original_btn() != 0) { + furi_string_printf( + model->temp_button_id, "%01X", nice_flors_get_original_btn()); + model->draw_temp_button = true; } }, true); @@ -211,6 +222,7 @@ bool subghz_view_transmitter_input(InputEvent* event, void* context) { if(can_be_sent && event->key == InputKeyLeft && event->type == InputTypePress) { keeloq_set_btn(3); alutech_set_btn(3); + nice_flors_set_btn(3); with_view_model( subghz_transmitter->view, SubGhzViewTransmitterModel * model, @@ -222,6 +234,10 @@ bool subghz_view_transmitter_input(InputEvent* event, void* context) { } else if(alutech_get_original_btn() != 0) { furi_string_printf(model->temp_button_id, "%01X", alutech_get_original_btn()); model->draw_temp_button = true; + } else if(nice_flors_get_original_btn() != 0) { + furi_string_printf( + model->temp_button_id, "%01X", nice_flors_get_original_btn()); + model->draw_temp_button = true; } }, true); diff --git a/applications/main/unirfremix/unirfremix_app.c b/applications/main/unirfremix/unirfremix_app.c index 81d8ceb1a..4f8d5fa01 100644 --- a/applications/main/unirfremix/unirfremix_app.c +++ b/applications/main/unirfremix/unirfremix_app.c @@ -20,6 +20,7 @@ #include #include #include +#include #define UNIRFMAP_FOLDER "/ext/unirf" #define UNIRFMAP_EXTENSION ".txt" @@ -484,6 +485,7 @@ void unirfremix_tx_stop(UniRFRemix* app) { keeloq_reset_kl_type(); keeloq_reset_original_btn(); alutech_reset_original_btn(); + nice_flors_reset_original_btn(); star_line_reset_mfname(); star_line_reset_kl_type(); } diff --git a/firmware/targets/f7/api_symbols.csv b/firmware/targets/f7/api_symbols.csv index 7dc6378fe..08c95fe1f 100644 --- a/firmware/targets/f7/api_symbols.csv +++ b/firmware/targets/f7/api_symbols.csv @@ -2063,6 +2063,10 @@ Function,-,nfca_get_crc16,uint16_t,"uint8_t*, uint16_t" Function,-,nfca_signal_alloc,NfcaSignal*, Function,-,nfca_signal_encode,void,"NfcaSignal*, uint8_t*, uint16_t, uint8_t*" Function,-,nfca_signal_free,void,NfcaSignal* +Function,-,nice_flors_get_custom_btn,uint8_t, +Function,-,nice_flors_get_original_btn,uint8_t, +Function,-,nice_flors_reset_original_btn,void, +Function,-,nice_flors_set_btn,void,uint8_t Function,+,notification_internal_message,void,"NotificationApp*, const NotificationSequence*" Function,+,notification_internal_message_block,void,"NotificationApp*, const NotificationSequence*" Function,+,notification_message,void,"NotificationApp*, const NotificationSequence*" diff --git a/lib/subghz/protocols/nice_flor_s.c b/lib/subghz/protocols/nice_flor_s.c index 5120573f0..f58c6084f 100644 --- a/lib/subghz/protocols/nice_flor_s.c +++ b/lib/subghz/protocols/nice_flor_s.c @@ -84,6 +84,25 @@ const SubGhzProtocol subghz_protocol_nice_flor_s = { .encoder = &subghz_protocol_nice_flor_s_encoder, }; +static uint8_t n_btn_temp_id; +static uint8_t n_btn_temp_id_original; + +void nice_flors_set_btn(uint8_t b) { + n_btn_temp_id = b; +} + +uint8_t nice_flors_get_original_btn() { + return n_btn_temp_id_original; +} + +uint8_t nice_flors_get_custom_btn() { + return n_btn_temp_id; +} + +void nice_flors_reset_original_btn() { + n_btn_temp_id_original = 0; +} + static void subghz_protocol_nice_flor_s_remote_controller( SubGhzBlockGeneric* instance, const char* file_name); @@ -128,6 +147,74 @@ static void subghz_protocol_encoder_nice_flor_s_get_upload( size_t index = 0; btn = instance->generic.btn; + // Save original button for later use + if(n_btn_temp_id_original == 0) { + n_btn_temp_id_original = btn; + } + + // Set custom button + if(n_btn_temp_id == 1) { + switch(n_btn_temp_id_original) { + case 0x1: + btn = 0x2; + break; + case 0x2: + btn = 0x1; + break; + case 0x4: + btn = 0x1; + break; + case 0x8: + btn = 0x1; + break; + + default: + break; + } + } + if(n_btn_temp_id == 2) { + switch(n_btn_temp_id_original) { + case 0x1: + btn = 0x4; + break; + case 0x2: + btn = 0x4; + break; + case 0x4: + btn = 0x2; + break; + case 0x8: + btn = 0x4; + break; + + default: + break; + } + } + if(n_btn_temp_id == 3) { + switch(n_btn_temp_id_original) { + case 0x1: + btn = 0x8; + break; + case 0x2: + btn = 0x8; + break; + case 0x4: + btn = 0x8; + break; + case 0x8: + btn = 0x2; + break; + + default: + break; + } + } + + if((n_btn_temp_id == 0) && (n_btn_temp_id_original != 0)) { + btn = n_btn_temp_id_original; + } + size_t size_upload = ((instance->generic.data_count_bit * 2) + ((37 + 2 + 2) * 2) * 16); if(size_upload > instance->encoder.size_upload) { FURI_LOG_E(TAG, "Size upload exceeds allocated encoder buffer."); @@ -646,6 +733,11 @@ static void subghz_protocol_nice_flor_s_remote_controller( instance->serial = (decrypt >> 16) & 0xFFFFFFF; instance->btn = (decrypt >> 48) & 0xF; } + + // Save original button for later use + if(n_btn_temp_id_original == 0) { + n_btn_temp_id_original = instance->btn; + } } uint8_t subghz_protocol_decoder_nice_flor_s_get_hash_data(void* context) { diff --git a/lib/subghz/protocols/nice_flor_s.h b/lib/subghz/protocols/nice_flor_s.h index e333fc979..52f0ca745 100644 --- a/lib/subghz/protocols/nice_flor_s.h +++ b/lib/subghz/protocols/nice_flor_s.h @@ -11,6 +11,14 @@ extern const SubGhzProtocolDecoder subghz_protocol_nice_flor_s_decoder; extern const SubGhzProtocolEncoder subghz_protocol_nice_flor_s_encoder; extern const SubGhzProtocol subghz_protocol_nice_flor_s; +// Custom buttons +void nice_flors_set_btn(uint8_t b); + +uint8_t nice_flors_get_original_btn(); +uint8_t nice_flors_get_custom_btn(); + +void nice_flors_reset_original_btn(); + /** * Allocate SubGhzProtocolEncoderNiceFlorS. * @param environment Pointer to a SubGhzEnvironment instance From 4439a8373394eb265cf452b49ef11361d251e11a Mon Sep 17 00:00:00 2001 From: Clashlab Date: Mon, 27 Feb 2023 09:19:30 +0100 Subject: [PATCH 386/506] hc_sr04: Improve accuracy by measuring micro-seconds --- applications/plugins/hc_sr04/hc_sr04.c | 27 +++++++++++++------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/applications/plugins/hc_sr04/hc_sr04.c b/applications/plugins/hc_sr04/hc_sr04.c index dbbf4f3ec..3cb9e72d6 100644 --- a/applications/plugins/hc_sr04/hc_sr04.c +++ b/applications/plugins/hc_sr04/hc_sr04.c @@ -3,6 +3,7 @@ // Ported and modified by @xMasterX #include +#include #include #include #include @@ -26,7 +27,7 @@ typedef struct { NotificationApp* notification; bool have_5v; bool measurement_made; - uint32_t echo; // ms + uint32_t echo; // us float distance; // meters } PluginState; @@ -72,7 +73,7 @@ static void render_callback(Canvas* const canvas, void* ctx) { FuriString* str_buf; str_buf = furi_string_alloc(); - furi_string_printf(str_buf, "Echo: %ld ms", plugin_state->echo); + furi_string_printf(str_buf, "Echo: %ld us", plugin_state->echo); canvas_draw_str_aligned( canvas, 8, 38, AlignLeft, AlignTop, furi_string_get_cstr(str_buf)); @@ -110,9 +111,11 @@ static void hc_sr04_state_init(PluginState* const plugin_state) { } } -float hc_sr04_ms_to_m(uint32_t ms) { - const float speed_sound_m_per_s = 343.0f; - const float time_s = ms / 1e3f; +float hc_sr04_us_to_m(uint32_t us) { + //speed of sound for 20°C, 50% relative humidity + //331.3 + 20 * 0.606 + 50 * 0.0124 = 0.034404 + const float speed_sound_m_per_s = 344.04f; + const float time_s = us / 1e6f; const float total_dist = time_s * speed_sound_m_per_s; return total_dist / 2.0f; } @@ -147,10 +150,6 @@ static void hc_sr04_measure(PluginState* const plugin_state) { furi_delay_ms(10); furi_hal_gpio_write(&gpio_usart_tx, false); - // TODO change from furi_get_tick(), which returns ms, - // to DWT->CYCCNT, which is a more precise counter with - // us precision (see furi_hal_cortex_delay_us) - const uint32_t start = furi_get_tick(); while(furi_get_tick() - start < timeout_ms && furi_hal_gpio_read(&gpio_usart_rx)) @@ -158,16 +157,16 @@ static void hc_sr04_measure(PluginState* const plugin_state) { while(furi_get_tick() - start < timeout_ms && !furi_hal_gpio_read(&gpio_usart_rx)) ; - const uint32_t pulse_start = furi_get_tick(); + const uint32_t pulse_start = DWT->CYCCNT; while(furi_get_tick() - start < timeout_ms && furi_hal_gpio_read(&gpio_usart_rx)) ; + const uint32_t pulse_end = DWT->CYCCNT; - const uint32_t pulse_end = furi_get_tick(); //FURI_CRITICAL_EXIT(); - plugin_state->echo = pulse_end - pulse_start; - plugin_state->distance = hc_sr04_ms_to_m(pulse_end - pulse_start); + plugin_state->echo = (pulse_end - pulse_start) / furi_hal_cortex_instructions_per_microsecond(); + plugin_state->distance = hc_sr04_us_to_m(plugin_state->echo); plugin_state->measurement_made = true; //furi_hal_light_set(LightRed, 0x00); @@ -270,4 +269,4 @@ int32_t hc_sr04_app() { delete_mutex(&state_mutex); return 0; -} \ No newline at end of file +} From e6d1bcc42126ec2f0aa7df3811a2aa98caec0eef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=82=E3=81=8F?= Date: Mon, 27 Feb 2023 22:33:45 +0900 Subject: [PATCH 387/506] Plugins: move to designated categories (#2438) --- applications/plugins/dap_link/application.fam | 2 +- applications/plugins/hid_app/application.fam | 8 ++++---- applications/plugins/music_player/application.fam | 2 +- applications/plugins/nfc_magic/application.fam | 2 +- applications/plugins/signal_generator/application.fam | 2 +- applications/plugins/spi_mem_manager/application.fam | 2 +- applications/plugins/weather_station/application.fam | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/applications/plugins/dap_link/application.fam b/applications/plugins/dap_link/application.fam index 3b99d5ef3..711e4833d 100644 --- a/applications/plugins/dap_link/application.fam +++ b/applications/plugins/dap_link/application.fam @@ -10,7 +10,7 @@ App( stack_size=4 * 1024, order=20, fap_icon="dap_link.png", - fap_category="Tools", + fap_category="GPIO", fap_private_libs=[ Lib( name="free-dap", diff --git a/applications/plugins/hid_app/application.fam b/applications/plugins/hid_app/application.fam index b8c13e353..b6e4e3bf8 100644 --- a/applications/plugins/hid_app/application.fam +++ b/applications/plugins/hid_app/application.fam @@ -1,10 +1,10 @@ App( appid="hid_usb", - name="USB Remote", + name="Remote", apptype=FlipperAppType.PLUGIN, entry_point="hid_usb_app", stack_size=1 * 1024, - fap_category="Tools", + fap_category="USB", fap_icon="hid_usb_10px.png", fap_icon_assets="assets", fap_icon_assets_symbol="hid", @@ -13,11 +13,11 @@ App( App( appid="hid_ble", - name="Bluetooth Remote", + name="Remote", apptype=FlipperAppType.PLUGIN, entry_point="hid_ble_app", stack_size=1 * 1024, - fap_category="Tools", + fap_category="Bluetooth", fap_icon="hid_ble_10px.png", fap_icon_assets="assets", fap_icon_assets_symbol="hid", diff --git a/applications/plugins/music_player/application.fam b/applications/plugins/music_player/application.fam index a36988983..c51abf194 100644 --- a/applications/plugins/music_player/application.fam +++ b/applications/plugins/music_player/application.fam @@ -12,7 +12,7 @@ App( stack_size=2 * 1024, order=20, fap_icon="icons/music_10px.png", - fap_category="Misc", + fap_category="Media", fap_icon_assets="icons", ) diff --git a/applications/plugins/nfc_magic/application.fam b/applications/plugins/nfc_magic/application.fam index bf42681ca..a89b45d00 100644 --- a/applications/plugins/nfc_magic/application.fam +++ b/applications/plugins/nfc_magic/application.fam @@ -11,7 +11,7 @@ App( stack_size=4 * 1024, order=30, fap_icon="../../../assets/icons/Archive/125_10px.png", - fap_category="Tools", + fap_category="NFC", fap_private_libs=[ Lib( name="magic", diff --git a/applications/plugins/signal_generator/application.fam b/applications/plugins/signal_generator/application.fam index de915733c..60f8deffb 100644 --- a/applications/plugins/signal_generator/application.fam +++ b/applications/plugins/signal_generator/application.fam @@ -8,6 +8,6 @@ App( stack_size=1 * 1024, order=50, fap_icon="signal_gen_10px.png", - fap_category="Tools", + fap_category="GPIO", fap_icon_assets="icons", ) diff --git a/applications/plugins/spi_mem_manager/application.fam b/applications/plugins/spi_mem_manager/application.fam index 09d801876..c1b10bfee 100644 --- a/applications/plugins/spi_mem_manager/application.fam +++ b/applications/plugins/spi_mem_manager/application.fam @@ -7,7 +7,7 @@ App( stack_size=1 * 2048, order=30, fap_icon="images/Dip8_10px.png", - fap_category="Tools", + fap_category="GPIO", fap_icon_assets="images", fap_private_libs=[ Lib( diff --git a/applications/plugins/weather_station/application.fam b/applications/plugins/weather_station/application.fam index 769b6dd27..935f92573 100644 --- a/applications/plugins/weather_station/application.fam +++ b/applications/plugins/weather_station/application.fam @@ -9,6 +9,6 @@ App( stack_size=4 * 1024, order=50, fap_icon="weather_station_10px.png", - fap_category="Tools", + fap_category="Sub-GHz", fap_icon_assets="images", ) From 9ae58f5462b1a4d8efba88e0ac24cd1fff83ede6 Mon Sep 17 00:00:00 2001 From: Nikolay Minaylov Date: Mon, 27 Feb 2023 17:04:14 +0300 Subject: [PATCH 388/506] [FL-3116, FL-3136] BadUSB UI fixes (#2439) --- applications/main/bad_usb/bad_usb_app.c | 8 +++---- .../main/bad_usb/scenes/bad_usb_scene_work.c | 4 +++- .../main/bad_usb/views/bad_usb_view.c | 23 +++++++++++++++---- .../main/bad_usb/views/bad_usb_view.h | 2 ++ 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/applications/main/bad_usb/bad_usb_app.c b/applications/main/bad_usb/bad_usb_app.c index 1b2495791..ea97c4487 100644 --- a/applications/main/bad_usb/bad_usb_app.c +++ b/applications/main/bad_usb/bad_usb_app.c @@ -142,10 +142,6 @@ void bad_usb_app_free(BadUsbApp* app) { app->bad_usb_script = NULL; } - if(app->usb_if_prev) { - furi_check(furi_hal_usb_set_config(app->usb_if_prev, NULL)); - } - // Views view_dispatcher_remove_view(app->view_dispatcher, BadUsbAppViewWork); bad_usb_free(app->bad_usb_view); @@ -172,6 +168,10 @@ void bad_usb_app_free(BadUsbApp* app) { furi_string_free(app->file_path); furi_string_free(app->keyboard_layout); + if(app->usb_if_prev) { + furi_check(furi_hal_usb_set_config(app->usb_if_prev, NULL)); + } + free(app); } diff --git a/applications/main/bad_usb/scenes/bad_usb_scene_work.c b/applications/main/bad_usb/scenes/bad_usb_scene_work.c index 187b83bd9..6f2b82693 100644 --- a/applications/main/bad_usb/scenes/bad_usb_scene_work.c +++ b/applications/main/bad_usb/scenes/bad_usb_scene_work.c @@ -16,7 +16,9 @@ bool bad_usb_scene_work_on_event(void* context, SceneManagerEvent event) { if(event.type == SceneManagerEventTypeCustom) { if(event.event == InputKeyLeft) { - scene_manager_next_scene(app->scene_manager, BadUsbSceneConfig); + if(bad_usb_is_idle_state(app->bad_usb_view)) { + scene_manager_next_scene(app->scene_manager, BadUsbSceneConfig); + } consumed = true; } else if(event.event == InputKeyOk) { bad_usb_script_toggle(app->bad_usb_script); diff --git a/applications/main/bad_usb/views/bad_usb_view.c b/applications/main/bad_usb/views/bad_usb_view.c index bb9dc3b7e..9ee9dc341 100644 --- a/applications/main/bad_usb/views/bad_usb_view.c +++ b/applications/main/bad_usb/views/bad_usb_view.c @@ -48,17 +48,13 @@ static void bad_usb_draw_callback(Canvas* canvas, void* _model) { if((model->state.state == BadUsbStateIdle) || (model->state.state == BadUsbStateDone) || (model->state.state == BadUsbStateNotConnected)) { elements_button_center(canvas, "Run"); + elements_button_left(canvas, "Config"); } else if((model->state.state == BadUsbStateRunning) || (model->state.state == BadUsbStateDelay)) { elements_button_center(canvas, "Stop"); } else if(model->state.state == BadUsbStateWillRun) { elements_button_center(canvas, "Cancel"); } - if((model->state.state == BadUsbStateNotConnected) || - (model->state.state == BadUsbStateIdle) || (model->state.state == BadUsbStateDone)) { - elements_button_left(canvas, "Config"); - } - if(model->state.state == BadUsbStateNotConnected) { canvas_draw_icon(canvas, 4, 26, &I_Clock_18x18); canvas_set_font(canvas, FontPrimary); @@ -203,6 +199,7 @@ void bad_usb_set_layout(BadUsb* bad_usb, const char* layout) { { strlcpy(model->layout, layout, MAX_NAME_LEN); }, true); } + void bad_usb_set_state(BadUsb* bad_usb, BadUsbState* st) { furi_assert(st); with_view_model( @@ -214,3 +211,19 @@ void bad_usb_set_state(BadUsb* bad_usb, BadUsbState* st) { }, true); } + +bool bad_usb_is_idle_state(BadUsb* bad_usb) { + bool is_idle = false; + with_view_model( + bad_usb->view, + BadUsbModel * model, + { + if((model->state.state == BadUsbStateIdle) || + (model->state.state == BadUsbStateDone) || + (model->state.state == BadUsbStateNotConnected)) { + is_idle = true; + } + }, + false); + return is_idle; +} diff --git a/applications/main/bad_usb/views/bad_usb_view.h b/applications/main/bad_usb/views/bad_usb_view.h index 8447fb055..2fc01688a 100644 --- a/applications/main/bad_usb/views/bad_usb_view.h +++ b/applications/main/bad_usb/views/bad_usb_view.h @@ -19,3 +19,5 @@ void bad_usb_set_file_name(BadUsb* bad_usb, const char* name); void bad_usb_set_layout(BadUsb* bad_usb, const char* layout); void bad_usb_set_state(BadUsb* bad_usb, BadUsbState* st); + +bool bad_usb_is_idle_state(BadUsb* bad_usb); From 007447cc614eb4a0a03cd3be66bfc2d8e1f2d70c Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Mon, 27 Feb 2023 19:12:48 +0000 Subject: [PATCH 389/506] Add experimental dark mode setting --- .../xtreme_app/scenes/xtreme_app_scene_misc.c | 22 +++++++++++++++++-- applications/services/gui/canvas.c | 14 +++++++++++- applications/services/xtreme/settings.c | 3 ++- applications/services/xtreme/settings.h | 5 +++-- firmware/targets/f7/api_symbols.csv | 1 + lib/u8g2/u8g2.h | 1 + lib/u8g2/u8g2_buffer.c | 8 +++++++ 7 files changed, 48 insertions(+), 6 deletions(-) diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_misc.c b/applications/main/xtreme_app/scenes/xtreme_app_scene_misc.c index c9b5e9d5e..83608c0bd 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_misc.c +++ b/applications/main/xtreme_app/scenes/xtreme_app_scene_misc.c @@ -2,6 +2,7 @@ enum VarItemListIndex { VarItemListIndexSortDirsFirst, + VarItemListIndexDarkMode, VarItemListIndexChangeDeviceName, }; @@ -10,7 +11,7 @@ void xtreme_app_scene_misc_var_item_list_callback(void* context, uint32_t index) view_dispatcher_send_custom_event(app->view_dispatcher, index); } -static void xtreme_app_scene_misc_sort_folders_before_changed(VariableItem* item) { +static void xtreme_app_scene_misc_sort_dirs_first_changed(VariableItem* item) { XtremeApp* app = variable_item_get_context(item); bool value = variable_item_get_current_value_index(item); variable_item_set_current_value_text(item, value ? "ON" : "OFF"); @@ -18,6 +19,14 @@ static void xtreme_app_scene_misc_sort_folders_before_changed(VariableItem* item app->save_settings = true; } +static void xtreme_app_scene_misc_dark_mode_changed(VariableItem* item) { + XtremeApp* app = variable_item_get_context(item); + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "ON" : "OFF"); + XTREME_SETTINGS()->dark_mode = value; + app->save_settings = true; +} + void xtreme_app_scene_misc_on_enter(void* context) { XtremeApp* app = context; XtremeSettings* xtreme_settings = XTREME_SETTINGS(); @@ -28,11 +37,20 @@ void xtreme_app_scene_misc_on_enter(void* context) { var_item_list, "Sort Dirs First", 2, - xtreme_app_scene_misc_sort_folders_before_changed, + xtreme_app_scene_misc_sort_dirs_first_changed, app); variable_item_set_current_value_index(item, xtreme_settings->sort_dirs_first); variable_item_set_current_value_text(item, xtreme_settings->sort_dirs_first ? "ON" : "OFF"); + item = variable_item_list_add( + var_item_list, + "Dark Mode (Exp.)", + 2, + xtreme_app_scene_misc_dark_mode_changed, + app); + variable_item_set_current_value_index(item, xtreme_settings->dark_mode); + variable_item_set_current_value_text(item, xtreme_settings->dark_mode ? "ON" : "OFF"); + variable_item_list_add(var_item_list, "Change Device Name", 0, NULL, app); variable_item_list_set_enter_callback( diff --git a/applications/services/gui/canvas.c b/applications/services/gui/canvas.c index ee472138e..47366e2a2 100644 --- a/applications/services/gui/canvas.c +++ b/applications/services/gui/canvas.c @@ -6,6 +6,7 @@ #include #include #include +#include const CanvasFontParameters canvas_font_params[FontTotalNumber] = { [FontPrimary] = {.leading_default = 12, .leading_min = 11, .height = 8, .descender = 2}, @@ -105,11 +106,22 @@ CanvasFontParameters* canvas_get_font_params(Canvas* canvas, Font font) { void canvas_clear(Canvas* canvas) { furi_assert(canvas); - u8g2_ClearBuffer(&canvas->fb); + if(XTREME_SETTINGS()->dark_mode) { + u8g2_FillBuffer(&canvas->fb); + } else { + u8g2_ClearBuffer(&canvas->fb); + } } void canvas_set_color(Canvas* canvas, Color color) { furi_assert(canvas); + if(XTREME_SETTINGS()->dark_mode) { + if(color == ColorBlack) { + color = ColorWhite; + } else if(color == ColorWhite) { + color = ColorBlack; + } + } u8g2_SetDrawColor(&canvas->fb, color); } diff --git a/applications/services/xtreme/settings.c b/applications/services/xtreme/settings.c index 05d0892dd..cb9e1bb2b 100644 --- a/applications/services/xtreme/settings.c +++ b/applications/services/xtreme/settings.c @@ -39,8 +39,9 @@ void XTREME_SETTINGS_LOAD() { xtreme_settings->bar_borders = true; // ON xtreme_settings->bar_background = false; // OFF xtreme_settings->bad_bt = false; // USB - xtreme_settings->sort_dirs_first = true; // ON xtreme_settings->butthurt_timer = 43200; // 12 H + xtreme_settings->sort_dirs_first = true; // ON + xtreme_settings->dark_mode = false; // OFF } } } diff --git a/applications/services/xtreme/settings.h b/applications/services/xtreme/settings.h index 44ad37abf..f1ddfd9a6 100644 --- a/applications/services/xtreme/settings.h +++ b/applications/services/xtreme/settings.h @@ -11,7 +11,7 @@ #define MAX_PACK_NAME_LEN 32 -#define XTREME_SETTINGS_VERSION (3) +#define XTREME_SETTINGS_VERSION (4) #define XTREME_SETTINGS_PATH INT_PATH(XTREME_SETTINGS_FILE_NAME) #define XTREME_SETTINGS_MAGIC (0x69) @@ -28,8 +28,9 @@ typedef struct { bool bar_borders; bool bar_background; bool bad_bt; - bool sort_dirs_first; int32_t butthurt_timer; + bool sort_dirs_first; + bool dark_mode; } XtremeSettings; XtremeSettings* XTREME_SETTINGS(); diff --git a/firmware/targets/f7/api_symbols.csv b/firmware/targets/f7/api_symbols.csv index 2db05fc50..7d2804b3b 100644 --- a/firmware/targets/f7/api_symbols.csv +++ b/firmware/targets/f7/api_symbols.csv @@ -3431,6 +3431,7 @@ Function,-,u8g2_DrawUTF8Lines,u8g2_uint_t,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8 Function,-,u8g2_DrawVLine,void,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t" Function,-,u8g2_DrawXBM,void,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, const uint8_t*" Function,-,u8g2_DrawXBMP,void,"u8g2_t*, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, u8g2_uint_t, const uint8_t*" +Function,-,u8g2_FillBuffer,void,u8g2_t* Function,-,u8g2_FirstPage,void,u8g2_t* Function,-,u8g2_GetFontSize,size_t,const uint8_t* Function,-,u8g2_GetGlyphWidth,int8_t,"u8g2_t*, uint16_t" diff --git a/lib/u8g2/u8g2.h b/lib/u8g2/u8g2.h index 68611d482..0068ea61d 100644 --- a/lib/u8g2/u8g2.h +++ b/lib/u8g2/u8g2.h @@ -3548,6 +3548,7 @@ void u8g2_Setup_a2printer_384x240_f( void u8g2_SendBuffer(u8g2_t* u8g2); void u8g2_ClearBuffer(u8g2_t* u8g2); +void u8g2_FillBuffer(u8g2_t* u8g2); void u8g2_SetBufferCurrTileRow(u8g2_t* u8g2, uint8_t row) U8G2_NOINLINE; diff --git a/lib/u8g2/u8g2_buffer.c b/lib/u8g2/u8g2_buffer.c index 45855bd5d..06686b79b 100644 --- a/lib/u8g2/u8g2_buffer.c +++ b/lib/u8g2/u8g2_buffer.c @@ -45,6 +45,14 @@ void u8g2_ClearBuffer(u8g2_t* u8g2) { memset(u8g2->tile_buf_ptr, 0, cnt); } +void u8g2_FillBuffer(u8g2_t* u8g2) { + size_t cnt; + cnt = u8g2_GetU8x8(u8g2)->display_info->tile_width; + cnt *= u8g2->tile_buf_height; + cnt *= 8; + memset(u8g2->tile_buf_ptr, 255, cnt); +} + /*============================================*/ static void u8g2_send_tile_row(u8g2_t* u8g2, uint8_t src_tile_row, uint8_t dest_tile_row) { From b7d4b1c73d9bd1d1c3f1f3e5d968ff86db7ff570 Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Mon, 27 Feb 2023 19:15:29 +0000 Subject: [PATCH 390/506] Fix asset packer encoding --- scripts/asset_packer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/asset_packer.py b/scripts/asset_packer.py index cc28ee540..d7e309b0d 100755 --- a/scripts/asset_packer.py +++ b/scripts/asset_packer.py @@ -30,7 +30,7 @@ def convert_bm(img: "Image.Image | pathlib.Path") -> bytes: data_enc = bytearray(data_encoded_str) data_enc = bytearray([len(data_enc) & 0xFF, len(data_enc) >> 8]) + data_enc - if len(data_enc) < len(data_bin) + 1: + if len(data_enc) + 2 < len(data_bin) + 1: return b"\x01\x00" + data_enc else: return b"\x00" + data_bin From 14ed0e24b191cbf06b427c114aa6d690ef0d4661 Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Mon, 27 Feb 2023 19:16:45 +0000 Subject: [PATCH 391/506] Format --- .../main/xtreme_app/scenes/xtreme_app_scene_misc.c | 12 ++---------- .../plugins/barcode_generator/application.fam | 2 +- applications/plugins/protoview/application.fam | 2 +- applications/plugins/swd_probe/application.fam | 2 +- scripts/asset_packer.py | 8 ++++++-- 5 files changed, 11 insertions(+), 15 deletions(-) diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_misc.c b/applications/main/xtreme_app/scenes/xtreme_app_scene_misc.c index 83608c0bd..54ad0371e 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_misc.c +++ b/applications/main/xtreme_app/scenes/xtreme_app_scene_misc.c @@ -34,20 +34,12 @@ void xtreme_app_scene_misc_on_enter(void* context) { VariableItem* item; item = variable_item_list_add( - var_item_list, - "Sort Dirs First", - 2, - xtreme_app_scene_misc_sort_dirs_first_changed, - app); + var_item_list, "Sort Dirs First", 2, xtreme_app_scene_misc_sort_dirs_first_changed, app); variable_item_set_current_value_index(item, xtreme_settings->sort_dirs_first); variable_item_set_current_value_text(item, xtreme_settings->sort_dirs_first ? "ON" : "OFF"); item = variable_item_list_add( - var_item_list, - "Dark Mode (Exp.)", - 2, - xtreme_app_scene_misc_dark_mode_changed, - app); + var_item_list, "Dark Mode (Exp.)", 2, xtreme_app_scene_misc_dark_mode_changed, app); variable_item_set_current_value_index(item, xtreme_settings->dark_mode); variable_item_set_current_value_text(item, xtreme_settings->dark_mode ? "ON" : "OFF"); diff --git a/applications/plugins/barcode_generator/application.fam b/applications/plugins/barcode_generator/application.fam index d2d7c4b96..a02255334 100644 --- a/applications/plugins/barcode_generator/application.fam +++ b/applications/plugins/barcode_generator/application.fam @@ -12,4 +12,4 @@ App( order=50, fap_icon="barcode_10px.png", fap_category="Misc", -) \ No newline at end of file +) diff --git a/applications/plugins/protoview/application.fam b/applications/plugins/protoview/application.fam index 6cd31372e..d3614524c 100644 --- a/applications/plugins/protoview/application.fam +++ b/applications/plugins/protoview/application.fam @@ -5,7 +5,7 @@ App( entry_point="protoview_app_entry", cdefines=["APP_PROTOVIEW"], requires=["gui"], - stack_size=8*1024, + stack_size=8 * 1024, order=50, fap_icon="appicon.png", fap_category="Tools", diff --git a/applications/plugins/swd_probe/application.fam b/applications/plugins/swd_probe/application.fam index 64140d130..9720e485f 100644 --- a/applications/plugins/swd_probe/application.fam +++ b/applications/plugins/swd_probe/application.fam @@ -9,5 +9,5 @@ App( order=10, fap_icon="icons/app.png", fap_category="Tools", - fap_icon_assets="icons" + fap_icon_assets="icons", ) diff --git a/scripts/asset_packer.py b/scripts/asset_packer.py index d7e309b0d..ebf52c4a1 100755 --- a/scripts/asset_packer.py +++ b/scripts/asset_packer.py @@ -124,12 +124,16 @@ def pack( continue for icon in icons.iterdir(): if icon.is_dir(): - logger(f"Compile: icon for pack '{source.name}': {icons.name}/{icon.name}") + logger( + f"Compile: icon for pack '{source.name}': {icons.name}/{icon.name}" + ) pack_icon_animated( icon, packed / "Icons" / icons.name / icon.name ) elif icon.is_file(): - logger(f"Compile: icon for pack '{source.name}': {icons.name}/{icon.name}") + logger( + f"Compile: icon for pack '{source.name}': {icons.name}/{icon.name}" + ) pack_icon_static( icon, packed / "Icons" / icons.name / icon.name ) From 4b84b71373fb1cb9b87f47ff2c8cff46d2d082b3 Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Mon, 27 Feb 2023 19:33:44 +0000 Subject: [PATCH 392/506] Change darkmode setting name --- applications/main/xtreme_app/scenes/xtreme_app_scene_misc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_misc.c b/applications/main/xtreme_app/scenes/xtreme_app_scene_misc.c index 54ad0371e..22b5fb1b0 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_misc.c +++ b/applications/main/xtreme_app/scenes/xtreme_app_scene_misc.c @@ -39,7 +39,7 @@ void xtreme_app_scene_misc_on_enter(void* context) { variable_item_set_current_value_text(item, xtreme_settings->sort_dirs_first ? "ON" : "OFF"); item = variable_item_list_add( - var_item_list, "Dark Mode (Exp.)", 2, xtreme_app_scene_misc_dark_mode_changed, app); + var_item_list, "Exp. Dark Mode", 2, xtreme_app_scene_misc_dark_mode_changed, app); variable_item_set_current_value_index(item, xtreme_settings->dark_mode); variable_item_set_current_value_text(item, xtreme_settings->dark_mode ? "ON" : "OFF"); From dbfc57bfd3d09b5273ab4e2ff14f701b155a3dad Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Mon, 27 Feb 2023 19:39:40 +0000 Subject: [PATCH 393/506] More steps for LCD brightness --- .../notification_settings_app.c | 40 +++++++++++++++++-- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/applications/settings/notification_settings/notification_settings_app.c b/applications/settings/notification_settings/notification_settings_app.c index db9a1a01f..fdd257c18 100644 --- a/applications/settings/notification_settings/notification_settings_app.c +++ b/applications/settings/notification_settings/notification_settings_app.c @@ -20,20 +20,52 @@ static const NotificationSequence sequence_note_c = { NULL, }; -#define BACKLIGHT_COUNT 5 +#define BACKLIGHT_COUNT 21 const char* const backlight_text[BACKLIGHT_COUNT] = { "0%", + "5%", + "10%", + "15%", + "20%", "25%", + "30%", + "35%", + "40%", + "45%", "50%", + "55%", + "60%", + "65%", + "70%", "75%", + "80%", + "85%", + "90%", + "95%", "100%", }; const float backlight_value[BACKLIGHT_COUNT] = { - 0.0f, + 0.00f, + 0.05f, + 0.10f, + 0.15f, + 0.20f, 0.25f, - 0.5f, + 0.30f, + 0.35f, + 0.40f, + 0.45f, + 0.50f, + 0.55f, + 0.60f, + 0.65f, + 0.70f, 0.75f, - 1.0f, + 0.80f, + 0.85f, + 0.90f, + 0.95f, + 1.00f, }; #define VOLUME_COUNT 5 From 568176d775a7a23535c290cc7512d1f45a71df16 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Mon, 27 Feb 2023 23:13:52 +0300 Subject: [PATCH 394/506] App categories --- applications/plugins/metronome/application.fam | 2 +- applications/plugins/morse_code/application.fam | 2 +- applications/plugins/music_player/application.fam | 2 +- applications/plugins/nfc_magic/application.fam | 2 +- applications/plugins/playlist/application.fam | 2 +- applications/plugins/pocsag_pager/application.fam | 2 +- applications/plugins/protoview/application.fam | 2 +- applications/plugins/spectrum_analyzer/application.fam | 2 +- applications/plugins/subbrute | 2 +- applications/plugins/swd_probe/application.fam | 2 +- applications/plugins/wav_player/application.fam | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/applications/plugins/metronome/application.fam b/applications/plugins/metronome/application.fam index 32588d06e..a3435fd77 100644 --- a/applications/plugins/metronome/application.fam +++ b/applications/plugins/metronome/application.fam @@ -8,7 +8,7 @@ App( "gui", ], fap_icon="metronome_icon.png", - fap_category="Music", + fap_category="Media", fap_icon_assets="images", stack_size=2 * 1024, order=20, diff --git a/applications/plugins/morse_code/application.fam b/applications/plugins/morse_code/application.fam index 47a986233..16a52fbd5 100644 --- a/applications/plugins/morse_code/application.fam +++ b/applications/plugins/morse_code/application.fam @@ -10,6 +10,6 @@ App( stack_size=1 * 1024, order=20, fap_icon="morse_code_10px.png", - fap_category="Music" + fap_category="Media" ) \ No newline at end of file diff --git a/applications/plugins/music_player/application.fam b/applications/plugins/music_player/application.fam index 74f6f6d5d..b8bd75198 100644 --- a/applications/plugins/music_player/application.fam +++ b/applications/plugins/music_player/application.fam @@ -13,7 +13,7 @@ App( order=20, fap_icon="icons/music_10px.png", fap_icon_assets="icons", - fap_category="Music", + fap_category="Media", ) App( diff --git a/applications/plugins/nfc_magic/application.fam b/applications/plugins/nfc_magic/application.fam index 717387d58..db0af81d4 100644 --- a/applications/plugins/nfc_magic/application.fam +++ b/applications/plugins/nfc_magic/application.fam @@ -11,7 +11,7 @@ App( stack_size=4 * 1024, order=30, fap_icon="../../../assets/icons/Archive/Nfc_10px.png", - fap_category="NFC", + fap_category="Tools", fap_private_libs=[ Lib( name="magic", diff --git a/applications/plugins/playlist/application.fam b/applications/plugins/playlist/application.fam index fda109dab..06357e24b 100644 --- a/applications/plugins/playlist/application.fam +++ b/applications/plugins/playlist/application.fam @@ -8,6 +8,6 @@ App( stack_size=2 * 1024, order=14, fap_icon="playlist_10px.png", - fap_category="Tools", + fap_category="Sub-GHz", fap_icon_assets="images", ) diff --git a/applications/plugins/pocsag_pager/application.fam b/applications/plugins/pocsag_pager/application.fam index aafb6a5a3..86f8d528b 100644 --- a/applications/plugins/pocsag_pager/application.fam +++ b/applications/plugins/pocsag_pager/application.fam @@ -8,6 +8,6 @@ App( stack_size=4 * 1024, order=50, fap_icon="pocsag_pager_10px.png", - fap_category="Tools", + fap_category="Sub-GHz", fap_icon_assets="images", ) diff --git a/applications/plugins/protoview/application.fam b/applications/plugins/protoview/application.fam index 6cd31372e..234a00bc6 100644 --- a/applications/plugins/protoview/application.fam +++ b/applications/plugins/protoview/application.fam @@ -8,5 +8,5 @@ App( stack_size=8*1024, order=50, fap_icon="appicon.png", - fap_category="Tools", + fap_category="Sub-GHz", ) diff --git a/applications/plugins/spectrum_analyzer/application.fam b/applications/plugins/spectrum_analyzer/application.fam index 04bb946ee..344c2244f 100644 --- a/applications/plugins/spectrum_analyzer/application.fam +++ b/applications/plugins/spectrum_analyzer/application.fam @@ -8,5 +8,5 @@ App( stack_size=2 * 1024, order=12, fap_icon="spectrum_10px.png", - fap_category="Tools", + fap_category="Sub-GHz", ) diff --git a/applications/plugins/subbrute b/applications/plugins/subbrute index 819b53293..7cdb9e138 160000 --- a/applications/plugins/subbrute +++ b/applications/plugins/subbrute @@ -1 +1 @@ -Subproject commit 819b532937b8920504cd54385e25389c199285f9 +Subproject commit 7cdb9e1386778ad7351f7e3b3389980afaeafea3 diff --git a/applications/plugins/swd_probe/application.fam b/applications/plugins/swd_probe/application.fam index 64140d130..c24813ed9 100644 --- a/applications/plugins/swd_probe/application.fam +++ b/applications/plugins/swd_probe/application.fam @@ -8,6 +8,6 @@ App( stack_size=2 * 1024, order=10, fap_icon="icons/app.png", - fap_category="Tools", + fap_category="GPIO", fap_icon_assets="icons" ) diff --git a/applications/plugins/wav_player/application.fam b/applications/plugins/wav_player/application.fam index 4040ed159..6ab832d03 100644 --- a/applications/plugins/wav_player/application.fam +++ b/applications/plugins/wav_player/application.fam @@ -7,6 +7,6 @@ App( stack_size=4 * 1024, order=46, fap_icon="wav_10px.png", - fap_category="Music", + fap_category="Media", fap_icon_assets="images", ) From 2c95a7cba4b4ee32045e09354b8fb833af3939fe Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Tue, 28 Feb 2023 00:02:30 +0300 Subject: [PATCH 395/506] Somfy Telis - Custom buttons + Prog mode --- CHANGELOG.md | 3 +- ReadMe.md | 5 +- .../scenes/subghz_scene_receiver_info.c | 2 + .../main/subghz/scenes/subghz_scene_rpc.c | 2 + .../subghz/scenes/subghz_scene_transmitter.c | 3 + applications/main/subghz/views/transmitter.c | 16 +++ applications/main/unirfremix/unirfremix_app.c | 2 + firmware/targets/f7/api_symbols.csv | 4 + lib/subghz/protocols/somfy_telis.c | 121 ++++++++++++++++-- lib/subghz/protocols/somfy_telis.h | 8 ++ 10 files changed, 153 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6cc844c23..a50bfb1cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ ### New changes -* SubGHz: **Custom buttons for Nice Flor S** - now you can use arrow buttons to send signal with different button code +* SubGHz: **Custom buttons for Nice Flor S / Somfy Telis (+Programming mode)** - now you can use arrow buttons to send signal with different button code +* SubGHz: Somfy Telis -> Add manually (create new remote, now with programming button (Prog / 0x8) you can write it into receiver) * OFW: Drivers: remove excessive check in bq25896 and make PVS happy * OFW: FuriHal, Power, UnitTests: fix, rename battery charging voltage limit API -> **Breaking API change, api was changed from 14.x to 15.x** **(this will make your manually copied plugins not work, update them in same way you installed them, or delete `apps` folder and then install firmware, if you using extra pack builds (with `e` in version) all apps in _Extra will be updated automatically)** diff --git a/ReadMe.md b/ReadMe.md index 6f99a1993..2e9b0327e 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -72,7 +72,7 @@ Encoders/sending made by Eng1n33r & @xMasterX: - CAME Atomo - Nice Flor S - FAAC SLH (Spa) [External seed calculation required (For info contact me in Discord: Nano#8998)] -- BFT Mitto [External seed calculation required (For info contact me in Discord: Nano#8998)] +- Keeloq: BFT Mitto [External seed calculation required (For info contact me in Discord: Nano#8998)] - Security+ v1 & v2 - Star Line @@ -166,7 +166,8 @@ Games: - Sub-GHz -> Long press OK button in Sub-GHz Frequency analyzer to switch to Read menu [(by derskythe)](https://github.com/DarkFlippers/unleashed-firmware/pull/79) - Lock device with pin(or regular lock if pin not set) by holding UP button on main screen [(by an4tur0r)](https://github.com/DarkFlippers/unleashed-firmware/pull/107) * SubGHz -> **Hold right in received signal list to delete selected signal** -* SubGHz -> **Custom buttons for Keeloq / Alutech AT4N / Nice Flor S** - now you can use arrow buttons to send signal with different button code +* SubGHz -> **Custom buttons for Keeloq / Alutech AT4N / Nice Flor S / Somfy Telis** - now you can use arrow buttons to send signal with different button code +* SubGHz -> BFT Mitto / Somfy Telis manual creation with programming new remote into receiver (use button 0xF for BFT Mitto, 0x8 (Prog) on Somfy Telis) * SubGHz -> Debug mode counter increase settings (+5, +10, default: +1) * SubGHz -> Debug PIN output settings for protocol development * Infrared -> Debug TX PIN output settings diff --git a/applications/main/subghz/scenes/subghz_scene_receiver_info.c b/applications/main/subghz/scenes/subghz_scene_receiver_info.c index c654ad0c5..fd28421a8 100644 --- a/applications/main/subghz/scenes/subghz_scene_receiver_info.c +++ b/applications/main/subghz/scenes/subghz_scene_receiver_info.c @@ -4,6 +4,7 @@ #include #include #include +#include void subghz_scene_receiver_info_callback(GuiButtonType result, InputType type, void* context) { furi_assert(context); @@ -238,6 +239,7 @@ void subghz_scene_receiver_info_on_exit(void* context) { keeloq_reset_original_btn(); alutech_reset_original_btn(); nice_flors_reset_original_btn(); + somfy_telis_reset_original_btn(); star_line_reset_mfname(); star_line_reset_kl_type(); } diff --git a/applications/main/subghz/scenes/subghz_scene_rpc.c b/applications/main/subghz/scenes/subghz_scene_rpc.c index b64f92de2..01804492e 100644 --- a/applications/main/subghz/scenes/subghz_scene_rpc.c +++ b/applications/main/subghz/scenes/subghz_scene_rpc.c @@ -3,6 +3,7 @@ #include #include #include +#include typedef enum { SubGhzRpcStateIdle, @@ -115,6 +116,7 @@ void subghz_scene_rpc_on_exit(void* context) { keeloq_reset_original_btn(); alutech_reset_original_btn(); nice_flors_reset_original_btn(); + somfy_telis_reset_original_btn(); star_line_reset_mfname(); star_line_reset_kl_type(); } diff --git a/applications/main/subghz/scenes/subghz_scene_transmitter.c b/applications/main/subghz/scenes/subghz_scene_transmitter.c index a10e10a37..00839170c 100644 --- a/applications/main/subghz/scenes/subghz_scene_transmitter.c +++ b/applications/main/subghz/scenes/subghz_scene_transmitter.c @@ -5,6 +5,7 @@ #include #include #include +#include void subghz_scene_transmitter_callback(SubGhzCustomEvent event, void* context) { furi_assert(context); @@ -95,6 +96,7 @@ bool subghz_scene_transmitter_on_event(void* context, SceneManagerEvent event) { keeloq_set_btn(0); alutech_set_btn(0); nice_flors_set_btn(0); + somfy_telis_set_btn(0); uint8_t tmp_counter = furi_hal_subghz_get_rolling_counter_mult(); furi_hal_subghz_set_rolling_counter_mult(0); // Calling restore! @@ -138,6 +140,7 @@ void subghz_scene_transmitter_on_exit(void* context) { keeloq_reset_original_btn(); alutech_reset_original_btn(); nice_flors_reset_original_btn(); + somfy_telis_reset_original_btn(); star_line_reset_mfname(); star_line_reset_kl_type(); } diff --git a/applications/main/subghz/views/transmitter.c b/applications/main/subghz/views/transmitter.c index 5a64f27e2..e6ed16d81 100644 --- a/applications/main/subghz/views/transmitter.c +++ b/applications/main/subghz/views/transmitter.c @@ -7,6 +7,7 @@ #include #include #include +#include struct SubGhzViewTransmitter { View* view; @@ -161,6 +162,7 @@ bool subghz_view_transmitter_input(InputEvent* event, void* context) { keeloq_set_btn(1); alutech_set_btn(1); nice_flors_set_btn(1); + somfy_telis_set_btn(1); with_view_model( subghz_transmitter->view, SubGhzViewTransmitterModel * model, @@ -176,6 +178,10 @@ bool subghz_view_transmitter_input(InputEvent* event, void* context) { furi_string_printf( model->temp_button_id, "%01X", nice_flors_get_original_btn()); model->draw_temp_button = true; + } else if(somfy_telis_get_original_btn() != 0) { + furi_string_printf( + model->temp_button_id, "%01X", somfy_telis_get_original_btn()); + model->draw_temp_button = true; } }, true); @@ -192,6 +198,7 @@ bool subghz_view_transmitter_input(InputEvent* event, void* context) { keeloq_set_btn(2); alutech_set_btn(2); nice_flors_set_btn(2); + somfy_telis_set_btn(2); with_view_model( subghz_transmitter->view, SubGhzViewTransmitterModel * model, @@ -207,6 +214,10 @@ bool subghz_view_transmitter_input(InputEvent* event, void* context) { furi_string_printf( model->temp_button_id, "%01X", nice_flors_get_original_btn()); model->draw_temp_button = true; + } else if(somfy_telis_get_original_btn() != 0) { + furi_string_printf( + model->temp_button_id, "%01X", somfy_telis_get_original_btn()); + model->draw_temp_button = true; } }, true); @@ -223,6 +234,7 @@ bool subghz_view_transmitter_input(InputEvent* event, void* context) { keeloq_set_btn(3); alutech_set_btn(3); nice_flors_set_btn(3); + somfy_telis_set_btn(3); with_view_model( subghz_transmitter->view, SubGhzViewTransmitterModel * model, @@ -238,6 +250,10 @@ bool subghz_view_transmitter_input(InputEvent* event, void* context) { furi_string_printf( model->temp_button_id, "%01X", nice_flors_get_original_btn()); model->draw_temp_button = true; + } else if(somfy_telis_get_original_btn() != 0) { + furi_string_printf( + model->temp_button_id, "%01X", somfy_telis_get_original_btn()); + model->draw_temp_button = true; } }, true); diff --git a/applications/main/unirfremix/unirfremix_app.c b/applications/main/unirfremix/unirfremix_app.c index 4f8d5fa01..597870f94 100644 --- a/applications/main/unirfremix/unirfremix_app.c +++ b/applications/main/unirfremix/unirfremix_app.c @@ -21,6 +21,7 @@ #include #include #include +#include #define UNIRFMAP_FOLDER "/ext/unirf" #define UNIRFMAP_EXTENSION ".txt" @@ -486,6 +487,7 @@ void unirfremix_tx_stop(UniRFRemix* app) { keeloq_reset_original_btn(); alutech_reset_original_btn(); nice_flors_reset_original_btn(); + somfy_telis_reset_original_btn(); star_line_reset_mfname(); star_line_reset_kl_type(); } diff --git a/firmware/targets/f7/api_symbols.csv b/firmware/targets/f7/api_symbols.csv index 08c95fe1f..17df79bee 100644 --- a/firmware/targets/f7/api_symbols.csv +++ b/firmware/targets/f7/api_symbols.csv @@ -2463,6 +2463,10 @@ Function,-,siprintf,int,"char*, const char*, ..." Function,-,siscanf,int,"const char*, const char*, ..." Function,-,sniprintf,int,"char*, size_t, const char*, ..." Function,+,snprintf,int,"char*, size_t, const char*, ..." +Function,-,somfy_telis_get_custom_btn,uint8_t, +Function,-,somfy_telis_get_original_btn,uint8_t, +Function,-,somfy_telis_reset_original_btn,void, +Function,-,somfy_telis_set_btn,void,uint8_t Function,-,sprintf,int,"char*, const char*, ..." Function,-,sqrt,double,double Function,-,sqrtf,float,float diff --git a/lib/subghz/protocols/somfy_telis.c b/lib/subghz/protocols/somfy_telis.c index 143171a05..5d6b1c6f3 100644 --- a/lib/subghz/protocols/somfy_telis.c +++ b/lib/subghz/protocols/somfy_telis.c @@ -73,6 +73,25 @@ const SubGhzProtocol subghz_protocol_somfy_telis = { .encoder = &subghz_protocol_somfy_telis_encoder, }; +static uint8_t st_btn_temp_id; +static uint8_t st_btn_temp_id_original; + +void somfy_telis_set_btn(uint8_t b) { + st_btn_temp_id = b; +} + +uint8_t somfy_telis_get_original_btn() { + return st_btn_temp_id_original; +} + +uint8_t somfy_telis_get_custom_btn() { + return st_btn_temp_id; +} + +void somfy_telis_reset_original_btn() { + st_btn_temp_id_original = 0; +} + void* subghz_protocol_encoder_somfy_telis_alloc(SubGhzEnvironment* environment) { UNUSED(environment); SubGhzProtocolEncoderSomfyTelis* instance = malloc(sizeof(SubGhzProtocolEncoderSomfyTelis)); @@ -95,13 +114,86 @@ void subghz_protocol_encoder_somfy_telis_free(void* context) { free(instance); } -static bool - subghz_protocol_somfy_telis_gen_data(SubGhzProtocolEncoderSomfyTelis* instance, uint8_t btn) { - UNUSED(btn); +static bool subghz_protocol_somfy_telis_gen_data( + SubGhzProtocolEncoderSomfyTelis* instance, + uint8_t btn, + bool new_remote) { + // If we doing a clone we will use its data uint64_t data = instance->generic.data ^ (instance->generic.data >> 8); - instance->generic.btn = (data >> 44) & 0xF; // ctrl - instance->generic.cnt = (data >> 24) & 0xFFFF; // rolling code - instance->generic.serial = data & 0xFFFFFF; // address + if(!new_remote) { + instance->generic.btn = (data >> 44) & 0xF; // ctrl + btn = instance->generic.btn; + instance->generic.cnt = (data >> 24) & 0xFFFF; // rolling code + instance->generic.serial = data & 0xFFFFFF; // address + } + + // Save original button for later use + if(st_btn_temp_id_original == 0) { + st_btn_temp_id_original = btn; + } + + // Set custom button + if(st_btn_temp_id == 1) { + switch(st_btn_temp_id_original) { + case 0x1: + btn = 0x2; + break; + case 0x2: + btn = 0x1; + break; + case 0x4: + btn = 0x1; + break; + case 0x8: + btn = 0x1; + break; + + default: + break; + } + } + if(st_btn_temp_id == 2) { + switch(st_btn_temp_id_original) { + case 0x1: + btn = 0x4; + break; + case 0x2: + btn = 0x4; + break; + case 0x4: + btn = 0x2; + break; + case 0x8: + btn = 0x4; + break; + + default: + break; + } + } + if(st_btn_temp_id == 3) { + switch(st_btn_temp_id_original) { + case 0x1: + btn = 0x8; + break; + case 0x2: + btn = 0x8; + break; + case 0x4: + btn = 0x8; + break; + case 0x8: + btn = 0x2; + break; + + default: + break; + } + } + + if((st_btn_temp_id == 0) && (st_btn_temp_id_original != 0)) { + btn = st_btn_temp_id_original; + } if(instance->generic.cnt < 0xFFFF) { if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) >= 0xFFFF) { @@ -114,8 +206,12 @@ static bool } uint8_t frame[7]; - frame[0] = data >> 48; - frame[1] = instance->generic.btn << 4; + if(!new_remote) { + frame[0] = data >> 48; + } else { + frame[0] = 0xA7; + } + frame[1] = btn << 4; frame[2] = instance->generic.cnt >> 8; frame[3] = instance->generic.cnt; frame[4] = instance->generic.serial >> 16; @@ -154,7 +250,7 @@ bool subghz_protocol_somfy_telis_create_data( instance->generic.serial = serial; instance->generic.cnt = cnt; instance->generic.data_count_bit = 56; - bool res = subghz_protocol_somfy_telis_gen_data(instance, btn); + bool res = subghz_protocol_somfy_telis_gen_data(instance, btn, true); if(res) { res = subghz_block_generic_serialize(&instance->generic, flipper_format, preset); } @@ -172,7 +268,7 @@ static bool subghz_protocol_encoder_somfy_telis_get_upload( furi_assert(instance); //gen new key - if(subghz_protocol_somfy_telis_gen_data(instance, btn)) { + if(subghz_protocol_somfy_telis_gen_data(instance, btn, false)) { //ToDo if you need to add a callback to automatically update the data on the display } else { return false; @@ -583,6 +679,11 @@ static void subghz_protocol_somfy_telis_check_remote_controller(SubGhzBlockGener instance->btn = (data >> 44) & 0xF; // ctrl instance->cnt = (data >> 24) & 0xFFFF; // rolling code instance->serial = data & 0xFFFFFF; // address + + // Save original button for later use + if(st_btn_temp_id_original == 0) { + st_btn_temp_id_original = instance->btn; + } } /** diff --git a/lib/subghz/protocols/somfy_telis.h b/lib/subghz/protocols/somfy_telis.h index b5e989866..bca58b64b 100644 --- a/lib/subghz/protocols/somfy_telis.h +++ b/lib/subghz/protocols/somfy_telis.h @@ -11,6 +11,14 @@ extern const SubGhzProtocolDecoder subghz_protocol_somfy_telis_decoder; extern const SubGhzProtocolEncoder subghz_protocol_somfy_telis_encoder; extern const SubGhzProtocol subghz_protocol_somfy_telis; +// Custom buttons +void somfy_telis_set_btn(uint8_t b); + +uint8_t somfy_telis_get_original_btn(); +uint8_t somfy_telis_get_custom_btn(); + +void somfy_telis_reset_original_btn(); + /** * Allocate SubGhzProtocolEncoderSomfyTelis. * @param environment Pointer to a SubGhzEnvironment instance From 21c52df09060a5a272ceace2978e2ce36f08e417 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Tue, 28 Feb 2023 00:10:16 +0300 Subject: [PATCH 396/506] bft programming mode & run fbt format --- .../plugins/mousejacker/mousejacker_ducky.c | 46 +++++++++---------- lib/subghz/protocols/keeloq.c | 25 ++++++++-- 2 files changed, 42 insertions(+), 29 deletions(-) diff --git a/applications/plugins/mousejacker/mousejacker_ducky.c b/applications/plugins/mousejacker/mousejacker_ducky.c index f9ded2d03..04b0bfaca 100644 --- a/applications/plugins/mousejacker/mousejacker_ducky.c +++ b/applications/plugins/mousejacker/mousejacker_ducky.c @@ -97,7 +97,8 @@ static uint32_t mj_ducky_get_command_len(const char* line) { static bool mj_get_ducky_key(char* key, size_t keylen, MJDuckyKey* dk) { //FURI_LOG_D(TAG, "looking up key %s with length %d", key, keylen); for(uint i = 0; i < sizeof(mj_ducky_keys) / sizeof(MJDuckyKey); i++) { - if(strlen(mj_ducky_keys[i].name) == keylen && !strncmp(mj_ducky_keys[i].name, key, keylen)) { + if(strlen(mj_ducky_keys[i].name) == keylen && + !strncmp(mj_ducky_keys[i].name, key, keylen)) { memcpy(dk, &mj_ducky_keys[i], sizeof(MJDuckyKey)); return true; } @@ -165,26 +166,23 @@ static void release_key( uint8_t* addr, uint8_t addr_size, uint8_t rate, - PluginState* plugin_state -) { + PluginState* plugin_state) { // This function release keys currently pressed, but keep pressing special keys // if holding mod keys variable are set to true uint8_t hid_payload[LOGITECH_HID_TEMPLATE_SIZE] = {0}; build_hid_packet( - 0 | holding_ctrl - | holding_shift << 1 - | holding_alt << 2 - | holding_gui << 3, - 0, hid_payload); + 0 | holding_ctrl | holding_shift << 1 | holding_alt << 2 | holding_gui << 3, + 0, + hid_payload); inject_packet( - handle, - addr, - addr_size, - rate, - hid_payload, - LOGITECH_HID_TEMPLATE_SIZE, - plugin_state); // empty hid packet + handle, + addr, + addr_size, + rate, + hid_payload, + LOGITECH_HID_TEMPLATE_SIZE, + plugin_state); // empty hid packet } static void send_hid_packet( @@ -196,15 +194,13 @@ static void send_hid_packet( uint8_t hid, PluginState* plugin_state) { uint8_t hid_payload[LOGITECH_HID_TEMPLATE_SIZE] = {0}; - if(hid == prev_hid ) - release_key(handle, addr, addr_size, rate, plugin_state); + if(hid == prev_hid) release_key(handle, addr, addr_size, rate, plugin_state); prev_hid = hid; - build_hid_packet(mod - | holding_ctrl - | holding_shift << 1 - | holding_alt << 2 - | holding_gui << 3, hid, hid_payload); + build_hid_packet( + mod | holding_ctrl | holding_shift << 1 | holding_alt << 2 | holding_gui << 3, + hid, + hid_payload); inject_packet( handle, addr, addr_size, rate, hid_payload, LOGITECH_HID_TEMPLATE_SIZE, plugin_state); furi_delay_ms(12); @@ -288,7 +284,7 @@ static bool mj_process_ducky_line( return true; } else if(strncmp(line_tmp, ducky_cmd_altstring, strlen(ducky_cmd_altstring)) == 0) { - // ALTSTRING + // ALTSTRING line_tmp = &line_tmp[mj_ducky_get_command_len(line_tmp) + 1]; for(size_t i = 0; i < strlen(line_tmp); i++) { if((line_tmp[i] < ' ') || (line_tmp[i] > '~')) { @@ -298,7 +294,7 @@ static bool mj_process_ducky_line( char alt_code[4]; // Getting altcode of the char snprintf(alt_code, 4, "%u", line_tmp[i]); - + uint8_t j = 0; while(!ducky_end_line(alt_code[j])) { char pad_num[5] = {'N', 'U', 'M', ' ', alt_code[j]}; @@ -425,7 +421,7 @@ static bool mj_process_ducky_line( if(!mj_get_ducky_key("TAB", 3, &dk)) return false; send_hid_packet(handle, addr, addr_size, rate, dk.mod, dk.hid, plugin_state); return true; - } + } return false; } diff --git a/lib/subghz/protocols/keeloq.c b/lib/subghz/protocols/keeloq.c index efab023bc..839972dca 100644 --- a/lib/subghz/protocols/keeloq.c +++ b/lib/subghz/protocols/keeloq.c @@ -339,6 +339,11 @@ static bool btn_temp_id_original = btn; } + uint8_t klq_last_custom_btn = 0xA; + if(strcmp(instance->manufacture_name, "BFT") == 0) { + klq_last_custom_btn = 0xF; + } + // Set custom button if(btn_temp_id == 1) { switch(btn_temp_id_original) { @@ -357,6 +362,9 @@ static bool case 0x8: btn = 0x1; break; + case 0xF: + btn = 0x1; + break; default: break; @@ -374,11 +382,14 @@ static bool btn = 0x4; break; case 0x4: - btn = 0xA; + btn = klq_last_custom_btn; break; case 0x8: btn = 0x4; break; + case 0xF: + btn = 0x4; + break; default: break; @@ -401,6 +412,9 @@ static bool case 0x8: btn = 0x2; break; + case 0xF: + btn = 0x8; + break; default: break; @@ -409,10 +423,10 @@ static bool if(btn_temp_id == 4) { switch(btn_temp_id_original) { case 0x1: - btn = 0xA; + btn = klq_last_custom_btn; break; case 0x2: - btn = 0xA; + btn = klq_last_custom_btn; break; case 0xA: btn = 0x2; @@ -421,7 +435,10 @@ static bool btn = 0x2; break; case 0x8: - btn = 0xA; + btn = klq_last_custom_btn; + break; + case 0xF: + btn = 0x2; break; default: From 9c9688dd5b245172fdb25fd93804b4b0515407cc Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Tue, 28 Feb 2023 00:41:14 +0300 Subject: [PATCH 397/506] Nice One manual adding support --- .../main/subghz/helpers/subghz_custom_event.h | 1 + .../subghz/scenes/subghz_scene_set_type.c | 34 ++++++++++++++++++- firmware/targets/f7/api_symbols.csv | 2 +- lib/subghz/blocks/generic.c | 10 ++++++ lib/subghz/protocols/nice_flor_s.c | 22 ++++++++++-- lib/subghz/protocols/nice_flor_s.h | 4 ++- 6 files changed, 68 insertions(+), 5 deletions(-) diff --git a/applications/main/subghz/helpers/subghz_custom_event.h b/applications/main/subghz/helpers/subghz_custom_event.h index 9ac4552f5..e55ae32de 100644 --- a/applications/main/subghz/helpers/subghz_custom_event.h +++ b/applications/main/subghz/helpers/subghz_custom_event.h @@ -13,6 +13,7 @@ typedef enum { SubmenuIndexNiceFlo12bit, SubmenuIndexNiceFlo24bit, SubmenuIndexNiceFlorS_433_92, + SubmenuIndexNiceOne_433_92, SubmenuIndexNiceSmilo_433_92, SubmenuIndexCAME12bit, SubmenuIndexCAME24bit, diff --git a/applications/main/subghz/scenes/subghz_scene_set_type.c b/applications/main/subghz/scenes/subghz_scene_set_type.c index 95cb1ec03..e209a80ea 100644 --- a/applications/main/subghz/scenes/subghz_scene_set_type.c +++ b/applications/main/subghz/scenes/subghz_scene_set_type.c @@ -115,6 +115,12 @@ void subghz_scene_set_type_on_enter(void* context) { SubmenuIndexNiceFlorS_433_92, subghz_scene_set_type_submenu_callback, subghz); + submenu_add_item( + subghz->submenu, + "Nice One 433MHz", + SubmenuIndexNiceOne_433_92, + subghz_scene_set_type_submenu_callback, + subghz); submenu_add_item( subghz->submenu, "CAME 12bit 433MHz", @@ -367,7 +373,33 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) { key & 0x0FFFFFFF, 0x1, 0x0003, - subghz->txrx->preset); + subghz->txrx->preset, + false); + generated_protocol = true; + } else { + generated_protocol = false; + } + subghz_transmitter_free(subghz->txrx->transmitter); + if(!generated_protocol) { + furi_string_set( + subghz->error_str, "Function requires\nan SD card with\nfresh databases."); + scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowError); + } + break; + case SubmenuIndexNiceOne_433_92: + subghz->txrx->transmitter = subghz_transmitter_alloc_init( + subghz->txrx->environment, SUBGHZ_PROTOCOL_NICE_FLOR_S_NAME); + subghz_preset_init( + subghz, "AM650", subghz_setting_get_default_frequency(subghz->setting), NULL, 0); + if(subghz->txrx->transmitter) { + subghz_protocol_nice_flor_s_create_data( + subghz_transmitter_get_protocol_instance(subghz->txrx->transmitter), + subghz->txrx->fff_data, + key & 0x0FFFFFFF, + 0x1, + 0x0003, + subghz->txrx->preset, + true); generated_protocol = true; } else { generated_protocol = false; diff --git a/firmware/targets/f7/api_symbols.csv b/firmware/targets/f7/api_symbols.csv index 17df79bee..8e3d0dd31 100644 --- a/firmware/targets/f7/api_symbols.csv +++ b/firmware/targets/f7/api_symbols.csv @@ -3197,7 +3197,7 @@ Function,-,subghz_protocol_encoder_star_line_yield,LevelDuration,void* Function,-,subghz_protocol_faac_slh_create_data,_Bool,"void*, FlipperFormat*, uint32_t, uint8_t, uint32_t, uint32_t, const char*, SubGhzRadioPreset*" Function,-,subghz_protocol_keeloq_bft_create_data,_Bool,"void*, FlipperFormat*, uint32_t, uint8_t, uint16_t, uint32_t, const char*, SubGhzRadioPreset*" Function,-,subghz_protocol_keeloq_create_data,_Bool,"void*, FlipperFormat*, uint32_t, uint8_t, uint16_t, const char*, SubGhzRadioPreset*" -Function,-,subghz_protocol_nice_flor_s_create_data,_Bool,"void*, FlipperFormat*, uint32_t, uint8_t, uint16_t, SubGhzRadioPreset*" +Function,-,subghz_protocol_nice_flor_s_create_data,_Bool,"void*, FlipperFormat*, uint32_t, uint8_t, uint16_t, SubGhzRadioPreset*, _Bool" Function,-,subghz_protocol_nice_flor_s_encrypt,uint64_t,"uint64_t, const char*" Function,+,subghz_protocol_raw_file_encoder_worker_set_callback_end,void,"SubGhzProtocolEncoderRAW*, SubGhzProtocolEncoderRAWCallbackEnd, void*" Function,+,subghz_protocol_raw_gen_fff_data,void,"FlipperFormat*, const char*" diff --git a/lib/subghz/blocks/generic.c b/lib/subghz/blocks/generic.c index 3d59adc82..54a401e05 100644 --- a/lib/subghz/blocks/generic.c +++ b/lib/subghz/blocks/generic.c @@ -78,6 +78,16 @@ bool subghz_block_generic_serialize( FURI_LOG_E(TAG, "Unable to add Key"); break; } + + // Nice One - Manual adding support + if(instance->data_count_bit == 72 && + (strcmp(instance->protocol_name, "Nice FloR-S") == 0)) { + uint32_t temp = (instance->data_2 >> 4) & 0xFFFFF; + if(!flipper_format_write_uint32(flipper_format, "Data", &temp, 1)) { + FURI_LOG_E(TAG, "Unable to add Data"); + break; + } + } res = true; } while(false); furi_string_free(temp_str); diff --git a/lib/subghz/protocols/nice_flor_s.c b/lib/subghz/protocols/nice_flor_s.c index f58c6084f..135bd4972 100644 --- a/lib/subghz/protocols/nice_flor_s.c +++ b/lib/subghz/protocols/nice_flor_s.c @@ -543,18 +543,36 @@ bool subghz_protocol_nice_flor_s_create_data( uint32_t serial, uint8_t btn, uint16_t cnt, - SubGhzRadioPreset* preset) { + SubGhzRadioPreset* preset, + bool nice_one) { furi_assert(context); SubGhzProtocolEncoderNiceFlorS* instance = context; instance->generic.serial = serial; instance->generic.cnt = cnt; - instance->generic.data_count_bit = 52; + if(nice_one) { + instance->generic.data_count_bit = NICE_ONE_COUNT_BIT; + } else { + instance->generic.data_count_bit = 52; + } uint64_t decrypt = ((uint64_t)instance->generic.serial << 16) | instance->generic.cnt; uint64_t enc_part = subghz_protocol_nice_flor_s_encrypt( decrypt, instance->nice_flor_s_rainbow_table_file_name); uint8_t byte = btn << 4 | (0xF ^ btn ^ 0x3); instance->generic.data = (uint64_t)byte << 44 | enc_part; + if(instance->generic.data_count_bit == NICE_ONE_COUNT_BIT) { + uint8_t add_data[10] = {0}; + for(size_t i = 0; i < 7; i++) { + add_data[i] = (instance->generic.data >> (48 - i * 8)) & 0xFF; + } + subghz_protocol_nice_one_get_data(add_data, 0, 0); + instance->generic.data_2 = 0; + for(size_t j = 7; j < 10; j++) { + instance->generic.data_2 <<= 8; + instance->generic.data_2 += add_data[j]; + } + } + bool res = subghz_block_generic_serialize(&instance->generic, flipper_format, preset); return res; diff --git a/lib/subghz/protocols/nice_flor_s.h b/lib/subghz/protocols/nice_flor_s.h index 52f0ca745..3b22db304 100644 --- a/lib/subghz/protocols/nice_flor_s.h +++ b/lib/subghz/protocols/nice_flor_s.h @@ -63,6 +63,7 @@ uint64_t subghz_protocol_nice_flor_s_encrypt(uint64_t data, const char* file_nam * @param btn Button number, 4 bit * @param cnt Counter value, 16 bit * @param preset Modulation, SubGhzRadioPreset + * @param nice_one Nice One if true, Nice Flor S if false * @return true On success */ bool subghz_protocol_nice_flor_s_create_data( @@ -71,7 +72,8 @@ bool subghz_protocol_nice_flor_s_create_data( uint32_t serial, uint8_t btn, uint16_t cnt, - SubGhzRadioPreset* preset); + SubGhzRadioPreset* preset, + bool nice_one); /** * Allocate SubGhzProtocolDecoderNiceFlorS. From cbb09b681279d4a316d261ff277794799dd53fce Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Tue, 28 Feb 2023 06:02:22 +0300 Subject: [PATCH 398/506] BFT Programming mode and Add manually --- .../main/subghz/helpers/subghz_custom_event.h | 3 +- .../subghz/scenes/subghz_scene_set_type.c | 46 +++++- lib/subghz/protocols/keeloq.c | 146 +++++++++++------- 3 files changed, 136 insertions(+), 59 deletions(-) diff --git a/applications/main/subghz/helpers/subghz_custom_event.h b/applications/main/subghz/helpers/subghz_custom_event.h index e55ae32de..32b5fb329 100644 --- a/applications/main/subghz/helpers/subghz_custom_event.h +++ b/applications/main/subghz/helpers/subghz_custom_event.h @@ -8,7 +8,8 @@ typedef enum { //SubmenuIndex SubmenuIndexFaacSLH_433, SubmenuIndexFaacSLH_868, - SubmenuIndexBFT, + SubmenuIndexBFTClone, + SubmenuIndexBFTMitto, SubmenuIndexPricenton, SubmenuIndexNiceFlo12bit, SubmenuIndexNiceFlo24bit, diff --git a/applications/main/subghz/scenes/subghz_scene_set_type.c b/applications/main/subghz/scenes/subghz_scene_set_type.c index e209a80ea..41c22af20 100644 --- a/applications/main/subghz/scenes/subghz_scene_set_type.c +++ b/applications/main/subghz/scenes/subghz_scene_set_type.c @@ -79,10 +79,16 @@ void subghz_scene_set_type_on_enter(void* context) { SubmenuIndexFaacSLH_433, subghz_scene_set_type_submenu_callback, subghz); + submenu_add_item( + subghz->submenu, + "BFT [Manual] 433MHz", + SubmenuIndexBFTClone, + subghz_scene_set_type_submenu_callback, + subghz); submenu_add_item( subghz->submenu, "BFT Mitto 433MHz", - SubmenuIndexBFT, + SubmenuIndexBFTMitto, subghz_scene_set_type_submenu_callback, subghz); submenu_add_item( @@ -236,7 +242,7 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) { case SubmenuIndexFaacSLH_433: scene_manager_next_scene(subghz->scene_manager, SubGhzSceneSetFixFaac); break; - case SubmenuIndexBFT: + case SubmenuIndexBFTClone: scene_manager_next_scene(subghz->scene_manager, SubGhzSceneSetFixBft); break; case SubmenuIndexPricenton: @@ -312,6 +318,42 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) { generated_protocol = true; } break; + case SubmenuIndexBFTMitto: + subghz->txrx->transmitter = subghz_transmitter_alloc_init( + subghz->txrx->environment, SUBGHZ_PROTOCOL_KEELOQ_NAME); + subghz_preset_init(subghz, "AM650", 433920000, NULL, 0); + if(subghz->txrx->transmitter) { + subghz_protocol_keeloq_bft_create_data( + subghz_transmitter_get_protocol_instance(subghz->txrx->transmitter), + subghz->txrx->fff_data, + key & 0x000FFFFF, + 0x2, + 0x0002, + key & 0x000FFFFF, + "BFT", + subghz->txrx->preset); + + uint8_t seed_data[sizeof(uint32_t)] = {0}; + for(size_t i = 0; i < sizeof(uint32_t); i++) { + seed_data[sizeof(uint32_t) - i - 1] = ((key & 0x000FFFFF) >> i * 8) & 0xFF; + } + + flipper_format_write_hex( + subghz->txrx->fff_data, "Seed", seed_data, sizeof(uint32_t)); + + flipper_format_write_string_cstr(subghz->txrx->fff_data, "Manufacture", "BFT"); + + generated_protocol = true; + } else { + generated_protocol = false; + } + subghz_transmitter_free(subghz->txrx->transmitter); + if(!generated_protocol) { + furi_string_set( + subghz->error_str, "Function requires\nan SD card with\nfresh databases."); + scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowError); + } + break; case SubmenuIndexDoorHan_433_92: subghz->txrx->transmitter = subghz_transmitter_alloc_init( subghz->txrx->environment, SUBGHZ_PROTOCOL_KEELOQ_NAME); diff --git a/lib/subghz/protocols/keeloq.c b/lib/subghz/protocols/keeloq.c index 839972dca..add35c827 100644 --- a/lib/subghz/protocols/keeloq.c +++ b/lib/subghz/protocols/keeloq.c @@ -88,6 +88,8 @@ static const char* mfname; static uint8_t kl_type; static uint8_t btn_temp_id; static uint8_t btn_temp_id_original; +static bool bft_prog_mode; +static uint16_t temp_counter; void keeloq_set_btn(uint8_t b) { btn_temp_id = b; @@ -158,7 +160,27 @@ static bool subghz_protocol_keeloq_gen_data( SubGhzProtocolEncoderKeeloq* instance, uint8_t btn, bool counter_up) { - if(counter_up) { + uint32_t fix = (uint32_t)btn << 28 | instance->generic.serial; + uint32_t hop = 0; + uint64_t man = 0; + uint64_t code_found_reverse; + int res = 0; + if(instance->manufacture_name == 0x0) { + instance->manufacture_name = ""; + } + + // BFT programming mode on / off conditions + if((strcmp(instance->manufacture_name, "BFT") == 0) && (btn == 0xF)) { + bft_prog_mode = true; + } + if((strcmp(instance->manufacture_name, "BFT") == 0) && (btn != 0xF) && bft_prog_mode) { + bft_prog_mode = false; + } + // If we using BFT programming mode we will trasmit its seed in hop part like original remote + if(bft_prog_mode) { + hop = instance->generic.seed; + } + if(counter_up && !bft_prog_mode) { if(instance->generic.cnt < 0xFFFF) { if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) >= 0xFFFF) { instance->generic.cnt = 0; @@ -169,49 +191,41 @@ static bool subghz_protocol_keeloq_gen_data( instance->generic.cnt = 0; } } - uint32_t fix = (uint32_t)btn << 28 | instance->generic.serial; - uint32_t decrypt = (uint32_t)btn << 28 | - (instance->generic.serial & 0x3FF) - << 16 | //ToDo in some protocols the discriminator is 0 - instance->generic.cnt; - uint32_t hop = 0; - uint64_t man = 0; - uint64_t code_found_reverse; - int res = 0; - if(instance->manufacture_name == 0x0) { - instance->manufacture_name = ""; - } + if(!bft_prog_mode) { + uint32_t decrypt = (uint32_t)btn << 28 | + (instance->generic.serial & 0x3FF) + << 16 | //ToDo in some protocols the discriminator is 0 + instance->generic.cnt; + // DTM Neo uses 12bit -> simple learning -- FAAC_RC,XT , Mutanco_Mutancode -> 12bit normal learning + if((strcmp(instance->manufacture_name, "DTM_Neo") == 0) || + (strcmp(instance->manufacture_name, "FAAC_RC,XT") == 0) || + (strcmp(instance->manufacture_name, "Mutanco_Mutancode") == 0)) { + decrypt = btn << 28 | (instance->generic.serial & 0xFFF) << 16 | instance->generic.cnt; + } - // DTM Neo uses 12bit -> simple learning -- FAAC_RC,XT , Mutanco_Mutancode -> 12bit normal learning - if((strcmp(instance->manufacture_name, "DTM_Neo") == 0) || - (strcmp(instance->manufacture_name, "FAAC_RC,XT") == 0) || - (strcmp(instance->manufacture_name, "Mutanco_Mutancode") == 0)) { - decrypt = btn << 28 | (instance->generic.serial & 0xFFF) << 16 | instance->generic.cnt; - } + // Nice Smilo, MHouse, JCM, Normstahl -> 8bit serial - simple learning + if((strcmp(instance->manufacture_name, "NICE_Smilo") == 0) || + (strcmp(instance->manufacture_name, "NICE_MHOUSE") == 0) || + (strcmp(instance->manufacture_name, "JCM_Tech") == 0) || + (strcmp(instance->manufacture_name, "Normstahl") == 0)) { + decrypt = btn << 28 | (instance->generic.serial & 0xFF) << 16 | instance->generic.cnt; + } - // Nice Smilo, MHouse, JCM, Normstahl -> 8bit serial - simple learning - if((strcmp(instance->manufacture_name, "NICE_Smilo") == 0) || - (strcmp(instance->manufacture_name, "NICE_MHOUSE") == 0) || - (strcmp(instance->manufacture_name, "JCM_Tech") == 0) || - (strcmp(instance->manufacture_name, "Normstahl") == 0)) { - decrypt = btn << 28 | (instance->generic.serial & 0xFF) << 16 | instance->generic.cnt; - } + // Beninca -> 4bit serial - simple XOR + if(strcmp(instance->manufacture_name, "Beninca") == 0) { + decrypt = btn << 28 | (instance->generic.serial & 0xF) << 16 | instance->generic.cnt; + } - // Beninca -> 4bit serial - simple XOR - if(strcmp(instance->manufacture_name, "Beninca") == 0) { - decrypt = btn << 28 | (instance->generic.serial & 0xF) << 16 | instance->generic.cnt; - } - - if(strcmp(instance->manufacture_name, "Unknown") == 0) { - code_found_reverse = subghz_protocol_blocks_reverse_key( - instance->generic.data, instance->generic.data_count_bit); - hop = code_found_reverse & 0x00000000ffffffff; - } else if(strcmp(instance->manufacture_name, "AN-Motors") == 0) { - hop = (instance->generic.cnt & 0xFF) << 24 | (instance->generic.cnt & 0xFF) << 16 | - (btn & 0xF) << 12 | 0x404; - } else if(strcmp(instance->manufacture_name, "HCS101") == 0) { - hop = instance->generic.cnt << 16 | (btn & 0xF) << 12 | 0x000; - } else { + if(strcmp(instance->manufacture_name, "Unknown") == 0) { + code_found_reverse = subghz_protocol_blocks_reverse_key( + instance->generic.data, instance->generic.data_count_bit); + hop = code_found_reverse & 0x00000000ffffffff; + } else if(strcmp(instance->manufacture_name, "AN-Motors") == 0) { + hop = (instance->generic.cnt & 0xFF) << 24 | (instance->generic.cnt & 0xFF) << 16 | + (btn & 0xF) << 12 | 0x404; + } else if(strcmp(instance->manufacture_name, "HCS101") == 0) { + hop = instance->generic.cnt << 16 | (btn & 0xF) << 12 | 0x000; + } else { for M_EACH(manufacture_code, *subghz_keystore_get_data(instance->keystore), SubGhzKeyArray_t) { res = strcmp(furi_string_get_cstr(manufacture_code->name), instance->manufacture_name); @@ -270,6 +284,7 @@ static bool subghz_protocol_keeloq_gen_data( break; } } + } } if(hop) { uint64_t yek = (uint64_t)fix << 32 | hop; @@ -339,6 +354,12 @@ static bool btn_temp_id_original = btn; } + if(instance->manufacture_name == 0x0) { + instance->manufacture_name = ""; + } + if(bft_prog_mode) { + instance->manufacture_name = "BFT"; + } uint8_t klq_last_custom_btn = 0xA; if(strcmp(instance->manufacture_name, "BFT") == 0) { klq_last_custom_btn = 0xF; @@ -450,9 +471,10 @@ static bool btn = btn_temp_id_original; } - //gen new key + // Generate new key + if(subghz_protocol_keeloq_gen_data(instance, btn, true)) { - //ToDo if you need to add a callback to automatically update the data on the display + // OK } else { return false; } @@ -607,6 +629,8 @@ void* subghz_protocol_decoder_keeloq_alloc(SubGhzEnvironment* environment) { instance->keystore = subghz_environment_get_keystore(environment); instance->manufacture_from_file = furi_string_alloc(); + bft_prog_mode = false; + return instance; } @@ -723,7 +747,7 @@ void subghz_protocol_decoder_keeloq_feed(void* context, bool level, uint32_t dur /** * Validation of decrypt data. * @param instance Pointer to a SubGhzBlockGeneric instance - * @param decrypt Decrypd data + * @param decrypt Decrypted data * @param btn Button number, 4 bit * @param end_serial decrement the last 10 bits of the serial number * @return true On success @@ -1105,19 +1129,29 @@ static void subghz_protocol_keeloq_check_remote_controller( uint64_t key = subghz_protocol_blocks_reverse_key(instance->data, instance->data_count_bit); uint32_t key_fix = key >> 32; uint32_t key_hop = key & 0x00000000ffffffff; - // Check key AN-Motors - if((key_hop >> 24) == ((key_hop >> 16) & 0x00ff) && - (key_fix >> 28) == ((key_hop >> 12) & 0x0f) && (key_hop & 0xFFF) == 0x404) { - *manufacture_name = "AN-Motors"; - mfname = *manufacture_name; - instance->cnt = key_hop >> 16; - } else if((key_hop & 0xFFF) == (0x000) && (key_fix >> 28) == ((key_hop >> 12) & 0x0f)) { - *manufacture_name = "HCS101"; - mfname = *manufacture_name; - instance->cnt = key_hop >> 16; + + // If we are in BFT programming mode we will set previous remembered counter and skip mf keys check + if(!bft_prog_mode) { + // Check key AN-Motors + if((key_hop >> 24) == ((key_hop >> 16) & 0x00ff) && + (key_fix >> 28) == ((key_hop >> 12) & 0x0f) && (key_hop & 0xFFF) == 0x404) { + *manufacture_name = "AN-Motors"; + mfname = *manufacture_name; + instance->cnt = key_hop >> 16; + } else if((key_hop & 0xFFF) == (0x000) && (key_fix >> 28) == ((key_hop >> 12) & 0x0f)) { + *manufacture_name = "HCS101"; + mfname = *manufacture_name; + instance->cnt = key_hop >> 16; + } else { + subghz_protocol_keeloq_check_remote_controller_selector( + instance, key_fix, key_hop, keystore, manufacture_name); + } + temp_counter = instance->cnt; + } else { - subghz_protocol_keeloq_check_remote_controller_selector( - instance, key_fix, key_hop, keystore, manufacture_name); + *manufacture_name = "BFT"; + mfname = *manufacture_name; + instance->cnt = temp_counter; } instance->serial = key_fix & 0x0FFFFFFF; From 6bd5e228726044d542ccaed0c2ee2657acb82471 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Tue, 28 Feb 2023 06:15:55 +0300 Subject: [PATCH 399/506] Somfy Telis - add manually --- .../main/subghz/helpers/subghz_custom_event.h | 1 + .../subghz/scenes/subghz_scene_set_type.c | 30 +++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/applications/main/subghz/helpers/subghz_custom_event.h b/applications/main/subghz/helpers/subghz_custom_event.h index 32b5fb329..4475045ee 100644 --- a/applications/main/subghz/helpers/subghz_custom_event.h +++ b/applications/main/subghz/helpers/subghz_custom_event.h @@ -10,6 +10,7 @@ typedef enum { SubmenuIndexFaacSLH_868, SubmenuIndexBFTClone, SubmenuIndexBFTMitto, + SubmenuIndexSomfyTelis, SubmenuIndexPricenton, SubmenuIndexNiceFlo12bit, SubmenuIndexNiceFlo24bit, diff --git a/applications/main/subghz/scenes/subghz_scene_set_type.c b/applications/main/subghz/scenes/subghz_scene_set_type.c index 41c22af20..5c5d5db3b 100644 --- a/applications/main/subghz/scenes/subghz_scene_set_type.c +++ b/applications/main/subghz/scenes/subghz_scene_set_type.c @@ -91,6 +91,12 @@ void subghz_scene_set_type_on_enter(void* context) { SubmenuIndexBFTMitto, subghz_scene_set_type_submenu_callback, subghz); + submenu_add_item( + subghz->submenu, + "Somfy Telis 433MHz", + SubmenuIndexSomfyTelis, + subghz_scene_set_type_submenu_callback, + subghz); submenu_add_item( subghz->submenu, "Princeton 433MHz", @@ -354,6 +360,30 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) { scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowError); } break; + case SubmenuIndexSomfyTelis: + subghz->txrx->transmitter = subghz_transmitter_alloc_init( + subghz->txrx->environment, SUBGHZ_PROTOCOL_SOMFY_TELIS_NAME); + subghz_preset_init( + subghz, "AM650", subghz_setting_get_default_frequency(subghz->setting), NULL, 0); + if(subghz->txrx->transmitter) { + subghz_protocol_somfy_telis_create_data( + subghz_transmitter_get_protocol_instance(subghz->txrx->transmitter), + subghz->txrx->fff_data, + key & 0x00FFFFFF, + 0x2, + 0x0003, + subghz->txrx->preset); + generated_protocol = true; + } else { + generated_protocol = false; + } + subghz_transmitter_free(subghz->txrx->transmitter); + if(!generated_protocol) { + furi_string_set( + subghz->error_str, "Function requires\nan SD card with\nfresh databases."); + scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowError); + } + break; case SubmenuIndexDoorHan_433_92: subghz->txrx->transmitter = subghz_transmitter_alloc_init( subghz->txrx->environment, SUBGHZ_PROTOCOL_KEELOQ_NAME); From 24726ab8a319f0854696fb6cb4ee2b75155c36f7 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Tue, 28 Feb 2023 06:19:21 +0300 Subject: [PATCH 400/506] More precise debug counter ++ --- .../scenes/subghz_scene_ext_module_settings.c | 29 ++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/applications/main/subghz/scenes/subghz_scene_ext_module_settings.c b/applications/main/subghz/scenes/subghz_scene_ext_module_settings.c index 8d1154a13..df81eae29 100644 --- a/applications/main/subghz/scenes/subghz_scene_ext_module_settings.c +++ b/applications/main/subghz/scenes/subghz_scene_ext_module_settings.c @@ -17,9 +17,12 @@ const char* const debug_pin_text[DEBUG_P_COUNT] = { "17(1W)", }; -#define DEBUG_COUNTER_COUNT 3 +#define DEBUG_COUNTER_COUNT 6 const char* const debug_counter_text[DEBUG_COUNTER_COUNT] = { "+1", + "+2", + "+3", + "+4", "+5", "+10", }; @@ -55,9 +58,18 @@ static void subghz_scene_receiver_config_set_debug_counter(VariableItem* item) { furi_hal_subghz_set_rolling_counter_mult(1); break; case 1: - furi_hal_subghz_set_rolling_counter_mult(5); + furi_hal_subghz_set_rolling_counter_mult(2); break; case 2: + furi_hal_subghz_set_rolling_counter_mult(3); + break; + case 3: + furi_hal_subghz_set_rolling_counter_mult(4); + break; + case 4: + furi_hal_subghz_set_rolling_counter_mult(5); + break; + case 5: furi_hal_subghz_set_rolling_counter_mult(10); break; default: @@ -101,12 +113,21 @@ void subghz_scene_ext_module_settings_on_enter(void* context) { case 1: value_index_cnt = 0; break; - case 5: + case 2: value_index_cnt = 1; break; - case 10: + case 3: value_index_cnt = 2; break; + case 4: + value_index_cnt = 3; + break; + case 5: + value_index_cnt = 4; + break; + case 10: + value_index_cnt = 5; + break; default: break; } From 9f6f391354585958cb73b077b4b78938716ce131 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Tue, 28 Feb 2023 06:56:54 +0300 Subject: [PATCH 401/506] Update changelog and docs --- CHANGELOG.md | 6 ++++ ReadMe.md | 15 ++++---- documentation/SubGHzRemoteProg.md | 60 +++++++++++++++++++++++++++++++ 3 files changed, 74 insertions(+), 7 deletions(-) create mode 100644 documentation/SubGHzRemoteProg.md diff --git a/CHANGELOG.md b/CHANGELOG.md index a50bfb1cf..3140f742b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ ### New changes * SubGHz: **Custom buttons for Nice Flor S / Somfy Telis (+Programming mode)** - now you can use arrow buttons to send signal with different button code * SubGHz: Somfy Telis -> Add manually (create new remote, now with programming button (Prog / 0x8) you can write it into receiver) +* SubGHz: BFT Mitto -> Add manually (create new remote, now with programming button (0xF) you can write it into receiver) +* SubGHz: Nice One -> Add manually (programming is possible using regular button) +* SubGHz: More precise settings for debug counter increase value +* Plugins -> MouseJacker: Features, Fixes and improvements (by @MatthisC | PR #366) +* OFW: BadUSB UI fixes +* OFW: Plugins: move to designated categories -> **We moved some plugins to new categories too** * OFW: Drivers: remove excessive check in bq25896 and make PVS happy * OFW: FuriHal, Power, UnitTests: fix, rename battery charging voltage limit API -> **Breaking API change, api was changed from 14.x to 15.x** **(this will make your manually copied plugins not work, update them in same way you installed them, or delete `apps` folder and then install firmware, if you using extra pack builds (with `e` in version) all apps in _Extra will be updated automatically)** diff --git a/ReadMe.md b/ReadMe.md index 2e9b0327e..9265fb626 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -167,7 +167,7 @@ Games: - Lock device with pin(or regular lock if pin not set) by holding UP button on main screen [(by an4tur0r)](https://github.com/DarkFlippers/unleashed-firmware/pull/107) * SubGHz -> **Hold right in received signal list to delete selected signal** * SubGHz -> **Custom buttons for Keeloq / Alutech AT4N / Nice Flor S / Somfy Telis** - now you can use arrow buttons to send signal with different button code -* SubGHz -> BFT Mitto / Somfy Telis manual creation with programming new remote into receiver (use button 0xF for BFT Mitto, 0x8 (Prog) on Somfy Telis) +* SubGHz -> BFT Mitto / Somfy Telis / Nice Flor S manual creation with programming new remote into receiver (use button 0xF for BFT Mitto, 0x8 (Prog) on Somfy Telis) * SubGHz -> Debug mode counter increase settings (+5, +10, default: +1) * SubGHz -> Debug PIN output settings for protocol development * Infrared -> Debug TX PIN output settings @@ -183,6 +183,13 @@ Games: ## [- How to change Flipper name](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/CustomFlipperName.md) +### **Sub-GHz** + +## [- Transmission is blocked? - How to extend Sub-GHz frequency range](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/DangerousSettings.md) + +## [- How to add extra Sub-GHz frequencies](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/SubGHzSettings.md) + +## [- How to use Flipper as new remote (Nice FlorS, BFT Mitto, Somfy Telis)](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/SubGHzRemoteProg.md) ### **Plugins** ## [- 🎲 Download Extra plugins for Unleashed](https://github.com/xMasterX/unleashed-extra-pack) @@ -223,12 +230,6 @@ Games: ## [- How to use: [GPIO] SentrySafe plugin](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/SentrySafe.md) -### **Sub-GHz** - -## [- Transmission is blocked? - How to extend Sub-GHz frequency range](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/DangerousSettings.md) - -## [- How to add extra Sub-GHz frequencies](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/SubGHzSettings.md) -

diff --git a/documentation/SubGHzRemoteProg.md b/documentation/SubGHzRemoteProg.md new file mode 100644 index 000000000..5f453806e --- /dev/null +++ b/documentation/SubGHzRemoteProg.md @@ -0,0 +1,60 @@ +# How to use Flipper as a new SubGHz remote (not clone of original remote) + +## Somfy Telis + +1. Create new remote with randomly generated serial: Go to SubGHz -> Add Manually -> Somfy Telis 433Mhz +2. Open your new remote file +3. Long press (hold) the ‘Prog’ button on a remote that is already registered to the device, until the blinds move shortly up and down. +4. Press and hold the ‘Prog’ button on the flipper (Left Arrow), until the blinds move shortly up and down again. +5. Done? + +## BFT Mitto + +1. Create new remote with randomly generated serial: Go to SubGHz -> Add Manually -> BFT Mitto 433Mhz +2. Open your new remote file +3. You need to be in minimum 3 meters to receiver +4. Original Remote: Press hidden button on back of remote with a pin or paper clip OR press Button 1 & 2 together until remote LED lights. +5. Original Remote: Momentarily press button that opens device +6. Long press (Right Arrow) - (0xF button - Btn:F) on Flipper for like 3-5 sec +7. Done? + +## Nice Flor S + +- Create new remote with randomly generated serial: Go to SubGHz -> Add Manually -> Nice FloR-S 433Mhz +- Open your new remote file + +### Coding using an existing remote +To enter the code of a new remote control without using your receiver, you will need +an authorised remote control (note: the first remote control must always be entered +using the receiver key). Now, with the two remote controls (your already coded +remote, and your new remote), which we shall call NEW (the one whose code we want +to enter) and OLD (the authorised one), position yourself within 3m of the gate/garage +receiver and then: +1. Press and hold the `Send` button on the flipper for at least 5 seconds and then +release. +2. Press the button on the already programmed remote 3 times slowly. +3. Press the `Send` button on the flipper slowly and then release. + +### Coding directly to your receiver +Your new remote will program to your receiver as per your original remote +instructions, so please refer to your manual. But for a typical NICE FLOX2R Receiver, +the programming procedure is as follows: +1. Press the learning button on your receiver for 1-2 seconds. The LED will turn on +for 5 seconds. Within 5 seconds, complete the next step. +2. Press a `Send` button on your flipper until the LED on your receiver turns off. +3. Release the remote button and wait for 2 seconds. +4. Press the `Send` button on your flipper again. The LED on your receiver +will now flash 3 times. This indicates that your remote has been successfully +coded. If this does not happen, repeat the whole procedure from the +beginning, and try again. +5. Wait 5 seconds. Press the button on your new remote to test if it opens your +garage/gate. + + +#### Follow links below to find more detailed instructions!!! + +#### Materials used: +- [Somfy Telis](https://pushstack.wordpress.com/somfy-rts-protocol/) +- [BFT Mitto](https://www.retroremotes.com.au/wp-content/uploads/2017/03/BFT-MITTO-2-4-19-6-17.pdf) +- [NICE FLOX2R Receiver Programming](https://apollogateopeners.com/store/pdf/apollo-flor-s-receiver-programming-guide.pdf) +- [Nice Flor S Programming](https://motepro.com.au/Instructions/Nice.pdf) \ No newline at end of file From 75a8f0a7b4c088fdb1a77dbed16aef5102216bbb Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Tue, 28 Feb 2023 07:05:55 +0300 Subject: [PATCH 402/506] Update changelog --- CHANGELOG.md | 1 + ReadMe.md | 5 +++-- applications/plugins/hc_sr04/hc_sr04.c | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3140f742b..072070ad2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ * SubGHz: Nice One -> Add manually (programming is possible using regular button) * SubGHz: More precise settings for debug counter increase value * Plugins -> MouseJacker: Features, Fixes and improvements (by @MatthisC | PR #366) +* Plugins -> HC-SR04: Improve accuracy by measuring microseconds (by @clashlab | PR #367) * OFW: BadUSB UI fixes * OFW: Plugins: move to designated categories -> **We moved some plugins to new categories too** * OFW: Drivers: remove excessive check in bq25896 and make PVS happy diff --git a/ReadMe.md b/ReadMe.md index 9265fb626..5563bc390 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -190,12 +190,13 @@ Games: ## [- How to add extra Sub-GHz frequencies](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/SubGHzSettings.md) ## [- How to use Flipper as new remote (Nice FlorS, BFT Mitto, Somfy Telis)](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/SubGHzRemoteProg.md) + +## [- Configure Sub-GHz Remote App](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/SubGHzRemotePlugin.md) + ### **Plugins** ## [- 🎲 Download Extra plugins for Unleashed](https://github.com/xMasterX/unleashed-extra-pack) -## [- Configure Sub-GHz Remote App](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/SubGHzRemotePlugin.md) - ## [- TOTP (Authenticator) config description](https://github.com/akopachov/flipper-zero_authenticator/blob/master/docs/conf-file_description.md) ## [- Barcode Generator](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/BarcodeGenerator.md) diff --git a/applications/plugins/hc_sr04/hc_sr04.c b/applications/plugins/hc_sr04/hc_sr04.c index 3cb9e72d6..db075247a 100644 --- a/applications/plugins/hc_sr04/hc_sr04.c +++ b/applications/plugins/hc_sr04/hc_sr04.c @@ -165,7 +165,8 @@ static void hc_sr04_measure(PluginState* const plugin_state) { //FURI_CRITICAL_EXIT(); - plugin_state->echo = (pulse_end - pulse_start) / furi_hal_cortex_instructions_per_microsecond(); + plugin_state->echo = + (pulse_end - pulse_start) / furi_hal_cortex_instructions_per_microsecond(); plugin_state->distance = hc_sr04_us_to_m(plugin_state->echo); plugin_state->measurement_made = true; From c3a6ba3c02a8e389ebb236fb90ffbb5274745428 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Tue, 28 Feb 2023 07:09:13 +0300 Subject: [PATCH 403/506] Small fixes --- lib/subghz/protocols/keeloq.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/subghz/protocols/keeloq.c b/lib/subghz/protocols/keeloq.c index add35c827..a58a95ed6 100644 --- a/lib/subghz/protocols/keeloq.c +++ b/lib/subghz/protocols/keeloq.c @@ -105,6 +105,8 @@ uint8_t keeloq_get_custom_btn() { void keeloq_reset_original_btn() { btn_temp_id_original = 0; + temp_counter = 0; + bft_prog_mode = false; } void keeloq_reset_mfname() { From e0f969775026ff0a4595a4060642a70befc27bcd Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Tue, 28 Feb 2023 07:25:28 +0300 Subject: [PATCH 404/506] Add a special message in changelog for novices --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 072070ad2..3f965db05 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,5 @@ ### New changes +* Remove `apps` folder on your microSD before installing this release to avoid issues! * SubGHz: **Custom buttons for Nice Flor S / Somfy Telis (+Programming mode)** - now you can use arrow buttons to send signal with different button code * SubGHz: Somfy Telis -> Add manually (create new remote, now with programming button (Prog / 0x8) you can write it into receiver) * SubGHz: BFT Mitto -> Add manually (create new remote, now with programming button (0xF) you can write it into receiver) From 48641ef6f68f7ba968aa518ef6256943f11f9062 Mon Sep 17 00:00:00 2001 From: yocvito Date: Tue, 28 Feb 2023 19:27:15 +0100 Subject: [PATCH 405/506] Adds bonding toggle in badkb, allowing to remember paired devices, but MAC address cannot be modified in this state (V1) --- applications/main/bad_kb/bad_kb_app.c | 2 + applications/main/bad_kb/bad_kb_app_i.h | 19 +++++-- applications/main/bad_kb/bad_kb_script.c | 57 ++++++++++++++----- applications/main/bad_kb/bad_kb_script.h | 2 + .../bad_kb/scenes/bad_kb_scene_config_bt.c | 22 ++++++- applications/services/bt/bt_service/bt.c | 7 +-- applications/services/bt/bt_service/bt.h | 2 +- .../bt_settings_scene_forget_dev_confirm.c | 6 ++ firmware/targets/f7/api_symbols.csv | 4 +- firmware/targets/f7/ble_glue/gap.c | 4 +- 10 files changed, 96 insertions(+), 29 deletions(-) diff --git a/applications/main/bad_kb/bad_kb_app.c b/applications/main/bad_kb/bad_kb_app.c index 2f5ee75ff..f7c9fcd41 100644 --- a/applications/main/bad_kb/bad_kb_app.c +++ b/applications/main/bad_kb/bad_kb_app.c @@ -107,10 +107,12 @@ BadKbApp* bad_kb_app_alloc(char* arg) { Bt* bt = furi_record_open(RECORD_BT); app->bt = bt; app->is_bt = XTREME_SETTINGS()->bad_bt; + app->bonding = BondingForgetDevices; const char* adv_name = furi_hal_bt_get_profile_adv_name(FuriHalBtProfileHidKeyboard); memcpy(app->name, adv_name, BAD_KB_ADV_NAME_MAX_LEN); memcpy(app->bt_old_config.name, adv_name, BAD_KB_ADV_NAME_MAX_LEN); + // need to be done before bt init (where mac address get modified if bounding is activated) const uint8_t* mac_addr = furi_hal_bt_get_profile_mac_addr(FuriHalBtProfileHidKeyboard); memcpy(app->mac, mac_addr, BAD_KB_MAC_ADDRESS_LEN); memcpy(app->bt_old_config.mac, mac_addr, BAD_KB_MAC_ADDRESS_LEN); diff --git a/applications/main/bad_kb/bad_kb_app_i.h b/applications/main/bad_kb/bad_kb_app_i.h index b16eb159d..1263ab49c 100644 --- a/applications/main/bad_kb/bad_kb_app_i.h +++ b/applications/main/bad_kb/bad_kb_app_i.h @@ -18,11 +18,16 @@ #define BAD_KB_APP_BASE_FOLDER ANY_PATH("badkb") #define BAD_KB_APP_PATH_LAYOUT_FOLDER BAD_KB_APP_BASE_FOLDER "/assets/layouts" +#define BAD_KB_APP_PATH_BOUND_KEYS_FOLDER EXT_PATH("badkb/.bt_keys") +#define BAD_KB_APP_PATH_BOUND_KEYS_FILE BAD_KB_APP_PATH_BOUND_KEYS_FOLDER "/.devices.keys" #define BAD_KB_APP_SCRIPT_EXTENSION ".txt" #define BAD_KB_APP_LAYOUT_EXTENSION ".kl" -#define BAD_KB_MAC_ADDRESS_LEN 6 // need replace with MAC size maccro -#define BAD_KB_ADV_NAME_MAX_LEN 18 +#define BAD_KB_MAC_ADDRESS_LEN 6 // need replace with MAC size maccro +#define BAD_KB_ADV_NAME_MAX_LEN 18 + +// this is the MAC address used when we do not forget paired device (BOUND STATE) +#define BAD_KB_BOUND_MAC_ADDRESS { 0x41, 0x4a, 0xef, 0xbe, 0xad, 0xde }; typedef enum { BadKbAppErrorNoFiles, @@ -35,13 +40,14 @@ typedef enum BadKbCustomEvent { BadKbCustomEventErrorBack } BadKbCustomEvent; + +#define BondingForgetDevices false +#define BondingRememberDevices true + typedef struct { + //uint8_t bounded_mac[BAD_KB_MAC_ADDRESS_LEN]; uint8_t mac[BAD_KB_MAC_ADDRESS_LEN]; char name[BAD_KB_ADV_NAME_MAX_LEN + 1]; - - // number of bt keys before starting the app (all keys added in - // the bt keys file then will be removed) - uint16_t n_keys; } BadKbBtConfig; struct BadKbApp { @@ -59,6 +65,7 @@ struct BadKbApp { ByteInput* byte_input; uint8_t mac[BAD_KB_MAC_ADDRESS_LEN]; char name[BAD_KB_ADV_NAME_MAX_LEN + 1]; + bool bonding; // weither we remember paired devices or not BadKbBtConfig bt_old_config; BadKbAppError error; diff --git a/applications/main/bad_kb/bad_kb_script.c b/applications/main/bad_kb/bad_kb_script.c index d6cb6fae6..469d4169a 100644 --- a/applications/main/bad_kb/bad_kb_script.c +++ b/applications/main/bad_kb/bad_kb_script.c @@ -169,19 +169,19 @@ static const uint8_t numpad_keys[10] = { uint8_t bt_timeout = 0; static LevelRssiRange bt_remote_rssi_range(Bt* bt) { - BtRssi rssi_data = {0}; + uint8_t rssi; - if(!bt_remote_rssi(bt, &rssi_data)) return LevelRssiError; + if(!bt_remote_rssi(bt, &rssi)) return LevelRssiError; - if(rssi_data.rssi <= 39) + if(rssi <= 39) return LevelRssi39_0; - else if(rssi_data.rssi <= 59) + else if(rssi <= 59) return LevelRssi59_40; - else if(rssi_data.rssi <= 79) + else if(rssi <= 79) return LevelRssi79_60; - else if(rssi_data.rssi <= 99) + else if(rssi <= 99) return LevelRssi99_80; - else if(rssi_data.rssi <= 122) + else if(rssi <= 122) return LevelRssi122_100; return LevelRssiError; @@ -629,6 +629,23 @@ void bad_kb_config_switch_mode(BadKbApp* app) { } } +void bad_kb_config_switch_bonding_mode(BadKbApp *app) { + if (app->bonding) { + // set bouding mac + uint8_t mac[6] = BAD_KB_BOUND_MAC_ADDRESS; + furi_hal_bt_set_profile_pairing_method(FuriHalBtProfileHidKeyboard, GapPairingPinCodeVerifyYesNo); + bt_set_profile_mac_address(app->bt, mac); // this also restart bt + // enable keys storage + bt_enable_peer_key_update(app->bt); + } else { + // set back user defined mac address + furi_hal_bt_set_profile_pairing_method(FuriHalBtProfileHidKeyboard, GapPairingNone); + bt_set_profile_mac_address(app->bt, app->mac); + // disable key storage + bt_disable_peer_key_update(app->bt); + } +} + void bad_kb_connection_init(BadKbApp* app) { app->usb_prev_mode = furi_hal_usb_get_config(); furi_hal_usb_set_config(NULL, NULL); @@ -636,13 +653,22 @@ void bad_kb_connection_init(BadKbApp* app) { bt_timeout = bt_hid_delays[LevelRssi39_0]; bt_disconnect(app->bt); // furi_delay_ms(200); - bt_keys_storage_set_storage_path(app->bt, HID_BT_KEYS_STORAGE_PATH); + bt_keys_storage_set_storage_path(app->bt, BAD_KB_APP_PATH_BOUND_KEYS_FILE); + app->bt_prev_mode = furi_hal_bt_get_profile_pairing_method(FuriHalBtProfileHidKeyboard); + if (app->bonding) { // usefull if bounding become an XTREME setting + uint8_t mac[6] = BAD_KB_BOUND_MAC_ADDRESS; + furi_hal_bt_set_profile_mac_addr(FuriHalBtProfileHidKeyboard, mac); + // using GapPairingNone breaks bounding between devices + furi_hal_bt_set_profile_pairing_method(FuriHalBtProfileHidKeyboard, GapPairingPinCodeVerifyYesNo); + } else { + furi_hal_bt_set_profile_pairing_method(FuriHalBtProfileHidKeyboard, GapPairingNone); + } + bt_set_profile(app->bt, BtProfileHidKeyboard); - app->bt_prev_mode = bt_get_profile_pairing_method(app->bt); - bt_set_profile_pairing_method(app->bt, GapPairingNone); - bt_disable_peer_key_update(app->bt); // disable peer key adding to bt SRAM storage if(app->is_bt) { furi_hal_bt_start_advertising(); + if (!app->bonding) + bt_disable_peer_key_update(app->bt); // disable peer key adding to bt SRAM storage } else { furi_hal_bt_stop_advertising(); } @@ -659,11 +685,16 @@ void bad_kb_connection_deinit(BadKbApp* app) { bt_disconnect(app->bt); // stop ble // furi_delay_ms(200); // Wait 2nd core to update nvm storage bt_keys_storage_set_default_path(app->bt); - bt_set_profile_pairing_method(app->bt, app->bt_prev_mode); + if (app->bonding) { + // hal primitives doesn't restarts ble, that's what we want cuz we are shutting down + furi_hal_bt_set_profile_mac_addr(FuriHalBtProfileHidKeyboard, app->mac); + }else { + bt_enable_peer_key_update(app->bt); // starts saving peer keys (bounded devices) + } // fails if ble radio stack isn't ready when switching profile // if it happens, maybe we should increase the delay after bt_disconnect bt_set_profile(app->bt, BtProfileSerial); - bt_enable_peer_key_update(app->bt); // starts saving peer keys (bounded devices) + furi_hal_bt_set_profile_pairing_method(FuriHalBtProfileHidKeyboard, app->bt_prev_mode); } static int32_t bad_kb_worker(void* context) { diff --git a/applications/main/bad_kb/bad_kb_script.h b/applications/main/bad_kb/bad_kb_script.h index 5699e4189..2f9097cb7 100644 --- a/applications/main/bad_kb/bad_kb_script.h +++ b/applications/main/bad_kb/bad_kb_script.h @@ -36,6 +36,8 @@ typedef struct { void bad_kb_config_switch_mode(BadKbApp* app); +void bad_kb_config_switch_bonding_mode(BadKbApp *app); + void bad_kb_connection_init(BadKbApp* app); void bad_kb_connection_deinit(BadKbApp* app); diff --git a/applications/main/bad_kb/scenes/bad_kb_scene_config_bt.c b/applications/main/bad_kb/scenes/bad_kb_scene_config_bt.c index 1a867f877..fa2a8ec8d 100644 --- a/applications/main/bad_kb/scenes/bad_kb_scene_config_bt.c +++ b/applications/main/bad_kb/scenes/bad_kb_scene_config_bt.c @@ -5,6 +5,7 @@ enum VarItemListIndex { VarItemListIndexConnection, + VarItemListIndexBonding, VarItemListIndexKeyboardLayout, VarItemListIndexAdvertisementName, VarItemListIndexMacAddress, @@ -19,6 +20,13 @@ void bad_kb_scene_config_bt_connection_callback(VariableItem* item) { view_dispatcher_send_custom_event(bad_kb->view_dispatcher, VarItemListIndexConnection); } +void bad_kb_scene_config_bt_bounding_callback(VariableItem* item) { + BadKbApp* bad_kb = variable_item_get_context(item); + bad_kb->bonding = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, bad_kb->bonding ? "Remember" : "Forget"); + view_dispatcher_send_custom_event(bad_kb->view_dispatcher, VarItemListIndexBonding); +} + void bad_kb_scene_config_bt_var_item_list_callback(void* context, uint32_t index) { BadKbApp* bad_kb = context; view_dispatcher_send_custom_event(bad_kb->view_dispatcher, index); @@ -34,11 +42,19 @@ void bad_kb_scene_config_bt_on_enter(void* context) { variable_item_set_current_value_index(item, bad_kb->is_bt); variable_item_set_current_value_text(item, bad_kb->is_bt ? "BT" : "USB"); + item = variable_item_list_add( + var_item_list, "Bonding", 2, bad_kb_scene_config_bt_bounding_callback, bad_kb); + variable_item_set_current_value_index(item, bad_kb->bonding); + variable_item_set_current_value_text(item, bad_kb->bonding ? "Remember" : "Forget"); + item = variable_item_list_add(var_item_list, "Keyboard layout", 0, NULL, bad_kb); item = variable_item_list_add(var_item_list, "BT device name", 0, NULL, bad_kb); - - item = variable_item_list_add(var_item_list, "BT MAC address", 0, NULL, bad_kb); + + // this doesn't update instantly when toggling between Bounding modes + if (!bad_kb->bonding) { + item = variable_item_list_add(var_item_list, "BT MAC address", 0, NULL, bad_kb); + } variable_item_list_set_enter_callback( var_item_list, bad_kb_scene_config_bt_var_item_list_callback, bad_kb); @@ -57,6 +73,8 @@ bool bad_kb_scene_config_bt_on_event(void* context, SceneManagerEvent event) { scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigLayout); } else if(event.event == VarItemListIndexConnection) { bad_kb_config_switch_mode(bad_kb); + } else if (event.event == VarItemListIndexBonding) { + bad_kb_config_switch_bonding_mode(bad_kb); } else if(event.event == VarItemListIndexAdvertisementName) { scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigName); } else if(event.event == VarItemListIndexMacAddress) { diff --git a/applications/services/bt/bt_service/bt.c b/applications/services/bt/bt_service/bt.c index 7cef8e140..964eff28d 100644 --- a/applications/services/bt/bt_service/bt.c +++ b/applications/services/bt/bt_service/bt.c @@ -424,17 +424,15 @@ const uint8_t* bt_get_profile_mac_address(Bt* bt) { return furi_hal_bt_get_profile_mac_addr(get_hal_bt_profile(bt->profile)); } -bool bt_remote_rssi(Bt* bt, BtRssi* rssi) { +bool bt_remote_rssi(Bt* bt, uint8_t* rssi) { furi_assert(bt); - UNUSED(rssi); uint8_t rssi_val; uint32_t since = furi_hal_bt_get_conn_rssi(&rssi_val); if(since == 0) return false; - rssi->rssi = rssi_val; - rssi->since = since; + *rssi = rssi_val; return true; } @@ -456,6 +454,7 @@ void bt_disable_peer_key_update(Bt* bt) { } void bt_enable_peer_key_update(Bt* bt) { + furi_assert(bt); furi_hal_bt_set_key_storage_change_callback(bt_on_key_storage_change_callback, bt); } diff --git a/applications/services/bt/bt_service/bt.h b/applications/services/bt/bt_service/bt.h index a79c227f7..eb762dbf4 100644 --- a/applications/services/bt/bt_service/bt.h +++ b/applications/services/bt/bt_service/bt.h @@ -47,7 +47,7 @@ const char* bt_get_profile_adv_name(Bt* bt); void bt_set_profile_mac_address(Bt* bt, const uint8_t mac[6]); const uint8_t* bt_get_profile_mac_address(Bt* bt); -bool bt_remote_rssi(Bt* bt, BtRssi* rssi); +bool bt_remote_rssi(Bt* bt, uint8_t* rssi); void bt_set_profile_pairing_method(Bt* bt, GapPairing pairing_method); GapPairing bt_get_profile_pairing_method(Bt* bt); diff --git a/applications/settings/bt_settings_app/scenes/bt_settings_scene_forget_dev_confirm.c b/applications/settings/bt_settings_app/scenes/bt_settings_scene_forget_dev_confirm.c index 31921b9f3..c912f2e5d 100644 --- a/applications/settings/bt_settings_app/scenes/bt_settings_scene_forget_dev_confirm.c +++ b/applications/settings/bt_settings_app/scenes/bt_settings_scene_forget_dev_confirm.c @@ -1,5 +1,6 @@ #include "../bt_settings_app.h" #include +#include void bt_settings_scene_forget_dev_confirm_dialog_callback(DialogExResult result, void* context) { furi_assert(context); @@ -30,6 +31,11 @@ bool bt_settings_scene_forget_dev_confirm_on_event(void* context, SceneManagerEv consumed = scene_manager_previous_scene(app->scene_manager); } else if(event.event == DialogExResultRight) { bt_forget_bonded_devices(app->bt); + // also removes keys of badkb bonded devices + bt_keys_storage_set_storage_path(app->bt, BAD_KB_APP_PATH_BOUND_KEYS_FILE); + bt_forget_bonded_devices(app->bt); + bt_keys_storage_set_default_path(app->bt); + scene_manager_next_scene(app->scene_manager, BtSettingsAppSceneForgetDevSuccess); consumed = true; } diff --git a/firmware/targets/f7/api_symbols.csv b/firmware/targets/f7/api_symbols.csv index 2db05fc50..68f0ce8ab 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,+,14.1,, +Version,+,15.0,, Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/cli/cli.h,, Header,+,applications/services/cli/cli_vcp.h,, @@ -589,7 +589,7 @@ Function,+,bt_get_profile_mac_address,const uint8_t*,Bt* Function,+,bt_get_profile_pairing_method,GapPairing,Bt* Function,+,bt_keys_storage_set_default_path,void,Bt* Function,+,bt_keys_storage_set_storage_path,void,"Bt*, const char*" -Function,+,bt_remote_rssi,_Bool,"Bt*, BtRssi*" +Function,+,bt_remote_rssi,_Bool,"Bt*, uint8_t*" Function,+,bt_set_profile,_Bool,"Bt*, BtProfile" Function,+,bt_set_profile_adv_name,void,"Bt*, const char*, ..." Function,+,bt_set_profile_mac_address,void,"Bt*, const uint8_t[6]" diff --git a/firmware/targets/f7/ble_glue/gap.c b/firmware/targets/f7/ble_glue/gap.c index 0a317b574..ebf27b369 100644 --- a/firmware/targets/f7/ble_glue/gap.c +++ b/firmware/targets/f7/ble_glue/gap.c @@ -373,6 +373,7 @@ static void gap_init_svc(Gap* gap) { bool keypress_supported = false; uint8_t conf_mitm = CFG_MITM_PROTECTION; uint8_t conf_used_fixed_pin = CFG_USED_FIXED_PIN; + bool conf_bonding = gap->config->bonding_mode; if(gap->config->pairing_method == GapPairingPinCodeShow) { aci_gap_set_io_capability(IO_CAP_DISPLAY_ONLY); } else if(gap->config->pairing_method == GapPairingPinCodeVerifyYesNo) { @@ -382,6 +383,7 @@ static void gap_init_svc(Gap* gap) { // Just works pairing method (IOS accept it, it seems android and linux doesn't) conf_mitm = 0; conf_used_fixed_pin = 0; + conf_bonding = false; // if just works isn't supported, we want the numeric comparaison method aci_gap_set_io_capability(IO_CAP_DISPLAY_YES_NO); keypress_supported = true; @@ -389,7 +391,7 @@ static void gap_init_svc(Gap* gap) { // Setup authentication aci_gap_set_authentication_requirement( - gap->config->bonding_mode, + conf_bonding, conf_mitm, CFG_SC_SUPPORT, keypress_supported, From 8deb29a8ff328205071d92a3792da4d1a77dfdcc Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Tue, 28 Feb 2023 21:45:55 +0300 Subject: [PATCH 406/506] Fix #370 and fix other protocol counter --- lib/subghz/protocols/faac_slh.c | 6 +----- lib/subghz/protocols/secplus_v2.c | 7 ++----- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/lib/subghz/protocols/faac_slh.c b/lib/subghz/protocols/faac_slh.c index 6918101a9..4b69ae73d 100644 --- a/lib/subghz/protocols/faac_slh.c +++ b/lib/subghz/protocols/faac_slh.c @@ -110,11 +110,7 @@ void subghz_protocol_encoder_faac_slh_free(void* context) { } static bool subghz_protocol_faac_slh_gen_data(SubGhzProtocolEncoderFaacSLH* instance) { - if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) >= 0xFFFF) { - instance->generic.cnt = 0; - } else { - instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); - } + instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); uint32_t fix = instance->generic.serial << 4 | instance->generic.btn; uint32_t hop = 0; uint32_t decrypt = 0; diff --git a/lib/subghz/protocols/secplus_v2.c b/lib/subghz/protocols/secplus_v2.c index 593be0494..9f8c31654 100644 --- a/lib/subghz/protocols/secplus_v2.c +++ b/lib/subghz/protocols/secplus_v2.c @@ -379,11 +379,8 @@ static void subghz_protocol_secplus_v2_encode(SubGhzProtocolEncoderSecPlus_v2* i uint8_t roll_1[9] = {0}; uint8_t roll_2[9] = {0}; - if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) >= 0xFFFF) { - instance->generic.cnt = 0; - } else { - instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); - } + instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); + //ToDo it is not known what value the counter starts if(instance->generic.cnt > 0xFFFFFFF) instance->generic.cnt = 0xE500000; uint32_t rolling = subghz_protocol_blocks_reverse_key(instance->generic.cnt, 28); From fa8ed7f6e4af4d47213d59c1d9c1851aa711d017 Mon Sep 17 00:00:00 2001 From: Willy-JL Date: Tue, 28 Feb 2023 20:34:44 +0000 Subject: [PATCH 407/506] Merge branch 'dev' of https://github.com/DarkFlippers/unleashed-firmware --- .gitignore | 7 +- applications/ReadMe.md | 2 +- applications/debug/accessor/accessor_app.cpp | 2 +- applications/debug/locale_test/locale_test.c | 2 +- .../debug/unit_tests/power/power_test.c | 61 +- applications/debug/unit_tests/rpc/rpc_test.c | 2 +- .../debug/unit_tests/subghz/subghz_test.c | 69 +- applications/debug/unit_tests/test_index.c | 2 +- .../main/archive/helpers/archive_browser.c | 10 +- .../main/gpio/scenes/gpio_scene_start.c | 1 + applications/main/ibutton/ibutton_cli.c | 2 +- .../main/ibutton/scenes/ibutton_scene_start.c | 2 +- applications/main/infrared/infrared.c | 9 + applications/main/infrared/infrared_cli.c | 2 +- applications/main/infrared/infrared_i.h | 6 +- .../infrared/scenes/infrared_scene_config.h | 1 + .../scenes/infrared_scene_debug_settings.c | 59 + .../infrared/scenes/infrared_scene_start.c | 18 +- .../scenes/infrared_scene_universal.c | 1 + applications/main/lfrfid/lfrfid_i.h | 4 +- .../scenes/lfrfid_scene_extra_actions.c | 2 +- .../main/lfrfid/scenes/lfrfid_scene_start.c | 9 +- .../main/subghz/helpers/subghz_custom_event.h | 1 + .../scenes/subghz_scene_ext_module_settings.c | 76 +- .../subghz/scenes/subghz_scene_receiver.c | 10 + .../scenes/subghz_scene_receiver_info.c | 5 + .../main/subghz/scenes/subghz_scene_rpc.c | 5 + .../subghz/scenes/subghz_scene_transmitter.c | 25 + applications/main/subghz/subghz_history.c | 22 + applications/main/subghz/subghz_history.h | 2 + applications/main/subghz/views/receiver.c | 52 +- applications/main/subghz/views/receiver.h | 2 + applications/main/subghz/views/transmitter.c | 144 +++ applications/main/unirfremix/unirfremix_app.c | 5 + applications/main/xtreme_app/xtreme_app.c | 2 +- applications/plugins/dice/dice.c | 8 +- applications/plugins/lightmeter/.clang-format | 191 --- applications/plugins/lightmeter/README.md | 20 +- .../plugins/lightmeter/application.fam | 4 - .../plugins/lightmeter/gui/views/main_view.c | 10 +- .../lightmeter/images/framed_gui_config.png | Bin 249828 -> 0 bytes .../images/framed_gui_lux_meter.png | Bin 235482 -> 0 bytes .../lightmeter/images/framed_gui_main.png | Bin 245948 -> 0 bytes .../plugins/lightmeter/images/gui_config.png | Bin 1818 -> 0 bytes .../lightmeter/images/gui_lux_meter.png | Bin 1640 -> 0 bytes .../plugins/lightmeter/images/gui_main.png | Bin 1911 -> 0 bytes .../plugins/lightmeter/lib/BH1750/BH1750.c | 18 +- .../plugins/lightmeter/lib/BH1750/BH1750.h | 7 + .../plugins/lightmeter/lightmeter_config.h | 1 + .../plugins/lightmeter/module/back.jpg | Bin 2359077 -> 0 bytes .../plugins/lightmeter/module/front.jpg | Bin 1961306 -> 0 bytes .../plugins/lightmeter/module/module.jpg | Bin 2175686 -> 0 bytes .../lightmeter/module/module_v2_enclosure.stl | Bin 1618984 -> 0 bytes .../lightmeter/module/module_v2_gerber.zip | Bin 29323 -> 0 bytes applications/plugins/mousejacker/README.md | 62 - .../plugins/mousejacker/application.fam | 2 +- .../plugins/mousejacker/icons/badkb_10px.png | Bin 576 -> 0 bytes .../plugins/mousejacker/icons/sub1_10px.png | Bin 299 -> 0 bytes .../plugins/mousejacker/mousejacker.c | 2 +- .../plugins/mousejacker/mousejacker_ducky.c | 121 +- applications/plugins/nrfsniff/nrfsniff.c | 2 +- applications/plugins/picopass/application.fam | 4 +- applications/plugins/picopass/picopass.c | 16 +- .../plugins/picopass/picopass_device.c | 2 +- .../plugins/picopass/picopass_device.h | 1 + applications/plugins/picopass/picopass_i.h | 12 + .../plugins/picopass/picopass_worker.c | 165 ++- .../plugins/picopass/picopass_worker.h | 1 + .../plugins/picopass/picopass_worker_i.h | 1 + .../picopass/scenes/picopass_scene_config.h | 2 + .../scenes/picopass_scene_read_card.c | 11 +- .../scenes/picopass_scene_read_card_success.c | 54 +- .../picopass_scene_read_factory_success.c | 78 ++ .../scenes/picopass_scene_save_name.c | 2 +- .../picopass/scenes/picopass_scene_start.c | 7 +- .../picopass_scene_write_card_success.c | 13 + .../scenes/picopass_scene_write_key.c | 53 + applications/services/applications.h | 1 - applications/services/bt/bt_service/bt.c | 2 +- applications/services/cli/cli.c | 2 +- applications/services/cli/cli_commands.c | 47 +- .../desktop/animations/animation_manager.c | 2 +- .../desktop/animations/animation_manager.h | 2 +- .../desktop/animations/animation_storage.c | 61 +- applications/services/desktop/desktop.c | 75 +- .../desktop/scenes/desktop_scene_main.c | 2 +- .../desktop/views/desktop_view_debug.c | 3 +- .../desktop/views/desktop_view_lock_menu.c | 4 - .../desktop/views/desktop_view_main.c | 1 - .../desktop/views/desktop_view_slideshow.c | 6 +- applications/services/dolphin/dolphin.c | 19 +- applications/services/dolphin/dolphin.h | 4 - .../services/dolphin/helpers/dolphin_state.c | 2 +- applications/services/gui/canvas.c | 12 +- applications/services/gui/canvas.h | 8 +- applications/services/gui/canvas_i.h | 2 +- applications/services/gui/elements.c | 2 +- applications/services/gui/gui.c | 2 +- applications/services/gui/gui.h | 2 +- applications/services/gui/icon_animation.c | 8 +- applications/services/gui/icon_animation.h | 6 +- applications/services/gui/icon_animation_i.h | 2 +- .../widget_element_text_scroll.c | 4 +- applications/services/gui/scene_manager.c | 4 +- applications/services/gui/scene_manager.h | 4 +- applications/services/gui/view_port.c | 6 +- applications/services/gui/view_port.h | 6 +- applications/services/loader/loader.c | 34 +- applications/services/loader/loader.h | 2 +- applications/services/locale/locale.h | 2 +- applications/services/power/power_cli.c | 30 - .../services/power/power_service/power.c | 15 +- .../services/power/power_service/power.h | 2 +- applications/services/storage/storage_cli.c | 21 +- .../services/storage/storage_external_api.c | 9 +- applications/services/storage/storage_glue.c | 18 +- applications/services/storage/storage_glue.h | 3 - .../services/storage/storage_message.h | 3 +- .../services/storage/storage_processing.c | 39 +- .../services/storage/storage_sd_api.h | 10 + .../services/storage/storages/storage_ext.c | 33 +- applications/settings/about/about.c | 28 +- .../bt_settings_scene_forget_dev_success.c | 1 - .../power_settings_scene_battery_info.c | 2 +- .../power_settings_app/views/battery_info.c | 6 +- .../power_settings_app/views/battery_info.h | 2 +- .../scenes/storage_settings_scene_sd_info.c | 65 +- .../updater/util/update_task_worker_backup.c | 33 +- fbt_options.py | 2 +- firmware.scons | 3 +- firmware/targets/f18/api_symbols.csv | 17 +- firmware/targets/f18/furi_hal/furi_hal.c | 1 + .../targets/f18/furi_hal/furi_hal_resources.c | 24 + .../targets/f18/furi_hal/furi_hal_resources.h | 7 + firmware/targets/f7/api_symbols.csv | 73 +- firmware/targets/f7/fatfs/sd_spi_io.c | 38 +- firmware/targets/f7/fatfs/sd_spi_io.h | 1 + firmware/targets/f7/fatfs/sector_cache.c | 5 - firmware/targets/f7/fatfs/spi_sd_hal.c | 98 -- firmware/targets/f7/fatfs/stm32_adafruit_sd.c | 1113 ----------------- firmware/targets/f7/fatfs/stm32_adafruit_sd.h | 245 ---- firmware/targets/f7/fatfs/user_diskio.c | 73 +- firmware/targets/f7/fatfs/user_diskio.h | 2 +- firmware/targets/f7/furi_hal/furi_hal.c | 1 + firmware/targets/f7/furi_hal/furi_hal_bt.c | 40 +- .../targets/f7/furi_hal/furi_hal_bt_hid.c | 7 + firmware/targets/f7/furi_hal/furi_hal_gpio.c | 33 +- .../targets/f7/furi_hal/furi_hal_ibutton.c | 43 +- .../targets/f7/furi_hal/furi_hal_ibutton.h | 66 +- .../targets/f7/furi_hal/furi_hal_infrared.c | 211 ++-- .../targets/f7/furi_hal/furi_hal_interrupt.c | 17 + firmware/targets/f7/furi_hal/furi_hal_power.c | 12 +- .../targets/f7/furi_hal/furi_hal_random.c | 1 + firmware/targets/f7/furi_hal/furi_hal_rfid.c | 56 +- firmware/targets/f7/furi_hal/furi_hal_rtc.c | 2 +- .../targets/f7/furi_hal/furi_hal_subghz.c | 9 + .../targets/f7/furi_hal/furi_hal_subghz.h | 11 + firmware/targets/f7/src/update.c | 4 +- .../furi_hal_include/furi_hal_infrared.h | 6 + .../targets/furi_hal_include/furi_hal_power.h | 10 +- furi/core/event_flag.c | 2 +- furi/core/log.c | 31 +- furi/core/log.h | 51 +- furi/core/thread.c | 13 +- furi/core/thread.h | 12 + furi/flipper.c | 7 +- lib/STM32CubeWB.scons | 10 +- lib/drivers/bq25896.c | 19 +- lib/drivers/bq25896.h | 4 +- lib/drivers/cc1101.c | 15 +- lib/misc.scons | 8 +- lib/one_wire/ibutton/ibutton_worker.c | 4 +- lib/one_wire/ibutton/ibutton_worker_modes.c | 13 +- lib/one_wire/one_wire_host.c | 48 +- lib/one_wire/one_wire_host.h | 6 +- lib/one_wire/one_wire_slave.c | 51 +- lib/one_wire/one_wire_slave.h | 4 +- .../helpers/subghz_config_preset_custom.c | 326 ----- .../helpers/subghz_config_preset_custom.h | 193 --- lib/subghz/protocols/alutech_at_4n.c | 136 +- lib/subghz/protocols/alutech_at_4n.h | 10 +- lib/subghz/protocols/came_atomo.c | 6 +- lib/subghz/protocols/faac_slh.c | 6 +- lib/subghz/protocols/keeloq.c | 158 ++- lib/subghz/protocols/keeloq.h | 7 + lib/subghz/protocols/kinggates_stylo_4k.c | 6 +- lib/subghz/protocols/nice_flor_s.c | 100 +- lib/subghz/protocols/nice_flor_s.h | 8 + lib/subghz/protocols/pocsag.c | 363 ------ lib/subghz/protocols/pocsag.h | 7 - lib/subghz/protocols/secplus_v2.c | 6 +- lib/subghz/protocols/somfy_keytis.c | 6 +- lib/subghz/protocols/somfy_telis.c | 6 +- lib/subghz/protocols/star_line.c | 6 +- lib/subghz/subghz_keystore.h | 2 +- lib/toolbox/level_duration.h | 4 +- scripts/assets.py | 2 - scripts/fbt/appmanifest.py | 5 +- scripts/fbt/util.py | 4 + scripts/fbt_tools/fbt_assets.py | 4 +- scripts/fbt_tools/fbt_debugopts.py | 1 + scripts/fbt_tools/fbt_extapps.py | 1 - scripts/fbt_tools/fbt_sdk.py | 4 +- scripts/fbt_tools/sconsrecursiveglob.py | 8 +- scripts/flipper/assets/dolphin.py | 43 +- scripts/flipper/assets/icon.py | 2 +- scripts/merge_report_qa.py | 2 +- scripts/runfap.py | 21 +- scripts/sconsdist.py | 12 +- scripts/update.py | 2 +- scripts/version.py | 62 +- test_iso7816_helpers.c | 243 ---- test_mrtd_helpers.c | 520 -------- 213 files changed, 2509 insertions(+), 4465 deletions(-) create mode 100644 applications/main/infrared/scenes/infrared_scene_debug_settings.c delete mode 100644 applications/plugins/lightmeter/.clang-format delete mode 100644 applications/plugins/lightmeter/images/framed_gui_config.png delete mode 100644 applications/plugins/lightmeter/images/framed_gui_lux_meter.png delete mode 100644 applications/plugins/lightmeter/images/framed_gui_main.png delete mode 100644 applications/plugins/lightmeter/images/gui_config.png delete mode 100644 applications/plugins/lightmeter/images/gui_lux_meter.png delete mode 100644 applications/plugins/lightmeter/images/gui_main.png delete mode 100644 applications/plugins/lightmeter/module/back.jpg delete mode 100644 applications/plugins/lightmeter/module/front.jpg delete mode 100644 applications/plugins/lightmeter/module/module.jpg delete mode 100644 applications/plugins/lightmeter/module/module_v2_enclosure.stl delete mode 100644 applications/plugins/lightmeter/module/module_v2_gerber.zip delete mode 100644 applications/plugins/mousejacker/README.md delete mode 100644 applications/plugins/mousejacker/icons/badkb_10px.png delete mode 100644 applications/plugins/mousejacker/icons/sub1_10px.png create mode 100644 applications/plugins/picopass/scenes/picopass_scene_read_factory_success.c create mode 100644 applications/plugins/picopass/scenes/picopass_scene_write_key.c delete mode 100644 firmware/targets/f7/fatfs/spi_sd_hal.c delete mode 100644 firmware/targets/f7/fatfs/stm32_adafruit_sd.c delete mode 100644 firmware/targets/f7/fatfs/stm32_adafruit_sd.h delete mode 100644 lib/subghz/helpers/subghz_config_preset_custom.c delete mode 100644 lib/subghz/helpers/subghz_config_preset_custom.h delete mode 100644 lib/subghz/protocols/pocsag.c delete mode 100644 lib/subghz/protocols/pocsag.h delete mode 100644 test_iso7816_helpers.c delete mode 100644 test_mrtd_helpers.c diff --git a/.gitignore b/.gitignore index 025246faa..f816372fa 100644 --- a/.gitignore +++ b/.gitignore @@ -34,6 +34,10 @@ Brewfile.lock.json # Visual Studio .vs/ +# Kate +.kateproject +.kateconfig + # legendary cmake's build CMakeLists.txt @@ -68,9 +72,8 @@ PVS-Studio.log # Automate files, etc automate.py deployments/ -fbt_options.py commitnotes.md -lib/STM32CubeWB +fbt_options.py # Asset packs assets/dolphin/custom/* diff --git a/applications/ReadMe.md b/applications/ReadMe.md index efc9afd86..ddbe5d65b 100644 --- a/applications/ReadMe.md +++ b/applications/ReadMe.md @@ -86,4 +86,4 @@ Small applications providing configuration for basic firmware and its services. Utility apps not visible in other menus. - `storage_move_to_sd` - Data migration tool for internal storage -- `updater` - updater service & application +- `updater` - Update service & application diff --git a/applications/debug/accessor/accessor_app.cpp b/applications/debug/accessor/accessor_app.cpp index 9d3708ebe..337437d0e 100644 --- a/applications/debug/accessor/accessor_app.cpp +++ b/applications/debug/accessor/accessor_app.cpp @@ -34,7 +34,7 @@ void AccessorApp::run(void) { AccessorApp::AccessorApp() : text_store{0} { notification = static_cast(furi_record_open(RECORD_NOTIFICATION)); - onewire_host = onewire_host_alloc(); + onewire_host = onewire_host_alloc(&ibutton_gpio); furi_hal_power_enable_otg(); } diff --git a/applications/debug/locale_test/locale_test.c b/applications/debug/locale_test/locale_test.c index 46248cf3c..003df55dc 100644 --- a/applications/debug/locale_test/locale_test.c +++ b/applications/debug/locale_test/locale_test.c @@ -99,4 +99,4 @@ int32_t locale_test_app(void* p) { view_dispatcher_run(app->view_dispatcher); locale_test_free(app); return 0; -} \ No newline at end of file +} diff --git a/applications/debug/unit_tests/power/power_test.c b/applications/debug/unit_tests/power/power_test.c index ce2c7aad7..a9b66b221 100644 --- a/applications/debug/unit_tests/power/power_test.c +++ b/applications/debug/unit_tests/power/power_test.c @@ -3,56 +3,63 @@ #include "../minunit.h" static void power_test_deinit(void) { - // Try to reset to default charging voltage - furi_hal_power_set_battery_charging_voltage(4.208f); + // Try to reset to default charge voltage limit + furi_hal_power_set_battery_charge_voltage_limit(4.208f); } -MU_TEST(test_power_charge_voltage_exact) { - // Power of 16mV charge voltages get applied exactly +MU_TEST(test_power_charge_voltage_limit_exact) { + // Power of 16mV charge voltage limits get applied exactly // (bq25896 charge controller works in 16mV increments) // // This test may need adapted if other charge controllers are used in the future. for(uint16_t charge_mv = 3840; charge_mv <= 4208; charge_mv += 16) { float charge_volt = (float)charge_mv / 1000.0f; - furi_hal_power_set_battery_charging_voltage(charge_volt); - mu_assert_double_eq(charge_volt, furi_hal_power_get_battery_charging_voltage()); + furi_hal_power_set_battery_charge_voltage_limit(charge_volt); + mu_assert_double_eq(charge_volt, furi_hal_power_get_battery_charge_voltage_limit()); } } -MU_TEST(test_power_charge_voltage_floating_imprecision) { +MU_TEST(test_power_charge_voltage_limit_floating_imprecision) { // 4.016f should act as 4.016 V, even with floating point imprecision - furi_hal_power_set_battery_charging_voltage(4.016f); - mu_assert_double_eq(4.016f, furi_hal_power_get_battery_charging_voltage()); + furi_hal_power_set_battery_charge_voltage_limit(4.016f); + mu_assert_double_eq(4.016f, furi_hal_power_get_battery_charge_voltage_limit()); } -MU_TEST(test_power_charge_voltage_inexact) { - // Charge voltages that are not power of 16mV get truncated down - furi_hal_power_set_battery_charging_voltage(3.841f); - mu_assert_double_eq(3.840, furi_hal_power_get_battery_charging_voltage()); +MU_TEST(test_power_charge_voltage_limit_inexact) { + // Charge voltage limits that are not power of 16mV get truncated down + furi_hal_power_set_battery_charge_voltage_limit(3.841f); + mu_assert_double_eq(3.840, furi_hal_power_get_battery_charge_voltage_limit()); - furi_hal_power_set_battery_charging_voltage(3.900f); - mu_assert_double_eq(3.888, furi_hal_power_get_battery_charging_voltage()); + furi_hal_power_set_battery_charge_voltage_limit(3.900f); + mu_assert_double_eq(3.888, furi_hal_power_get_battery_charge_voltage_limit()); - furi_hal_power_set_battery_charging_voltage(4.200f); - mu_assert_double_eq(4.192, furi_hal_power_get_battery_charging_voltage()); + furi_hal_power_set_battery_charge_voltage_limit(4.200f); + mu_assert_double_eq(4.192, furi_hal_power_get_battery_charge_voltage_limit()); } -MU_TEST(test_power_charge_voltage_invalid_clamped) { - // Out-of-range charge voltages get clamped to 3.840 V and 4.208 V - furi_hal_power_set_battery_charging_voltage(3.808f); - mu_assert_double_eq(3.840, furi_hal_power_get_battery_charging_voltage()); +MU_TEST(test_power_charge_voltage_limit_invalid_clamped) { + // Out-of-range charge voltage limits get clamped to 3.840 V and 4.208 V + furi_hal_power_set_battery_charge_voltage_limit(3.808f); + mu_assert_double_eq(3.840, furi_hal_power_get_battery_charge_voltage_limit()); + furi_hal_power_set_battery_charge_voltage_limit(1.0f); + mu_assert_double_eq(3.840, furi_hal_power_get_battery_charge_voltage_limit()); // NOTE: Intentionally picking a small increment above 4.208 V to reduce the risk of an // unhappy battery if this fails. - furi_hal_power_set_battery_charging_voltage(4.240f); - mu_assert_double_eq(4.208, furi_hal_power_get_battery_charging_voltage()); + furi_hal_power_set_battery_charge_voltage_limit(4.240f); + mu_assert_double_eq(4.208, furi_hal_power_get_battery_charge_voltage_limit()); + // Likewise, picking a number that the uint8_t wraparound in the driver would result in a + // VREG value under 23 if this test fails. + // E.g. (uint8_t)((8105-3840)/16) -> 10 + furi_hal_power_set_battery_charge_voltage_limit(8.105f); + mu_assert_double_eq(4.208, furi_hal_power_get_battery_charge_voltage_limit()); } MU_TEST_SUITE(test_power_suite) { - MU_RUN_TEST(test_power_charge_voltage_exact); - MU_RUN_TEST(test_power_charge_voltage_floating_imprecision); - MU_RUN_TEST(test_power_charge_voltage_inexact); - MU_RUN_TEST(test_power_charge_voltage_invalid_clamped); + MU_RUN_TEST(test_power_charge_voltage_limit_exact); + MU_RUN_TEST(test_power_charge_voltage_limit_floating_imprecision); + MU_RUN_TEST(test_power_charge_voltage_limit_inexact); + MU_RUN_TEST(test_power_charge_voltage_limit_invalid_clamped); power_test_deinit(); } diff --git a/applications/debug/unit_tests/rpc/rpc_test.c b/applications/debug/unit_tests/rpc/rpc_test.c index 5b52df2fa..76acf6be9 100644 --- a/applications/debug/unit_tests/rpc/rpc_test.c +++ b/applications/debug/unit_tests/rpc/rpc_test.c @@ -89,7 +89,7 @@ static void test_rpc_setup(void) { } furi_check(rpc_session[0].session); - rpc_session[0].output_stream = furi_stream_buffer_alloc(1000, 1); + rpc_session[0].output_stream = furi_stream_buffer_alloc(4096, 1); rpc_session_set_send_bytes_callback(rpc_session[0].session, output_bytes_callback); rpc_session[0].close_session_semaphore = xSemaphoreCreateBinary(); rpc_session[0].terminate_semaphore = xSemaphoreCreateBinary(); diff --git a/applications/debug/unit_tests/subghz/subghz_test.c b/applications/debug/unit_tests/subghz/subghz_test.c index fcd3dbded..c7e9c96f1 100644 --- a/applications/debug/unit_tests/subghz/subghz_test.c +++ b/applications/debug/unit_tests/subghz/subghz_test.c @@ -12,8 +12,9 @@ #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") +#define ALUTECH_AT_4N_DIR_NAME EXT_PATH("subghz/assets/alutech_at_4n") #define TEST_RANDOM_DIR_NAME EXT_PATH("unit_tests/subghz/test_random_raw.sub") -#define TEST_RANDOM_COUNT_PARSE 273 +#define TEST_RANDOM_COUNT_PARSE 329 #define TEST_TIMEOUT 10000 static SubGhzEnvironment* environment_handler; @@ -43,6 +44,8 @@ static void subghz_test_init(void) { environment_handler, CAME_ATOMO_DIR_NAME); subghz_environment_set_nice_flor_s_rainbow_table_file_name( environment_handler, NICE_FLOR_S_DIR_NAME); + subghz_environment_set_alutech_at_4n_rainbow_table_file_name( + environment_handler, ALUTECH_AT_4N_DIR_NAME); subghz_environment_set_protocol_registry( environment_handler, (void*)&subghz_protocol_registry); @@ -489,6 +492,14 @@ MU_TEST(subghz_decoder_linear_test) { "Test decoder " SUBGHZ_PROTOCOL_LINEAR_NAME " error\r\n"); } +MU_TEST(subghz_decoder_linear_delta3_test) { + mu_assert( + subghz_decoder_test( + EXT_PATH("unit_tests/subghz/linear_delta3_raw.sub"), + SUBGHZ_PROTOCOL_LINEAR_DELTA3_NAME), + "Test decoder " SUBGHZ_PROTOCOL_LINEAR_DELTA3_NAME " error\r\n"); +} + MU_TEST(subghz_decoder_megacode_test) { mu_assert( subghz_decoder_test( @@ -590,12 +601,6 @@ MU_TEST(subghz_decoder_ansonic_test) { "Test decoder " SUBGHZ_PROTOCOL_ANSONIC_NAME " error\r\n"); } -MU_TEST(subghz_decoder_pocsag_test) { - mu_assert( - subghz_decoder_test(EXT_PATH("unit_tests/subghz/pocsag.sub"), SUBGHZ_PROTOCOL_POCSAG_NAME), - "Test decoder " SUBGHZ_PROTOCOL_POCSAG_NAME " error\r\n"); -} - MU_TEST(subghz_decoder_smc5326_test) { mu_assert( subghz_decoder_test( @@ -610,6 +615,36 @@ MU_TEST(subghz_decoder_holtek_ht12x_test) { "Test decoder " SUBGHZ_PROTOCOL_HOLTEK_HT12X_NAME " error\r\n"); } +MU_TEST(subghz_decoder_dooya_test) { + mu_assert( + subghz_decoder_test( + EXT_PATH("unit_tests/subghz/dooya_raw.sub"), SUBGHZ_PROTOCOL_DOOYA_NAME), + "Test decoder " SUBGHZ_PROTOCOL_DOOYA_NAME " error\r\n"); +} + +MU_TEST(subghz_decoder_alutech_at_4n_test) { + mu_assert( + subghz_decoder_test( + EXT_PATH("unit_tests/subghz/alutech_at_4n_raw.sub"), + SUBGHZ_PROTOCOL_ALUTECH_AT_4N_NAME), + "Test decoder " SUBGHZ_PROTOCOL_ALUTECH_AT_4N_NAME " error\r\n"); +} + +MU_TEST(subghz_decoder_nice_one_test) { + mu_assert( + subghz_decoder_test( + EXT_PATH("unit_tests/subghz/nice_one_raw.sub"), SUBGHZ_PROTOCOL_NICE_FLOR_S_NAME), + "Test decoder " SUBGHZ_PROTOCOL_NICE_FLOR_S_NAME " error\r\n"); +} + +MU_TEST(subghz_decoder_kinggates_stylo4k_test) { + mu_assert( + subghz_decoder_test( + EXT_PATH("unit_tests/subghz/kinggates_stylo4k_raw.sub"), + SUBGHZ_PROTOCOL_KINGGATES_STYLO_4K_NAME), + "Test decoder " SUBGHZ_PROTOCOL_KINGGATES_STYLO_4K_NAME " error\r\n"); +} + //test encoders MU_TEST(subghz_encoder_princeton_test) { mu_assert( @@ -653,6 +688,12 @@ MU_TEST(subghz_encoder_linear_test) { "Test encoder " SUBGHZ_PROTOCOL_LINEAR_NAME " error\r\n"); } +MU_TEST(subghz_encoder_linear_delta3_test) { + mu_assert( + subghz_encoder_test(EXT_PATH("unit_tests/subghz/linear_delta3.sub")), + "Test encoder " SUBGHZ_PROTOCOL_LINEAR_DELTA3_NAME " error\r\n"); +} + MU_TEST(subghz_encoder_megacode_test) { mu_assert( subghz_encoder_test(EXT_PATH("unit_tests/subghz/megacode.sub")), @@ -749,6 +790,12 @@ MU_TEST(subghz_encoder_holtek_ht12x_test) { "Test encoder " SUBGHZ_PROTOCOL_HOLTEK_HT12X_NAME " error\r\n"); } +MU_TEST(subghz_encoder_dooya_test) { + mu_assert( + subghz_encoder_test(EXT_PATH("unit_tests/subghz/dooya.sub")), + "Test encoder " SUBGHZ_PROTOCOL_DOOYA_NAME " error\r\n"); +} + MU_TEST(subghz_random_test) { mu_assert(subghz_decode_random_test(TEST_RANDOM_DIR_NAME), "Random test error\r\n"); } @@ -778,6 +825,7 @@ MU_TEST_SUITE(subghz) { MU_RUN_TEST(subghz_decoder_somfy_telis_test); MU_RUN_TEST(subghz_decoder_star_line_test); MU_RUN_TEST(subghz_decoder_linear_test); + MU_RUN_TEST(subghz_decoder_linear_delta3_test); MU_RUN_TEST(subghz_decoder_megacode_test); MU_RUN_TEST(subghz_decoder_secplus_v1_test); MU_RUN_TEST(subghz_decoder_secplus_v2_test); @@ -792,9 +840,12 @@ MU_TEST_SUITE(subghz) { MU_RUN_TEST(subghz_decoder_intertechno_v3_test); MU_RUN_TEST(subghz_decoder_clemsa_test); MU_RUN_TEST(subghz_decoder_ansonic_test); - MU_RUN_TEST(subghz_decoder_pocsag_test); MU_RUN_TEST(subghz_decoder_smc5326_test); MU_RUN_TEST(subghz_decoder_holtek_ht12x_test); + MU_RUN_TEST(subghz_decoder_dooya_test); + MU_RUN_TEST(subghz_decoder_alutech_at_4n_test); + MU_RUN_TEST(subghz_decoder_nice_one_test); + MU_RUN_TEST(subghz_decoder_kinggates_stylo4k_test); MU_RUN_TEST(subghz_encoder_princeton_test); MU_RUN_TEST(subghz_encoder_came_test); @@ -803,6 +854,7 @@ MU_TEST_SUITE(subghz) { MU_RUN_TEST(subghz_encoder_nice_flo_test); MU_RUN_TEST(subghz_encoder_keelog_test); MU_RUN_TEST(subghz_encoder_linear_test); + MU_RUN_TEST(subghz_encoder_linear_delta3_test); MU_RUN_TEST(subghz_encoder_megacode_test); MU_RUN_TEST(subghz_encoder_holtek_test); MU_RUN_TEST(subghz_encoder_secplus_v1_test); @@ -819,6 +871,7 @@ MU_TEST_SUITE(subghz) { MU_RUN_TEST(subghz_encoder_ansonic_test); MU_RUN_TEST(subghz_encoder_smc5326_test); MU_RUN_TEST(subghz_encoder_holtek_ht12x_test); + MU_RUN_TEST(subghz_encoder_dooya_test); MU_RUN_TEST(subghz_random_test); subghz_test_deinit(); diff --git a/applications/debug/unit_tests/test_index.c b/applications/debug/unit_tests/test_index.c index 2bb9c423f..ac71ca397 100644 --- a/applications/debug/unit_tests/test_index.c +++ b/applications/debug/unit_tests/test_index.c @@ -70,7 +70,7 @@ void minunit_print_progress() { } void minunit_print_fail(const char* str) { - printf(FURI_LOG_CLR_E "%s\r\n" FURI_LOG_CLR_RESET, str); + printf(_FURI_LOG_CLR_E "%s\r\n" _FURI_LOG_CLR_RESET, str); } void unit_tests_cli(Cli* cli, FuriString* args, void* context) { diff --git a/applications/main/archive/helpers/archive_browser.c b/applications/main/archive/helpers/archive_browser.c index 78b010a78..c72220c6a 100644 --- a/applications/main/archive/helpers/archive_browser.c +++ b/applications/main/archive/helpers/archive_browser.c @@ -8,6 +8,7 @@ #include #include #include +#include static void archive_folder_open_cb(void* context, uint32_t item_cnt, int32_t file_idx, bool is_root) { @@ -464,14 +465,17 @@ void archive_switch_tab(ArchiveBrowserView* browser, InputKey key) { browser->last_tab_switch_dir = key; - for(int i = 0; i < 2; i++) { + if(key == InputKeyLeft) { + tab = ((tab - 1) + ArchiveTabTotal) % ArchiveTabTotal; + } else { + tab = (tab + 1) % ArchiveTabTotal; + } + if(tab == ArchiveTabInternal && !furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) { if(key == InputKeyLeft) { tab = ((tab - 1) + ArchiveTabTotal) % ArchiveTabTotal; } else { tab = (tab + 1) % ArchiveTabTotal; } - if(tab == ArchiveTabInternal && !furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) continue; - break; } browser->is_root = true; diff --git a/applications/main/gpio/scenes/gpio_scene_start.c b/applications/main/gpio/scenes/gpio_scene_start.c index 1c1a665c7..2d8f7adbc 100644 --- a/applications/main/gpio/scenes/gpio_scene_start.c +++ b/applications/main/gpio/scenes/gpio_scene_start.c @@ -107,6 +107,7 @@ bool gpio_scene_start_on_event(void* context, SceneManagerEvent event) { } else if(event.event == GpioStartEventUsbUart) { scene_manager_set_scene_state(app->scene_manager, GpioSceneStart, GpioItemUsbUart); if(!furi_hal_usb_is_locked()) { + DOLPHIN_DEED(DolphinDeedGpioUartBridge); scene_manager_next_scene(app->scene_manager, GpioSceneUsbUart); } else { scene_manager_next_scene(app->scene_manager, GpioSceneUsbUartCloseRpc); diff --git a/applications/main/ibutton/ibutton_cli.c b/applications/main/ibutton/ibutton_cli.c index fab1ccf05..9ddb079dc 100644 --- a/applications/main/ibutton/ibutton_cli.c +++ b/applications/main/ibutton/ibutton_cli.c @@ -271,7 +271,7 @@ void onewire_cli_print_usage() { static void onewire_cli_search(Cli* cli) { UNUSED(cli); - OneWireHost* onewire = onewire_host_alloc(); + OneWireHost* onewire = onewire_host_alloc(&ibutton_gpio); uint8_t address[8]; bool done = false; diff --git a/applications/main/ibutton/scenes/ibutton_scene_start.c b/applications/main/ibutton/scenes/ibutton_scene_start.c index 28807faa8..b8f6b07d6 100644 --- a/applications/main/ibutton/scenes/ibutton_scene_start.c +++ b/applications/main/ibutton/scenes/ibutton_scene_start.c @@ -39,7 +39,7 @@ bool ibutton_scene_start_on_event(void* context, SceneManagerEvent event) { consumed = true; if(event.event == SubmenuIndexRead) { scene_manager_next_scene(ibutton->scene_manager, iButtonSceneRead); - //DOLPHIN_DEED(DolphinDeedIbuttonRead); + DOLPHIN_DEED(DolphinDeedIbuttonRead); } else if(event.event == SubmenuIndexSaved) { furi_string_set(ibutton->file_path, IBUTTON_APP_FOLDER); scene_manager_next_scene(ibutton->scene_manager, iButtonSceneSelectKey); diff --git a/applications/main/infrared/infrared.c b/applications/main/infrared/infrared.c index 9d78a09b6..14729e0d8 100644 --- a/applications/main/infrared/infrared.c +++ b/applications/main/infrared/infrared.c @@ -148,6 +148,12 @@ static Infrared* infrared_alloc() { view_dispatcher_add_view( view_dispatcher, InfraredViewTextInput, text_input_get_view(infrared->text_input)); + infrared->variable_item_list = variable_item_list_alloc(); + view_dispatcher_add_view( + infrared->view_dispatcher, + InfraredViewVariableItemList, + variable_item_list_get_view(infrared->variable_item_list)); + infrared->dialog_ex = dialog_ex_alloc(); view_dispatcher_add_view( view_dispatcher, InfraredViewDialogEx, dialog_ex_get_view(infrared->dialog_ex)); @@ -195,6 +201,9 @@ static void infrared_free(Infrared* infrared) { view_dispatcher_remove_view(view_dispatcher, InfraredViewTextInput); text_input_free(infrared->text_input); + view_dispatcher_remove_view(infrared->view_dispatcher, InfraredViewVariableItemList); + variable_item_list_free(infrared->variable_item_list); + view_dispatcher_remove_view(view_dispatcher, InfraredViewDialogEx); dialog_ex_free(infrared->dialog_ex); diff --git a/applications/main/infrared/infrared_cli.c b/applications/main/infrared/infrared_cli.c index 5f5e2d4bb..3fa99cb02 100644 --- a/applications/main/infrared/infrared_cli.c +++ b/applications/main/infrared/infrared_cli.c @@ -86,7 +86,7 @@ static void infrared_cli_print_usage(void) { printf("\tir universal \r\n"); printf("\tir universal list \r\n"); // TODO: Do not hardcode universal remote names - printf("\tAvailable universal remotes: tv audio ac\r\n"); + printf("\tAvailable universal remotes: tv audio ac projector\r\n"); } static void infrared_cli_start_ir_rx(Cli* cli, FuriString* args) { diff --git a/applications/main/infrared/infrared_i.h b/applications/main/infrared/infrared_i.h index 6972d53b4..72800d994 100644 --- a/applications/main/infrared/infrared_i.h +++ b/applications/main/infrared/infrared_i.h @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -9,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -32,8 +34,6 @@ #include "rpc/rpc_app.h" -#include - #define INFRARED_FILE_NAME_SIZE 100 #define INFRARED_TEXT_STORE_NUM 2 #define INFRARED_TEXT_STORE_SIZE 128 @@ -87,6 +87,7 @@ struct Infrared { Submenu* submenu; TextInput* text_input; + VariableItemList* variable_item_list; DialogEx* dialog_ex; ButtonMenu* button_menu; Popup* popup; @@ -108,6 +109,7 @@ struct Infrared { typedef enum { InfraredViewSubmenu, InfraredViewTextInput, + InfraredViewVariableItemList, InfraredViewDialogEx, InfraredViewButtonMenu, InfraredViewPopup, diff --git a/applications/main/infrared/scenes/infrared_scene_config.h b/applications/main/infrared/scenes/infrared_scene_config.h index 551485295..b15974941 100644 --- a/applications/main/infrared/scenes/infrared_scene_config.h +++ b/applications/main/infrared/scenes/infrared_scene_config.h @@ -21,4 +21,5 @@ ADD_SCENE(infrared, universal_audio, UniversalAudio) ADD_SCENE(infrared, universal_projector, UniversalProjector) ADD_SCENE(infrared, debug, Debug) ADD_SCENE(infrared, error_databases, ErrorDatabases) +ADD_SCENE(infrared, debug_settings, DebugSettings) ADD_SCENE(infrared, rpc, Rpc) diff --git a/applications/main/infrared/scenes/infrared_scene_debug_settings.c b/applications/main/infrared/scenes/infrared_scene_debug_settings.c new file mode 100644 index 000000000..0bc830788 --- /dev/null +++ b/applications/main/infrared/scenes/infrared_scene_debug_settings.c @@ -0,0 +1,59 @@ +#include "../infrared_i.h" +#include + +uint8_t value_index_ir; + +#define DEB_PINS_COUNT (sizeof(infrared_debug_cfg_variables_text) / sizeof(char* const)) +const char* const infrared_debug_cfg_variables_text[] = { + "Internal", + "2 (A7)", +}; + +static void infrared_scene_debug_settings_changed(VariableItem* item) { + Infrared* infrared = variable_item_get_context(item); + value_index_ir = variable_item_get_current_value_index(item); + UNUSED(infrared); + + variable_item_set_current_value_text(item, infrared_debug_cfg_variables_text[value_index_ir]); + + furi_hal_infrared_set_debug_out(value_index_ir); +} +static void infrared_debug_settings_start_var_list_enter_callback(void* context, uint32_t index) { + Infrared* infrared = context; + view_dispatcher_send_custom_event(infrared->view_dispatcher, index); +} + +void infrared_scene_debug_settings_on_enter(void* context) { + Infrared* infrared = context; + + VariableItemList* variable_item_list = infrared->variable_item_list; + + value_index_ir = furi_hal_infrared_get_debug_out_status(); + VariableItem* item = variable_item_list_add( + variable_item_list, + "Send signal to", + DEB_PINS_COUNT, + infrared_scene_debug_settings_changed, + infrared); + + variable_item_list_set_enter_callback( + variable_item_list, infrared_debug_settings_start_var_list_enter_callback, infrared); + + variable_item_set_current_value_index(item, value_index_ir); + variable_item_set_current_value_text(item, infrared_debug_cfg_variables_text[value_index_ir]); + + view_dispatcher_switch_to_view(infrared->view_dispatcher, InfraredViewVariableItemList); +} + +bool infrared_scene_debug_settings_on_event(void* context, SceneManagerEvent event) { + Infrared* infrared = context; + UNUSED(infrared); + UNUSED(event); + + return false; +} + +void infrared_scene_debug_settings_on_exit(void* context) { + Infrared* infrared = context; + variable_item_list_reset(infrared->variable_item_list); +} diff --git a/applications/main/infrared/scenes/infrared_scene_start.c b/applications/main/infrared/scenes/infrared_scene_start.c index 4d13d6e0e..0403e40f8 100644 --- a/applications/main/infrared/scenes/infrared_scene_start.c +++ b/applications/main/infrared/scenes/infrared_scene_start.c @@ -5,7 +5,8 @@ enum SubmenuIndex { SubmenuIndexLearnNewRemote, SubmenuIndexLearnNewRemoteRaw, SubmenuIndexSavedRemotes, - SubmenuIndexDebug + SubmenuIndexDebug, + SubmenuIndexDebugSettings }; static void infrared_scene_start_submenu_callback(void* context, uint32_t index) { @@ -45,7 +46,17 @@ void infrared_scene_start_on_enter(void* context) { infrared_scene_start_submenu_callback, infrared); submenu_add_item( - submenu, "Debug", SubmenuIndexDebug, infrared_scene_start_submenu_callback, infrared); + submenu, + "Debug RX", + SubmenuIndexDebug, + infrared_scene_start_submenu_callback, + infrared); + submenu_add_item( + submenu, + "Debug Settings", + SubmenuIndexDebugSettings, + infrared_scene_start_submenu_callback, + infrared); } const uint32_t submenu_index = @@ -85,6 +96,9 @@ bool infrared_scene_start_on_event(void* context, SceneManagerEvent event) { } else if(submenu_index == SubmenuIndexDebug) { scene_manager_next_scene(scene_manager, InfraredSceneDebug); consumed = true; + } else if(submenu_index == SubmenuIndexDebugSettings) { + scene_manager_next_scene(scene_manager, InfraredSceneDebugSettings); + consumed = true; } } diff --git a/applications/main/infrared/scenes/infrared_scene_universal.c b/applications/main/infrared/scenes/infrared_scene_universal.c index 1d6021171..b6c1ac983 100644 --- a/applications/main/infrared/scenes/infrared_scene_universal.c +++ b/applications/main/infrared/scenes/infrared_scene_universal.c @@ -80,6 +80,7 @@ bool infrared_scene_universal_on_event(void* context, SceneManagerEvent event) { scene_manager_next_scene(scene_manager, InfraredSceneUniversalAC); consumed = true; } + scene_manager_set_scene_state(scene_manager, InfraredSceneUniversal, event.event); } return consumed; diff --git a/applications/main/lfrfid/lfrfid_i.h b/applications/main/lfrfid/lfrfid_i.h index 201caa4f6..72b061930 100644 --- a/applications/main/lfrfid/lfrfid_i.h +++ b/applications/main/lfrfid/lfrfid_i.h @@ -5,8 +5,10 @@ #include #include +#include #include #include +#include #include #include @@ -32,8 +34,6 @@ #include #include -#include -// #include #define LFRFID_KEY_NAME_SIZE 22 #define LFRFID_TEXT_STORE_SIZE 40 diff --git a/applications/main/lfrfid/scenes/lfrfid_scene_extra_actions.c b/applications/main/lfrfid/scenes/lfrfid_scene_extra_actions.c index b1130d191..efa319c1e 100644 --- a/applications/main/lfrfid/scenes/lfrfid_scene_extra_actions.c +++ b/applications/main/lfrfid/scenes/lfrfid_scene_extra_actions.c @@ -20,7 +20,7 @@ void lfrfid_scene_extra_actions_on_enter(void* context) { submenu_add_item( submenu, - "Read ASK (Animal, FDX)", + "Read ASK (FDX,Regular)", SubmenuIndexASK, lfrfid_scene_extra_actions_submenu_callback, app); diff --git a/applications/main/lfrfid/scenes/lfrfid_scene_start.c b/applications/main/lfrfid/scenes/lfrfid_scene_start.c index 8e1c92dbb..2d83ba53b 100644 --- a/applications/main/lfrfid/scenes/lfrfid_scene_start.c +++ b/applications/main/lfrfid/scenes/lfrfid_scene_start.c @@ -47,21 +47,28 @@ bool lfrfid_scene_start_on_event(void* context, SceneManagerEvent event) { if(event.type == SceneManagerEventTypeCustom) { if(event.event == SubmenuIndexRead) { + scene_manager_set_scene_state(app->scene_manager, LfRfidSceneStart, SubmenuIndexRead); scene_manager_next_scene(app->scene_manager, LfRfidSceneRead); DOLPHIN_DEED(DolphinDeedRfidRead); consumed = true; } else if(event.event == SubmenuIndexSaved) { + // Like in the other apps, explicitly save the scene state + // in each branch in case the user cancels loading a file. + scene_manager_set_scene_state(app->scene_manager, LfRfidSceneStart, SubmenuIndexSaved); furi_string_set(app->file_path, LFRFID_APP_FOLDER); scene_manager_next_scene(app->scene_manager, LfRfidSceneSelectKey); consumed = true; } else if(event.event == SubmenuIndexAddManually) { + scene_manager_set_scene_state( + app->scene_manager, LfRfidSceneStart, SubmenuIndexAddManually); scene_manager_next_scene(app->scene_manager, LfRfidSceneSaveType); consumed = true; } else if(event.event == SubmenuIndexExtraActions) { + scene_manager_set_scene_state( + app->scene_manager, LfRfidSceneStart, SubmenuIndexExtraActions); scene_manager_next_scene(app->scene_manager, LfRfidSceneExtraActions); consumed = true; } - scene_manager_set_scene_state(app->scene_manager, LfRfidSceneStart, event.event); } return consumed; diff --git a/applications/main/subghz/helpers/subghz_custom_event.h b/applications/main/subghz/helpers/subghz_custom_event.h index 350e68ee6..9ac4552f5 100644 --- a/applications/main/subghz/helpers/subghz_custom_event.h +++ b/applications/main/subghz/helpers/subghz_custom_event.h @@ -64,6 +64,7 @@ typedef enum { SubGhzCustomEventViewReceiverBack, SubGhzCustomEventViewReceiverOffDisplay, SubGhzCustomEventViewReceiverUnlock, + SubGhzCustomEventViewReceiverDeleteItem, SubGhzCustomEventViewReadRAWBack, SubGhzCustomEventViewReadRAWIDLE, diff --git a/applications/main/subghz/scenes/subghz_scene_ext_module_settings.c b/applications/main/subghz/scenes/subghz_scene_ext_module_settings.c index 4627c57be..8d1154a13 100644 --- a/applications/main/subghz/scenes/subghz_scene_ext_module_settings.c +++ b/applications/main/subghz/scenes/subghz_scene_ext_module_settings.c @@ -1,8 +1,9 @@ #include "../subghz_i.h" #include "../helpers/subghz_custom_event.h" -uint8_t value_index; -uint8_t value_index2; +uint8_t value_index_exm; +uint8_t value_index_dpin; +uint8_t value_index_cnt; #define EXT_MODULES_COUNT (sizeof(radio_modules_variables_text) / sizeof(char* const)) const char* const radio_modules_variables_text[] = { @@ -16,12 +17,19 @@ const char* const debug_pin_text[DEBUG_P_COUNT] = { "17(1W)", }; +#define DEBUG_COUNTER_COUNT 3 +const char* const debug_counter_text[DEBUG_COUNTER_COUNT] = { + "+1", + "+5", + "+10", +}; + static void subghz_scene_ext_module_changed(VariableItem* item) { SubGhz* subghz = variable_item_get_context(item); - value_index = variable_item_get_current_value_index(item); + value_index_exm = variable_item_get_current_value_index(item); UNUSED(subghz); - variable_item_set_current_value_text(item, radio_modules_variables_text[value_index]); + variable_item_set_current_value_text(item, radio_modules_variables_text[value_index_exm]); } static void subghz_ext_module_start_var_list_enter_callback(void* context, uint32_t index) { SubGhz* subghz = context; @@ -37,20 +45,40 @@ static void subghz_scene_receiver_config_set_debug_pin(VariableItem* item) { subghz->txrx->debug_pin_state = index == 1; } +static void subghz_scene_receiver_config_set_debug_counter(VariableItem* item) { + uint8_t index = variable_item_get_current_value_index(item); + + variable_item_set_current_value_text(item, debug_counter_text[index]); + + switch(index) { + case 0: + furi_hal_subghz_set_rolling_counter_mult(1); + break; + case 1: + furi_hal_subghz_set_rolling_counter_mult(5); + break; + case 2: + furi_hal_subghz_set_rolling_counter_mult(10); + break; + default: + break; + } +} + void subghz_scene_ext_module_settings_on_enter(void* context) { SubGhz* subghz = context; VariableItemList* variable_item_list = subghz->variable_item_list; - value_index = furi_hal_subghz.radio_type; + value_index_exm = furi_hal_subghz.radio_type; VariableItem* item = variable_item_list_add( variable_item_list, "Module", EXT_MODULES_COUNT, subghz_scene_ext_module_changed, subghz); variable_item_list_set_enter_callback( variable_item_list, subghz_ext_module_start_var_list_enter_callback, subghz); - variable_item_set_current_value_index(item, value_index); - variable_item_set_current_value_text(item, radio_modules_variables_text[value_index]); + variable_item_set_current_value_index(item, value_index_exm); + variable_item_set_current_value_text(item, radio_modules_variables_text[value_index_exm]); if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) { item = variable_item_list_add( @@ -59,9 +87,31 @@ void subghz_scene_ext_module_settings_on_enter(void* context) { DEBUG_P_COUNT, subghz_scene_receiver_config_set_debug_pin, subghz); - value_index2 = subghz->txrx->debug_pin_state; - variable_item_set_current_value_index(item, value_index2); - variable_item_set_current_value_text(item, debug_pin_text[value_index2]); + value_index_dpin = subghz->txrx->debug_pin_state; + variable_item_set_current_value_index(item, value_index_dpin); + variable_item_set_current_value_text(item, debug_pin_text[value_index_dpin]); + + item = variable_item_list_add( + subghz->variable_item_list, + "Counter Mult:", + DEBUG_COUNTER_COUNT, + subghz_scene_receiver_config_set_debug_counter, + subghz); + switch(furi_hal_subghz_get_rolling_counter_mult()) { + case 1: + value_index_cnt = 0; + break; + case 5: + value_index_cnt = 1; + break; + case 10: + value_index_cnt = 2; + break; + default: + break; + } + variable_item_set_current_value_index(item, value_index_cnt); + variable_item_set_current_value_text(item, debug_counter_text[value_index_cnt]); } view_dispatcher_switch_to_view(subghz->view_dispatcher, SubGhzViewIdVariableItemList); @@ -73,12 +123,12 @@ bool subghz_scene_ext_module_settings_on_event(void* context, SceneManagerEvent UNUSED(event); // Set selected radio module - furi_hal_subghz_set_radio_type(value_index); + furi_hal_subghz_set_radio_type(value_index_exm); // Check if module is present, if no -> show error if(!furi_hal_subghz_check_radio()) { - value_index = 0; - furi_hal_subghz_set_radio_type(value_index); + value_index_exm = 0; + furi_hal_subghz_set_radio_type(value_index_exm); furi_string_set(subghz->error_str, "Please connect\nexternal radio"); scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowErrorSub); } diff --git a/applications/main/subghz/scenes/subghz_scene_receiver.c b/applications/main/subghz/scenes/subghz_scene_receiver.c index e1ea08497..c0112199c 100644 --- a/applications/main/subghz/scenes/subghz_scene_receiver.c +++ b/applications/main/subghz/scenes/subghz_scene_receiver.c @@ -204,6 +204,16 @@ bool subghz_scene_receiver_on_event(void* context, SceneManagerEvent event) { DOLPHIN_DEED(DolphinDeedSubGhzReceiverInfo); consumed = true; break; + case SubGhzCustomEventViewReceiverDeleteItem: + subghz->txrx->idx_menu_chosen = + subghz_view_receiver_get_idx_menu(subghz->subghz_receiver); + + subghz_history_delete_item(subghz->txrx->history, subghz->txrx->idx_menu_chosen); + subghz_view_receiver_delete_element_callback(subghz->subghz_receiver); + + subghz_scene_receiver_update_statusbar(subghz); + consumed = true; + break; case SubGhzCustomEventViewReceiverConfig: subghz->state_notifications = SubGhzNotificationStateIDLE; subghz->txrx->idx_menu_chosen = diff --git a/applications/main/subghz/scenes/subghz_scene_receiver_info.c b/applications/main/subghz/scenes/subghz_scene_receiver_info.c index e5b037f2e..c654ad0c5 100644 --- a/applications/main/subghz/scenes/subghz_scene_receiver_info.c +++ b/applications/main/subghz/scenes/subghz_scene_receiver_info.c @@ -2,6 +2,8 @@ #include "../helpers/subghz_custom_event.h" #include #include +#include +#include void subghz_scene_receiver_info_callback(GuiButtonType result, InputType type, void* context) { furi_assert(context); @@ -233,6 +235,9 @@ void subghz_scene_receiver_info_on_exit(void* context) { widget_reset(subghz->widget); keeloq_reset_mfname(); keeloq_reset_kl_type(); + keeloq_reset_original_btn(); + alutech_reset_original_btn(); + nice_flors_reset_original_btn(); star_line_reset_mfname(); star_line_reset_kl_type(); } diff --git a/applications/main/subghz/scenes/subghz_scene_rpc.c b/applications/main/subghz/scenes/subghz_scene_rpc.c index 609b4a71d..a57a556dc 100644 --- a/applications/main/subghz/scenes/subghz_scene_rpc.c +++ b/applications/main/subghz/scenes/subghz_scene_rpc.c @@ -1,6 +1,8 @@ #include "../subghz_i.h" #include #include +#include +#include #include "xtreme/assets.h" typedef enum { @@ -110,6 +112,9 @@ void subghz_scene_rpc_on_exit(void* context) { keeloq_reset_mfname(); keeloq_reset_kl_type(); + keeloq_reset_original_btn(); + alutech_reset_original_btn(); + nice_flors_reset_original_btn(); star_line_reset_mfname(); star_line_reset_kl_type(); } diff --git a/applications/main/subghz/scenes/subghz_scene_transmitter.c b/applications/main/subghz/scenes/subghz_scene_transmitter.c index dff4f8384..a10e10a37 100644 --- a/applications/main/subghz/scenes/subghz_scene_transmitter.c +++ b/applications/main/subghz/scenes/subghz_scene_transmitter.c @@ -2,7 +2,9 @@ #include "../views/transmitter.h" #include #include +#include #include +#include void subghz_scene_transmitter_callback(SubGhzCustomEvent event, void* context) { furi_assert(context); @@ -89,6 +91,26 @@ bool subghz_scene_transmitter_on_event(void* context, SceneManagerEvent event) { subghz_tx_stop(subghz); subghz_sleep(subghz); } + if(keeloq_get_custom_btn() != 0) { + keeloq_set_btn(0); + alutech_set_btn(0); + nice_flors_set_btn(0); + uint8_t tmp_counter = furi_hal_subghz_get_rolling_counter_mult(); + furi_hal_subghz_set_rolling_counter_mult(0); + // Calling restore! + if(subghz->txrx->txrx_state == SubGhzTxRxStateRx) { + subghz_rx_end(subghz); + } + if((subghz->txrx->txrx_state == SubGhzTxRxStateIDLE) || + (subghz->txrx->txrx_state == SubGhzTxRxStateSleep)) { + if(!subghz_tx_start(subghz, subghz->txrx->fff_data)) { + scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowOnlyRx); + } + } + subghz_tx_stop(subghz); + subghz_sleep(subghz); + furi_hal_subghz_set_rolling_counter_mult(tmp_counter); + } return true; } else if(event.event == SubGhzCustomEventViewTransmitterBack) { subghz->state_notifications = SubGhzNotificationStateIDLE; @@ -113,6 +135,9 @@ void subghz_scene_transmitter_on_exit(void* context) { subghz->state_notifications = SubGhzNotificationStateIDLE; keeloq_reset_mfname(); keeloq_reset_kl_type(); + keeloq_reset_original_btn(); + alutech_reset_original_btn(); + nice_flors_reset_original_btn(); star_line_reset_mfname(); star_line_reset_kl_type(); } diff --git a/applications/main/subghz/subghz_history.c b/applications/main/subghz/subghz_history.c index 184146698..f6530238e 100644 --- a/applications/main/subghz/subghz_history.c +++ b/applications/main/subghz/subghz_history.c @@ -88,6 +88,28 @@ void subghz_history_reset(SubGhzHistory* instance) { instance->code_last_hash_data = 0; } +void subghz_history_delete_item(SubGhzHistory* instance, uint16_t item_id) { + furi_assert(instance); + + SubGhzHistoryItemArray_it_t it; + //SubGhzHistoryItem* target_item = SubGhzHistoryItemArray_get(instance->history->data, item_id); + SubGhzHistoryItemArray_it_last(it, instance->history->data); + while(!SubGhzHistoryItemArray_end_p(it)) { + SubGhzHistoryItem* item = SubGhzHistoryItemArray_ref(it); + + if(it->index == (size_t)(item_id)) { + furi_string_free(item->item_str); + furi_string_free(item->preset->name); + free(item->preset); + flipper_format_free(item->flipper_string); + item->type = 0; + SubGhzHistoryItemArray_remove(instance->history->data, it); + } + SubGhzHistoryItemArray_previous(it); + } + instance->last_index_write--; +} + uint16_t subghz_history_get_item(SubGhzHistory* instance) { furi_assert(instance); return instance->last_index_write; diff --git a/applications/main/subghz/subghz_history.h b/applications/main/subghz/subghz_history.h index 4b01f5aef..1f2f8d246 100644 --- a/applications/main/subghz/subghz_history.h +++ b/applications/main/subghz/subghz_history.h @@ -27,6 +27,8 @@ void subghz_history_free(SubGhzHistory* instance); */ void subghz_history_reset(SubGhzHistory* instance); +void subghz_history_delete_item(SubGhzHistory* instance, uint16_t item_id); + /** Get frequency to history[idx] * * @param instance - SubGhzHistory instance diff --git a/applications/main/subghz/views/receiver.c b/applications/main/subghz/views/receiver.c index be683be28..2a432deb5 100644 --- a/applications/main/subghz/views/receiver.c +++ b/applications/main/subghz/views/receiver.c @@ -431,6 +431,34 @@ bool subghz_view_receiver_input(InputEvent* event, void* context) { true); } else if(event->key == InputKeyLeft && event->type == InputTypeShort) { subghz_receiver->callback(SubGhzCustomEventViewReceiverConfig, subghz_receiver->context); + } else if(event->key == InputKeyRight && event->type == InputTypeLong) { + with_view_model( + subghz_receiver->view, + SubGhzViewReceiverModel * model, + { + if(model->history_item != 0) { + SubGhzReceiverMenuItemArray_it_t it; + // SubGhzReceiverMenuItem* target_item = + // SubGhzReceiverMenuItemArray_get(model->history->data, model->idx); + SubGhzReceiverMenuItemArray_it_last(it, model->history->data); + while(!SubGhzReceiverMenuItemArray_end_p(it)) { + SubGhzReceiverMenuItem* item = SubGhzReceiverMenuItemArray_ref(it); + + if(it->index == (size_t)(model->idx)) { + furi_string_free(item->item_str); + item->type = 0; + SubGhzReceiverMenuItemArray_remove(model->history->data, it); + } + + SubGhzReceiverMenuItemArray_previous(it); + } + + // Callback + subghz_receiver->callback( + SubGhzCustomEventViewReceiverDeleteItem, subghz_receiver->context); + } + }, + true); } else if(event->key == InputKeyOk && event->type == InputTypeShort) { with_view_model( subghz_receiver->view, @@ -544,12 +572,34 @@ View* subghz_view_receiver_get_view(SubGhzViewReceiver* subghz_receiver) { uint16_t subghz_view_receiver_get_idx_menu(SubGhzViewReceiver* subghz_receiver) { furi_assert(subghz_receiver); - uint32_t idx = 0; + uint16_t idx = 0; with_view_model( subghz_receiver->view, SubGhzViewReceiverModel * model, { idx = model->idx; }, false); return idx; } +void subghz_view_receiver_delete_element_callback(SubGhzViewReceiver* subghz_receiver) { + furi_assert(subghz_receiver); + + with_view_model( + subghz_receiver->view, + SubGhzViewReceiverModel * model, + { + if(model->history_item == 5) { + if(model->idx >= 2) { + model->idx = model->history_item - 1; + } + } + model->history_item--; + + if(model->idx != 0) { + model->idx--; + } + }, + true); + furi_delay_ms(200); +} + void subghz_view_receiver_set_idx_menu(SubGhzViewReceiver* subghz_receiver, uint16_t idx) { furi_assert(subghz_receiver); with_view_model( diff --git a/applications/main/subghz/views/receiver.h b/applications/main/subghz/views/receiver.h index 37eb473de..ad8c31eda 100644 --- a/applications/main/subghz/views/receiver.h +++ b/applications/main/subghz/views/receiver.h @@ -46,4 +46,6 @@ uint16_t subghz_view_receiver_get_idx_menu(SubGhzViewReceiver* subghz_receiver); void subghz_view_receiver_set_idx_menu(SubGhzViewReceiver* subghz_receiver, uint16_t idx); +void subghz_view_receiver_delete_element_callback(SubGhzViewReceiver* subghz_receiver); + void subghz_view_receiver_exit(void* context); diff --git a/applications/main/subghz/views/transmitter.c b/applications/main/subghz/views/transmitter.c index 102639924..5a64f27e2 100644 --- a/applications/main/subghz/views/transmitter.c +++ b/applications/main/subghz/views/transmitter.c @@ -4,6 +4,10 @@ #include #include +#include +#include +#include + struct SubGhzViewTransmitter { View* view; SubGhzViewTransmitterCallback callback; @@ -15,6 +19,8 @@ typedef struct { FuriString* preset_str; FuriString* key_str; uint8_t show_button; + FuriString* temp_button_id; + bool draw_temp_button; } SubGhzViewTransmitterModel; void subghz_view_transmitter_set_callback( @@ -89,6 +95,12 @@ void subghz_view_transmitter_draw(Canvas* canvas, SubGhzViewTransmitterModel* mo canvas_draw_str(canvas, 78, 7, furi_string_get_cstr(model->frequency_str)); canvas_draw_str(canvas, 113, 7, furi_string_get_cstr(model->preset_str)); + if(model->draw_temp_button) { + canvas_set_font(canvas, FontBatteryPercent); + canvas_draw_str(canvas, 117, 40, furi_string_get_cstr(model->temp_button_id)); + canvas_set_font(canvas, FontSecondary); + } + if(model->show_button) { canvas_draw_str(canvas, 58, 62, furi_hal_subghz_get_radio_type() ? "R: Ext" : "R: Int"); subghz_view_transmitter_button_right(canvas, "Send"); @@ -108,7 +120,9 @@ bool subghz_view_transmitter_input(InputEvent* event, void* context) { furi_string_reset(model->frequency_str); furi_string_reset(model->preset_str); furi_string_reset(model->key_str); + furi_string_reset(model->temp_button_id); model->show_button = 0; + model->draw_temp_button = false; }, false); return false; @@ -125,6 +139,14 @@ bool subghz_view_transmitter_input(InputEvent* event, void* context) { true); if(can_be_sent && event->key == InputKeyOk && event->type == InputTypePress) { + with_view_model( + subghz_transmitter->view, + SubGhzViewTransmitterModel * model, + { + furi_string_reset(model->temp_button_id); + model->draw_temp_button = false; + }, + true); subghz_transmitter->callback( SubGhzCustomEventViewTransmitterSendStart, subghz_transmitter->context); return true; @@ -134,6 +156,126 @@ bool subghz_view_transmitter_input(InputEvent* event, void* context) { return true; } + // Temp Buttons (UP) + if(can_be_sent && event->key == InputKeyUp && event->type == InputTypePress) { + keeloq_set_btn(1); + alutech_set_btn(1); + nice_flors_set_btn(1); + with_view_model( + subghz_transmitter->view, + SubGhzViewTransmitterModel * model, + { + furi_string_reset(model->temp_button_id); + if(keeloq_get_original_btn() != 0) { + furi_string_printf(model->temp_button_id, "%01X", keeloq_get_original_btn()); + model->draw_temp_button = true; + } else if(alutech_get_original_btn() != 0) { + furi_string_printf(model->temp_button_id, "%01X", alutech_get_original_btn()); + model->draw_temp_button = true; + } else if(nice_flors_get_original_btn() != 0) { + furi_string_printf( + model->temp_button_id, "%01X", nice_flors_get_original_btn()); + model->draw_temp_button = true; + } + }, + true); + subghz_transmitter->callback( + SubGhzCustomEventViewTransmitterSendStart, subghz_transmitter->context); + return true; + } else if(can_be_sent && event->key == InputKeyUp && event->type == InputTypeRelease) { + subghz_transmitter->callback( + SubGhzCustomEventViewTransmitterSendStop, subghz_transmitter->context); + return true; + } + // Down + if(can_be_sent && event->key == InputKeyDown && event->type == InputTypePress) { + keeloq_set_btn(2); + alutech_set_btn(2); + nice_flors_set_btn(2); + with_view_model( + subghz_transmitter->view, + SubGhzViewTransmitterModel * model, + { + furi_string_reset(model->temp_button_id); + if(keeloq_get_original_btn() != 0) { + furi_string_printf(model->temp_button_id, "%01X", keeloq_get_original_btn()); + model->draw_temp_button = true; + } else if(alutech_get_original_btn() != 0) { + furi_string_printf(model->temp_button_id, "%01X", alutech_get_original_btn()); + model->draw_temp_button = true; + } else if(nice_flors_get_original_btn() != 0) { + furi_string_printf( + model->temp_button_id, "%01X", nice_flors_get_original_btn()); + model->draw_temp_button = true; + } + }, + true); + subghz_transmitter->callback( + SubGhzCustomEventViewTransmitterSendStart, subghz_transmitter->context); + return true; + } else if(can_be_sent && event->key == InputKeyDown && event->type == InputTypeRelease) { + subghz_transmitter->callback( + SubGhzCustomEventViewTransmitterSendStop, subghz_transmitter->context); + return true; + } + // Left + if(can_be_sent && event->key == InputKeyLeft && event->type == InputTypePress) { + keeloq_set_btn(3); + alutech_set_btn(3); + nice_flors_set_btn(3); + with_view_model( + subghz_transmitter->view, + SubGhzViewTransmitterModel * model, + { + furi_string_reset(model->temp_button_id); + if(keeloq_get_original_btn() != 0) { + furi_string_printf(model->temp_button_id, "%01X", keeloq_get_original_btn()); + model->draw_temp_button = true; + } else if(alutech_get_original_btn() != 0) { + furi_string_printf(model->temp_button_id, "%01X", alutech_get_original_btn()); + model->draw_temp_button = true; + } else if(nice_flors_get_original_btn() != 0) { + furi_string_printf( + model->temp_button_id, "%01X", nice_flors_get_original_btn()); + model->draw_temp_button = true; + } + }, + true); + subghz_transmitter->callback( + SubGhzCustomEventViewTransmitterSendStart, subghz_transmitter->context); + return true; + } else if(can_be_sent && event->key == InputKeyLeft && event->type == InputTypeRelease) { + subghz_transmitter->callback( + SubGhzCustomEventViewTransmitterSendStop, subghz_transmitter->context); + return true; + } + // Right + if(can_be_sent && event->key == InputKeyRight && event->type == InputTypePress) { + keeloq_set_btn(4); + alutech_set_btn(4); + with_view_model( + subghz_transmitter->view, + SubGhzViewTransmitterModel * model, + { + furi_string_reset(model->temp_button_id); + if(keeloq_get_original_btn() != 0) { + furi_string_printf(model->temp_button_id, "%01X", keeloq_get_original_btn()); + model->draw_temp_button = true; + } else if(alutech_get_original_btn() != 0) { + furi_string_printf(model->temp_button_id, "%01X", alutech_get_original_btn()); + model->draw_temp_button = true; + } + }, + true); + subghz_transmitter->callback( + SubGhzCustomEventViewTransmitterSendStart, subghz_transmitter->context); + return true; + } else if(can_be_sent && event->key == InputKeyRight && event->type == InputTypeRelease) { + subghz_transmitter->callback( + SubGhzCustomEventViewTransmitterSendStop, subghz_transmitter->context); + return true; + } + return true; } @@ -166,6 +308,7 @@ SubGhzViewTransmitter* subghz_view_transmitter_alloc() { model->frequency_str = furi_string_alloc(); model->preset_str = furi_string_alloc(); model->key_str = furi_string_alloc(); + model->temp_button_id = furi_string_alloc(); }, true); return subghz_transmitter; @@ -181,6 +324,7 @@ void subghz_view_transmitter_free(SubGhzViewTransmitter* subghz_transmitter) { furi_string_free(model->frequency_str); furi_string_free(model->preset_str); furi_string_free(model->key_str); + furi_string_free(model->temp_button_id); }, true); view_free(subghz_transmitter->view); diff --git a/applications/main/unirfremix/unirfremix_app.c b/applications/main/unirfremix/unirfremix_app.c index a4e5249fa..762428956 100644 --- a/applications/main/unirfremix/unirfremix_app.c +++ b/applications/main/unirfremix/unirfremix_app.c @@ -19,6 +19,8 @@ #include #include #include +#include +#include #define UNIRFMAP_FOLDER "/ext/subghz/unirf" #define UNIRFMAP_EXTENSION ".txt" @@ -481,6 +483,9 @@ void unirfremix_tx_stop(UniRFRemix* app) { keeloq_reset_mfname(); keeloq_reset_kl_type(); + keeloq_reset_original_btn(); + alutech_reset_original_btn(); + nice_flors_reset_original_btn(); star_line_reset_mfname(); star_line_reset_kl_type(); } diff --git a/applications/main/xtreme_app/xtreme_app.c b/applications/main/xtreme_app/xtreme_app.c index 0309c4cae..6804dd0c3 100644 --- a/applications/main/xtreme_app/xtreme_app.c +++ b/applications/main/xtreme_app/xtreme_app.c @@ -177,7 +177,7 @@ XtremeApp* xtreme_app_alloc() { furi_record_close(RECORD_STORAGE); app->version_tag = furi_string_alloc_printf( - "%s %s", version_get_gitbranchnum(NULL), version_get_builddate(NULL)); + "%s %s", version_get_version(NULL), version_get_builddate(NULL)); return app; } diff --git a/applications/plugins/dice/dice.c b/applications/plugins/dice/dice.c index dc748b68f..0bf90a1c8 100644 --- a/applications/plugins/dice/dice.c +++ b/applications/plugins/dice/dice.c @@ -290,10 +290,10 @@ static void dice_render_callback(Canvas* const canvas, void* ctx) { state->diceQty, state->diceType[0], state->rollTime[0]); - if(state->diceSelect >= 20 && state->diceRoll == state->diceSelect) - DOLPHIN_DEED(getRandomDeed()); - if(state->diceSelect >= 20 && state->diceRoll == state->diceSelect - 1) - DOLPHIN_DEED(getRandomDeed()); + // if(state->diceSelect >= 20 && state->diceRoll == state->diceSelect) + // DOLPHIN_DEED(getRandomDeed()); + // if(state->diceSelect >= 20 && state->diceRoll == state->diceSelect - 1) + // DOLPHIN_DEED(getRandomDeed()); if(state->diceQty == 1) { snprintf(state->strings[1], sizeof(state->strings[1]), "%d", state->diceRoll); } else if(state->diceQty == 2) { diff --git a/applications/plugins/lightmeter/.clang-format b/applications/plugins/lightmeter/.clang-format deleted file mode 100644 index 4b76f7fa4..000000000 --- a/applications/plugins/lightmeter/.clang-format +++ /dev/null @@ -1,191 +0,0 @@ ---- -Language: Cpp -AccessModifierOffset: -4 -AlignAfterOpenBracket: AlwaysBreak -AlignArrayOfStructures: None -AlignConsecutiveMacros: None -AlignConsecutiveAssignments: None -AlignConsecutiveBitFields: None -AlignConsecutiveDeclarations: None -AlignEscapedNewlines: Left -AlignOperands: Align -AlignTrailingComments: false -AllowAllArgumentsOnNextLine: true -AllowAllParametersOfDeclarationOnNextLine: false -AllowShortEnumsOnASingleLine: true -AllowShortBlocksOnASingleLine: Never -AllowShortCaseLabelsOnASingleLine: false -AllowShortFunctionsOnASingleLine: None -AllowShortLambdasOnASingleLine: All -AllowShortIfStatementsOnASingleLine: WithoutElse -AllowShortLoopsOnASingleLine: true -AlwaysBreakAfterDefinitionReturnType: None -AlwaysBreakAfterReturnType: None -AlwaysBreakBeforeMultilineStrings: false -AlwaysBreakTemplateDeclarations: Yes -AttributeMacros: - - __capability -BinPackArguments: false -BinPackParameters: false -BraceWrapping: - AfterCaseLabel: false - AfterClass: false - AfterControlStatement: Never - AfterEnum: false - AfterFunction: false - AfterNamespace: false - AfterObjCDeclaration: false - AfterStruct: false - AfterUnion: false - AfterExternBlock: false - BeforeCatch: false - BeforeElse: false - BeforeLambdaBody: false - BeforeWhile: false - IndentBraces: false - SplitEmptyFunction: true - SplitEmptyRecord: true - SplitEmptyNamespace: true -BreakBeforeBinaryOperators: None -BreakBeforeConceptDeclarations: true -BreakBeforeBraces: Attach -BreakBeforeInheritanceComma: false -BreakInheritanceList: BeforeColon -BreakBeforeTernaryOperators: false -BreakConstructorInitializersBeforeComma: false -BreakConstructorInitializers: BeforeComma -BreakAfterJavaFieldAnnotations: false -BreakStringLiterals: false -ColumnLimit: 99 -CommentPragmas: '^ IWYU pragma:' -QualifierAlignment: Leave -CompactNamespaces: false -ConstructorInitializerIndentWidth: 4 -ContinuationIndentWidth: 4 -Cpp11BracedListStyle: true -DeriveLineEnding: true -DerivePointerAlignment: false -DisableFormat: false -EmptyLineAfterAccessModifier: Never -EmptyLineBeforeAccessModifier: LogicalBlock -ExperimentalAutoDetectBinPacking: false -PackConstructorInitializers: BinPack -BasedOnStyle: '' -ConstructorInitializerAllOnOneLineOrOnePerLine: false -AllowAllConstructorInitializersOnNextLine: true -FixNamespaceComments: false -ForEachMacros: - - foreach - - Q_FOREACH - - BOOST_FOREACH -IfMacros: - - KJ_IF_MAYBE -IncludeBlocks: Preserve -IncludeCategories: - - Regex: '.*' - Priority: 1 - SortPriority: 0 - CaseSensitive: false - - Regex: '^(<|"(gtest|gmock|isl|json)/)' - Priority: 3 - SortPriority: 0 - CaseSensitive: false - - Regex: '.*' - Priority: 1 - SortPriority: 0 - CaseSensitive: false -IncludeIsMainRegex: '(Test)?$' -IncludeIsMainSourceRegex: '' -IndentAccessModifiers: false -IndentCaseLabels: false -IndentCaseBlocks: false -IndentGotoLabels: true -IndentPPDirectives: None -IndentExternBlock: AfterExternBlock -IndentRequires: false -IndentWidth: 4 -IndentWrappedFunctionNames: true -InsertTrailingCommas: None -JavaScriptQuotes: Leave -JavaScriptWrapImports: true -KeepEmptyLinesAtTheStartOfBlocks: false -LambdaBodyIndentation: Signature -MacroBlockBegin: '' -MacroBlockEnd: '' -MaxEmptyLinesToKeep: 1 -NamespaceIndentation: None -ObjCBinPackProtocolList: Auto -ObjCBlockIndentWidth: 4 -ObjCBreakBeforeNestedBlockParam: true -ObjCSpaceAfterProperty: true -ObjCSpaceBeforeProtocolList: true -PenaltyBreakAssignment: 10 -PenaltyBreakBeforeFirstCallParameter: 30 -PenaltyBreakComment: 10 -PenaltyBreakFirstLessLess: 0 -PenaltyBreakOpenParenthesis: 0 -PenaltyBreakString: 10 -PenaltyBreakTemplateDeclaration: 10 -PenaltyExcessCharacter: 100 -PenaltyReturnTypeOnItsOwnLine: 60 -PenaltyIndentedWhitespace: 0 -PointerAlignment: Left -PPIndentWidth: -1 -ReferenceAlignment: Pointer -ReflowComments: false -RemoveBracesLLVM: false -SeparateDefinitionBlocks: Leave -ShortNamespaceLines: 1 -SortIncludes: Never -SortJavaStaticImport: Before -SortUsingDeclarations: false -SpaceAfterCStyleCast: false -SpaceAfterLogicalNot: false -SpaceAfterTemplateKeyword: true -SpaceBeforeAssignmentOperators: true -SpaceBeforeCaseColon: false -SpaceBeforeCpp11BracedList: false -SpaceBeforeCtorInitializerColon: true -SpaceBeforeInheritanceColon: true -SpaceBeforeParens: Never -SpaceBeforeParensOptions: - AfterControlStatements: false - AfterForeachMacros: false - AfterFunctionDefinitionName: false - AfterFunctionDeclarationName: false - AfterIfMacros: false - AfterOverloadedOperator: false - BeforeNonEmptyParentheses: false -SpaceAroundPointerQualifiers: Default -SpaceBeforeRangeBasedForLoopColon: true -SpaceInEmptyBlock: false -SpaceInEmptyParentheses: false -SpacesBeforeTrailingComments: 1 -SpacesInAngles: Never -SpacesInConditionalStatement: false -SpacesInContainerLiterals: false -SpacesInCStyleCastParentheses: false -SpacesInLineCommentPrefix: - Minimum: 1 - Maximum: -1 -SpacesInParentheses: false -SpacesInSquareBrackets: false -SpaceBeforeSquareBrackets: false -BitFieldColonSpacing: Both -Standard: c++03 -StatementAttributeLikeMacros: - - Q_EMIT -StatementMacros: - - Q_UNUSED - - QT_REQUIRE_VERSION -TabWidth: 4 -UseCRLF: false -UseTab: Never -WhitespaceSensitiveMacros: - - STRINGIZE - - PP_STRINGIZE - - BOOST_PP_STRINGIZE - - NS_SWIFT_NAME - - CF_SWIFT_NAME -... - diff --git a/applications/plugins/lightmeter/README.md b/applications/plugins/lightmeter/README.md index dc6c6ffd5..d9c071e67 100644 --- a/applications/plugins/lightmeter/README.md +++ b/applications/plugins/lightmeter/README.md @@ -1,10 +1,9 @@ -# flipperzero-lightmeter +# flipperzero-lightmeter -[![Build FAP](https://github.com/oleksiikutuzov/flipperzero-lightmeter/actions/workflows/build.yml/badge.svg?branch=main)](https://github.com/oleksiikutuzov/flipperzero-lightmeter/actions/workflows/build.yml) +[Original link](https://github.com/oleksiikutuzov/flipperzero-lightmeter) - - + ## Wiring @@ -15,19 +14,6 @@ SCL -> C0 SDA -> C1 ``` -## Sensor module - - - -### If you want to build this module, you'll need (it's quite over-engineered, sorry :D) -1. [Module PCB](https://github.com/oleksiikutuzov/flipperzero-lightmeter/blob/main/module/module_v2_gerber.zip) -2. [Enclosure](https://github.com/oleksiikutuzov/flipperzero-lightmeter/blob/main/module/module_v2_enclosure.stl) -3. 4-pin female header -4. 10-pin male header -5. 2x M3 threaded inserts (max diameter 5.3 mm, max height 4 mm) -6. 2x M3x5 screws - - ## TODO - [ ] Save settings to sd card diff --git a/applications/plugins/lightmeter/application.fam b/applications/plugins/lightmeter/application.fam index b1de62641..b1ae6c6b2 100644 --- a/applications/plugins/lightmeter/application.fam +++ b/applications/plugins/lightmeter/application.fam @@ -9,7 +9,6 @@ App( ], stack_size=1 * 1024, order=90, - fap_version=(0, 7), fap_icon="lightmeter.png", fap_category="GPIO", fap_private_libs=[ @@ -22,7 +21,4 @@ App( ), ], fap_icon_assets="icons", - fap_description="Lightmeter app for photography based on BH1750 sensor", - fap_author="Oleksii Kutuzov", - fap_weburl="https://github.com/oleksiikutuzov/flipperzero-lightmeter", ) diff --git a/applications/plugins/lightmeter/gui/views/main_view.c b/applications/plugins/lightmeter/gui/views/main_view.c index fcbafbff4..8b3e2989f 100644 --- a/applications/plugins/lightmeter/gui/views/main_view.c +++ b/applications/plugins/lightmeter/gui/views/main_view.c @@ -62,11 +62,11 @@ const float aperture_numbers[] = { const float speed_numbers[] = { [SPEED_8000] = 1.0 / 8000, [SPEED_4000] = 1.0 / 4000, [SPEED_2000] = 1.0 / 2000, [SPEED_1000] = 1.0 / 1000, [SPEED_500] = 1.0 / 500, [SPEED_250] = 1.0 / 250, - [SPEED_125] = 1.0 / 125, [SPEED_60] = 1.0 / 60, [SPEED_30] = 1.0 / 30, - [SPEED_15] = 1.0 / 15, [SPEED_8] = 1.0 / 8, [SPEED_4] = 1.0 / 4, - [SPEED_2] = 1.0 / 2, [SPEED_1S] = 1.0, [SPEED_2S] = 2.0, - [SPEED_4S] = 4.0, [SPEED_8S] = 8.0, [SPEED_15S] = 15.0, - [SPEED_30S] = 30.0, + [SPEED_125] = 1.0 / 125, [SPEED_60] = 1.0 / 60, [SPEED_48] = 1.0 / 48, + [SPEED_30] = 1.0 / 30, [SPEED_15] = 1.0 / 15, [SPEED_8] = 1.0 / 8, + [SPEED_4] = 1.0 / 4, [SPEED_2] = 1.0 / 2, [SPEED_1S] = 1.0, + [SPEED_2S] = 2.0, [SPEED_4S] = 4.0, [SPEED_8S] = 8.0, + [SPEED_15S] = 15.0, [SPEED_30S] = 30.0, }; struct MainView { diff --git a/applications/plugins/lightmeter/images/framed_gui_config.png b/applications/plugins/lightmeter/images/framed_gui_config.png deleted file mode 100644 index b87c3bd5cdc8bd99d346eddea1c6792087529092..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 249828 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

NPX%}!5=ULS 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

sL{C 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 diff --git a/applications/plugins/lightmeter/images/framed_gui_lux_meter.png b/applications/plugins/lightmeter/images/framed_gui_lux_meter.png deleted file mode 100644 index 6ab0cf191047d1a044da4627014dae6e5228c9a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 235482 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

+6F+s(##`H|89qwr_v$_>A9-ORsGVP#DAP%u8WL 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

a8=D+@-9m^9OY^?|r4JJrY2G_&@b6 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 diff --git a/applications/plugins/lightmeter/images/framed_gui_main.png b/applications/plugins/lightmeter/images/framed_gui_main.png deleted file mode 100644 index 23dc4a2cc4e181fbcc4bc627e86ab3729fd902c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 245948 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 z