mirror of
https://github.com/f4exb/sdrangel.git
synced 2025-07-30 12:42:25 -04:00
SDRdaemonFEC plugin: GUI enhancements
This commit is contained in:
parent
fac8465575
commit
bbccea9432
@ -50,7 +50,7 @@ SDRdaemonFECGui::SDRdaemonFECGui(DeviceAPI *deviceAPI, QWidget* parent) :
|
|||||||
m_lastEngineState((DSPDeviceEngine::State)-1),
|
m_lastEngineState((DSPDeviceEngine::State)-1),
|
||||||
m_sampleRate(0),
|
m_sampleRate(0),
|
||||||
m_centerFrequency(0),
|
m_centerFrequency(0),
|
||||||
m_allFramesDecoded(false),
|
m_framesDecodingStatus(0),
|
||||||
m_bufferLengthInSecs(0.0),
|
m_bufferLengthInSecs(0.0),
|
||||||
m_bufferGauge(-50),
|
m_bufferGauge(-50),
|
||||||
m_samplesCount(0),
|
m_samplesCount(0),
|
||||||
@ -62,7 +62,9 @@ SDRdaemonFECGui::SDRdaemonFECGui(DeviceAPI *deviceAPI, QWidget* parent) :
|
|||||||
m_dataPortEdited(false),
|
m_dataPortEdited(false),
|
||||||
m_initSendConfiguration(false),
|
m_initSendConfiguration(false),
|
||||||
m_dcBlock(false),
|
m_dcBlock(false),
|
||||||
m_iqCorrection(false)
|
m_iqCorrection(false),
|
||||||
|
m_nbOriginalBlocks(128),
|
||||||
|
m_nbFECBlocks(0)
|
||||||
{
|
{
|
||||||
m_sender = nn_socket(AF_SP, NN_PAIR);
|
m_sender = nn_socket(AF_SP, NN_PAIR);
|
||||||
assert(m_sender != -1);
|
assert(m_sender != -1);
|
||||||
@ -285,13 +287,15 @@ bool SDRdaemonFECGui::handleMessage(const Message& message)
|
|||||||
{
|
{
|
||||||
m_startingTimeStamp.tv_sec = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).get_tv_sec();
|
m_startingTimeStamp.tv_sec = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).get_tv_sec();
|
||||||
m_startingTimeStamp.tv_usec = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).get_tv_usec();
|
m_startingTimeStamp.tv_usec = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).get_tv_usec();
|
||||||
m_allFramesDecoded = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).getAllFramesDecoded();
|
m_framesDecodingStatus = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).getFramesDecodingStatus();
|
||||||
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_maxNbRecovery = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).getmAXNbRecovery();
|
||||||
m_avgNbBlocks = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).getAvgNbBlocks();
|
m_avgNbBlocks = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).getAvgNbBlocks();
|
||||||
m_avgNbRecovery = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).getAvgNbRecovery();
|
m_avgNbRecovery = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).getAvgNbRecovery();
|
||||||
|
m_nbOriginalBlocks = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).getNbOriginalBlocksPerFrame();
|
||||||
|
m_nbFECBlocks = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).getNbFECBlocksPerFrame();
|
||||||
|
|
||||||
updateWithStreamTime();
|
updateWithStreamTime();
|
||||||
return true;
|
return true;
|
||||||
@ -598,8 +602,10 @@ void SDRdaemonFECGui::updateWithStreamTime()
|
|||||||
QString s_date = dt.toString("yyyy-MM-dd hh:mm:ss.zzz");
|
QString s_date = dt.toString("yyyy-MM-dd hh:mm:ss.zzz");
|
||||||
ui->absTimeText->setText(s_date);
|
ui->absTimeText->setText(s_date);
|
||||||
|
|
||||||
if (m_allFramesDecoded) {
|
if (m_framesDecodingStatus == 2) {
|
||||||
ui->allFramesDecoded->setStyleSheet("QToolButton { background-color : green; }");
|
ui->allFramesDecoded->setStyleSheet("QToolButton { background-color : green; }");
|
||||||
|
} else if (m_framesDecodingStatus == 1) {
|
||||||
|
ui->allFramesDecoded->setStyleSheet("QToolButton { background-color : blue; }");
|
||||||
} else {
|
} else {
|
||||||
ui->allFramesDecoded->setStyleSheet("QToolButton { background:rgb(79,79,79); }");
|
ui->allFramesDecoded->setStyleSheet("QToolButton { background:rgb(79,79,79); }");
|
||||||
}
|
}
|
||||||
@ -624,6 +630,10 @@ void SDRdaemonFECGui::updateWithStreamTime()
|
|||||||
|
|
||||||
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));
|
||||||
|
|
||||||
|
s = QString::number(m_nbOriginalBlocks + m_nbFECBlocks, 'f', 0);
|
||||||
|
QString s1 = QString::number(m_nbFECBlocks, 'f', 0);
|
||||||
|
ui->nominalNbBlocksText->setText(tr("%1/%2").arg(s).arg(s1));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SDRdaemonFECGui::updateStatus()
|
void SDRdaemonFECGui::updateStatus()
|
||||||
|
@ -64,13 +64,15 @@ private:
|
|||||||
int m_sampleRate;
|
int m_sampleRate;
|
||||||
quint64 m_centerFrequency;
|
quint64 m_centerFrequency;
|
||||||
struct timeval m_startingTimeStamp;
|
struct timeval m_startingTimeStamp;
|
||||||
bool m_allFramesDecoded;
|
int m_framesDecodingStatus;
|
||||||
float m_bufferLengthInSecs;
|
float m_bufferLengthInSecs;
|
||||||
int32_t m_bufferGauge;
|
int32_t m_bufferGauge;
|
||||||
int m_minNbBlocks;
|
int m_minNbBlocks;
|
||||||
int m_maxNbRecovery;
|
int m_maxNbRecovery;
|
||||||
float m_avgNbBlocks;
|
float m_avgNbBlocks;
|
||||||
float m_avgNbRecovery;
|
float m_avgNbRecovery;
|
||||||
|
int m_nbOriginalBlocks;
|
||||||
|
int m_nbFECBlocks;
|
||||||
|
|
||||||
int m_samplesCount;
|
int m_samplesCount;
|
||||||
std::size_t m_tickCount;
|
std::size_t m_tickCount;
|
||||||
|
@ -309,7 +309,7 @@
|
|||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string>Frames complete</string>
|
<string>Frames status: green = all original received, blue = some recovered by FEC, none = some lost</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>...</string>
|
<string>...</string>
|
||||||
@ -449,6 +449,32 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="Line" name="lineStream7">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="nominalNbBlocksText">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>52</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Nominal number of blocks per frame: Total/FEC</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>000/000</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="Line" name="lineStream2">
|
<widget class="Line" name="lineStream2">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
|
@ -166,65 +166,77 @@ public:
|
|||||||
public:
|
public:
|
||||||
uint32_t get_tv_sec() const { return m_tv_sec; }
|
uint32_t get_tv_sec() const { return m_tv_sec; }
|
||||||
uint32_t get_tv_usec() const { return m_tv_usec; }
|
uint32_t get_tv_usec() const { return m_tv_usec; }
|
||||||
bool getAllFramesDecoded() const { return m_allFramesDecoded; }
|
int getFramesDecodingStatus() const { return m_framesDecodingStatus; }
|
||||||
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 getmAXNbRecovery() const { return m_maxNbRecovery; }
|
||||||
float getAvgNbBlocks() const { return m_avgNbBlocks; }
|
float getAvgNbBlocks() const { return m_avgNbBlocks; }
|
||||||
float getAvgNbRecovery() const { return m_avgNbRecovery; }
|
float getAvgNbRecovery() const { return m_avgNbRecovery; }
|
||||||
|
int getNbOriginalBlocksPerFrame() const { return m_nbOriginalBlocksPerFrame; }
|
||||||
|
int getNbFECBlocksPerFrame() const { return m_nbFECBlocksPerFrame; }
|
||||||
|
|
||||||
static MsgReportSDRdaemonFECStreamTiming* create(uint32_t tv_sec,
|
static MsgReportSDRdaemonFECStreamTiming* create(uint32_t tv_sec,
|
||||||
uint32_t tv_usec,
|
uint32_t tv_usec,
|
||||||
float bufferLenSec,
|
float bufferLenSec,
|
||||||
int32_t bufferGauge,
|
int32_t bufferGauge,
|
||||||
bool allFramesDecoded,
|
int framesDecodingStatus,
|
||||||
int curNbBlocks,
|
int curNbBlocks,
|
||||||
int curNbRecovery,
|
int curNbRecovery,
|
||||||
float avgNbBlocks,
|
float avgNbBlocks,
|
||||||
float avgNbRecovery)
|
float avgNbRecovery,
|
||||||
|
int nbOriginalBlocksPerFrame,
|
||||||
|
int nbFECBlocksPerFrame)
|
||||||
{
|
{
|
||||||
return new MsgReportSDRdaemonFECStreamTiming(tv_sec,
|
return new MsgReportSDRdaemonFECStreamTiming(tv_sec,
|
||||||
tv_usec,
|
tv_usec,
|
||||||
bufferLenSec,
|
bufferLenSec,
|
||||||
bufferGauge,
|
bufferGauge,
|
||||||
allFramesDecoded,
|
framesDecodingStatus,
|
||||||
curNbBlocks,
|
curNbBlocks,
|
||||||
curNbRecovery,
|
curNbRecovery,
|
||||||
avgNbBlocks,
|
avgNbBlocks,
|
||||||
avgNbRecovery);
|
avgNbRecovery,
|
||||||
|
nbOriginalBlocksPerFrame,
|
||||||
|
nbFECBlocksPerFrame);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
uint32_t m_tv_sec;
|
uint32_t m_tv_sec;
|
||||||
uint32_t m_tv_usec;
|
uint32_t m_tv_usec;
|
||||||
bool m_allFramesDecoded;
|
int m_framesDecodingStatus;
|
||||||
float m_bufferLenSec;
|
float m_bufferLenSec;
|
||||||
int32_t m_bufferGauge;
|
int32_t m_bufferGauge;
|
||||||
int m_minNbBlocks;
|
int m_minNbBlocks;
|
||||||
int m_maxNbRecovery;
|
int m_maxNbRecovery;
|
||||||
float m_avgNbBlocks;
|
float m_avgNbBlocks;
|
||||||
float m_avgNbRecovery;
|
float m_avgNbRecovery;
|
||||||
|
int m_nbOriginalBlocksPerFrame;
|
||||||
|
int m_nbFECBlocksPerFrame;
|
||||||
|
|
||||||
MsgReportSDRdaemonFECStreamTiming(uint32_t tv_sec,
|
MsgReportSDRdaemonFECStreamTiming(uint32_t tv_sec,
|
||||||
uint32_t tv_usec,
|
uint32_t tv_usec,
|
||||||
float bufferLenSec,
|
float bufferLenSec,
|
||||||
int32_t bufferGauge,
|
int32_t bufferGauge,
|
||||||
bool allFramesDecoded,
|
int framesDecodingStatus,
|
||||||
int curNbBlocks,
|
int curNbBlocks,
|
||||||
int curNbRecovery,
|
int curNbRecovery,
|
||||||
float avgNbBlocks,
|
float avgNbBlocks,
|
||||||
float avgNbRecovery) :
|
float avgNbRecovery,
|
||||||
|
int nbOriginalBlocksPerFrame,
|
||||||
|
int nbFECBlocksPerFrame) :
|
||||||
Message(),
|
Message(),
|
||||||
m_tv_sec(tv_sec),
|
m_tv_sec(tv_sec),
|
||||||
m_tv_usec(tv_usec),
|
m_tv_usec(tv_usec),
|
||||||
m_allFramesDecoded(allFramesDecoded),
|
m_framesDecodingStatus(framesDecodingStatus),
|
||||||
m_bufferLenSec(bufferLenSec),
|
m_bufferLenSec(bufferLenSec),
|
||||||
m_bufferGauge(bufferGauge),
|
m_bufferGauge(bufferGauge),
|
||||||
m_minNbBlocks(curNbBlocks),
|
m_minNbBlocks(curNbBlocks),
|
||||||
m_maxNbRecovery(curNbRecovery),
|
m_maxNbRecovery(curNbRecovery),
|
||||||
m_avgNbBlocks(avgNbBlocks),
|
m_avgNbBlocks(avgNbBlocks),
|
||||||
m_avgNbRecovery(avgNbRecovery)
|
m_avgNbRecovery(avgNbRecovery),
|
||||||
|
m_nbOriginalBlocksPerFrame(nbOriginalBlocksPerFrame),
|
||||||
|
m_nbFECBlocksPerFrame(nbFECBlocksPerFrame)
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -221,17 +221,26 @@ void SDRdaemonFECUDPHandler::tick()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
int framesDecodingStatus;
|
||||||
|
int minNbBlocks = m_sdrDaemonBuffer.getMinNbBlocks();
|
||||||
|
int nbOriginalBlocks = m_sdrDaemonBuffer.getCurrentMeta().m_nbOriginalBlocks;
|
||||||
|
int nbFECblocks = m_sdrDaemonBuffer.getCurrentMeta().m_nbFECBlocks;
|
||||||
m_tickCount = 0;
|
m_tickCount = 0;
|
||||||
|
|
||||||
|
framesDecodingStatus = (minNbBlocks < nbOriginalBlocks ? 0 : (minNbBlocks < nbOriginalBlocks + nbFECblocks ? 1 : 2));
|
||||||
|
|
||||||
SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming *report = SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming::create(
|
SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming *report = SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming::create(
|
||||||
m_tv_sec,
|
m_tv_sec,
|
||||||
m_tv_usec,
|
m_tv_usec,
|
||||||
m_sdrDaemonBuffer.getBufferLengthInSecs(),
|
m_sdrDaemonBuffer.getBufferLengthInSecs(),
|
||||||
m_sdrDaemonBuffer.getBufferGauge(),
|
m_sdrDaemonBuffer.getBufferGauge(),
|
||||||
m_sdrDaemonBuffer.allFramesDecoded(),
|
framesDecodingStatus,
|
||||||
m_sdrDaemonBuffer.getMinNbBlocks(),
|
minNbBlocks,
|
||||||
m_sdrDaemonBuffer.getMaxNbRecovery(),
|
m_sdrDaemonBuffer.getMaxNbRecovery(),
|
||||||
m_sdrDaemonBuffer.getAvgNbBlocks(),
|
m_sdrDaemonBuffer.getAvgNbBlocks(),
|
||||||
m_sdrDaemonBuffer.getAvgNbRecovery());
|
m_sdrDaemonBuffer.getAvgNbRecovery(),
|
||||||
|
nbOriginalBlocks,
|
||||||
|
nbFECblocks);
|
||||||
m_outputMessageQueueToGUI->push(report);
|
m_outputMessageQueueToGUI->push(report);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user