diff --git a/applications/main/subghz/scenes/subghz_scene_ext_module_settings.c b/applications/main/subghz/scenes/subghz_scene_ext_module_settings.c index 0bfdce0c9..368cab06f 100644 --- a/applications/main/subghz/scenes/subghz_scene_ext_module_settings.c +++ b/applications/main/subghz/scenes/subghz_scene_ext_module_settings.c @@ -4,6 +4,7 @@ uint8_t value_index_exm; uint8_t value_index_dpin; uint8_t value_index_cnt; +uint8_t value_index_pwr; #define EXT_MODULES_COUNT (sizeof(radio_modules_variables_text) / sizeof(char* const)) const char* const radio_modules_variables_text[] = { @@ -11,6 +12,12 @@ const char* const radio_modules_variables_text[] = { "External", }; +#define EXT_MOD_POWER_COUNT 2 +const char* const ext_mod_power_text[EXT_MOD_POWER_COUNT] = { + "ON", + "OFF", +}; + #define DEBUG_P_COUNT 2 const char* const debug_pin_text[DEBUG_P_COUNT] = { "OFF", @@ -77,6 +84,14 @@ static void subghz_scene_receiver_config_set_debug_counter(VariableItem* item) { } } +static void subghz_scene_receiver_config_set_ext_mod_power(VariableItem* item) { + uint8_t index = variable_item_get_current_value_index(item); + + variable_item_set_current_value_text(item, ext_mod_power_text[index]); + + furi_hal_subghz_set_external_power_disable(index == 1); +} + void subghz_scene_ext_module_settings_on_enter(void* context) { SubGhz* subghz = context; @@ -92,10 +107,20 @@ void subghz_scene_ext_module_settings_on_enter(void* context) { variable_item_set_current_value_index(item, value_index_exm); variable_item_set_current_value_text(item, radio_modules_variables_text[value_index_exm]); + item = variable_item_list_add( + subghz->variable_item_list, + "Ext Radio 5v", + EXT_MOD_POWER_COUNT, + subghz_scene_receiver_config_set_ext_mod_power, + subghz); + value_index_pwr = furi_hal_subghz_get_external_power_disable(); + variable_item_set_current_value_index(item, value_index_pwr); + variable_item_set_current_value_text(item, ext_mod_power_text[value_index_pwr]); + if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) { item = variable_item_list_add( subghz->variable_item_list, - "Debug Pin:", + "Debug Pin", DEBUG_P_COUNT, subghz_scene_receiver_config_set_debug_pin, subghz); @@ -105,7 +130,7 @@ void subghz_scene_ext_module_settings_on_enter(void* context) { item = variable_item_list_add( subghz->variable_item_list, - "Counter Mult:", + "Counter incr.", DEBUG_COUNTER_COUNT, subghz_scene_receiver_config_set_debug_counter, subghz); diff --git a/firmware/targets/f7/api_symbols.csv b/firmware/targets/f7/api_symbols.csv index fe9a09c56..532008729 100644 --- a/firmware/targets/f7/api_symbols.csv +++ b/firmware/targets/f7/api_symbols.csv @@ -1357,6 +1357,7 @@ Function,-,furi_hal_subghz_dump_state,void, Function,+,furi_hal_subghz_enable_ext_power,_Bool, Function,+,furi_hal_subghz_flush_rx,void, Function,+,furi_hal_subghz_flush_tx,void, +Function,+,furi_hal_subghz_get_external_power_disable,_Bool, Function,+,furi_hal_subghz_get_lqi,uint8_t, Function,+,furi_hal_subghz_get_radio_type,SubGhzRadioType, Function,+,furi_hal_subghz_get_rolling_counter_mult,uint8_t, @@ -1377,6 +1378,7 @@ Function,+,furi_hal_subghz_reset,void, Function,+,furi_hal_subghz_rx,void, Function,+,furi_hal_subghz_rx_pipe_not_empty,_Bool, Function,+,furi_hal_subghz_set_async_mirror_pin,void,const GpioPin* +Function,+,furi_hal_subghz_set_external_power_disable,void,_Bool Function,+,furi_hal_subghz_set_frequency,uint32_t,uint32_t Function,+,furi_hal_subghz_set_frequency_and_path,uint32_t,uint32_t Function,+,furi_hal_subghz_set_path,void,FuriHalSubGhzPath diff --git a/firmware/targets/f7/furi_hal/furi_hal_subghz.c b/firmware/targets/f7/furi_hal/furi_hal_subghz.c index fcec64023..181445372 100644 --- a/firmware/targets/f7/furi_hal/furi_hal_subghz.c +++ b/firmware/targets/f7/furi_hal/furi_hal_subghz.c @@ -39,6 +39,7 @@ volatile FuriHalSubGhz furi_hal_subghz = { .spi_bus_handle = &furi_hal_spi_bus_handle_subghz, .cc1101_g0_pin = &gpio_cc1101_g0, .rolling_counter_mult = 1, + .ext_module_power_disabled = false, }; bool furi_hal_subghz_set_radio_type(SubGhzRadioType state) { @@ -70,6 +71,14 @@ void furi_hal_subghz_set_rolling_counter_mult(uint8_t mult) { furi_hal_subghz.rolling_counter_mult = mult; } +void furi_hal_subghz_set_external_power_disable(bool state) { + furi_hal_subghz.ext_module_power_disabled = state; +} + +bool furi_hal_subghz_get_external_power_disable(void) { + return furi_hal_subghz.ext_module_power_disabled; +} + void furi_hal_subghz_set_async_mirror_pin(const GpioPin* pin) { furi_hal_subghz.async_mirror_pin = pin; } @@ -79,6 +88,9 @@ void furi_hal_subghz_init(void) { } bool furi_hal_subghz_enable_ext_power(void) { + if(furi_hal_subghz.ext_module_power_disabled) { + return false; + } if(furi_hal_subghz.radio_type != SubGhzRadioInternal) { uint8_t attempts = 0; while(!furi_hal_power_is_otg_enabled() && attempts++ < 2) { diff --git a/firmware/targets/f7/furi_hal/furi_hal_subghz.h b/firmware/targets/f7/furi_hal/furi_hal_subghz.h index f66cb3960..ec886f693 100644 --- a/firmware/targets/f7/furi_hal/furi_hal_subghz.h +++ b/firmware/targets/f7/furi_hal/furi_hal_subghz.h @@ -78,6 +78,7 @@ typedef struct { FuriHalSpiBusHandle* spi_bus_handle; const GpioPin* cc1101_g0_pin; uint8_t rolling_counter_mult; + bool ext_module_power_disabled; } FuriHalSubGhz; extern volatile FuriHalSubGhz furi_hal_subghz; @@ -321,6 +322,14 @@ uint8_t furi_hal_subghz_get_rolling_counter_mult(void); */ void furi_hal_subghz_set_rolling_counter_mult(uint8_t mult); +/** If true - disable 5v power of the external radio module + */ +void furi_hal_subghz_set_external_power_disable(bool state); + +/** Get the current state of the external power disable flag + */ +bool furi_hal_subghz_get_external_power_disable(void); + #ifdef __cplusplus } #endif