diff --git a/applications/main/subghz/helpers/subghz_custom_event.h b/applications/main/subghz/helpers/subghz_custom_event.h index 11e77741f..469ce4491 100644 --- a/applications/main/subghz/helpers/subghz_custom_event.h +++ b/applications/main/subghz/helpers/subghz_custom_event.h @@ -82,6 +82,7 @@ typedef enum { SubGhzCustomEventSceneShowOnlyRX, SubGhzCustomEventSceneAnalyzerLock, SubGhzCustomEventSceneAnalyzerUnlock, + SubGhzCustomEventSceneSettingRepeater, SubGhzCustomEventSceneSettingRemoveDuplicates, SubGhzCustomEventSceneSettingLock, SubGhzCustomEventSceneSettingResetToDefault, diff --git a/applications/main/subghz/scenes/subghz_scene_need_saving.c b/applications/main/subghz/scenes/subghz_scene_need_saving.c index 9a2d047ba..3368bda04 100644 --- a/applications/main/subghz/scenes/subghz_scene_need_saving.c +++ b/applications/main/subghz/scenes/subghz_scene_need_saving.c @@ -16,7 +16,7 @@ void subghz_scene_need_saving_on_enter(void* context) { SubGhz* subghz = context; widget_add_string_multiline_element( - subghz->widget, 64, 13, AlignCenter, AlignCenter, FontPrimary, "Exit to Sub-GHz Menu?"); + subghz->widget, 64, 13, AlignCenter, AlignCenter, FontPrimary, "Discard Signals?"); widget_add_string_multiline_element( subghz->widget, 64, @@ -29,7 +29,7 @@ void subghz_scene_need_saving_on_enter(void* context) { widget_add_button_element( subghz->widget, GuiButtonTypeRight, "Stay", subghz_scene_need_saving_callback, subghz); widget_add_button_element( - subghz->widget, GuiButtonTypeLeft, "Exit", subghz_scene_need_saving_callback, subghz); + subghz->widget, GuiButtonTypeLeft, "Continue", subghz_scene_need_saving_callback, subghz); view_dispatcher_switch_to_view(subghz->view_dispatcher, SubGhzViewIdWidget); } @@ -54,6 +54,15 @@ bool subghz_scene_need_saving_on_event(void* context, SceneManagerEvent event) { subghz->txrx, "AM650", subghz->last_settings->frequency, 0, 0, NULL, 0); scene_manager_search_and_switch_to_previous_scene( subghz->scene_manager, SubGhzSceneStart); + } else if(state == SubGhzRxKeyStateTX) { + subghz->repeater = SubGhzRepeaterStateOn; + subghz->last_settings->repeater_state = SubGhzRepeaterStateOn; + if((subghz->filter & SubGhzProtocolFlag_BinRAW) == 0) { + subghz->filter = SubGhzProtocolFlag_Decodable | SubGhzProtocolFlag_BinRAW; + subghz_txrx_receiver_set_filter(subghz->txrx, subghz->filter); + subghz->repeater_bin_raw_was_off = true; + } + scene_manager_previous_scene(subghz->scene_manager); } else { scene_manager_previous_scene(subghz->scene_manager); } diff --git a/applications/main/subghz/scenes/subghz_scene_receiver_config.c b/applications/main/subghz/scenes/subghz_scene_receiver_config.c index 7ff655755..ee2dafb21 100644 --- a/applications/main/subghz/scenes/subghz_scene_receiver_config.c +++ b/applications/main/subghz/scenes/subghz_scene_receiver_config.c @@ -280,6 +280,16 @@ static void subghz_scene_receiver_config_set_repeater(VariableItem* item) { SubGhz* subghz = variable_item_get_context(item); uint8_t index = variable_item_get_current_value_index(item); + if(subghz->repeater == SubGhzRepeaterStateOff && + (subghz_rx_key_state_get(subghz) == SubGhzRxKeyStateAddKey || + subghz_rx_key_state_get(subghz) == SubGhzRxKeyStateBack)) { + scene_manager_set_scene_state( + subghz->scene_manager, SubGhzSceneReceiverConfig, SubGhzSettingIndexRepeater); + view_dispatcher_send_custom_event( + subghz->view_dispatcher, SubGhzCustomEventSceneSettingRepeater); + return; + } + //Set menu Text. variable_item_set_current_value_text(item, repeater_text[index]); @@ -293,8 +303,7 @@ static void subghz_scene_receiver_config_set_repeater(VariableItem* item) { //Change BinRAW to ON or OFF as required, and remember whether I changed it! (Put back for the user.) if(repeater_value[index] != SubGhzRepeaterStateOff) { - if((bin_raw_value[variable_item_get_current_value_index(bin_raw_menu)] & - SubGhzProtocolFlag_BinRAW) == 0) { + if((subghz->filter & SubGhzProtocolFlag_BinRAW) == 0) { //Repeater is on, Binraw is Off. variable_item_set_current_value_index( bin_raw_menu, 1 /*Index of ON in BIN_Raw menu!*/); @@ -648,6 +657,12 @@ void subghz_scene_receiver_config_on_enter(void* context) { variable_item_set_current_value_index(item, value_index); variable_item_set_current_value_text(item, raw_threshold_rssi_text[value_index]); } + + variable_item_list_set_selected_item( + subghz->variable_item_list, + scene_manager_get_scene_state(subghz->scene_manager, SubGhzSceneReceiverConfig)); + scene_manager_set_scene_state(subghz->scene_manager, SubGhzSceneReceiverConfig, 0); + view_dispatcher_switch_to_view(subghz->view_dispatcher, SubGhzViewIdVariableItemList); } @@ -656,7 +671,11 @@ bool subghz_scene_receiver_config_on_event(void* context, SceneManagerEvent even bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { - if(event.event == SubGhzCustomEventSceneSettingRemoveDuplicates) { + if(event.event == SubGhzCustomEventSceneSettingRepeater) { + subghz_rx_key_state_set(subghz, SubGhzRxKeyStateTX); + scene_manager_next_scene(subghz->scene_manager, SubGhzSceneNeedSaving); + consumed = true; + } else if(event.event == SubGhzCustomEventSceneSettingRemoveDuplicates) { subghz_history_remove_duplicates(subghz->history); scene_manager_previous_scene(subghz->scene_manager); consumed = true;