/* * 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.hpp" #include "ui_transmitter.hpp" #include "ui_textentry.hpp" #include "ui_tabview.hpp" #include "app_settings.hpp" #include "radio_state.hpp" #include "rds.hpp" using namespace rds; namespace ui { class RDSPSNView : public OptionTabView { public: RDSPSNView(NavigationView& nav, Rect parent_rect); std::string PSN{"TEST1234"}; bool mono_stereo{false}; bool TA{false}; bool MS{false}; private: Labels labels{ {{1 * 8, 3 * 8}, "Program Service Name", Theme::getInstance()->fg_light->foreground}, {{2 * 8, 7 * 8}, "PSN:", Theme::getInstance()->fg_light->foreground}}; Button button_set{ {18 * 8, 3 * 16, 80, 32}, "Set"}; Text text_psn{ {6 * 8, 3 * 16 + 8, 8 * 8, 16}, ""}; Checkbox check_mono_stereo{ {2 * 8, 12 * 8}, 6, "Stereo"}; Checkbox check_MS{ {14 * 8, 12 * 8}, 5, "Music"}; Checkbox check_TA{ {2 * 8, 16 * 8}, 20, "Traffic announcement"}; }; class RDSRadioTextView : public OptionTabView { public: RDSRadioTextView(NavigationView& nav, Rect parent_rect); std::string radiotext{"Radiotext test ABCD1234"}; private: Labels labels{ {{2 * 8, 3 * 8}, "Radiotext", Theme::getInstance()->fg_light->foreground}, {{1 * 8, 6 * 8}, "Text:", Theme::getInstance()->fg_light->foreground}}; Text text_radiotext{ {1 * 8, 4 * 16, 28 * 8, 16}, "-"}; Button button_set{ {88, 6 * 16, 64, 32}, "Set"}; }; class RDSDateTimeView : public OptionTabView { public: RDSDateTimeView(Rect parent_rect); private: Labels labels{ {{44, 5 * 16}, "Not yet implemented", Theme::getInstance()->error_dark->foreground}}; }; class RDSAudioView : public OptionTabView { public: RDSAudioView(Rect parent_rect); private: Labels labels{ {{44, 5 * 16}, "Not yet implemented", Theme::getInstance()->error_dark->foreground}}; }; class RDSThread { public: RDSThread(std::vector** frames); ~RDSThread(); RDSThread(const RDSThread&) = delete; RDSThread(RDSThread&&) = delete; RDSThread& operator=(const RDSThread&) = delete; RDSThread& operator=(RDSThread&&) = delete; private: std::vector** frames_{}; Thread* thread{nullptr}; static msg_t static_fn(void* arg); void run(); }; class RDSView : public View { public: RDSView(NavigationView& nav); ~RDSView(); RDSView(const RDSView&) = delete; RDSView(RDSView&&) = delete; RDSView& operator=(const RDSView&) = delete; RDSView& operator=(RDSView&&) = delete; void focus() override; std::string title() const override { return "RDS TX"; }; private: NavigationView& nav_; RDS_flags rds_flags{}; TxRadioState radio_state_{ 0 /* frequency */, 1750000 /* bandwidth */, 2280000 /* sampling rate */ }; app_settings::SettingsManager settings_{ "tx_rds", app_settings::Mode::TX}; std::vector frame_psn{}; std::vector frame_radiotext{}; std::vector frame_datetime{}; std::vector* frames[3]{&frame_psn, &frame_radiotext, &frame_datetime}; bool txing = false; uint16_t message_length{0}; void start_tx(); Rect view_rect = {0, 8 * 8, 240, 192}; RDSPSNView view_PSN{nav_, view_rect}; RDSRadioTextView view_radiotext{nav_, view_rect}; RDSDateTimeView view_datetime{view_rect}; RDSAudioView view_audio{view_rect}; TabView tab_view{ {"Name", Theme::getInstance()->fg_cyan->foreground, &view_PSN}, {"Text", Theme::getInstance()->fg_green->foreground, &view_radiotext}, {"Time", Theme::getInstance()->fg_yellow->foreground, &view_datetime}, {"Audio", Theme::getInstance()->fg_orange->foreground, &view_audio}}; Labels labels{ {{0 * 8, 28}, "Program type:", Theme::getInstance()->fg_light->foreground}, //{ { 14 * 8, 16 + 8 }, "CC:", Theme::getInstance()->fg_light->foreground }, {{2 * 8, 28 + 16}, "Program ID:", Theme::getInstance()->fg_light->foreground}, //{ { 13 * 8, 32 + 8 }, "Cov:",Theme::getInstance()->fg_light->foreground }, }; OptionsField options_pty{ {13 * 8, 28}, 8, {{"None", 0}, {"News", 1}, {"Affairs", 2}, {"Info", 3}, {"Sport", 4}, {"Educate", 5}, {"Drama", 6}, {"Culture", 7}, {"Science", 8}, {"Varied", 9}, {"Pop", 10}, {"Rock", 11}, {"Easy", 12}, {"Light", 13}, {"Classics", 14}, {"Other", 15}, {"Weather", 16}, {"Finance", 17}, {"Children", 18}, {"Social", 19}, {"Religion", 20}, {"PhoneIn", 21}, {"Travel", 22}, {"Leisure", 23}, {"Jazz", 24}, {"Country", 25}, {"National", 26}, {"Oldies", 27}, {"Folk", 28}, {"Docs", 29}, {"AlarmTst", 30}, {"Alarm", 31}}}; /*OptionsField options_countrycode { { 17 * 8, 16 + 8 }, 11, { { "Albania", 9 }, { "Algeria", 2 }, { "Andorra", 3 }, { "Austria", 10 }, { "Azores", 8 }, { "Belgium", 6 }, { "Belarus", 15 }, { "Bosnia", 15 }, { "Bulgaria", 8 }, { "Canaries", 14 }, { "Croatia", 12 }, { "Cyprus", 2 }, { "Czech-Rep", 2 }, { "Denmark", 9 }, { "Egypt", 15 }, { "Estonia", 2 }, { "Faroe", 9 }, { "Finland", 6 }, { "France", 15 }, { "Germany 1", 13 }, { "Germany 2", 1 }, { "Gibraltar", 10 }, { "Greece", 1 }, { "Hungary", 11 }, { "Iceland", 10 }, { "Iraq", 11 }, { "Ireland", 2 }, { "Israel", 4 }, { "Italy", 5 }, { "Jordan", 5 }, { "Latvia", 9 }, { "Lebanon", 10 }, { "Libya", 13 }, { "Liechtenst.", 9 }, { "Lithuania", 12 }, { "Luxembourg", 7 }, { "Macedonia", 4 }, { "Madeira", 8 }, { "Malta", 12 }, { "Moldova", 1 }, { "Monaco", 11 }, { "Morocco", 1 }, { "Netherlands", 8 }, { "Norway", 15 }, { "Palestine", 8 }, { "Poland", 3 }, { "Portugal", 8 }, { "Romania", 14 }, { "Russia", 7 }, { "San Marino", 3 }, { "Slovakia", 5 }, { "Slovenia", 9 }, { "Spain", 14 }, { "Sweden", 14 }, { "Switzerland", 4 }, { "Syria", 6 }, { "Tunisia", 7 }, { "Turkey", 3 }, { "Ukraine", 6 }, { "U.K.", 12 }, { "Vatican", 4 }, { "Yugoslavia", 13 } } };*/ SymField sym_pi_code{ {13 * 8, 28 + 16}, 4, SymField::Type::Hex}; /*OptionsField options_coverage { { 17 * 8, 32 + 8 }, 12, { { "Local", 0 }, { "Internat.", 1 }, { "National", 2 }, { "Sup-regional", 3 }, { "R11", 4 }, { "R12", 5 }, { "R13", 6 }, { "R14", 7 }, { "R15", 8 }, { "R16", 9 }, { "R17", 10 }, { "R18", 11 }, { "R19", 12 }, { "R110", 13 }, { "R111", 14 }, { "R112", 15 } } };*/ Checkbox check_TP{ {23 * 8, 4 * 8}, 2, "TP"}; TransmitterView tx_view{ 16 * 16, 50000, 9}; std::unique_ptr tx_thread{}; }; } /* namespace ui */