diff --git a/applications/main/xtreme_app/application.fam b/applications/main/xtreme_app/application.fam index 618ef51d6..266350521 100644 --- a/applications/main/xtreme_app/application.fam +++ b/applications/main/xtreme_app/application.fam @@ -9,7 +9,7 @@ App( "dolphin", "xtreme", ], - stack_size=1 * 1024, + stack_size=2 * 1024, # icon="A_Xtreme_14", order=90, fap_category=".Main", diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_config.h b/applications/main/xtreme_app/scenes/xtreme_app_scene_config.h index 231386e2b..f3586e2b3 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_config.h +++ b/applications/main/xtreme_app/scenes/xtreme_app_scene_config.h @@ -3,6 +3,7 @@ ADD_SCENE(xtreme_app, graphics, Graphics) ADD_SCENE(xtreme_app, statusbar, Statusbar) ADD_SCENE(xtreme_app, protocols, Protocols) ADD_SCENE(xtreme_app, protocols_frequencies, ProtocolsFrequencies) +ADD_SCENE(xtreme_app, protocols_frequencies_add, ProtocolsFrequenciesAdd) ADD_SCENE(xtreme_app, dolphin, Dolphin) ADD_SCENE(xtreme_app, misc, Misc) ADD_SCENE(xtreme_app, misc_rename, MiscRename) diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols_frequencies.c b/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols_frequencies.c index ad0608e82..41056bc53 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols_frequencies.c +++ b/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols_frequencies.c @@ -3,9 +3,11 @@ enum VarItemListIndex { VarItemListIndexUseDefaults, VarItemListIndexStaticFrequency, - VarItemListIndexDeleteStatic, + VarItemListIndexDeleteStaticFreq, + VarItemListIndexAddStaticFreq, VarItemListIndexHopperFrequency, - VarItemListIndexDeleteHopper, + VarItemListIndexDeleteHopperFreq, + VarItemListIndexAddHopperFreq, }; void xtreme_app_scene_protocols_frequencies_var_item_list_callback(void* context, uint32_t index) { @@ -63,6 +65,8 @@ void xtreme_app_scene_protocols_frequencies_on_enter(void* context) { variable_item_list_add(var_item_list, "Delete Static Freq", 0, NULL, app); + variable_item_list_add(var_item_list, "Add Static Freq", 0, NULL, app); + item = variable_item_list_add(var_item_list, "Hopper Freq", FrequencyList_size(app->subghz_hopper_frequencies), xtreme_app_scene_protocols_frequencies_hopper_frequency_changed, app); app->subghz_hopper_index = 0; variable_item_set_current_value_index(item, app->subghz_hopper_index); @@ -77,6 +81,8 @@ void xtreme_app_scene_protocols_frequencies_on_enter(void* context) { variable_item_list_add(var_item_list, "Delete Hopper Freq", 0, NULL, app); + variable_item_list_add(var_item_list, "Add Hopper Freq", 0, NULL, app); + variable_item_list_set_enter_callback( var_item_list, xtreme_app_scene_protocols_frequencies_var_item_list_callback, app); @@ -99,6 +105,8 @@ void remove_frequency(XtremeApp* app, FrequencyList_t list, uint8_t index) { } } app->save_subghz_frequencies = true; + scene_manager_previous_scene(app->scene_manager); + scene_manager_next_scene(app->scene_manager, XtremeAppSceneProtocolsFrequencies); } bool xtreme_app_scene_protocols_frequencies_on_event(void* context, SceneManagerEvent event) { @@ -108,21 +116,23 @@ bool xtreme_app_scene_protocols_frequencies_on_event(void* context, SceneManager if(event.type == SceneManagerEventTypeCustom) { scene_manager_set_scene_state(app->scene_manager, XtremeAppSceneProtocolsFrequencies, event.event); consumed = true; - bool redraw = true; switch(event.event) { - case VarItemListIndexDeleteStatic: + case VarItemListIndexDeleteStaticFreq: remove_frequency(app, app->subghz_static_frequencies, app->subghz_static_index); break; - case VarItemListIndexDeleteHopper: + case VarItemListIndexAddStaticFreq: + scene_manager_set_scene_state(app->scene_manager, XtremeAppSceneProtocolsFrequenciesAdd, false); + scene_manager_next_scene(app->scene_manager, XtremeAppSceneProtocolsFrequenciesAdd); + break; + case VarItemListIndexDeleteHopperFreq: remove_frequency(app, app->subghz_hopper_frequencies, app->subghz_hopper_index); break; - default: - redraw = false; + case VarItemListIndexAddHopperFreq: + scene_manager_set_scene_state(app->scene_manager, XtremeAppSceneProtocolsFrequenciesAdd, true); + scene_manager_next_scene(app->scene_manager, XtremeAppSceneProtocolsFrequenciesAdd); + break; + default: break; - } - if(redraw) { - scene_manager_previous_scene(app->scene_manager); - scene_manager_next_scene(app->scene_manager, XtremeAppSceneProtocolsFrequencies); } } diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols_frequencies_add.c b/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols_frequencies_add.c new file mode 100644 index 000000000..990170049 --- /dev/null +++ b/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols_frequencies_add.c @@ -0,0 +1,67 @@ +#include "../xtreme_app.h" + +enum TextInputIndex { + TextInputIndexResult, +}; + +static void xtreme_app_scene_protocols_frequencies_add_text_input_callback(void* context) { + XtremeApp* app = context; + + do { + char *end; + uint32_t value = strtol(app->subghz_freq_buffer, &end, 0); + if(*end) break; + value *= 10000; + if(!furi_hal_subghz_is_frequency_valid(value)) break; + bool is_hopper = scene_manager_get_scene_state(app->scene_manager, XtremeAppSceneProtocolsFrequenciesAdd); + if(is_hopper) { + FrequencyList_push_back(app->subghz_hopper_frequencies, value); + } else { + FrequencyList_push_back(app->subghz_static_frequencies, value); + } + app->save_subghz_frequencies = true; + } while(false); + view_dispatcher_send_custom_event(app->view_dispatcher, TextInputIndexResult); +} + +void xtreme_app_scene_protocols_frequencies_add_on_enter(void* context) { + XtremeApp* app = context; + TextInput* text_input = app->text_input; + + text_input_set_header_text(text_input, "Format: 12356"); + + strlcpy(app->subghz_freq_buffer, "", XTREME_SUBGHZ_FREQ_BUFFER_SIZE); + + text_input_set_result_callback( + text_input, + xtreme_app_scene_protocols_frequencies_add_text_input_callback, + app, + app->subghz_freq_buffer, + XTREME_SUBGHZ_FREQ_BUFFER_SIZE, + true); + + view_dispatcher_switch_to_view(app->view_dispatcher, XtremeAppViewTextInput); +} + +bool xtreme_app_scene_protocols_frequencies_add_on_event(void* context, SceneManagerEvent event) { + XtremeApp* app = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + consumed = true; + switch(event.event) { + case TextInputIndexResult: + scene_manager_previous_scene(app->scene_manager); + break; + default: + break; + } + } + + return consumed; +} + +void xtreme_app_scene_protocols_frequencies_add_on_exit(void* context) { + XtremeApp* app = context; + text_input_reset(app->text_input); +} diff --git a/applications/main/xtreme_app/xtreme_app.h b/applications/main/xtreme_app/xtreme_app.h index f783db08d..d3af90b6e 100644 --- a/applications/main/xtreme_app/xtreme_app.h +++ b/applications/main/xtreme_app/xtreme_app.h @@ -21,6 +21,8 @@ #include "xtreme/settings.h" #include "xtreme/assets.h" +#define XTREME_SUBGHZ_FREQ_BUFFER_SIZE 6 + ARRAY_DEF(asset_packs, char*) typedef struct { @@ -35,6 +37,7 @@ typedef struct { uint8_t subghz_static_index; FrequencyList_t subghz_hopper_frequencies; uint8_t subghz_hopper_index; + char subghz_freq_buffer[XTREME_SUBGHZ_FREQ_BUFFER_SIZE]; bool subghz_extend; bool subghz_bypass; int dolphin_level;