/* * 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. */ #pragma once #include "ui.hpp" #include "ui_widget.hpp" #include "ui_navigation.hpp" #include "ui_tabview.hpp" #include "capture_app.hpp" #include "baseband_api.hpp" #include "portapack.hpp" #include "message.hpp" #include "ui_spectrum_painter_image.hpp" #include "ui_spectrum_painter_text.hpp" namespace ui { class SpectrumPainterView : public View { public: SpectrumPainterView(NavigationView& nav); ~SpectrumPainterView(); SpectrumPainterView(const SpectrumPainterView&) = delete; SpectrumPainterView(SpectrumPainterView&&) = delete; SpectrumPainterView& operator=(const SpectrumPainterView&) = delete; SpectrumPainterView& operator=(SpectrumPainterView&&) = delete; void focus() override; void paint(Painter& painter) override; std::string title() const override { return "Spec.Painter"; }; private: void on_target_frequency_changed(rf::Frequency f); void set_target_frequency(const rf::Frequency new_value); rf::Frequency target_frequency() const; NavigationView& nav_; bool image_input_avaliable { false }; bool tx_active { false }; uint32_t tx_mode { 0 }; uint16_t tx_current_line { 0 }; uint16_t tx_current_max_lines { 0 }; uint16_t tx_current_width { 0 }; systime_t tx_timestamp_start { 0 }; inline uint32_t tx_time_elapsed() { auto now = chTimeNow(); return now - tx_timestamp_start; } int32_t tx_gain { 47 }; bool rf_amp { false }; SpectrumInputImageView input_image { nav_ }; SpectrumInputTextView input_text { nav_ }; std::array input_views { { &input_image, &input_text } }; TabView tab_view { { "Image", Color::white(), input_views[0] }, { "Text", Color::white(), input_views[1] } }; static constexpr int32_t footer_location = 15 * 16 + 8; ProgressBar progressbar { { 4, footer_location - 16, 240-8, 16 } }; Labels labels { { { 10 * 8, footer_location + 1 * 16 }, "GAIN A:", Color::light_grey() }, { { 1 * 8, footer_location + 2 * 16 }, "BW: Du: P:", Color::light_grey() }, }; FrequencyField field_frequency { { 0 * 8, footer_location + 1 * 16 }, }; NumberField field_rfgain { { 14 * 8, footer_location + 1 * 16 }, 2, { 0, 47 }, 1, ' ' }; NumberField field_rfamp { { 19 * 8, footer_location + 1 * 16 }, 2, { 0, 14 }, 14, ' ' }; Checkbox check_loop { { 21 * 8, footer_location + 1 * 16 }, 4, "Loop", true }; ImageButton button_play { { 28 * 8, footer_location + 1 * 16, 2 * 8, 1 * 16 }, &bitmap_play, Color::green(), Color::black() }; OptionsField option_bandwidth { { 4 * 8, footer_location + 2 * 16 }, 5, { BW_OPTIONS } }; NumberField field_duration { { 13 * 8, footer_location + 2 * 16 }, 3, { 1, 999 }, 1, ' ' }; NumberField field_pause { { 19 * 8, footer_location + 2 * 16 }, 2, { 0, 99 }, 1, ' ' }; SpectrumPainterFIFO* fifo { nullptr }; void start_tx(); void frame_sync(); void stop_tx(); MessageHandlerRegistration message_handler_fifo_signal { Message::ID::SpectrumPainterBufferResponseConfigure, [this](const Message* const p) { const auto message = static_cast(p); this->fifo = message->fifo; this->start_tx(); } }; MessageHandlerRegistration message_handler_sample { Message::ID::DisplayFrameSync, [this](const Message* const) { this->frame_sync(); } }; }; }