diff --git a/plugins/channelrx/demoddsd/CMakeLists.txt b/plugins/channelrx/demoddsd/CMakeLists.txt index 04823c5a4..6547bdef5 100644 --- a/plugins/channelrx/demoddsd/CMakeLists.txt +++ b/plugins/channelrx/demoddsd/CMakeLists.txt @@ -4,6 +4,7 @@ set(dsddemod_SOURCES dsddemod.cpp dsddemodgui.cpp dsddemodplugin.cpp + dsddemodbaudrates.cpp dsddecoder.cpp ) @@ -11,6 +12,7 @@ set(dsddemod_HEADERS dsddemod.h dsddemodgui.h dsddemodplugin.h + dsddemodbaudrates.h dsddecoder.h ) diff --git a/plugins/channelrx/demoddsd/demoddsd.pro b/plugins/channelrx/demoddsd/demoddsd.pro index 3255ff461..6f7f0f900 100644 --- a/plugins/channelrx/demoddsd/demoddsd.pro +++ b/plugins/channelrx/demoddsd/demoddsd.pro @@ -40,12 +40,14 @@ CONFIG(Debug):build_subdir = debug SOURCES = dsddecoder.cpp\ dsddemod.cpp\ dsddemodgui.cpp\ -dsddemodplugin.cpp +dsddemodplugin.cpp\ +dsddemodbaudrates.cpp HEADERS = dsddecoder.h\ dsddemod.h\ dsddemodgui.h\ -dsddemodplugin.h +dsddemodplugin.h\ +dsddemodbaudrates.h FORMS = dsddemodgui.ui diff --git a/plugins/channelrx/demoddsd/dsddemod.cpp b/plugins/channelrx/demoddsd/dsddemod.cpp index d1bf7df5c..d06502a9f 100644 --- a/plugins/channelrx/demoddsd/dsddemod.cpp +++ b/plugins/channelrx/demoddsd/dsddemod.cpp @@ -15,24 +15,30 @@ // along with this program. If not, see . // /////////////////////////////////////////////////////////////////////////////////// -#include "../../channelrx/demoddsd/dsddemod.h" #include #include #include #include + #include #include "audio/audiooutput.h" #include "dsp/pidcontroller.h" #include "dsp/dspengine.h" -#include "dsddemodgui.h" +#include "dsp/threadedbasebandsamplesink.h" +#include +#include +#include "dsddemod.h" + +MESSAGE_CLASS_DEFINITION(DSDDemod::MsgConfigureChannelizer, Message) MESSAGE_CLASS_DEFINITION(DSDDemod::MsgConfigureDSDDemod, Message) MESSAGE_CLASS_DEFINITION(DSDDemod::MsgConfigureMyPosition, Message) const int DSDDemod::m_udpBlockSize = 512; -DSDDemod::DSDDemod(BasebandSampleSink* sampleSink) : +DSDDemod::DSDDemod(DeviceSourceAPI *deviceAPI) : + m_deviceAPI(deviceAPI), m_sampleCount(0), m_squelchCount(0), m_squelchOpen(false), @@ -40,7 +46,7 @@ DSDDemod::DSDDemod(BasebandSampleSink* sampleSink) : m_fmExcursion(24), m_audioFifo1(48000), m_audioFifo2(48000), - m_scope(sampleSink), + m_scope(0), m_scopeEnabled(true), m_dsdDecoder(), m_settingsMutex(QMutex::Recursive) @@ -79,6 +85,10 @@ DSDDemod::DSDDemod(BasebandSampleSink* sampleSink) : m_audioFifo1.setUDPSink(m_udpBufferAudio); m_audioFifo2.setUDPSink(m_udpBufferAudio); + m_channelizer = new DownChannelizer(this); + m_threadedChannelizer = new ThreadedBasebandSampleSink(m_channelizer, this); + m_deviceAPI->addThreadedSink(m_threadedChannelizer); + apply(true); } @@ -88,6 +98,10 @@ DSDDemod::~DSDDemod() DSPEngine::instance()->removeAudioSink(&m_audioFifo1); DSPEngine::instance()->removeAudioSink(&m_audioFifo2); delete m_udpBufferAudio; + + m_deviceAPI->removeThreadedSink(m_threadedChannelizer); + delete m_threadedChannelizer; + delete m_channelizer; } void DSDDemod::configure(MessageQueue* messageQueue, @@ -364,6 +378,16 @@ bool DSDDemod::handleMessage(const Message& cmd) return true; } + else if (MsgConfigureChannelizer::match(cmd)) + { + MsgConfigureChannelizer& cfg = (MsgConfigureChannelizer&) cmd; + + m_channelizer->configure(m_channelizer->getInputMessageQueue(), + cfg.getSampleRate(), + cfg.getCenterFrequency()); + + return true; + } else if (MsgConfigureDSDDemod::match(cmd)) { MsgConfigureDSDDemod& cfg = (MsgConfigureDSDDemod&) cmd; diff --git a/plugins/channelrx/demoddsd/dsddemod.h b/plugins/channelrx/demoddsd/dsddemod.h index 3b17ad66b..6c6a23253 100644 --- a/plugins/channelrx/demoddsd/dsddemod.h +++ b/plugins/channelrx/demoddsd/dsddemod.h @@ -35,12 +35,38 @@ #include "dsddecoder.h" -class DSDDemodGUI; +class DeviceSourceAPI; +class ThreadedBasebandSampleSink; +class DownChannelizer; class DSDDemod : public BasebandSampleSink { public: - DSDDemod(BasebandSampleSink* sampleSink); + class MsgConfigureChannelizer : public Message { + MESSAGE_CLASS_DECLARATION + + public: + int getSampleRate() const { return m_sampleRate; } + int getCenterFrequency() const { return m_centerFrequency; } + + static MsgConfigureChannelizer* create(int sampleRate, int centerFrequency) + { + return new MsgConfigureChannelizer(sampleRate, centerFrequency); + } + + private: + int m_sampleRate; + int m_centerFrequency; + + MsgConfigureChannelizer(int sampleRate, int centerFrequency) : + Message(), + m_sampleRate(sampleRate), + m_centerFrequency(centerFrequency) + { } + }; + + DSDDemod(DeviceSourceAPI *deviceAPI); ~DSDDemod(); + void setScopeSink(BasebandSampleSink* sampleSink) { m_scope = sampleSink; } void configure(MessageQueue* messageQueue, int rfBandwidth, @@ -69,10 +95,6 @@ public: virtual void stop(); virtual bool handleMessage(const Message& cmd); - void registerGUI(DSDDemodGUI *dsdDemodGUI) { - m_dsdDemodGUI = dsdDemodGUI; - } - double getMagSq() { return m_magsq; } bool getSquelchOpen() const { return m_squelchOpen; } @@ -288,6 +310,10 @@ private: Config m_config; Config m_running; + DeviceSourceAPI *m_deviceAPI; + ThreadedBasebandSampleSink* m_threadedChannelizer; + DownChannelizer* m_channelizer; + NCO m_nco; Interpolator m_interpolator; Real m_interpolatorDistance; @@ -320,7 +346,6 @@ private: bool m_scopeEnabled; DSDDecoder m_dsdDecoder; - DSDDemodGUI *m_dsdDemodGUI; QMutex m_settingsMutex; PhaseDiscriminators m_phaseDiscri; diff --git a/plugins/channelrx/demoddsd/dsddemodbaudrates.cpp b/plugins/channelrx/demoddsd/dsddemodbaudrates.cpp new file mode 100644 index 000000000..5dc099b61 --- /dev/null +++ b/plugins/channelrx/demoddsd/dsddemodbaudrates.cpp @@ -0,0 +1,50 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2016 F4EXB // +// written by Edouard Griffiths // +// // +// 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 as version 3 of the License, or // +// // +// 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 V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#include "dsddemodbaudrates.h" + +unsigned int DSDDemodBaudRates::m_rates[] = {2400, 4800}; +unsigned int DSDDemodBaudRates::m_nb_rates = 2; +unsigned int DSDDemodBaudRates::m_defaultRateIndex = 1; // 4800 bauds + +unsigned int DSDDemodBaudRates::getRate(unsigned int rate_index) +{ + if (rate_index < m_nb_rates) + { + return m_rates[rate_index]; + } + else + { + return m_rates[m_defaultRateIndex]; + } +} + +unsigned int DSDDemodBaudRates::getRateIndex(unsigned int rate) +{ + for (unsigned int i=0; i < m_nb_rates; i++) + { + if (rate == m_rates[i]) + { + return i; + } + } + + return m_defaultRateIndex; +} + + + diff --git a/plugins/channelrx/demoddsd/dsddemodbaudrates.h b/plugins/channelrx/demoddsd/dsddemodbaudrates.h new file mode 100644 index 000000000..2dbd18a8f --- /dev/null +++ b/plugins/channelrx/demoddsd/dsddemodbaudrates.h @@ -0,0 +1,35 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2016 F4EXB // +// written by Edouard Griffiths // +// // +// 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 as version 3 of the License, or // +// // +// 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 V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef PLUGINS_CHANNELRX_DEMODDSD_DSDDEMODBAUDRATES_H_ +#define PLUGINS_CHANNELRX_DEMODDSD_DSDDEMODBAUDRATES_H_ + +class DSDDemodBaudRates +{ +public: + static unsigned int getRate(unsigned int rate_index); + static unsigned int getRateIndex(unsigned int rate); + static unsigned int getDefaultRate() { return m_rates[m_defaultRateIndex]; } + static unsigned int getDefaultRateIndex() { return m_defaultRateIndex; } + static unsigned int getNbRates() { return m_nb_rates; } +private: + static unsigned int m_nb_rates; + static unsigned int m_rates[2]; + static unsigned int m_defaultRateIndex; +}; + +#endif /* PLUGINS_CHANNELRX_DEMODDSD_DSDDEMODBAUDRATES_H_ */ diff --git a/plugins/channelrx/demoddsd/dsddemodgui.cpp b/plugins/channelrx/demoddsd/dsddemodgui.cpp index 2015c6ce1..00756059f 100644 --- a/plugins/channelrx/demoddsd/dsddemodgui.cpp +++ b/plugins/channelrx/demoddsd/dsddemodgui.cpp @@ -34,14 +34,11 @@ #include "dsp/dspengine.h" #include "mainwindow.h" +#include "dsddemodbaudrates.h" #include "dsddemod.h" const QString DSDDemodGUI::m_channelID = "sdrangel.channel.dsddemod"; -unsigned int DSDDemodBaudRates::m_rates[] = {2400, 4800}; -unsigned int DSDDemodBaudRates::m_nb_rates = 2; -unsigned int DSDDemodBaudRates::m_defaultRateIndex = 1; // 4800 bauds - DSDDemodGUI* DSDDemodGUI::create(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI) { DSDDemodGUI* gui = new DSDDemodGUI(pluginAPI, deviceAPI); @@ -322,8 +319,9 @@ DSDDemodGUI::DSDDemodGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidg connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(onMenuDialogCalled(const QPoint &))); m_scopeVis = new ScopeVis(ui->glScope); - m_dsdDemod = new DSDDemod(m_scopeVis); - m_dsdDemod->registerGUI(this); + m_dsdDemod = new DSDDemod(m_deviceAPI); + m_dsdDemod->setScopeSink(m_scopeVis); + m_dsdDemod->setMessageQueueToGUI(getInputMessageQueue()); ui->glScope->setSampleRate(48000); m_scopeVis->setSampleRate(48000); @@ -339,11 +337,7 @@ DSDDemodGUI::DSDDemodGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidg ui->deltaFrequency->setValueRange(false, 7, -9999999, 9999999); ui->channelPowerMeter->setColorTheme(LevelMeterSignalDB::ColorGreenAndBlue); - m_channelizer = new DownChannelizer(m_dsdDemod); - m_threadedChannelizer = new ThreadedBasebandSampleSink(m_channelizer, this); - m_deviceAPI->addThreadedSink(m_threadedChannelizer); - //m_channelMarker = new ChannelMarker(this); m_channelMarker.setTitle(windowTitle()); m_channelMarker.setColor(Qt::cyan); m_channelMarker.setBandwidth(10000); @@ -366,11 +360,7 @@ DSDDemodGUI::DSDDemodGUI(PluginAPI* pluginAPI, DeviceSourceAPI *deviceAPI, QWidg DSDDemodGUI::~DSDDemodGUI() { m_deviceAPI->removeChannelInstance(this); - m_deviceAPI->removeThreadedSink(m_threadedChannelizer); - delete m_threadedChannelizer; - delete m_channelizer; delete m_dsdDemod; - //delete m_channelMarker; delete ui; } @@ -400,9 +390,9 @@ void DSDDemodGUI::applySettings(bool force) setTitleColor(m_channelMarker.getColor()); - m_channelizer->configure(m_channelizer->getInputMessageQueue(), - 48000, - m_channelMarker.getCenterFrequency()); + DSDDemod::MsgConfigureChannelizer* channelConfigMsg = DSDDemod::MsgConfigureChannelizer::create( + 48000, m_channelMarker.getCenterFrequency()); + m_dsdDemod->getInputMessageQueue()->push(channelConfigMsg); ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency()); ui->rfBWText->setText(QString("%1k").arg(ui->rfBW->value() / 10.0, 0, 'f', 1)); @@ -683,28 +673,3 @@ void DSDDemodGUI::tick() m_tickCount++; } - -unsigned int DSDDemodBaudRates::getRate(unsigned int rate_index) -{ - if (rate_index < m_nb_rates) - { - return m_rates[rate_index]; - } - else - { - return m_rates[m_defaultRateIndex]; - } -} - -unsigned int DSDDemodBaudRates::getRateIndex(unsigned int rate) -{ - for (unsigned int i=0; i < m_nb_rates; i++) - { - if (rate == m_rates[i]) - { - return i; - } - } - - return m_defaultRateIndex; -} diff --git a/plugins/channelrx/demoddsd/dsddemodgui.h b/plugins/channelrx/demoddsd/dsddemodgui.h index 0b36ae0ad..689ba7b2a 100644 --- a/plugins/channelrx/demoddsd/dsddemodgui.h +++ b/plugins/channelrx/demoddsd/dsddemodgui.h @@ -30,8 +30,6 @@ class PluginAPI; class DeviceSourceAPI; -class ThreadedBasebandSampleSink; -class DownChannelizer; class ScopeVis; class DSDDemod; @@ -100,8 +98,6 @@ private: char m_formatStatusText[82+1]; //!< Fixed signal format dependent status text SignalFormat m_signalFormat; - ThreadedBasebandSampleSink* m_threadedChannelizer; - DownChannelizer* m_channelizer; ScopeVis* m_scopeVis; DSDDemod* m_dsdDemod; @@ -131,18 +127,4 @@ private: void enterEvent(QEvent*); }; -class DSDDemodBaudRates -{ -public: - static unsigned int getRate(unsigned int rate_index); - static unsigned int getRateIndex(unsigned int rate); - static unsigned int getDefaultRate() { return m_rates[m_defaultRateIndex]; } - static unsigned int getDefaultRateIndex() { return m_defaultRateIndex; } - static unsigned int getNbRates(); -private: - static unsigned int m_nb_rates; - static unsigned int m_rates[2]; - static unsigned int m_defaultRateIndex; -}; - #endif // INCLUDE_DSDDEMODGUI_H