diff --git a/plugins/samplesource/soapysdrinput/soapysdrinput.cpp b/plugins/samplesource/soapysdrinput/soapysdrinput.cpp index c05451dc8..e78bf5fe7 100644 --- a/plugins/samplesource/soapysdrinput/soapysdrinput.cpp +++ b/plugins/samplesource/soapysdrinput/soapysdrinput.cpp @@ -876,6 +876,31 @@ bool SoapySDRInput::applySettings(const SoapySDRInputSettings& settings, bool fo } } + for (const auto &oname : m_settings.m_individualGains.keys()) + { + auto nvalue = settings.m_individualGains.find(oname); + + if (nvalue != settings.m_individualGains.end() && (m_settings.m_individualGains[oname] != *nvalue)) + { + if (dev != 0) + { + try + { + dev->setGain(SOAPY_SDR_RX, requestedChannel, oname.toStdString(), *nvalue); + qDebug("SoapySDRInput::applySettings: individual gain %s set to %lf", + oname.toStdString().c_str(), *nvalue); + } + catch (const std::exception &ex) + { + qCritical("SoapySDRInput::applySettings: cannot set individual gain %s to %lf: %s", + oname.toStdString().c_str(), *nvalue, ex.what()); + } + } + + m_settings.m_individualGains[oname] = *nvalue; + } + } + if (forwardChangeOwnDSP) { int sampleRate = settings.m_devSampleRate/(1<& individualGainsList) +{ + if (individualGainsList.size() == 0) { // Leave early if list of individual gains is empty + return; + } + + std::vector::const_iterator it = individualGainsList.begin(); + + for (int i = 0; it != individualGainsList.end(); ++it, i++) + { + IntervalSliderGUI *gainGUI = new IntervalSliderGUI(this); + gainGUI->setInterval(it->m_range.minimum(), it->m_range.maximum()); + gainGUI->setLabel(QString("%1 gain").arg(it->m_name.c_str())); + gainGUI->setUnits(QString("")); + DynamicItemSettingGUI *gui = new DynamicItemSettingGUI(gainGUI, QString(it->m_name.c_str())); + m_individualGainsGUIs.push_back(gui); + connect(m_individualGainsGUIs.back(), SIGNAL(valueChanged(QString, double)), this, SLOT(individualGainChanged(QString, double))); + } +} + void SoapySDRInputGui::setName(const QString& name) { setObjectName(name); @@ -334,6 +354,12 @@ void SoapySDRInputGui::globalGainChanged(double gain) sendSettings(); } +void SoapySDRInputGui::individualGainChanged(QString name, double value) +{ + m_settings.m_individualGains[name] = value; + sendSettings(); +} + void SoapySDRInputGui::on_centerFrequency_changed(quint64 value) { m_settings.m_centerFrequency = value * 1000; @@ -441,6 +467,7 @@ void SoapySDRInputGui::displaySettings() ui->LOppmText->setText(QString("%1").arg(QString::number(m_settings.m_LOppmTenths/10.0, 'f', 1))); displayTunableElementsControlSettings(); + displayIndividualGainsControlSettings(); blockApplySettings(false); } @@ -457,6 +484,18 @@ void SoapySDRInputGui::displayTunableElementsControlSettings() } } +void SoapySDRInputGui::displayIndividualGainsControlSettings() +{ + for (const auto &it : m_individualGainsGUIs) + { + QMap::const_iterator elIt = m_settings.m_individualGains.find(it->getName()); + + if (elIt != m_settings.m_individualGains.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 8678ef617..ec1903cb5 100644 --- a/plugins/samplesource/soapysdrinput/soapysdrinputgui.h +++ b/plugins/samplesource/soapysdrinput/soapysdrinputgui.h @@ -64,6 +64,7 @@ private: void createAntennasControl(const std::vector& antennaList); void createTunableElementsControl(const std::vector& tunableElementsList); void createGlobalGainControl(); + void createIndividualGainsControl(const std::vector& individualGainsList); Ui::SoapySDRInputGui* ui; @@ -84,9 +85,11 @@ private: ItemSettingGUI *m_bandwidthGUI; std::vector m_tunableElementsGUIs; IntervalSliderGUI *m_gainSliderGUI; + std::vector m_individualGainsGUIs; void displaySettings(); void displayTunableElementsControlSettings(); + void displayIndividualGainsControlSettings(); void sendSettings(); void updateSampleRateAndFrequency(); void updateFrequencyLimits(); @@ -100,6 +103,7 @@ private slots: void bandwidthChanged(double bandwidth); void tunableElementChanged(QString name, double value); void globalGainChanged(double gain); + void individualGainChanged(QString name, double value); void on_centerFrequency_changed(quint64 value); void on_LOppm_valueChanged(int value); void on_dcOffset_toggled(bool checked); diff --git a/plugins/samplesource/soapysdrinput/soapysdrinputsettings.cpp b/plugins/samplesource/soapysdrinput/soapysdrinputsettings.cpp index 2fc6d4232..e8252b2b9 100644 --- a/plugins/samplesource/soapysdrinput/soapysdrinputsettings.cpp +++ b/plugins/samplesource/soapysdrinput/soapysdrinputsettings.cpp @@ -58,6 +58,7 @@ QByteArray SoapySDRInputSettings::serialize() const s.writeU32(10, m_bandwidth); s.writeBlob(11, serializeNamedElementMap(m_tunableElements)); s.writeS32(12, m_globalGain); + s.writeBlob(13, serializeNamedElementMap(m_individualGains)); return s.final(); } @@ -91,6 +92,8 @@ bool SoapySDRInputSettings::deserialize(const QByteArray& data) d.readBlob(11, &blob); deserializeNamedElementMap(blob, m_tunableElements); d.readS32(12, &m_globalGain, 0); + d.readBlob(13, &blob); + deserializeNamedElementMap(blob, m_individualGains); return true; } diff --git a/plugins/samplesource/soapysdrinput/soapysdrinputsettings.h b/plugins/samplesource/soapysdrinput/soapysdrinputsettings.h index a01242f0c..7acdf6343 100644 --- a/plugins/samplesource/soapysdrinput/soapysdrinputsettings.h +++ b/plugins/samplesource/soapysdrinput/soapysdrinputsettings.h @@ -42,6 +42,7 @@ struct SoapySDRInputSettings { quint32 m_bandwidth; QMap m_tunableElements; qint32 m_globalGain; + QMap m_individualGains; SoapySDRInputSettings(); void resetToDefaults(); diff --git a/sdrgui/soapygui/intervalslidergui.cpp b/sdrgui/soapygui/intervalslidergui.cpp index 12e71f476..f3620004f 100644 --- a/sdrgui/soapygui/intervalslidergui.cpp +++ b/sdrgui/soapygui/intervalslidergui.cpp @@ -20,7 +20,7 @@ #include "intervalslidergui.h" IntervalSliderGUI::IntervalSliderGUI(QWidget* parent) : - QWidget(parent), + ItemSettingGUI(parent), ui(new Ui::IntervalSliderGUI), m_minimum(0), m_maximum(0) @@ -67,5 +67,5 @@ void IntervalSliderGUI::setValue(double value) void IntervalSliderGUI::on_intervalSlider_valueChanged(int value) { ui->valueText->setText(QString("%1").arg(value)); - emit valueChanged(value); + emit ItemSettingGUI::valueChanged(value); } diff --git a/sdrgui/soapygui/intervalslidergui.h b/sdrgui/soapygui/intervalslidergui.h index aff65f0c9..fa89a87aa 100644 --- a/sdrgui/soapygui/intervalslidergui.h +++ b/sdrgui/soapygui/intervalslidergui.h @@ -20,11 +20,13 @@ #include #include +#include "itemsettinggui.h" + namespace Ui { class IntervalSliderGUI; } -class IntervalSliderGUI : public QWidget +class IntervalSliderGUI : public ItemSettingGUI { Q_OBJECT public: @@ -37,9 +39,6 @@ public: virtual double getCurrentValue(); virtual void setValue(double value); -signals: - void valueChanged(double value); - private slots: void on_intervalSlider_valueChanged(int value);