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