diff --git a/plugins/channel/demoddsd/dsddecoder.h b/plugins/channel/demoddsd/dsddecoder.h index 02bdb2409..8d3f3a25a 100644 --- a/plugins/channel/demoddsd/dsddecoder.h +++ b/plugins/channel/demoddsd/dsddecoder.h @@ -33,8 +33,14 @@ public: void resetAudio() { m_decoder.resetAudio(); } int getInLevel() const { return m_decoder.getInLevel(); } + int getSamplesPerSymbol() const { return m_decoder.getSamplesPerSymbol(); } + 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(); } const char *getModulationText() const { return m_decoder.getModulationText(); } + const char *getSlot0Text() const { return m_decoder.getSlot0Text(); } + const char *getSlot1Text() const { return m_decoder.getSlot1Text(); } + const DSDcc::DSDDstar& getDStarDecoder() const { return m_decoder.getDStarDecoder(); } void setAudioGain(float gain) { m_decoder.setAudioGain(gain); } diff --git a/plugins/channel/demoddsd/dsddemod.cpp b/plugins/channel/demoddsd/dsddemod.cpp index 6df2f1fd5..a546a1802 100644 --- a/plugins/channel/demoddsd/dsddemod.cpp +++ b/plugins/channel/demoddsd/dsddemod.cpp @@ -95,6 +95,7 @@ void DSDDemod::configure(MessageQueue* messageQueue, void DSDDemod::feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool firstOfBurst) { Complex ci; + int samplesPerSymbol = m_dsdDecoder.getSamplesPerSymbol(); m_settingsMutex.lock(); m_scopeSampleBuffer.clear(); @@ -147,10 +148,10 @@ void DSDDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto m_sampleBuffer[m_sampleBufferIndex] = sample; - if (m_sampleBufferIndex < 20) { - delayedSample = m_sampleBuffer[(1<<17) - 20 + m_sampleBufferIndex]; + if (m_sampleBufferIndex < samplesPerSymbol) { + delayedSample = m_sampleBuffer[(1<<17) - samplesPerSymbol + m_sampleBufferIndex]; // wrap } else { - delayedSample = m_sampleBuffer[m_sampleBufferIndex - 20]; + delayedSample = m_sampleBuffer[m_sampleBufferIndex - samplesPerSymbol]; } Sample s(sample, delayedSample); // I=signal, Q=signal delayed by 20 samples (2400 baud: lowest rate) diff --git a/plugins/channel/demoddsd/dsddemod.h b/plugins/channel/demoddsd/dsddemod.h index c4c38fea8..23e42011b 100644 --- a/plugins/channel/demoddsd/dsddemod.h +++ b/plugins/channel/demoddsd/dsddemod.h @@ -58,7 +58,7 @@ public: m_dsdDemodGUI = dsdDemodGUI; } - Real getMagSq() { return m_magsq; } + Real getMagSq() { return m_movingAverage.average(); } bool getSquelchOpen() const { return m_squelchOpen; } const DSDDecoder& getDecoder() const { return m_dsdDecoder; } diff --git a/plugins/channel/demoddsd/dsddemodgui.cpp b/plugins/channel/demoddsd/dsddemodgui.cpp index 56a1aff06..6ed11e664 100644 --- a/plugins/channel/demoddsd/dsddemodgui.cpp +++ b/plugins/channel/demoddsd/dsddemodgui.cpp @@ -250,6 +250,7 @@ DSDDemodGUI::DSDDemodGUI(PluginAPI* pluginAPI, QWidget* parent) : m_channelMarker(this), m_basicSettingsShown(false), m_doApplySettings(true), + m_signalFormat(signalFormatNone), m_squelchOpen(false), m_channelPowerDbAvg(20,0), m_tickCount(0) @@ -353,6 +354,80 @@ void DSDDemodGUI::blockApplySettings(bool block) m_doApplySettings = !block; } +void DSDDemodGUI::formatStatusText() +{ + switch (m_dsdDemod->getDecoder().getSyncType()) + { + case DSDcc::DSDDecoder::DSDSyncDMRDataN: + case DSDcc::DSDDecoder::DSDSyncDMRDataP: + case DSDcc::DSDDecoder::DSDSyncDMRVoiceN: + case DSDcc::DSDDecoder::DSDSyncDMRVoiceP: + if (m_signalFormat != signalFormatDMR) + { + memcpy(m_formatStatusText, "Station: ", 9); + memcpy(&m_formatStatusText[12], "TDMA: ", 6); + } + + switch (m_dsdDemod->getDecoder().getStationType()) + { + case DSDcc::DSDDecoder::DSDBaseStation: + memcpy(&m_formatStatusText[9], "BS ", 3); + break; + case DSDcc::DSDDecoder::DSDMobileStation: + memcpy(&m_formatStatusText[9], "MS ", 3); + break; + default: + memcpy(&m_formatStatusText[9], "NA ", 3); + break; + } + + memcpy(&m_formatStatusText[18], m_dsdDemod->getDecoder().getSlot0Text(), 7); + m_formatStatusText[25] = ' '; + memcpy(&m_formatStatusText[26], m_dsdDemod->getDecoder().getSlot1Text(), 7); + m_formatStatusText[33] = '\0'; + m_signalFormat = signalFormatDMR; + + break; + case DSDcc::DSDDecoder::DSDSyncDStarHeaderN: + case DSDcc::DSDDecoder::DSDSyncDStarHeaderP: + case DSDcc::DSDDecoder::DSDSyncDStarN: + case DSDcc::DSDDecoder::DSDSyncDStarP: + if (m_signalFormat != signalFormatDStar) + { + strcpy(m_formatStatusText, "RPT1: ________ RPT2: ________ YOUR: ________ MY: ________/____"); + } + + { + const std::string& rpt1 = m_dsdDemod->getDecoder().getDStarDecoder().getRpt1(); + const std::string& rpt2 = m_dsdDemod->getDecoder().getDStarDecoder().getRpt2(); + const std::string& mySign = m_dsdDemod->getDecoder().getDStarDecoder().getMySign(); + const std::string& yrSign = m_dsdDemod->getDecoder().getDStarDecoder().getYourSign(); + + if (rpt1.length() > 0) { // 0 or 8 + memcpy(&m_formatStatusText[6], rpt1.c_str(), 8); + } + if (rpt2.length() > 0) { // 0 or 8 + memcpy(&m_formatStatusText[21], rpt2.c_str(), 8); + } + if (yrSign.length() > 0) { // 0 or 8 + memcpy(&m_formatStatusText[36], yrSign.c_str(), 8); + } + if (mySign.length() > 0) { // 0 or 13 + memcpy(&m_formatStatusText[49], mySign.c_str(), 13); + } + } + + m_signalFormat = signalFormatDStar; + break; + default: + m_signalFormat = signalFormatNone; + m_formatStatusText[0] = '\0'; + break; + } + + m_formatStatusText[80] = '\0'; // guard +} + void DSDDemodGUI::tick() { Real powDb = CalcDb::dbPower(m_dsdDemod->getMagSq()); @@ -382,6 +457,10 @@ void DSDDemodGUI::tick() ui->inLevelText->setText(QString::number(m_dsdDemod->getDecoder().getInLevel())); ui->syncText->setText(QString(m_dsdDemod->getDecoder().getFrameTypeText())); ui->modulationText->setText(QString(m_dsdDemod->getDecoder().getModulationText())); + + formatStatusText(); + ui->formatStatusText->setText(QString(m_formatStatusText)); + m_tickCount = 0; } } diff --git a/plugins/channel/demoddsd/dsddemodgui.h b/plugins/channel/demoddsd/dsddemodgui.h index bfcb065a6..feb4418c1 100644 --- a/plugins/channel/demoddsd/dsddemodgui.h +++ b/plugins/channel/demoddsd/dsddemodgui.h @@ -55,6 +55,7 @@ public: private slots: void viewChanged(); + void formatStatusText(); void on_deltaFrequency_changed(quint64 value); void on_deltaMinus_toggled(bool minus); void on_rfBW_valueChanged(int index); @@ -69,11 +70,20 @@ private slots: void tick(); private: + typedef enum + { + signalFormatNone, + signalFormatDMR, + signalFormatDStar + } SignalFormat; + Ui::DSDDemodGUI* ui; PluginAPI* m_pluginAPI; ChannelMarker m_channelMarker; bool m_basicSettingsShown; bool m_doApplySettings; + char m_formatStatusText[80+1]; //!< Fixed signal format dependent status text + SignalFormat m_signalFormat; ThreadedSampleSink* m_threadedChannelizer; Channelizer* m_channelizer; diff --git a/plugins/channel/demoddsd/dsddemodgui.ui b/plugins/channel/demoddsd/dsddemodgui.ui index 6ac0a0048..cef8fadf2 100644 --- a/plugins/channel/demoddsd/dsddemodgui.ui +++ b/plugins/channel/demoddsd/dsddemodgui.ui @@ -36,12 +36,12 @@ 0 0 - 501 + 521 171 - + 0 0 @@ -577,6 +577,36 @@ + + + + + + + 400 + 0 + + + + ___ + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + +