From 6ea676d5c4fa3c7a7c13ddbaa119b9cdf77354f4 Mon Sep 17 00:00:00 2001 From: f4exb Date: Tue, 6 Nov 2018 08:32:47 +0100 Subject: [PATCH] SoapySDR support: tunable elements GUIs fixes --- .../soapysdroutput/soapysdroutputgui.cpp | 16 +++++++-- .../soapysdroutput/soapysdroutputgui.h | 2 +- .../soapysdrinput/soapysdrinput.cpp | 25 +++++++++++++ .../soapysdrinput/soapysdrinputgui.cpp | 36 ++++++++++++++++--- .../soapysdrinput/soapysdrinputgui.h | 1 + sdrgui/soapygui/dynamicitemsettinggui.h | 3 +- sdrgui/soapygui/intervalrangegui.cpp | 6 ++-- sdrgui/soapygui/intervalrangegui.h | 2 +- sdrgui/soapygui/intervalrangegui.ui | 14 ++++---- 9 files changed, 86 insertions(+), 19 deletions(-) diff --git a/plugins/samplesink/soapysdroutput/soapysdroutputgui.cpp b/plugins/samplesink/soapysdroutput/soapysdroutputgui.cpp index 42bf83b1f..f57816906 100644 --- a/plugins/samplesink/soapysdroutput/soapysdroutputgui.cpp +++ b/plugins/samplesink/soapysdroutput/soapysdroutputgui.cpp @@ -37,7 +37,10 @@ SoapySDROutputGui::SoapySDROutputGui(DeviceUISet *deviceUISet, QWidget* parent) m_doApplySettings(true), m_sampleSink(0), m_sampleRate(0), - m_lastEngineState(DSPDeviceSinkEngine::StNotStarted) + m_lastEngineState(DSPDeviceSinkEngine::StNotStarted), + m_antennas(0), + m_sampleRateGUI(0), + m_bandwidthGUI(0) { m_sampleSink = (SoapySDROutput*) m_deviceUISet->m_deviceSinkAPI->getSampleSink(); ui->setupUi(this); @@ -322,7 +325,16 @@ void SoapySDROutputGui::displaySettings() blockApplySettings(true); ui->centerFrequency->setValue(m_settings.m_centerFrequency / 1000); - m_sampleRateGUI->setValue(m_settings.m_devSampleRate); + + if (m_antennas) { + m_antennas->setValue(m_settings.m_antenna.toStdString()); + } + if (m_sampleRateGUI) { + m_sampleRateGUI->setValue(m_settings.m_devSampleRate); + } + if (m_bandwidthGUI) { + m_bandwidthGUI->setValue(m_settings.m_bandwidth); + } ui->interp->setCurrentIndex(m_settings.m_log2Interp); diff --git a/plugins/samplesink/soapysdroutput/soapysdroutputgui.h b/plugins/samplesink/soapysdroutput/soapysdroutputgui.h index f75108544..fe460e29e 100644 --- a/plugins/samplesink/soapysdroutput/soapysdroutputgui.h +++ b/plugins/samplesink/soapysdroutput/soapysdroutputgui.h @@ -76,8 +76,8 @@ private: int m_lastEngineState; MessageQueue m_inputMessageQueue; - ItemSettingGUI *m_sampleRateGUI; StringRangeGUI *m_antennas; + ItemSettingGUI *m_sampleRateGUI; ItemSettingGUI *m_bandwidthGUI; void blockApplySettings(bool block) { m_doApplySettings = !block; } diff --git a/plugins/samplesource/soapysdrinput/soapysdrinput.cpp b/plugins/samplesource/soapysdrinput/soapysdrinput.cpp index 5d505c8b8..f03411a76 100644 --- a/plugins/samplesource/soapysdrinput/soapysdrinput.cpp +++ b/plugins/samplesource/soapysdrinput/soapysdrinput.cpp @@ -812,6 +812,31 @@ bool SoapySDRInput::applySettings(const SoapySDRInputSettings& settings, bool fo } } + for (const auto &oname : m_settings.m_tunableElements.keys()) + { + auto nvalue = settings.m_tunableElements.find(oname); + + if (nvalue != settings.m_tunableElements.end() && (m_settings.m_tunableElements[oname] != *nvalue)) + { + if (dev != 0) + { + try + { + dev->setFrequency(SOAPY_SDR_RX, requestedChannel, oname.toStdString(), *nvalue); + qDebug("SoapySDRInput::applySettings: tunable element %s frequency set to %lf", + oname.toStdString().c_str(), *nvalue); + } + catch (const std::exception &ex) + { + qCritical("SoapySDRInput::applySettings: cannot set tunable element %s to %lf: %s", + oname.toStdString().c_str(), *nvalue, ex.what()); + } + } + + m_settings.m_tunableElements[oname] = *nvalue; + } + } + if (forwardChangeOwnDSP) { int sampleRate = settings.m_devSampleRate/(1<m_ranges, QString("%1 freq").arg(it->m_name.c_str()), QString("Hz")); + createRangesControl( + &rangeGUI, + it->m_ranges, + QString("%1 freq").arg(it->m_name.c_str()), + QString((it->m_name == "CORR") ? "ppm" : "Hz")); DynamicItemSettingGUI *gui = new DynamicItemSettingGUI(rangeGUI, QString(it->m_name.c_str())); m_tunableElementsGUIs.push_back(gui); connect(m_tunableElementsGUIs.back(), SIGNAL(valueChanged(QString, double)), this, SLOT(tunableElementChanged(QString, double))); @@ -302,6 +307,8 @@ void SoapySDRInputGui::bandwidthChanged(double bandwidth) void SoapySDRInputGui::tunableElementChanged(QString name, double value) { qDebug("SoapySDRInputGui::tunableElementChanged: name: %s value: %lf", name.toStdString().c_str(), value); + m_settings.m_tunableElements[name] = value; + sendSettings(); } void SoapySDRInputGui::on_centerFrequency_changed(quint64 value) @@ -387,9 +394,16 @@ void SoapySDRInputGui::displaySettings() blockApplySettings(true); ui->centerFrequency->setValue(m_settings.m_centerFrequency / 1000); - m_antennas->setValue(m_settings.m_antenna.toStdString()); - m_sampleRateGUI->setValue(m_settings.m_devSampleRate); - m_bandwidthGUI->setValue(m_settings.m_bandwidth); + + if (m_antennas) { + m_antennas->setValue(m_settings.m_antenna.toStdString()); + } + if (m_sampleRateGUI) { + m_sampleRateGUI->setValue(m_settings.m_devSampleRate); + } + if (m_bandwidthGUI) { + m_bandwidthGUI->setValue(m_settings.m_bandwidth); + } ui->dcOffset->setChecked(m_settings.m_dcBlock); ui->iqImbalance->setChecked(m_settings.m_iqCorrection); @@ -400,9 +414,23 @@ void SoapySDRInputGui::displaySettings() ui->LOppm->setValue(m_settings.m_LOppmTenths); ui->LOppmText->setText(QString("%1").arg(QString::number(m_settings.m_LOppmTenths/10.0, 'f', 1))); + displayTunableElementsControlSettings(); + blockApplySettings(false); } +void SoapySDRInputGui::displayTunableElementsControlSettings() +{ + for (const auto &it : m_tunableElementsGUIs) + { + QMap::const_iterator elIt = m_settings.m_tunableElements.find(it->getName()); + + if (elIt != m_settings.m_tunableElements.end()) { + it->setValue(*elIt); + } + } +} + void SoapySDRInputGui::sendSettings() { if (!m_updateTimer.isActive()) { diff --git a/plugins/samplesource/soapysdrinput/soapysdrinputgui.h b/plugins/samplesource/soapysdrinput/soapysdrinputgui.h index deaee34a5..b965b7517 100644 --- a/plugins/samplesource/soapysdrinput/soapysdrinputgui.h +++ b/plugins/samplesource/soapysdrinput/soapysdrinputgui.h @@ -83,6 +83,7 @@ private: std::vector m_tunableElementsGUIs; void displaySettings(); + void displayTunableElementsControlSettings(); void sendSettings(); void updateSampleRateAndFrequency(); void updateFrequencyLimits(); diff --git a/sdrgui/soapygui/dynamicitemsettinggui.h b/sdrgui/soapygui/dynamicitemsettinggui.h index 2a197ba44..f90a97cac 100644 --- a/sdrgui/soapygui/dynamicitemsettinggui.h +++ b/sdrgui/soapygui/dynamicitemsettinggui.h @@ -28,6 +28,7 @@ public: const QString& getName() const { return m_name; } double getValue() const { return m_itemSettingGUI->getCurrentValue(); } + void setValue(double value) { m_itemSettingGUI->setValue(value); } signals: void valueChanged(QString itemName, double value); @@ -38,4 +39,4 @@ private slots: private: ItemSettingGUI *m_itemSettingGUI; QString m_name; -}; \ No newline at end of file +}; diff --git a/sdrgui/soapygui/intervalrangegui.cpp b/sdrgui/soapygui/intervalrangegui.cpp index 346227e9b..ca1db22f2 100644 --- a/sdrgui/soapygui/intervalrangegui.cpp +++ b/sdrgui/soapygui/intervalrangegui.cpp @@ -70,7 +70,7 @@ void IntervalRangeGUI::reset() ui->rangeInterval->blockSignals(true); ui->rangeInterval->setCurrentIndex(0); ui->rangeInterval->blockSignals(false); - ui->value->setValueRange(m_nbDigits, m_minima[0], m_maxima[0]); + ui->value->setValueRange(m_minima[0] >= 0, m_nbDigits, m_minima[0], m_maxima[0]); } if (m_minima.size() == 1) { @@ -88,14 +88,14 @@ void IntervalRangeGUI::setValue(double value) ui->value->setValue(value); } -void IntervalRangeGUI::on_value_changed(quint64 value) +void IntervalRangeGUI::on_value_changed(qint64 value) { emit ItemSettingGUI::valueChanged(value); } void IntervalRangeGUI::on_rangeInterval_currentIndexChanged(int index) { - ui->value->setValueRange(m_nbDigits, m_minima[index], m_maxima[index]); + ui->value->setValueRange(m_minima[index] >= 0, m_nbDigits, m_minima[index], m_maxima[index]); emit ItemSettingGUI::valueChanged(ui->value->getValueNew()); } diff --git a/sdrgui/soapygui/intervalrangegui.h b/sdrgui/soapygui/intervalrangegui.h index 999452124..1e3b00986 100644 --- a/sdrgui/soapygui/intervalrangegui.h +++ b/sdrgui/soapygui/intervalrangegui.h @@ -42,7 +42,7 @@ public: virtual void setValue(double value); private slots: - void on_value_changed(quint64 value); + void on_value_changed(qint64 value); void on_rangeInterval_currentIndexChanged(int index); private: diff --git a/sdrgui/soapygui/intervalrangegui.ui b/sdrgui/soapygui/intervalrangegui.ui index 7bf944db1..290dd577a 100644 --- a/sdrgui/soapygui/intervalrangegui.ui +++ b/sdrgui/soapygui/intervalrangegui.ui @@ -6,8 +6,8 @@ 0 0 - 263 - 30 + 295 + 33 @@ -30,7 +30,7 @@ 0 0 - 262 + 292 29 @@ -43,7 +43,7 @@ - + 0 @@ -52,7 +52,7 @@ - 120 + 150 16 @@ -92,9 +92,9 @@ - ValueDial + ValueDialZ QWidget -
gui/valuedial.h
+
gui/valuedialz.h
1