diff --git a/plugins/samplesource/sdrdaemon/sdrdaemonbuffer.cpp b/plugins/samplesource/sdrdaemon/sdrdaemonbuffer.cpp
index ac4156949..8304090ce 100644
--- a/plugins/samplesource/sdrdaemon/sdrdaemonbuffer.cpp
+++ b/plugins/samplesource/sdrdaemon/sdrdaemonbuffer.cpp
@@ -61,7 +61,7 @@ SDRdaemonBuffer::SDRdaemonBuffer(uint32_t throttlems) :
m_skewCorrection(false),
m_readCount(0),
m_writeCount(0),
- m_nbCycles(0)
+ m_nbCycles(0)
{
m_currentMeta.init();
}
diff --git a/plugins/samplesource/sdrdaemon/sdrdaemonbuffer.h b/plugins/samplesource/sdrdaemon/sdrdaemonbuffer.h
index af7c3fd11..559cfeaac 100644
--- a/plugins/samplesource/sdrdaemon/sdrdaemonbuffer.h
+++ b/plugins/samplesource/sdrdaemon/sdrdaemonbuffer.h
@@ -80,6 +80,28 @@ public:
uint32_t getLz4SuccessfulDecodes() const { return m_nbLastLz4SuccessfulDecodes; }
void setAutoFollowRate(bool autoFollowRate) { m_autoFollowRate = autoFollowRate; }
+ /** Get buffer gauge value in % of buffer size ([-50:50])
+ * [-50:0] : write leads or read lags
+ * [0:50] : read leads or write lags
+ */
+ inline int32_t getBufferGauge() const
+ {
+ if (m_rawSize)
+ {
+ int32_t val = ((m_writeIndex - m_readIndex) * 100) / m_rawSize;
+
+ if (val < 0) {
+ return (val < -50 ? 100 - val : val);
+ } else {
+ return (val > 50 ? val - 100 : val);
+ }
+ }
+ else
+ {
+ return -50;
+ }
+ }
+
static const int m_udpPayloadSize;
static const int m_sampleSize;
static const int m_iqSampleSize;
diff --git a/plugins/samplesource/sdrdaemon/sdrdaemongui.cpp b/plugins/samplesource/sdrdaemon/sdrdaemongui.cpp
index 114132c2d..eb11fa5f2 100644
--- a/plugins/samplesource/sdrdaemon/sdrdaemongui.cpp
+++ b/plugins/samplesource/sdrdaemon/sdrdaemongui.cpp
@@ -45,6 +45,7 @@ SDRdaemonGui::SDRdaemonGui(PluginAPI* pluginAPI, QWidget* parent) :
m_compressionRatio(1.0),
m_nbLz4DataCRCOK(0),
m_nbLz4SuccessfulDecodes(0),
+ m_bufferGauge(-50),
m_samplesCount(0),
m_tickCount(0),
m_address("127.0.0.1"),
@@ -227,6 +228,7 @@ bool SDRdaemonGui::handleMessage(const Message& message)
m_nbLz4DataCRCOK = ((SDRdaemonInput::MsgReportSDRdaemonStreamTiming&)message).getLz4DataCRCOK();
m_nbLz4SuccessfulDecodes = ((SDRdaemonInput::MsgReportSDRdaemonStreamTiming&)message).getLz4SuccessfulDecodes();
+ m_bufferGauge = ((SDRdaemonInput::MsgReportSDRdaemonStreamTiming&)message).getBufferGauge();
updateWithStreamTime();
return true;
@@ -384,6 +386,9 @@ void SDRdaemonGui::updateWithStreamTime()
s = QString::number(m_nbLz4SuccessfulDecodes, 'f', 0);
ui->lz4DecodesOKText->setText(tr("%1").arg(s));
+
+ ui->bufferGaugeNegative->setValue((m_bufferGauge < 0 ? 50 + m_bufferGauge : 0));
+ ui->bufferGaugePositive->setValue((m_bufferGauge < 0 ? 0 : 50 - m_bufferGauge));
}
void SDRdaemonGui::tick()
diff --git a/plugins/samplesource/sdrdaemon/sdrdaemongui.h b/plugins/samplesource/sdrdaemon/sdrdaemongui.h
index 2957d5fa9..28688e97a 100644
--- a/plugins/samplesource/sdrdaemon/sdrdaemongui.h
+++ b/plugins/samplesource/sdrdaemon/sdrdaemongui.h
@@ -66,6 +66,7 @@ private:
uint32_t m_nbLz4DataCRCOK;
uint32_t m_nbLz4SuccessfulDecodes;
+ int32_t m_bufferGauge;
int m_samplesCount;
std::size_t m_tickCount;
diff --git a/plugins/samplesource/sdrdaemon/sdrdaemongui.ui b/plugins/samplesource/sdrdaemon/sdrdaemongui.ui
index c3a674f80..d0a11ea89 100644
--- a/plugins/samplesource/sdrdaemon/sdrdaemongui.ui
+++ b/plugins/samplesource/sdrdaemon/sdrdaemongui.ui
@@ -7,7 +7,7 @@
0
0
398
- 156
+ 175
@@ -29,7 +29,16 @@
3
-
+
+ 2
+
+
+ 2
+
+
+ 2
+
+
2
-
@@ -167,6 +176,63 @@
+ -
+
+
-
+
+
+
+ 16777215
+ 10
+
+
+
+ Main buffer gauge: write leads read lags
+
+
+ 0
+
+
+ 50
+
+
+ 0
+
+
+ false
+
+
+ true
+
+
+ %v
+
+
+
+ -
+
+
+
+ 16777215
+ 10
+
+
+
+ Main buffer gauge: read leads write lags
+
+
+ 50
+
+
+ 0
+
+
+ false
+
+
+
+
+
-
diff --git a/plugins/samplesource/sdrdaemon/sdrdaemoninput.h b/plugins/samplesource/sdrdaemon/sdrdaemoninput.h
index a8125f859..5985d000a 100644
--- a/plugins/samplesource/sdrdaemon/sdrdaemoninput.h
+++ b/plugins/samplesource/sdrdaemon/sdrdaemoninput.h
@@ -194,6 +194,7 @@ public:
float getLz4CompressionRatio() const { return m_compressionRatio; }
uint32_t getLz4DataCRCOK() const { return m_nbLz4CRCOK; }
uint32_t getLz4SuccessfulDecodes() const { return m_nbLz4SuccessfulDecodes; }
+ int32_t getBufferGauge() const { return m_bufferGauge; }
static MsgReportSDRdaemonStreamTiming* create(uint32_t tv_sec,
uint32_t tv_usec,
@@ -202,7 +203,8 @@ public:
bool lz4,
float compressionRatio,
uint32_t nbLz4CRCOK,
- uint32_t nbLz4SuccessfulDecodes)
+ uint32_t nbLz4SuccessfulDecodes,
+ int32_t bufferGauge)
{
return new MsgReportSDRdaemonStreamTiming(tv_sec,
tv_usec,
@@ -211,7 +213,8 @@ public:
lz4,
compressionRatio,
nbLz4CRCOK,
- nbLz4SuccessfulDecodes);
+ nbLz4SuccessfulDecodes,
+ bufferGauge);
}
protected:
@@ -223,6 +226,7 @@ public:
float m_compressionRatio;
uint32_t m_nbLz4CRCOK;
uint32_t m_nbLz4SuccessfulDecodes;
+ int32_t m_bufferGauge;
MsgReportSDRdaemonStreamTiming(uint32_t tv_sec,
uint32_t tv_usec,
@@ -231,7 +235,8 @@ public:
bool lz4,
float compressionRatio,
uint32_t nbLz4CRCOK,
- uint32_t nbLz4SuccessfulDecodes) :
+ uint32_t nbLz4SuccessfulDecodes,
+ int32_t bufferGauge) :
Message(),
m_tv_sec(tv_sec),
m_tv_usec(tv_usec),
@@ -240,7 +245,8 @@ public:
m_lz4(lz4),
m_compressionRatio(compressionRatio),
m_nbLz4CRCOK(nbLz4CRCOK),
- m_nbLz4SuccessfulDecodes(nbLz4SuccessfulDecodes)
+ m_nbLz4SuccessfulDecodes(nbLz4SuccessfulDecodes),
+ m_bufferGauge(bufferGauge)
{ }
};
diff --git a/plugins/samplesource/sdrdaemon/sdrdaemonudphandler.cpp b/plugins/samplesource/sdrdaemon/sdrdaemonudphandler.cpp
index 814090e81..15afcdbc2 100644
--- a/plugins/samplesource/sdrdaemon/sdrdaemonudphandler.cpp
+++ b/plugins/samplesource/sdrdaemon/sdrdaemonudphandler.cpp
@@ -241,7 +241,8 @@ void SDRdaemonUDPHandler::tick()
m_sdrDaemonBuffer.isLz4Compressed(),
m_sdrDaemonBuffer.getCompressionRatio(),
m_sdrDaemonBuffer.getLz4DataCRCOK(),
- m_sdrDaemonBuffer.getLz4SuccessfulDecodes());
+ m_sdrDaemonBuffer.getLz4SuccessfulDecodes(),
+ m_sdrDaemonBuffer.getBufferGauge());
m_outputMessageQueueToGUI->push(report);
}
}