1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-09-05 22:57:47 -04:00

SDRdaemonFEC plugin: improve stats on GUI

This commit is contained in:
Edouard Griffiths 2016-07-27 18:49:17 +02:00
parent 286ea81470
commit aa68c907fa
7 changed files with 108 additions and 32 deletions

View File

@ -33,6 +33,7 @@ SDRdaemonFECBuffer::SDRdaemonFECBuffer(uint32_t throttlems) :
m_decoderIndexHead(nbDecoderSlots/2), m_decoderIndexHead(nbDecoderSlots/2),
m_curNbBlocks(0), m_curNbBlocks(0),
m_minNbBlocks(256), m_minNbBlocks(256),
m_minOriginalBlocks(128),
m_curNbRecovery(0), m_curNbRecovery(0),
m_maxNbRecovery(0), m_maxNbRecovery(0),
m_framesDecoded(true), m_framesDecoded(true),
@ -89,8 +90,10 @@ void SDRdaemonFECBuffer::initDecodeSlot(int slotIndex)
// collect stats before voiding the slot // collect stats before voiding the slot
m_curNbBlocks = m_decoderSlots[slotIndex].m_blockCount; m_curNbBlocks = m_decoderSlots[slotIndex].m_blockCount;
m_curOriginalBlocks = m_decoderSlots[slotIndex].m_originalCount;
m_curNbRecovery = m_decoderSlots[slotIndex].m_recoveryCount; m_curNbRecovery = m_decoderSlots[slotIndex].m_recoveryCount;
m_avgNbBlocks(m_curNbBlocks); m_avgNbBlocks(m_curNbBlocks);
m_avgOrigBlocks(m_curOriginalBlocks);
m_avgNbRecovery(m_curNbRecovery); m_avgNbRecovery(m_curNbRecovery);
m_framesDecoded = m_framesDecoded && m_decoderSlots[slotIndex].m_decoded; m_framesDecoded = m_framesDecoded && m_decoderSlots[slotIndex].m_decoded;
@ -98,6 +101,10 @@ void SDRdaemonFECBuffer::initDecodeSlot(int slotIndex)
m_minNbBlocks = m_curNbBlocks; m_minNbBlocks = m_curNbBlocks;
} }
if (m_curOriginalBlocks < m_minOriginalBlocks) {
m_minOriginalBlocks = m_curOriginalBlocks;
}
if (m_curNbRecovery > m_maxNbRecovery) { if (m_curNbRecovery > m_maxNbRecovery) {
m_maxNbRecovery = m_curNbRecovery; m_maxNbRecovery = m_curNbRecovery;
} }

View File

