From 354409a21a8ccff4dd3def19c7ab9e2b4659810e Mon Sep 17 00:00:00 2001 From: f4exb Date: Thu, 6 Sep 2018 04:23:27 +0200 Subject: [PATCH] DaemonSink (5) --- plugins/channelrx/daemonsink/daemonsink.cpp | 19 ++++++++----- plugins/channelrx/daemonsink/daemonsink.h | 2 +- .../channelrx/daemonsink/daemonsinkgui.cpp | 15 ++++++----- plugins/channelrx/daemonsink/daemonsinkgui.h | 2 +- plugins/channelrx/daemonsink/daemonsinkgui.ui | 27 +++++++++++++++++-- .../daemonsink/daemonsinksettings.cpp | 4 +-- .../channelrx/daemonsink/daemonsinkthread.cpp | 3 +-- 7 files changed, 51 insertions(+), 21 deletions(-) diff --git a/plugins/channelrx/daemonsink/daemonsink.cpp b/plugins/channelrx/daemonsink/daemonsink.cpp index 324ecc742..6f9f18313 100644 --- a/plugins/channelrx/daemonsink/daemonsink.cpp +++ b/plugins/channelrx/daemonsink/daemonsink.cpp @@ -54,7 +54,7 @@ DaemonSink::DaemonSink(DeviceSourceAPI *deviceAPI) : m_sampleRate(48000), m_sampleBytes(SDR_RX_SAMP_SZ == 24 ? 4 : 2), m_nbBlocksFEC(0), - m_txDelay(100), + m_txDelay(50), m_dataAddress("127.0.0.1"), m_dataPort(9090) { @@ -81,13 +81,16 @@ DaemonSink::~DaemonSink() delete m_channelizer; } -void DaemonSink::setTxDelay(int txDelay) +void DaemonSink::setTxDelay(int txDelay, int nbBlocksFEC) { double txDelayRatio = txDelay / 100.0; double delay = m_sampleRate == 0 ? 1.0 : (127*127*txDelayRatio) / m_sampleRate; - delay /= 128 + m_settings.m_nbFECBlocks; + delay /= 128 + nbBlocksFEC; m_txDelay = roundf(delay*1e6); // microseconds - qDebug() << "DaemonSink::setTxDelay: "<< txDelay << "% m_txDelay: " << m_txDelay << "us"; + qDebug() << "DaemonSink::setTxDelay:" + << " " << txDelay + << "% m_txDelay: " << m_txDelay << "us" + << " m_sampleRate: " << m_sampleRate << "S/s"; } void DaemonSink::setNbBlocksFEC(int nbBlocksFEC) @@ -183,6 +186,7 @@ void DaemonSink::feed(const SampleVector::const_iterator& begin, const SampleVec m_dataBlock->m_txControlBlock.m_dataAddress = m_dataAddress; m_dataBlock->m_txControlBlock.m_dataPort = m_dataPort; + qDebug("DaemonSink::feed: m_dataBlock: %p m_dataQueue.sz: %d", m_dataBlock, m_dataQueue.size()); m_dataQueue.push(m_dataBlock); m_dataBlock = new SDRDaemonDataBlock(); // create a new one immediately m_dataBlockMutex.unlock(); @@ -241,6 +245,8 @@ bool DaemonSink::handleMessage(const Message& cmd __attribute__((unused))) setSampleRate(notif.getSampleRate()); } + setTxDelay(m_settings.m_txDelay, m_settings.m_nbFECBlocks); + if (m_guiMessageQueue) { MsgSampleRateNotification *msg = MsgSampleRateNotification::create(notif.getSampleRate()); @@ -308,10 +314,11 @@ void DaemonSink::applySettings(const DaemonSinkSettings& settings, bool force) if ((m_settings.m_nbFECBlocks != settings.m_nbFECBlocks) || force) { setNbBlocksFEC(settings.m_nbFECBlocks); + setTxDelay(settings.m_txDelay, settings.m_nbFECBlocks); } if ((m_settings.m_txDelay != settings.m_txDelay) || force) { - setTxDelay(settings.m_txDelay); + setTxDelay(settings.m_txDelay, settings.m_nbFECBlocks); } if ((m_settings.m_dataAddress != settings.m_dataAddress) || force) { @@ -359,7 +366,7 @@ int DaemonSink::webapiSettingsPutPatch( int txDelay = response.getDaemonSinkSettings()->getTxDelay(); if (txDelay < 0) { - settings.m_txDelay = 100; + settings.m_txDelay = 50; } else { settings.m_txDelay = txDelay; } diff --git a/plugins/channelrx/daemonsink/daemonsink.h b/plugins/channelrx/daemonsink/daemonsink.h index 8b0e38c1a..948b16861 100644 --- a/plugins/channelrx/daemonsink/daemonsink.h +++ b/plugins/channelrx/daemonsink/daemonsink.h @@ -118,7 +118,7 @@ public: void setSampleRate(uint32_t sampleRate) { m_sampleRate = sampleRate; } void setNbBlocksFEC(int nbBlocksFEC); - void setTxDelay(int txDelay); + void setTxDelay(int txDelay, int nbBlocksFEC); void setDataAddress(const QString& address) { m_dataAddress = address; } void setDataPort(uint16_t port) { m_dataPort = port; } diff --git a/plugins/channelrx/daemonsink/daemonsinkgui.cpp b/plugins/channelrx/daemonsink/daemonsinkgui.cpp index 78db56c9d..a5826665c 100644 --- a/plugins/channelrx/daemonsink/daemonsinkgui.cpp +++ b/plugins/channelrx/daemonsink/daemonsinkgui.cpp @@ -83,6 +83,7 @@ bool DaemonSinkGUI::handleMessage(const Message& message) DaemonSink::MsgSampleRateNotification& notif = (DaemonSink::MsgSampleRateNotification&) message; m_channelMarker.setBandwidth(notif.getSampleRate()); m_sampleRate = notif.getSampleRate(); + updateTxDelayTime(); return true; } else if (DaemonSink::MsgConfigureDaemonSink::match(message)) @@ -177,8 +178,8 @@ void DaemonSinkGUI::displaySettings() QString s = QString::number(128 + m_settings.m_nbFECBlocks, 'f', 0); QString s1 = QString::number(m_settings.m_nbFECBlocks, 'f', 0); ui->nominalNbBlocksText->setText(tr("%1/%2").arg(s).arg(s1)); - ui->txDelayText->setText(tr("%1").arg(m_settings.m_txDelay)); - updateTxDelayTooltip(); + ui->txDelayText->setText(tr("%1%").arg(m_settings.m_txDelay)); + updateTxDelayTime(); blockApplySettings(false); } @@ -265,8 +266,8 @@ void DaemonSinkGUI::on_dataApplyButton_clicked(bool checked __attribute__((unuse void DaemonSinkGUI::on_txDelay_valueChanged(int value) { m_settings.m_txDelay = value; // percentage - ui->txDelayText->setText(tr("%1").arg(value)); - updateTxDelayTooltip(); + ui->txDelayText->setText(tr("%1%").arg(value)); + updateTxDelayTime(); applySettings(); } @@ -278,16 +279,16 @@ void DaemonSinkGUI::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(); + updateTxDelayTime(); applySettings(); } -void DaemonSinkGUI::updateTxDelayTooltip() +void DaemonSinkGUI::updateTxDelayTime() { double txDelayRatio = m_settings.m_txDelay / 100.0; double delay = m_sampleRate == 0 ? 0.0 : (127*127*txDelayRatio) / m_sampleRate; delay /= 128 + m_settings.m_nbFECBlocks; - ui->txDelayText->setToolTip(tr("%1 us").arg(QString::number(delay*1e6, 'f', 0))); + ui->txDelayTime->setText(tr("%1µs").arg(QString::number(delay*1e6, 'f', 0))); } void DaemonSinkGUI::tick() diff --git a/plugins/channelrx/daemonsink/daemonsinkgui.h b/plugins/channelrx/daemonsink/daemonsinkgui.h index a161b8ebf..139f3281c 100644 --- a/plugins/channelrx/daemonsink/daemonsinkgui.h +++ b/plugins/channelrx/daemonsink/daemonsinkgui.h @@ -75,7 +75,7 @@ private: void blockApplySettings(bool block); void applySettings(bool force = false); void displaySettings(); - void updateTxDelayTooltip(); + void updateTxDelayTime(); void leaveEvent(QEvent*); void enterEvent(QEvent*); diff --git a/plugins/channelrx/daemonsink/daemonsinkgui.ui b/plugins/channelrx/daemonsink/daemonsinkgui.ui index 8fd0dc41c..a48750f94 100644 --- a/plugins/channelrx/daemonsink/daemonsinkgui.ui +++ b/plugins/channelrx/daemonsink/daemonsinkgui.ui @@ -158,6 +158,13 @@ + + + + FEC + + + @@ -242,12 +249,28 @@ - 20 + 30 0 - 90 + 50% + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 55 + 0 + + + + 10000us Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter diff --git a/plugins/channelrx/daemonsink/daemonsinksettings.cpp b/plugins/channelrx/daemonsink/daemonsinksettings.cpp index 64d672a94..930531123 100644 --- a/plugins/channelrx/daemonsink/daemonsinksettings.cpp +++ b/plugins/channelrx/daemonsink/daemonsinksettings.cpp @@ -34,7 +34,7 @@ DaemonSinkSettings::DaemonSinkSettings() void DaemonSinkSettings::resetToDefaults() { m_nbFECBlocks = 0; - m_txDelay = 100; + m_txDelay = 50; m_dataAddress = "127.0.0.1"; m_dataPort = 9090; m_rgbColor = QColor(140, 4, 4).rgb(); @@ -77,7 +77,7 @@ bool DaemonSinkSettings::deserialize(const QByteArray& data) m_nbFECBlocks = 0; } - d.readU32(2, &m_txDelay, 100); + d.readU32(2, &m_txDelay, 50); d.readString(3, &m_dataAddress, "127.0.0.1"); d.readU32(4, &tmp, 0); diff --git a/plugins/channelrx/daemonsink/daemonsinkthread.cpp b/plugins/channelrx/daemonsink/daemonsinkthread.cpp index d194ae32b..812176088 100644 --- a/plugins/channelrx/daemonsink/daemonsinkthread.cpp +++ b/plugins/channelrx/daemonsink/daemonsinkthread.cpp @@ -110,8 +110,7 @@ bool DaemonSinkThread::handleDataBlock(SDRDaemonDataBlock& dataBlock) { // send block via UDP m_socket->writeDatagram((const char*)&txBlockx[i], (qint64 ) SDRDaemonUdpSize, m_address, dataPort); - //m_socket->SendDataGram((const char*)&txBlockx[i], (int) SDRDaemonUdpSize, m_address.toStdString(), (uint32_t) dataPort); - //usleep(txDelay); + usleep(txDelay); } } }