diff --git a/firmware/application/apps/ui_level.cpp b/firmware/application/apps/ui_level.cpp index 2f7da777..126ab048 100644 --- a/firmware/application/apps/ui_level.cpp +++ b/firmware/application/apps/ui_level.cpp @@ -29,10 +29,6 @@ using portapack::memory::map::backup_ram; namespace ui { -bool LevelView::check_sd_card() { - return (sd_card::status() == sd_card::Status::Mounted) ? true : false; -} - void LevelView::focus() { button_frequency.focus(); } @@ -74,12 +70,6 @@ LevelView::LevelView(NavigationView& nav) field_volume.on_change = [this](int32_t v) { this->on_headphone_volume_changed(v); }; field_volume.set_value((receiver_model.headphone_volume() - audio::headphone::volume_range().max).decibel() + 99); - // Level directory - if (check_sd_card()) { // Check to see if SD Card is mounted - make_new_directory(u"/LEVEL"); - sd_card_mounted = true; - } - change_mode(NFM_MODULATION); // Start on AM field_mode.set_by_value(NFM_MODULATION); // Reflect the mode into the manual selector @@ -89,14 +79,12 @@ LevelView::LevelView(NavigationView& nav) button_frequency.set_text("<" + to_string_short_freq(freq) + " MHz>"); // load auto common app settings - if (sd_card_mounted) { - auto rc = settings.load("level", &app_settings); - if (rc == SETTINGS_OK) { - field_lna.set_value(app_settings.lna); - field_vga.set_value(app_settings.vga); - field_rf_amp.set_value(app_settings.rx_amp); - receiver_model.set_rf_amp(app_settings.rx_amp); - } + auto rc = settings.load("level", &app_settings); + if (rc == SETTINGS_OK) { + field_lna.set_value(app_settings.lna); + field_vga.set_value(app_settings.vga); + field_rf_amp.set_value(app_settings.rx_amp); + receiver_model.set_rf_amp(app_settings.rx_amp); } button_frequency.on_select = [this, &nav](ButtonWithEncoder& button) { diff --git a/firmware/application/apps/ui_level.hpp b/firmware/application/apps/ui_level.hpp index 331efccc..f801bb0f 100644 --- a/firmware/application/apps/ui_level.hpp +++ b/firmware/application/apps/ui_level.hpp @@ -97,11 +97,9 @@ class LevelView : public View { size_t change_mode(freqman_index_t mod_type); void on_statistics_update(const ChannelStatistics& statistics); void set_display_freq(int64_t freq); - bool check_sd_card(); int32_t db{0}; long long int MAX_UFREQ = {7200000000}; // maximum usable freq - bool sd_card_mounted = false; rf::Frequency freq = {0}; Labels labels{ diff --git a/firmware/application/apps/ui_recon.cpp b/firmware/application/apps/ui_recon.cpp index f2c9db27..825a75e3 100644 --- a/firmware/application/apps/ui_recon.cpp +++ b/firmware/application/apps/ui_recon.cpp @@ -52,7 +52,7 @@ void ReconView::colorize_waits() { } } -bool ReconView::ReconSaveFreq(const std::string& freq_file_path, size_t freq_index, bool warn_if_exists) { +bool ReconView::recon_save_freq(const std::string& freq_file_path, size_t freq_index, bool warn_if_exists) { File recon_file; if (frequency_list.size() == 0 || (frequency_list.size() && current_index > (int32_t)frequency_list.size())) @@ -104,7 +104,7 @@ bool ReconView::ReconSaveFreq(const std::string& freq_file_path, size_t freq_ind return true; } -bool ReconView::ReconSetupLoadStrings(const std::string& source, std::string& input_file, std::string& output_file, uint32_t& recon_lock_duration, uint32_t& recon_lock_nb_match, int32_t& recon_squelch_level, uint32_t& recon_match_mode, int32_t& wait, int32_t& volume) { +bool ReconView::recon_load_config_from_sd() { File settings_file; size_t length, file_position = 0; char* pos; @@ -116,39 +116,37 @@ bool ReconView::ReconSetupLoadStrings(const std::string& source, std::string& in uint32_t nb_params = RECON_SETTINGS_NB_PARAMS; std::string params[RECON_SETTINGS_NB_PARAMS]; - bool check_sd_card = (sd_card::status() == sd_card::Status::Mounted) ? true : false; + make_new_directory(u"SETTINGS"); - if (check_sd_card) { - auto result = settings_file.open(source); - if (!result.is_valid()) { - while (it < nb_params) { - // Read a 256 bytes block from file - settings_file.seek(file_position); - memset(file_data, 0, 257); - auto read_size = settings_file.read(file_data, 256); - if (read_size.is_error()) - break; - file_position += 256; - // Reset line_start to beginning of buffer - line_start = file_data; + auto result = settings_file.open(RECON_CFG_FILE); + if (!result.is_valid()) { + while (it < nb_params) { + // Read a 256 bytes block from file + settings_file.seek(file_position); + memset(file_data, 0, 257); + auto read_size = settings_file.read(file_data, 256); + if (read_size.is_error()) + break; + file_position += 256; + // Reset line_start to beginning of buffer + line_start = file_data; + pos = line_start; + while ((line_end = strstr(line_start, "\x0A"))) { + length = line_end - line_start - 1; + params[it] = string(pos, length); + it++; + line_start = line_end + 1; pos = line_start; - while ((line_end = strstr(line_start, "\x0A"))) { - length = line_end - line_start - 1; - params[it] = string(pos, length); - it++; - line_start = line_end + 1; - pos = line_start; - if (line_start - file_data >= 256) - break; - if (it >= nb_params) - break; - } - if (read_size.value() != 256) - break; // End of file - - // Restart at beginning of last incomplete line - file_position -= (file_data + 256 - line_start); + if (line_start - file_data >= 256) + break; + if (it >= nb_params) + break; } + if (read_size.value() != 256) + break; // End of file + + // Restart at beginning of last incomplete line + file_position -= (file_data + 256 - line_start); } } @@ -158,7 +156,7 @@ bool ReconView::ReconSetupLoadStrings(const std::string& source, std::string& in output_file = "RECON_RESULTS"; recon_lock_duration = RECON_MIN_LOCK_DURATION; recon_lock_nb_match = RECON_DEF_NB_MATCH; - recon_squelch_level = -14; + squelch = -14; recon_match_mode = RECON_MATCH_CONTINUOUS; wait = RECON_DEF_WAIT_DURATION; volume = 40; @@ -186,9 +184,9 @@ bool ReconView::ReconSetupLoadStrings(const std::string& source, std::string& in recon_lock_nb_match = RECON_DEF_NB_MATCH; if (it > 4) - recon_squelch_level = strtoll(params[4].c_str(), nullptr, 10); + squelch = strtoll(params[4].c_str(), nullptr, 10); else - recon_squelch_level = -14; + squelch = -14; if (it > 5) recon_match_mode = strtoll(params[5].c_str(), nullptr, 10); @@ -208,17 +206,19 @@ bool ReconView::ReconSetupLoadStrings(const std::string& source, std::string& in return true; } -bool ReconView::ReconSetupSaveStrings(const std::string& dest, const std::string& input_file, const std::string& output_file, uint32_t recon_lock_duration, uint32_t recon_lock_nb_match, int32_t recon_squelch_level, uint32_t recon_match_mode, int32_t wait, int32_t volume) { +bool ReconView::recon_save_config_to_sd() { File settings_file; - auto result = settings_file.create(dest); + make_new_directory(u"SETTINGS"); + + auto result = settings_file.create(RECON_CFG_FILE); if (result.is_valid()) return false; settings_file.write_line(input_file); settings_file.write_line(output_file); settings_file.write_line(to_string_dec_uint(recon_lock_duration)); settings_file.write_line(to_string_dec_uint(recon_lock_nb_match)); - settings_file.write_line(to_string_dec_int(recon_squelch_level)); + settings_file.write_line(to_string_dec_int(squelch)); settings_file.write_line(to_string_dec_uint(recon_match_mode)); settings_file.write_line(to_string_dec_int(wait)); settings_file.write_line(to_string_dec_int(volume)); @@ -230,10 +230,6 @@ void ReconView::audio_output_start() { this->on_headphone_volume_changed((receiver_model.headphone_volume() - audio::headphone::volume_range().max).decibel() + 99); } -bool ReconView::check_sd_card() { - return (sd_card::status() == sd_card::Status::Mounted) ? true : false; -} - void ReconView::recon_redraw() { if (last_rssi_min != rssi.get_min() || last_rssi_med != rssi.get_avg() || last_rssi_max != rssi.get_max()) { last_rssi_min = rssi.get_min(); @@ -268,7 +264,7 @@ void ReconView::recon_redraw() { // FREQ IS STRONG: GREEN and recon will pause when on_statistics_update() if ((!scanner_mode) && autosave && frequency_list.size() > 0) { - ReconSaveFreq(freq_file_path, current_index, false); + recon_save_freq(freq_file_path, current_index, false); } } } @@ -347,9 +343,9 @@ void ReconView::focus() { } ReconView::~ReconView() { - ReconSetupSaveStrings("RECON/RECON.CFG", input_file, output_file, recon_lock_duration, recon_lock_nb_match, squelch, recon_match_mode, wait, field_volume.value()); - - // save app settings + // save app config + recon_save_config_to_sd(); + // save app common settings settings.save("recon", &app_settings); audio::output::stop(); @@ -393,11 +389,6 @@ ReconView::ReconView(NavigationView& nav) &button_mic_app, &button_remove}); - // Recon directory - if (check_sd_card()) { // Check to see if SD Card is mounted - make_new_directory(u"/RECON"); - sd_card_mounted = true; - } def_step = 0; // HELPER: Pre-setting a manual range, based on stored frequency rf::Frequency stored_freq = persistent_memory::tuned_frequency(); @@ -421,7 +412,6 @@ ReconView::ReconView(NavigationView& nav) load_ranges = persistent_memory::recon_load_ranges(); load_hamradios = persistent_memory::recon_load_hamradios(); update_ranges = persistent_memory::recon_update_ranges_when_recon(); - field_volume.set_value(volume); if (sd_card_mounted) { // load auto common app settings @@ -747,7 +737,7 @@ ReconView::ReconView(NavigationView& nav) button_add.on_select = [this](ButtonWithEncoder&) { // frequency_list[current_index] if (!scanner_mode) { - ReconSaveFreq(freq_file_path, current_index, true); + recon_save_freq(freq_file_path, current_index, true); } }; @@ -789,7 +779,7 @@ ReconView::ReconView(NavigationView& nav) recon_lock_nb_match = strtol(result[3].c_str(), nullptr, 10); recon_match_mode = strtol(result[4].c_str(), nullptr, 10); - ReconSetupSaveStrings("RECON/RECON.CFG", input_file, output_file, recon_lock_duration, recon_lock_nb_match, squelch, recon_match_mode, wait, field_volume.value()); + recon_save_config_to_sd(); autosave = persistent_memory::recon_autosave_freqs(); autostart = persistent_memory::recon_autostart_recon(); @@ -841,7 +831,7 @@ ReconView::ReconView(NavigationView& nav) file_name.set("=>"); // Loading input and output file from settings - ReconSetupLoadStrings("RECON/RECON.CFG", input_file, output_file, recon_lock_duration, recon_lock_nb_match, squelch, recon_match_mode, wait, volume); + recon_load_config_from_sd(); freq_file_path = "/FREQMAN/" + output_file + ".TXT"; field_squelch.set_value(squelch); diff --git a/firmware/application/apps/ui_recon.hpp b/firmware/application/apps/ui_recon.hpp index 6048b20a..fabbf987 100644 --- a/firmware/application/apps/ui_recon.hpp +++ b/firmware/application/apps/ui_recon.hpp @@ -42,6 +42,8 @@ namespace ui { +#define RECON_CFG_FILE "SETTINGS/recon.cfg" + class ReconView : public View { public: ReconView(NavigationView& nav); @@ -113,10 +115,9 @@ class ReconView : public View { void recon_redraw(); void handle_retune(); void handle_coded_squelch(const uint32_t value); - bool ReconSetupLoadStrings(const std::string& source, std::string& input_file, std::string& output_file, uint32_t& recon_lock_duration, uint32_t& recon_lock_nb_match, int32_t& recon_squelch_level, uint32_t& recon_match_mode, int32_t& wait, int32_t& volume); - bool ReconSetupSaveStrings(const std::string& dest, const std::string& input_file, const std::string& output_file, uint32_t recon_lock_duration, uint32_t recon_lock_nb_match, int32_t recon_squelch_level, uint32_t recon_match_mode, int32_t wait, int32_t volume); - bool ReconSaveFreq(const std::string& freq_file_path, size_t index, bool warn_if_exists); - + bool recon_load_config_from_sd(); + bool recon_save_config_to_sd(); + bool recon_save_freq(const std::string& freq_file_path, size_t index, bool warn_if_exists); jammer::jammer_range_t frequency_range{false, 0, MAX_UFREQ}; // perfect for manual recon task too... int32_t squelch{0}; int32_t db{0}; diff --git a/firmware/application/apps/ui_recon_settings.cpp b/firmware/application/apps/ui_recon_settings.cpp index fb57458c..3e525102 100644 --- a/firmware/application/apps/ui_recon_settings.cpp +++ b/firmware/application/apps/ui_recon_settings.cpp @@ -92,7 +92,7 @@ ReconSetupViewMain::ReconSetupViewMain(NavigationView& nav, Rect parent_rect, st }; }; -void ReconSetupViewMain::Save(std::string& input_file, std::string& output_file) { +void ReconSetupViewMain::save(std::string& input_file, std::string& output_file) { persistent_memory::set_recon_autosave_freqs(checkbox_autosave_freqs.value()); persistent_memory::set_recon_autostart_recon(checkbox_autostart_recon.value()); persistent_memory::set_recon_continuous(checkbox_continuous.value()); @@ -100,7 +100,7 @@ void ReconSetupViewMain::Save(std::string& input_file, std::string& output_file) input_file = _input_file; output_file = _output_file; }; -void ReconSetupViewMore::Save(uint32_t& recon_lock_duration, uint32_t& recon_lock_nb_match, uint32_t& recon_match_mode) { +void ReconSetupViewMore::save(uint32_t& recon_lock_duration, uint32_t& recon_lock_nb_match, uint32_t& recon_match_mode) { persistent_memory::set_recon_load_freqs(checkbox_load_freqs.value()); persistent_memory::set_recon_load_ranges(checkbox_load_ranges.value()); persistent_memory::set_recon_load_hamradios(checkbox_load_hamradios.value()); @@ -162,8 +162,8 @@ ReconSetupView::ReconSetupView( &button_save}); button_save.on_select = [this, &nav](Button&) { - viewMain.Save(input_file, output_file); - viewMore.Save(recon_lock_duration, recon_lock_nb_match, recon_match_mode); + viewMain.save(input_file, output_file); + viewMore.save(recon_lock_duration, recon_lock_nb_match, recon_match_mode); std::vector messages; messages.push_back(input_file); messages.push_back(output_file); diff --git a/firmware/application/apps/ui_recon_settings.hpp b/firmware/application/apps/ui_recon_settings.hpp index ddcb4327..03269e56 100644 --- a/firmware/application/apps/ui_recon_settings.hpp +++ b/firmware/application/apps/ui_recon_settings.hpp @@ -66,7 +66,7 @@ namespace ui { class ReconSetupViewMain : public View { public: ReconSetupViewMain(NavigationView& nav, Rect parent_rect, std::string input_file, std::string output_file); - void Save(std::string& input_file, std::string& output_file); + void save(std::string& input_file, std::string& output_file); void focus() override; private: @@ -111,7 +111,7 @@ class ReconSetupViewMore : public View { public: ReconSetupViewMore(NavigationView& nav, Rect parent_rect, uint32_t _recon_lock_duration, uint32_t _recon_lock_nb_match, uint32_t _recon_match_mode); - void Save(uint32_t& recon_lock_duration, uint32_t& recon_lock_nb_match, uint32_t& recon_match_mode); + void save(uint32_t& recon_lock_duration, uint32_t& recon_lock_nb_match, uint32_t& recon_match_mode); void focus() override;