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 +