From 8dc2e6cacc6f9508d63936667c56cf688d4e23ab Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Fri, 14 Aug 2015 19:17:43 -0400 Subject: [PATCH 1/9] Move waterfall FFT processing to it's own thread. --- CMakeLists.txt | 2 + src/AppFrame.cpp | 45 +++++------------- src/AppFrame.h | 8 ++-- src/CubicSDR.cpp | 4 -- src/CubicSDR.h | 2 - src/process/FFTVisualDataThread.cpp | 68 +++++++++++++++++++++++++++ src/process/FFTVisualDataThread.h | 24 ++++++++++ src/process/SpectrumVisualProcessor.h | 5 +- src/visual/WaterfallCanvas.cpp | 14 ++---- src/visual/WaterfallCanvas.h | 1 - 10 files changed, 121 insertions(+), 52 deletions(-) create mode 100644 src/process/FFTVisualDataThread.cpp create mode 100644 src/process/FFTVisualDataThread.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 3697dfd..f7fa48b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -263,6 +263,7 @@ SET (cubicsdr_sources src/process/VisualProcessor.cpp src/process/ScopeVisualProcessor.cpp src/process/SpectrumVisualProcessor.cpp + src/process/FFTVisualDataThread.cpp src/ui/GLPanel.cpp external/rtaudio/RtAudio.cpp external/lodepng/lodepng.cpp @@ -316,6 +317,7 @@ SET (cubicsdr_headers src/process/VisualProcessor.h src/process/ScopeVisualProcessor.h src/process/SpectrumVisualProcessor.h + src/process/FFTVisualDataThread.h src/ui/GLPanel.h src/ui/UITestCanvas.cpp src/ui/UITestCanvas.h diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index 957651e..56ad675 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -133,15 +133,14 @@ AppFrame::AppFrame() : wxBoxSizer *wfSizer = new wxBoxSizer(wxHORIZONTAL); - wxGetApp().getWaterfallProcesor()->setup(2048); waterfallCanvas = new WaterfallCanvas(this, attribList); waterfallCanvas->setup(2048, 512); - - fftDistrib.setInput(wxGetApp().getWaterfallVisualQueue()); - fftDistrib.attachOutput(&fftQueue); - - wxGetApp().getWaterfallProcesor()->setInput(&fftQueue); - wxGetApp().getWaterfallProcesor()->attachOutput(waterfallCanvas->getVisualDataQueue()); + + waterfallDataThread = new FFTVisualDataThread(); + t_FFTData = new std::thread(&FFTVisualDataThread::threadMain, waterfallDataThread); + + waterfallDataThread->setInputQueue("IQDataInput", wxGetApp().getWaterfallVisualQueue()); + waterfallDataThread->setOutputQueue("FFTDataOutput", waterfallCanvas->getVisualDataQueue()); waterfallSpeedMeter = new MeterCanvas(this, attribList); waterfallSpeedMeter->setHelpTip("Waterfall speed, click or drag to adjust (max 1024 lines per second)"); @@ -376,7 +375,7 @@ AppFrame::AppFrame() : int wflps =wxGetApp().getConfig()->getWaterfallLinesPerSec(); waterfallSpeedMeter->setLevel(sqrt(wflps)); - fftDistrib.setLinesPerSecond(wflps); + waterfallDataThread->setLinesPerSecond(wflps); ThemeMgr::mgr.setTheme(wxGetApp().getConfig()->getTheme()); @@ -400,7 +399,8 @@ AppFrame::AppFrame() : } AppFrame::~AppFrame() { - + waterfallDataThread->terminate(); + t_FFTData->join(); } @@ -486,7 +486,7 @@ void AppFrame::OnMenu(wxCommandEvent& event) { waterfallCanvas->setCenterFrequency(wxGetApp().getFrequency()); spectrumCanvas->setBandwidth(wxGetApp().getSampleRate()); spectrumCanvas->setCenterFrequency(wxGetApp().getFrequency()); - fftDistrib.setLinesPerSecond(DEFAULT_WATERFALL_LPS); + waterfallDataThread->setLinesPerSecond(DEFAULT_WATERFALL_LPS); waterfallSpeedMeter->setLevel(sqrt(DEFAULT_WATERFALL_LPS)); wxGetApp().getSpectrumProcesor()->setFFTAverageRate(0.65); spectrumAvgMeter->setLevel(0.65); @@ -613,7 +613,7 @@ void AppFrame::OnClose(wxCloseEvent& event) { wxGetApp().getConfig()->setSnap(wxGetApp().getFrequencySnap()); wxGetApp().getConfig()->setCenterFreq(wxGetApp().getFrequency()); wxGetApp().getConfig()->setSpectrumAvgSpeed(wxGetApp().getSpectrumProcesor()->getFFTAverageRate()); - wxGetApp().getConfig()->setWaterfallLinesPerSec(fftDistrib.getLinesPerSecond()); + wxGetApp().getConfig()->setWaterfallLinesPerSec(waterfallDataThread->getLinesPerSecond()); wxGetApp().getConfig()->save(); event.Skip(); } @@ -766,42 +766,23 @@ void AppFrame::OnIdle(wxIdleEvent& event) { dproc->run(); - SpectrumVisualProcessor *wproc = wxGetApp().getWaterfallProcesor(); + SpectrumVisualProcessor *wproc = waterfallDataThread->getProcessor(); - int fftSize = wproc->getDesiredInputSize(); - - if (fftSize) { - fftDistrib.setFFTSize(fftSize); - } else { - fftDistrib.setFFTSize(DEFAULT_FFT_SIZE); - } - if (waterfallSpeedMeter->inputChanged()) { float val = waterfallSpeedMeter->getInputValue(); waterfallSpeedMeter->setLevel(val); - fftDistrib.setLinesPerSecond((int)ceil(val*val)); - wxGetApp().getWaterfallVisualQueue()->set_max_num_items((int)ceil(val*val)); - + waterfallDataThread->setLinesPerSecond((int)ceil(val*val)); GetStatusBar()->SetStatusText(wxString::Format(wxT("Waterfall max speed changed to %d lines per second."),(int)ceil(val*val))); } - fftDistrib.run(); - wproc->setView(waterfallCanvas->getViewState()); wproc->setBandwidth(waterfallCanvas->getBandwidth()); wproc->setCenterFrequency(waterfallCanvas->getCenterFrequency()); - while (!wproc->isInputEmpty()) { - wproc->run(); - } - waterfallCanvas->processInputQueue(); demodWaterfallCanvas->processInputQueue(); - if (this->IsVisible()) { - waterfallCanvas->DoPaint(); - demodWaterfallCanvas->DoPaint(); #ifdef __APPLE__ usleep(5000); #endif diff --git a/src/AppFrame.h b/src/AppFrame.h index 3531de5..42ea5e9 100644 --- a/src/AppFrame.h +++ b/src/AppFrame.h @@ -9,7 +9,8 @@ #include "MeterCanvas.h" #include "TuningCanvas.h" #include "ModeSelectorCanvas.h" -#include "UITestCanvas.h" +#include "FFTVisualDataThread.h" +//#include "UITestCanvas.h" #include @@ -94,8 +95,9 @@ private: std::string currentSessionFile; - FFTDataDistributor fftDistrib; - DemodulatorThreadInputQueue fftQueue; + FFTVisualDataThread *waterfallDataThread; + std::thread *t_FFTData; + wxDECLARE_EVENT_TABLE(); }; diff --git a/src/CubicSDR.cpp b/src/CubicSDR.cpp index 2283d57..b8cb515 100644 --- a/src/CubicSDR.cpp +++ b/src/CubicSDR.cpp @@ -282,10 +282,6 @@ SpectrumVisualProcessor *CubicSDR::getDemodSpectrumProcesor() { return &demodSpectrumProcessor; } -SpectrumVisualProcessor *CubicSDR::getWaterfallProcesor() { - return &waterfallProcessor; -} - VisualDataDistributor *CubicSDR::getSpectrumDistributor() { return &spectrumDistributor; } diff --git a/src/CubicSDR.h b/src/CubicSDR.h index 77dba79..9aaded6 100644 --- a/src/CubicSDR.h +++ b/src/CubicSDR.h @@ -58,7 +58,6 @@ public: ScopeVisualProcessor *getScopeProcessor(); SpectrumVisualProcessor *getSpectrumProcesor(); SpectrumVisualProcessor *getDemodSpectrumProcesor(); - SpectrumVisualProcessor *getWaterfallProcesor(); VisualDataDistributor *getSpectrumDistributor(); DemodulatorThreadOutputQueue* getAudioVisualQueue(); @@ -107,7 +106,6 @@ private: ScopeVisualProcessor scopeProcessor; SpectrumVisualProcessor spectrumProcessor; - SpectrumVisualProcessor waterfallProcessor; SpectrumVisualProcessor demodSpectrumProcessor; VisualDataDistributor spectrumDistributor; diff --git a/src/process/FFTVisualDataThread.cpp b/src/process/FFTVisualDataThread.cpp new file mode 100644 index 0000000..67f4549 --- /dev/null +++ b/src/process/FFTVisualDataThread.cpp @@ -0,0 +1,68 @@ +#include "FFTVisualDataThread.h" +#include "CubicSDR.h" + +FFTVisualDataThread::FFTVisualDataThread() : linesPerSecond(DEFAULT_WATERFALL_LPS) { + lpsChanged.store(true); +} + +FFTVisualDataThread::~FFTVisualDataThread() { + +} + +void FFTVisualDataThread::setLinesPerSecond(int lps) { + linesPerSecond.store(lps); + lpsChanged.store(true); +} + +int FFTVisualDataThread::getLinesPerSecond() { + return linesPerSecond.load(); +} + +SpectrumVisualProcessor *FFTVisualDataThread::getProcessor() { + return &wproc; +} + +void FFTVisualDataThread::run() { + DemodulatorThreadInputQueue *pipeIQDataIn = (DemodulatorThreadInputQueue *)getInputQueue("IQDataInput"); + SpectrumVisualDataQueue *pipeFFTDataOut = (SpectrumVisualDataQueue *)getOutputQueue("FFTDataOutput"); + + fftDistrib.setInput(pipeIQDataIn); + fftDistrib.attachOutput(&fftQueue); + wproc.setInput(&fftQueue); + wproc.attachOutput(pipeFFTDataOut); + wproc.setup(2048); + + std::cout << "FFT visual data thread started." << std::endl; + + while(!terminated) { + +#ifndef _WIN32 + usleep(15000); +#else + Sleep(15); +#endif + + int fftSize = wproc.getDesiredInputSize(); + + if (fftSize) { + fftDistrib.setFFTSize(fftSize); + } else { + fftDistrib.setFFTSize(DEFAULT_FFT_SIZE); + } + + if (lpsChanged.load()) { + fftDistrib.setLinesPerSecond(linesPerSecond.load()); + pipeIQDataIn->set_max_num_items(linesPerSecond.load()); + lpsChanged.store(false); + } + + fftDistrib.run(); + + while (!wproc.isInputEmpty()) { + wproc.run(); + } + } + + std::cout << "FFT visual data thread terminated." << std::endl; +} + diff --git a/src/process/FFTVisualDataThread.h b/src/process/FFTVisualDataThread.h new file mode 100644 index 0000000..a08cd4d --- /dev/null +++ b/src/process/FFTVisualDataThread.h @@ -0,0 +1,24 @@ +#pragma once + +#include "IOThread.h" +#include "SpectrumVisualProcessor.h" + +class FFTVisualDataThread : public IOThread { +public: + FFTVisualDataThread(); + ~FFTVisualDataThread(); + + void setLinesPerSecond(int lps); + int getLinesPerSecond(); + SpectrumVisualProcessor *getProcessor(); + + void run(); + +protected: + FFTDataDistributor fftDistrib; + DemodulatorThreadInputQueue fftQueue; + SpectrumVisualProcessor wproc; + + std::atomic_int linesPerSecond; + std::atomic_bool lpsChanged; +}; diff --git a/src/process/SpectrumVisualProcessor.h b/src/process/SpectrumVisualProcessor.h index fd7f013..8e1e694 100644 --- a/src/process/SpectrumVisualProcessor.h +++ b/src/process/SpectrumVisualProcessor.h @@ -111,7 +111,10 @@ protected: if (inp) { if (inp->data.size() >= fftSize) { - for (int i = 0, iMax = inp->data.size()-fftSize; i <= iMax; i += fftSize) { + if (lineRateAccum + (lineRateStep * floor((double)inp->data.size()/(double)fftSize)) < 1.0) { + // move along, nothing to see here.. + lineRateAccum += (lineRateStep * inp->data.size()/fftSize); + } else for (int i = 0, iMax = inp->data.size()-fftSize; i <= iMax; i += fftSize) { lineRateAccum += lineRateStep; if (lineRateAccum >= 1.0) { diff --git a/src/visual/WaterfallCanvas.cpp b/src/visual/WaterfallCanvas.cpp index 00bc773..8ec1c2d 100644 --- a/src/visual/WaterfallCanvas.cpp +++ b/src/visual/WaterfallCanvas.cpp @@ -88,12 +88,8 @@ void WaterfallCanvas::processInputQueue() { } void WaterfallCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) { -// event.Skip(); -} - -void WaterfallCanvas::DoPaint() { - wxClientDC dc(this); - // wxPaintDC dc(this); +// wxClientDC dc(this); + wxPaintDC dc(this); const wxSize ClientSize = GetClientSize(); long double currentZoom = zoom; @@ -359,9 +355,9 @@ void WaterfallCanvas::OnKeyDown(wxKeyEvent& event) { } } void WaterfallCanvas::OnIdle(wxIdleEvent &event) { -// Refresh(); -// event.RequestMore(); - event.Skip(); + Refresh(); + event.RequestMore(); +// event.Skip(); } void WaterfallCanvas::OnMouseMoved(wxMouseEvent& event) { diff --git a/src/visual/WaterfallCanvas.h b/src/visual/WaterfallCanvas.h index 1b59e35..2f51ec3 100644 --- a/src/visual/WaterfallCanvas.h +++ b/src/visual/WaterfallCanvas.h @@ -28,7 +28,6 @@ public: void attachSpectrumCanvas(SpectrumCanvas *canvas_in); void processInputQueue(); SpectrumVisualDataQueue *getVisualDataQueue(); - void DoPaint(); private: void OnPaint(wxPaintEvent& event); From 8c7d2576ad9af728c05f087dad455312f593f13c Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Fri, 14 Aug 2015 20:19:37 -0400 Subject: [PATCH 2/9] Update frequency dialog to support bandwidth entry --- src/CubicSDR.cpp | 22 ++++++++++++++++--- src/CubicSDR.h | 3 ++- src/FrequencyDialog.cpp | 42 +++++++++++++++++++++++++------------ src/FrequencyDialog.h | 6 ++++-- src/visual/TuningCanvas.cpp | 8 +++++-- 5 files changed, 60 insertions(+), 21 deletions(-) diff --git a/src/CubicSDR.cpp b/src/CubicSDR.cpp index b8cb515..f9bff43 100644 --- a/src/CubicSDR.cpp +++ b/src/CubicSDR.cpp @@ -13,7 +13,6 @@ #endif #include "CubicSDR.h" -#include "FrequencyDialog.h" #ifdef _OSX_APP_ #include "CoreFoundation/CoreFoundation.h" @@ -389,8 +388,25 @@ int CubicSDR::getPPM() { } -void CubicSDR::showFrequencyInput() { - FrequencyDialog fdialog(appframe, -1, demodMgr.getActiveDemodulator()?_("Set Demodulator Frequency"):_("Set Center Frequency"), demodMgr.getActiveDemodulator(), wxPoint(-100,-100), wxSize(320, 75 )); +void CubicSDR::showFrequencyInput(FrequencyDialog::FrequencyDialogTarget targetMode) { + const wxString demodTitle("Set Demodulator Frequency"); + const wxString freqTitle("Set Center Frequency"); + const wxString bwTitle("Set Demodulator Bandwidth"); + + wxString title; + + switch (targetMode) { + case FrequencyDialog::FDIALOG_TARGET_DEFAULT: + title = demodMgr.getActiveDemodulator()?demodTitle:freqTitle; + break; + case FrequencyDialog::FDIALOG_TARGET_BANDWIDTH: + title = bwTitle; + break; + default: + break; + } + + FrequencyDialog fdialog(appframe, -1, title, demodMgr.getActiveDemodulator(), wxPoint(-100,-100), wxSize(320, 75 ), wxDEFAULT_DIALOG_STYLE, targetMode); fdialog.ShowModal(); } diff --git a/src/CubicSDR.h b/src/CubicSDR.h index 9aaded6..015b629 100644 --- a/src/CubicSDR.h +++ b/src/CubicSDR.h @@ -16,6 +16,7 @@ #include "DemodulatorMgr.h" #include "AppConfig.h" #include "AppFrame.h" +#include "FrequencyDialog.h" #include "ScopeVisualProcessor.h" #include "SpectrumVisualProcessor.h" @@ -77,7 +78,7 @@ public: void setPPM(int ppm_in); int getPPM(); - void showFrequencyInput(); + void showFrequencyInput(FrequencyDialog::FrequencyDialogTarget targetMode = FrequencyDialog::FDIALOG_TARGET_DEFAULT); private: AppFrame *appframe; diff --git a/src/FrequencyDialog.cpp b/src/FrequencyDialog.cpp index 712739e..bed49cd 100644 --- a/src/FrequencyDialog.cpp +++ b/src/FrequencyDialog.cpp @@ -10,15 +10,22 @@ EVT_CHAR_HOOK(FrequencyDialog::OnChar) wxEND_EVENT_TABLE() FrequencyDialog::FrequencyDialog(wxWindow * parent, wxWindowID id, const wxString & title, DemodulatorInstance *demod, const wxPoint & position, - const wxSize & size, long style) : + const wxSize & size, long style, FrequencyDialogTarget targetMode) : wxDialog(parent, id, title, position, size, style) { wxString freqStr; activeDemod = demod; + this->targetMode = targetMode; - if (activeDemod) { - freqStr = frequencyToStr(activeDemod->getFrequency()); - } else { - freqStr = frequencyToStr(wxGetApp().getFrequency()); + if (targetMode == FDIALOG_TARGET_DEFAULT) { + if (activeDemod) { + freqStr = frequencyToStr(activeDemod->getFrequency()); + } else { + freqStr = frequencyToStr(wxGetApp().getFrequency()); + } + } + + if (targetMode == FDIALOG_TARGET_BANDWIDTH) { + freqStr = frequencyToStr(wxGetApp().getDemodMgr().getLastBandwidth()); } dialogText = new wxTextCtrl(this, wxID_FREQ_INPUT, freqStr, wxPoint(6, 1), wxSize(size.GetWidth() - 20, size.GetHeight() - 70), @@ -109,14 +116,23 @@ void FrequencyDialog::OnChar(wxKeyEvent& event) { case WXK_NUMPAD_ENTER: // Do Stuff freq = strToFrequency(dialogText->GetValue().ToStdString()); - if (activeDemod) { - activeDemod->setTracking(true); - activeDemod->setFollow(true); - activeDemod->setFrequency(freq); - activeDemod->updateLabel(freq); - } else { - wxGetApp().setFrequency(freq); - } + if (targetMode == FDIALOG_TARGET_DEFAULT) { + if (activeDemod) { + activeDemod->setTracking(true); + activeDemod->setFollow(true); + activeDemod->setFrequency(freq); + activeDemod->updateLabel(freq); + } else { + wxGetApp().setFrequency(freq); + } + } + if (targetMode == FDIALOG_TARGET_BANDWIDTH) { + if (activeDemod) { + activeDemod->setBandwidth(freq); + } else { + wxGetApp().getDemodMgr().setLastBandwidth(freq); + } + } Close(); break; case WXK_ESCAPE: diff --git a/src/FrequencyDialog.h b/src/FrequencyDialog.h index 42ad7b0..4f2b931 100644 --- a/src/FrequencyDialog.h +++ b/src/FrequencyDialog.h @@ -11,12 +11,13 @@ class FrequencyDialog: public wxDialog { public: - + typedef enum FrequencyDialogTarget { FDIALOG_TARGET_DEFAULT, FDIALOG_TARGET_CENTERFREQ, FDIALOG_TARGET_FREQ, FDIALOG_TARGET_BANDWIDTH } FrequencyDialogTarget; FrequencyDialog ( wxWindow * parent, wxWindowID id, const wxString & title, DemodulatorInstance *demod = NULL, const wxPoint & pos = wxDefaultPosition, const wxSize & size = wxDefaultSize, - long style = wxDEFAULT_DIALOG_STYLE ); + long style = wxDEFAULT_DIALOG_STYLE, + FrequencyDialogTarget targetMode = FDIALOG_TARGET_DEFAULT); wxTextCtrl * dialogText; @@ -28,5 +29,6 @@ private: void OnEnter ( wxCommandEvent &event ); void OnChar ( wxKeyEvent &event ); std::string& filterChars(std::string& s, const std::string& allowed); + FrequencyDialogTarget targetMode; DECLARE_EVENT_TABLE() }; diff --git a/src/visual/TuningCanvas.cpp b/src/visual/TuningCanvas.cpp index 8a85ac4..6ac2e9b 100644 --- a/src/visual/TuningCanvas.cpp +++ b/src/visual/TuningCanvas.cpp @@ -407,8 +407,12 @@ void TuningCanvas::setHelpTip(std::string tip) { void TuningCanvas::OnKeyDown(wxKeyEvent& event) { InteractiveCanvas::OnKeyDown(event); - if (event.GetKeyCode() == WXK_SPACE && (hoverState == TUNING_HOVER_CENTER || hoverState == TUNING_HOVER_FREQ)) { - wxGetApp().showFrequencyInput(); + if (event.GetKeyCode() == WXK_SPACE) { + if (hoverState == TUNING_HOVER_CENTER || hoverState == TUNING_HOVER_FREQ) { + wxGetApp().showFrequencyInput(FrequencyDialog::FDIALOG_TARGET_DEFAULT); + } else if (hoverState == TUNING_HOVER_BW) { + wxGetApp().showFrequencyInput(FrequencyDialog::FDIALOG_TARGET_BANDWIDTH); + } } } From 9c1d9f57980a0257be95b944e0f99b77c3fc5fed Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Fri, 14 Aug 2015 20:41:52 -0400 Subject: [PATCH 3/9] IsVisible is *not* for app visibility; Hello there, IsActive() --- src/AppFrame.cpp | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index 56ad675..7799cfd 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -782,15 +782,11 @@ void AppFrame::OnIdle(wxIdleEvent& event) { waterfallCanvas->processInputQueue(); demodWaterfallCanvas->processInputQueue(); - if (this->IsVisible()) { -#ifdef __APPLE__ - usleep(5000); -#endif - } else { + if (!this->IsActive()) { #ifndef _WIN32 - usleep(15000); + usleep(50000); #else - Sleep(15); + Sleep(50); #endif } From 89332d03b8dea3fbce3af0c6393fd59104d65de1 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Fri, 14 Aug 2015 20:54:18 -0400 Subject: [PATCH 4/9] too much delay.. --- src/AppFrame.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index 7799cfd..d737ca0 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -784,9 +784,9 @@ void AppFrame::OnIdle(wxIdleEvent& event) { if (!this->IsActive()) { #ifndef _WIN32 - usleep(50000); + usleep(25000); #else - Sleep(50); + Sleep(25); #endif } From 22ed3d3b275f481abb66f2fe98ee2f8985d4c4f0 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Fri, 14 Aug 2015 21:20:07 -0400 Subject: [PATCH 5/9] Unify sleepy code to std::thread sleep --- src/AppFrame.cpp | 6 +----- src/process/FFTVisualDataThread.cpp | 6 +----- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index d737ca0..af93aae 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -783,11 +783,7 @@ void AppFrame::OnIdle(wxIdleEvent& event) { demodWaterfallCanvas->processInputQueue(); if (!this->IsActive()) { -#ifndef _WIN32 - usleep(25000); -#else - Sleep(25); -#endif + std::this_thread::sleep_for(std::chrono::milliseconds(25)); } event.RequestMore(); diff --git a/src/process/FFTVisualDataThread.cpp b/src/process/FFTVisualDataThread.cpp index 67f4549..df5a9bf 100644 --- a/src/process/FFTVisualDataThread.cpp +++ b/src/process/FFTVisualDataThread.cpp @@ -36,11 +36,7 @@ void FFTVisualDataThread::run() { while(!terminated) { -#ifndef _WIN32 - usleep(15000); -#else - Sleep(15); -#endif + std::this_thread::sleep_for(std::chrono::milliseconds(15)); int fftSize = wproc.getDesiredInputSize(); From e98088159c7ee32175cfb15dd6f3a03ee7bef80a Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Fri, 14 Aug 2015 21:23:58 -0400 Subject: [PATCH 6/9] FFTVisualDataThread sleep adjustment --- src/process/FFTVisualDataThread.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/process/FFTVisualDataThread.cpp b/src/process/FFTVisualDataThread.cpp index df5a9bf..f4eabfb 100644 --- a/src/process/FFTVisualDataThread.cpp +++ b/src/process/FFTVisualDataThread.cpp @@ -36,7 +36,7 @@ void FFTVisualDataThread::run() { while(!terminated) { - std::this_thread::sleep_for(std::chrono::milliseconds(15)); + std::this_thread::sleep_for(std::chrono::milliseconds(12)); int fftSize = wproc.getDesiredInputSize(); From 4cc4c151fab8eb7a7e5c6749385e25cb1ea0cc80 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Fri, 14 Aug 2015 21:28:43 -0400 Subject: [PATCH 7/9] Reduce log noise, run an old version to show if need be.. --- src/util/GLExt.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/util/GLExt.cpp b/src/util/GLExt.cpp index eb1e7d6..88785a9 100644 --- a/src/util/GLExt.cpp +++ b/src/util/GLExt.cpp @@ -32,9 +32,8 @@ void initGLExtensions() { return; } - const GLubyte *extensions = glGetString(GL_EXTENSIONS); - - std::cout << std::endl << "Supported GL Extensions: " << std::endl << extensions << std::endl << std::endl; +// const GLubyte *extensions = glGetString(GL_EXTENSIONS); +// std::cout << std::endl << "Supported GL Extensions: " << std::endl << extensions << std::endl << std::endl; #ifdef __linux__ const GLint interval = 2; From b41d0a361314f1f05571466f2af717e889238eba Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Fri, 14 Aug 2015 21:32:58 -0400 Subject: [PATCH 8/9] Update tuner bandwidth help tip --- src/visual/TuningCanvas.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/visual/TuningCanvas.cpp b/src/visual/TuningCanvas.cpp index 6ac2e9b..b6fa267 100644 --- a/src/visual/TuningCanvas.cpp +++ b/src/visual/TuningCanvas.cpp @@ -297,7 +297,7 @@ void TuningCanvas::OnMouseMoved(wxMouseEvent& event) { setStatusText("Click, wheel or drag a digit to change frequency; SPACE for direct input. Right click to set/clear snap. Hold ALT to change PPM. Hold SHIFT to disable carry."); break; case TUNING_HOVER_BW: - setStatusText("Click, wheel or drag a digit to change bandwidth. Hold SHIFT to disable carry."); + setStatusText("Click, wheel or drag a digit to change bandwidth; SPACE for direct input. Hold SHIFT to disable carry."); break; case TUNING_HOVER_CENTER: setStatusText("Click, wheel or drag a digit to change center frequency; SPACE for direct input. Hold SHIFT to disable carry."); From 91a6e45ed38d3ed093dc0d7cb0738920d92f441c Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Fri, 14 Aug 2015 21:36:31 -0400 Subject: [PATCH 9/9] Fix spectrum visual failure below 1% averaging speed --- src/AppFrame.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index af93aae..8c05eeb 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -746,6 +746,9 @@ void AppFrame::OnIdle(wxIdleEvent& event) { if (spectrumAvgMeter->inputChanged()) { float val = spectrumAvgMeter->getInputValue(); + if (val < 0.01) { + val = 0.01; + } spectrumAvgMeter->setLevel(val); proc->setFFTAverageRate(val);