@ -100,8 +100,10 @@ public:
// stats // stats
int getCurNbBlocks() const { return m_curNbBlocks; } int getCurNbBlocks() const { return m_curNbBlocks; }
int getCurOriginalBlocks() const { return m_curOriginalBlocks; }
int getCurNbRecovery() const { return m_curNbRecovery; } int getCurNbRecovery() const { return m_curNbRecovery; }
float getAvgNbBlocks() const { return m_avgNbBlocks; } float getAvgNbBlocks() const { return m_avgNbBlocks; }
float getAvgOriginalBlocks() const { return m_avgOrigBlocks; }
float getAvgNbRecovery() const { return m_avgNbRecovery; } float getAvgNbRecovery() const { return m_avgNbRecovery; }
int getMinNbBlocks() int getMinNbBlocks()
@ -111,6 +113,13 @@ public:
return minNbBlocks; return minNbBlocks;
} }
int getMinOriginalBlocks()
{
int minOriginalBlocks = m_minOriginalBlocks;
m_minOriginalBlocks = 128;
return minOriginalBlocks;
}
int getMaxNbRecovery() int getMaxNbRecovery()
{ {
int maxNbRecovery = m_maxNbRecovery; int maxNbRecovery = m_maxNbRecovery;
@ -183,9 +192,12 @@ private:
int m_frameHead; //!< index of the current head frame sent int m_frameHead; //!< index of the current head frame sent
int m_curNbBlocks; //!< (stats) instantaneous number of blocks received int m_curNbBlocks; //!< (stats) instantaneous number of blocks received
int m_minNbBlocks; //!< (stats) minimum number of blocks received since last poll int m_minNbBlocks; //!< (stats) minimum number of blocks received since last poll
int m_curOriginalBlocks; //!< (stats) instantanous number of original blocks received
int m_minOriginalBlocks; //!< (stats) minimum number of original blocks received since last poll
int m_curNbRecovery; //!< (stats) instantaneous number of recovery blocks used int m_curNbRecovery; //!< (stats) instantaneous number of recovery blocks used
int m_maxNbRecovery; //!< (stats) maximum number of recovery blocks used since last poll int m_maxNbRecovery; //!< (stats) maximum number of recovery blocks used since last poll
MovingAverage<int, int, 10> m_avgNbBlocks; //!< (stats) average number of blocks received MovingAverage<int, int, 10> m_avgNbBlocks; //!< (stats) average number of blocks received
MovingAverage<int, int, 10> m_avgOrigBlocks; //!< (stats) average number of original blocks received
MovingAverage<int, int, 10> m_avgNbRecovery; //!< (stats) average number of recovery blocks used MovingAverage<int, int, 10> m_avgNbRecovery; //!< (stats) average number of recovery blocks used
bool m_framesDecoded; //!< [stats] true if all frames were decoded since last poll bool m_framesDecoded; //!< [stats] true if all frames were decoded since last poll
int m_readIndex; //!< current byte read index in frames buffer int m_readIndex; //!< current byte read index in frames buffer

View File

@ -291,8 +291,10 @@ bool SDRdaemonFECGui::handleMessage(const Message& message)
m_bufferLengthInSecs = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).getBufferLengthInSecs(); m_bufferLengthInSecs = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).getBufferLengthInSecs();
m_bufferGauge = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).getBufferGauge(); m_bufferGauge = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).getBufferGauge();
m_minNbBlocks = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).getMinNbBlocks(); m_minNbBlocks = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).getMinNbBlocks();
m_maxNbRecovery = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).getmAXNbRecovery(); m_minNbOriginalBlocks = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).getMinNbOriginalBlocks();
m_maxNbRecovery = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).getMaxNbRecovery();
m_avgNbBlocks = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).getAvgNbBlocks(); m_avgNbBlocks = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).getAvgNbBlocks();
m_avgNbOriginalBlocks = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).getAvgNbOriginalBlocks();
m_avgNbRecovery = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).getAvgNbRecovery(); m_avgNbRecovery = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).getAvgNbRecovery();
m_nbOriginalBlocks = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).getNbOriginalBlocksPerFrame(); m_nbOriginalBlocks = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).getNbOriginalBlocksPerFrame();
m_nbFECBlocks = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).getNbFECBlocksPerFrame(); m_nbFECBlocks = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).getNbFECBlocksPerFrame();
@ -625,8 +627,11 @@ void SDRdaemonFECGui::updateWithStreamTime()
s = QString::number(m_avgNbBlocks, 'f', 1); s = QString::number(m_avgNbBlocks, 'f', 1);
ui->avgNbBlocksText->setText(tr("%1").arg(s)); ui->avgNbBlocksText->setText(tr("%1").arg(s));
s = QString::number(m_minNbOriginalBlocks, 'f', 0);
ui->minNbOriginalText->setText(tr("%1").arg(s));
s = QString::number(m_maxNbRecovery, 'f', 0); s = QString::number(m_maxNbRecovery, 'f', 0);
ui->curNbRecoveryText->setText(tr("%1").arg(s)); ui->maxNbRecoveryText->setText(tr("%1").arg(s));
s = QString::number(m_avgNbRecovery, 'f', 1); s = QString::number(m_avgNbRecovery, 'f', 1);
ui->avgNbRecoveryText->setText(tr("%1").arg(s)); ui->avgNbRecoveryText->setText(tr("%1").arg(s));
@ -672,4 +677,3 @@ void SDRdaemonFECGui::tick()
m_sampleSource->getInputMessageQueue()->push(message); m_sampleSource->getInputMessageQueue()->push(message);
} }
} }

