From aaa1bc3a0920226a17bc1707119c857ad4390a04 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Wed, 6 Jan 2016 11:34:41 -0800 Subject: [PATCH] Transmit ChannelSpectrum data through separate FIFO. Allows handling of data during LCD "vertical retrace", independent of other baseband->application messages. A bit kludgy still... --- firmware/application/ui_spectrum.cpp | 11 +++++++--- firmware/baseband/spectrum_collector.cpp | 18 ++++++++-------- firmware/baseband/spectrum_collector.hpp | 3 +++ firmware/common/message.hpp | 26 +++++++++++++++--------- 4 files changed, 37 insertions(+), 21 deletions(-) diff --git a/firmware/application/ui_spectrum.cpp b/firmware/application/ui_spectrum.cpp index d450b4b62..824df9ff9 100644 --- a/firmware/application/ui_spectrum.cpp +++ b/firmware/application/ui_spectrum.cpp @@ -237,15 +237,20 @@ WaterfallWidget::WaterfallWidget() { } void WaterfallWidget::on_show() { - context().message_map().register_handler(Message::ID::ChannelSpectrum, + context().message_map().register_handler(Message::ID::FIFONotify, [this](const Message* const p) { - this->on_channel_spectrum(reinterpret_cast(p)->spectrum); + const auto message = reinterpret_cast(p); + auto fifo = reinterpret_cast(message->fifo); + ChannelSpectrum channel_spectrum; + if( fifo->out(channel_spectrum) ) { + this->on_channel_spectrum(channel_spectrum); + } } ); } void WaterfallWidget::on_hide() { - context().message_map().unregister_handler(Message::ID::ChannelSpectrum); + context().message_map().unregister_handler(Message::ID::FIFONotify); } void WaterfallWidget::set_parent_rect(const Rect new_parent_rect) { diff --git a/firmware/baseband/spectrum_collector.cpp b/firmware/baseband/spectrum_collector.cpp index 2c604b2b5..37660df67 100644 --- a/firmware/baseband/spectrum_collector.cpp +++ b/firmware/baseband/spectrum_collector.cpp @@ -73,8 +73,8 @@ void SpectrumCollector::update() { channel_spectrum_request_update = false; fft_c_preswapped(channel_spectrum); - ChannelSpectrumMessage spectrum_message; - for(size_t i=0; i .magnitude, or something more (less!) accurate. */ - spectrum_message.spectrum.db_count = spectrum_message.spectrum.db.size(); - spectrum_message.spectrum.sampling_rate = channel_spectrum_sampling_rate; - spectrum_message.spectrum.channel_filter_pass_frequency = channel_filter_pass_frequency; - spectrum_message.spectrum.channel_filter_stop_frequency = channel_filter_stop_frequency; - shared_memory.application_queue.push(spectrum_message); + spectrum.db_count = spectrum.db.size(); + spectrum.sampling_rate = channel_spectrum_sampling_rate; + spectrum.channel_filter_pass_frequency = channel_filter_pass_frequency; + spectrum.channel_filter_stop_frequency = channel_filter_stop_frequency; + fifo.in(spectrum); + FIFONotifyMessage message { &fifo }; + shared_memory.application_queue.push(message); } } diff --git a/firmware/baseband/spectrum_collector.hpp b/firmware/baseband/spectrum_collector.hpp index 52ef1d0e3..3e5910228 100644 --- a/firmware/baseband/spectrum_collector.hpp +++ b/firmware/baseband/spectrum_collector.hpp @@ -30,6 +30,8 @@ #include #include +#include "message.hpp" + class SpectrumCollector { public: constexpr SpectrumCollector( @@ -49,6 +51,7 @@ public: private: BlockDecimator<256> channel_spectrum_decimator; + ChannelSpectrumFIFO fifo; volatile bool channel_spectrum_request_update { false }; std::array, 256> channel_spectrum; diff --git a/firmware/common/message.hpp b/firmware/common/message.hpp index e247b27cb..26d2cc1a0 100644 --- a/firmware/common/message.hpp +++ b/firmware/common/message.hpp @@ -30,6 +30,7 @@ #include "baseband_packet.hpp" #include "ert_packet.hpp" #include "dsp_fir_taps.hpp" +#include "fifo.hpp" #include "utility.hpp" @@ -44,7 +45,7 @@ public: RSSIStatistics = 0, BasebandStatistics = 1, ChannelStatistics = 2, - ChannelSpectrum = 3, + AudioStatistics = 4, BasebandConfiguration = 5, TPMSPacket = 6, @@ -55,6 +56,7 @@ public: NBFMConfigure = 11, WFMConfigure = 12, AMConfigure = 13, + FIFONotify = 14, MAX }; @@ -207,15 +209,7 @@ struct ChannelSpectrum { uint32_t channel_filter_stop_frequency { 0 }; }; -class ChannelSpectrumMessage : public Message { -public: - constexpr ChannelSpectrumMessage( - ) : Message { ID::ChannelSpectrum } - { - } - - ChannelSpectrum spectrum; -}; +using ChannelSpectrumFIFO = FIFO; class AISPacketMessage : public Message { public: @@ -333,6 +327,18 @@ public: const fir_taps_real<32> channel_filter; }; +class FIFONotifyMessage : public Message { +public: + constexpr FIFONotifyMessage( + void* const fifo + ) : Message { ID::FIFONotify }, + fifo { fifo } + { + } + + void* const fifo; +}; + class MessageHandlerMap { public: using MessageHandler = std::function;