From 0822773fbb0e0115fe870e7814a45036aea7eac3 Mon Sep 17 00:00:00 2001 From: f4exb Date: Sat, 26 Mar 2016 21:40:54 +0100 Subject: [PATCH] SDRdaemon plugin: send configuration phase 1 --- .../samplesource/sdrdaemon/sdrdaemongui.cpp | 216 ++++++++++++-- plugins/samplesource/sdrdaemon/sdrdaemongui.h | 25 +- .../samplesource/sdrdaemon/sdrdaemongui.ui | 265 +++++++++++++++++- .../samplesource/sdrdaemon/sdrdaemoninput.cpp | 8 + .../samplesource/sdrdaemon/sdrdaemoninput.h | 1 + .../sdrdaemon/sdrdaemonudphandler.cpp | 3 +- .../sdrdaemon/sdrdaemonudphandler.h | 2 + sdrbase/gui/preferencesdialog.ui | 17 -- 8 files changed, 485 insertions(+), 52 deletions(-) diff --git a/plugins/samplesource/sdrdaemon/sdrdaemongui.cpp b/plugins/samplesource/sdrdaemon/sdrdaemongui.cpp index 7248e8a1b..391d77434 100644 --- a/plugins/samplesource/sdrdaemon/sdrdaemongui.cpp +++ b/plugins/samplesource/sdrdaemon/sdrdaemongui.cpp @@ -14,13 +14,21 @@ // along with this program. If not, see . // /////////////////////////////////////////////////////////////////////////////////// -#include +#include +#include +#include +#include +#include +#include #include #include #include #include -#include + +#include +#include + #include "ui_sdrdaemongui.h" #include "plugin/pluginapi.h" #include "gui/colormapper.h" @@ -50,7 +58,11 @@ SDRdaemonGui::SDRdaemonGui(PluginAPI* pluginAPI, QWidget* parent) : m_samplesCount(0), m_tickCount(0), m_address("127.0.0.1"), - m_port(9090), + m_dataPort(9090), + m_controlPort(9091), + m_addressEdited(false), + m_dataPortEdited(false), + m_initSendConfiguration(false), m_dcBlock(false), m_iqCorrection(false), m_autoFollowRate(false) @@ -69,6 +81,7 @@ SDRdaemonGui::SDRdaemonGui(PluginAPI* pluginAPI, QWidget* parent) : displaySettings(); ui->applyButton->setEnabled(false); + ui->sendButton->setEnabled(false); } SDRdaemonGui::~SDRdaemonGui() @@ -94,7 +107,9 @@ QString SDRdaemonGui::getName() const void SDRdaemonGui::resetToDefaults() { m_address = "127.0.0.1"; - m_port = 9090; + m_remoteAddress = "127.0.0.1"; + m_dataPort = 9090; + m_controlPort = 9091; m_dcBlock = false; m_iqCorrection = false; m_autoFollowRate = false; @@ -107,7 +122,7 @@ QByteArray SDRdaemonGui::serialize() const SimpleSerializer s(1); s.writeString(1, ui->address->text()); - uint32_t uintval = ui->port->text().toInt(&ok); + uint32_t uintval = ui->dataPort->text().toInt(&ok); if((!ok) || (uintval < 1024) || (uintval > 65535)) { uintval = 9090; @@ -119,6 +134,31 @@ QByteArray SDRdaemonGui::serialize() const s.writeBool(5, m_autoFollowRate); s.writeBool(6, m_autoCorrBuffer); + uintval = ui->controlPort->text().toInt(&ok); + + if((!ok) || (uintval < 1024) || (uintval > 65535)) { + uintval = 9091; + } + + s.writeU32(7, uintval); + + uint32_t confFrequency = ui->freq->text().toInt(&ok); + + if (ok) { + s.writeU32(8, confFrequency); + } + + s.writeU32(9, ui->decim->currentIndex()); + s.writeU32(10, ui->fcPos->currentIndex()); + + uint32_t sampleRate = ui->sampleRate->text().toInt(&ok); + + if (ok) { + s.writeU32(11, sampleRate); + } + + s.writeString(12, ui->specificParms->text()); + return s.final(); } @@ -127,11 +167,16 @@ bool SDRdaemonGui::deserialize(const QByteArray& data) SimpleDeserializer d(data); QString address; uint32_t uintval; - quint16 port; + quint16 dataPort; bool dcBlock; bool iqCorrection; bool autoFollowRate; bool autoCorrBuffer; + uint32_t confFrequency; + uint32_t confSampleRate; + uint32_t confDecim; + uint32_t confFcPos; + QString confSpecificParms; if (!d.isValid()) { @@ -147,20 +192,33 @@ bool SDRdaemonGui::deserialize(const QByteArray& data) d.readU32(2, &uintval, 9090); if ((uintval > 1024) && (uintval < 65536)) { - port = uintval; + dataPort = uintval; } else { - port = 9090; + dataPort = 9090; } d.readBool(3, &dcBlock, false); d.readBool(4, &iqCorrection, false); d.readBool(5, &autoFollowRate, false); d.readBool(6, &autoCorrBuffer, false); + d.readU32(7, &uintval, 9091); - if ((address != m_address) || (port != m_port)) + if ((uintval > 1024) && (uintval < 65536)) { + m_controlPort = uintval; + } else { + m_controlPort = 9091; + } + + d.readU32(8, &confFrequency, 435000); + d.readU32(9, &confDecim, 3); + d.readU32(10, &confFcPos, 2); + d.readU32(11, &confSampleRate, 1000); + d.readString(12, &confSpecificParms, ""); + + if ((address != m_address) || (dataPort != m_dataPort)) { m_address = address; - m_port = port; + m_dataPort = dataPort; configureUDPLink(); } @@ -179,12 +237,17 @@ bool SDRdaemonGui::deserialize(const QByteArray& data) } displaySettings(); + displayConfigurationParameters(confFrequency, confDecim, confFcPos, confSampleRate, confSpecificParms); + m_initSendConfiguration = true; return true; } else { resetToDefaults(); displaySettings(); + QString defaultSpecificParameters(""); + displayConfigurationParameters(435000, 3, 2, 1000, defaultSpecificParameters); + m_initSendConfiguration = true; return false; } } @@ -264,38 +327,119 @@ void SDRdaemonGui::handleSourceMessages() void SDRdaemonGui::displaySettings() { ui->address->setText(m_address); - ui->port->setText(QString::number(m_port)); + ui->dataPort->setText(QString::number(m_dataPort)); + ui->controlPort->setText(QString::number(m_controlPort)); ui->dcOffset->setChecked(m_dcBlock); ui->iqImbalance->setChecked(m_iqCorrection); ui->autoFollowRate->setChecked(m_autoFollowRate); ui->autoCorrBuffer->setChecked(m_autoCorrBuffer); } +void SDRdaemonGui::displayConfigurationParameters(uint32_t freq, + uint32_t log2Decim, + uint32_t fcPos, + uint32_t sampleRate, + QString& specParms) +{ + ui->freq->setText(QString::number(freq)); + ui->decim->setCurrentIndex(log2Decim); + ui->fcPos->setCurrentIndex(fcPos); + ui->sampleRate->setText(QString::number(sampleRate)); + ui->specificParms->setText(specParms); + ui->specificParms->setCursorPosition(0); +} + void SDRdaemonGui::on_applyButton_clicked(bool checked) { - bool ok; + bool dataOk, ctlOk; QString udpAddress = ui->address->text(); - int udpPort = ui->port->text().toInt(&ok); + int udpDataPort = ui->dataPort->text().toInt(&dataOk); + int tcpCtlPort = ui->controlPort->text().toInt(&ctlOk); - if((!ok) || (udpPort < 1024) || (udpPort > 65535)) + if((!dataOk) || (udpDataPort < 1024) || (udpDataPort > 65535)) { - udpPort = 9090; + udpDataPort = 9090; + } + + if((!ctlOk) || (tcpCtlPort < 1024) || (tcpCtlPort > 65535)) + { + tcpCtlPort = 9091; } m_address = udpAddress; - m_port = udpPort; + m_dataPort = udpDataPort; + m_controlPort = tcpCtlPort; - configureUDPLink(); + if (m_addressEdited || m_dataPortEdited) + { + configureUDPLink(); + m_addressEdited = false; + m_dataPortEdited = false; + } ui->applyButton->setEnabled(false); } +void SDRdaemonGui::on_sendButton_clicked(bool checked) +{ + sendConfiguration(); + ui->sendButton->setEnabled(false); +} + +void SDRdaemonGui::sendConfiguration() +{ + QString remoteAddress; + ((SDRdaemonInput *) m_sampleSource)->getRemoteAddress(remoteAddress); + + if (remoteAddress != m_remoteAddress) + { + m_remoteAddress = remoteAddress; + } + + std::ostringstream os; + bool ok; + + os << "decim=" << ui->decim->currentIndex() + << ",fcpos=" << ui->fcPos->currentIndex(); + + uint64_t freq = ui->freq->text().toInt(&ok); + + if (ok) { + os << ",freq=" << freq*1000LL; + } else { + QMessageBox::information(this, tr("Message"), tr("Invalid frequency")); + } + + uint32_t srate = ui->sampleRate->text().toInt(&ok); + + if (ok) { + os << ",srate=" << srate*1000; + } else { + QMessageBox::information(this, tr("Message"), tr("invalid sample rate")); + } + + if ((ui->specificParms->text()).size() > 0) { + os << "," << ui->specificParms->text().toStdString(); + } + + qDebug() << "SDRdaemonGui::sendConfiguration:" + << " remoteAddress: " << remoteAddress + << " message: " << os.str().c_str(); +} + void SDRdaemonGui::on_address_textEdited(const QString& arg1) { ui->applyButton->setEnabled(true); + m_addressEdited = true; } -void SDRdaemonGui::on_port_textEdited(const QString& arg1) +void SDRdaemonGui::on_dataPort_textEdited(const QString& arg1) +{ + ui->applyButton->setEnabled(true); + m_dataPortEdited = true; +} + +void SDRdaemonGui::on_controlPort_textEdited(const QString& arg1) { ui->applyButton->setEnabled(true); } @@ -340,12 +484,38 @@ void SDRdaemonGui::on_resetIndexes_clicked(bool checked) m_sampleSource->getInputMessageQueue()->push(message); } +void SDRdaemonGui::on_freq_textEdited(const QString& arg1) +{ + ui->sendButton->setEnabled(true); +} + +void SDRdaemonGui::on_sampleRate_textEdited(const QString& arg1) +{ + ui->sendButton->setEnabled(true); +} + +void SDRdaemonGui::on_specificParms_textEdited(const QString& arg1) +{ + ui->sendButton->setEnabled(true); +} + +void SDRdaemonGui::on_decim_currentIndexChanged(int index) +{ + ui->sendButton->setEnabled(true); +} + +void SDRdaemonGui::on_fcPos_currentIndexChanged(int index) +{ + ui->sendButton->setEnabled(true); +} + + void SDRdaemonGui::configureUDPLink() { qDebug() << "SDRdaemonGui::configureUDPLink: " << m_address.toStdString().c_str() - << " : " << m_port; + << " : " << m_dataPort; - SDRdaemonInput::MsgConfigureSDRdaemonUDPLink* message = SDRdaemonInput::MsgConfigureSDRdaemonUDPLink::create(m_address, m_port); + SDRdaemonInput::MsgConfigureSDRdaemonUDPLink* message = SDRdaemonInput::MsgConfigureSDRdaemonUDPLink::create(m_address, m_dataPort); m_sampleSource->getInputMessageQueue()->push(message); } @@ -376,6 +546,12 @@ void SDRdaemonGui::updateWithStreamData() QString s2 = QString::number(skewPerCent, 'f', 2); ui->skewRateText->setText(tr("%1").arg(s2)); updateWithStreamTime(); + + if (m_initSendConfiguration) + { + sendConfiguration(); + m_initSendConfiguration = false; + } } void SDRdaemonGui::updateWithStreamTime() diff --git a/plugins/samplesource/sdrdaemon/sdrdaemongui.h b/plugins/samplesource/sdrdaemon/sdrdaemongui.h index 182b3974a..b626e02aa 100644 --- a/plugins/samplesource/sdrdaemon/sdrdaemongui.h +++ b/plugins/samplesource/sdrdaemon/sdrdaemongui.h @@ -72,13 +72,26 @@ private: std::size_t m_tickCount; QString m_address; - quint16 m_port; + QString m_remoteAddress; + quint16 m_dataPort; + quint16 m_controlPort; + bool m_addressEdited; + bool m_dataPortEdited; + bool m_initSendConfiguration; + bool m_dcBlock; bool m_iqCorrection; bool m_autoFollowRate; bool m_autoCorrBuffer; void displaySettings(); + + void displayConfigurationParameters(uint32_t freq, + uint32_t log2Decim, + uint32_t fcPos, + uint32_t sampleRate, + QString& specParms); + void displayTime(); void configureUDPLink(); void configureAutoCorrections(); @@ -86,6 +99,7 @@ private: void updateWithAcquisition(); void updateWithStreamData(); void updateWithStreamTime(); + void sendConfiguration(); private slots: void handleSourceMessages(); @@ -96,7 +110,14 @@ private slots: void on_autoCorrBuffer_toggled(bool checked); void on_resetIndexes_clicked(bool checked); void on_address_textEdited(const QString& arg1); - void on_port_textEdited(const QString& arg1); + void on_dataPort_textEdited(const QString& arg1); + void on_controlPort_textEdited(const QString& arg1); + void on_sendButton_clicked(bool checked); + void on_freq_textEdited(const QString& arg1); + void on_sampleRate_textEdited(const QString& arg1); + void on_specificParms_textEdited(const QString& arg1); + void on_decim_currentIndexChanged(int index); + void on_fcPos_currentIndexChanged(int index); void tick(); }; diff --git a/plugins/samplesource/sdrdaemon/sdrdaemongui.ui b/plugins/samplesource/sdrdaemon/sdrdaemongui.ui index 53de33918..4bb82b1be 100644 --- a/plugins/samplesource/sdrdaemon/sdrdaemongui.ui +++ b/plugins/samplesource/sdrdaemon/sdrdaemongui.ui @@ -6,8 +6,8 @@ 0 0 - 398 - 175 + 363 + 365 @@ -583,7 +583,7 @@ - + Qt::Horizontal @@ -605,41 +605,64 @@ - 150 + 120 0 - Data connection IP address + Local data connection IP address - 127.0.0.1 + 000.000.000.000 + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - + - Port: + D: - + true - 80 + 16777215 16777215 - Data connection port + Local data connection port - 9090 + 00000 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + C: + + + + + + + Remote control port + + + 00000 Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -677,6 +700,224 @@ + + + + Qt::Horizontal + + + + + + + + + Fc: + + + + + + + + 0 + 0 + + + + + 90 + 16777215 + + + + Set center frequency (kHz) + + + 00000000 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + k Dec: + + + + + + + + 40 + 16777215 + + + + Decimation + + + 3 + + + + 1 + + + + + 2 + + + + + 4 + + + + + 8 + + + + + 16 + + + + + 32 + + + + + 64 + + + + + + + + Fp: + + + + + + + + 50 + 16777215 + + + + Center frequency position (Infradyne, Supradyne, Centered) + + + 2 + + + + Inf + + + + + Sup + + + + + Cen + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 50 + 16777215 + + + + Send commands to remote SDRdaemon instance + + + Send + + + + + + + + + + + SR: + + + + + + + + 0 + 0 + + + + + 50 + 16777215 + + + + Sample rate (kS/s) + + + 00000 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + k Sp: + + + + + + + Other parameters that are hardware specific + + + + + diff --git a/plugins/samplesource/sdrdaemon/sdrdaemoninput.cpp b/plugins/samplesource/sdrdaemon/sdrdaemoninput.cpp index ae0ce0cec..a511e1865 100644 --- a/plugins/samplesource/sdrdaemon/sdrdaemoninput.cpp +++ b/plugins/samplesource/sdrdaemon/sdrdaemoninput.cpp @@ -101,6 +101,14 @@ std::time_t SDRdaemonInput::getStartingTimeStamp() const return m_startingTimeStamp; } +void SDRdaemonInput::getRemoteAddress(QString &s) +{ + if (m_SDRdaemonUDPHandler) { + m_SDRdaemonUDPHandler->getRemoteAddress(s); + } +} + + bool SDRdaemonInput::handleMessage(const Message& message) { if (MsgConfigureSDRdaemonUDPLink::match(message)) diff --git a/plugins/samplesource/sdrdaemon/sdrdaemoninput.h b/plugins/samplesource/sdrdaemon/sdrdaemoninput.h index aefc8ad73..4a8236e70 100644 --- a/plugins/samplesource/sdrdaemon/sdrdaemoninput.h +++ b/plugins/samplesource/sdrdaemon/sdrdaemoninput.h @@ -284,6 +284,7 @@ public: virtual int getSampleRate() const; virtual quint64 getCenterFrequency() const; std::time_t getStartingTimeStamp() const; + void getRemoteAddress(QString &s); virtual bool handleMessage(const Message& message); diff --git a/plugins/samplesource/sdrdaemon/sdrdaemonudphandler.cpp b/plugins/samplesource/sdrdaemon/sdrdaemonudphandler.cpp index 12939fb93..2f04abe15 100644 --- a/plugins/samplesource/sdrdaemon/sdrdaemonudphandler.cpp +++ b/plugins/samplesource/sdrdaemon/sdrdaemonudphandler.cpp @@ -27,6 +27,7 @@ SDRdaemonUDPHandler::SDRdaemonUDPHandler(SampleFifo *sampleFifo, MessageQueue *o m_sdrDaemonBuffer(m_rateDivider), m_dataSocket(0), m_dataAddress(QHostAddress::LocalHost), + m_remoteAddress(QHostAddress::LocalHost), m_dataPort(9090), m_dataConnected(false), m_udpBuf(0), @@ -128,7 +129,7 @@ void SDRdaemonUDPHandler::dataReadyRead() while (m_dataSocket->hasPendingDatagrams()) { qint64 pendingDataSize = m_dataSocket->pendingDatagramSize(); - m_udpReadBytes = m_dataSocket->readDatagram(m_udpBuf, pendingDataSize, 0, 0); + m_udpReadBytes = m_dataSocket->readDatagram(m_udpBuf, pendingDataSize, &m_remoteAddress, 0); processData(); } } diff --git a/plugins/samplesource/sdrdaemon/sdrdaemonudphandler.h b/plugins/samplesource/sdrdaemon/sdrdaemonudphandler.h index 8fb33e6a8..4615eaab1 100644 --- a/plugins/samplesource/sdrdaemon/sdrdaemonudphandler.h +++ b/plugins/samplesource/sdrdaemon/sdrdaemonudphandler.h @@ -41,6 +41,7 @@ public: void start(); void stop(); void configureUDPLink(const QString& address, quint16 port); + void getRemoteAddress(QString& s) const { s = m_remoteAddress.toString(); } void setAutoFollowRate(bool autoFollowRate) { m_sdrDaemonBuffer.setAutoFollowRate(autoFollowRate); } void setAutoCorrBuffer(bool autoCorrBuffer) { m_autoCorrBuffer = autoCorrBuffer; m_sdrDaemonBuffer.setAutoCorrBuffer(autoCorrBuffer); } void resetIndexes() { m_sdrDaemonBuffer.setResetIndexes(); } @@ -51,6 +52,7 @@ private: SDRdaemonBuffer m_sdrDaemonBuffer; QUdpSocket *m_dataSocket; QHostAddress m_dataAddress; + QHostAddress m_remoteAddress; quint16 m_dataPort; bool m_dataConnected; char *m_udpBuf; diff --git a/sdrbase/gui/preferencesdialog.ui b/sdrbase/gui/preferencesdialog.ui index faf70193b..af404fa5e 100644 --- a/sdrbase/gui/preferencesdialog.ui +++ b/sdrbase/gui/preferencesdialog.ui @@ -25,22 +25,6 @@ 0 - - - Receiver Hardware - - - - - - - 1 - - - - - - Audio Output @@ -74,7 +58,6 @@ buttonBox tabWidget - treeWidget audioTree