mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-10-31 13:00:26 -04:00 
			
		
		
		
	SoapySDR support: input: individual gains GUIs
This commit is contained in:
		
							parent
							
								
									d4e73086d0
								
							
						
					
					
						commit
						cfeaca424e
					
				| @ -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<<settings.m_log2Decim); | ||||
|  | ||||
| @ -200,6 +200,26 @@ void SoapySDRInputGui::createGlobalGainControl() | ||||
|     connect(m_gainSliderGUI, SIGNAL(valueChanged(double)), this, SLOT(globalGainChanged(double))); | ||||
| } | ||||
| 
 | ||||
| void SoapySDRInputGui::createIndividualGainsControl(const std::vector<DeviceSoapySDRParams::GainSetting>& individualGainsList) | ||||
| { | ||||
|     if (individualGainsList.size() == 0) { // Leave early if list of individual gains is empty
 | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     std::vector<DeviceSoapySDRParams::GainSetting>::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<QString, double>::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()) { | ||||
|  | ||||
| @ -64,6 +64,7 @@ private: | ||||
|     void createAntennasControl(const std::vector<std::string>& antennaList); | ||||
|     void createTunableElementsControl(const std::vector<DeviceSoapySDRParams::FrequencySetting>& tunableElementsList); | ||||
|     void createGlobalGainControl(); | ||||
|     void createIndividualGainsControl(const std::vector<DeviceSoapySDRParams::GainSetting>& individualGainsList); | ||||
| 
 | ||||
|     Ui::SoapySDRInputGui* ui; | ||||
| 
 | ||||
| @ -84,9 +85,11 @@ private: | ||||
|     ItemSettingGUI *m_bandwidthGUI; | ||||
|     std::vector<DynamicItemSettingGUI*> m_tunableElementsGUIs; | ||||
|     IntervalSliderGUI *m_gainSliderGUI; | ||||
|     std::vector<DynamicItemSettingGUI*> 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); | ||||
|  | ||||
| @ -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; | ||||
|     } | ||||
|  | ||||
| @ -42,6 +42,7 @@ struct SoapySDRInputSettings { | ||||
|     quint32 m_bandwidth; | ||||
|     QMap<QString, double> m_tunableElements; | ||||
|     qint32 m_globalGain; | ||||
|     QMap<QString, double> m_individualGains; | ||||
| 
 | ||||
|     SoapySDRInputSettings(); | ||||
|     void resetToDefaults(); | ||||
|  | ||||
| @ -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); | ||||
| } | ||||
|  | ||||
| @ -20,11 +20,13 @@ | ||||
| #include <QWidget> | ||||
| #include <QString> | ||||
| 
 | ||||
| #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); | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user