diff --git a/plugins/samplesource/remotetcpinput/remotetcpinputgui.cpp b/plugins/samplesource/remotetcpinput/remotetcpinputgui.cpp index 8d28d6762..04f47a3e3 100644 --- a/plugins/samplesource/remotetcpinput/remotetcpinputgui.cpp +++ b/plugins/samplesource/remotetcpinput/remotetcpinputgui.cpp @@ -266,6 +266,23 @@ bool RemoteTCPInputGui::handleMessage(const Message& message) ui->centerFrequency->setValueRange(7, 0, 9999999); } + // Set sample rate range + if (m_sampleRateRanges.contains(m_remoteDevice)) + { + const SampleRateRange *range = m_sampleRateRanges.value(m_remoteDevice); + ui->devSampleRate->setValueRange(8, range->m_min, range->m_max); + } + else if (m_sampleRateLists.contains(m_remoteDevice)) + { + const QList *list = m_sampleRateLists.value(m_remoteDevice); + // FIXME: Should probably use a combobox for devices that have a list of sample rates + ui->devSampleRate->setValueRange(8, list->front(), list->back()); + } + else + { + ui->devSampleRate->setValueRange(8, 0, 99999999); + } + displayGains(); return true; } @@ -352,7 +369,16 @@ void RemoteTCPInputGui::displaySettings() ui->sampleBits->setCurrentIndex(m_settings.m_sampleBits/8-1); ui->dataPort->setText(tr("%1").arg(m_settings.m_dataPort)); - ui->dataAddress->setText(m_settings.m_dataAddress); + ui->dataAddress->blockSignals(true); + ui->dataAddress->clear(); + for (const auto& address : m_settings.m_addressList) { + ui->dataAddress->addItem(address); + } + if (ui->dataAddress->findText(m_settings.m_dataAddress) == -1) { + ui->dataAddress->addItem(m_settings.m_dataAddress); + } + ui->dataAddress->setCurrentText(m_settings.m_dataAddress); + ui->dataAddress->blockSignals(false); ui->overrideRemoteSettings->setChecked(m_settings.m_overrideRemoteSettings); ui->preFill->setValue((int)(m_settings.m_preFill * 10.0)); @@ -362,6 +388,43 @@ void RemoteTCPInputGui::displaySettings() blockApplySettings(false); } +// Device sample rates + +const RemoteTCPInputGui::SampleRateRange RemoteTCPInputGui::m_rtlSDRSampleRateRange{900001, 3200000}; +const RemoteTCPInputGui::SampleRateRange RemoteTCPInputGui::m_sdrPlaySampleRateRange{2000000, 10660000}; +const RemoteTCPInputGui::SampleRateRange RemoteTCPInputGui::m_bladeRF1SampleRateRange{330000, 40000000}; +const RemoteTCPInputGui::SampleRateRange RemoteTCPInputGui::m_hackRFSampleRateRange{1000000, 20000000}; +const RemoteTCPInputGui::SampleRateRange RemoteTCPInputGui::m_limeSampleRateRange{100000, 614400000}; // Mini is lower than this +const RemoteTCPInputGui::SampleRateRange RemoteTCPInputGui::m_plutoSampleRateRange{2000000, 20000000}; +const RemoteTCPInputGui::SampleRateRange RemoteTCPInputGui::m_usrpSampleRateRange{100000, 614400000}; // For B210 + +const QHash RemoteTCPInputGui::m_sampleRateRanges = +{ + {RemoteTCPProtocol::RTLSDR_E4000, &m_rtlSDRSampleRateRange}, + {RemoteTCPProtocol::RTLSDR_R820T, &m_rtlSDRSampleRateRange}, + {RemoteTCPProtocol::BLADE_RF1, &m_bladeRF1SampleRateRange}, + {RemoteTCPProtocol::HACK_RF, &m_hackRFSampleRateRange}, + {RemoteTCPProtocol::LIME_SDR, &m_limeSampleRateRange}, + {RemoteTCPProtocol::SDRPLAY_V3_RSP1, &m_sdrPlaySampleRateRange}, + {RemoteTCPProtocol::SDRPLAY_V3_RSP1A, &m_sdrPlaySampleRateRange}, + {RemoteTCPProtocol::SDRPLAY_V3_RSP2, &m_sdrPlaySampleRateRange}, + {RemoteTCPProtocol::SDRPLAY_V3_RSPDUO, &m_sdrPlaySampleRateRange}, + {RemoteTCPProtocol::SDRPLAY_V3_RSPDX, &m_sdrPlaySampleRateRange}, + {RemoteTCPProtocol::PLUTO_SDR, &m_plutoSampleRateRange}, + {RemoteTCPProtocol::USRP, &m_usrpSampleRateRange}, +}; + +const QList RemoteTCPInputGui::m_airspySampleRateList {2500000, 10000000}; +const QList RemoteTCPInputGui::m_airspyHFSampleRateList {192000, 256000, 384000, 456000, 768000, 912000}; + +const QHash *> RemoteTCPInputGui::m_sampleRateLists = +{ + {RemoteTCPProtocol::AIRSPY, &m_airspySampleRateList}, + {RemoteTCPProtocol::AIRSPY_HF, &m_airspyHFSampleRateList} +}; + +// Device gains + const RemoteTCPInputGui::DeviceGains::GainRange RemoteTCPInputGui::m_rtlSDR34kGainRange( "Gain", { @@ -408,8 +471,8 @@ const RemoteTCPInputGui::DeviceGains RemoteTCPInputGui::m_kiwiGains({m_kiwiGainR const RemoteTCPInputGui::DeviceGains::GainRange RemoteTCPInputGui::m_limeRange("Gain", 0, 70, 1); // Assuming auto setting const RemoteTCPInputGui::DeviceGains RemoteTCPInputGui::m_limeGains({m_limeRange}, true, false); -// SDRplay LNA gain is device & frequency dependent (See sdrplayv3input.h SDRPlayV3LNA) sp we just fix as 0 for now -const RemoteTCPInputGui::DeviceGains::GainRange RemoteTCPInputGui::m_sdrplayV3LNAGainRange("LNA", {0}); +// SDRplay LNA gain is device & frequency dependent (See sdrplayv3input.h SDRPlayV3LNA), server should choose closest value +const RemoteTCPInputGui::DeviceGains::GainRange RemoteTCPInputGui::m_sdrplayV3LNAGainRange("LNA", -80, 0, 1); const RemoteTCPInputGui::DeviceGains::GainRange RemoteTCPInputGui::m_sdrplayV3IFGainRange("IF", -59, 0, 1); const RemoteTCPInputGui::DeviceGains RemoteTCPInputGui::m_sdrplayV3Gains({m_sdrplayV3LNAGainRange, m_sdrplayV3IFGainRange}, true, true); @@ -691,7 +754,21 @@ void RemoteTCPInputGui::on_sampleBits_currentIndexChanged(int index) void RemoteTCPInputGui::on_dataAddress_editingFinished() { - m_settings.m_dataAddress = ui->dataAddress->text(); + m_settings.m_dataAddress = ui->dataAddress->currentText(); + m_settingsKeys.append("dataAddress"); + m_settings.m_addressList.clear(); + for (int i = 0; i < ui->dataAddress->count(); i++) { + m_settings.m_addressList.append(ui->dataAddress->itemText(i)); + } + m_settingsKeys.append("addressList"); + sendSettings(); +} + +void RemoteTCPInputGui::on_dataAddress_currentIndexChanged(int index) +{ + (void) index; + + m_settings.m_dataAddress = ui->dataAddress->currentText(); m_settingsKeys.append("dataAddress"); sendSettings(); } @@ -816,7 +893,8 @@ void RemoteTCPInputGui::makeUIConnections() QObject::connect(ui->channelSampleRate, &ValueDial::changed, this, &RemoteTCPInputGui::on_channelSampleRate_changed); QObject::connect(ui->decimation, &ButtonSwitch::toggled, this, &RemoteTCPInputGui::on_decimation_toggled); QObject::connect(ui->sampleBits, QOverload::of(&QComboBox::currentIndexChanged), this, &RemoteTCPInputGui::on_sampleBits_currentIndexChanged); - QObject::connect(ui->dataAddress, &QLineEdit::editingFinished, this, &RemoteTCPInputGui::on_dataAddress_editingFinished); + QObject::connect(ui->dataAddress->lineEdit(), &QLineEdit::editingFinished, this, &RemoteTCPInputGui::on_dataAddress_editingFinished); + QObject::connect(ui->dataAddress, QOverload::of(&QComboBox::currentIndexChanged), this, &RemoteTCPInputGui::on_dataAddress_currentIndexChanged); QObject::connect(ui->dataPort, &QLineEdit::editingFinished, this, &RemoteTCPInputGui::on_dataPort_editingFinished); QObject::connect(ui->overrideRemoteSettings, &ButtonSwitch::toggled, this, &RemoteTCPInputGui::on_overrideRemoteSettings_toggled); QObject::connect(ui->preFill, &QDial::valueChanged, this, &RemoteTCPInputGui::on_preFill_valueChanged); diff --git a/plugins/samplesource/remotetcpinput/remotetcpinputgui.h b/plugins/samplesource/remotetcpinput/remotetcpinputgui.h index 22b07de73..5960a681b 100644 --- a/plugins/samplesource/remotetcpinput/remotetcpinputgui.h +++ b/plugins/samplesource/remotetcpinput/remotetcpinputgui.h @@ -86,6 +86,11 @@ class RemoteTCPInputGui : public DeviceGUI { bool m_biasTee; }; + struct SampleRateRange { + int m_min; + int m_max; + }; + public: explicit RemoteTCPInputGui(DeviceUISet *deviceUISet, QWidget* parent = 0); virtual ~RemoteTCPInputGui(); @@ -151,6 +156,19 @@ private: static const DeviceGains m_xtrxGains; static const QHash m_gains; + static const SampleRateRange m_rtlSDRSampleRateRange; + static const SampleRateRange m_sdrPlaySampleRateRange; + static const SampleRateRange m_bladeRF1SampleRateRange; + static const SampleRateRange m_hackRFSampleRateRange; + static const SampleRateRange m_limeSampleRateRange; + static const SampleRateRange m_plutoSampleRateRange; + static const SampleRateRange m_usrpSampleRateRange; + static const QHash m_sampleRateRanges; + + static const QList m_airspySampleRateList; + static const QList m_airspyHFSampleRateList; + static const QHash *> m_sampleRateLists; + void blockApplySettings(bool block); void displaySettings(); QString gainText(int stage); @@ -186,6 +204,7 @@ private slots: void on_decimation_toggled(bool checked); void on_sampleBits_currentIndexChanged(int index); void on_dataAddress_editingFinished(); + void on_dataAddress_currentIndexChanged(int index); void on_dataPort_editingFinished(); void on_overrideRemoteSettings_toggled(bool checked); void on_preFill_valueChanged(int value); diff --git a/plugins/samplesource/remotetcpinput/remotetcpinputgui.ui b/plugins/samplesource/remotetcpinput/remotetcpinputgui.ui index 80bc948ee..6d8d881fd 100644 --- a/plugins/samplesource/remotetcpinput/remotetcpinputgui.ui +++ b/plugins/samplesource/remotetcpinput/remotetcpinputgui.ui @@ -876,7 +876,7 @@ Use to ensure full dynamic range of 8-bit data is used. - 50 + 0 0 @@ -886,28 +886,24 @@ Use to ensure full dynamic range of 8-bit data is used. - + 120 0 - - - 120 - 16777215 - - Remote IPv4 address or hostname to connect to - - - - - + + true + + + 127.0.0.1 + + @@ -1184,17 +1180,17 @@ This should typically be empty. If full, your CPU cannot keep up and data will b
gui/valuedialz.h
1 - - ButtonSwitch - QToolButton -
gui/buttonswitch.h
-
ValueDial QWidget
gui/valuedial.h
1
+ + ButtonSwitch + QToolButton +
gui/buttonswitch.h
+
startStop @@ -1213,7 +1209,6 @@ This should typically be empty. If full, your CPU cannot keep up and data will b channelGain decimation sampleBits - dataAddress dataPort overrideRemoteSettings preFill diff --git a/plugins/samplesource/remotetcpinput/remotetcpinputsettings.cpp b/plugins/samplesource/remotetcpinput/remotetcpinputsettings.cpp index 759633d94..1809210f0 100644 --- a/plugins/samplesource/remotetcpinput/remotetcpinputsettings.cpp +++ b/plugins/samplesource/remotetcpinput/remotetcpinputsettings.cpp @@ -80,6 +80,7 @@ QByteArray RemoteTCPInputSettings::serialize() const s.writeString(21, m_reverseAPIAddress); s.writeU32(22, m_reverseAPIPort); s.writeU32(23, m_reverseAPIDeviceIndex); + s.writeList(24, m_addressList); for (int i = 0; i < m_maxGains; i++) { s.writeS32(30+i, m_gain[i]); @@ -134,6 +135,8 @@ bool RemoteTCPInputSettings::deserialize(const QByteArray& data) d.readU32(23, &uintval, 0); m_reverseAPIDeviceIndex = uintval > 99 ? 99 : uintval; + d.readList(24, &m_addressList); + for (int i = 0; i < m_maxGains; i++) { d.readS32(30+i, &m_gain[i], 0); } @@ -218,6 +221,9 @@ void RemoteTCPInputSettings::applySettings(const QStringList& settingsKeys, cons if (settingsKeys.contains("reverseAPIDeviceIndex")) { m_reverseAPIDeviceIndex = settings.m_reverseAPIDeviceIndex; } + if (settingsKeys.contains("addressList")) { + m_addressList = settings.m_addressList; + } for (int i = 0; i < m_maxGains; i++) { @@ -300,6 +306,9 @@ QString RemoteTCPInputSettings::getDebugString(const QStringList& settingsKeys, if (settingsKeys.contains("reverseAPIDeviceIndex") || force) { ostr << " m_reverseAPIDeviceIndex: " << m_reverseAPIDeviceIndex; } + if (settingsKeys.contains("addressList") || force) { + ostr << " m_addressList: " << m_addressList.join(",").toStdString(); + } for (int i = 0; i < m_maxGains; i++) { diff --git a/plugins/samplesource/remotetcpinput/remotetcpinputsettings.h b/plugins/samplesource/remotetcpinput/remotetcpinputsettings.h index 2f0bd3c3d..45f41e45f 100644 --- a/plugins/samplesource/remotetcpinput/remotetcpinputsettings.h +++ b/plugins/samplesource/remotetcpinput/remotetcpinputsettings.h @@ -50,6 +50,7 @@ struct RemoteTCPInputSettings QString m_reverseAPIAddress; uint16_t m_reverseAPIPort; uint16_t m_reverseAPIDeviceIndex; + QStringList m_addressList; // List of dataAddresses that have been used in the past RemoteTCPInputSettings(); void resetToDefaults(); diff --git a/plugins/samplesource/remotetcpinput/remotetcpinputtcphandler.cpp b/plugins/samplesource/remotetcpinput/remotetcpinputtcphandler.cpp index 281d0d48d..fd6e5568e 100644 --- a/plugins/samplesource/remotetcpinput/remotetcpinputtcphandler.cpp +++ b/plugins/samplesource/remotetcpinput/remotetcpinputtcphandler.cpp @@ -495,11 +495,6 @@ void RemoteTCPInputTCPHandler::connected() { QMutexLocker mutexLocker(&m_mutex); qDebug() << "RemoteTCPInputTCPHandler::connected"; - if (m_settings.m_overrideRemoteSettings) - { - // Force settings to be sent to remote device - applySettings(m_settings, QList(), true); - } if (m_messageQueueToGUI) { MsgReportConnection *msg = MsgReportConnection::create(true); @@ -649,6 +644,11 @@ void RemoteTCPInputTCPHandler::dataReadyRead() { qDebug() << "RemoteTCPInputTCPHandler::dataReadyRead: Unknown protocol: " << protocol; } + if (m_settings.m_overrideRemoteSettings) + { + // Force settings to be sent to remote device (this needs to be after m_sdra is determined above) + applySettings(m_settings, QList(), true); + } } m_readMetaData = true; }