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
+
+
+
+
+
+