From 33a2df9d2a16017b896d5144ebae0a78d854a843 Mon Sep 17 00:00:00 2001 From: furrtek Date: Fri, 23 Jun 2017 08:40:22 +0100 Subject: [PATCH] OutputStream (file M0 -> M4 radio) now works Disabled numbers station for now (too buggy, low priority) --- firmware/application/CMakeLists.txt | 2 +- firmware/application/file.hpp | 2 +- firmware/application/io_file.hpp | 4 ++++ firmware/application/main.cpp | 15 ++++++++------- firmware/application/replay_app.cpp | 7 +++---- firmware/application/replay_app.hpp | 2 +- firmware/application/replay_thread.cpp | 12 ++++++++---- firmware/application/ui_navigation.cpp | 6 +++--- firmware/application/ui_replay_view.cpp | 12 ++++++++++-- firmware/application/ui_replay_view.hpp | 3 ++- firmware/baseband/proc_replay.cpp | 2 +- firmware/baseband/proc_replay.hpp | 2 +- firmware/baseband/stream_output.cpp | 1 - firmware/common/buffer_exchange.cpp | 4 +--- firmware/common/message.hpp | 4 ++++ 15 files changed, 48 insertions(+), 30 deletions(-) diff --git a/firmware/application/CMakeLists.txt b/firmware/application/CMakeLists.txt index 644c091f7..20f65580f 100644 --- a/firmware/application/CMakeLists.txt +++ b/firmware/application/CMakeLists.txt @@ -182,7 +182,7 @@ set(CPPSRC ui_menu.cpp ui_morse.cpp ui_navigation.cpp - ui_numbers.cpp + # ui_numbers.cpp ui_nuoptix.cpp ui_playdead.cpp ui_pocsag_tx.cpp diff --git a/firmware/application/file.hpp b/firmware/application/file.hpp index 75d824907..281012f4a 100644 --- a/firmware/application/file.hpp +++ b/firmware/application/file.hpp @@ -241,7 +241,7 @@ std::filesystem::path next_filename_stem_matching_pattern(std::filesystem::path static_assert(sizeof(FIL::err) == 1, "FatFs FIL::err size not expected."); /* Dangerous to expose these, as FatFs native error values are byte-sized. However, - * my filesystem_error implemetation is fine with it. */ + * my filesystem_error implementation is fine with it. */ #define FR_DISK_FULL (0x100) #define FR_EOF (0x101) #define FR_BAD_SEEK (0x102) diff --git a/firmware/application/io_file.hpp b/firmware/application/io_file.hpp index 22e64dae1..25cf0f761 100644 --- a/firmware/application/io_file.hpp +++ b/firmware/application/io_file.hpp @@ -37,6 +37,10 @@ public: FileReader(FileReader&& file) = delete; FileReader& operator=(FileReader&&) = delete; + Optional open(const std::filesystem::path& filename) { + return file.open(filename); + } + File::Result read(void* const buffer, const File::Size bytes) override; protected: diff --git a/firmware/application/main.cpp b/firmware/application/main.cpp index a65463b4f..432ed932b 100755 --- a/firmware/application/main.cpp +++ b/firmware/application/main.cpp @@ -23,20 +23,23 @@ // Color bitmaps generated with: // Gimp image > indexed colors (16), then "xxd -i *.bmp" +//TEST: Mic tx +//TEST: Menuview refresh, seems to blink a lot +//TEST: Check AFSK transmit end, skips last bits ? +//TEST: Imperial in whipcalc + //BUG: SCANNER Lock on frequency, if frequency jump, still locked on first one //BUG: SCANNER Multiple slices //BUG: REPLAY freezes when SD card not present //BUG: RDS doesn't stop baseband when stopping tx ? +//TODO: Make freqman refresh simpler (use previous black rectangle method) //TODO: Merge AFSK and TONES procs ? -//TODO: NFM Squelch level setting -//TODO: NFM RX nav.pop on squelch +//TODO: NFM RX mode: nav.pop on squelch //TODO: MORSE use prosigns //TODO: MORSE live keying mode //TODO: Use to_string_short_freq wherever possible //TODO: SCANNER Waveform widget as FFT view ? -//TEST: Check AFSK transmit end, skips last bits ? -//TEST: Imperial in whipcalc //TODO: Optimize (and group ?) CTCSS tone gen code /* Continuous (Fox-oring) @@ -46,9 +49,7 @@ Continuous (Fox-oring) */ //TODO: Use transmittermodel bw setting //TODO: Use TransmitterView in TEDI/LCR, Numbers, ... -//TODO: FreqMan: Add and rename categories -//TODO: FreqMan: Sort by category in edit screen -//TODO: FreqMan: Cap entry count per category (only done for total entries right now) +//TODO: FreqMan: Remove and rename categories //TODO: Wav visualizer //TODO: File browser view ? //TODO: Mousejack ? diff --git a/firmware/application/replay_app.cpp b/firmware/application/replay_app.cpp index 7459a48db..0627acb87 100644 --- a/firmware/application/replay_app.cpp +++ b/firmware/application/replay_app.cpp @@ -24,12 +24,11 @@ #include "string_format.hpp" #include "baseband_api.hpp" - #include "portapack.hpp" -using namespace portapack; - #include "portapack_persistent_memory.hpp" +using namespace portapack; + namespace ui { ReplayAppView::ReplayAppView( @@ -38,7 +37,7 @@ ReplayAppView::ReplayAppView( { std::vector file_list; - // Search for files + // Search for files with the right extension file_list = scan_root_files(u"/", u"*.C16"); if (!file_list.size()) { file_error = true; diff --git a/firmware/application/replay_app.hpp b/firmware/application/replay_app.hpp index 4c21e4518..f8ae50bad 100644 --- a/firmware/application/replay_app.hpp +++ b/firmware/application/replay_app.hpp @@ -54,7 +54,7 @@ private: static constexpr ui::Dim header_height = 2 * 16; - static constexpr uint32_t sampling_rate = 4000000; + static constexpr uint32_t sampling_rate = 500000; static constexpr uint32_t baseband_bandwidth = 2500000; void on_target_frequency_changed(rf::Frequency f); diff --git a/firmware/application/replay_thread.cpp b/firmware/application/replay_thread.cpp index 96b6ff156..67fec1137 100644 --- a/firmware/application/replay_thread.cpp +++ b/firmware/application/replay_thread.cpp @@ -83,13 +83,17 @@ Optional ReplayThread::run() { while( !chThdShouldTerminate() ) { auto buffer = buffers.get(); - /*auto read_result = reader->read(buffer->data(), buffer->size()); + + auto read_result = reader->read(buffer->data(), buffer->capacity()); + buffer->set_size(buffer->capacity()); if( read_result.is_error() ) { return read_result.error(); } - buffers.put(buffer);*/ - chThdSleep(50); // DEBUG - //led_tx.toggle(); + + if (!buffers.put(buffer)) + for(;;){}; // DEBUG + + led_tx.toggle(); // DEBUG } return { }; diff --git a/firmware/application/ui_navigation.cpp b/firmware/application/ui_navigation.cpp index 3a187ce0b..b3666f52a 100644 --- a/firmware/application/ui_navigation.cpp +++ b/firmware/application/ui_navigation.cpp @@ -43,7 +43,7 @@ #include "ui_lcr.hpp" #include "ui_mictx.hpp" #include "ui_morse.hpp" -#include "ui_numbers.hpp" +//#include "ui_numbers.hpp" #include "ui_nuoptix.hpp" #include "ui_playdead.hpp" #include "ui_pocsag_tx.hpp" @@ -306,7 +306,7 @@ TransmittersMenuView::TransmittersMenuView(NavigationView& nav) { { "Microphone", ui::Color::green(), &bitmap_icon_microphone, [&nav](){ nav.push(); } }, { "Morse code", ui::Color::green(), &bitmap_icon_morse, [&nav](){ nav.push(); } }, { "NTTWorks burger pager", ui::Color::yellow(), &bitmap_icon_burger, [&nav](){ nav.push(); } }, - { "Numbers station", ui::Color::orange(), &bitmap_icon_numbers, [&nav](){ nav.push(); } }, + { "Numbers station", ui::Color::grey(), &bitmap_icon_numbers, [&nav](){ nav.push(); } }, // NumbersStationView { "Nuoptix DTMF timecode", ui::Color::green(), &bitmap_icon_nuoptix, [&nav](){ nav.push(); } }, { "OOK remote encoders", ui::Color::yellow(), &bitmap_icon_remote, [&nav](){ nav.push(); } }, { "POCSAG", ui::Color::green(), &bitmap_icon_pocsag, [&nav](){ nav.push(); } }, @@ -350,7 +350,7 @@ SystemMenuView::SystemMenuView(NavigationView& nav) { { "Receivers", ui::Color::cyan(), &bitmap_icon_receivers, [&nav](){ nav.push(); } }, { "Transmitters", ui::Color::green(), nullptr, [&nav](){ nav.push(); } }, { "Capture", ui::Color::blue(), &bitmap_icon_capture, [&nav](){ nav.push(); } }, - { "Replay", ui::Color::grey(), &bitmap_icon_replay, [&nav](){ nav.push(); } }, // ReplayAppView + { "Replay", ui::Color::grey(), &bitmap_icon_replay, [&nav](){ nav.push(); } }, { "Scanner/search", ui::Color::orange(), &bitmap_icon_closecall, [&nav](){ nav.push(); } }, { "Utilities", ui::Color::purple(), &bitmap_icon_utilities, [&nav](){ nav.push(); } }, { "Setup", ui::Color::white(), &bitmap_icon_setup, [&nav](){ nav.push(); } }, diff --git a/firmware/application/ui_replay_view.cpp b/firmware/application/ui_replay_view.cpp index c4e00100b..1c274c08d 100644 --- a/firmware/application/ui_replay_view.cpp +++ b/firmware/application/ui_replay_view.cpp @@ -114,7 +114,15 @@ void ReplayView::toggle() { void ReplayView::start() { stop(); - auto reader = std::make_unique(); + std::unique_ptr reader; + + auto p = std::make_unique(); + auto create_error = p->open(file_options[options_files.selected_index()].first + ".C16"); + if( create_error.is_valid() ) { + handle_error(create_error.value()); + } else { + reader = std::move(p); + } if( reader ) { button_play.set_bitmap(&bitmap_stop); @@ -135,7 +143,7 @@ void ReplayView::start() { update_status_display(); radio::enable({ - 434000000, //target_frequency(), + receiver_model.tuning_frequency(), sampling_rate, 2500000, //baseband_bandwidth, rf::Direction::Transmit, diff --git a/firmware/application/ui_replay_view.hpp b/firmware/application/ui_replay_view.hpp index 6333d6494..3f708a60f 100644 --- a/firmware/application/ui_replay_view.hpp +++ b/firmware/application/ui_replay_view.hpp @@ -59,7 +59,7 @@ private: using option_t = std::pair; using options_t = std::vector; - static constexpr uint32_t sampling_rate = 500000; + static constexpr uint32_t sampling_rate = 1000000; void toggle(); @@ -74,6 +74,7 @@ private: const size_t buffer_count; //SignalToken signal_token_tick_second { }; options_t file_options { }; + //std::filesystem:path file_path { }; Rectangle rect_background { Color::black() diff --git a/firmware/baseband/proc_replay.cpp b/firmware/baseband/proc_replay.cpp index af6c3cde1..ce6e03152 100644 --- a/firmware/baseband/proc_replay.cpp +++ b/firmware/baseband/proc_replay.cpp @@ -63,7 +63,7 @@ void ReplayProcessor::on_message(const Message* const message) { channel_spectrum.on_message(message); break;*/ - case Message::ID::CaptureConfig: + case Message::ID::ReplayConfig: replay_config(*reinterpret_cast(message)); break; diff --git a/firmware/baseband/proc_replay.hpp b/firmware/baseband/proc_replay.hpp index 37fa4e8ec..34c20d8b4 100644 --- a/firmware/baseband/proc_replay.hpp +++ b/firmware/baseband/proc_replay.hpp @@ -41,7 +41,7 @@ public: private: // TODO: Repeated value needs to be transmitted from application side. - static constexpr size_t baseband_fs = 500000; + static constexpr size_t baseband_fs = 1000000; //static constexpr auto spectrum_rate_hz = 50.0f; BasebandThread baseband_thread { baseband_fs, this, NORMALPRIO + 20, baseband::Direction::Transmit }; diff --git a/firmware/baseband/stream_output.cpp b/firmware/baseband/stream_output.cpp index 30f2d6511..db65024ef 100644 --- a/firmware/baseband/stream_output.cpp +++ b/firmware/baseband/stream_output.cpp @@ -55,7 +55,6 @@ size_t StreamOutput::read(void* const data, const size_t length) { const auto remaining = length - read; read += active_buffer->read(&p[read], remaining); - //buffer->empty(); if( active_buffer->is_empty() ) { if( !fifo_buffers_empty.in(active_buffer) ) { diff --git a/firmware/common/buffer_exchange.cpp b/firmware/common/buffer_exchange.cpp index 6cc107a6e..4f71b84e0 100644 --- a/firmware/common/buffer_exchange.cpp +++ b/firmware/common/buffer_exchange.cpp @@ -56,9 +56,7 @@ BufferExchange::~BufferExchange() { StreamBuffer* BufferExchange::get(FIFO* fifo) { while(true) { StreamBuffer* p { nullptr }; - fifo->out(p); // This crashes replay - - //led_tx.on(); // DEBUG + fifo->out(p); if( p ) { return p; diff --git a/firmware/common/message.hpp b/firmware/common/message.hpp index ca28fbf7a..54ffdc7cf 100644 --- a/firmware/common/message.hpp +++ b/firmware/common/message.hpp @@ -484,6 +484,10 @@ public: size_t size() const { return used_; } + + size_t capacity() const { + return capacity_; + } void set_size(const size_t value) { used_ = value;