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 1a7871afc..231386e2b 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_config.h +++ b/applications/main/xtreme_app/scenes/xtreme_app_scene_config.h @@ -2,6 +2,7 @@ ADD_SCENE(xtreme_app, start, Start) 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, 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.c b/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols.c index c4d0b1250..9959b712a 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols.c +++ b/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols.c @@ -3,6 +3,7 @@ enum VarItemListIndex { VarItemListIndexBadkbMode, VarItemListIndexBadbtRemember, + VarItemListIndexSubghzFrequencies, VarItemListIndexSubghzExtend, VarItemListIndexSubghzBypass, }; @@ -62,6 +63,8 @@ void xtreme_app_scene_protocols_on_enter(void* context) { variable_item_set_current_value_index(item, xtreme_settings->bad_bt_remember); variable_item_set_current_value_text(item, xtreme_settings->bad_bt_remember ? "ON" : "OFF"); + variable_item_list_add(var_item_list, "SubGHz Frequencies", 0, NULL, app); + item = variable_item_list_add( var_item_list, "SubGHz Extend", 2, xtreme_app_scene_protocols_subghz_extend_changed, app); variable_item_set_current_value_index(item, app->subghz_extend); @@ -89,6 +92,9 @@ bool xtreme_app_scene_protocols_on_event(void* context, SceneManagerEvent event) scene_manager_set_scene_state(app->scene_manager, XtremeAppSceneProtocols, event.event); consumed = true; switch(event.event) { + case VarItemListIndexSubghzFrequencies: + scene_manager_next_scene(app->scene_manager, XtremeAppSceneProtocolsFrequencies); + break; default: break; } 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 new file mode 100644 index 000000000..5adef2f06 --- /dev/null +++ b/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols_frequencies.c @@ -0,0 +1,86 @@ +#include "../xtreme_app.h" + +enum VarItemListIndex { + VarItemListIndexStaticFrequency, + VarItemListIndexHopperFrequency, +}; + +void xtreme_app_scene_protocols_frequencies_var_item_list_callback(void* context, uint32_t index) { + XtremeApp* app = context; + view_dispatcher_send_custom_event(app->view_dispatcher, index); +} + +static void xtreme_app_scene_protocols_frequencies_static_frequency_changed(VariableItem* item) { + XtremeApp* app = variable_item_get_context(item); + uint8_t index = variable_item_get_current_value_index(item); + uint32_t value = *FrequencyList_get(app->subghz_static_frequencies, index); + char text[10] = {0}; + snprintf(text, sizeof(text), "%lu.%02lu", value / 1000000, (value % 1000000) / 10000); + variable_item_set_current_value_text(item, text); +} + +static void xtreme_app_scene_protocols_frequencies_hopper_frequency_changed(VariableItem* item) { + XtremeApp* app = variable_item_get_context(item); + uint8_t index = variable_item_get_current_value_index(item); + uint32_t value = *FrequencyList_get(app->subghz_hopper_frequencies, index); + char text[10] = {0}; + snprintf(text, sizeof(text), "%lu.%02lu", value / 1000000, (value % 1000000) / 10000); + variable_item_set_current_value_text(item, text); +} + +void xtreme_app_scene_protocols_frequencies_on_enter(void* context) { + XtremeApp* app = context; + VariableItemList* var_item_list = app->var_item_list; + VariableItem* item; + + item = variable_item_list_add(var_item_list, "Static Freq", FrequencyList_size(app->subghz_static_frequencies), xtreme_app_scene_protocols_frequencies_static_frequency_changed, app); + variable_item_set_current_value_index(item, 0); + if(FrequencyList_size(app->subghz_static_frequencies)) { + uint32_t value = *FrequencyList_get(app->subghz_static_frequencies, 0); + char text[10] = {0}; + snprintf(text, sizeof(text), "%lu.%02lu", value / 1000000, (value % 1000000) / 10000); + variable_item_set_current_value_text(item, text); + } else { + variable_item_set_current_value_text(item, "None"); + } + + 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); + variable_item_set_current_value_index(item, 0); + if(FrequencyList_size(app->subghz_hopper_frequencies)) { + uint32_t value = *FrequencyList_get(app->subghz_hopper_frequencies, 0); + char text[10] = {0}; + snprintf(text, sizeof(text), "%lu.%02lu", value / 1000000, (value % 1000000) / 10000); + variable_item_set_current_value_text(item, text); + } else { + variable_item_set_current_value_text(item, "None"); + } + + variable_item_list_set_enter_callback( + var_item_list, xtreme_app_scene_protocols_frequencies_var_item_list_callback, app); + + variable_item_list_set_selected_item( + var_item_list, scene_manager_get_scene_state(app->scene_manager, XtremeAppSceneProtocolsFrequencies)); + + view_dispatcher_switch_to_view(app->view_dispatcher, XtremeAppViewVarItemList); +} + +bool xtreme_app_scene_protocols_frequencies_on_event(void* context, SceneManagerEvent event) { + XtremeApp* app = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + scene_manager_set_scene_state(app->scene_manager, XtremeAppSceneProtocolsFrequencies, event.event); + consumed = true; + switch(event.event) { + default: + break; + } + } + + return consumed; +} + +void xtreme_app_scene_protocols_frequencies_on_exit(void* context) { + XtremeApp* app = context; + variable_item_list_reset(app->var_item_list); +} diff --git a/applications/main/xtreme_app/xtreme_app.c b/applications/main/xtreme_app/xtreme_app.c index e3c31812f..b633fef28 100644 --- a/applications/main/xtreme_app/xtreme_app.c +++ b/applications/main/xtreme_app/xtreme_app.c @@ -22,6 +22,9 @@ static bool xtreme_app_back_event_callback(void* context) { furi_hal_subghz_set_extend_settings(app->subghz_extend, app->subghz_bypass); } + if(app->save_subghz_frequencies) { + } + if(app->save_level) { Dolphin* dolphin = furi_record_open(RECORD_DOLPHIN); int xp = app->dolphin_level > 1 ? dolphin_get_levels()[app->dolphin_level - 2] : 0; @@ -118,6 +121,37 @@ XtremeApp* xtreme_app_alloc() { XtremeSettings* xtreme_settings = XTREME_SETTINGS(); + Storage* storage = furi_record_open(RECORD_STORAGE); + FlipperFormat* file = flipper_format_file_alloc(storage); + FrequencyList_init(app->subghz_static_frequencies); + FrequencyList_init(app->subghz_hopper_frequencies); + app->subghz_use_defaults = true; + app->subghz_default_frequency = 0; + do { + uint32_t temp; + if(!flipper_format_file_open_existing(file, EXT_PATH("subghz/assets/setting_user"))) break; + + flipper_format_read_bool(file, "Add_standard_frequencies", &app->subghz_use_defaults, 1); + + if(!flipper_format_rewind(file)) break; + flipper_format_read_uint32(file, "Default_frequency", &app->subghz_default_frequency, 1); + + if(!flipper_format_rewind(file)) break; + while(flipper_format_read_uint32(file, "Frequency", &temp, 1)) { + if(furi_hal_subghz_is_frequency_valid(temp)) { + FrequencyList_push_back(app->subghz_static_frequencies, temp); + } + } + + if(!flipper_format_rewind(file)) break; + while(flipper_format_read_uint32(file, "Hopper_frequency", &temp, 1)) { + if(furi_hal_subghz_is_frequency_valid(temp)) { + FrequencyList_push_back(app->subghz_hopper_frequencies, temp); + } + } + } while(false); + flipper_format_free(file); + furi_hal_subghz_get_extend_settings(&app->subghz_extend, &app->subghz_bypass); Dolphin* dolphin = furi_record_open(RECORD_DOLPHIN); @@ -129,7 +163,6 @@ XtremeApp* xtreme_app_alloc() { app->asset_pack = 0; asset_packs_init(app->asset_packs); - Storage* storage = furi_record_open(RECORD_STORAGE); File* folder = storage_file_alloc(storage); FileInfo info; char* name = malloc(MAX_PACK_NAME_LEN); @@ -183,6 +216,9 @@ void xtreme_app_free(XtremeApp* app) { // Settings deinit + FrequencyList_clear(app->subghz_static_frequencies); + FrequencyList_clear(app->subghz_hopper_frequencies); + asset_packs_it_t it; for(asset_packs_it(it, app->asset_packs); !asset_packs_end_p(it); asset_packs_next(it)) { free(*asset_packs_cref(it)); diff --git a/applications/main/xtreme_app/xtreme_app.h b/applications/main/xtreme_app/xtreme_app.h index f4e1f6d3d..d6562790d 100644 --- a/applications/main/xtreme_app/xtreme_app.h +++ b/applications/main/xtreme_app/xtreme_app.h @@ -16,6 +16,7 @@ #include "dolphin/dolphin.h" #include "dolphin/dolphin_i.h" #include +#include #include #include "xtreme/settings.h" #include "xtreme/assets.h" @@ -29,6 +30,10 @@ typedef struct { VariableItemList* var_item_list; TextInput* text_input; Popup* popup; + bool subghz_use_defaults; + uint32_t subghz_default_frequency; + FrequencyList_t subghz_static_frequencies; + FrequencyList_t subghz_hopper_frequencies; bool subghz_extend; bool subghz_bypass; int dolphin_level; @@ -37,6 +42,7 @@ typedef struct { asset_packs_t asset_packs; FuriString* version_tag; bool save_subghz; + bool save_subghz_frequencies; bool save_level; bool save_name; bool save_settings;