From d1ed603ff06b1f2aa2ef8406196a7f48b73a5a38 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Sun, 16 Aug 2015 18:12:12 -0400 Subject: [PATCH] Move demodulator and main spectrum visual processors to threads --- CMakeLists.txt | 2 ++ src/AppFrame.cpp | 28 ++++++++++---------- src/CubicSDR.cpp | 33 ++++++++++++++++++------ src/CubicSDR.h | 13 ++++++---- src/process/FFTVisualDataThread.cpp | 2 +- src/process/SpectrumVisualDataThread.cpp | 25 ++++++++++++++++++ src/process/SpectrumVisualDataThread.h | 16 ++++++++++++ 7 files changed, 91 insertions(+), 28 deletions(-) create mode 100644 src/process/SpectrumVisualDataThread.cpp create mode 100644 src/process/SpectrumVisualDataThread.h diff --git a/CMakeLists.txt b/CMakeLists.txt index f7fa48b..9ddee92 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -264,6 +264,7 @@ SET (cubicsdr_sources src/process/ScopeVisualProcessor.cpp src/process/SpectrumVisualProcessor.cpp src/process/FFTVisualDataThread.cpp + src/process/SpectrumVisualDataThread.cpp src/ui/GLPanel.cpp external/rtaudio/RtAudio.cpp external/lodepng/lodepng.cpp @@ -318,6 +319,7 @@ SET (cubicsdr_headers src/process/ScopeVisualProcessor.h src/process/SpectrumVisualProcessor.h src/process/FFTVisualDataThread.h + src/process/SpectrumVisualDataThread.h src/ui/GLPanel.h src/ui/UITestCanvas.cpp src/ui/UITestCanvas.h diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index 8c05eeb..608400b 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -62,11 +62,11 @@ AppFrame::AppFrame() : demodModeSelector->setHelpTip("Choose modulation type: Frequency Modulation, Amplitude Modulation and Lower, Upper or Double Side-Band."); demodTray->Add(demodModeSelector, 2, wxEXPAND | wxALL, 0); - wxGetApp().getDemodSpectrumProcesor()->setup(1024); + wxGetApp().getDemodSpectrumProcessor()->setup(1024); demodSpectrumCanvas = new SpectrumCanvas(this, attribList); demodSpectrumCanvas->setView(wxGetApp().getConfig()->getCenterFreq(), 300000); demodVisuals->Add(demodSpectrumCanvas, 3, wxEXPAND | wxALL, 0); - wxGetApp().getDemodSpectrumProcesor()->attachOutput(demodSpectrumCanvas->getVisualDataQueue()); + wxGetApp().getDemodSpectrumProcessor()->attachOutput(demodSpectrumCanvas->getVisualDataQueue()); demodVisuals->AddSpacer(1); @@ -76,7 +76,7 @@ AppFrame::AppFrame() : demodWaterfallCanvas->attachSpectrumCanvas(demodSpectrumCanvas); demodSpectrumCanvas->attachWaterfallCanvas(demodWaterfallCanvas); demodVisuals->Add(demodWaterfallCanvas, 6, wxEXPAND | wxALL, 0); - wxGetApp().getDemodSpectrumProcesor()->attachOutput(demodWaterfallCanvas->getVisualDataQueue()); + wxGetApp().getDemodSpectrumProcessor()->attachOutput(demodWaterfallCanvas->getVisualDataQueue()); demodTray->Add(demodVisuals, 30, wxEXPAND | wxALL, 0); @@ -113,9 +113,9 @@ AppFrame::AppFrame() : vbox->AddSpacer(1); wxBoxSizer *spectrumSizer = new wxBoxSizer(wxHORIZONTAL); - wxGetApp().getSpectrumProcesor()->setup(2048); + wxGetApp().getSpectrumProcessor()->setup(2048); spectrumCanvas = new SpectrumCanvas(this, attribList); - wxGetApp().getSpectrumProcesor()->attachOutput(spectrumCanvas->getVisualDataQueue()); + wxGetApp().getSpectrumProcessor()->attachOutput(spectrumCanvas->getVisualDataQueue()); spectrumAvgMeter = new MeterCanvas(this, attribList); spectrumAvgMeter->setHelpTip("Spectrum averaging speed, click or drag to adjust."); @@ -370,7 +370,7 @@ AppFrame::AppFrame() : float spectrumAvg = wxGetApp().getConfig()->getSpectrumAvgSpeed(); spectrumAvgMeter->setLevel(spectrumAvg); - wxGetApp().getSpectrumProcesor()->setFFTAverageRate(spectrumAvg); + wxGetApp().getSpectrumProcessor()->setFFTAverageRate(spectrumAvg); int wflps =wxGetApp().getConfig()->getWaterfallLinesPerSec(); @@ -488,7 +488,7 @@ void AppFrame::OnMenu(wxCommandEvent& event) { spectrumCanvas->setCenterFrequency(wxGetApp().getFrequency()); waterfallDataThread->setLinesPerSecond(DEFAULT_WATERFALL_LPS); waterfallSpeedMeter->setLevel(sqrt(DEFAULT_WATERFALL_LPS)); - wxGetApp().getSpectrumProcesor()->setFFTAverageRate(0.65); + wxGetApp().getSpectrumProcessor()->setFFTAverageRate(0.65); spectrumAvgMeter->setLevel(0.65); demodModeSelector->Refresh(); demodTuner->Refresh(); @@ -607,12 +607,16 @@ void AppFrame::OnMenu(wxCommandEvent& event) { } void AppFrame::OnClose(wxCloseEvent& event) { + wxGetApp().getDemodSpectrumProcessor()->removeOutput(demodSpectrumCanvas->getVisualDataQueue()); + wxGetApp().getDemodSpectrumProcessor()->removeOutput(demodWaterfallCanvas->getVisualDataQueue()); + wxGetApp().getSpectrumProcessor()->removeOutput(spectrumCanvas->getVisualDataQueue()); + wxGetApp().getConfig()->setWindow(this->GetPosition(), this->GetClientSize()); wxGetApp().getConfig()->setWindowMaximized(this->IsMaximized()); wxGetApp().getConfig()->setTheme(ThemeMgr::mgr.getTheme()); wxGetApp().getConfig()->setSnap(wxGetApp().getFrequencySnap()); wxGetApp().getConfig()->setCenterFreq(wxGetApp().getFrequency()); - wxGetApp().getConfig()->setSpectrumAvgSpeed(wxGetApp().getSpectrumProcesor()->getFFTAverageRate()); + wxGetApp().getConfig()->setSpectrumAvgSpeed(wxGetApp().getSpectrumProcessor()->getFFTAverageRate()); wxGetApp().getConfig()->setWaterfallLinesPerSec(waterfallDataThread->getLinesPerSecond()); wxGetApp().getConfig()->save(); event.Skip(); @@ -742,7 +746,7 @@ void AppFrame::OnIdle(wxIdleEvent& event) { wxGetApp().getScopeProcessor()->run(); wxGetApp().getSpectrumDistributor()->run(); - SpectrumVisualProcessor *proc = wxGetApp().getSpectrumProcesor(); + SpectrumVisualProcessor *proc = wxGetApp().getSpectrumProcessor(); if (spectrumAvgMeter->inputChanged()) { float val = spectrumAvgMeter->getInputValue(); @@ -759,15 +763,11 @@ void AppFrame::OnIdle(wxIdleEvent& event) { proc->setBandwidth(spectrumCanvas->getBandwidth()); proc->setCenterFrequency(spectrumCanvas->getCenterFrequency()); - proc->run(); - - SpectrumVisualProcessor *dproc = wxGetApp().getDemodSpectrumProcesor(); + SpectrumVisualProcessor *dproc = wxGetApp().getDemodSpectrumProcessor(); dproc->setView(demodWaterfallCanvas->getViewState()); dproc->setBandwidth(demodWaterfallCanvas->getBandwidth()); dproc->setCenterFrequency(demodWaterfallCanvas->getCenterFrequency()); - - dproc->run(); SpectrumVisualProcessor *wproc = waterfallDataThread->getProcessor(); diff --git a/src/CubicSDR.cpp b/src/CubicSDR.cpp index f9bff43..769f9c5 100644 --- a/src/CubicSDR.cpp +++ b/src/CubicSDR.cpp @@ -21,7 +21,7 @@ IMPLEMENT_APP(CubicSDR) CubicSDR::CubicSDR() : appframe(NULL), m_glContext(NULL), frequency(0), offset(0), ppm(0), snap(1), sampleRate(DEFAULT_SAMPLE_RATE), directSamplingMode(0), - sdrThread(NULL), sdrPostThread(NULL), pipeSDRCommand(NULL), pipeSDRIQData(NULL), pipeIQVisualData(NULL), pipeAudioVisualData(NULL), t_SDR(NULL), t_PostSDR(NULL) { + sdrThread(NULL), sdrPostThread(NULL), spectrumVisualThread(NULL), demodVisualThread(NULL), pipeSDRCommand(NULL), pipeSDRIQData(NULL), pipeIQVisualData(NULL), pipeAudioVisualData(NULL), t_SDR(NULL), t_PostSDR(NULL) { } @@ -51,6 +51,9 @@ bool CubicSDR::OnInit() { directSamplingMode = 0; // Visual Data + spectrumVisualThread = new SpectrumVisualDataThread(); + demodVisualThread = new SpectrumVisualDataThread(); + pipeIQVisualData = new DemodulatorThreadInputQueue(); pipeIQVisualData->set_max_num_items(1); @@ -68,8 +71,8 @@ bool CubicSDR::OnInit() { spectrumDistributor.attachOutput(pipeDemodIQVisualData); spectrumDistributor.attachOutput(pipeSpectrumIQVisualData); - demodSpectrumProcessor.setInput(pipeDemodIQVisualData); - spectrumProcessor.setInput(pipeSpectrumIQVisualData); + getDemodSpectrumProcessor()->setInput(pipeDemodIQVisualData); + getSpectrumProcessor()->setInput(pipeSpectrumIQVisualData); pipeAudioVisualData = new DemodulatorThreadOutputQueue(); pipeAudioVisualData->set_max_num_items(1); @@ -80,7 +83,7 @@ bool CubicSDR::OnInit() { pipeSDRIQData = new SDRThreadIQDataQueue(); pipeSDRCommand = new SDRThreadCommandQueue(); - pipeSDRIQData->set_max_num_items(1); + pipeSDRIQData->set_max_num_items(100); sdrThread = new SDRThread(); sdrThread->setInputQueue("SDRCommandQueue",pipeSDRCommand); @@ -134,6 +137,8 @@ bool CubicSDR::OnInit() { t_PostSDR = new std::thread(&SDRPostThread::threadMain, sdrPostThread); t_SDR = new std::thread(&SDRThread::threadMain, sdrThread); + t_SpectrumVisual = new std::thread(&SpectrumVisualDataThread::threadMain, spectrumVisualThread); + t_DemodVisual = new std::thread(&SpectrumVisualDataThread::threadMain, demodVisualThread); appframe = new AppFrame(); if (dev != NULL) { @@ -167,6 +172,13 @@ int CubicSDR::OnExit() { std::cout << "Terminating SDR post-processing thread.." << std::endl; sdrPostThread->terminate(); t_PostSDR->join(); + + std::cout << "Terminating Visual Processor threads.." << std::endl; + spectrumVisualThread->terminate(); + t_SpectrumVisual->join(); + + demodVisualThread->terminate(); + t_DemodVisual->join(); delete sdrThread; delete t_SDR; @@ -174,6 +186,11 @@ int CubicSDR::OnExit() { delete sdrPostThread; delete t_PostSDR; + delete t_SpectrumVisual; + delete spectrumVisualThread; + delete t_DemodVisual; + delete demodVisualThread; + delete pipeSDRCommand; delete pipeIQVisualData; @@ -273,12 +290,12 @@ ScopeVisualProcessor *CubicSDR::getScopeProcessor() { return &scopeProcessor; } -SpectrumVisualProcessor *CubicSDR::getSpectrumProcesor() { - return &spectrumProcessor; +SpectrumVisualProcessor *CubicSDR::getSpectrumProcessor() { + return spectrumVisualThread->getProcessor(); } -SpectrumVisualProcessor *CubicSDR::getDemodSpectrumProcesor() { - return &demodSpectrumProcessor; +SpectrumVisualProcessor *CubicSDR::getDemodSpectrumProcessor() { + return demodVisualThread->getProcessor(); } VisualDataDistributor *CubicSDR::getSpectrumDistributor() { diff --git a/src/CubicSDR.h b/src/CubicSDR.h index 015b629..a1d4aec 100644 --- a/src/CubicSDR.h +++ b/src/CubicSDR.h @@ -20,6 +20,7 @@ #include "ScopeVisualProcessor.h" #include "SpectrumVisualProcessor.h" +#include "SpectrumVisualDataThread.h" #include @@ -57,8 +58,8 @@ public: int getDevice(); ScopeVisualProcessor *getScopeProcessor(); - SpectrumVisualProcessor *getSpectrumProcesor(); - SpectrumVisualProcessor *getDemodSpectrumProcesor(); + SpectrumVisualProcessor *getSpectrumProcessor(); + SpectrumVisualProcessor *getDemodSpectrumProcessor(); VisualDataDistributor *getSpectrumDistributor(); DemodulatorThreadOutputQueue* getAudioVisualQueue(); @@ -96,6 +97,8 @@ private: SDRThread *sdrThread; SDRPostThread *sdrPostThread; + SpectrumVisualDataThread *spectrumVisualThread; + SpectrumVisualDataThread *demodVisualThread; SDRThreadCommandQueue* pipeSDRCommand; SDRThreadIQDataQueue* pipeSDRIQData; @@ -106,13 +109,13 @@ private: DemodulatorThreadInputQueue* pipeWaterfallIQVisualData; ScopeVisualProcessor scopeProcessor; - SpectrumVisualProcessor spectrumProcessor; - SpectrumVisualProcessor demodSpectrumProcessor; VisualDataDistributor spectrumDistributor; - + std::thread *t_SDR; std::thread *t_PostSDR; + std::thread *t_SpectrumVisual; + std::thread *t_DemodVisual; }; static const wxCmdLineEntryDesc commandLineInfo [] = diff --git a/src/process/FFTVisualDataThread.cpp b/src/process/FFTVisualDataThread.cpp index f4eabfb..0e92dbb 100644 --- a/src/process/FFTVisualDataThread.cpp +++ b/src/process/FFTVisualDataThread.cpp @@ -59,6 +59,6 @@ void FFTVisualDataThread::run() { } } - std::cout << "FFT visual data thread terminated." << std::endl; + std::cout << "FFT visual data thread done." << std::endl; } diff --git a/src/process/SpectrumVisualDataThread.cpp b/src/process/SpectrumVisualDataThread.cpp new file mode 100644 index 0000000..cd737f4 --- /dev/null +++ b/src/process/SpectrumVisualDataThread.cpp @@ -0,0 +1,25 @@ +#include "SpectrumVisualDataThread.h" +#include "CubicSDR.h" + +SpectrumVisualDataThread::SpectrumVisualDataThread() { +} + +SpectrumVisualDataThread::~SpectrumVisualDataThread() { + +} + +SpectrumVisualProcessor *SpectrumVisualDataThread::getProcessor() { + return &sproc; +} + +void SpectrumVisualDataThread::run() { + std::cout << "Spectrum visual data thread started." << std::endl; + + while(!terminated) { + std::this_thread::sleep_for(std::chrono::milliseconds(12)); + sproc.run(); + } + + std::cout << "Spectrum visual data thread done." << std::endl; +} + diff --git a/src/process/SpectrumVisualDataThread.h b/src/process/SpectrumVisualDataThread.h new file mode 100644 index 0000000..017b519 --- /dev/null +++ b/src/process/SpectrumVisualDataThread.h @@ -0,0 +1,16 @@ +#pragma once + +#include "IOThread.h" +#include "SpectrumVisualProcessor.h" + +class SpectrumVisualDataThread : public IOThread { +public: + SpectrumVisualDataThread(); + ~SpectrumVisualDataThread(); + SpectrumVisualProcessor *getProcessor(); + + void run(); + +protected: + SpectrumVisualProcessor sproc; +};