diff --git a/plugins/channel/nfm/nfmdemod.cpp b/plugins/channel/nfm/nfmdemod.cpp index 01da5637b..3bfbe9017 100644 --- a/plugins/channel/nfm/nfmdemod.cpp +++ b/plugins/channel/nfm/nfmdemod.cpp @@ -19,6 +19,7 @@ #include #include #include "nfmdemod.h" +#include "nfmdemodgui.h" #include "audio/audiooutput.h" #include "dsp/dspcommands.h" #include "dsp/pidcontroller.h" @@ -28,6 +29,7 @@ MESSAGE_CLASS_DEFINITION(NFMDemod::MsgConfigureNFMDemod, Message) NFMDemod::NFMDemod(AudioFifo* audioFifo, SampleSink* sampleSink) : + m_ctcssIndex(0), m_sampleCount(0), m_sampleSink(sampleSink), m_audioFifo(audioFifo) @@ -49,7 +51,7 @@ NFMDemod::NFMDemod(AudioFifo* audioFifo, SampleSink* sampleSink) : m_agcLevel = 0.003; m_AGC.resize(4096, m_agcLevel, 0, 0.1*m_agcLevel); - m_ctcssDetector.setCoefficients(1200, 6000.0); // 0.2s detection rate + m_ctcssDetector.setCoefficients(3000, 6000.0); // 0.5s / 2 Hz resolution } NFMDemod::~NFMDemod() @@ -112,7 +114,8 @@ void NFMDemod::feed(SampleVector::const_iterator begin, SampleVector::const_iter m_squelchState = m_running.m_audioSampleRate/ 20; qint16 sample; - if(m_squelchState > 0) { + if(m_squelchState > 0) + { m_squelchState--; m_AGC.feed(abs(ci)); @@ -166,16 +169,39 @@ void NFMDemod::feed(SampleVector::const_iterator begin, SampleVector::const_iter if (m_ctcssDetector.getDetectedTone(maxToneIndex)) { - std::cerr << "CTCSS tone detected: " << m_ctcssDetector.getToneSet()[maxToneIndex] << std::endl; + if (maxToneIndex+1 != m_ctcssIndex) { + m_nfmDemodGUI->setCtcssFreq(m_ctcssDetector.getToneSet()[maxToneIndex]); + m_ctcssIndex = maxToneIndex+1; + } + } + else + { + if (m_ctcssIndex != 0) { + m_nfmDemodGUI->setCtcssFreq(0); + m_ctcssIndex = 0; + } } } } - demod = m_bandpass.filter(demod); - demod *= m_running.m_volume; - sample = demod * ((1<<16)/301); // denominator = bandpass filter number of taps + if (m_ctcssIndexSelected && (m_ctcssIndexSelected != m_ctcssIndex)) + { + sample = 0.0; + } + else + { + demod = m_bandpass.filter(demod); + demod *= m_running.m_volume; + sample = demod * ((1<<15)/301); // denominator = bandpass filter number of taps + } + } + else + { + if (m_ctcssIndex != 0) { + m_nfmDemodGUI->setCtcssFreq(0); + m_ctcssIndex = 0; + } - } else { m_AGC.close(); sample = 0; } diff --git a/plugins/channel/nfm/nfmdemod.h b/plugins/channel/nfm/nfmdemod.h index df9a6e2c9..d5eaf426f 100644 --- a/plugins/channel/nfm/nfmdemod.h +++ b/plugins/channel/nfm/nfmdemod.h @@ -31,6 +31,7 @@ #include "util/message.h" class AudioFifo; +class NFMDemodGUI; class NFMDemod : public SampleSink { public: @@ -44,6 +45,19 @@ public: void stop(); bool handleMessage(Message* cmd); + void registerGUI(NFMDemodGUI *nfmDemodGUI) { + m_nfmDemodGUI = nfmDemodGUI; + } + + const Real *getCtcssToneSet(int& nbTones) const { + nbTones = m_ctcssDetector.getNTones(); + return m_ctcssDetector.getToneSet(); + } + + void setSelectedCtcssIndex(int selectedCtcssIndex) { + m_ctcssIndexSelected = selectedCtcssIndex; + } + private: class MsgConfigureNFMDemod : public Message { MESSAGE_CLASS_DECLARATION @@ -92,6 +106,7 @@ private: Real m_afBandwidth; Real m_squelch; Real m_volume; + int m_ctcssIndex; quint32 m_audioSampleRate; Config() : @@ -101,6 +116,7 @@ private: m_afBandwidth(-1), m_squelch(0), m_volume(0), + m_ctcssIndex(0), m_audioSampleRate(0) { } }; @@ -116,6 +132,8 @@ private: Lowpass m_lowpass; Bandpass m_bandpass; CTCSSDetector m_ctcssDetector; + int m_ctcssIndex; // 0 for nothing detected + int m_ctcssIndexSelected; int m_sampleCount; Real m_squelchLevel; @@ -136,6 +154,8 @@ private: AudioFifo* m_audioFifo; SampleVector m_sampleBuffer; + NFMDemodGUI *m_nfmDemodGUI; + void apply(); }; diff --git a/plugins/channel/nfm/nfmdemodgui.cpp b/plugins/channel/nfm/nfmdemodgui.cpp index 3533a6c90..eb6681400 100644 --- a/plugins/channel/nfm/nfmdemodgui.cpp +++ b/plugins/channel/nfm/nfmdemodgui.cpp @@ -151,6 +151,12 @@ void NFMDemodGUI::on_squelch_valueChanged(int value) applySettings(); } +void NFMDemodGUI::on_ctcss_currentIndexChanged(int index) +{ + if (m_nfmDemod != NULL) { + m_nfmDemod->setSelectedCtcssIndex(index); + } +} void NFMDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown) { @@ -182,7 +188,19 @@ NFMDemodGUI::NFMDemodGUI(PluginAPI* pluginAPI, QWidget* parent) : m_audioFifo = new AudioFifo(4, 48000); m_nullSink = new NullSink(); + m_nfmDemod = new NFMDemod(m_audioFifo, m_nullSink); + m_nfmDemod->registerGUI(this); + + int ctcss_nbTones; + const Real *ctcss_tones = m_nfmDemod->getCtcssToneSet(ctcss_nbTones); + + ui->ctcss->addItem("--"); + + for (int i=0; ictcss->addItem(QString("%1").arg(ctcss_tones[i])); + } + m_channelizer = new Channelizer(m_nfmDemod); m_threadedSampleSink = new ThreadedSampleSink(m_channelizer); m_pluginAPI->addAudioSource(m_audioFifo); @@ -238,3 +256,15 @@ void NFMDemodGUI::enterEvent(QEvent*) m_channelMarker->setHighlighted(true); } +void NFMDemodGUI::setCtcssFreq(Real ctcssFreq) +{ + if (ctcssFreq == 0) + { + ui->ctcssText->setText("--"); + } + else + { + ui->ctcssText->setText(QString("%1").arg(ctcssFreq)); + } +} + diff --git a/plugins/channel/nfm/nfmdemodgui.h b/plugins/channel/nfm/nfmdemodgui.h index 67319efb7..b502a45ff 100644 --- a/plugins/channel/nfm/nfmdemodgui.h +++ b/plugins/channel/nfm/nfmdemodgui.h @@ -3,6 +3,7 @@ #include "gui/rollupwidget.h" #include "plugin/plugingui.h" +#include "dsp/dsptypes.h" class PluginAPI; class ChannelMarker; @@ -32,6 +33,7 @@ public: bool deserialize(const QByteArray& data); bool handleMessage(Message* message); + void setCtcssFreq(Real ctcssFreq); private slots: void viewChanged(); @@ -41,6 +43,7 @@ private slots: void on_afBW_valueChanged(int value); void on_volume_valueChanged(int value); void on_squelch_valueChanged(int value); + void on_ctcss_currentIndexChanged(int index); void onWidgetRolled(QWidget* widget, bool rollDown); void onMenuDoubleClicked(); diff --git a/plugins/channel/nfm/nfmdemodgui.ui b/plugins/channel/nfm/nfmdemodgui.ui index 970b46eec..120826f94 100644 --- a/plugins/channel/nfm/nfmdemodgui.ui +++ b/plugins/channel/nfm/nfmdemodgui.ui @@ -7,7 +7,7 @@ 0 0 302 - 138 + 151 @@ -19,7 +19,7 @@ 35 35 242 - 96 + 111 @@ -81,19 +81,26 @@ - + Squelch - + AF Bandwidth + + + + RF Bandwidth + + + @@ -126,13 +133,6 @@ - - - - RF Bandwidth - - - @@ -149,6 +149,13 @@ + + + + Volume + + + @@ -184,13 +191,6 @@ - - - - Volume - - - @@ -207,6 +207,13 @@ + + + + Hz + + + @@ -238,10 +245,23 @@ - - + + - Hz + CTCSS + + + + + + + + + + -- + + + Qt::AlignCenter