From 8589a39f66294360bc0d979a7da518ef60682645 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Thu, 23 Apr 2015 19:38:44 -0400 Subject: [PATCH] Simple active demod tracking, helptip updates. --- src/AppFrame.cpp | 20 +++++++++ src/demod/DemodulatorInstance.cpp | 11 +++++ src/demod/DemodulatorInstance.h | 4 +- src/sdr/SDRPostThread.cpp | 2 +- src/visual/SpectrumCanvas.cpp | 73 ++++++++++++++++--------------- src/visual/SpectrumCanvas.h | 2 + src/visual/TuningCanvas.cpp | 11 ++--- src/visual/WaterfallCanvas.cpp | 1 + 8 files changed, 82 insertions(+), 42 deletions(-) diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index be63f76..b783f32 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -446,6 +446,26 @@ void AppFrame::OnIdle(wxIdleEvent& event) { DemodulatorInstance *demod = wxGetApp().getDemodMgr().getLastActiveDemodulator(); if (demod) { + DemodulatorInstance *demod = wxGetApp().getDemodMgr().getLastActiveDemodulator(); + + if (demod->isTracking()) { + if (spectrumCanvas->getViewState()) { + long long diff = abs(demod->getFrequency() - spectrumCanvas->getCenterFrequency()) + (demod->getBandwidth()/2) + (demod->getBandwidth()/4); + + if (diff > spectrumCanvas->getBandwidth()/2) { + if (demod->getBandwidth() > spectrumCanvas->getBandwidth()) { + diff = abs(demod->getFrequency() - spectrumCanvas->getCenterFrequency()); + } else { + diff = diff - spectrumCanvas->getBandwidth()/2; + } + spectrumCanvas->moveCenterFrequency((demod->getFrequency() < spectrumCanvas->getCenterFrequency())?diff:-diff); + demod->setTracking(false); + } + } else { + demod->setTracking(false); + } + } + if (demod != activeDemodulator) { demodSignalMeter->setInputValue(demod->getSquelchLevel()); demodGainMeter->setInputValue(demod->getGain()); diff --git a/src/demod/DemodulatorInstance.cpp b/src/demod/DemodulatorInstance.cpp index 52b4047..0f16c68 100644 --- a/src/demod/DemodulatorInstance.cpp +++ b/src/demod/DemodulatorInstance.cpp @@ -164,6 +164,9 @@ void DemodulatorInstance::setActive(bool state) { } else if (!active && state) { audioThread->setActive(state); } + if (!state) { + tracking = false; + } active = state; } @@ -343,3 +346,11 @@ bool DemodulatorInstance::isFollow() { void DemodulatorInstance::setFollow(bool follow) { this->follow = follow; } + +bool DemodulatorInstance::isTracking() { + return tracking; +} + +void DemodulatorInstance::setTracking(bool tracking) { + this->tracking = tracking; +} diff --git a/src/demod/DemodulatorInstance.h b/src/demod/DemodulatorInstance.h index 5f53a38..bbb4841 100644 --- a/src/demod/DemodulatorInstance.h +++ b/src/demod/DemodulatorInstance.h @@ -80,6 +80,8 @@ public: bool isFollow(); void setFollow(bool follow); + bool isTracking(); + void setTracking(bool tracking); private: void checkBandwidth(); @@ -98,5 +100,5 @@ private: int currentDemodType; int currentOutputDevice; int currentAudioSampleRate; - bool follow; + bool follow, tracking; }; diff --git a/src/sdr/SDRPostThread.cpp b/src/sdr/SDRPostThread.cpp index f07b2b2..43839cb 100644 --- a/src/sdr/SDRPostThread.cpp +++ b/src/sdr/SDRPostThread.cpp @@ -186,7 +186,7 @@ void SDRPostThread::threadMain() { DemodulatorThreadInputQueue *demodQueue = demod->threadQueueDemod; if (abs(data_in->frequency - demod->getFrequency()) > (wxGetApp().getSampleRate() / 2)) { - if (demod->isActive() && !demod->isFollow()) { + if (demod->isActive() && !demod->isFollow() && !demod->isTracking()) { demod->setActive(false); DemodulatorThreadIQData *dummyDataOut = new DemodulatorThreadIQData; dummyDataOut->frequency = data_in->frequency; diff --git a/src/visual/SpectrumCanvas.cpp b/src/visual/SpectrumCanvas.cpp index f22403d..776b89a 100644 --- a/src/visual/SpectrumCanvas.cpp +++ b/src/visual/SpectrumCanvas.cpp @@ -28,7 +28,7 @@ wxEND_EVENT_TABLE() SpectrumCanvas::SpectrumCanvas(wxWindow *parent, int *attribList) : InteractiveCanvas(parent, attribList), fft_size(0), in(NULL), out(NULL), plan(NULL), fft_ceil_ma(1), fft_ceil_maa(1), fft_floor_ma(0), fft_floor_maa( - 0), waterfallCanvas(NULL) { + 0), waterfallCanvas(NULL), trackingRate(0) { glContext = new SpectrumContext(this, &wxGetApp().GetContext(this)); @@ -175,46 +175,49 @@ void SpectrumCanvas::OnIdle(wxIdleEvent &event) { Refresh(false); } + +void SpectrumCanvas::moveCenterFrequency(long long freqChange) { + long long freq = wxGetApp().getFrequency(); + + if (isView) { + if (centerFreq - freqChange < bandwidth/2) { + centerFreq = bandwidth/2; + } else { + centerFreq -= freqChange; + } + + if (waterfallCanvas) { + waterfallCanvas->setCenterFrequency(centerFreq); + } + + long long bwOfs = (centerFreq > freq) ? ((long long) bandwidth / 2) : (-(long long) bandwidth / 2); + long long freqEdge = centerFreq + bwOfs; + + if (abs(freq - freqEdge) > (wxGetApp().getSampleRate() / 2)) { + freqChange = -((centerFreq > freq) ? (freqEdge - freq - (wxGetApp().getSampleRate() / 2)) : (freqEdge - freq + (wxGetApp().getSampleRate() / 2))); + } else { + freqChange = 0; + } + } + + if (freqChange) { + if (freq - freqChange < wxGetApp().getSampleRate()/2) { + freq = wxGetApp().getSampleRate()/2; + } else { + freq -= freqChange; + } + wxGetApp().setFrequency(freq); + setStatusText("Set center frequency: %s", freq); + } +} + void SpectrumCanvas::OnMouseMoved(wxMouseEvent& event) { InteractiveCanvas::OnMouseMoved(event); if (mouseTracker.mouseDown()) { int freqChange = mouseTracker.getDeltaMouseX() * getBandwidth(); if (freqChange != 0) { - long long freq = wxGetApp().getFrequency(); - - if (isView) { - if (isView) { - if (centerFreq - freqChange < bandwidth/2) { - centerFreq = bandwidth/2; - } else { - centerFreq -= freqChange; - } - } - if (waterfallCanvas) { - waterfallCanvas->setCenterFrequency(centerFreq); - } - - long long bwOfs = (centerFreq > freq) ? ((long long) bandwidth / 2) : (-(long long) bandwidth / 2); - long long freqEdge = centerFreq + bwOfs; - - if (abs(freq - freqEdge) > (wxGetApp().getSampleRate() / 2)) { - freqChange = -((centerFreq > freq) ? (freqEdge - freq - (wxGetApp().getSampleRate() / 2)) : (freqEdge - freq + (wxGetApp().getSampleRate() / 2))); - } else { - freqChange = 0; - } - } - - if (freqChange) { - if (freq - freqChange < wxGetApp().getSampleRate()/2) { - freq = wxGetApp().getSampleRate()/2; - } else { - freq -= freqChange; - } - wxGetApp().setFrequency(freq); - setStatusText("Set center frequency: %s", freq); - } - + moveCenterFrequency(freqChange); } } else { setStatusText("Click and drag to adjust center frequency."); diff --git a/src/visual/SpectrumCanvas.h b/src/visual/SpectrumCanvas.h index 74756ce..f1469a2 100644 --- a/src/visual/SpectrumCanvas.h +++ b/src/visual/SpectrumCanvas.h @@ -24,6 +24,7 @@ public: void setData(DemodulatorThreadIQData *input); void attachWaterfallCanvas(WaterfallCanvas *canvas_in); + void moveCenterFrequency(long long freqChange); SpectrumContext* getSpectrumContext(); @@ -51,6 +52,7 @@ private: SpectrumContext *glContext; WaterfallCanvas *waterfallCanvas; int fft_size; + int trackingRate; // event table wxDECLARE_EVENT_TABLE(); }; diff --git a/src/visual/TuningCanvas.cpp b/src/visual/TuningCanvas.cpp index a7e5416..d65bbaa 100644 --- a/src/visual/TuningCanvas.cpp +++ b/src/visual/TuningCanvas.cpp @@ -153,9 +153,10 @@ void TuningCanvas::StepTuner(ActiveState state, int exponent, bool up) { wxGetApp().setFrequency(freq); } + activeDemod->setTracking(true); + activeDemod->setFollow(true); activeDemod->setFrequency(freq); activeDemod->updateLabel(freq); - activeDemod->setFollow(true); } if (state == TUNING_HOVER_BW) { @@ -270,16 +271,16 @@ void TuningCanvas::OnMouseMoved(wxMouseEvent& event) { } else { switch (hoverState) { case TUNING_HOVER_FREQ: - setStatusText("Click or drag a digit to change frequency. Hold ALT to change PPM. Hold SHIFT to disable carry."); + setStatusText("Click, wheel or drag a digit to change frequency. Hold ALT to change PPM. Hold SHIFT to disable carry."); break; case TUNING_HOVER_BW: - setStatusText("Click or drag a digit to change bandwidth. Hold SHIFT to disable carry."); + setStatusText("Click, wheel or drag a digit to change bandwidth. Hold SHIFT to disable carry."); break; case TUNING_HOVER_CENTER: - setStatusText("Click or drag a digit to change center frequency. Hold SHIFT to disable carry."); + setStatusText("Click, wheel or drag a digit to change center frequency. Hold SHIFT to disable carry."); break; case TUNING_HOVER_PPM: - setStatusText("Click or drag a digit to change device PPM offset. Hold SHIFT to disable carry."); + setStatusText("Click, wheel or drag a digit to change device PPM offset. Hold SHIFT to disable carry."); break; } } diff --git a/src/visual/WaterfallCanvas.cpp b/src/visual/WaterfallCanvas.cpp index 424041a..77cbdb9 100644 --- a/src/visual/WaterfallCanvas.cpp +++ b/src/visual/WaterfallCanvas.cpp @@ -820,6 +820,7 @@ void WaterfallCanvas::OnMouseReleased(wxMouseEvent& event) { mouseTracker.setHorizDragLock(false); } else { wxGetApp().getDemodMgr().setActiveDemodulator(wxGetApp().getDemodMgr().getActiveDemodulator(), false); + wxGetApp().getDemodMgr().getActiveDemodulator()->setTracking(true); nextDragState = WF_DRAG_FREQUENCY; } } else if (dragState == WF_DRAG_RANGE) {