diff --git a/plugins/samplesink/soapysdroutput/soapysdroutput.cpp b/plugins/samplesink/soapysdroutput/soapysdroutput.cpp index 894c7795f..9050ef98b 100644 --- a/plugins/samplesink/soapysdroutput/soapysdroutput.cpp +++ b/plugins/samplesink/soapysdroutput/soapysdroutput.cpp @@ -831,6 +831,31 @@ bool SoapySDROutput::applySettings(const SoapySDROutputSettings& settings, bool } } + 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_TX, requestedChannel, oname.toStdString(), *nvalue); + qDebug("SoapySDROutput::applySettings: individual gain %s set to %lf", + oname.toStdString().c_str(), *nvalue); + } + catch (const std::exception &ex) + { + qCritical("SoapySDROutput::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 SoapySDROutputGui::setName(const QString& name) { setObjectName(name); @@ -333,6 +353,12 @@ void SoapySDROutputGui::globalGainChanged(double gain) sendSettings(); } +void SoapySDROutputGui::individualGainChanged(QString name, double value) +{ + m_settings.m_individualGains[name] = value; + sendSettings(); +} + void SoapySDROutputGui::on_centerFrequency_changed(quint64 value) { m_settings.m_centerFrequency = value * 1000; @@ -398,6 +424,7 @@ void SoapySDROutputGui::displaySettings() ui->LOppmText->setText(QString("%1").arg(QString::number(m_settings.m_LOppmTenths/10.0, 'f', 1))); displayTunableElementsControlSettings(); + displayIndividualGainsControlSettings(); blockApplySettings(false); } @@ -414,6 +441,18 @@ void SoapySDROutputGui::displayTunableElementsControlSettings() } } +void SoapySDROutputGui::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 SoapySDROutputGui::sendSettings() { if (!m_updateTimer.isActive()) { diff --git a/plugins/samplesink/soapysdroutput/soapysdroutputgui.h b/plugins/samplesink/soapysdroutput/soapysdroutputgui.h index e6174d3f8..9c9904ba4 100644 --- a/plugins/samplesink/soapysdroutput/soapysdroutputgui.h +++ b/plugins/samplesink/soapysdroutput/soapysdroutputgui.h @@ -65,6 +65,7 @@ private: void createAntennasControl(const std::vector& antennaList); void createTunableElementsControl(const std::vector& tunableElementsList); void createGlobalGainControl(); + void createIndividualGainsControl(const std::vector& individualGainsList); Ui::SoapySDROutputGui* ui; @@ -85,10 +86,12 @@ private: ItemSettingGUI *m_bandwidthGUI; std::vector m_tunableElementsGUIs; IntervalSliderGUI *m_gainSliderGUI; + std::vector m_individualGainsGUIs; void blockApplySettings(bool block) { m_doApplySettings = !block; } void displaySettings(); void displayTunableElementsControlSettings(); + void displayIndividualGainsControlSettings(); void sendSettings(); void updateSampleRateAndFrequency(); void updateFrequencyLimits(); @@ -101,6 +104,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_interp_currentIndexChanged(int index); diff --git a/plugins/samplesink/soapysdroutput/soapysdroutputsettings.cpp b/plugins/samplesink/soapysdroutput/soapysdroutputsettings.cpp index 771513ef5..78f73be43 100644 --- a/plugins/samplesink/soapysdroutput/soapysdroutputsettings.cpp +++ b/plugins/samplesink/soapysdroutput/soapysdroutputsettings.cpp @@ -52,6 +52,7 @@ QByteArray SoapySDROutputSettings::serialize() const s.writeU32(7, m_bandwidth); s.writeBlob(8, serializeNamedElementMap(m_tunableElements)); s.writeS32(12, m_globalGain); + s.writeBlob(13, serializeNamedElementMap(m_individualGains)); return s.final(); } @@ -80,6 +81,8 @@ bool SoapySDROutputSettings::deserialize(const QByteArray& data) d.readBlob(8, &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/samplesink/soapysdroutput/soapysdroutputsettings.h b/plugins/samplesink/soapysdroutput/soapysdroutputsettings.h index 9a565e8f4..9ac49a6b6 100644 --- a/plugins/samplesink/soapysdroutput/soapysdroutputsettings.h +++ b/plugins/samplesink/soapysdroutput/soapysdroutputsettings.h @@ -31,6 +31,7 @@ struct SoapySDROutputSettings { quint32 m_bandwidth; QMap m_tunableElements; qint32 m_globalGain; + QMap m_individualGains; SoapySDROutputSettings(); void resetToDefaults();