diff --git a/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkgui.cpp b/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkgui.cpp index ea6102c72..d06829c8d 100644 --- a/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkgui.cpp +++ b/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkgui.cpp @@ -224,14 +224,20 @@ void SDRdaemonSinkGui::updateSampleRateAndFrequency() ui->deviceRateText->setText(tr("%1k").arg((float)(m_sampleRate*(1<txDelayText->setToolTip(tr("%1 us").arg(QString::number(delay*1e6, 'f', 0))); +} + void SDRdaemonSinkGui::displaySettings() { ui->centerFrequency->setValue(m_settings.m_centerFrequency / 1000); ui->sampleRate->setValue(m_settings.m_sampleRate); ui->deviceRateText->setText(tr("%1k").arg((float)(m_sampleRate*(1<interp->setCurrentIndex(m_settings.m_log2Interp); - ui->txDelay->setValue(m_settings.m_txDelay/10); - ui->txDelayText->setText(tr("%1").arg(m_settings.m_txDelay)); + ui->txDelay->setValue(m_settings.m_txDelay*100); + ui->txDelayText->setText(tr("%1").arg(m_settings.m_txDelay*100)); ui->nbFECBlocks->setValue(m_settings.m_nbFECBlocks); QString s0 = QString::number(128 + m_settings.m_nbFECBlocks, 'f', 0); @@ -389,6 +395,7 @@ void SDRdaemonSinkGui::on_centerFrequency_changed(quint64 value) void SDRdaemonSinkGui::on_sampleRate_changed(quint64 value) { m_settings.m_sampleRate = value; + updateTxDelayTooltip(); sendControl(); sendSettings(); } @@ -406,8 +413,9 @@ void SDRdaemonSinkGui::on_interp_currentIndexChanged(int index) void SDRdaemonSinkGui::on_txDelay_valueChanged(int value) { - m_settings.m_txDelay = value * 10; - ui->txDelayText->setText(tr("%1").arg(10*value)); + m_settings.m_txDelay = value / 100.0; + ui->txDelayText->setText(tr("%1").arg(value)); + updateTxDelayTooltip(); sendSettings(); } @@ -419,6 +427,7 @@ void SDRdaemonSinkGui::on_nbFECBlocks_valueChanged(int value) QString s = QString::number(nbOriginalBlocks + nbFECBlocks, 'f', 0); QString s1 = QString::number(nbFECBlocks, 'f', 0); ui->nominalNbBlocksText->setText(tr("%1/%2").arg(s).arg(s1)); + updateTxDelayTooltip(); sendSettings(); } diff --git a/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkgui.h b/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkgui.h index 2f10bf23d..adc1137b9 100644 --- a/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkgui.h +++ b/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkgui.h @@ -85,6 +85,7 @@ private: void sendSettings(); void updateWithStreamTime(); void updateSampleRateAndFrequency(); + void updateTxDelayTooltip(); void displayEventCounts(); void displayEventTimer(); diff --git a/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkgui.ui b/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkgui.ui index fcab4e84d..6f8e1e5e7 100644 --- a/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkgui.ui +++ b/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkgui.ui @@ -293,16 +293,19 @@ - Delay in microseconds between consecutive UDP packets + Delay between consecutive UDP packets in percentage of nominal UDP packet process time - 1 + 10 - 200 + 90 - 1 + 0 + + + 50 @@ -310,12 +313,18 @@ - 32 + 20 0 + + + 20 + 16777215 + + - 0000 + 90 Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter diff --git a/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkoutput.cpp b/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkoutput.cpp index 27497f51f..2457b16bd 100644 --- a/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkoutput.cpp +++ b/plugins/samplesink/sdrdaemonsink/sdrdaemonsinkoutput.cpp @@ -64,11 +64,13 @@ bool SDRdaemonSinkOutput::start() m_sdrDaemonSinkThread->setRemoteAddress(m_settings.m_address, m_settings.m_dataPort); m_sdrDaemonSinkThread->setCenterFrequency(m_settings.m_centerFrequency); m_sdrDaemonSinkThread->setSamplerate(m_settings.m_sampleRate); - m_sdrDaemonSinkThread->setTxDelay(m_settings.m_txDelay); m_sdrDaemonSinkThread->setNbBlocksFEC(m_settings.m_nbFECBlocks); m_sdrDaemonSinkThread->connectTimer(m_masterTimer); m_sdrDaemonSinkThread->startWork(); + double delay = ((127*127*m_settings.m_txDelay) / m_settings.m_sampleRate)/(128 + m_settings.m_nbFECBlocks); + m_sdrDaemonSinkThread->setTxDelay((int) (delay*1e6)); + mutexLocker.unlock(); //applySettings(m_generalSettings, m_settings, true); qDebug("SDRdaemonSinkOutput::start: started"); @@ -171,6 +173,7 @@ void SDRdaemonSinkOutput::applySettings(const SDRdaemonSinkSettings& settings, b { QMutexLocker mutexLocker(&m_mutex); bool forwardChange = false; + bool changeTxDelay = false; if (force || (m_settings.m_address != settings.m_address) || (m_settings.m_dataPort != settings.m_dataPort)) { @@ -205,6 +208,7 @@ void SDRdaemonSinkOutput::applySettings(const SDRdaemonSinkSettings& settings, b } forwardChange = true; + changeTxDelay = true; } if (force || (m_settings.m_log2Interp != settings.m_log2Interp)) @@ -213,16 +217,6 @@ void SDRdaemonSinkOutput::applySettings(const SDRdaemonSinkSettings& settings, b forwardChange = true; } - if (force || (m_settings.m_txDelay != settings.m_txDelay)) - { - m_settings.m_txDelay = settings.m_txDelay; - - if (m_sdrDaemonSinkThread != 0) - { - m_sdrDaemonSinkThread->setTxDelay(m_settings.m_txDelay); - } - } - if (force || (m_settings.m_nbFECBlocks != settings.m_nbFECBlocks)) { m_settings.m_nbFECBlocks = settings.m_nbFECBlocks; @@ -231,11 +225,34 @@ void SDRdaemonSinkOutput::applySettings(const SDRdaemonSinkSettings& settings, b { m_sdrDaemonSinkThread->setNbBlocksFEC(m_settings.m_nbFECBlocks); } + + changeTxDelay = true; + } + + if (force || (m_settings.m_txDelay != settings.m_txDelay)) + { + m_settings.m_txDelay = settings.m_txDelay; + changeTxDelay = true; + } + + if (changeTxDelay) + { + double delay = ((127*127*m_settings.m_txDelay) / m_settings.m_sampleRate)/(128 + m_settings.m_nbFECBlocks); + qDebug("SDRdaemonSinkOutput::applySettings: Tx delay: %f us", delay*1e6); + + if (m_sdrDaemonSinkThread != 0) + { + // delay is calculated as a fraction of the nominal UDP block process time + // frame size: 127 * 127 samples + // divided by sample rate gives the frame process time + // divided by the number of actual blocks including FEC blocks gives the block (i.e. UDP block) process time + m_sdrDaemonSinkThread->setTxDelay((int) (delay*1e6)); + } } mutexLocker.unlock(); - qDebug("SDRdaemonSinkOutput::applySettings: %s m_centerFrequency: %llu m_sampleRate: %llu m_log2Interp: %d m_txDelay: %d m_nbFECBlocks: %d", + qDebug("SDRdaemonSinkOutput::applySettings: %s m_centerFrequency: %llu m_sampleRate: %llu m_log2Interp: %d m_txDelay: %f m_nbFECBlocks: %d", forwardChange ? "forward change" : "", m_settings.m_centerFrequency, m_settings.m_sampleRate, diff --git a/plugins/samplesink/sdrdaemonsink/sdrdaemonsinksettings.cpp b/plugins/samplesink/sdrdaemonsink/sdrdaemonsinksettings.cpp index e757b1397..65e814510 100644 --- a/plugins/samplesink/sdrdaemonsink/sdrdaemonsinksettings.cpp +++ b/plugins/samplesink/sdrdaemonsink/sdrdaemonsinksettings.cpp @@ -27,7 +27,7 @@ void SDRdaemonSinkSettings::resetToDefaults() m_centerFrequency = 435000*1000; m_sampleRate = 192000; m_log2Interp = 4; - m_txDelay = 300; + m_txDelay = 0.5; m_nbFECBlocks = 0; m_address = "127.0.0.1"; m_dataPort = 9092; @@ -41,7 +41,7 @@ QByteArray SDRdaemonSinkSettings::serialize() const s.writeU64(1, m_sampleRate); s.writeU32(2, m_log2Interp); - s.writeU32(3, m_txDelay); + s.writeFloat(3, m_txDelay); s.writeU32(4, m_nbFECBlocks); s.writeString(5, m_address); s.writeU32(6, m_dataPort); @@ -66,7 +66,7 @@ bool SDRdaemonSinkSettings::deserialize(const QByteArray& data) quint32 uintval; d.readU64(1, &m_sampleRate, 48000); d.readU32(2, &m_log2Interp, 0); - d.readU32(3, &m_txDelay, 300); + d.readFloat(3, &m_txDelay, 0.5); d.readU32(4, &m_nbFECBlocks, 0); d.readString(5, &m_address, "127.0.0.1"); d.readU32(6, &uintval, 9090); diff --git a/plugins/samplesink/sdrdaemonsink/sdrdaemonsinksettings.h b/plugins/samplesink/sdrdaemonsink/sdrdaemonsinksettings.h index 05d73e844..5f20970f2 100644 --- a/plugins/samplesink/sdrdaemonsink/sdrdaemonsinksettings.h +++ b/plugins/samplesink/sdrdaemonsink/sdrdaemonsinksettings.h @@ -23,7 +23,7 @@ struct SDRdaemonSinkSettings { quint64 m_centerFrequency; quint64 m_sampleRate; quint32 m_log2Interp; - quint32 m_txDelay; + float m_txDelay; quint32 m_nbFECBlocks; QString m_address; quint16 m_dataPort; diff --git a/plugins/samplesource/sdrdaemonfec/sdrdaemonfecgui.ui b/plugins/samplesource/sdrdaemonfec/sdrdaemonfecgui.ui index cc19b66ea..cadf5a5c1 100644 --- a/plugins/samplesource/sdrdaemonfec/sdrdaemonfecgui.ui +++ b/plugins/samplesource/sdrdaemonfec/sdrdaemonfecgui.ui @@ -178,13 +178,6 @@ - - - - Auto Corr - - - @@ -218,6 +211,64 @@ + + + + + 0 + 0 + + + + + 28 + 0 + + + + Buffer length in seconds + + + 00.0 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Qt::Vertical + + + + + + + + 22 + 0 + + + + Main buffer read/write positions unbalance (%): positive means read leads + + + -00 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Qt::Vertical + + + @@ -441,38 +492,6 @@ - - - - - 0 - 0 - - - - - 28 - 0 - - - - Buffer length in seconds - - - 00.0 - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - Qt::Vertical - - - @@ -492,32 +511,6 @@ - - - - Qt::Vertical - - - - - - - - 22 - 0 - - - - Main buffer read/write positions unbalance (%): positive means read leads - - - -00 - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - @@ -570,9 +563,12 @@ Local data connection IP address - + 000.000.000.000 + + 0.0.0.0 + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter @@ -599,9 +595,12 @@ Local data connection port - + 00000 + + 0 + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -619,9 +618,12 @@ Remote control port - + 00000 + + 0 + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter