diff --git a/firmware/application/CMakeLists.txt b/firmware/application/CMakeLists.txt index 5289fb5a2..daf96900c 100644 --- a/firmware/application/CMakeLists.txt +++ b/firmware/application/CMakeLists.txt @@ -291,7 +291,6 @@ set(CPPSRC apps/ui_fileman.cpp apps/ui_flash_utility.cpp apps/ui_freqman.cpp - apps/ui_fsk_rx.cpp apps/ui_iq_trim.cpp apps/ui_level.cpp apps/ui_looking_glass_app.cpp diff --git a/firmware/application/apps/ui_fsk_rx.cpp b/firmware/application/apps/ui_fsk_rx.cpp deleted file mode 100644 index 173808589..000000000 --- a/firmware/application/apps/ui_fsk_rx.cpp +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * Copyright (C) 2016 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_fsk_rx.hpp" - -#include "audio.hpp" -#include "baseband_api.hpp" -#include "portapack_persistent_memory.hpp" -#include "string_format.hpp" -#include "utility.hpp" -#include "file_path.hpp" - -#include "ui_freqman.hpp" - -using namespace portapack; -namespace pmem = portapack::persistent_memory; - -void FskRxLogger::log_raw_data(const std::string& data, const uint32_t frequency) { - std::string entry = "Raw: F:" + to_string_dec_uint(frequency) + "Hz"; - - // // Raw hex dump of all the codewords - // for (size_t c = 0; c < 16; c++) - // entry += to_string_hex(packet[c], 8) + " "; - - log_file.write_entry(data + entry); -} - -void FskRxLogger::log_decoded(Timestamp timestamp, const std::string& text) { - log_file.write_entry(timestamp, text); -} - -namespace ui { -//--------------------------------------------------------------------------------------------------------------- -// Console View -//--------------------------------------------------------------------------------------------------------------- -FskRxAppConsoleView::FskRxAppConsoleView(NavigationView& nav, Rect parent_rect) - : View(parent_rect), nav_{nav} { - add_child(&console); -}; - -void FskRxAppConsoleView::on_packet(uint32_t value, bool is_data) { - if (is_data) { - console.write(to_string_dec_uint(value) + " "); - } -} - -void FskRxAppConsoleView::on_show() { - hidden(false); -} - -void FskRxAppConsoleView::on_hide() { - hidden(true); -} - -FskRxAppConsoleView::~FskRxAppConsoleView() { -} - -//--------------------------------------------------------------------------------------------------------------- -// Spectrum View -//--------------------------------------------------------------------------------------------------------------- -FskRxAppView::FskRxAppView(NavigationView& nav, Rect parent_rect) - : View(parent_rect), nav_{nav} { - add_child(&waterfall); - hidden(true); -} - -FskRxAppView::~FskRxAppView() { -} - -void FskRxAppView::focus() { -} - -void FskRxAppView::on_show() { - hidden(false); - waterfall.start(); -} - -void FskRxAppView::on_hide() { - hidden(true); - waterfall.stop(); -} - -//--------------------------------------------------------------------------------------------------------------- -// Base View -//--------------------------------------------------------------------------------------------------------------- -FskxRxMainView::FskxRxMainView(NavigationView& nav) - : nav_{nav} { - add_children({&tab_view, - &view_data, - &view_stream, - &labels, - &rssi, - &channel, - &field_rf_amp, - &field_lna, - &field_vga, - &field_frequency, - &deviation_frequency, - &record_view}); - - baseband::run_image(portapack::spi_flash::image_tag_fskrx); - - // DEBUG - record_view.on_error = [&nav](std::string message) { - nav.display_modal("Error", message); - }; - - deviation_frequency.on_change = [this](rf::Frequency f) { - refresh_ui(f); - }; - - // Set initial sampling rate - /* Bandwidth of 2FSK is 2 * Deviation */ - record_view.set_sampling_rate(initial_deviation * 2); - - field_frequency.set_value(initial_target_frequency); - deviation_frequency.set_value(initial_deviation); - - logger.append(logs_dir / u"FSKRX.TXT"); - - baseband::set_fsk(initial_deviation); - - audio::output::start(); - receiver_model.enable(); -} - -void FskxRxMainView::handle_decoded(Timestamp timestamp, const std::string& prefix) { - if (logging()) { - logger.log_decoded(timestamp, prefix); - } -} - -void FskxRxMainView::refresh_ui(rf::Frequency deviationHz) { - /* Nyquist would imply a sample rate of 2x bandwidth, but because the ADC - * provides 2 values (I,Q), the sample_rate is equal to bandwidth here. */ - /* Bandwidth of 2FSK is 2 * Deviation */ - auto sample_rate = deviationHz * 2; - - /* base_rate (bandwidth) is used for FFT calculation and display LCD, and also in recording writing SD Card rate. */ - /* ex. sampling_rate values, 4Mhz, when recording 500 kHz (BW) and fs 8 Mhz, when selected 1 Mhz BW ... */ - /* ex. recording 500kHz BW to .C16 file, base_rate clock 500kHz x2(I,Q) x 2 bytes (int signed) =2MB/sec rate SD Card. */ - - if (!view_stream.hidden()) { - view_stream.waterfall.stop(); - } - - // record_view determines the correct oversampling to apply and returns the actual sample rate. - // NB: record_view is what actually updates proc_capture baseband settings. - auto actual_sample_rate = record_view.set_sampling_rate(sample_rate); - - // Update the radio model with the actual sampling rate. - receiver_model.set_sampling_rate(actual_sample_rate); - - // Get suitable anti-aliasing BPF bandwidth for MAX2837 given the actual sample rate. - auto anti_alias_filter_bandwidth = filter_bandwidth_for_sampling_rate(actual_sample_rate); - receiver_model.set_baseband_bandwidth(anti_alias_filter_bandwidth); - - if (!view_stream.hidden()) { - view_stream.waterfall.start(); - } -} - -void FskxRxMainView::focus() { - field_frequency.focus(); -} - -void FskxRxMainView::set_parent_rect(const Rect new_parent_rect) { - View::set_parent_rect(new_parent_rect); - - ui::Rect waterfall_rect{0, 0, new_parent_rect.width(), new_parent_rect.height() - header_height}; - view_stream.waterfall.set_parent_rect(waterfall_rect); -} - -FskxRxMainView::~FskxRxMainView() { - audio::output::stop(); - receiver_model.disable(); - baseband::shutdown(); -} -} /* namespace ui */ diff --git a/firmware/application/apps/ui_fsk_rx.hpp b/firmware/application/apps/ui_fsk_rx.hpp deleted file mode 100644 index bcebbfb3c..000000000 --- a/firmware/application/apps/ui_fsk_rx.hpp +++ /dev/null @@ -1,177 +0,0 @@ -/* - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * Copyright (C) 2018 Furrtek - * Copyright (C) 2023 gullradriel, Nilorea Studio Inc. - * - * 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_FSK_RX_H__ -#define __UI_FSK_RX_H__ - -#include "ui_widget.hpp" -#include "ui_freq_field.hpp" -#include "ui_receiver.hpp" -#include "ui_record_view.hpp" -#include "ui_rssi.hpp" -#include "ui_spectrum.hpp" -#include "ui_tabview.hpp" - -#include "app_settings.hpp" -#include "log_file.hpp" -#include "radio_state.hpp" -#include "pocsag_app.hpp" - -#include - -class FskRxLogger { - public: - Optional append(const std::filesystem::path& filename) { - return log_file.append(filename); - } - - void log_raw_data(const std::string& data, const uint32_t frequency); - void log_decoded(Timestamp timestamp, const std::string& text); - - private: - LogFile log_file{}; -}; - -namespace ui { -class FskRxAppConsoleView : public View { - public: - FskRxAppConsoleView(NavigationView& nav, Rect parent_rec); - ~FskRxAppConsoleView(); - - std::string title() const override { return "FSK RX Data"; }; - - void on_packet(uint32_t value, bool is_data); - - void on_show() override; - void on_hide() override; - - private: - NavigationView& nav_; - - Console console{ - {0, 0, 240, 224}}; -}; - -class FskRxAppView : public View { - public: - FskRxAppView(NavigationView& nav, Rect parent_rect); - ~FskRxAppView(); - - void focus() override; - void on_show() override; - void on_hide() override; - - spectrum::WaterfallView waterfall{}; - - std::string title() const override { return "FSK RX Stream"; }; - - private: - NavigationView& nav_; - RxRadioState radio_state_{}; -}; - -class FskxRxMainView : public View { - public: - FskxRxMainView(NavigationView& nav); - ~FskxRxMainView(); - - void focus() override; - void set_parent_rect(const Rect new_parent_rect) override; - - std::string title() const override { return "FSK RX"; }; - - private: - static constexpr uint32_t initial_target_frequency = 902'075'000; - static constexpr ui::Dim header_height = (5 * 16); - - uint32_t initial_deviation{3750}; - - bool logging() const { return false; }; - bool logging_raw() const { return false; }; - - NavigationView& nav_; - Rect view_rect = {0, header_height, 240, 224}; - - FskRxAppView view_stream{nav_, view_rect}; - FskRxAppConsoleView view_data{nav_, view_rect}; - - TabView tab_view{ - {"Data", Theme::getInstance()->fg_yellow->foreground, &view_data}, - {"Stream", Theme::getInstance()->fg_cyan->foreground, &view_stream}}; - - void refresh_ui(rf::Frequency f); - void on_packet(uint32_t value, bool is_data); - void handle_decoded(Timestamp timestamp, const std::string& prefix); - - uint32_t last_address = 0; - FskRxLogger logger{}; - uint16_t packet_count = 0; - - RxFrequencyField field_frequency{ - {0 * 8, 4 * 8}, - nav_}; - - RFAmpField field_rf_amp{ - {11 * 8, 2 * 16}}; - - LNAGainField field_lna{ - {13 * 8, 2 * 16}}; - - VGAGainField field_vga{ - {16 * 8, 2 * 16}}; - - RSSI rssi{ - {19 * 8 - 4, 35, 6 * 8, 4}}; - - Channel channel{ - {19 * 8 - 4, 40, 6 * 8, 4}}; - - Labels labels{ - {{0 * 8, 3 * 16}, "Deviation:", Theme::getInstance()->fg_light->foreground}, - }; - - FrequencyField deviation_frequency{ - {10 * 8, 3 * 16}, - {3750, 500000}, - }; - - // DEBUG - RecordView record_view{ - {0 * 8, 4 * 16, 30 * 8, 1 * 16}, - u"FSKRX_????.C16", - u"FSKRX", - RecordView::FileType::RawS16, - 16384, - 3}; - - MessageHandlerRegistration message_handler_packet{ - Message::ID::AFSKData, - [this](Message* const p) { - const auto message = static_cast(p); - this->view_data.on_packet(message->value, message->is_data); - }}; -}; - -} /* namespace ui */ - -#endif /*__POCSAG_APP_H__*/ \ No newline at end of file diff --git a/firmware/application/ui_navigation.cpp b/firmware/application/ui_navigation.cpp index ca812282d..8a0f77e0f 100644 --- a/firmware/application/ui_navigation.cpp +++ b/firmware/application/ui_navigation.cpp @@ -43,7 +43,6 @@ #include "ui_flash_utility.hpp" #include "ui_font_fixed_8x16.hpp" #include "ui_freqman.hpp" -#include "ui_fsk_rx.hpp" #include "ui_iq_trim.hpp" #include "ui_level.hpp" #include "ui_looking_glass_app.hpp"