View File

@ -68,8 +68,10 @@ private:
float m_bufferLengthInSecs; float m_bufferLengthInSecs;
int32_t m_bufferGauge; int32_t m_bufferGauge;
int m_minNbBlocks; int m_minNbBlocks;
int m_minNbOriginalBlocks;
int m_maxNbRecovery; int m_maxNbRecovery;
float m_avgNbBlocks; float m_avgNbBlocks;
float m_avgNbOriginalBlocks;
float m_avgNbRecovery; float m_avgNbRecovery;
int m_nbOriginalBlocks; int m_nbOriginalBlocks;
int m_nbFECBlocks; int m_nbFECBlocks;

View File

@ -29,7 +29,16 @@
<property name="spacing"> <property name="spacing">
<number>3</number> <number>3</number>
</property> </property>
<property name="margin"> <property name="leftMargin">
<number>2</number>
</property>
<property name="topMargin">
<number>2</number>
</property>
<property name="rightMargin">
<number>2</number>
</property>
<property name="bottomMargin">
<number>2</number> <number>2</number>
</property> </property>
<item> <item>
@ -339,13 +348,6 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="Line" name="lineStream3">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
</item>
<item> <item>
<widget class="QLabel" name="avgNbBlocksText"> <widget class="QLabel" name="avgNbBlocksText">
<property name="minimumSize"> <property name="minimumSize">
@ -373,7 +375,33 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLabel" name="curNbRecoveryText"> <widget class="QLabel" name="minNbOriginalText">
<property name="minimumSize">
<size>
<width>24</width>
<height>0</height>
</size>
</property>
<property name="toolTip">
<string>Minimum number of original blocks retrieved per frame</string>
</property>
<property name="text">
<string>000</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="Line" name="lineStream5">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="maxNbRecoveryText">
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>24</width> <width>24</width>
@ -391,13 +419,6 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="Line" name="lineStream5">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
</item>
<item> <item>
<widget class="QLabel" name="avgNbRecoveryText"> <widget class="QLabel" name="avgNbRecoveryText">
<property name="minimumSize"> <property name="minimumSize">
@ -906,6 +927,23 @@
</customwidgets> </customwidgets>
<resources> <resources>
<include location="../../../sdrbase/resources/res.qrc"/> <include location="../../../sdrbase/resources/res.qrc"/>
<include location="../../../sdrbase/resources/res.qrc"/>
<include location="../../../sdrbase/resources/res.qrc"/>
<include location="../../../sdrbase/resources/res.qrc"/>
<include location="../../../sdrbase/resources/res.qrc"/>
<include location="../../../sdrbase/resources/res.qrc"/>
<include location="../../../sdrbase/resources/res.qrc"/>
<include location="../../../sdrbase/resources/res.qrc"/>
<include location="../../../sdrbase/resources/res.qrc"/>
<include location="../../../sdrbase/resources/res.qrc"/>
<include location="../../../sdrbase/resources/res.qrc"/>
<include location="../../../sdrbase/resources/res.qrc"/>
<include location="../../../sdrbase/resources/res.qrc"/>
<include location="../../../sdrbase/resources/res.qrc"/>
<include location="../../../sdrbase/resources/res.qrc"/>
<include location="../../../sdrbase/resources/res.qrc"/>
<include location="../../../sdrbase/resources/res.qrc"/>
<include location="../../../sdrbase/resources/res.qrc"/>
</resources> </resources>
<connections/> <connections/>
</ui> </ui>

