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) |     if (forwardChangeOwnDSP) | ||||||
|     { |     { | ||||||
|         int sampleRate = settings.m_devSampleRate/(1<<settings.m_log2Decim); |         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))); |     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) | void SoapySDRInputGui::setName(const QString& name) | ||||||
| { | { | ||||||
|     setObjectName(name); |     setObjectName(name); | ||||||
| @ -334,6 +354,12 @@ void SoapySDRInputGui::globalGainChanged(double gain) | |||||||
|     sendSettings(); |     sendSettings(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void SoapySDRInputGui::individualGainChanged(QString name, double value) | ||||||
|  | { | ||||||
|  |     m_settings.m_individualGains[name] = value; | ||||||
|  |     sendSettings(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void SoapySDRInputGui::on_centerFrequency_changed(quint64 value) | void SoapySDRInputGui::on_centerFrequency_changed(quint64 value) | ||||||
| { | { | ||||||
|     m_settings.m_centerFrequency = value * 1000; |     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))); |     ui->LOppmText->setText(QString("%1").arg(QString::number(m_settings.m_LOppmTenths/10.0, 'f', 1))); | ||||||
| 
 | 
 | ||||||
|     displayTunableElementsControlSettings(); |     displayTunableElementsControlSettings(); | ||||||
|  |     displayIndividualGainsControlSettings(); | ||||||
| 
 | 
 | ||||||
|     blockApplySettings(false); |     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() | void SoapySDRInputGui::sendSettings() | ||||||
| { | { | ||||||
|     if (!m_updateTimer.isActive()) { |     if (!m_updateTimer.isActive()) { | ||||||
|  | |||||||
| @ -64,6 +64,7 @@ private: | |||||||
|     void createAntennasControl(const std::vector<std::string>& antennaList); |     void createAntennasControl(const std::vector<std::string>& antennaList); | ||||||
|     void createTunableElementsControl(const std::vector<DeviceSoapySDRParams::FrequencySetting>& tunableElementsList); |     void createTunableElementsControl(const std::vector<DeviceSoapySDRParams::FrequencySetting>& tunableElementsList); | ||||||
|     void createGlobalGainControl(); |     void createGlobalGainControl(); | ||||||
|  |     void createIndividualGainsControl(const std::vector<DeviceSoapySDRParams::GainSetting>& individualGainsList); | ||||||
| 
 | 
 | ||||||
|     Ui::SoapySDRInputGui* ui; |     Ui::SoapySDRInputGui* ui; | ||||||
| 
 | 
 | ||||||
| @ -84,9 +85,11 @@ private: | |||||||
|     ItemSettingGUI *m_bandwidthGUI; |     ItemSettingGUI *m_bandwidthGUI; | ||||||
|     std::vector<DynamicItemSettingGUI*> m_tunableElementsGUIs; |     std::vector<DynamicItemSettingGUI*> m_tunableElementsGUIs; | ||||||
|     IntervalSliderGUI *m_gainSliderGUI; |     IntervalSliderGUI *m_gainSliderGUI; | ||||||
|  |     std::vector<DynamicItemSettingGUI*> m_individualGainsGUIs; | ||||||
| 
 | 
 | ||||||
|     void displaySettings(); |     void displaySettings(); | ||||||
|     void displayTunableElementsControlSettings(); |     void displayTunableElementsControlSettings(); | ||||||
|  |     void displayIndividualGainsControlSettings(); | ||||||
|     void sendSettings(); |     void sendSettings(); | ||||||
|     void updateSampleRateAndFrequency(); |     void updateSampleRateAndFrequency(); | ||||||
|     void updateFrequencyLimits(); |     void updateFrequencyLimits(); | ||||||
| @ -100,6 +103,7 @@ private slots: | |||||||
|     void bandwidthChanged(double bandwidth); |     void bandwidthChanged(double bandwidth); | ||||||
|     void tunableElementChanged(QString name, double value); |     void tunableElementChanged(QString name, double value); | ||||||
|     void globalGainChanged(double gain); |     void globalGainChanged(double gain); | ||||||
|  |     void individualGainChanged(QString name, double value); | ||||||
|     void on_centerFrequency_changed(quint64 value); |     void on_centerFrequency_changed(quint64 value); | ||||||
|     void on_LOppm_valueChanged(int value); |     void on_LOppm_valueChanged(int value); | ||||||
|     void on_dcOffset_toggled(bool checked); |     void on_dcOffset_toggled(bool checked); | ||||||
|  | |||||||
| @ -58,6 +58,7 @@ QByteArray SoapySDRInputSettings::serialize() const | |||||||
|     s.writeU32(10, m_bandwidth); |     s.writeU32(10, m_bandwidth); | ||||||
|     s.writeBlob(11, serializeNamedElementMap(m_tunableElements)); |     s.writeBlob(11, serializeNamedElementMap(m_tunableElements)); | ||||||
|     s.writeS32(12, m_globalGain); |     s.writeS32(12, m_globalGain); | ||||||
|  |     s.writeBlob(13, serializeNamedElementMap(m_individualGains)); | ||||||
| 
 | 
 | ||||||
|     return s.final(); |     return s.final(); | ||||||
| } | } | ||||||
| @ -91,6 +92,8 @@ bool SoapySDRInputSettings::deserialize(const QByteArray& data) | |||||||
|         d.readBlob(11, &blob); |         d.readBlob(11, &blob); | ||||||
|         deserializeNamedElementMap(blob, m_tunableElements); |         deserializeNamedElementMap(blob, m_tunableElements); | ||||||
|         d.readS32(12, &m_globalGain, 0); |         d.readS32(12, &m_globalGain, 0); | ||||||
|  |         d.readBlob(13, &blob); | ||||||
|  |         deserializeNamedElementMap(blob, m_individualGains); | ||||||
| 
 | 
 | ||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -42,6 +42,7 @@ struct SoapySDRInputSettings { | |||||||
|     quint32 m_bandwidth; |     quint32 m_bandwidth; | ||||||
|     QMap<QString, double> m_tunableElements; |     QMap<QString, double> m_tunableElements; | ||||||
|     qint32 m_globalGain; |     qint32 m_globalGain; | ||||||
|  |     QMap<QString, double> m_individualGains; | ||||||
| 
 | 
 | ||||||
|     SoapySDRInputSettings(); |     SoapySDRInputSettings(); | ||||||
|     void resetToDefaults(); |     void resetToDefaults(); | ||||||
|  | |||||||
| @ -20,7 +20,7 @@ | |||||||
| #include "intervalslidergui.h" | #include "intervalslidergui.h" | ||||||
| 
 | 
 | ||||||
| IntervalSliderGUI::IntervalSliderGUI(QWidget* parent) : | IntervalSliderGUI::IntervalSliderGUI(QWidget* parent) : | ||||||
|     QWidget(parent), |     ItemSettingGUI(parent), | ||||||
|     ui(new Ui::IntervalSliderGUI), |     ui(new Ui::IntervalSliderGUI), | ||||||
|     m_minimum(0), |     m_minimum(0), | ||||||
|     m_maximum(0) |     m_maximum(0) | ||||||
| @ -67,5 +67,5 @@ void IntervalSliderGUI::setValue(double value) | |||||||
| void IntervalSliderGUI::on_intervalSlider_valueChanged(int value) | void IntervalSliderGUI::on_intervalSlider_valueChanged(int value) | ||||||
| { | { | ||||||
|     ui->valueText->setText(QString("%1").arg(value)); |     ui->valueText->setText(QString("%1").arg(value)); | ||||||
|     emit valueChanged(value); |     emit ItemSettingGUI::valueChanged(value); | ||||||
| } | } | ||||||
|  | |||||||
| @ -20,11 +20,13 @@ | |||||||
| #include <QWidget> | #include <QWidget> | ||||||
| #include <QString> | #include <QString> | ||||||
| 
 | 
 | ||||||
|  | #include "itemsettinggui.h" | ||||||
|  | 
 | ||||||
| namespace Ui { | namespace Ui { | ||||||
|     class IntervalSliderGUI; |     class IntervalSliderGUI; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| class IntervalSliderGUI : public QWidget | class IntervalSliderGUI : public ItemSettingGUI | ||||||
| { | { | ||||||
|     Q_OBJECT |     Q_OBJECT | ||||||
| public: | public: | ||||||
| @ -37,9 +39,6 @@ public: | |||||||
|     virtual double getCurrentValue(); |     virtual double getCurrentValue(); | ||||||
|     virtual void setValue(double value); |     virtual void setValue(double value); | ||||||
| 
 | 
 | ||||||
| signals: |  | ||||||
|     void valueChanged(double value); |  | ||||||
| 
 |  | ||||||
| private slots: | private slots: | ||||||
|     void on_intervalSlider_valueChanged(int value); |     void on_intervalSlider_valueChanged(int value); | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user