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); } }