View File

@ -170,8 +170,10 @@ public:
float getBufferLengthInSecs() const { return m_bufferLenSec; } float getBufferLengthInSecs() const { return m_bufferLenSec; }
int32_t getBufferGauge() const { return m_bufferGauge; } int32_t getBufferGauge() const { return m_bufferGauge; }
int getMinNbBlocks() const { return m_minNbBlocks; } int getMinNbBlocks() const { return m_minNbBlocks; }
int getmAXNbRecovery() const { return m_maxNbRecovery; } int getMinNbOriginalBlocks() const { return m_minNbOriginalBlocks; }
int getMaxNbRecovery() const { return m_maxNbRecovery; }
float getAvgNbBlocks() const { return m_avgNbBlocks; } float getAvgNbBlocks() const { return m_avgNbBlocks; }
float getAvgNbOriginalBlocks() const { return m_avgNbOriginalBlocks; }
float getAvgNbRecovery() const { return m_avgNbRecovery; } float getAvgNbRecovery() const { return m_avgNbRecovery; }
int getNbOriginalBlocksPerFrame() const { return m_nbOriginalBlocksPerFrame; } int getNbOriginalBlocksPerFrame() const { return m_nbOriginalBlocksPerFrame; }
int getNbFECBlocksPerFrame() const { return m_nbFECBlocksPerFrame; } int getNbFECBlocksPerFrame() const { return m_nbFECBlocksPerFrame; }
@ -181,9 +183,11 @@ public:
float bufferLenSec, float bufferLenSec,
int32_t bufferGauge, int32_t bufferGauge,
int framesDecodingStatus, int framesDecodingStatus,
int curNbBlocks, int minNbBlocks,
int curNbRecovery, int minNbOriginalBlocks,
int maxNbRecovery,
float avgNbBlocks, float avgNbBlocks,
float avgNbOriginalBlocks,
float avgNbRecovery, float avgNbRecovery,
int nbOriginalBlocksPerFrame, int nbOriginalBlocksPerFrame,
int nbFECBlocksPerFrame) int nbFECBlocksPerFrame)
@ -193,9 +197,11 @@ public:
bufferLenSec, bufferLenSec,
bufferGauge, bufferGauge,
framesDecodingStatus, framesDecodingStatus,
curNbBlocks, minNbBlocks,
curNbRecovery, minNbOriginalBlocks,
maxNbRecovery,
avgNbBlocks, avgNbBlocks,
avgNbOriginalBlocks,
avgNbRecovery, avgNbRecovery,
nbOriginalBlocksPerFrame, nbOriginalBlocksPerFrame,
nbFECBlocksPerFrame); nbFECBlocksPerFrame);
@ -208,8 +214,10 @@ public:
float m_bufferLenSec; float m_bufferLenSec;
int32_t m_bufferGauge; int32_t m_bufferGauge;
int m_minNbBlocks; int m_minNbBlocks;
int m_minNbOriginalBlocks;
int m_maxNbRecovery; int m_maxNbRecovery;
float m_avgNbBlocks; float m_avgNbBlocks;
float m_avgNbOriginalBlocks;
float m_avgNbRecovery; float m_avgNbRecovery;
int m_nbOriginalBlocksPerFrame; int m_nbOriginalBlocksPerFrame;
int m_nbFECBlocksPerFrame; int m_nbFECBlocksPerFrame;
@ -219,9 +227,11 @@ public:
float bufferLenSec, float bufferLenSec,
int32_t bufferGauge, int32_t bufferGauge,
int framesDecodingStatus, int framesDecodingStatus,
int curNbBlocks, int minNbBlocks,
int curNbRecovery, int minNbOriginalBlocks,
int maxNbRecovery,
float avgNbBlocks, float avgNbBlocks,
float avgNbOriginalBlocks,
float avgNbRecovery, float avgNbRecovery,
int nbOriginalBlocksPerFrame, int nbOriginalBlocksPerFrame,
int nbFECBlocksPerFrame) : int nbFECBlocksPerFrame) :
@ -231,9 +241,11 @@ public:
m_framesDecodingStatus(framesDecodingStatus), m_framesDecodingStatus(framesDecodingStatus),
m_bufferLenSec(bufferLenSec), m_bufferLenSec(bufferLenSec),
m_bufferGauge(bufferGauge), m_bufferGauge(bufferGauge),
m_minNbBlocks(curNbBlocks), m_minNbBlocks(minNbBlocks),
m_maxNbRecovery(curNbRecovery), m_minNbOriginalBlocks(minNbOriginalBlocks),
m_maxNbRecovery(maxNbRecovery),
m_avgNbBlocks(avgNbBlocks), m_avgNbBlocks(avgNbBlocks),
m_avgNbOriginalBlocks(avgNbOriginalBlocks),
m_avgNbRecovery(avgNbRecovery), m_avgNbRecovery(avgNbRecovery),
m_nbOriginalBlocksPerFrame(nbOriginalBlocksPerFrame), m_nbOriginalBlocksPerFrame(nbOriginalBlocksPerFrame),
m_nbFECBlocksPerFrame(nbFECBlocksPerFrame) m_nbFECBlocksPerFrame(nbFECBlocksPerFrame)

