#include "genie_config.h" #include #include #include "genie_app.h" #include "genie_submenu.h" #include #include #include "toolbox/path.h" #include "genie_record_v3_icons.h" #define TAG "GenieConfig" struct GenieConfig { VariableItemList* variable_item_list; GenieApp* app; VariableItem* file_item; FuriThread* thread; DialogsApp* dialogs; FuriString* tmp; }; #define GENIE_SAVE_FOLDER \ EXT_PATH("apps_data") \ "/" \ "genie" bool select_genie_file(GenieConfig* config) { GenieApp* app = config->app; const char* previous_path = genie_app_get_file_path(app); if(previous_path && previous_path[0] != '\0') { furi_string_set(config->tmp, previous_path); } else { furi_string_set(config->tmp, GENIE_SAVE_FOLDER); } DialogsFileBrowserOptions browser_options; dialog_file_browser_set_basic_options(&browser_options, ".gne", &I_genie_10x10); browser_options.base_path = GENIE_SAVE_FOLDER; browser_options.skip_assets = false; browser_options.item_loader_callback = NULL; browser_options.item_loader_context = NULL; bool file_selected = dialog_file_browser_show(config->dialogs, config->tmp, config->tmp, &browser_options); if(file_selected) { FURI_LOG_D("TAG", "Selected file: %s", furi_string_get_cstr(config->tmp)); genie_app_update_file_path(app, furi_string_get_cstr(config->tmp)); } else { FURI_LOG_D("TAG", "No file selected."); } return file_selected; } static uint32_t setting_frequency_values[] = {315000000, 390000000}; static char* setting_frequency_names[] = {"315 MHz", "390 MHz"}; static void genie_setting_frequency_change(VariableItem* item) { GenieApp* app = variable_item_get_context(item); uint8_t index = variable_item_get_current_value_index(item); variable_item_set_current_value_text(item, setting_frequency_names[index]); genie_app_set_frequency(app, setting_frequency_values[index]); } static void genie_config_update_file_item(GenieConfig* genie_config) { FuriString* current_name = furi_string_alloc(); const char* current_path = genie_app_get_file_path(genie_config->app); if(current_path && current_path[0] != '\0') { path_extract_filename_no_ext(current_path, current_name); } else { furi_string_set(current_name, "Select"); } variable_item_set_current_value_text( genie_config->file_item, furi_string_get_cstr(current_name)); furi_string_free(current_name); } static void genie_config_ok_button(void* context, uint32_t index) { FURI_LOG_D(TAG, "OK button clicked. index = %ld", index); if(index != 1) { return; } GenieConfig* genie_config = (GenieConfig*)context; furi_thread_flags_set(furi_thread_get_id(genie_config->thread), 1); } static int32_t genie_config_thread(void* context) { GenieConfig* genie_config = (GenieConfig*)context; furi_thread_flags_clear(3); uint32_t flags = 0; do { flags = furi_thread_flags_wait(3, FuriFlagWaitAny, FuriWaitForever); if((flags & 1) == 1) { if(select_genie_file(genie_config)) { genie_config_update_file_item(genie_config); } } } while((flags & 2) != 2); return 0; } GenieConfig* genie_config_alloc(GenieApp* app) { GenieConfig* genie_config = (GenieConfig*)malloc(sizeof(GenieConfig)); genie_config->app = app; genie_config->variable_item_list = variable_item_list_alloc(); genie_config->tmp = furi_string_alloc(); genie_config->dialogs = furi_record_open(RECORD_DIALOGS); genie_config->thread = furi_thread_alloc_ex("config", 1024, genie_config_thread, genie_config); furi_thread_start(genie_config->thread); VariableItemList* variable_item_list = genie_config->variable_item_list; variable_item_list_reset(variable_item_list); variable_item_list_set_enter_callback( variable_item_list, genie_config_ok_button, genie_config); view_set_previous_callback( variable_item_list_get_view(variable_item_list), genie_navigation_submenu_callback); VariableItem* item = variable_item_list_add( variable_item_list, "Frequency", COUNT_OF(setting_frequency_names), genie_setting_frequency_change, app); uint32_t current_freq = genie_app_get_frequency(app); uint8_t default_freq_index = 0; for(size_t i = 0; i < COUNT_OF(setting_frequency_values); i++) { if(setting_frequency_values[i] == current_freq) { default_freq_index = i; break; } } variable_item_set_current_value_index(item, default_freq_index); variable_item_set_current_value_text(item, setting_frequency_names[default_freq_index]); genie_app_set_frequency(app, setting_frequency_values[default_freq_index]); genie_config->file_item = variable_item_list_add(variable_item_list, "Genie File", 1, NULL, app); genie_config_update_file_item(genie_config); return genie_config; } void genie_config_free(GenieConfig* genie_config) { furi_assert(genie_config); furi_assert(genie_config->variable_item_list); furi_thread_flags_set(furi_thread_get_id(genie_config->thread), 2); furi_thread_join(genie_config->thread); furi_thread_free(genie_config->thread); variable_item_list_free(genie_config->variable_item_list); furi_string_free(genie_config->tmp); genie_config->tmp = NULL; genie_config->variable_item_list = NULL; genie_config->app = NULL; free(genie_config); furi_record_close(RECORD_DIALOGS); } View* genie_config_get_view(GenieConfig* genie_config) { furi_assert(genie_config); furi_assert(genie_config->variable_item_list); return variable_item_list_get_view(genie_config->variable_item_list); }