diff --git a/firmware/application/apps/ui_debug.cpp b/firmware/application/apps/ui_debug.cpp index daa986f43..a3b3ec493 100644 --- a/firmware/application/apps/ui_debug.cpp +++ b/firmware/application/apps/ui_debug.cpp @@ -419,7 +419,6 @@ void DebugMenuView::on_populate() { } add_items({ {"Buttons Test", ui::Theme::getInstance()->fg_darkcyan->foreground, &bitmap_icon_controls, [this]() { nav_.push(); }}, - {"Debug Dump", ui::Theme::getInstance()->fg_darkcyan->foreground, &bitmap_icon_memory, [this]() { portapack::persistent_memory::debug_dump(); }}, {"M0 Stack Dump", ui::Theme::getInstance()->fg_darkcyan->foreground, &bitmap_icon_memory, [this]() { stack_dump(); }}, {"Memory Dump", ui::Theme::getInstance()->fg_darkcyan->foreground, &bitmap_icon_memory, [this]() { nav_.push(); }}, {"Peripherals", ui::Theme::getInstance()->fg_darkcyan->foreground, &bitmap_icon_peripherals, [this]() { nav_.push(); }}, diff --git a/firmware/application/external/debug_pmem/main.cpp b/firmware/application/external/debug_pmem/main.cpp new file mode 100644 index 000000000..69bc458ee --- /dev/null +++ b/firmware/application/external/debug_pmem/main.cpp @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2023 Bernd Herzog + * + * This file is part of PortaPack. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include "ui.hpp" +#include "ui_debug_pmem.hpp" +#include "ui_navigation.hpp" +#include "external_app.hpp" + +namespace ui::external_app::debug_pmem { +void initialize_app(ui::NavigationView& nav) { + nav.push(); +} +} // namespace ui::external_app::debug_pmem + +extern "C" { + +__attribute__((section(".external_app.app_debug_pmem.application_information"), used)) application_information_t _application_information_debug_pmem = { + /*.memory_location = */ (uint8_t*)0x00000000, + /*.externalAppEntry = */ ui::external_app::debug_pmem::initialize_app, + /*.header_version = */ CURRENT_HEADER_VERSION, + /*.app_version = */ VERSION_MD5, + + /*.app_name = */ "DebugPMem", + /*.bitmap_data = */ { + 0x54, + 0x15, + 0x54, + 0x15, + 0xFF, + 0x7F, + 0xFC, + 0x1F, + 0xFF, + 0x7F, + 0xCC, + 0x19, + 0xAF, + 0x7A, + 0x6C, + 0x1B, + 0xEF, + 0x7B, + 0xEC, + 0x1B, + 0xFF, + 0x7F, + 0xFC, + 0x1F, + 0xFF, + 0x7F, + 0x54, + 0x15, + 0x54, + 0x15, + 0x00, + 0x00, + }, + /*.icon_color = */ ui::Color::cyan().v, + /*.menu_location = */ app_location_t::DEBUG, + /*.desired_menu_position = */ -1, + + /*.m4_app_tag = portapack::spi_flash::image_tag_none */ {0, 0, 0, 0}, + /*.m4_app_offset = */ 0x00000000, // will be filled at compile time +}; +} diff --git a/firmware/application/external/debug_pmem/ui_debug_pmem.cpp b/firmware/application/external/debug_pmem/ui_debug_pmem.cpp new file mode 100644 index 000000000..68c84d65f --- /dev/null +++ b/firmware/application/external/debug_pmem/ui_debug_pmem.cpp @@ -0,0 +1,209 @@ +/* + * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. + * Copyright (C) 2018 Furrtek + * + * This file is part of PortaPack. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include "ui_debug_pmem.hpp" + +namespace ui::external_app::debug_pmem { + +// Dump pmem, receiver and transmitter models internals in human readable format +bool DebugDumpView::debug_dump_func() { + std::string debug_dir = "DEBUG"; + std::filesystem::path filename{}; + File pmem_dump_file{}; + // create new dump file name and DEBUG directory + ensure_directory(debug_dir); + filename = next_filename_matching_pattern(debug_dir + "/DEBUG_DUMP_????.TXT"); + if (filename.empty()) { + dump_output.set("COULD NOT GET DUMP NAME !"); + dump_output.set_style(ui::Theme::getInstance()->fg_red); + return false; + } + // dump data fo filename + auto error = pmem_dump_file.create(filename); + if (error) { + dump_output.set("ERROR DUMPING " + filename.filename().string() + " !"); + dump_output.set_style(ui::Theme::getInstance()->fg_red); + return false; + } + pmem_dump_file.write_line("FW version: " VERSION_STRING); + pmem_dump_file.write_line("Ext APPS version req'd: 0x" + to_string_hex(VERSION_MD5)); + pmem_dump_file.write_line("GCC version: " + to_string_dec_int(__GNUC__) + "." + to_string_dec_int(__GNUC_MINOR__) + "." + to_string_dec_int(__GNUC_PATCHLEVEL__)); + + // firmware checksum + pmem_dump_file.write_line("Firmware calculated checksum: 0x" + to_string_hex(simple_checksum(FLASH_STARTING_ADDRESS, FLASH_ROM_SIZE), 8)); + + // write persistent memory + pmem_dump_file.write_line("\n[Persistent Memory]"); + + // full variables + pmem_dump_file.write_line("structure_version: 0x" + to_string_hex(get_data_structure_version(), 8)); + pmem_dump_file.write_line("target_frequency: " + to_string_dec_int(target_frequency())); + pmem_dump_file.write_line("correction_ppb: " + to_string_dec_int(correction_ppb())); + pmem_dump_file.write_line("modem_def_index: " + to_string_dec_uint(get_modem_def_index())); + pmem_dump_file.write_line("serial_format.data_bit: " + to_string_dec_uint(serial_format().data_bits)); + pmem_dump_file.write_line("serial_format.parity: " + to_string_dec_uint(serial_format().parity)); + pmem_dump_file.write_line("serial_format.stop_bits: " + to_string_dec_uint(serial_format().stop_bits)); + pmem_dump_file.write_line("serial_format.bit_order: " + to_string_dec_uint(serial_format().bit_order)); + pmem_dump_file.write_line("modem_bw: " + to_string_dec_int(modem_bw())); + pmem_dump_file.write_line("afsk_mark_freq: " + to_string_dec_int(afsk_mark_freq())); + pmem_dump_file.write_line("afsk_space_freq: " + to_string_dec_int(afsk_space_freq())); + pmem_dump_file.write_line("modem_baudrate: " + to_string_dec_int(modem_baudrate())); + pmem_dump_file.write_line("modem_repeat: " + to_string_dec_int(modem_repeat())); + pmem_dump_file.write_line("pocsag_last_address: " + to_string_dec_uint(pocsag_last_address())); + pmem_dump_file.write_line("pocsag_ignore_address: " + to_string_dec_uint(pocsag_ignore_address())); + pmem_dump_file.write_line("tone_mix: " + to_string_dec_uint(tone_mix())); + pmem_dump_file.write_line("hardware_config: " + to_string_dec_uint(config_cpld())); + pmem_dump_file.write_line("recon_config: 0x" + to_string_hex(get_recon_config(), 16)); + pmem_dump_file.write_line("recon_repeat_nb: " + to_string_dec_int(recon_repeat_nb())); + pmem_dump_file.write_line("recon_repeat_gain: " + to_string_dec_int(recon_repeat_gain())); + pmem_dump_file.write_line("recon_repeat_delay: " + to_string_dec_int(recon_repeat_delay())); + pmem_dump_file.write_line("converter: " + to_string_dec_int(config_converter())); + pmem_dump_file.write_line("updown_converter: " + to_string_dec_int(config_updown_converter())); + pmem_dump_file.write_line("updown_frequency_rx_correction: " + to_string_dec_int(config_freq_rx_correction_updown())); + pmem_dump_file.write_line("updown_frequency_tx_correction: " + to_string_dec_int(config_freq_tx_correction_updown())); + pmem_dump_file.write_line("lcd_inverted_mode: " + to_string_dec_uint(config_lcd_inverted_mode())); + pmem_dump_file.write_line("converter_frequency_offset: " + to_string_dec_int(config_converter_freq())); + pmem_dump_file.write_line("frequency_rx_correction: " + to_string_dec_uint(config_freq_rx_correction())); + pmem_dump_file.write_line("frequency_tx_correction: " + to_string_dec_uint(config_freq_tx_correction())); + pmem_dump_file.write_line("encoder_dial_sensitivity: " + to_string_dec_uint(encoder_dial_sensitivity())); + pmem_dump_file.write_line("encoder_rate_multiplier: " + to_string_dec_uint(encoder_rate_multiplier())); + pmem_dump_file.write_line("encoder_dial_direction: " + to_string_dec_uint(encoder_dial_direction())); // 0 = normal, 1 = reverse + pmem_dump_file.write_line("config_mode_storage: 0x" + to_string_hex(config_mode_storage_direct(), 8)); + pmem_dump_file.write_line("dst_config: 0x" + to_string_hex((uint32_t)config_dst().v, 8)); + pmem_dump_file.write_line("fake_brightness_level: " + to_string_dec_uint(fake_brightness_level())); + pmem_dump_file.write_line("menu_color: 0x" + to_string_hex(menu_color().v, 4)); + pmem_dump_file.write_line("touchscreen_threshold: " + to_string_dec_uint(touchscreen_threshold())); + + // ui_config bits + const auto backlight_timer = portapack::persistent_memory::config_backlight_timer(); + pmem_dump_file.write_line("ui_config clkout_freq: " + to_string_dec_uint(clkout_freq())); + pmem_dump_file.write_line("ui_config backlight_timer.timeout_enabled: " + to_string_dec_uint(backlight_timer.timeout_enabled())); + pmem_dump_file.write_line("ui_config backlight_timer.timeout_seconds: " + to_string_dec_uint(backlight_timer.timeout_seconds())); + pmem_dump_file.write_line("ui_config show_gui_return_icon: " + to_string_dec_uint(show_gui_return_icon())); + pmem_dump_file.write_line("ui_config load_app_settings: " + to_string_dec_uint(load_app_settings())); + pmem_dump_file.write_line("ui_config save_app_settings: " + to_string_dec_uint(save_app_settings())); + pmem_dump_file.write_line("ui_config disable_touchscreen: " + to_string_dec_uint(disable_touchscreen())); + pmem_dump_file.write_line("ui_config hide_clock: " + to_string_dec_uint(hide_clock())); + pmem_dump_file.write_line("ui_config clock_with_date: " + to_string_dec_uint(clock_with_date())); + pmem_dump_file.write_line("ui_config clkout_enabled: " + to_string_dec_uint(clkout_enabled())); + pmem_dump_file.write_line("ui_config apply_fake_brightness: " + to_string_dec_uint(apply_fake_brightness())); + pmem_dump_file.write_line("ui_config stealth_mode: " + to_string_dec_uint(stealth_mode())); + pmem_dump_file.write_line("ui_config config_login: " + to_string_dec_uint(config_login())); + pmem_dump_file.write_line("ui_config config_splash: " + to_string_dec_uint(config_splash())); + + // ui_config2 bits + pmem_dump_file.write_line("ui_config2 hide_speaker: " + to_string_dec_uint(ui_hide_speaker())); + pmem_dump_file.write_line("ui_config2 hide_converter: " + to_string_dec_uint(ui_hide_converter())); + pmem_dump_file.write_line("ui_config2 hide_stealth: " + to_string_dec_uint(ui_hide_stealth())); + pmem_dump_file.write_line("ui_config2 hide_camera: " + to_string_dec_uint(ui_hide_camera())); + pmem_dump_file.write_line("ui_config2 hide_sleep: " + to_string_dec_uint(ui_hide_sleep())); + pmem_dump_file.write_line("ui_config2 hide_bias_tee: " + to_string_dec_uint(ui_hide_bias_tee())); + pmem_dump_file.write_line("ui_config2 hide_clock: " + to_string_dec_uint(ui_hide_clock())); + pmem_dump_file.write_line("ui_config2 hide_sd_card: " + to_string_dec_uint(ui_hide_sd_card())); + pmem_dump_file.write_line("ui_config2 hide_mute: " + to_string_dec_uint(ui_hide_mute())); + pmem_dump_file.write_line("ui_config2 hide_fake_brightness: " + to_string_dec_uint(ui_hide_fake_brightness())); + pmem_dump_file.write_line("ui_config2 hide_battery_icon: " + to_string_dec_uint(ui_hide_battery_icon())); + pmem_dump_file.write_line("ui_config2 hide_numeric_battery: " + to_string_dec_uint(ui_hide_numeric_battery())); + pmem_dump_file.write_line("ui_config2 theme_id: " + to_string_dec_uint(ui_theme_id())); + pmem_dump_file.write_line("ui_config2 override_batt_calc: " + to_string_dec_uint(ui_override_batt_calc())); + pmem_dump_file.write_line("ui_config2 button_repeat_delay: " + to_string_dec_uint(ui_button_repeat_delay())); + pmem_dump_file.write_line("ui_config2 button_repeat_speed: " + to_string_dec_uint(ui_button_repeat_speed())); + pmem_dump_file.write_line("ui_config2 button_long_press_delay: " + to_string_dec_uint(ui_button_long_press_delay())); + + // misc_config bits + pmem_dump_file.write_line("misc_config config_audio_mute: " + to_string_dec_int(config_audio_mute())); + pmem_dump_file.write_line("misc_config config_speaker_disable: " + to_string_dec_int(config_speaker_disable())); + pmem_dump_file.write_line("misc_config config_disable_external_tcxo: " + to_string_dec_uint(config_disable_external_tcxo())); + pmem_dump_file.write_line("misc_config config_sdcard_high_speed_io: " + to_string_dec_uint(config_sdcard_high_speed_io())); + pmem_dump_file.write_line("misc_config config_disable_config_mode: " + to_string_dec_uint(config_disable_config_mode())); + pmem_dump_file.write_line("misc_config beep_on_packets: " + to_string_dec_int(beep_on_packets())); + + // receiver_model + pmem_dump_file.write_line("\n[Receiver Model]"); + pmem_dump_file.write_line("target_frequency: " + to_string_dec_uint(receiver_model.target_frequency())); + pmem_dump_file.write_line("frequency_step: " + to_string_dec_uint(receiver_model.frequency_step())); + pmem_dump_file.write_line("lna: " + to_string_dec_int(receiver_model.lna())); + pmem_dump_file.write_line("vga: " + to_string_dec_int(receiver_model.vga())); + pmem_dump_file.write_line("rf_amp: " + to_string_dec_int(receiver_model.rf_amp())); + pmem_dump_file.write_line("baseband_bandwidth: " + to_string_dec_uint(receiver_model.baseband_bandwidth())); + pmem_dump_file.write_line("sampling_rate: " + to_string_dec_uint(receiver_model.sampling_rate())); + switch (receiver_model.modulation()) { + case ReceiverModel::Mode::AMAudio: + pmem_dump_file.write_line("modulation: Mode::AMAudio"); + break; + case ReceiverModel::Mode::NarrowbandFMAudio: + pmem_dump_file.write_line("modulation: Mode::NarrowbandFMAudio"); + break; + case ReceiverModel::Mode::WidebandFMAudio: + pmem_dump_file.write_line("modulation: Mode::WidebandFMAudio"); + break; + case ReceiverModel::Mode::SpectrumAnalysis: + pmem_dump_file.write_line("modulation: Mode::SpectrumAnalysis"); + break; + case ReceiverModel::Mode::Capture: + pmem_dump_file.write_line("modulation: Mode::Capture"); + break; + case ReceiverModel::Mode::AMAudioFMApt: + pmem_dump_file.write_line("modulation: Mode::AMAudioFMApt"); + break; + default: + pmem_dump_file.write_line("modulation: !!unknown mode!!"); + break; + } + pmem_dump_file.write_line("headphone_volume.centibel: " + to_string_dec_int(receiver_model.headphone_volume().centibel())); + pmem_dump_file.write_line("normalized_headphone_volume: " + to_string_dec_uint(receiver_model.normalized_headphone_volume())); + pmem_dump_file.write_line("am_configuration: " + to_string_dec_uint(receiver_model.am_configuration())); + pmem_dump_file.write_line("nbfm_configuration: " + to_string_dec_uint(receiver_model.nbfm_configuration())); + pmem_dump_file.write_line("wfm_configuration: " + to_string_dec_uint(receiver_model.wfm_configuration())); + + // transmitter_model + pmem_dump_file.write_line("\n[Transmitter Model]"); + pmem_dump_file.write_line("target_frequency: " + to_string_dec_uint(transmitter_model.target_frequency())); + pmem_dump_file.write_line("rf_amp: " + to_string_dec_int(transmitter_model.rf_amp())); + pmem_dump_file.write_line("baseband_bandwidth: " + to_string_dec_uint(transmitter_model.baseband_bandwidth())); + pmem_dump_file.write_line("sampling_rate: " + to_string_dec_uint(transmitter_model.sampling_rate())); + pmem_dump_file.write_line("tx_gain: " + to_string_dec_int(transmitter_model.tx_gain())); + pmem_dump_file.write_line("channel_bandwidth: " + to_string_dec_uint(transmitter_model.channel_bandwidth())); + // on screen information + dump_output.set(filename.filename().string() + " DUMPED !"); + dump_output.set_style(ui::Theme::getInstance()->fg_green); + + return true; +} + +DebugDumpView::DebugDumpView(NavigationView& nav) + : nav_{nav} { + add_children({&dump_output, + &button_exit}); + + debug_dump_func(); + + button_exit.on_select = [this](Button&) { + nav_.pop(); + }; +} + +void DebugDumpView::focus() { + button_exit.focus(); +} + +} // namespace ui::external_app::debug_pmem diff --git a/firmware/application/external/debug_pmem/ui_debug_pmem.hpp b/firmware/application/external/debug_pmem/ui_debug_pmem.hpp new file mode 100644 index 000000000..0d42c99c8 --- /dev/null +++ b/firmware/application/external/debug_pmem/ui_debug_pmem.hpp @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. + * Copyright (C) 2018 Furrtek + * + * This file is part of PortaPack. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __UI_DEBUG_PMEM_APP_H__ +#define __UI_DEBUG_PMEM_APP_H__ + +#include "portapack_persistent_memory.hpp" +#include "ui_flash_utility.hpp" + +using namespace portapack; +using namespace portapack::persistent_memory; + +namespace ui::external_app::debug_pmem { + +class DebugDumpView : public View { + public: + DebugDumpView(NavigationView& nav); + + void focus() override; + + std::string title() const override { return "DebugPMem"; }; + bool debug_dump_func(); + + private: + NavigationView& nav_; + + Text dump_output{ + {0 * 8, 19 * 8, 30 * 8, 16}, + ""}; + + Button button_exit{ + {22 * 8, 34 * 8, 8 * 8, 32}, + "Exit"}; +}; + +} // namespace ui::external_app::debug_pmem + +#endif /*__UI_DEBUG_PMEM_APP_H__*/ diff --git a/firmware/application/external/external.cmake b/firmware/application/external/external.cmake index a140e9124..0fe502d18 100644 --- a/firmware/application/external/external.cmake +++ b/firmware/application/external/external.cmake @@ -192,6 +192,10 @@ set(EXTCPPSRC external/doom/main.cpp external/doom/ui_doom.cpp + #debug_pmem + external/debug_pmem/main.cpp + external/debug_pmem/ui_debug_pmem.cpp + #screening # external/screening/main.cpp # external/screening/ui_screening.cpp @@ -244,5 +248,6 @@ set(EXTAPPLIST stopwatch breakout doom + debug_pmem # screening ) diff --git a/firmware/application/external/external.ld b/firmware/application/external/external.ld index f2975f8fa..dca18bab8 100644 --- a/firmware/application/external/external.ld +++ b/firmware/application/external/external.ld @@ -69,7 +69,8 @@ MEMORY ram_external_app_wefax_rx (rwx) : org = 0xADDC0000, len = 32k ram_external_app_breakout (rwx) : org = 0xADDD0000, len = 32k ram_external_app_doom (rwx) : org = 0xADDE0000, len = 32k - /*ram_external_app_screening (rwx) : org = 0xADDF0000, len = 32k*/ + ram_external_app_debug_pmem (rwx) : org = 0xADDF0000, len = 32k + /*ram_external_app_screening (rwx) : org = 0xADEA0000, len = 32k*/ } @@ -349,6 +350,12 @@ SECTIONS KEEP(*(.external_app.app_doom.application_information)); *(*ui*external_app*doom*); } > ram_external_app_doom + + .external_app_debug_pmem : ALIGN(4) SUBALIGN(4) + { + KEEP(*(.external_app.app_debug_pmem.application_information)); + *(*ui*external_app*debug_pmem*); + } > ram_external_app_debug_pmem /* .external_app_screening : ALIGN(4) SUBALIGN(4) diff --git a/firmware/common/portapack_persistent_memory.cpp b/firmware/common/portapack_persistent_memory.cpp index 8dacde860..890949394 100644 --- a/firmware/common/portapack_persistent_memory.cpp +++ b/firmware/common/portapack_persistent_memory.cpp @@ -480,6 +480,10 @@ void persist() { } /* namespace cache */ +uint32_t get_data_structure_version() { + return data->structure_version; +} + uint32_t pmem_data_word(uint32_t index) { return backup_ram->pmem_data_word(index); } @@ -562,6 +566,10 @@ void set_afsk_space(const int32_t new_value) { data->afsk_space_freq = afsk_freq_range.clip(new_value); } +uint32_t get_modem_def_index() { + return data->modem_def_index; +} + int32_t modem_baudrate() { modem_baudrate_range.reset_if_outside(data->modem_baudrate, modem_baudrate_reset_value); return data->modem_baudrate; @@ -571,13 +579,11 @@ void set_modem_baudrate(const int32_t new_value) { data->modem_baudrate = modem_baudrate_range.clip(new_value); } -/* int32_t modem_bw() { - modem_bw_range.reset_if_outside(data->modem_bw, modem_bw_reset_value); return data->modem_bw; } -void set_modem_bw(const int32_t new_value) { +/*void set_modem_bw(const int32_t new_value) { data->modem_bw = modem_bw_range.clip(new_value); } */ @@ -672,10 +678,18 @@ void set_gui_return_icon(bool v) { data->ui_config.show_gui_return_icon = v ? 1 : 0; } +bool load_app_settings() { + return data->ui_config.load_app_settings; +} + void set_load_app_settings(bool v) { data->ui_config.load_app_settings = v ? 1 : 0; } +bool save_app_settings() { + return data->ui_config.save_app_settings; +} + void set_save_app_settings(bool v) { data->ui_config.save_app_settings = v ? 1 : 0; } @@ -809,6 +823,9 @@ void set_recon_config_bit(uint8_t rc_bit, bool v) { auto bit_mask = 1LL << rc_bit; data->recon_config = v ? (data->recon_config | bit_mask) : (data->recon_config & ~bit_mask); } +uint64_t get_recon_config() { + return data->recon_config; +} bool recon_autosave_freqs() { return check_recon_config_bit(RC_AUTOSAVE_FREQS); } @@ -1199,173 +1216,5 @@ size_t data_size() { return sizeof(data_t); } -// Dump pmem, receiver and transmitter models internals in human readable format - -bool debug_dump() { - ui::Painter painter{}; - std::string debug_dir = "DEBUG"; - std::filesystem::path filename{}; - File pmem_dump_file{}; - // create new dump file name and DEBUG directory - ensure_directory(debug_dir); - filename = next_filename_matching_pattern(debug_dir + "/DEBUG_DUMP_????.TXT"); - if (filename.empty()) { - painter.draw_string({0, 320 - 16}, *ui::Theme::getInstance()->fg_red, "COULD NOT GET DUMP NAME !"); - return false; - } - // dump data fo filename - auto error = pmem_dump_file.create(filename); - if (error) { - painter.draw_string({0, 320 - 16}, *ui::Theme::getInstance()->fg_red, "ERROR DUMPING " + filename.filename().string() + " !"); - return false; - } - pmem_dump_file.write_line("FW version: " VERSION_STRING); - pmem_dump_file.write_line("Ext APPS version req'd: 0x" + to_string_hex(VERSION_MD5)); - pmem_dump_file.write_line("GCC version: " + to_string_dec_int(__GNUC__) + "." + to_string_dec_int(__GNUC_MINOR__) + "." + to_string_dec_int(__GNUC_PATCHLEVEL__)); - - // firmware checksum - pmem_dump_file.write_line("Firmware calculated checksum: 0x" + to_string_hex(simple_checksum(FLASH_STARTING_ADDRESS, FLASH_ROM_SIZE), 8)); - - // write persistent memory - pmem_dump_file.write_line("\n[Persistent Memory]"); - - // full variables - pmem_dump_file.write_line("structure_version: 0x" + to_string_hex(data->structure_version, 8)); - pmem_dump_file.write_line("target_frequency: " + to_string_dec_int(data->target_frequency)); - pmem_dump_file.write_line("correction_ppb: " + to_string_dec_int(data->correction_ppb)); - pmem_dump_file.write_line("modem_def_index: " + to_string_dec_uint(data->modem_def_index)); - pmem_dump_file.write_line("serial_format.data_bit: " + to_string_dec_uint(data->serial_format.data_bits)); - pmem_dump_file.write_line("serial_format.parity: " + to_string_dec_uint(data->serial_format.parity)); - pmem_dump_file.write_line("serial_format.stop_bits: " + to_string_dec_uint(data->serial_format.stop_bits)); - pmem_dump_file.write_line("serial_format.bit_order: " + to_string_dec_uint(data->serial_format.bit_order)); - pmem_dump_file.write_line("modem_bw: " + to_string_dec_int(data->modem_bw)); - pmem_dump_file.write_line("afsk_mark_freq: " + to_string_dec_int(data->afsk_mark_freq)); - pmem_dump_file.write_line("afsk_space_freq: " + to_string_dec_int(data->afsk_space_freq)); - pmem_dump_file.write_line("modem_baudrate: " + to_string_dec_int(data->modem_baudrate)); - pmem_dump_file.write_line("modem_repeat: " + to_string_dec_int(data->modem_repeat)); - pmem_dump_file.write_line("pocsag_last_address: " + to_string_dec_uint(data->pocsag_last_address)); - pmem_dump_file.write_line("pocsag_ignore_address: " + to_string_dec_uint(data->pocsag_ignore_address)); - pmem_dump_file.write_line("tone_mix: " + to_string_dec_uint(data->tone_mix)); - pmem_dump_file.write_line("hardware_config: " + to_string_dec_uint(data->hardware_config)); - pmem_dump_file.write_line("recon_config: 0x" + to_string_hex(data->recon_config, 16)); - pmem_dump_file.write_line("recon_repeat_nb: " + to_string_dec_int(data->recon_repeat_nb)); - pmem_dump_file.write_line("recon_repeat_gain: " + to_string_dec_int(data->recon_repeat_gain)); - pmem_dump_file.write_line("recon_repeat_delay: " + to_string_dec_int(data->recon_repeat_delay)); - pmem_dump_file.write_line("converter: " + to_string_dec_int(data->converter)); - pmem_dump_file.write_line("updown_converter: " + to_string_dec_int(data->updown_converter)); - pmem_dump_file.write_line("updown_frequency_rx_correction: " + to_string_dec_int(data->updown_frequency_rx_correction)); - pmem_dump_file.write_line("updown_frequency_tx_correction: " + to_string_dec_int(data->updown_frequency_tx_correction)); - pmem_dump_file.write_line("lcd_inverted_mode: " + to_string_dec_uint(data->lcd_inverted_mode)); - // pmem_dump_file.write_line("UNUSED_5: " + to_string_dec_int(data->UNUSED_5)); - // pmem_dump_file.write_line("UNUSED_6: " + to_string_dec_int(data->UNUSED_6)); - // pmem_dump_file.write_line("UNUSED_7: " + to_string_dec_int(data->UNUSED_7)); - pmem_dump_file.write_line("converter_frequency_offset: " + to_string_dec_int(data->converter_frequency_offset)); - pmem_dump_file.write_line("frequency_rx_correction: " + to_string_dec_uint(data->frequency_rx_correction)); - pmem_dump_file.write_line("frequency_tx_correction: " + to_string_dec_uint(data->frequency_tx_correction)); - pmem_dump_file.write_line("encoder_dial_sensitivity: " + to_string_dec_uint(data->encoder_dial_sensitivity)); - pmem_dump_file.write_line("encoder_rate_multiplier: " + to_string_dec_uint(data->encoder_rate_multiplier)); - pmem_dump_file.write_line("encoder_dial_direction: " + to_string_dec_uint(data->encoder_dial_direction)); // 0 = normal, 1 = reverse - pmem_dump_file.write_line("headphone_volume_cb: " + to_string_dec_int(data->headphone_volume_cb)); - pmem_dump_file.write_line("config_mode_storage: 0x" + to_string_hex(data->config_mode_storage, 8)); - pmem_dump_file.write_line("dst_config: 0x" + to_string_hex((uint32_t)data->dst_config.v, 8)); - pmem_dump_file.write_line("fake_brightness_level: " + to_string_dec_uint(data->fake_brightness_level)); - pmem_dump_file.write_line("menu_color: 0x" + to_string_hex(data->menu_color.v, 4)); - pmem_dump_file.write_line("touchscreen_threshold: " + to_string_dec_uint(data->touchscreen_threshold)); - - // ui_config bits - const auto backlight_timer = portapack::persistent_memory::config_backlight_timer(); - pmem_dump_file.write_line("ui_config clkout_freq: " + to_string_dec_uint(clkout_freq())); - pmem_dump_file.write_line("ui_config backlight_timer.timeout_enabled: " + to_string_dec_uint(backlight_timer.timeout_enabled())); - pmem_dump_file.write_line("ui_config backlight_timer.timeout_seconds: " + to_string_dec_uint(backlight_timer.timeout_seconds())); - pmem_dump_file.write_line("ui_config show_gui_return_icon: " + to_string_dec_uint(data->ui_config.show_gui_return_icon)); - pmem_dump_file.write_line("ui_config load_app_settings: " + to_string_dec_uint(data->ui_config.load_app_settings)); - pmem_dump_file.write_line("ui_config save_app_settings: " + to_string_dec_uint(data->ui_config.save_app_settings)); - pmem_dump_file.write_line("ui_config disable_touchscreen: " + to_string_dec_uint(data->ui_config.disable_touchscreen)); - pmem_dump_file.write_line("ui_config hide_clock: " + to_string_dec_uint(data->ui_config.hide_clock)); - pmem_dump_file.write_line("ui_config clock_with_date: " + to_string_dec_uint(data->ui_config.clock_show_date)); - pmem_dump_file.write_line("ui_config clkout_enabled: " + to_string_dec_uint(data->ui_config.clkout_enabled)); - pmem_dump_file.write_line("ui_config apply_fake_brightness: " + to_string_dec_uint(data->ui_config.apply_fake_brightness)); - pmem_dump_file.write_line("ui_config stealth_mode: " + to_string_dec_uint(data->ui_config.stealth_mode)); - pmem_dump_file.write_line("ui_config config_login: " + to_string_dec_uint(data->ui_config.config_login)); - pmem_dump_file.write_line("ui_config config_splash: " + to_string_dec_uint(data->ui_config.config_splash)); - - // ui_config2 bits - pmem_dump_file.write_line("ui_config2 hide_speaker: " + to_string_dec_uint(data->ui_config2.hide_speaker)); - pmem_dump_file.write_line("ui_config2 hide_converter: " + to_string_dec_uint(data->ui_config2.hide_converter)); - pmem_dump_file.write_line("ui_config2 hide_stealth: " + to_string_dec_uint(data->ui_config2.hide_stealth)); - pmem_dump_file.write_line("ui_config2 hide_camera: " + to_string_dec_uint(data->ui_config2.hide_camera)); - pmem_dump_file.write_line("ui_config2 hide_sleep: " + to_string_dec_uint(data->ui_config2.hide_sleep)); - pmem_dump_file.write_line("ui_config2 hide_bias_tee: " + to_string_dec_uint(data->ui_config2.hide_bias_tee)); - pmem_dump_file.write_line("ui_config2 hide_clock: " + to_string_dec_uint(data->ui_config2.hide_clock)); - pmem_dump_file.write_line("ui_config2 hide_sd_card: " + to_string_dec_uint(data->ui_config2.hide_sd_card)); - pmem_dump_file.write_line("ui_config2 hide_mute: " + to_string_dec_uint(data->ui_config2.hide_mute)); - pmem_dump_file.write_line("ui_config2 hide_fake_brightness: " + to_string_dec_uint(data->ui_config2.hide_fake_brightness)); - pmem_dump_file.write_line("ui_config2 hide_battery_icon: " + to_string_dec_uint(data->ui_config2.hide_battery_icon)); - pmem_dump_file.write_line("ui_config2 hide_numeric_battery: " + to_string_dec_uint(data->ui_config2.hide_numeric_battery)); - pmem_dump_file.write_line("ui_config2 theme_id: " + to_string_dec_uint(data->ui_config2.theme_id)); - pmem_dump_file.write_line("ui_config2 override_batt_calc: " + to_string_dec_uint(data->ui_config2.override_batt_calc)); - pmem_dump_file.write_line("ui_config2 button_repeat_delay: " + to_string_dec_uint(data->ui_config2.button_repeat_delay)); - pmem_dump_file.write_line("ui_config2 button_repeat_speed: " + to_string_dec_uint(data->ui_config2.button_repeat_speed)); - pmem_dump_file.write_line("ui_config2 button_long_press_delay: " + to_string_dec_uint(data->ui_config2.button_long_press_delay)); - - // misc_config bits - pmem_dump_file.write_line("misc_config config_audio_mute: " + to_string_dec_int(config_audio_mute())); - pmem_dump_file.write_line("misc_config config_speaker_disable: " + to_string_dec_int(config_speaker_disable())); - pmem_dump_file.write_line("misc_config config_disable_external_tcxo: " + to_string_dec_uint(config_disable_external_tcxo())); - pmem_dump_file.write_line("misc_config config_sdcard_high_speed_io: " + to_string_dec_uint(config_sdcard_high_speed_io())); - pmem_dump_file.write_line("misc_config config_disable_config_mode: " + to_string_dec_uint(config_disable_config_mode())); - pmem_dump_file.write_line("misc_config beep_on_packets: " + to_string_dec_int(beep_on_packets())); - - // receiver_model - pmem_dump_file.write_line("\n[Receiver Model]"); - pmem_dump_file.write_line("target_frequency: " + to_string_dec_uint(receiver_model.target_frequency())); - pmem_dump_file.write_line("frequency_step: " + to_string_dec_uint(receiver_model.frequency_step())); - pmem_dump_file.write_line("lna: " + to_string_dec_int(receiver_model.lna())); - pmem_dump_file.write_line("vga: " + to_string_dec_int(receiver_model.vga())); - pmem_dump_file.write_line("rf_amp: " + to_string_dec_int(receiver_model.rf_amp())); - pmem_dump_file.write_line("baseband_bandwidth: " + to_string_dec_uint(receiver_model.baseband_bandwidth())); - pmem_dump_file.write_line("sampling_rate: " + to_string_dec_uint(receiver_model.sampling_rate())); - switch (receiver_model.modulation()) { - case ReceiverModel::Mode::AMAudio: - pmem_dump_file.write_line("modulation: Mode::AMAudio"); - break; - case ReceiverModel::Mode::NarrowbandFMAudio: - pmem_dump_file.write_line("modulation: Mode::NarrowbandFMAudio"); - break; - case ReceiverModel::Mode::WidebandFMAudio: - pmem_dump_file.write_line("modulation: Mode::WidebandFMAudio"); - break; - case ReceiverModel::Mode::SpectrumAnalysis: - pmem_dump_file.write_line("modulation: Mode::SpectrumAnalysis"); - break; - case ReceiverModel::Mode::Capture: - pmem_dump_file.write_line("modulation: Mode::Capture"); - break; - case ReceiverModel::Mode::AMAudioFMApt: - pmem_dump_file.write_line("modulation: Mode::AMAudioFMApt"); - break; - default: - pmem_dump_file.write_line("modulation: !!unknown mode!!"); - break; - } - pmem_dump_file.write_line("headphone_volume.centibel: " + to_string_dec_int(receiver_model.headphone_volume().centibel())); - pmem_dump_file.write_line("normalized_headphone_volume: " + to_string_dec_uint(receiver_model.normalized_headphone_volume())); - pmem_dump_file.write_line("am_configuration: " + to_string_dec_uint(receiver_model.am_configuration())); - pmem_dump_file.write_line("nbfm_configuration: " + to_string_dec_uint(receiver_model.nbfm_configuration())); - pmem_dump_file.write_line("wfm_configuration: " + to_string_dec_uint(receiver_model.wfm_configuration())); - - // transmitter_model - pmem_dump_file.write_line("\n[Transmitter Model]"); - pmem_dump_file.write_line("target_frequency: " + to_string_dec_uint(transmitter_model.target_frequency())); - pmem_dump_file.write_line("rf_amp: " + to_string_dec_int(transmitter_model.rf_amp())); - pmem_dump_file.write_line("baseband_bandwidth: " + to_string_dec_uint(transmitter_model.baseband_bandwidth())); - pmem_dump_file.write_line("sampling_rate: " + to_string_dec_uint(transmitter_model.sampling_rate())); - pmem_dump_file.write_line("tx_gain: " + to_string_dec_int(transmitter_model.tx_gain())); - pmem_dump_file.write_line("channel_bandwidth: " + to_string_dec_uint(transmitter_model.channel_bandwidth())); - // on screen information - painter.draw_string({0, 320 - 16}, *ui::Theme::getInstance()->fg_green, filename.filename().string() + " DUMPED !"); - return true; -} - } /* namespace persistent_memory */ } /* namespace portapack */ diff --git a/firmware/common/portapack_persistent_memory.hpp b/firmware/common/portapack_persistent_memory.hpp index 5248ae6a6..4e77466cd 100644 --- a/firmware/common/portapack_persistent_memory.hpp +++ b/firmware/common/portapack_persistent_memory.hpp @@ -183,9 +183,13 @@ void set_afsk_mark(const int32_t new_value); int32_t afsk_space_freq(); void set_afsk_space(const int32_t new_value); +uint32_t get_modem_def_index(); + int32_t modem_baudrate(); void set_modem_baudrate(const int32_t new_value); +int32_t modem_bw(); + uint8_t modem_repeat(); void set_modem_repeat(const uint32_t new_value); @@ -214,7 +218,9 @@ backlight_config_t config_backlight_timer(); bool disable_touchscreen(); void set_gui_return_icon(bool v); +bool load_app_settings(); void set_load_app_settings(bool v); +bool save_app_settings(); void set_save_app_settings(bool v); void set_config_disable_external_tcxo(bool v); void set_config_sdcard_high_speed_io(bool v, bool save); @@ -290,6 +296,7 @@ Color menu_color(); void set_menu_color(Color v); /* Recon app */ +uint64_t get_recon_config(); bool recon_autosave_freqs(); bool recon_autostart_recon(); bool recon_continuous(); @@ -366,14 +373,13 @@ bool should_use_sdcard_for_pmem(); int save_persistent_settings_to_file(); int load_persistent_settings_from_file(); +uint32_t get_data_structure_version(); uint32_t pmem_data_word(uint32_t index); uint32_t pmem_stored_checksum(void); uint32_t pmem_calculated_checksum(void); size_t data_size(); -bool debug_dump(); - } /* namespace persistent_memory */ } /* namespace portapack */