UNLEASHED:: TX Power setting to SubGhz App

* Works in Read, and Read RAW.
* You can now adjust the TX power for testing devices without desyncing them from inside
* Lets you do RTL testing etc on very low power.

CODE REFACTORED, subghz_txrx_set_tx_power added.
This commit is contained in:
Leeroy
2026-02-04 17:11:03 +11:00
parent 30d48c112b
commit a515f435fc
11 changed files with 167 additions and 23 deletions

View File

@@ -110,7 +110,8 @@ void subghz_scene_read_raw_on_enter(void* context) {
subghz_txrx_set_preset_internal(
subghz->txrx,
subghz->last_settings->frequency,
subghz->last_settings->preset_index);
subghz->last_settings->preset_index,
subghz->last_settings->tx_power);
}
}
subghz_scene_read_raw_update_statusbar(subghz);

View File

@@ -165,11 +165,15 @@ void subghz_scene_receiver_on_enter(void* context) {
if(subghz_rx_key_state_get(subghz) == SubGhzRxKeyStateIDLE) {
subghz_txrx_set_preset_internal(
subghz->txrx, subghz->last_settings->frequency, subghz->last_settings->preset_index);
subghz->txrx,
subghz->last_settings->frequency,
subghz->last_settings->preset_index,
subghz->last_settings->tx_power);
subghz->filter = subghz->last_settings->filter;
subghz_txrx_receiver_set_filter(subghz->txrx, subghz->filter);
subghz->ignore_filter = subghz->last_settings->ignore_filter;
subghz->tx_power = subghz->last_settings->tx_power;
subghz_history_reset(history);
subghz_rx_key_state_set(subghz, SubGhzRxKeyStateStart);

View File

@@ -7,6 +7,7 @@ enum SubGhzSettingIndex {
SubGhzSettingIndexFrequency,
SubGhzSettingIndexHopping,
SubGhzSettingIndexModulation,
SubGhzSettingIndexTXPower,
SubGhzSettingIndexBinRAW,
SubGhzSettingIndexIgnoreReversRB2,
SubGhzSettingIndexIgnoreAlarms,
@@ -102,6 +103,22 @@ const char* const combobox_text[COMBO_BOX_COUNT] = {
"ON",
};
//TX Power
#define TX_POWER_COUNT 11
const char* const tx_power_text[TX_POWER_COUNT] = {
"Preset",
"12dBm",
"10dBm",
"7dBm",
"5dBm",
"0dBm",
"-6dBm",
"-10dBm",
"-15dBm",
"-20dBm",
"-30dBm",
};
static void
subghz_scene_receiver_config_set_ignore_filter(VariableItem* item, SubGhzProtocolFlag filter) {
SubGhz* subghz = variable_item_get_context(item);
@@ -185,6 +202,11 @@ static void subghz_scene_receiver_config_set_frequency(VariableItem* item) {
frequency / 1000000,
(frequency % 1000000) / 10000);
variable_item_set_current_value_text(item, text_buf);
//Set TX Power
subghz_txrx_set_tx_power(preset.data, preset.data_size, subghz->tx_power);
//Set the preset now.
subghz_txrx_set_preset(
subghz->txrx,
furi_string_get_cstr(preset.name),
@@ -211,12 +233,14 @@ static void subghz_scene_receiver_config_set_preset(VariableItem* item) {
variable_item_set_current_value_text(item, preset_name);
//subghz->last_settings->preset = index;
SubGhzRadioPreset preset = subghz_txrx_get_preset(subghz->txrx);
uint8_t* preset_data = subghz_setting_get_preset_data(setting, index);
size_t preset_data_size = subghz_setting_get_preset_data_size(setting, index);
//Edit TX power, if necessary.
subghz_txrx_set_tx_power(preset_data, preset_data_size, subghz->tx_power);
subghz_txrx_set_preset(
subghz->txrx,
preset_name,
preset.frequency,
subghz_setting_get_preset_data(setting, index),
subghz_setting_get_preset_data_size(setting, index));
subghz->txrx, preset_name, preset.frequency, preset_data, preset_data_size);
subghz->last_settings->preset_index = index;
}
@@ -242,6 +266,9 @@ static void subghz_scene_receiver_config_set_hopping(VariableItem* item) {
(frequency % 1000000) / 10000);
variable_item_set_current_value_text(frequency_item, text_buf);
//Edit TX power, if necessary.
subghz_txrx_set_tx_power(preset.data, preset.data_size, subghz->tx_power);
// Maybe better add one more function with only with the frequency argument?
subghz_txrx_set_preset(
subghz->txrx,
@@ -273,6 +300,30 @@ static void subghz_scene_receiver_config_set_speaker(VariableItem* item) {
subghz_txrx_speaker_set_state(subghz->txrx, speaker_value[index]);
}
static void subghz_scene_receiver_config_set_tx_power(VariableItem* item) {
SubGhz* subghz = variable_item_get_context(item);
uint8_t index = variable_item_get_current_value_index(item);
//Update the Menu Item on screen
variable_item_set_current_value_text(item, tx_power_text[index]);
//Set TX power and remember setting
subghz->tx_power = index;
subghz->last_settings->tx_power = subghz->tx_power;
//Get current preset and frequency so I can update preset wit TX power.
SubGhzSetting* setting = subghz_txrx_get_setting(subghz->txrx);
uint32_t frequency = subghz_setting_get_default_frequency(setting);
SubGhzRadioPreset preset = subghz_txrx_get_preset(subghz->txrx);
//Edit TX power, if necessary.
subghz_txrx_set_tx_power(preset.data, preset.data_size, subghz->tx_power);
// Maybe better add one more function with only with the frequency argument?
subghz_txrx_set_preset(
subghz->txrx, furi_string_get_cstr(preset.name), frequency, preset.data, preset.data_size);
}
static void subghz_scene_receiver_config_set_bin_raw(VariableItem* item) {
SubGhz* subghz = variable_item_get_context(item);
uint8_t index = variable_item_get_current_value_index(item);
@@ -341,7 +392,8 @@ static void subghz_scene_receiver_config_var_list_enter_callback(void* context,
subghz_txrx_set_preset_internal(
subghz->txrx,
SUBGHZ_LAST_SETTING_DEFAULT_FREQUENCY,
SUBGHZ_LAST_SETTING_DEFAULT_PRESET);
SUBGHZ_LAST_SETTING_DEFAULT_PRESET,
0);
SubGhzSetting* setting = subghz_txrx_get_setting(subghz->txrx);
SubGhzRadioPreset preset = subghz_txrx_get_preset(subghz->txrx);
@@ -359,7 +411,7 @@ static void subghz_scene_receiver_config_var_list_enter_callback(void* context,
subghz->last_settings->ignore_filter = subghz->ignore_filter;
subghz->last_settings->filter = subghz->filter;
subghz->last_settings->delete_old_signals = false;
subghz->last_settings->tx_power = subghz->tx_power = 0;
subghz_txrx_speaker_set_state(subghz->txrx, speaker_value[default_index]);
subghz_txrx_hopper_set_state(subghz->txrx, hopping_value[default_index]);
@@ -429,6 +481,18 @@ void subghz_scene_receiver_config_on_enter(void* context) {
variable_item_set_current_value_text(item, hopping_mode_text[value_index]);
}
//Add TX Power
item = variable_item_list_add(
subghz->variable_item_list,
"TX Power",
TX_POWER_COUNT,
subghz_scene_receiver_config_set_tx_power,
subghz);
value_index = subghz->tx_power;
variable_item_set_current_value_index(item, value_index);
variable_item_set_current_value_text(item, tx_power_text[value_index]);
if(scene_manager_get_scene_state(subghz->scene_manager, SubGhzSceneReadRAW) !=
SubGhzCustomEventManagerSet) {
item = variable_item_list_add(

View File

@@ -36,6 +36,10 @@ static bool subghz_scene_receiver_info_update_parser(void* context) {
SubGhzRadioPreset* preset =
subghz_history_get_radio_preset(subghz->history, subghz->idx_menu_chosen);
//Edit TX power, if necessary.
subghz_txrx_set_tx_power(preset->data, preset->data_size, subghz->tx_power);
subghz_txrx_set_preset(
subghz->txrx,
furi_string_get_cstr(preset->name),