From 99c74a8e57c102112a9d1344932fe6fed4794fcf Mon Sep 17 00:00:00 2001 From: f4exb Date: Thu, 18 Aug 2016 19:38:39 +0200 Subject: [PATCH] DSD demod: switch for cosine filter. Other changes to GUI --- plugins/channel/demoddsd/dsddecoder.h | 1 + plugins/channel/demoddsd/dsddemod.cpp | 17 ++++-- plugins/channel/demoddsd/dsddemod.h | 20 ++++--- plugins/channel/demoddsd/dsddemodgui.cpp | 15 +++++- plugins/channel/demoddsd/dsddemodgui.h | 2 + plugins/channel/demoddsd/dsddemodgui.ui | 69 +++++++++++++++--------- 6 files changed, 89 insertions(+), 35 deletions(-) diff --git a/plugins/channel/demoddsd/dsddecoder.h b/plugins/channel/demoddsd/dsddecoder.h index f3ba19f3f..6b339d1e7 100644 --- a/plugins/channel/demoddsd/dsddecoder.h +++ b/plugins/channel/demoddsd/dsddecoder.h @@ -43,6 +43,7 @@ public: int getZeroCrossingPos() const { return m_decoder.getZeroCrossingPos(); } int getSymbolSyncQuality() const { return m_decoder.getSymbolSyncQuality(); } int getSamplesPerSymbol() const { return m_decoder.getSamplesPerSymbol(); } + void enableCosineFiltering(bool on) { m_decoder.enableCosineFiltering(on); } DSDcc::DSDDecoder::DSDSyncType getSyncType() const { return m_decoder.getSyncType(); } DSDcc::DSDDecoder::DSDStationType getStationType() const { return m_decoder.getStationType(); } const char *getFrameTypeText() const { return m_decoder.getFrameTypeText(); } diff --git a/plugins/channel/demoddsd/dsddemod.cpp b/plugins/channel/demoddsd/dsddemod.cpp index f2ec2233d..2d134ff67 100644 --- a/plugins/channel/demoddsd/dsddemod.cpp +++ b/plugins/channel/demoddsd/dsddemod.cpp @@ -54,6 +54,7 @@ DSDDemod::DSDDemod(SampleSink* sampleSink) : m_config.m_baudRate = 4800; m_config.m_audioMute = false; m_config.m_audioSampleRate = DSPEngine::instance()->getAudioSampleRate(); + m_config.m_enableCosineFiltering = false; apply(); @@ -82,7 +83,8 @@ void DSDDemod::configure(MessageQueue* messageQueue, int baudRate, int squelchGate, Real squelch, - bool audioMute) + bool audioMute, + bool enableCosineFiltering) { Message* cmd = MsgConfigureDSDDemod::create(rfBandwidth, demodGain, @@ -91,7 +93,8 @@ void DSDDemod::configure(MessageQueue* messageQueue, baudRate, squelchGate, squelch, - audioMute); + audioMute, + enableCosineFiltering); messageQueue->push(cmd); } @@ -246,6 +249,7 @@ bool DSDDemod::handleMessage(const Message& cmd) m_config.m_squelchGate = cfg.getSquelchGate(); m_config.m_squelch = cfg.getSquelch(); m_config.m_audioMute = cfg.getAudioMute(); + m_config.m_enableCosineFiltering = cfg.getEnableCosineFiltering(); apply(); @@ -256,7 +260,8 @@ bool DSDDemod::handleMessage(const Message& cmd) << " m_baudRate: " << m_config.m_baudRate << " m_squelchGate" << m_config.m_squelchGate << " m_squelch: " << m_config.m_squelch - << " m_audioMute: " << m_config.m_audioMute; + << " m_audioMute: " << m_config.m_audioMute + << " m_enableCosineFiltering: " << m_config.m_enableCosineFiltering; return true; } @@ -313,6 +318,11 @@ void DSDDemod::apply() m_dsdDecoder.setBaudRate(m_config.m_baudRate); } + if (m_config.m_enableCosineFiltering != m_running.m_enableCosineFiltering) + { + m_dsdDecoder.enableCosineFiltering(m_config.m_enableCosineFiltering); + } + m_running.m_inputSampleRate = m_config.m_inputSampleRate; m_running.m_inputFrequencyOffset = m_config.m_inputFrequencyOffset; m_running.m_rfBandwidth = m_config.m_rfBandwidth; @@ -324,4 +334,5 @@ void DSDDemod::apply() m_running.m_baudRate = m_config.m_baudRate; m_running.m_audioSampleRate = m_config.m_audioSampleRate; m_running.m_audioMute = m_config.m_audioMute; + m_running.m_enableCosineFiltering = m_config.m_enableCosineFiltering; } diff --git a/plugins/channel/demoddsd/dsddemod.h b/plugins/channel/demoddsd/dsddemod.h index 6ad18ca97..a43e294c5 100644 --- a/plugins/channel/demoddsd/dsddemod.h +++ b/plugins/channel/demoddsd/dsddemod.h @@ -48,7 +48,8 @@ public: int fmDeviation, int squelchGate, Real squelch, - bool audioMute); + bool audioMute, + bool enableCosineFiltering); virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool po); virtual void start(); @@ -77,6 +78,7 @@ private: int getSquelchGate() const { return m_squelchGate; } Real getSquelch() const { return m_squelch; } bool getAudioMute() const { return m_audioMute; } + bool getEnableCosineFiltering() const { return m_enableCosineFiltering; } static MsgConfigureDSDDemod* create(int rfBandwidth, int demodGain, @@ -85,9 +87,10 @@ private: int baudRate, int squelchGate, Real squelch, - bool audioMute) + bool audioMute, + bool enableCosineFiltering) { - return new MsgConfigureDSDDemod(rfBandwidth, demodGain, fmDeviation, volume, baudRate, squelchGate, squelch, audioMute); + return new MsgConfigureDSDDemod(rfBandwidth, demodGain, fmDeviation, volume, baudRate, squelchGate, squelch, audioMute, enableCosineFiltering); } private: @@ -99,6 +102,7 @@ private: int m_squelchGate; Real m_squelch; bool m_audioMute; + bool m_enableCosineFiltering; MsgConfigureDSDDemod(int rfBandwidth, int demodGain, @@ -107,7 +111,8 @@ private: int baudRate, int squelchGate, Real squelch, - bool audioMute) : + bool audioMute, + bool enableCosineFiltering) : Message(), m_rfBandwidth(rfBandwidth), m_demodGain(demodGain), @@ -116,7 +121,8 @@ private: m_baudRate(baudRate), m_squelchGate(squelchGate), m_squelch(squelch), - m_audioMute(audioMute) + m_audioMute(audioMute), + m_enableCosineFiltering(enableCosineFiltering) { } }; @@ -143,6 +149,7 @@ private: Real m_squelch; bool m_audioMute; quint32 m_audioSampleRate; + bool m_enableCosineFiltering; Config() : m_inputSampleRate(-1), @@ -155,7 +162,8 @@ private: m_squelchGate(1), m_squelch(0), m_audioMute(false), - m_audioSampleRate(0) + m_audioSampleRate(0), + m_enableCosineFiltering(false) { } }; diff --git a/plugins/channel/demoddsd/dsddemodgui.cpp b/plugins/channel/demoddsd/dsddemodgui.cpp index 7a4a5bb0e..3e332bef0 100644 --- a/plugins/channel/demoddsd/dsddemodgui.cpp +++ b/plugins/channel/demoddsd/dsddemodgui.cpp @@ -115,6 +115,7 @@ QByteArray DSDDemodGUI::serialize() const s.writeS32(9, ui->volume->value()); s.writeBlob(10, ui->scopeGUI->serialize()); s.writeS32(11, ui->baudRate->currentIndex()); + s.writeBool(12, m_enableCosineFiltering); return s.final(); } @@ -162,6 +163,7 @@ bool DSDDemodGUI::deserialize(const QByteArray& data) ui->scopeGUI->deserialize(bytetmp); d.readS32(11, &tmp, 20); ui->baudRate->setCurrentIndex(tmp); + d.readBool(12, &m_enableCosineFiltering, false); blockApplySettings(false); m_channelMarker.blockSignals(false); @@ -236,6 +238,12 @@ void DSDDemodGUI::on_baudRate_currentIndexChanged(int index) applySettings(); } +void DSDDemodGUI::on_enableCosineFiltering_toggled(bool enable) +{ + m_enableCosineFiltering = enable; + applySettings(); +} + void DSDDemodGUI::on_squelchGate_valueChanged(int value) { applySettings(); @@ -280,6 +288,7 @@ DSDDemodGUI::DSDDemodGUI(PluginAPI* pluginAPI, DeviceAPI *deviceAPI, QWidget* pa m_basicSettingsShown(false), m_doApplySettings(true), m_signalFormat(signalFormatNone), + m_enableCosineFiltering(false), m_squelchOpen(false), m_channelPowerDbAvg(20,0), m_tickCount(0) @@ -354,6 +363,9 @@ void DSDDemodGUI::applySettings() ui->fmDeviationText->setText(QString("%1k").arg(ui->fmDeviation->value() / 10.0, 0, 'f', 1)); ui->squelchGateText->setText(QString("%1").arg(ui->squelchGate->value() * 10.0, 0, 'f', 0)); ui->volumeText->setText(QString("%1").arg(ui->volume->value() / 10.0, 0, 'f', 1)); + ui->enableCosineFiltering->setChecked(m_enableCosineFiltering); + + // TODO: pass m_enableCosineFiltering m_dsdDemod->configure(m_dsdDemod->getInputMessageQueue(), ui->rfBW->value(), @@ -363,7 +375,8 @@ void DSDDemodGUI::applySettings() DSDDemodBaudRates::getRate(ui->baudRate->currentIndex()), ui->squelchGate->value(), // in 10ths of ms ui->squelch->value(), - ui->audioMute->isChecked()); + ui->audioMute->isChecked(), + m_enableCosineFiltering); } } diff --git a/plugins/channel/demoddsd/dsddemodgui.h b/plugins/channel/demoddsd/dsddemodgui.h index 54342043c..1c7d75979 100644 --- a/plugins/channel/demoddsd/dsddemodgui.h +++ b/plugins/channel/demoddsd/dsddemodgui.h @@ -65,6 +65,7 @@ private slots: void on_demodGain_valueChanged(int value); void on_volume_valueChanged(int value); void on_baudRate_currentIndexChanged(int index); + void on_enableCosineFiltering_toggled(bool enable); void on_fmDeviation_valueChanged(int value); void on_squelchGate_valueChanged(int value); void on_squelch_valueChanged(int value); @@ -96,6 +97,7 @@ private: ScopeVis* m_scopeVis; DSDDemod* m_dsdDemod; + bool m_enableCosineFiltering; bool m_audioMute; bool m_squelchOpen; MovingAverage m_channelPowerDbAvg; diff --git a/plugins/channel/demoddsd/dsddemodgui.ui b/plugins/channel/demoddsd/dsddemodgui.ui index 018f29839..2e5b975f0 100644 --- a/plugins/channel/demoddsd/dsddemodgui.ui +++ b/plugins/channel/demoddsd/dsddemodgui.ui @@ -202,7 +202,7 @@ - + 20 @@ -210,7 +210,7 @@ - Carrier input level (%) when synchronized + Symbol synchronization quality (%) 00 @@ -220,25 +220,6 @@ - - - - - 25 - 0 - - - - Carrier relative position (%) when synchronized - - - -00 - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - @@ -259,18 +240,51 @@ - + + + Enable cosine filtering + + + + + + + :/dsb.png:/dsb.png + + + + + - 20 + 25 0 - Symbol synchronization quality (%) + Carrier relative position (%) when synchronized - 00 + -00 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 25 + 0 + + + + Carrier input level (%) when synchronized + + + 000 Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -814,6 +828,11 @@
gui/glscopegui.h
1 + + ButtonSwitch + QToolButton +
gui/buttonswitch.h
+