diff --git a/plugins/samplesource/sdrdaemonfec/sdrdaemonfecgui.cpp b/plugins/samplesource/sdrdaemonfec/sdrdaemonfecgui.cpp
index 73e37237e..9f3c142bc 100644
--- a/plugins/samplesource/sdrdaemonfec/sdrdaemonfecgui.cpp
+++ b/plugins/samplesource/sdrdaemonfec/sdrdaemonfecgui.cpp
@@ -68,6 +68,7 @@ SDRdaemonFECGui::SDRdaemonFECGui(DeviceSourceAPI *deviceAPI, QWidget* parent) :
m_countRecovered(0),
m_doApplySettings(true),
m_forceSettings(true),
+ m_txDelay(0.0),
m_dcBlock(false),
m_iqCorrection(false)
{
@@ -163,6 +164,8 @@ bool SDRdaemonFECGui::deserialize(const QByteArray& data)
{
displaySettings();
configureUDPLink();
+ updateTxDelay();
+ sendControl();
blockApplySettings(false);
sendControl(true);
m_forceSettings = true;
@@ -199,12 +202,21 @@ bool SDRdaemonFECGui::handleMessage(const Message& message)
}
else if (SDRdaemonFECInput::MsgReportSDRdaemonFECStreamData::match(message))
{
- m_sampleRate = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamData&)message).getSampleRate();
- m_centerFrequency = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamData&)message).getCenterFrequency();
- m_startingTimeStamp.tv_sec = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamData&)message).get_tv_sec();
- m_startingTimeStamp.tv_usec = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamData&)message).get_tv_usec();
- updateWithStreamData();
- return true;
+ int sampleRate = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamData&)message).getSampleRate();
+
+ if (m_sampleRate != sampleRate)
+ {
+ m_sampleRate = sampleRate;
+ updateTxDelay();
+ sendControl();
+ }
+
+ m_centerFrequency = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamData&)message).getCenterFrequency();
+ m_startingTimeStamp.tv_sec = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamData&)message).get_tv_sec();
+ m_startingTimeStamp.tv_usec = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamData&)message).get_tv_usec();
+
+ updateWithStreamData();
+ return true;
}
else if (SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming::match(message))
{
@@ -221,7 +233,15 @@ bool SDRdaemonFECGui::handleMessage(const Message& message)
m_avgNbOriginalBlocks = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).getAvgNbOriginalBlocks();
m_avgNbRecovery = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).getAvgNbRecovery();
m_nbOriginalBlocks = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).getNbOriginalBlocksPerFrame();
- m_nbFECBlocks = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).getNbFECBlocksPerFrame();
+
+ int nbFECBlocks = ((SDRdaemonFECInput::MsgReportSDRdaemonFECStreamTiming&)message).getNbFECBlocksPerFrame();
+
+ if (m_nbFECBlocks != nbFECBlocks)
+ {
+ m_nbFECBlocks = nbFECBlocks;
+ updateTxDelay();
+ sendControl();
+ }
updateWithStreamTime();
return true;
@@ -276,6 +296,12 @@ void SDRdaemonFECGui::updateSampleRateAndFrequency()
ui->deviceRateText->setText(tr("%1k").arg((float)m_deviceSampleRate / 1000));
}
+void SDRdaemonFECGui::updateTxDelay()
+{
+ m_txDelay = ((127*127*m_settings.m_txDelay) / m_sampleRate)/(128 + m_nbFECBlocks);
+ ui->txDelayText->setToolTip(tr("%1 us").arg(QString::number(m_txDelay*1e6, 'f', 0)));
+}
+
void SDRdaemonFECGui::displaySettings()
{
ui->centerFrequency->setValue(m_settings.m_centerFrequency / 1000);
@@ -287,7 +313,7 @@ void SDRdaemonFECGui::displaySettings()
ui->sampleRate->setText(QString::number(m_settings.m_sampleRate / 1000));
ui->specificParms->setText(m_settings.m_specificParameters);
ui->specificParms->setCursorPosition(0);
-
+ ui->txDelayText->setText(tr("%1").arg(m_settings.m_txDelay*100));
QString s0 = QString::number(128 + m_settings.m_nbFECBlocks, 'f', 0);
QString s1 = QString::number(m_settings.m_nbFECBlocks, 'f', 0);
@@ -300,7 +326,6 @@ void SDRdaemonFECGui::displaySettings()
ui->dcOffset->setChecked(m_settings.m_dcBlock);
ui->iqImbalance->setChecked(m_settings.m_iqCorrection);
-
}
void SDRdaemonFECGui::sendControl(bool force)
@@ -364,6 +389,14 @@ void SDRdaemonFECGui::sendControl(bool force)
nbArgs++;
}
+ if (m_txDelay != 0.0)
+ {
+ if (nbArgs > 0) os << ",";
+ os << "txdelay=" << (int) (m_txDelay*1e6);
+ nbArgs++;
+ m_txDelay = 0.0;
+ }
+
if ((m_settings.m_specificParameters != m_controlSettings.m_specificParameters) || force)
{
if (m_settings.m_specificParameters.size() > 0)
@@ -436,6 +469,7 @@ void SDRdaemonFECGui::on_applyButton_clicked(bool checked __attribute__((unused)
void SDRdaemonFECGui::on_sendButton_clicked(bool checked __attribute__((unused)))
{
+ updateTxDelay();
sendControl(true);
ui->specificParms->setCursorPosition(0);
}
@@ -542,6 +576,14 @@ void SDRdaemonFECGui::on_fcPos_currentIndexChanged(int index __attribute__((unus
sendControl();
}
+void SDRdaemonFECGui::on_txDelay_valueChanged(int value)
+{
+ m_settings.m_txDelay = value / 100.0;
+ ui->txDelayText->setText(tr("%1").arg(value));
+ updateTxDelay();
+ sendControl();
+}
+
void SDRdaemonFECGui::on_startStop_toggled(bool checked)
{
if (checked)
diff --git a/plugins/samplesource/sdrdaemonfec/sdrdaemonfecgui.h b/plugins/samplesource/sdrdaemonfec/sdrdaemonfecgui.h
index 7ddc500b9..67859dd44 100644
--- a/plugins/samplesource/sdrdaemonfec/sdrdaemonfecgui.h
+++ b/plugins/samplesource/sdrdaemonfec/sdrdaemonfecgui.h
@@ -97,6 +97,7 @@ private:
bool m_doApplySettings;
bool m_forceSettings;
+ double m_txDelay;
bool m_dcBlock;
bool m_iqCorrection;
@@ -115,6 +116,7 @@ private:
void updateWithStreamData();
void updateWithStreamTime();
void updateSampleRateAndFrequency();
+ void updateTxDelay();
void displayEventCounts();
void displayEventTimer();
@@ -136,6 +138,7 @@ private slots:
void on_startStop_toggled(bool checked);
void on_record_toggled(bool checked);
void on_eventCountsReset_clicked(bool checked);
+ void on_txDelay_valueChanged(int value);
void updateHardware();
void updateStatus();
void tick();
diff --git a/plugins/samplesource/sdrdaemonfec/sdrdaemonfecgui.ui b/plugins/samplesource/sdrdaemonfec/sdrdaemonfecgui.ui
index f53b0beef..d3c12dbd1 100644
--- a/plugins/samplesource/sdrdaemonfec/sdrdaemonfecgui.ui
+++ b/plugins/samplesource/sdrdaemonfec/sdrdaemonfecgui.ui
@@ -7,7 +7,7 @@
0
0
372
- 292
+ 261
@@ -557,7 +557,7 @@
- 120
+ 100
0
@@ -587,12 +587,6 @@
true
-
-
- 16777215
- 16777215
-
-
Local data connection port
@@ -630,6 +624,19 @@
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
-
@@ -744,6 +751,21 @@
24
+
+ Delay between consecutive UDP packets in percentage of nominal UDP packet process time
+
+
+ 10
+
+
+ 90
+
+
+ 1
+
+
+ 50
+
-