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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] =?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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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/269] 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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