diff --git a/plugins/channel/demoddsd/dsddecoder.cpp b/plugins/channel/demoddsd/dsddecoder.cpp index ee6221e7e..3f88789f0 100644 --- a/plugins/channel/demoddsd/dsddecoder.cpp +++ b/plugins/channel/demoddsd/dsddecoder.cpp @@ -29,8 +29,33 @@ DSDDecoder::DSDDecoder() m_decoder.setUvQuality(3); // This is gr-dsd default m_decoder.setModulationOptimizations(DSDcc::DSDDecoder::DSDModulationOptimAuto); // Initialize with auto detection of modulation optimization: m_decoder.enableCosineFiltering(false); + m_decoder.setDataRate(DSDcc::DSDDecoder::DSDRate4800); } DSDDecoder::~DSDDecoder() { } + +void DSDDecoder::setBaudRate(int baudRate) +{ + if (baudRate == 2400) + { + m_decoder.setDataRate(DSDcc::DSDDecoder::DSDRate2400); + } + else if (baudRate == 4800) + { + m_decoder.setDataRate(DSDcc::DSDDecoder::DSDRate4800); + } + else if (baudRate == 9600) + { + m_decoder.setDataRate(DSDcc::DSDDecoder::DSDRate9600); + } + else // default 4800 bauds + { + m_decoder.setDataRate(DSDcc::DSDDecoder::DSDRate4800); + } + + // when setting baud rate activate detection of all possible modes for this rate + // because on the other hand when a mode is selected then the baud rate is automatically changed + m_decoder.setDecodeMode(DSDcc::DSDDecoder::DSDDecodeAuto, true); +} diff --git a/plugins/channel/demoddsd/dsddecoder.h b/plugins/channel/demoddsd/dsddecoder.h index fa06b1b0d..084fb80d1 100644 --- a/plugins/channel/demoddsd/dsddecoder.h +++ b/plugins/channel/demoddsd/dsddecoder.h @@ -50,6 +50,7 @@ public: const DSDcc::DSDDstar& getDStarDecoder() const { return m_decoder.getDStarDecoder(); } void setAudioGain(float gain) { m_decoder.setAudioGain(gain); } + void setBaudRate(int baudRate); private: DSDcc::DSDDecoder m_decoder; diff --git a/plugins/channel/demoddsd/dsddemod.cpp b/plugins/channel/demoddsd/dsddemod.cpp index fa37683c9..f2ec2233d 100644 --- a/plugins/channel/demoddsd/dsddemod.cpp +++ b/plugins/channel/demoddsd/dsddemod.cpp @@ -51,6 +51,7 @@ DSDDemod::DSDDemod(SampleSink* sampleSink) : m_config.m_squelchGate = 5; // 10s of ms at 48000 Hz sample rate. Corresponds to 2400 for AGC attack m_config.m_squelch = -30.0; m_config.m_volume = 1.0; + m_config.m_baudRate = 4800; m_config.m_audioMute = false; m_config.m_audioSampleRate = DSPEngine::instance()->getAudioSampleRate(); @@ -78,6 +79,7 @@ void DSDDemod::configure(MessageQueue* messageQueue, int demodGain, int fmDeviation, int volume, + int baudRate, int squelchGate, Real squelch, bool audioMute) @@ -86,6 +88,7 @@ void DSDDemod::configure(MessageQueue* messageQueue, demodGain, fmDeviation, volume, + baudRate, squelchGate, squelch, audioMute); @@ -239,6 +242,7 @@ bool DSDDemod::handleMessage(const Message& cmd) m_config.m_demodGain = cfg.getDemodGain(); m_config.m_fmDeviation = cfg.getFMDeviation(); m_config.m_volume = cfg.getVolume(); + m_config.m_baudRate = cfg.getBaudRate(); m_config.m_squelchGate = cfg.getSquelchGate(); m_config.m_squelch = cfg.getSquelch(); m_config.m_audioMute = cfg.getAudioMute(); @@ -249,6 +253,7 @@ bool DSDDemod::handleMessage(const Message& cmd) << " m_demodGain: " << m_config.m_demodGain / 100.0 << " m_fmDeviation: " << m_config.m_fmDeviation * 100 << " m_volume: " << m_config.m_volume / 10.0 + << " m_baudRate: " << m_config.m_baudRate << " m_squelchGate" << m_config.m_squelchGate << " m_squelch: " << m_config.m_squelch << " m_audioMute: " << m_config.m_audioMute; @@ -303,7 +308,12 @@ void DSDDemod::apply() m_dsdDecoder.setAudioGain(m_config.m_volume / 10.0f); } - m_running.m_inputSampleRate = m_config.m_inputSampleRate; + if (m_config.m_baudRate != m_running.m_baudRate) + { + m_dsdDecoder.setBaudRate(m_config.m_baudRate); + } + + m_running.m_inputSampleRate = m_config.m_inputSampleRate; m_running.m_inputFrequencyOffset = m_config.m_inputFrequencyOffset; m_running.m_rfBandwidth = m_config.m_rfBandwidth; m_running.m_demodGain = m_config.m_demodGain; @@ -311,6 +321,7 @@ void DSDDemod::apply() m_running.m_squelchGate = m_config.m_squelchGate; m_running.m_squelch = m_config.m_squelch; m_running.m_volume = m_config.m_volume; + m_running.m_baudRate = m_config.m_baudRate; m_running.m_audioSampleRate = m_config.m_audioSampleRate; m_running.m_audioMute = m_config.m_audioMute; } diff --git a/plugins/channel/demoddsd/dsddemod.h b/plugins/channel/demoddsd/dsddemod.h index 23e42011b..6ad18ca97 100644 --- a/plugins/channel/demoddsd/dsddemod.h +++ b/plugins/channel/demoddsd/dsddemod.h @@ -44,6 +44,7 @@ public: int rfBandwidth, int demodGain, int volume, + int baudRate, int fmDeviation, int squelchGate, Real squelch, @@ -72,6 +73,7 @@ private: int getDemodGain() const { return m_demodGain; } int getFMDeviation() const { return m_fmDeviation; } int getVolume() const { return m_volume; } + int getBaudRate() const { return m_baudRate; } int getSquelchGate() const { return m_squelchGate; } Real getSquelch() const { return m_squelch; } bool getAudioMute() const { return m_audioMute; } @@ -80,11 +82,12 @@ private: int demodGain, int fmDeviation, int volume, + int baudRate, int squelchGate, Real squelch, bool audioMute) { - return new MsgConfigureDSDDemod(rfBandwidth, demodGain, fmDeviation, volume, squelchGate, squelch, audioMute); + return new MsgConfigureDSDDemod(rfBandwidth, demodGain, fmDeviation, volume, baudRate, squelchGate, squelch, audioMute); } private: @@ -92,6 +95,7 @@ private: Real m_demodGain; int m_fmDeviation; int m_volume; + int m_baudRate; int m_squelchGate; Real m_squelch; bool m_audioMute; @@ -100,6 +104,7 @@ private: int demodGain, int fmDeviation, int volume, + int baudRate, int squelchGate, Real squelch, bool audioMute) : @@ -108,6 +113,7 @@ private: m_demodGain(demodGain), m_fmDeviation(fmDeviation), m_volume(volume), + m_baudRate(baudRate), m_squelchGate(squelchGate), m_squelch(squelch), m_audioMute(audioMute) @@ -131,6 +137,7 @@ private: int m_rfBandwidth; int m_demodGain; int m_volume; + int m_baudRate; int m_fmDeviation; int m_squelchGate; Real m_squelch; @@ -143,6 +150,7 @@ private: m_rfBandwidth(-1), m_demodGain(-1), m_volume(-1), + m_baudRate(4800), m_fmDeviation(1), m_squelchGate(1), m_squelch(0), diff --git a/plugins/channel/demoddsd/dsddemodgui.cpp b/plugins/channel/demoddsd/dsddemodgui.cpp index 2cf534819..e3e51f54c 100644 --- a/plugins/channel/demoddsd/dsddemodgui.cpp +++ b/plugins/channel/demoddsd/dsddemodgui.cpp @@ -36,6 +36,11 @@ 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, DeviceAPI *deviceAPI) { DSDDemodGUI* gui = new DSDDemodGUI(pluginAPI, deviceAPI); @@ -76,6 +81,7 @@ void DSDDemodGUI::resetToDefaults() ui->demodGain->setValue(100); // 100ths ui->fmDeviation->setValue(50); // x100 Hz ui->volume->setValue(20); // /10.0 + ui->baudRate->setCurrentIndex(DSDDemodBaudRates::getDefaultRateIndex()); ui->squelchGate->setValue(5); ui->squelch->setValue(-40); ui->deltaFrequency->setValue(0); @@ -96,6 +102,7 @@ QByteArray DSDDemodGUI::serialize() const s.writeS32(8, ui->squelchGate->value()); s.writeS32(9, ui->volume->value()); s.writeBlob(10, ui->scopeGUI->serialize()); + s.writeS32(11, ui->baudRate->currentIndex()); return s.final(); } @@ -141,6 +148,8 @@ bool DSDDemodGUI::deserialize(const QByteArray& data) ui->volume->setValue(tmp); d.readBlob(10, &bytetmp); ui->scopeGUI->deserialize(bytetmp); + d.readS32(11, &tmp, 20); + ui->baudRate->setCurrentIndex(tmp); blockApplySettings(false); m_channelMarker.blockSignals(false); @@ -210,6 +219,10 @@ void DSDDemodGUI::on_volume_valueChanged(int value) applySettings(); } +void DSDDemodGUI::on_baudRate_currentIndexChanged(int index) +{ + applySettings(); +} void DSDDemodGUI::on_squelchGate_valueChanged(int value) { @@ -335,6 +348,7 @@ void DSDDemodGUI::applySettings() ui->demodGain->value(), ui->fmDeviation->value(), ui->volume->value(), + DSDDemodBaudRates::getRate(ui->baudRate->currentIndex()), ui->squelchGate->value(), // in 10ths of ms ui->squelch->value(), ui->audioMute->isChecked()); @@ -476,3 +490,28 @@ void DSDDemodGUI::tick() m_tickCount = 0; } } + +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/channel/demoddsd/dsddemodgui.h b/plugins/channel/demoddsd/dsddemodgui.h index a8e556220..dd1eb7ce0 100644 --- a/plugins/channel/demoddsd/dsddemodgui.h +++ b/plugins/channel/demoddsd/dsddemodgui.h @@ -64,6 +64,7 @@ private slots: void on_rfBW_valueChanged(int index); void on_demodGain_valueChanged(int value); void on_volume_valueChanged(int value); + void on_baudRate_currentIndexChanged(int index); void on_fmDeviation_valueChanged(int value); void on_squelchGate_valueChanged(int value); void on_squelch_valueChanged(int value); @@ -109,4 +110,18 @@ 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 diff --git a/plugins/channel/demoddsd/dsddemodgui.ui b/plugins/channel/demoddsd/dsddemodgui.ui index f7ebf60b7..afa3c856a 100644 --- a/plugins/channel/demoddsd/dsddemodgui.ui +++ b/plugins/channel/demoddsd/dsddemodgui.ui @@ -137,9 +137,15 @@ + + + 60 + 0 + + - 55 + 16777215 16777215