From 14269286eb6eaa66b53d41ebfe02265bc6fb7c71 Mon Sep 17 00:00:00 2001 From: Leeroy <135471162+LeeroysHub@users.noreply.github.com> Date: Thu, 12 Feb 2026 18:04:53 +1100 Subject: [PATCH 1/8] TX Power: Use correct Offset and Values for FM PA table. --- .../main/subghz/helpers/subghz_txrx.c | 50 +++++++++++++------ .../scenes/subghz_scene_radio_settings.c | 6 +-- 2 files changed, 37 insertions(+), 19 deletions(-) diff --git a/applications/main/subghz/helpers/subghz_txrx.c b/applications/main/subghz/helpers/subghz_txrx.c index 46d0a7eef..93f197399 100644 --- a/applications/main/subghz/helpers/subghz_txrx.c +++ b/applications/main/subghz/helpers/subghz_txrx.c @@ -110,25 +110,45 @@ void subghz_txrx_set_preset( uint8_t* subghz_txrx_set_tx_power(uint8_t* preset_data, size_t preset_data_size, uint32_t tx_power) { -#define TX_POWER_OFFSET 7 -#define TX_PRESET_POWER_COUNT 11 - const uint32_t tx_power_value[TX_PRESET_POWER_COUNT] = { +#define TX_POWER_OFFSET_FM 8 +#define TX_POWER_OFFSET_AM 7 +#define TX_PRESET_POWER_COUNT 9 + //I had to skip the +10dBM and -6dBm Values, use only ones AM/FM have in common. + //Highest Value is 12dBm for AM, 10 for FM. So Menu needs to reflect that. + const uint8_t tx_power_value_AM[TX_PRESET_POWER_COUNT] = { 0, - 0xC0, - 0xC5, - 0xCD, - 0x86, - 0x50, - 0x37, - 0x26, - 0x1D, - 0x17, - 0x03, + 0xC0, //12dBm + 0xCD, //7dBm + 0x86, //5dBm + 0x50, //0dBm + 0x26, // -10dBm + 0x1D, // -15dBm + 0x17, //-20dBm + 0x03 //-30dBm + }; + + //FM PATable Values. We have 8, not 10 (missing 12dBM and -6dBm that are in AM) + const uint8_t tx_power_value_FM[TX_PRESET_POWER_COUNT] = { + 0, + 0xC0, // 10dBm + 0xC8, //7dBm + 0x84, //5dBm + 0x60, //0dBm + 0x34, //-10dBm + 0x1D, //-15dBm + 0x0E, // -20dBm + 0x12, //-30dBm }; //Set the TX Power Here in the CC1101 register... - if(tx_power) - preset_data[preset_data_size - TX_POWER_OFFSET] = (uint8_t)tx_power_value[tx_power]; + if(tx_power) { + //Are we on an AM or FM preset? The PA table is different! + if(preset_data[preset_data_size - TX_POWER_OFFSET_FM]) { + preset_data[preset_data_size - TX_POWER_OFFSET_FM] = tx_power_value_FM[tx_power]; + } else if(preset_data[preset_data_size - TX_POWER_OFFSET_AM]) { + preset_data[preset_data_size - TX_POWER_OFFSET_AM] = tx_power_value_AM[tx_power]; + } //else //Must be a custom Preset with weird PA table not in FW code, dont touch it. + } //Pass back the preset_so we can call one liners. return preset_data; diff --git a/applications/main/subghz/scenes/subghz_scene_radio_settings.c b/applications/main/subghz/scenes/subghz_scene_radio_settings.c index 87e2d8269..be75723be 100644 --- a/applications/main/subghz/scenes/subghz_scene_radio_settings.c +++ b/applications/main/subghz/scenes/subghz_scene_radio_settings.c @@ -67,15 +67,13 @@ const int32_t debug_counter_val[DEBUG_COUNTER_COUNT] = { }; //TX Power -#define TX_POWER_COUNT 11 +#define TX_POWER_COUNT 9 const char* const tx_power_text[TX_POWER_COUNT] = { "Preset", - "12dBm", - "10dBm", + "10dBm +", "7dBm", "5dBm", "0dBm", - "-6dBm", "-10dBm", "-15dBm", "-20dBm", From 808774c05f83c14ccfc1469fcc17f5ba966f0c7f Mon Sep 17 00:00:00 2001 From: Dmitry422 Date: Thu, 12 Feb 2026 16:55:19 +0700 Subject: [PATCH 2/8] BT on/off to desktop_lock_menu --- applications/services/bt/bt_service/bt_api.c | 3 +-- applications/services/bt/bt_service/bt_api.h | 5 +++++ .../desktop/scenes/desktop_scene_lock_menu.c | 21 +++++++++++++++---- .../services/desktop/views/desktop_events.h | 3 ++- .../desktop/views/desktop_view_lock_menu.c | 17 ++++++++++----- 5 files changed, 37 insertions(+), 12 deletions(-) create mode 100644 applications/services/bt/bt_service/bt_api.h diff --git a/applications/services/bt/bt_service/bt_api.c b/applications/services/bt/bt_service/bt_api.c index 39b9a099d..8b42d7920 100644 --- a/applications/services/bt/bt_service/bt_api.c +++ b/applications/services/bt/bt_service/bt_api.c @@ -1,5 +1,4 @@ -#include "bt_i.h" -#include +#include "bt_api.h" FuriHalBleProfileBase* bt_profile_start( Bt* bt, diff --git a/applications/services/bt/bt_service/bt_api.h b/applications/services/bt/bt_service/bt_api.h new file mode 100644 index 000000000..5120ccc7f --- /dev/null +++ b/applications/services/bt/bt_service/bt_api.h @@ -0,0 +1,5 @@ +#pragma once +#include "bt_i.h" +#include + +extern void bt_set_settings(Bt* bt, const BtSettings* settings); \ No newline at end of file diff --git a/applications/services/desktop/scenes/desktop_scene_lock_menu.c b/applications/services/desktop/scenes/desktop_scene_lock_menu.c index 5ca95c4c5..b74ca7f48 100644 --- a/applications/services/desktop/scenes/desktop_scene_lock_menu.c +++ b/applications/services/desktop/scenes/desktop_scene_lock_menu.c @@ -10,6 +10,8 @@ #include "../views/desktop_view_lock_menu.h" #include "desktop_scene.h" +#include "applications/services/bt/bt_service/bt_api.h" + #define TAG "DesktopSceneLock" void desktop_scene_lock_menu_callback(DesktopEvent event, void* context) { @@ -34,6 +36,9 @@ bool desktop_scene_lock_menu_on_event(void* context, SceneManagerEvent event) { Desktop* desktop = (Desktop*)context; bool consumed = false; + Bt* bt = furi_record_open(RECORD_BT); + BtSettings bts = bt->bt_settings; + if(event.type == SceneManagerEventTypeTick) { bool check_pin_changed = scene_manager_get_scene_state(desktop->scene_manager, DesktopSceneLockMenu); @@ -42,10 +47,17 @@ bool desktop_scene_lock_menu_on_event(void* context, SceneManagerEvent event) { } } else if(event.type == SceneManagerEventTypeCustom) { switch(event.event) { - case DesktopLockMenuEventLock: - scene_manager_set_scene_state(desktop->scene_manager, DesktopSceneLockMenu, 0); - desktop_lock(desktop); - consumed = true; + // old use case + // case DesktopLockMenuEventLock: + // scene_manager_set_scene_state(desktop->scene_manager, DesktopSceneLockMenu, 0); + // desktop_lock(desktop); + // consumed = true; + // break; + case DesktopLockMenuEventBt: + bts.enabled = !bts.enabled; + bt_set_settings(bt, &bts); + scene_manager_search_and_switch_to_previous_scene( + desktop->scene_manager, DesktopSceneMain); break; case DesktopLockMenuEventDummyModeOn: desktop_set_dummy_mode_state(desktop, true); @@ -78,4 +90,5 @@ bool desktop_scene_lock_menu_on_event(void* context, SceneManagerEvent event) { void desktop_scene_lock_menu_on_exit(void* context) { UNUSED(context); + furi_record_close(RECORD_BT); } diff --git a/applications/services/desktop/views/desktop_events.h b/applications/services/desktop/views/desktop_events.h index b89ef5158..724761d48 100644 --- a/applications/services/desktop/views/desktop_events.h +++ b/applications/services/desktop/views/desktop_events.h @@ -37,7 +37,8 @@ typedef enum { DesktopDebugEventToggleDebugMode, DesktopDebugEventExit, - DesktopLockMenuEventLock, + //DesktopLockMenuEventLock, + DesktopLockMenuEventBt, DesktopLockMenuEventDummyModeOn, DesktopLockMenuEventDummyModeOff, DesktopLockMenuEventStealthModeOn, diff --git a/applications/services/desktop/views/desktop_view_lock_menu.c b/applications/services/desktop/views/desktop_view_lock_menu.c index 1b6bdab9c..fefb7b1bd 100644 --- a/applications/services/desktop/views/desktop_view_lock_menu.c +++ b/applications/services/desktop/views/desktop_view_lock_menu.c @@ -6,7 +6,8 @@ #include "desktop_view_lock_menu.h" typedef enum { - DesktopLockMenuIndexLock, + //DesktopLockMenuIndexLock, + DesktopLockMenuIndexBt, DesktopLockMenuIndexStealth, DesktopLockMenuIndexDummy, @@ -56,8 +57,9 @@ void desktop_lock_menu_draw_callback(Canvas* canvas, void* model) { for(size_t i = 0; i < DesktopLockMenuIndexTotalCount; ++i) { const char* str = NULL; - if(i == DesktopLockMenuIndexLock) { - str = "Lock"; + //if(i == DesktopLockMenuIndexLock) { + if(i == DesktopLockMenuIndexBt) { + str = "Bluetooth On/Off"; } else if(i == DesktopLockMenuIndexStealth) { if(m->stealth_mode) { str = "Unmute"; @@ -126,10 +128,15 @@ bool desktop_lock_menu_input_callback(InputEvent* event, void* context) { update); if(event->key == InputKeyOk) { - if(idx == DesktopLockMenuIndexLock) { + if(idx == DesktopLockMenuIndexBt) { if(event->type == InputTypeShort) { - lock_menu->callback(DesktopLockMenuEventLock, lock_menu->context); + lock_menu->callback(DesktopLockMenuEventBt, lock_menu->context); } + // old use case + // } else if(idx == DesktopLockMenuIndexLock) { + // if(event->type == InputTypeShort) { + // lock_menu->callback(DesktopLockMenuEventLock, lock_menu->context); + // } } else if(idx == DesktopLockMenuIndexStealth) { if((stealth_mode == false) && (event->type == InputTypeShort)) { lock_menu->callback(DesktopLockMenuEventStealthModeOn, lock_menu->context); From a98c610f6dcee25eed7c53800672485d8e9f788b Mon Sep 17 00:00:00 2001 From: Dmitry422 Date: Thu, 12 Feb 2026 17:27:28 +0700 Subject: [PATCH 3/8] BT string in desktop_lock_menu naming depent from BT ON|OFF --- .../desktop/scenes/desktop_scene_lock_menu.c | 1 + .../desktop/views/desktop_view_lock_menu.c | 14 +++++++++++++- .../desktop/views/desktop_view_lock_menu.h | 2 ++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/applications/services/desktop/scenes/desktop_scene_lock_menu.c b/applications/services/desktop/scenes/desktop_scene_lock_menu.c index b74ca7f48..369dcc0ef 100644 --- a/applications/services/desktop/scenes/desktop_scene_lock_menu.c +++ b/applications/services/desktop/scenes/desktop_scene_lock_menu.c @@ -27,6 +27,7 @@ void desktop_scene_lock_menu_on_enter(void* context) { desktop_lock_menu_set_dummy_mode_state(desktop->lock_menu, desktop->settings.dummy_mode); desktop_lock_menu_set_stealth_mode_state( desktop->lock_menu, furi_hal_rtc_is_flag_set(FuriHalRtcFlagStealthMode)); + desktop_lock_menu_set_bt_mode_state(desktop->lock_menu, furi_hal_bt_is_active()); desktop_lock_menu_set_idx(desktop->lock_menu, 0); view_dispatcher_switch_to_view(desktop->view_dispatcher, DesktopViewIdLockMenu); diff --git a/applications/services/desktop/views/desktop_view_lock_menu.c b/applications/services/desktop/views/desktop_view_lock_menu.c index fefb7b1bd..975db7749 100644 --- a/applications/services/desktop/views/desktop_view_lock_menu.c +++ b/applications/services/desktop/views/desktop_view_lock_menu.c @@ -40,6 +40,14 @@ void desktop_lock_menu_set_stealth_mode_state(DesktopLockMenuView* lock_menu, bo true); } +void desktop_lock_menu_set_bt_mode_state(DesktopLockMenuView* lock_menu, bool bt_mode) { + with_view_model( + lock_menu->view, + DesktopLockMenuViewModel * model, + { model->bt_mode = bt_mode; }, + true); +} + void desktop_lock_menu_set_idx(DesktopLockMenuView* lock_menu, uint8_t idx) { furi_assert(idx < DesktopLockMenuIndexTotalCount); with_view_model( @@ -59,7 +67,11 @@ void desktop_lock_menu_draw_callback(Canvas* canvas, void* model) { //if(i == DesktopLockMenuIndexLock) { if(i == DesktopLockMenuIndexBt) { - str = "Bluetooth On/Off"; + if(m->bt_mode) { + str = "Bluetooth OFF"; + } else { + str = "Bluetooth ON"; + } } else if(i == DesktopLockMenuIndexStealth) { if(m->stealth_mode) { str = "Unmute"; diff --git a/applications/services/desktop/views/desktop_view_lock_menu.h b/applications/services/desktop/views/desktop_view_lock_menu.h index a44e6b132..b2db7efb2 100644 --- a/applications/services/desktop/views/desktop_view_lock_menu.h +++ b/applications/services/desktop/views/desktop_view_lock_menu.h @@ -19,6 +19,7 @@ typedef struct { uint8_t idx; bool dummy_mode; bool stealth_mode; + bool bt_mode; } DesktopLockMenuViewModel; void desktop_lock_menu_set_callback( @@ -29,6 +30,7 @@ void desktop_lock_menu_set_callback( View* desktop_lock_menu_get_view(DesktopLockMenuView* lock_menu); void desktop_lock_menu_set_dummy_mode_state(DesktopLockMenuView* lock_menu, bool dummy_mode); void desktop_lock_menu_set_stealth_mode_state(DesktopLockMenuView* lock_menu, bool stealth_mode); +void desktop_lock_menu_set_bt_mode_state(DesktopLockMenuView* lock_menu, bool bt_mode); void desktop_lock_menu_set_idx(DesktopLockMenuView* lock_menu, uint8_t idx); DesktopLockMenuView* desktop_lock_menu_alloc(void); void desktop_lock_menu_free(DesktopLockMenuView* lock_menu); From c6421c9fff228f8ea5ca714cc9d48449f092e5fa Mon Sep 17 00:00:00 2001 From: Leeroy <135471162+LeeroysHub@users.noreply.github.com> Date: Thu, 12 Feb 2026 21:42:03 +1100 Subject: [PATCH 4/8] REFACTOR: Tx power fixes (Use 1 array, dont play with Weird Custom Presets) --- .../main/subghz/helpers/subghz_txrx.c | 36 ++++++++++--------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/applications/main/subghz/helpers/subghz_txrx.c b/applications/main/subghz/helpers/subghz_txrx.c index 93f197399..4c2765196 100644 --- a/applications/main/subghz/helpers/subghz_txrx.c +++ b/applications/main/subghz/helpers/subghz_txrx.c @@ -110,12 +110,14 @@ void subghz_txrx_set_preset( uint8_t* subghz_txrx_set_tx_power(uint8_t* preset_data, size_t preset_data_size, uint32_t tx_power) { -#define TX_POWER_OFFSET_FM 8 -#define TX_POWER_OFFSET_AM 7 -#define TX_PRESET_POWER_COUNT 9 +#define PRESET_POWER_OFFSET_FM 8 +#define PRESET_POWER_OFFSET_AM 7 +#define TX_PATABLE_OFFSET_AM 8 +#define TX_PATABLE_COUNT 17 + //I had to skip the +10dBM and -6dBm Values, use only ones AM/FM have in common. //Highest Value is 12dBm for AM, 10 for FM. So Menu needs to reflect that. - const uint8_t tx_power_value_AM[TX_PRESET_POWER_COUNT] = { + const uint8_t tx_pa_table[TX_PATABLE_COUNT] = { 0, 0xC0, //12dBm 0xCD, //7dBm @@ -124,12 +126,7 @@ uint8_t* 0x26, // -10dBm 0x1D, // -15dBm 0x17, //-20dBm - 0x03 //-30dBm - }; - - //FM PATable Values. We have 8, not 10 (missing 12dBM and -6dBm that are in AM) - const uint8_t tx_power_value_FM[TX_PRESET_POWER_COUNT] = { - 0, + 0x03, //-30dBm 0xC0, // 10dBm 0xC8, //7dBm 0x84, //5dBm @@ -142,12 +139,19 @@ uint8_t* //Set the TX Power Here in the CC1101 register... if(tx_power) { - //Are we on an AM or FM preset? The PA table is different! - if(preset_data[preset_data_size - TX_POWER_OFFSET_FM]) { - preset_data[preset_data_size - TX_POWER_OFFSET_FM] = tx_power_value_FM[tx_power]; - } else if(preset_data[preset_data_size - TX_POWER_OFFSET_AM]) { - preset_data[preset_data_size - TX_POWER_OFFSET_AM] = tx_power_value_AM[tx_power]; - } //else //Must be a custom Preset with weird PA table not in FW code, dont touch it. + //Grab the AM and FM byte now, so we can do proper checks. + uint8_t fm_byte = preset_data[preset_data_size - PRESET_POWER_OFFSET_FM]; + uint8_t am_byte = preset_data[preset_data_size - PRESET_POWER_OFFSET_AM]; + + //If we have both bytes 1st bytes set or none, this isnt a preset we can deal with here. + if(fm_byte & !am_byte) { + //Use FM Table + preset_data[preset_data_size - PRESET_POWER_OFFSET_FM] = tx_pa_table[tx_power]; + } else if(am_byte & !fm_byte) { + //Use AM Table + preset_data[preset_data_size - PRESET_POWER_OFFSET_AM] = + tx_pa_table[TX_PATABLE_OFFSET_AM + tx_power]; + } } //Pass back the preset_so we can call one liners. From ab8261e1404bf8dee92cdb6c7c42dff33a90e1bf Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Thu, 12 Feb 2026 18:34:37 +0300 Subject: [PATCH 5/8] power exit into settings [ci skip] --- .../scenes/power_settings_scene_power_off.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/applications/settings/power_settings_app/scenes/power_settings_scene_power_off.c b/applications/settings/power_settings_app/scenes/power_settings_scene_power_off.c index 6328a2381..073116ae5 100644 --- a/applications/settings/power_settings_app/scenes/power_settings_scene_power_off.c +++ b/applications/settings/power_settings_app/scenes/power_settings_scene_power_off.c @@ -27,7 +27,7 @@ void power_settings_scene_power_off_on_enter(void* context) { dialog, " I will be\nwaiting for\n you here...", 78, 14, AlignLeft, AlignTop); dialog_ex_set_icon(dialog, 14, 10, &I_dolph_cry_49x54); } - dialog_ex_set_left_button_text(dialog, "Cancel"); + dialog_ex_set_left_button_text(dialog, "Settings"); dialog_ex_set_right_button_text(dialog, "Power Off"); dialog_ex_set_result_callback(dialog, power_settings_scene_power_off_dialog_callback); dialog_ex_set_context(dialog, app); @@ -42,8 +42,7 @@ bool power_settings_scene_power_off_on_event(void* context, SceneManagerEvent ev if(event.type == SceneManagerEventTypeCustom) { if(event.event == DialogExResultLeft) { if(!scene_manager_previous_scene(app->scene_manager)) { - scene_manager_stop(app->scene_manager); - view_dispatcher_stop(app->view_dispatcher); + scene_manager_next_scene(app->scene_manager, PowerSettingsAppSceneStart); } } else if(event.event == DialogExResultRight) { power_off(app->power); From 3f0f90e0a376db8123a827a9c6f07134b59380c9 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Thu, 12 Feb 2026 18:50:03 +0300 Subject: [PATCH 6/8] formatting, text fixes --- applications/services/bt/bt_service/bt_api.c | 2 +- applications/services/bt/bt_service/bt_api.h | 2 +- .../desktop/views/desktop_view_lock_menu.c | 19 ++++++++----------- .../scenes/power_settings_scene_power_off.c | 2 +- 4 files changed, 11 insertions(+), 14 deletions(-) diff --git a/applications/services/bt/bt_service/bt_api.c b/applications/services/bt/bt_service/bt_api.c index 8b42d7920..861569d71 100644 --- a/applications/services/bt/bt_service/bt_api.c +++ b/applications/services/bt/bt_service/bt_api.c @@ -1,4 +1,4 @@ -#include "bt_api.h" +#include "bt_api.h" FuriHalBleProfileBase* bt_profile_start( Bt* bt, diff --git a/applications/services/bt/bt_service/bt_api.h b/applications/services/bt/bt_service/bt_api.h index 5120ccc7f..24801d13b 100644 --- a/applications/services/bt/bt_service/bt_api.h +++ b/applications/services/bt/bt_service/bt_api.h @@ -2,4 +2,4 @@ #include "bt_i.h" #include -extern void bt_set_settings(Bt* bt, const BtSettings* settings); \ No newline at end of file +extern void bt_set_settings(Bt* bt, const BtSettings* settings); diff --git a/applications/services/desktop/views/desktop_view_lock_menu.c b/applications/services/desktop/views/desktop_view_lock_menu.c index 975db7749..995a47f95 100644 --- a/applications/services/desktop/views/desktop_view_lock_menu.c +++ b/applications/services/desktop/views/desktop_view_lock_menu.c @@ -42,10 +42,7 @@ void desktop_lock_menu_set_stealth_mode_state(DesktopLockMenuView* lock_menu, bo void desktop_lock_menu_set_bt_mode_state(DesktopLockMenuView* lock_menu, bool bt_mode) { with_view_model( - lock_menu->view, - DesktopLockMenuViewModel * model, - { model->bt_mode = bt_mode; }, - true); + lock_menu->view, DesktopLockMenuViewModel * model, { model->bt_mode = bt_mode; }, true); } void desktop_lock_menu_set_idx(DesktopLockMenuView* lock_menu, uint8_t idx) { @@ -68,9 +65,9 @@ void desktop_lock_menu_draw_callback(Canvas* canvas, void* model) { //if(i == DesktopLockMenuIndexLock) { if(i == DesktopLockMenuIndexBt) { if(m->bt_mode) { - str = "Bluetooth OFF"; + str = "Bluetooth Off"; } else { - str = "Bluetooth ON"; + str = "Bluetooth On"; } } else if(i == DesktopLockMenuIndexStealth) { if(m->stealth_mode) { @@ -144,11 +141,11 @@ bool desktop_lock_menu_input_callback(InputEvent* event, void* context) { if(event->type == InputTypeShort) { lock_menu->callback(DesktopLockMenuEventBt, lock_menu->context); } - // old use case - // } else if(idx == DesktopLockMenuIndexLock) { - // if(event->type == InputTypeShort) { - // lock_menu->callback(DesktopLockMenuEventLock, lock_menu->context); - // } + // old use case + // } else if(idx == DesktopLockMenuIndexLock) { + // if(event->type == InputTypeShort) { + // lock_menu->callback(DesktopLockMenuEventLock, lock_menu->context); + // } } else if(idx == DesktopLockMenuIndexStealth) { if((stealth_mode == false) && (event->type == InputTypeShort)) { lock_menu->callback(DesktopLockMenuEventStealthModeOn, lock_menu->context); diff --git a/applications/settings/power_settings_app/scenes/power_settings_scene_power_off.c b/applications/settings/power_settings_app/scenes/power_settings_scene_power_off.c index 073116ae5..b89c2d0b8 100644 --- a/applications/settings/power_settings_app/scenes/power_settings_scene_power_off.c +++ b/applications/settings/power_settings_app/scenes/power_settings_scene_power_off.c @@ -25,7 +25,7 @@ void power_settings_scene_power_off_on_enter(void* context) { if(!settings.happy_mode) { dialog_ex_set_text( dialog, " I will be\nwaiting for\n you here...", 78, 14, AlignLeft, AlignTop); - dialog_ex_set_icon(dialog, 14, 10, &I_dolph_cry_49x54); + dialog_ex_set_icon(dialog, 24, 10, &I_dolph_cry_49x54); } dialog_ex_set_left_button_text(dialog, "Settings"); dialog_ex_set_right_button_text(dialog, "Power Off"); From 9eb8e475ccb46aa28e193d25a325401bf5b0d68c Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Thu, 12 Feb 2026 20:24:32 +0300 Subject: [PATCH 7/8] fix switching, etc. --- .../main/subghz/helpers/subghz_txrx.c | 35 ++++++++++++------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/applications/main/subghz/helpers/subghz_txrx.c b/applications/main/subghz/helpers/subghz_txrx.c index cf066acbf..9e972ad40 100644 --- a/applications/main/subghz/helpers/subghz_txrx.c +++ b/applications/main/subghz/helpers/subghz_txrx.c @@ -109,7 +109,7 @@ void subghz_txrx_set_preset( } uint8_t* - subghz_txrx_set_tx_power(uint8_t* preset_data, size_t preset_data_size, uint32_t tx_power) { + subghz_txrx_set_tx_power(uint8_t* preset_data, size_t preset_data_size, uint8_t tx_power) { #define PRESET_POWER_OFFSET_FM 8 #define PRESET_POWER_OFFSET_AM 7 #define TX_PATABLE_OFFSET_AM 8 @@ -137,20 +137,29 @@ uint8_t* 0x12, //-30dBm }; - //Set the TX Power Here in the CC1101 register... - if(tx_power) { - //Grab the AM and FM byte now, so we can do proper checks. - uint8_t fm_byte = preset_data[preset_data_size - PRESET_POWER_OFFSET_FM]; - uint8_t am_byte = preset_data[preset_data_size - PRESET_POWER_OFFSET_AM]; + //Grab the AM and FM byte now, so we can do proper checks. + uint8_t fm_byte = preset_data[preset_data_size - PRESET_POWER_OFFSET_FM]; + uint8_t am_byte = preset_data[preset_data_size - PRESET_POWER_OFFSET_AM]; - //If we have both bytes 1st bytes set or none, this isnt a preset we can deal with here. - if(fm_byte & !am_byte) { - //Use FM Table - preset_data[preset_data_size - PRESET_POWER_OFFSET_FM] = tx_pa_table[tx_power]; - } else if(am_byte & !fm_byte) { - //Use AM Table - preset_data[preset_data_size - PRESET_POWER_OFFSET_AM] = + //Set the TX Power Here in the CC1101 register... + + //If we have both bytes 1st bytes set or none, this isnt a preset we can deal with here. + if(fm_byte && !am_byte) { + //Use FM Table + if(tx_power) { + preset_data[preset_data_size - PRESET_POWER_OFFSET_FM] = tx_pa_table[TX_PATABLE_OFFSET_AM + tx_power]; + } else { + preset_data[preset_data_size - PRESET_POWER_OFFSET_FM] = + tx_pa_table[1]; //Max Power 0xC0 10dBm + } + } else if(am_byte && !fm_byte) { + //Use AM Table + if(tx_power) { + preset_data[preset_data_size - PRESET_POWER_OFFSET_AM] = tx_pa_table[tx_power]; + } else { + preset_data[preset_data_size - PRESET_POWER_OFFSET_AM] = + tx_pa_table[1]; //Max Power 0xC0 12dBm } } From 0032c55a39ca402f7b1ecbac4b52275298d2b8ef Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Thu, 12 Feb 2026 21:55:47 +0300 Subject: [PATCH 8/8] upd changelog --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0bf9ac068..0e2adab8e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,11 +20,13 @@ * SubGHz: KeeLoq **add counter mode 7 (sends 7 signals increasing counter with 0x3333 steps)** - may bypass counter on some receivers! * SubGHz: Add signals button editor and real **remote simulation** (full signal transmit with just one click) (PR #956 #958 | by @Dmitry422) * SubGHz: TX Power setting (PR #960 | by @LeeroysHub) +* Desktop: BT ON/OFF instead of Lock/Unlock action in desktop lock menu (To lock - hold Up button) (PR #965 | by @Dmitry422) (idea by Dezederix) +* Desktop: Holding back button to power off menu now allows to open power settings on left button (idea by Dezederix) * JS: feat: add IR capabilities to the JS engine (PR #957 | by @LuisMayo) * NFC: Handle PPS request in ISO14443-4 layer (by @WillyJL) * NFC: Fixes to `READ_MULTI` and `GET_BLOCK_SECURITY` commands in ISO 15693-3 emulation (by @WillyJL & @aaronjamt) * Archive: Allow folders to be pinned (by @WillyJL) -* Apps: Build tag (**10feb2026**) - **Check out more Apps updates and fixes by following** [this link](https://github.com/xMasterX/all-the-plugins/commits/dev) +* Apps: Build tag (**12feb2026p3**) - **Check out more Apps updates and fixes by following** [this link](https://github.com/xMasterX/all-the-plugins/commits/dev) ## Other changes * Settings: Storage settings exit scenes properly if used via favourites (fixes issue #951) * LCD: Backlight settings bug fix (PR #962 | by @Dmitry422)