diff --git a/.gitignore b/.gitignore index 2f0398bd8..43512679a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ CMakeLists.txt.user* build/* qtbuild/* +sdriq/* LOCAL/* sdrangelove.supp .cproject diff --git a/plugins/channel/nfm/nfmdemod.cpp b/plugins/channel/nfm/nfmdemod.cpp index 04f1d3c66..8cb939c2f 100644 --- a/plugins/channel/nfm/nfmdemod.cpp +++ b/plugins/channel/nfm/nfmdemod.cpp @@ -46,6 +46,7 @@ NFMDemod::NFMDemod() : m_config.m_afBandwidth = 3000; m_config.m_squelch = -30.0; m_config.m_volume = 2.0; + m_config.m_ctcssOn = false; m_config.m_audioSampleRate = DSPEngine::instance()->getAudioSampleRate(); apply(); @@ -70,9 +71,18 @@ NFMDemod::~NFMDemod() DSPEngine::instance()->removeAudioSink(&m_audioFifo); } -void NFMDemod::configure(MessageQueue* messageQueue, Real rfBandwidth, Real afBandwidth, Real volume, Real squelch) +void NFMDemod::configure(MessageQueue* messageQueue, + Real rfBandwidth, + Real afBandwidth, + Real volume, + Real squelch, + bool ctcssOn) { - Message* cmd = MsgConfigureNFMDemod::create(rfBandwidth, afBandwidth, volume, squelch); + Message* cmd = MsgConfigureNFMDemod::create(rfBandwidth, + afBandwidth, + volume, + squelch, + ctcssOn); messageQueue->push(cmd); } @@ -171,34 +181,37 @@ void NFMDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto if (m_squelchOpen) { - Real ctcss_sample = m_lowpass.filter(demod); - - if ((m_sampleCount & 7) == 7) // decimate 48k -> 6k + if (m_running.m_ctcssOn) { - if (m_ctcssDetector.analyze(&ctcss_sample)) - { - int maxToneIndex; + Real ctcss_sample = m_lowpass.filter(demod); - if (m_ctcssDetector.getDetectedTone(maxToneIndex)) + if ((m_sampleCount & 7) == 7) // decimate 48k -> 6k + { + if (m_ctcssDetector.analyze(&ctcss_sample)) { - if (maxToneIndex+1 != m_ctcssIndex) + int maxToneIndex; + + if (m_ctcssDetector.getDetectedTone(maxToneIndex)) { - m_nfmDemodGUI->setCtcssFreq(m_ctcssDetector.getToneSet()[maxToneIndex]); - m_ctcssIndex = maxToneIndex+1; + if (maxToneIndex+1 != m_ctcssIndex) + { + m_nfmDemodGUI->setCtcssFreq(m_ctcssDetector.getToneSet()[maxToneIndex]); + m_ctcssIndex = maxToneIndex+1; + } } - } - else - { - if (m_ctcssIndex != 0) + else { - m_nfmDemodGUI->setCtcssFreq(0); - m_ctcssIndex = 0; + if (m_ctcssIndex != 0) + { + m_nfmDemodGUI->setCtcssFreq(0); + m_ctcssIndex = 0; + } } } } } - if (m_ctcssIndexSelected && (m_ctcssIndexSelected != m_ctcssIndex)) + if (m_running.m_ctcssOn && m_ctcssIndexSelected && (m_ctcssIndexSelected != m_ctcssIndex)) { sample = 0; } @@ -297,13 +310,15 @@ bool NFMDemod::handleMessage(const Message& cmd) m_config.m_afBandwidth = cfg.getAFBandwidth(); m_config.m_volume = cfg.getVolume(); m_config.m_squelch = cfg.getSquelch(); + m_config.m_ctcssOn = cfg.getCtcssOn(); apply(); qDebug() << " - MsgConfigureNFMDemod: m_rfBandwidth: " << m_config.m_rfBandwidth << " m_afBandwidth: " << m_config.m_afBandwidth << " m_volume: " << m_config.m_volume - << " m_squelch: " << m_config.m_squelch; + << " m_squelch: " << m_config.m_squelch + << " m_ctcssOn: " << m_config.m_ctcssOn; return true; } @@ -315,13 +330,13 @@ bool NFMDemod::handleMessage(const Message& cmd) void NFMDemod::apply() { - if((m_config.m_inputFrequencyOffset != m_running.m_inputFrequencyOffset) || + if ((m_config.m_inputFrequencyOffset != m_running.m_inputFrequencyOffset) || (m_config.m_inputSampleRate != m_running.m_inputSampleRate)) { m_nco.setFreq(-m_config.m_inputFrequencyOffset, m_config.m_inputSampleRate); } - if((m_config.m_inputSampleRate != m_running.m_inputSampleRate) || + if ((m_config.m_inputSampleRate != m_running.m_inputSampleRate) || (m_config.m_rfBandwidth != m_running.m_rfBandwidth)) { m_settingsMutex.lock(); @@ -331,7 +346,7 @@ void NFMDemod::apply() m_settingsMutex.unlock(); } - if((m_config.m_afBandwidth != m_running.m_afBandwidth) || + if ((m_config.m_afBandwidth != m_running.m_afBandwidth) || (m_config.m_audioSampleRate != m_running.m_audioSampleRate)) { m_settingsMutex.lock(); @@ -340,7 +355,7 @@ void NFMDemod::apply() m_settingsMutex.unlock(); } - if(m_config.m_squelch != m_running.m_squelch) + if (m_config.m_squelch != m_running.m_squelch) { m_squelchLevel = pow(10.0, m_config.m_squelch / 10.0); m_squelchLevel *= m_squelchLevel; @@ -355,4 +370,5 @@ void NFMDemod::apply() m_running.m_squelch = m_config.m_squelch; m_running.m_volume = m_config.m_volume; m_running.m_audioSampleRate = m_config.m_audioSampleRate; + m_running.m_ctcssOn = m_config.m_ctcssOn; } diff --git a/plugins/channel/nfm/nfmdemod.h b/plugins/channel/nfm/nfmdemod.h index 251fc6674..7835bba26 100644 --- a/plugins/channel/nfm/nfmdemod.h +++ b/plugins/channel/nfm/nfmdemod.h @@ -39,7 +39,12 @@ public: NFMDemod(); ~NFMDemod(); - void configure(MessageQueue* messageQueue, Real rfBandwidth, Real afBandwidth, Real volume, Real squelch); + void configure(MessageQueue* messageQueue, + Real rfBandwidth, + Real afBandwidth, + Real volume, + Real squelch, + bool ctcssOn); virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool po); virtual void start(); @@ -68,10 +73,15 @@ private: Real getAFBandwidth() const { return m_afBandwidth; } Real getVolume() const { return m_volume; } Real getSquelch() const { return m_squelch; } + bool getCtcssOn() const { return m_ctcssOn; } - static MsgConfigureNFMDemod* create(Real rfBandwidth, Real afBandwidth, Real volume, Real squelch) + static MsgConfigureNFMDemod* create(Real rfBandwidth, + Real afBandwidth, + Real volume, + Real squelch, + bool ctcssOn) { - return new MsgConfigureNFMDemod(rfBandwidth, afBandwidth, volume, squelch); + return new MsgConfigureNFMDemod(rfBandwidth, afBandwidth, volume, squelch, ctcssOn); } private: @@ -79,13 +89,19 @@ private: Real m_afBandwidth; Real m_volume; Real m_squelch; + bool m_ctcssOn; - MsgConfigureNFMDemod(Real rfBandwidth, Real afBandwidth, Real volume, Real squelch) : + MsgConfigureNFMDemod(Real rfBandwidth, + Real afBandwidth, + Real volume, + Real squelch, + bool ctcssOn) : Message(), m_rfBandwidth(rfBandwidth), m_afBandwidth(afBandwidth), m_volume(volume), - m_squelch(squelch) + m_squelch(squelch), + m_ctcssOn(ctcssOn) { } }; @@ -107,6 +123,7 @@ private: Real m_afBandwidth; Real m_squelch; Real m_volume; + bool m_ctcssOn; int m_ctcssIndex; quint32 m_audioSampleRate; @@ -117,6 +134,7 @@ private: m_afBandwidth(-1), m_squelch(0), m_volume(0), + m_ctcssOn(false), m_ctcssIndex(0), m_audioSampleRate(0) { } diff --git a/plugins/channel/nfm/nfmdemodgui.cpp b/plugins/channel/nfm/nfmdemodgui.cpp index 5959b7f53..7c27a2e40 100644 --- a/plugins/channel/nfm/nfmdemodgui.cpp +++ b/plugins/channel/nfm/nfmdemodgui.cpp @@ -52,6 +52,7 @@ void NFMDemodGUI::resetToDefaults() ui->volume->setValue(20); ui->squelch->setValue(-40); ui->deltaFrequency->setValue(0); + ui->ctcssOn->setChecked(false); blockApplySettings(false); applySettings(); @@ -67,6 +68,7 @@ QByteArray NFMDemodGUI::serialize() const s.writeS32(5, ui->squelch->value()); s.writeU32(7, m_channelMarker.getColor().rgb()); s.writeS32(8, ui->ctcss->currentIndex()); + s.writeBool(9, ui->ctcssOn->isChecked()); return s.final(); } @@ -85,6 +87,7 @@ bool NFMDemodGUI::deserialize(const QByteArray& data) QByteArray bytetmp; quint32 u32tmp; qint32 tmp; + bool boolTmp; blockApplySettings(true); m_channelMarker.blockSignals(true); @@ -108,6 +111,9 @@ bool NFMDemodGUI::deserialize(const QByteArray& data) d.readS32(8, &tmp, 0); ui->ctcss->setCurrentIndex(tmp); + d.readBool(9, &boolTmp, false); + ui->ctcssOn->setChecked(boolTmp); + blockApplySettings(false); m_channelMarker.blockSignals(false); @@ -179,6 +185,12 @@ void NFMDemodGUI::on_squelch_valueChanged(int value) applySettings(); } +void NFMDemodGUI::on_ctcssOn_toggled(bool checked) +{ + m_ctcssOn = checked; + applySettings(); +} + void NFMDemodGUI::on_ctcss_currentIndexChanged(int index) { if (m_nfmDemod != 0) @@ -280,7 +292,8 @@ void NFMDemodGUI::applySettings() m_rfBW[ui->rfBW->value()], ui->afBW->value() * 1000.0, ui->volume->value() / 10.0, - ui->squelch->value()); + ui->squelch->value(), + ui->ctcssOn->isChecked()); } } diff --git a/plugins/channel/nfm/nfmdemodgui.h b/plugins/channel/nfm/nfmdemodgui.h index affc5724e..9686e7d3f 100644 --- a/plugins/channel/nfm/nfmdemodgui.h +++ b/plugins/channel/nfm/nfmdemodgui.h @@ -43,6 +43,7 @@ private slots: void on_volume_valueChanged(int value); void on_squelch_valueChanged(int value); void on_ctcss_currentIndexChanged(int index); + void on_ctcssOn_toggled(bool checked); void onWidgetRolled(QWidget* widget, bool rollDown); void onMenuDoubleClicked(); @@ -56,6 +57,7 @@ private: ThreadedSampleSink* m_threadedChannelizer; Channelizer* m_channelizer; NFMDemod* m_nfmDemod; + bool m_ctcssOn; static const int m_rfBW[]; diff --git a/plugins/channel/nfm/nfmdemodgui.ui b/plugins/channel/nfm/nfmdemodgui.ui index f1d654c74..d40cd3dce 100644 --- a/plugins/channel/nfm/nfmdemodgui.ui +++ b/plugins/channel/nfm/nfmdemodgui.ui @@ -41,7 +41,34 @@ <property name="spacing"> <number>3</number> </property> - <item row="3" column="1"> + <item row="5" column="4"> + <layout class="QHBoxLayout" name="CTCSSblock"> + <item> + <widget class="QCheckBox" name="ctcssOn"> + <property name="toolTip"> + <string>Activate CTCSS</string> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item> + <widget class="QComboBox" name="ctcss"> + <property name="maximumSize"> + <size> + <width>16777215</width> + <height>16777215</height> + </size> + </property> + <property name="toolTip"> + <string>Set CTCSS Frequency</string> + </property> + </widget> + </item> + </layout> + </item> + <item row="3" column="4"> <widget class="QSlider" name="volume"> <property name="maximum"> <number>100</number> @@ -54,7 +81,7 @@ </property> </widget> </item> - <item row="1" column="1"> + <item row="1" column="4"> <widget class="QSlider" name="rfBW"> <property name="maximum"> <number>8</number> @@ -101,7 +128,7 @@ </property> </widget> </item> - <item row="4" column="1"> + <item row="4" column="4"> <widget class="QSlider" name="squelch"> <property name="minimum"> <number>-60</number> @@ -120,7 +147,14 @@ </property> </widget> </item> - <item row="1" column="2"> + <item row="3" column="0"> + <widget class="QLabel" name="volumeLabel"> + <property name="text"> + <string>Volume</string> + </property> + </widget> + </item> + <item row="1" column="6"> <widget class="QLabel" name="rfBWText"> <property name="minimumSize"> <size> @@ -136,7 +170,7 @@ </property> </widget> </item> - <item row="2" column="2"> + <item row="2" column="6"> <widget class="QLabel" name="afBWText"> <property name="minimumSize"> <size> @@ -152,14 +186,7 @@ </property> </widget> </item> - <item row="3" column="0"> - <widget class="QLabel" name="volumeLabel"> - <property name="text"> - <string>Volume</string> - </property> - </widget> - </item> - <item row="2" column="1"> + <item row="2" column="4"> <widget class="QSlider" name="afBW"> <property name="minimum"> <number>1</number> @@ -178,7 +205,7 @@ </property> </widget> </item> - <item row="4" column="2"> + <item row="4" column="6"> <widget class="QLabel" name="squelchText"> <property name="minimumSize"> <size> @@ -194,7 +221,7 @@ </property> </widget> </item> - <item row="3" column="2"> + <item row="3" column="6"> <widget class="QLabel" name="volumeText"> <property name="minimumSize"> <size> @@ -210,7 +237,7 @@ </property> </widget> </item> - <item row="0" column="2"> + <item row="0" column="6"> <widget class="QLabel" name="deltaUnits"> <property name="text"> <string>Hz</string> @@ -220,7 +247,14 @@ </property> </widget> </item> - <item row="0" column="1"> + <item row="5" column="0"> + <widget class="QLabel" name="ctcssLabel"> + <property name="text"> + <string>CTCSS</string> + </property> + </widget> + </item> + <item row="0" column="4"> <widget class="ValueDial" name="deltaFrequency" native="true"> <property name="sizePolicy"> <sizepolicy hsizetype="Maximum" vsizetype="Maximum"> @@ -251,21 +285,7 @@ </property> </widget> </item> - <item row="5" column="0"> - <widget class="QLabel" name="ctcssLabel"> - <property name="text"> - <string>CTCSS</string> - </property> - </widget> - </item> - <item row="5" column="1"> - <widget class="QComboBox" name="ctcss"> - <property name="toolTip"> - <string>Set CTCSS</string> - </property> - </widget> - </item> - <item row="5" column="2"> + <item row="5" column="6"> <widget class="QLabel" name="ctcssText"> <property name="toolTip"> <string>CTCSS detected</string>