View File

@ -225,11 +225,12 @@ void SDRdaemonFECUDPHandler::tick()
{ {
int framesDecodingStatus; int framesDecodingStatus;
int minNbBlocks = m_sdrDaemonBuffer.getMinNbBlocks(); int minNbBlocks = m_sdrDaemonBuffer.getMinNbBlocks();
int minNbOriginalBlocks = m_sdrDaemonBuffer.getMinOriginalBlocks();
int nbOriginalBlocks = m_sdrDaemonBuffer.getCurrentMeta().m_nbOriginalBlocks; int nbOriginalBlocks = m_sdrDaemonBuffer.getCurrentMeta().m_nbOriginalBlocks;
int nbFECblocks = m_sdrDaemonBuffer.getCurrentMeta().m_nbFECBlocks; int nbFECblocks = m_sdrDaemonBuffer.getCurrentMeta().m_nbFECBlocks;
m_tickCount = 0; m_tickCount = 0;
framesDecodingStatus = (minNbBlocks < nbOriginalBlocks ? 0 : (minNbBlocks < nbOriginalBlocks + nbFECblocks ? 1 : 2)); framesDecodingStatus = (minNbOriginalBlocks == nbOriginalBlocks ? 2 : (minNbOriginalBlocks < nbOriginalBlocks - nbFECblocks ? 0 : 1));
SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming *report = SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming::create( SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming *report = SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming::create(
m_tv_sec, m_tv_sec,
@ -238,13 +239,13 @@ void SDRdaemonFECUDPHandler::tick()
m_sdrDaemonBuffer.getBufferGauge(), m_sdrDaemonBuffer.getBufferGauge(),
framesDecodingStatus, framesDecodingStatus,
minNbBlocks, minNbBlocks,
minNbOriginalBlocks,
m_sdrDaemonBuffer.getMaxNbRecovery(), m_sdrDaemonBuffer.getMaxNbRecovery(),
m_sdrDaemonBuffer.getAvgNbBlocks(), m_sdrDaemonBuffer.getAvgNbBlocks(),
m_sdrDaemonBuffer.getAvgOriginalBlocks(),
m_sdrDaemonBuffer.getAvgNbRecovery(), m_sdrDaemonBuffer.getAvgNbRecovery(),
nbOriginalBlocks, nbOriginalBlocks,
nbFECblocks); nbFECblocks);
m_outputMessageQueueToGUI->push(report); m_outputMessageQueueToGUI->push(report);
} }
} }