Genie Recorder v3
This commit is contained in:
166
subghz/apps/genie-recorder/genie_config.c
Normal file
166
subghz/apps/genie-recorder/genie_config.c
Normal file
@@ -0,0 +1,166 @@
|
||||
#include "genie_config.h"
|
||||
|
||||
#include <furi.h>
|
||||
#include <furi_hal.h>
|
||||
#include "genie_app.h"
|
||||
#include "genie_submenu.h"
|
||||
|
||||
#include <dialogs/dialogs.h>
|
||||
#include <storage/storage.h>
|
||||
#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);
|
||||
}
|
||||
Reference in New Issue
Block a user