From 9e54e8b421f7c022368360656065e45e9dfe3ab9 Mon Sep 17 00:00:00 2001 From: WillyJL Date: Tue, 5 Aug 2025 01:15:43 +0200 Subject: [PATCH 01/15] Format --- .../subghz/scenes/subghz_scene_set_counter.c | 3 ++- .../main/subghz/scenes/subghz_scene_set_key.c | 1 - .../subghz/scenes/subghz_scene_set_seed.c | 1 - .../subghz/scenes/subghz_scene_set_serial.c | 21 ++++++++++++------- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/applications/main/subghz/scenes/subghz_scene_set_counter.c b/applications/main/subghz/scenes/subghz_scene_set_counter.c index f66152a7c..9afa3408c 100644 --- a/applications/main/subghz/scenes/subghz_scene_set_counter.c +++ b/applications/main/subghz/scenes/subghz_scene_set_counter.c @@ -107,7 +107,8 @@ bool subghz_scene_set_counter_on_event(void* context, SceneManagerEvent event) { subghz->gen_info->keeloq_bft.cnt = __bswap16(subghz->gen_info->keeloq_bft.cnt); break; case GenAlutechAt4n: - subghz->gen_info->alutech_at_4n.cnt = __bswap16(subghz->gen_info->alutech_at_4n.cnt); + subghz->gen_info->alutech_at_4n.cnt = + __bswap16(subghz->gen_info->alutech_at_4n.cnt); break; case GenSomfyTelis: subghz->gen_info->somfy_telis.cnt = __bswap16(subghz->gen_info->somfy_telis.cnt); diff --git a/applications/main/subghz/scenes/subghz_scene_set_key.c b/applications/main/subghz/scenes/subghz_scene_set_key.c index b617b1a0f..690c62182 100644 --- a/applications/main/subghz/scenes/subghz_scene_set_key.c +++ b/applications/main/subghz/scenes/subghz_scene_set_key.c @@ -44,7 +44,6 @@ bool subghz_scene_set_key_on_event(void* context, SceneManagerEvent event) { if(event.type == SceneManagerEventTypeCustom) { if(event.event == SubGhzCustomEventByteInputDone) { - if(subghz->gen_info->type == GenData) { subghz->gen_info->data.key = __bswap64(subghz->gen_info->data.key); diff --git a/applications/main/subghz/scenes/subghz_scene_set_seed.c b/applications/main/subghz/scenes/subghz_scene_set_seed.c index 3e4a33536..c858b2a17 100644 --- a/applications/main/subghz/scenes/subghz_scene_set_seed.c +++ b/applications/main/subghz/scenes/subghz_scene_set_seed.c @@ -60,7 +60,6 @@ bool subghz_scene_set_seed_on_event(void* context, SceneManagerEvent event) { bool generated_protocol = false; if(event.type == SceneManagerEventTypeCustom) { if(event.event == SubGhzCustomEventByteInputDone) { - switch(subghz->gen_info->type) { case GenFaacSLH: subghz->gen_info->faac_slh.seed = __bswap32(subghz->gen_info->faac_slh.seed); diff --git a/applications/main/subghz/scenes/subghz_scene_set_serial.c b/applications/main/subghz/scenes/subghz_scene_set_serial.c index bedb0d1cc..5c3b76733 100644 --- a/applications/main/subghz/scenes/subghz_scene_set_serial.c +++ b/applications/main/subghz/scenes/subghz_scene_set_serial.c @@ -95,25 +95,32 @@ bool subghz_scene_set_serial_on_event(void* context, SceneManagerEvent event) { subghz->gen_info->keeloq.serial = __bswap32(subghz->gen_info->keeloq.serial); break; case GenCameAtomo: - subghz->gen_info->came_atomo.serial = __bswap32(subghz->gen_info->came_atomo.serial); + subghz->gen_info->came_atomo.serial = + __bswap32(subghz->gen_info->came_atomo.serial); break; case GenKeeloqBFT: - subghz->gen_info->keeloq_bft.serial = __bswap32(subghz->gen_info->keeloq_bft.serial); + subghz->gen_info->keeloq_bft.serial = + __bswap32(subghz->gen_info->keeloq_bft.serial); break; case GenAlutechAt4n: - subghz->gen_info->alutech_at_4n.serial = __bswap32(subghz->gen_info->alutech_at_4n.serial); + subghz->gen_info->alutech_at_4n.serial = + __bswap32(subghz->gen_info->alutech_at_4n.serial); break; case GenSomfyTelis: - subghz->gen_info->somfy_telis.serial = __bswap32(subghz->gen_info->somfy_telis.serial); + subghz->gen_info->somfy_telis.serial = + __bswap32(subghz->gen_info->somfy_telis.serial); break; case GenNiceFlorS: - subghz->gen_info->nice_flor_s.serial = __bswap32(subghz->gen_info->nice_flor_s.serial); + subghz->gen_info->nice_flor_s.serial = + __bswap32(subghz->gen_info->nice_flor_s.serial); break; case GenSecPlus2: - subghz->gen_info->sec_plus_2.serial = __bswap32(subghz->gen_info->sec_plus_2.serial); + subghz->gen_info->sec_plus_2.serial = + __bswap32(subghz->gen_info->sec_plus_2.serial); break; case GenPhoenixV2: - subghz->gen_info->phoenix_v2.serial = __bswap32(subghz->gen_info->phoenix_v2.serial); + subghz->gen_info->phoenix_v2.serial = + __bswap32(subghz->gen_info->phoenix_v2.serial); break; // Not needed for these types case GenData: From 5e52d7df69760f1380d4f95183db75419bed51da Mon Sep 17 00:00:00 2001 From: WillyJL Date: Tue, 5 Aug 2025 02:54:43 +0200 Subject: [PATCH 02/15] Wait for deploy before devbuild message --nobuild --- .github/workflows/build.yml | 54 ++++++++++++++++++++++++------------- 1 file changed, 35 insertions(+), 19 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index dbc147a0a..4f7e2972b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -138,6 +138,30 @@ jobs: tar czpf "artifacts/flipper-z-any-scripts-${SUFFIX}.tgz" scripts cp build/core2_firmware.tgz "artifacts/flipper-z-any-core2_firmware-${SUFFIX}.tgz" + - name: "Upload artifacts to update server" + if: ${{ env.SHOULD_UPLOAD == 'true' }} + run: | + curl "${{ secrets.INDEXER_URL }}"/firmware/directory.json > previndex.json + FILES=$(for ARTIFACT in $(find artifacts -maxdepth 1 -not -type d); do echo "-F files=@${ARTIFACT}"; done) + curl --fail -L -H "Token: ${{ secrets.INDEXER_TOKEN }}" \ + -F "branch=${BRANCH_NAME}" \ + -F "version_token=${COMMIT_SHA}" \ + ${FILES[@]} \ + "${{ secrets.INDEXER_URL }}"/firmware/uploadfiles + + - name: "Force deploy website to refresh devbuilds" + if: ${{ env.SHOULD_DEVBUILD == 'true' }} + uses: Codex-/return-dispatch@v2 + id: force-deploy + with: + token: ${{ secrets.REPO_DISPATCH_TOKEN }} + ref: dev + repo: v2.momentum-fw.dev + owner: Next-Flip + workflow: force-deploy.yml + workflow_timeout_seconds: 300 + workflow_job_steps_retry_seconds: 5 + - name: "Calculate DFU sizes" if: ${{ env.SHOULD_PRCOMMENT == 'true' }} run: | @@ -161,25 +185,6 @@ jobs: echo "FLASH_FREE=$FLASH_FREE" >> $GITHUB_ENV echo "FLASH_USABLE=$FLASH_USABLE" >> $GITHUB_ENV - - name: "Upload artifacts to update server" - if: ${{ env.SHOULD_UPLOAD == 'true' }} - run: | - curl "${{ secrets.INDEXER_URL }}"/firmware/directory.json > previndex.json - FILES=$(for ARTIFACT in $(find artifacts -maxdepth 1 -not -type d); do echo "-F files=@${ARTIFACT}"; done) - curl --fail -L -H "Token: ${{ secrets.INDEXER_TOKEN }}" \ - -F "branch=${BRANCH_NAME}" \ - -F "version_token=${COMMIT_SHA}" \ - ${FILES[@]} \ - "${{ secrets.INDEXER_URL }}"/firmware/uploadfiles - - - name: "Force deploy website to refresh devbuilds" - if: ${{ env.SHOULD_DEVBUILD == 'true' }} - uses: peter-evans/repository-dispatch@v3 - with: - token: ${{ secrets.REPO_DISPATCH_TOKEN }} - repository: Next-Flip/v2.momentum-fw.dev - event-type: force-deploy - - name: "Find previous comment" if: ${{ env.SHOULD_PRCOMMENT == 'true' }} uses: peter-evans/find-comment@v3 @@ -203,6 +208,17 @@ jobs: - Free Flash: `${{ env.FLASH_FREE }}` (`${{ env.FLASH_USABLE }}` usable) edit-mode: replace + - name: "Wait for deploy (Run ID ${{ steps.force-deploy.outputs.run_id }})" + if: ${{ env.SHOULD_DEVBUILD == 'true' }} + uses: Codex-/await-remote-run@v1 + with: + token: ${{ github.token }} + repo: v2.momentum-fw.dev + owner: Next-Flip + run_id: ${{ steps.force-deploy.outputs.run_id }} + run_timeout_seconds: 300 + poll_interval_ms: 5000 + - name: "Send devbuild webhook" env: INDEXER_URL: ${{ secrets.INDEXER_URL }} From 801d6ae71c52c226f3875481f1ff256ce6db64ad Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Mon, 11 Aug 2025 15:44:28 +0300 Subject: [PATCH 03/15] upd subghz remote --- applications/main/subghz_remote | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/main/subghz_remote b/applications/main/subghz_remote index b63137679..1180b5a76 160000 --- a/applications/main/subghz_remote +++ b/applications/main/subghz_remote @@ -1 +1 @@ -Subproject commit b63137679870602ac5ba02cba4eb0f4b0efce6fa +Subproject commit 1180b5a76698338da4dfeed66a2ff57a70de3efa From e8ce86917a9c00686c909455370eb8eed65dea97 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Mon, 11 Aug 2025 15:45:18 +0300 Subject: [PATCH 04/15] upd changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1acadf0aa..0074163c5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ * LFRFID: Add additional procotols supported by EM4305 chipset (by @jamisonderek) * Apps: **Check out more Apps updates and fixes by following** [this link](https://github.com/xMasterX/all-the-plugins/commits/dev) ## Other changes +* Add possibility to use custom buttons when using the SubGHz remote app (by @MrLego8-9) * Input Settings: Add Vibro Trigger option (by @956MB & @WillyJL) * BT Remote: Add Rename Option (by @aaronjamt & @WillyJL) * Simplify Bad USB BLE profile (by @aaronjamt & @WillyJL) From 46e7912d94fce550a723fd4cd2990157e8f69444 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Mon, 11 Aug 2025 21:16:16 +0300 Subject: [PATCH 05/15] Fix branch&manifest --- applications/main/subghz_remote | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/main/subghz_remote b/applications/main/subghz_remote index 1180b5a76..ee887fb77 160000 --- a/applications/main/subghz_remote +++ b/applications/main/subghz_remote @@ -1 +1 @@ -Subproject commit 1180b5a76698338da4dfeed66a2ff57a70de3efa +Subproject commit ee887fb77484fb8a06a5f346e9f41d81ab5ec9e3 From 40e56bc862d09f85f2aacde4116d01bb096f77b4 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Mon, 11 Aug 2025 21:29:58 +0300 Subject: [PATCH 06/15] subghz add zkteco support, fbt format --- .../main/subghz/helpers/subghz_custom_event.h | 1 + .../main/subghz/helpers/subghz_gen_info.c | 10 +++++++++ .../subghz/scenes/subghz_scene_set_counter.c | 3 ++- .../main/subghz/scenes/subghz_scene_set_key.c | 1 - .../subghz/scenes/subghz_scene_set_seed.c | 1 - .../subghz/scenes/subghz_scene_set_serial.c | 21 ++++++++++++------- .../subghz/scenes/subghz_scene_set_type.c | 1 + applications/main/subghz_remote | 2 +- 8 files changed, 29 insertions(+), 11 deletions(-) diff --git a/applications/main/subghz/helpers/subghz_custom_event.h b/applications/main/subghz/helpers/subghz_custom_event.h index dffc6d193..d212de4ef 100644 --- a/applications/main/subghz/helpers/subghz_custom_event.h +++ b/applications/main/subghz/helpers/subghz_custom_event.h @@ -120,6 +120,7 @@ typedef enum { SetTypeCAMESpace, SetTypePricenton315, SetTypePricenton433, + SetTypeZKTeco430, SetTypeBETT_433, SetTypeGangQi_433, SetTypeHollarm_433, diff --git a/applications/main/subghz/helpers/subghz_gen_info.c b/applications/main/subghz/helpers/subghz_gen_info.c index f6abec0c6..90853cec5 100644 --- a/applications/main/subghz/helpers/subghz_gen_info.c +++ b/applications/main/subghz/helpers/subghz_gen_info.c @@ -38,6 +38,16 @@ void subghz_scene_set_type_fill_generation_infos(GenInfo* infos_dest, SetType ty .data.bits = 24, .data.te = 400}; break; + case SetTypeZKTeco430: + gen_info = (GenInfo){ + .type = GenData, + .mod = "AM650", + .freq = 430500000, + .data.name = SUBGHZ_PROTOCOL_PRINCETON_NAME, + .data.key = (key & 0x00FFFF00) | 0x30, // btn 0x30(UP), 0x03(STOP), 0x0C(DOWN) + .data.bits = 24, + .data.te = 357}; + break; case SetTypeNiceFlo12bit: gen_info = (GenInfo){ .type = GenData, diff --git a/applications/main/subghz/scenes/subghz_scene_set_counter.c b/applications/main/subghz/scenes/subghz_scene_set_counter.c index f66152a7c..9afa3408c 100644 --- a/applications/main/subghz/scenes/subghz_scene_set_counter.c +++ b/applications/main/subghz/scenes/subghz_scene_set_counter.c @@ -107,7 +107,8 @@ bool subghz_scene_set_counter_on_event(void* context, SceneManagerEvent event) { subghz->gen_info->keeloq_bft.cnt = __bswap16(subghz->gen_info->keeloq_bft.cnt); break; case GenAlutechAt4n: - subghz->gen_info->alutech_at_4n.cnt = __bswap16(subghz->gen_info->alutech_at_4n.cnt); + subghz->gen_info->alutech_at_4n.cnt = + __bswap16(subghz->gen_info->alutech_at_4n.cnt); break; case GenSomfyTelis: subghz->gen_info->somfy_telis.cnt = __bswap16(subghz->gen_info->somfy_telis.cnt); diff --git a/applications/main/subghz/scenes/subghz_scene_set_key.c b/applications/main/subghz/scenes/subghz_scene_set_key.c index b617b1a0f..690c62182 100644 --- a/applications/main/subghz/scenes/subghz_scene_set_key.c +++ b/applications/main/subghz/scenes/subghz_scene_set_key.c @@ -44,7 +44,6 @@ bool subghz_scene_set_key_on_event(void* context, SceneManagerEvent event) { if(event.type == SceneManagerEventTypeCustom) { if(event.event == SubGhzCustomEventByteInputDone) { - if(subghz->gen_info->type == GenData) { subghz->gen_info->data.key = __bswap64(subghz->gen_info->data.key); diff --git a/applications/main/subghz/scenes/subghz_scene_set_seed.c b/applications/main/subghz/scenes/subghz_scene_set_seed.c index 3e4a33536..c858b2a17 100644 --- a/applications/main/subghz/scenes/subghz_scene_set_seed.c +++ b/applications/main/subghz/scenes/subghz_scene_set_seed.c @@ -60,7 +60,6 @@ bool subghz_scene_set_seed_on_event(void* context, SceneManagerEvent event) { bool generated_protocol = false; if(event.type == SceneManagerEventTypeCustom) { if(event.event == SubGhzCustomEventByteInputDone) { - switch(subghz->gen_info->type) { case GenFaacSLH: subghz->gen_info->faac_slh.seed = __bswap32(subghz->gen_info->faac_slh.seed); diff --git a/applications/main/subghz/scenes/subghz_scene_set_serial.c b/applications/main/subghz/scenes/subghz_scene_set_serial.c index bedb0d1cc..5c3b76733 100644 --- a/applications/main/subghz/scenes/subghz_scene_set_serial.c +++ b/applications/main/subghz/scenes/subghz_scene_set_serial.c @@ -95,25 +95,32 @@ bool subghz_scene_set_serial_on_event(void* context, SceneManagerEvent event) { subghz->gen_info->keeloq.serial = __bswap32(subghz->gen_info->keeloq.serial); break; case GenCameAtomo: - subghz->gen_info->came_atomo.serial = __bswap32(subghz->gen_info->came_atomo.serial); + subghz->gen_info->came_atomo.serial = + __bswap32(subghz->gen_info->came_atomo.serial); break; case GenKeeloqBFT: - subghz->gen_info->keeloq_bft.serial = __bswap32(subghz->gen_info->keeloq_bft.serial); + subghz->gen_info->keeloq_bft.serial = + __bswap32(subghz->gen_info->keeloq_bft.serial); break; case GenAlutechAt4n: - subghz->gen_info->alutech_at_4n.serial = __bswap32(subghz->gen_info->alutech_at_4n.serial); + subghz->gen_info->alutech_at_4n.serial = + __bswap32(subghz->gen_info->alutech_at_4n.serial); break; case GenSomfyTelis: - subghz->gen_info->somfy_telis.serial = __bswap32(subghz->gen_info->somfy_telis.serial); + subghz->gen_info->somfy_telis.serial = + __bswap32(subghz->gen_info->somfy_telis.serial); break; case GenNiceFlorS: - subghz->gen_info->nice_flor_s.serial = __bswap32(subghz->gen_info->nice_flor_s.serial); + subghz->gen_info->nice_flor_s.serial = + __bswap32(subghz->gen_info->nice_flor_s.serial); break; case GenSecPlus2: - subghz->gen_info->sec_plus_2.serial = __bswap32(subghz->gen_info->sec_plus_2.serial); + subghz->gen_info->sec_plus_2.serial = + __bswap32(subghz->gen_info->sec_plus_2.serial); break; case GenPhoenixV2: - subghz->gen_info->phoenix_v2.serial = __bswap32(subghz->gen_info->phoenix_v2.serial); + subghz->gen_info->phoenix_v2.serial = + __bswap32(subghz->gen_info->phoenix_v2.serial); break; // Not needed for these types case GenData: diff --git a/applications/main/subghz/scenes/subghz_scene_set_type.c b/applications/main/subghz/scenes/subghz_scene_set_type.c index f493954bc..93419a974 100644 --- a/applications/main/subghz/scenes/subghz_scene_set_type.c +++ b/applications/main/subghz/scenes/subghz_scene_set_type.c @@ -68,6 +68,7 @@ static const char* submenu_names[SetTypeMAX] = { [SetTypeCAMESpace] = "KL: CAME Space 433MHz", [SetTypePricenton315] = "Princeton 315MHz", [SetTypePricenton433] = "Princeton 433MHz", + [SetTypeZKTeco430] = "ZKTeco 430MHz", [SetTypeGangQi_433] = "GangQi 433MHz", [SetTypeHollarm_433] = "Hollarm 433MHz", [SetTypeReversRB2_433] = "Revers RB2 433MHz", diff --git a/applications/main/subghz_remote b/applications/main/subghz_remote index ee887fb77..25ff072cc 160000 --- a/applications/main/subghz_remote +++ b/applications/main/subghz_remote @@ -1 +1 @@ -Subproject commit ee887fb77484fb8a06a5f346e9f41d81ab5ec9e3 +Subproject commit 25ff072cc7f90a4af3a8b43bb418bb74dcf9da41 From c610caea9b006074e718264063697d621cb88d6f Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Mon, 11 Aug 2025 21:31:09 +0300 Subject: [PATCH 07/15] upd changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0074163c5..25b037c9f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ ## Main changes - Current API: 86.0 +* SubGHz: Add ZKTeco 430.5 MHz add manually support * SubGHz: Add variant of 'Add Manually' menu with manual editing for each value (PR #909 #911 #914 | by @MrLego8-9) * OFW PR 4251: CLI: Fix long delay with quick connect/disconnect (by @WillyJL) * LFRFID: Add additional procotols supported by EM4305 chipset (by @jamisonderek) From eb9b84e0c0ec4d01c03bc90a41162d3f7d3d7528 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Fri, 15 Aug 2025 00:28:49 +0300 Subject: [PATCH 08/15] Linear 10bit EZCode remotes support --- lib/subghz/protocols/linear.c | 38 +++++++++++++++++------------------ 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/lib/subghz/protocols/linear.c b/lib/subghz/protocols/linear.c index f9d7aaca8..7d9f12d42 100644 --- a/lib/subghz/protocols/linear.c +++ b/lib/subghz/protocols/linear.c @@ -18,7 +18,7 @@ static const SubGhzBlockConst subghz_protocol_linear_const = { .te_short = 500, .te_long = 1500, - .te_delta = 150, + .te_delta = 350, .min_count_bit_for_found = 10, }; @@ -116,32 +116,32 @@ static bool subghz_protocol_encoder_linear_get_upload(SubGhzProtocolEncoderLinea if(bit_read(instance->generic.data, i - 1)) { //send bit 1 instance->encoder.upload[index++] = - level_duration_make(true, (uint32_t)subghz_protocol_linear_const.te_short * 3); + level_duration_make(true, (uint32_t)subghz_protocol_linear_const.te_short); instance->encoder.upload[index++] = - level_duration_make(false, (uint32_t)subghz_protocol_linear_const.te_short); + level_duration_make(false, (uint32_t)subghz_protocol_linear_const.te_long); } else { //send bit 0 instance->encoder.upload[index++] = - level_duration_make(true, (uint32_t)subghz_protocol_linear_const.te_short); + level_duration_make(true, (uint32_t)subghz_protocol_linear_const.te_long); instance->encoder.upload[index++] = - level_duration_make(false, (uint32_t)subghz_protocol_linear_const.te_short * 3); + level_duration_make(false, (uint32_t)subghz_protocol_linear_const.te_short); } } //Send end bit if(bit_read(instance->generic.data, 0)) { //send bit 1 instance->encoder.upload[index++] = - level_duration_make(true, (uint32_t)subghz_protocol_linear_const.te_short * 3); - //Send PT_GUARD + level_duration_make(true, (uint32_t)subghz_protocol_linear_const.te_short); + //Send gap instance->encoder.upload[index++] = - level_duration_make(false, (uint32_t)subghz_protocol_linear_const.te_short * 42); + level_duration_make(false, (uint32_t)subghz_protocol_linear_const.te_short * 44); } else { //send bit 0 instance->encoder.upload[index++] = - level_duration_make(true, (uint32_t)subghz_protocol_linear_const.te_short); - //Send PT_GUARD + level_duration_make(true, (uint32_t)subghz_protocol_linear_const.te_long); + //Send gap instance->encoder.upload[index++] = - level_duration_make(false, (uint32_t)subghz_protocol_linear_const.te_short * 44); + level_duration_make(false, (uint32_t)subghz_protocol_linear_const.te_short * 42); } return true; @@ -223,7 +223,7 @@ void subghz_protocol_decoder_linear_feed(void* context, bool level, uint32_t dur switch(instance->decoder.parser_step) { case LinearDecoderStepReset: if((!level) && (DURATION_DIFF(duration, subghz_protocol_linear_const.te_short * 42) < - subghz_protocol_linear_const.te_delta * 20)) { + subghz_protocol_linear_const.te_delta * 15)) { //Found header Linear instance->decoder.decode_data = 0; instance->decoder.decode_count_bit = 0; @@ -244,16 +244,16 @@ void subghz_protocol_decoder_linear_feed(void* context, bool level, uint32_t dur instance->decoder.parser_step = LinearDecoderStepReset; //checking that the duration matches the guardtime if(DURATION_DIFF(duration, subghz_protocol_linear_const.te_short * 42) > - subghz_protocol_linear_const.te_delta * 20) { + subghz_protocol_linear_const.te_delta * 15) { break; } if(DURATION_DIFF(instance->decoder.te_last, subghz_protocol_linear_const.te_short) < subghz_protocol_linear_const.te_delta) { - subghz_protocol_blocks_add_bit(&instance->decoder, 0); + subghz_protocol_blocks_add_bit(&instance->decoder, 1); } else if( DURATION_DIFF(instance->decoder.te_last, subghz_protocol_linear_const.te_long) < subghz_protocol_linear_const.te_delta) { - subghz_protocol_blocks_add_bit(&instance->decoder, 1); + subghz_protocol_blocks_add_bit(&instance->decoder, 0); } if(instance->decoder.decode_count_bit == subghz_protocol_linear_const.min_count_bit_for_found) { @@ -273,14 +273,14 @@ void subghz_protocol_decoder_linear_feed(void* context, bool level, uint32_t dur subghz_protocol_linear_const.te_delta) && (DURATION_DIFF(duration, subghz_protocol_linear_const.te_long) < subghz_protocol_linear_const.te_delta)) { - subghz_protocol_blocks_add_bit(&instance->decoder, 0); + subghz_protocol_blocks_add_bit(&instance->decoder, 1); instance->decoder.parser_step = LinearDecoderStepSaveDuration; } else if( (DURATION_DIFF(instance->decoder.te_last, subghz_protocol_linear_const.te_long) < subghz_protocol_linear_const.te_delta) && (DURATION_DIFF(duration, subghz_protocol_linear_const.te_short) < subghz_protocol_linear_const.te_delta)) { - subghz_protocol_blocks_add_bit(&instance->decoder, 1); + subghz_protocol_blocks_add_bit(&instance->decoder, 0); instance->decoder.parser_step = LinearDecoderStepSaveDuration; } else { instance->decoder.parser_step = LinearDecoderStepReset; @@ -331,8 +331,8 @@ void subghz_protocol_decoder_linear_get_string(void* context, FuriString* output furi_string_cat_printf( output, "%s %dbit\r\n" - "Key:0x%08lX\r\n" - "Yek:0x%08lX\r\n" + "Key:0x%03lX\r\n" + "Yek:0x%03lX\r\n" "DIP:" DIP_PATTERN "\r\n", instance->generic.protocol_name, instance->generic.data_count_bit, From f2bfed6bbcdea67aedd1134777cc1a8859a167f6 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Fri, 15 Aug 2025 00:40:01 +0300 Subject: [PATCH 09/15] Avoid false positives for dickert mahs --- lib/subghz/protocols/dickert_mahs.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/subghz/protocols/dickert_mahs.c b/lib/subghz/protocols/dickert_mahs.c index 4691e3423..3f614412b 100644 --- a/lib/subghz/protocols/dickert_mahs.c +++ b/lib/subghz/protocols/dickert_mahs.c @@ -288,8 +288,9 @@ void subghz_protocol_decoder_dickert_mahs_feed(void* context, bool level, uint32 instance->decoder.decode_count_bit = 0; } - if((!level) && (duration > 10 * subghz_protocol_dickert_mahs_const.te_short)) { - //Found header DICKERT_MAHS + if((!level) && (DURATION_DIFF(duration, subghz_protocol_dickert_mahs_const.te_long * 50) < + subghz_protocol_dickert_mahs_const.te_delta * 70)) { + //Found header DICKERT_MAHS 44k us instance->decoder.parser_step = DickertMAHSDecoderStepInitial; } break; From efcaf96d07b74288370c9c9ff48897baba75f50e Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Fri, 15 Aug 2025 00:55:58 +0300 Subject: [PATCH 10/15] upd changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 25b037c9f..e65eaab3e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ ## Main changes - Current API: 86.0 +* SubGHz: Tune Linear (add better EZCode support), Dickert MAHS decoders * SubGHz: Add ZKTeco 430.5 MHz add manually support * SubGHz: Add variant of 'Add Manually' menu with manual editing for each value (PR #909 #911 #914 | by @MrLego8-9) * OFW PR 4251: CLI: Fix long delay with quick connect/disconnect (by @WillyJL) From 1d1b924490cd6abcd2abf152d98bd8ea68299678 Mon Sep 17 00:00:00 2001 From: WillyJL Date: Sat, 23 Aug 2025 17:37:41 +0200 Subject: [PATCH 11/15] Apps: Add Simultaneous UHF RFID Reader (by haffnerriley) --- CHANGELOG.md | 1 + applications/external | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 519b7d7ea..a0872100a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ - Apps: - GPIO/GPS: [NMEA] Nearby Files (by @Stichoza) - NFC: NFC-Eink (by @RebornedBrain) + - RFID: Simultaneous UHF RFID Reader (by @haffnerriley) - Sub-GHz: Sub Analyzer (by @RocketGod-git) - SubGHz: - UL: Roger (static 28 bit) with add manually support (by @xMasterX & @mishamyte) diff --git a/applications/external b/applications/external index 5ee8a7ee4..ecb1d933a 160000 --- a/applications/external +++ b/applications/external @@ -1 +1 @@ -Subproject commit 5ee8a7ee42886668bd889bd1cf1695eae5d1235b +Subproject commit ecb1d933ad6b85541776451665e484d412c89317 From 3a7b0ac699abc50151200353b3e502bbd508de00 Mon Sep 17 00:00:00 2001 From: WillyJL Date: Sat, 23 Aug 2025 17:38:10 +0200 Subject: [PATCH 12/15] NFC Maker: Support making empty/blank NDEF payloads --- CHANGELOG.md | 1 + applications/external | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a0872100a..76a3f0ff0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,7 @@ - Flipper Blackhat: Add Deauth Broadcast command (by @o7-machinehum) - KeyCopier: Added Weiser WR3 key format (by @lightos) - Metroflip: Fix unsupported card crash, RENFE Suma 10 support, GEG Connect AID added, Top Up log parsing and animations, 16 new rail lines, support for parsing area codes, saving function for Suica/Japan Rail IC, bugfixes (by @luu176) + - NFC Maker: Support making empty/blank NDEF payloads (by @WillyJL) - NFC Playlist: Refactor playlist worker, new settings layout, loop setting, controls to move between items (by @acegoal07) - Sentry Safe: New interface, settings & help page (by @H4ckd4ddy) - WiFi Marauder: Support for ESP32Marauder 1.8.x (by @justcallmekoko) diff --git a/applications/external b/applications/external index ecb1d933a..8114a9abe 160000 --- a/applications/external +++ b/applications/external @@ -1 +1 @@ -Subproject commit ecb1d933ad6b85541776451665e484d412c89317 +Subproject commit 8114a9abe5893441ef09703dc11497adef5a5362 From 050814e2a9346201a0c10d37a9742c4453b73cca Mon Sep 17 00:00:00 2001 From: WillyJL Date: Sat, 23 Aug 2025 17:43:10 +0200 Subject: [PATCH 13/15] NFC: Fix read crash with unexpectedly large MFC AUTH(0) response --nobuild This was noticeable with Chameleon Ultra NTAG emulation --- CHANGELOG.md | 4 +++- lib/nfc/protocols/iso14443_3a/iso14443_3a_poller_i.c | 6 ++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 76a3f0ff0..0fb04e590 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -45,7 +45,9 @@ - CLI: Fix long delay with quick connect/disconnect, qFlipper should connect faster as expected again (by @WillyJL) - Bad KB: Fix modifier keys with HOLD/RELEASE commands (by @WillyJL) - Desktop: Fix lock screen hang (#438 by @aaronjamt) -- NFC: Fix incorrect Saflok year formula (#433 by @Eltrick) +- NFC: + - Fix incorrect Saflok year formula (#433 by @Eltrick) + - Fix read crash with unexpectedly large MFC AUTH(0) response, eg with Chameleon Ultra NTAG emualtion (by @WillyJL) - FBT: Fix redundant decl for apps using an icon disabled in API (by @WillyJL) ### Removed: diff --git a/lib/nfc/protocols/iso14443_3a/iso14443_3a_poller_i.c b/lib/nfc/protocols/iso14443_3a/iso14443_3a_poller_i.c index 2cf66edba..5795c1bfa 100644 --- a/lib/nfc/protocols/iso14443_3a/iso14443_3a_poller_i.c +++ b/lib/nfc/protocols/iso14443_3a/iso14443_3a_poller_i.c @@ -42,7 +42,13 @@ static Iso14443_3aError iso14443_3a_poller_standard_frame_exchange( break; } + if(bit_buffer_get_capacity_bytes(rx_buffer) < + bit_buffer_get_size_bytes(instance->rx_buffer)) { + ret = Iso14443_3aErrorBufferOverflow; + break; + } bit_buffer_copy(rx_buffer, instance->rx_buffer); + if(!iso14443_crc_check(Iso14443CrcTypeA, instance->rx_buffer)) { ret = Iso14443_3aErrorWrongCrc; break; From a05e633f3c74f3a8fb87dfe144bdd28c9213f7ec Mon Sep 17 00:00:00 2001 From: WillyJL Date: Sat, 23 Aug 2025 18:33:13 +0200 Subject: [PATCH 14/15] Apps: Add Ghost ESP (by jaylikesbunda) --- CHANGELOG.md | 1 + applications/external | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0fb04e590..86bc0f22c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ ### Added: - Apps: + - GPIO/ESP: [ESP32] Ghost ESP (by @jaylikesbunda) - GPIO/GPS: [NMEA] Nearby Files (by @Stichoza) - NFC: NFC-Eink (by @RebornedBrain) - RFID: Simultaneous UHF RFID Reader (by @haffnerriley) diff --git a/applications/external b/applications/external index 8114a9abe..ee2437d36 160000 --- a/applications/external +++ b/applications/external @@ -1 +1 @@ -Subproject commit 8114a9abe5893441ef09703dc11497adef5a5362 +Subproject commit ee2437d362fcebec3125097d4ab6dab84a02534d From ceceba007c539a2b63d2d101800a92ff8627eb17 Mon Sep 17 00:00:00 2001 From: WillyJL Date: Sat, 23 Aug 2025 19:45:31 +0200 Subject: [PATCH 15/15] Update apps --nobuild - Combo Cracker: Support alphabetic combination locks (by henrygab) - ESP Flasher: Bump Marauder 1.8.4 (by justcallmekoko), add C5 support (by Play2BReal) - FlipDownloader: Added a new option to download GitHub repositories with dedicated keyboard, add auto updating (by jblanked) - FlipWiFi: Minor bugfixes (by jblanked) - KeyCopier: Added Suzuki SUZ18 key format (by RIcePatrol) - Passy: Misc memory management bugfixes (by qistoph) - Seader: Fix ATS handling (by NVX), reset SAM on error (by bettse) - Seos Compatible: Add keys v2 support with per-device encryption (by bettse) - Sub-GHz Remote: Add possibility to use custom buttons (by MrLego8-9) - Weather Station: Added support for solight TE44 (by fersingb) - Weebo: Prevent 0x88 in UID[3] (by bettse) - WiFi Marauder: Support for ESP32Marauder 1.8.4 (by justcallmekoko) --- CHANGELOG.md | 17 ++++++++++++----- applications/external | 2 +- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 86bc0f22c..bfbd4dfda 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,17 +25,24 @@ ### Updated: - Apps: - Asteroids: Bugfixes, title screen, Drone Buddy power-up (by @SimplyMinimal) - - Combo Cracker: Allow press and hold to change values, add tutorial (by @TAxelAnderson) - - ESP Flasher: Bump Marauder 1.8.3 (by @justcallmekoko) - - FlipDownloader: Added a new option to download GitHub repositories (by @jblanked) + - Combo Cracker: Allow press and hold to change values, add tutorial (by @TAxelAnderson), support alphabetic combination locks (by @henrygab) + - ESP Flasher: Bump Marauder 1.8.4 (by @justcallmekoko), add C5 support (by @Play2BReal) + - FlipDownloader: Added a new option to download GitHub repositories with dedicated keyboard, add auto updating (by @jblanked) - FlipSocial: C++ rewrite, comments on feed posts, simpler logic and registration (by @jblanked) + - FlipWiFi: Minor bugfixes (by @jblanked) - Flipper Blackhat: Add Deauth Broadcast command (by @o7-machinehum) - - KeyCopier: Added Weiser WR3 key format (by @lightos) + - KeyCopier: Added Weiser WR3 key format (by @lightos), added Suzuki SUZ18 key format (by @RIcePatrol) - Metroflip: Fix unsupported card crash, RENFE Suma 10 support, GEG Connect AID added, Top Up log parsing and animations, 16 new rail lines, support for parsing area codes, saving function for Suica/Japan Rail IC, bugfixes (by @luu176) - NFC Maker: Support making empty/blank NDEF payloads (by @WillyJL) - NFC Playlist: Refactor playlist worker, new settings layout, loop setting, controls to move between items (by @acegoal07) + - Passy: Misc memory management bugfixes (by @qistoph) + - Seader: Fix ATS handling (by @NVX), reset SAM on error (by @bettse) - Sentry Safe: New interface, settings & help page (by @H4ckd4ddy) - - WiFi Marauder: Support for ESP32Marauder 1.8.x (by @justcallmekoko) + - Seos Compatible: Add keys v2 support with per-device encryption (by @bettse) + - Sub-GHz Remote: Add possibility to use custom buttons (by @MrLego8-9) + - Weather Station: Added support for solight TE44 (by @fersingb) + - Weebo: Prevent 0x88 in UID[3] (by @bettse) + - WiFi Marauder: Support for ESP32Marauder 1.8.4 (by @justcallmekoko) - Sub-GHz: - UL: Add 868.46 MHz to default subghz freqs list (by @xMasterX) - UL: Reduce less popular freqs in default hopper preset, make it faster (by @xMasterX) diff --git a/applications/external b/applications/external index ee2437d36..006b4e297 160000 --- a/applications/external +++ b/applications/external @@ -1 +1 @@ -Subproject commit ee2437d362fcebec3125097d4ab6dab84a02534d +Subproject commit 006b4e297861de36e794396fa5ffe4a39067bce8