From 6bf61cbe88e80e32dc1b1f5ef8a6b3ffe5d11c20 Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Thu, 27 Aug 2015 11:11:08 -0700 Subject: [PATCH] Extract BasebandProcessor into separate files. --- firmware/baseband/Makefile | 1 + firmware/baseband/baseband_processor.cpp | 124 +++++++++++++++++++++++ firmware/baseband/baseband_processor.hpp | 75 ++++++++++++++ firmware/baseband/main.cpp | 117 +-------------------- 4 files changed, 201 insertions(+), 116 deletions(-) create mode 100644 firmware/baseband/baseband_processor.cpp create mode 100644 firmware/baseband/baseband_processor.hpp diff --git a/firmware/baseband/Makefile b/firmware/baseband/Makefile index 7ef768692..5bdab3445 100755 --- a/firmware/baseband/Makefile +++ b/firmware/baseband/Makefile @@ -129,6 +129,7 @@ CPPSRC = main.cpp \ gpdma.cpp \ baseband_dma.cpp \ portapack_shared_memory.cpp \ + baseband_processor.cpp \ channel_decimator.cpp \ dsp_decimate.cpp \ dsp_demodulate.cpp \ diff --git a/firmware/baseband/baseband_processor.cpp b/firmware/baseband/baseband_processor.cpp new file mode 100644 index 000000000..7edb8da10 --- /dev/null +++ b/firmware/baseband/baseband_processor.cpp @@ -0,0 +1,124 @@ +/* + * Copyright (C) 2014 Jared Boone, ShareBrained Technology, 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. + */ + +#include "baseband_processor.hpp" + +#include "portapack_shared_memory.hpp" + +#include "dsp_fft.hpp" + +#include "audio_dma.hpp" + +#include "message.hpp" +#include "event_m4.hpp" +#include "utility.hpp" + +#include +#include + +void BasebandProcessor::update_spectrum() { + // Called from idle thread (after EVT_MASK_SPECTRUM is flagged) + if( channel_spectrum_request_update ) { + /* Decimated buffer is full. Compute spectrum. */ + std::array, 256> samples_swapped; + fft_swap(channel_spectrum, samples_swapped); + channel_spectrum_request_update = false; + fft_c_preswapped(samples_swapped); + + 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); + } +} + +void BasebandProcessor::feed_channel_stats(const buffer_c16_t channel) { + channel_stats.feed( + channel, + [this](const ChannelStatistics statistics) { + this->post_channel_stats_message(statistics); + } + ); +} + +void BasebandProcessor::feed_channel_spectrum( + const buffer_c16_t channel, + const uint32_t filter_pass_frequency, + const uint32_t filter_stop_frequency +) { + channel_filter_pass_frequency = filter_pass_frequency; + channel_filter_stop_frequency = filter_stop_frequency; + channel_spectrum_decimator.feed( + channel, + [this](const buffer_c16_t data) { + this->post_channel_spectrum_message(data); + } + ); +} + +void BasebandProcessor::fill_audio_buffer(const buffer_s16_t audio) { + auto audio_buffer = audio::dma::tx_empty_buffer();; + for(size_t i=0; ipost_audio_stats_message(statistics); + } + ); +} + +void BasebandProcessor::post_audio_stats_message(const AudioStatistics statistics) { + audio_stats_message.statistics = statistics; + shared_memory.application_queue.push(audio_stats_message); +} diff --git a/firmware/baseband/baseband_processor.hpp b/firmware/baseband/baseband_processor.hpp new file mode 100644 index 000000000..66d7936d2 --- /dev/null +++ b/firmware/baseband/baseband_processor.hpp @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2014 Jared Boone, ShareBrained Technology, 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 __BASEBAND_PROCESSOR_H__ +#define __BASEBAND_PROCESSOR_H__ + +#include "dsp_types.hpp" +#include "complex.hpp" + +#include "block_decimator.hpp" +#include "channel_stats_collector.hpp" +#include "audio_stats_collector.hpp" + +#include +#include + +class BasebandProcessor { +public: + virtual ~BasebandProcessor() = default; + + virtual void execute(buffer_c8_t buffer) = 0; + + void update_spectrum(); + +protected: + void feed_channel_stats(const buffer_c16_t channel); + + void feed_channel_spectrum( + const buffer_c16_t channel, + const uint32_t filter_pass_frequency, + const uint32_t filter_stop_frequency + ); + + void fill_audio_buffer(const buffer_s16_t audio); + +private: + BlockDecimator<256> channel_spectrum_decimator { 4 }; + + ChannelStatsCollector channel_stats; + ChannelStatisticsMessage channel_stats_message; + + AudioStatsCollector audio_stats; + AudioStatisticsMessage audio_stats_message; + + volatile bool channel_spectrum_request_update { false }; + std::array channel_spectrum; + uint32_t channel_spectrum_sampling_rate { 0 }; + uint32_t channel_filter_pass_frequency { 0 }; + uint32_t channel_filter_stop_frequency { 0 }; + + void post_channel_stats_message(const ChannelStatistics statistics); + void post_channel_spectrum_message(const buffer_c16_t data); + void feed_audio_stats(const buffer_s16_t audio); + void post_audio_stats_message(const AudioStatistics statistics); +}; + +#endif/*__BASEBAND_PROCESSOR_H__*/ diff --git a/firmware/baseband/main.cpp b/firmware/baseband/main.cpp index 96101082d..fd7202d67 100755 --- a/firmware/baseband/main.cpp +++ b/firmware/baseband/main.cpp @@ -42,7 +42,6 @@ #include "dsp_decimate.hpp" #include "dsp_demodulate.hpp" -#include "dsp_fft.hpp" #include "dsp_fir_taps.hpp" #include "dsp_iir.hpp" #include "dsp_iir_config.hpp" @@ -50,12 +49,10 @@ #include "baseband_stats_collector.hpp" #include "rssi_stats_collector.hpp" -#include "channel_stats_collector.hpp" -#include "audio_stats_collector.hpp" #include "channel_decimator.hpp" +#include "baseband_processor.hpp" -#include "block_decimator.hpp" #include "clock_recovery.hpp" #include "access_code_correlator.hpp" #include "packet_builder.hpp" @@ -80,118 +77,6 @@ constexpr auto baseband_thread_priority = NORMALPRIO + 20; constexpr auto rssi_thread_priority = NORMALPRIO + 10; -class BasebandProcessor { -public: - virtual ~BasebandProcessor() = default; - - virtual void execute(buffer_c8_t buffer) = 0; - - void update_spectrum() { - // Called from idle thread (after EVT_MASK_SPECTRUM is flagged) - if( channel_spectrum_request_update ) { - /* Decimated buffer is full. Compute spectrum. */ - std::array, 256> samples_swapped; - fft_swap(channel_spectrum, samples_swapped); - channel_spectrum_request_update = false; - fft_c_preswapped(samples_swapped); - - 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); - } - } - -protected: - void feed_channel_stats(const buffer_c16_t channel) { - channel_stats.feed( - channel, - [this](const ChannelStatistics statistics) { - this->post_channel_stats_message(statistics); - } - ); - } - - void feed_channel_spectrum( - const buffer_c16_t channel, - const uint32_t filter_pass_frequency, - const uint32_t filter_stop_frequency - ) { - channel_filter_pass_frequency = filter_pass_frequency; - channel_filter_stop_frequency = filter_stop_frequency; - channel_spectrum_decimator.feed( - channel, - [this](const buffer_c16_t data) { - this->post_channel_spectrum_message(data); - } - ); - } - - void fill_audio_buffer(const buffer_s16_t audio) { - auto audio_buffer = audio::dma::tx_empty_buffer();; - for(size_t i=0; i channel_spectrum_decimator { 4 }; - - ChannelStatsCollector channel_stats; - ChannelStatisticsMessage channel_stats_message; - - AudioStatsCollector audio_stats; - AudioStatisticsMessage audio_stats_message; - - volatile bool channel_spectrum_request_update { false }; - std::array channel_spectrum; - uint32_t channel_spectrum_sampling_rate { 0 }; - uint32_t channel_filter_pass_frequency { 0 }; - uint32_t channel_filter_stop_frequency { 0 }; - - void post_channel_stats_message(const ChannelStatistics statistics) { - channel_stats_message.statistics = statistics; - shared_memory.application_queue.push(channel_stats_message); - } - - void post_channel_spectrum_message(const buffer_c16_t data) { - if( !channel_spectrum_request_update ) { - channel_spectrum_request_update = true; - std::copy(&data.p[0], &data.p[data.count], channel_spectrum.begin()); - channel_spectrum_sampling_rate = data.sampling_rate; - events_flag(EVT_MASK_SPECTRUM); - } - } - - void feed_audio_stats(const buffer_s16_t audio) { - audio_stats.feed( - audio, - [this](const AudioStatistics statistics) { - this->post_audio_stats_message(statistics); - } - ); - } - - void post_audio_stats_message(const AudioStatistics statistics) { - audio_stats_message.statistics = statistics; - shared_memory.application_queue.push(audio_stats_message); - } -}; - class NarrowbandAMAudio : public BasebandProcessor { public: void execute(buffer_c8_t buffer) override {