diff --git a/doc/img/SDRdaemonFEC_plugin.png b/doc/img/SDRdaemonFEC_plugin.png
index 4ae82761a..5e305c216 100644
Binary files a/doc/img/SDRdaemonFEC_plugin.png and b/doc/img/SDRdaemonFEC_plugin.png differ
diff --git a/doc/img/SDRdaemonFEC_plugin_04.png b/doc/img/SDRdaemonFEC_plugin_04.png
index 25b8342df..067256311 100644
Binary files a/doc/img/SDRdaemonFEC_plugin_04.png and b/doc/img/SDRdaemonFEC_plugin_04.png differ
diff --git a/plugins/samplesource/sdrdaemonfec/readme.md b/plugins/samplesource/sdrdaemonfec/readme.md
index 7e2488db1..99da1f866 100644
--- a/plugins/samplesource/sdrdaemonfec/readme.md
+++ b/plugins/samplesource/sdrdaemonfec/readme.md
@@ -63,39 +63,43 @@ The system tries to compensate read / write unbalance however at start or when a

-
4.1: Stream status
+4.1: Minimum total number of blocks per frame
+
+This is the minimum total number of blocks per frame during the last polling period. If all blocks were received for all frames then this number is the nominal number of original blocks plus FEC blocks and the background lits in green.
+
+4.2: Average total number of blocks received by frame
+
+Moving average over the last 10 frames of the total number of blocks received per frame.
+
+4.3: Stream status
The color of the icon indicates stream status:
- Green: all original blocks have been received for all frames during the last polling timeframe
- - Magenta/Pink: some original blocks were reconstructed from FEC blocks for some frames during the last polling timeframe
+ - Pink: some original blocks were reconstructed from FEC blocks for some frames during the last polling timeframe
- No color: some original blocks were definitely lost for some frames during the last polling timeframe
-4.2: Minimum number of blocks received by frame
+4.4: Minimum number of original blocks received by frame
-Minimum number of blocks received by frame during the last polling timeframe. Ideally this should match the nominal number of blocks per frame (see 4.7) for no lost blocks (green lock icon).
+Minimum number of original blocks received by frame during the last polling timeframe. Ideally this should match the nominal number of original blocks per frame which is 128 (green lock icon). Anything below the nominal number of original blocks minus FEC blocks means data loss (lock icon off). In betweem FEC is used to recover lost blocks (pink lock icon)
-4.3: Average number of blocks received by frame
+4.5: Maximum number of FEC blocks used by frame
-Moving average over the last 10 frames of the number of blocks received per frame.
+Maximum number of FEC blocks used for original blocks recovery during the last polling timeframe. Ideally this should be 0 when no blocks are lost but the system is able to correct lost blocks up to the nominal number of FEC blocks (Pink lock icon).
-4.4: Maximum number of FEC blocks used by frame
-
-Maximum number of FEC blocks used for original blocks recovery during the last polling timeframe. Ideally this should be 0 when no blocks are lost but the system is able to correct lost blocks up to the nominal number of FEC blocks (Magenta/Pink lock icon).
-
-4.5: Average number of FEC blocks used for original blocks recovery by frame
+4.6: Average number of FEC blocks used for original blocks recovery by frame
Moving average over the last 10 frames of the number of FEC blocks used for original blocks recovery per frame.
-4.6: Receive buffer length
+4.7: Receive buffer length
This is the main buffer (writes from UDP / reads from DSP engine) length in units of time (seconds). As read and write pointers are normally about half the buffer apart the nominal delay introduced by the buffer is the half of this value.
-4.7: FEC nominal values
+4.8: FEC nominal values
This is the nominal (Tx side) total number of blocks sent by frame (original blocks plus FEC blocks) and the nominal number of FEC blocks sent by frame separated by a slash (/)
-4.8: Main buffer R/W pointers positions
+4.9: Main buffer R/W pointers positions
Read and write pointers should always be a half buffer distance buffer apart. This is the difference in percent of the main buffer size from this ideal position.
diff --git a/plugins/samplesource/sdrdaemonfec/sdrdaemonfecgui.cpp b/plugins/samplesource/sdrdaemonfec/sdrdaemonfecgui.cpp
index 4bc0eee50..3e3bb0c44 100644
--- a/plugins/samplesource/sdrdaemonfec/sdrdaemonfecgui.cpp
+++ b/plugins/samplesource/sdrdaemonfec/sdrdaemonfecgui.cpp
@@ -288,6 +288,7 @@ bool SDRdaemonFECGui::handleMessage(const Message& message)
m_startingTimeStamp.tv_sec = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).get_tv_sec();
m_startingTimeStamp.tv_usec = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).get_tv_usec();
m_framesDecodingStatus = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).getFramesDecodingStatus();
+ m_allBlocksReceived = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).allBlocksReceived();
m_bufferLengthInSecs = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).getBufferLengthInSecs();
m_bufferGauge = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).getBufferGauge();
m_minNbBlocks = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).getMinNbBlocks();
@@ -624,6 +625,12 @@ void SDRdaemonFECGui::updateWithStreamTime()
s = QString::number(m_minNbBlocks, 'f', 0);
ui->minNbBlocksText->setText(tr("%1").arg(s));
+ if (m_allBlocksReceived) {
+ ui->minNbBlocksText->setStyleSheet("QLabel { background-color : green; }");
+ } else {
+ ui->minNbBlocksText->setStyleSheet("QLabel { background:rgb(56,56,56); }");
+ }
+
s = QString::number(m_avgNbBlocks, 'f', 1);
ui->avgNbBlocksText->setText(tr("%1").arg(s));
diff --git a/plugins/samplesource/sdrdaemonfec/sdrdaemonfecgui.h b/plugins/samplesource/sdrdaemonfec/sdrdaemonfecgui.h
index 198e4f8e8..fdb783984 100644
--- a/plugins/samplesource/sdrdaemonfec/sdrdaemonfecgui.h
+++ b/plugins/samplesource/sdrdaemonfec/sdrdaemonfecgui.h
@@ -65,6 +65,7 @@ private:
quint64 m_centerFrequency;
struct timeval m_startingTimeStamp;
int m_framesDecodingStatus;
+ bool m_allBlocksReceived;
float m_bufferLengthInSecs;
int32_t m_bufferGauge;
int m_minNbBlocks;
diff --git a/plugins/samplesource/sdrdaemonfec/sdrdaemonfecgui.ui b/plugins/samplesource/sdrdaemonfec/sdrdaemonfecgui.ui
index 7e227d245..281a96c0b 100644
--- a/plugins/samplesource/sdrdaemonfec/sdrdaemonfecgui.ui
+++ b/plugins/samplesource/sdrdaemonfec/sdrdaemonfecgui.ui
@@ -29,16 +29,7 @@
3
-
- 2
-
-
- 2
-
-
- 2
-
-
+
2
-
@@ -312,23 +303,6 @@
-
-
-
-
-
- false
-
-
- Frames status: green = all original received, pink = some recovered by FEC, none = some lost
-
-
- ...
-
-
-
- :/locked.png:/locked.png
-
-
-
-
@@ -338,7 +312,7 @@
- Minimum number of blocks retrieved per frame
+ Minimum number of blocks retrieved per frame (green: all blocks received)
000
@@ -368,9 +342,19 @@
-
-
-
- Qt::Vertical
+
+
+ false
+
+
+ Frames status: green = all original received, pink = some recovered by FEC, none = some lost
+
+
+ ...
+
+
+
+ :/locked.png:/locked.png
diff --git a/plugins/samplesource/sdrdaemonfec/sdrdaemonfecinput.h b/plugins/samplesource/sdrdaemonfec/sdrdaemonfecinput.h
index 45c0ad296..fe1a8500a 100644
--- a/plugins/samplesource/sdrdaemonfec/sdrdaemonfecinput.h
+++ b/plugins/samplesource/sdrdaemonfec/sdrdaemonfecinput.h
@@ -167,6 +167,7 @@ public:
uint32_t get_tv_sec() const { return m_tv_sec; }
uint32_t get_tv_usec() const { return m_tv_usec; }
int getFramesDecodingStatus() const { return m_framesDecodingStatus; }
+ bool allBlocksReceived() const { return m_allBlocksReceived; }
float getBufferLengthInSecs() const { return m_bufferLenSec; }
int32_t getBufferGauge() const { return m_bufferGauge; }
int getMinNbBlocks() const { return m_minNbBlocks; }
@@ -183,6 +184,7 @@ public:
float bufferLenSec,
int32_t bufferGauge,
int framesDecodingStatus,
+ bool allBlocksReceived,
int minNbBlocks,
int minNbOriginalBlocks,
int maxNbRecovery,
@@ -197,6 +199,7 @@ public:
bufferLenSec,
bufferGauge,
framesDecodingStatus,
+ allBlocksReceived,
minNbBlocks,
minNbOriginalBlocks,
maxNbRecovery,
@@ -211,6 +214,7 @@ public:
uint32_t m_tv_sec;
uint32_t m_tv_usec;
int m_framesDecodingStatus;
+ bool m_allBlocksReceived;
float m_bufferLenSec;
int32_t m_bufferGauge;
int m_minNbBlocks;
@@ -227,6 +231,7 @@ public:
float bufferLenSec,
int32_t bufferGauge,
int framesDecodingStatus,
+ bool allBlocksReceived,
int minNbBlocks,
int minNbOriginalBlocks,
int maxNbRecovery,
@@ -239,6 +244,7 @@ public:
m_tv_sec(tv_sec),
m_tv_usec(tv_usec),
m_framesDecodingStatus(framesDecodingStatus),
+ m_allBlocksReceived(allBlocksReceived),
m_bufferLenSec(bufferLenSec),
m_bufferGauge(bufferGauge),
m_minNbBlocks(minNbBlocks),
diff --git a/plugins/samplesource/sdrdaemonfec/sdrdaemonfecudphandler.cpp b/plugins/samplesource/sdrdaemonfec/sdrdaemonfecudphandler.cpp
index 33d245109..731606c6b 100644
--- a/plugins/samplesource/sdrdaemonfec/sdrdaemonfecudphandler.cpp
+++ b/plugins/samplesource/sdrdaemonfec/sdrdaemonfecudphandler.cpp
@@ -238,6 +238,7 @@ void SDRdaemonFECUDPHandler::tick()
m_sdrDaemonBuffer.getBufferLengthInSecs(),
m_sdrDaemonBuffer.getBufferGauge(),
framesDecodingStatus,
+ minNbBlocks == nbOriginalBlocks + nbFECblocks,
minNbBlocks,
minNbOriginalBlocks,
m_sdrDaemonBuffer.getMaxNbRecovery(),