kopia lustrzana https://github.com/f4exb/sdrangel
				
				
				
			SoapySDR support: output: bandwidth selection GUI
							rodzic
							
								
									0d0b8c9618
								
							
						
					
					
						commit
						52e9a72098
					
				|  | @ -195,6 +195,12 @@ const std::vector<std::string>& SoapySDROutput::getAntennas() | |||
|     return channelSettings->m_antennas; | ||||
| } | ||||
| 
 | ||||
| const SoapySDR::RangeList& SoapySDROutput::getBandwidthRanges() | ||||
| { | ||||
|     const DeviceSoapySDRParams::ChannelSettings* channelSettings = m_deviceShared.m_deviceParams->getTxChannelSettings(m_deviceShared.m_channel); | ||||
|     return channelSettings->m_bandwidthsRanges; | ||||
| } | ||||
| 
 | ||||
| void SoapySDROutput::init() | ||||
| { | ||||
|     applySettings(m_settings, true); | ||||
|  | @ -596,6 +602,7 @@ bool SoapySDROutput::handleMessage(const Message& message) | |||
| 
 | ||||
|         settings.m_centerFrequency = round(centerFrequency/1000.0) * 1000; | ||||
|         settings.m_devSampleRate = round(m_deviceShared.m_device->getSampleRate(SOAPY_SDR_TX, requestedChannel)); | ||||
|         settings.m_bandwidth = round(m_deviceShared.m_device->getBandwidth(SOAPY_SDR_TX, requestedChannel)); | ||||
| 
 | ||||
|         //SoapySDROutputThread *outputThread = findThread();
 | ||||
| 
 | ||||
|  | @ -734,6 +741,25 @@ bool SoapySDROutput::applySettings(const SoapySDROutputSettings& settings, bool | |||
|         } | ||||
|     } | ||||
| 
 | ||||
|     if ((m_settings.m_bandwidth != settings.m_bandwidth) || force) | ||||
|     { | ||||
|         forwardChangeToBuddies = true; | ||||
| 
 | ||||
|         if (dev != 0) | ||||
|         { | ||||
|             try | ||||
|             { | ||||
|                 dev->setBandwidth(SOAPY_SDR_TX, requestedChannel, settings.m_bandwidth); | ||||
|                 qDebug("SoapySDROutput::applySettings: bandwidth set to %u", settings.m_bandwidth); | ||||
|             } | ||||
|             catch (const std::exception &ex) | ||||
|             { | ||||
|                 qCritical("SoapySDROutput::applySettings: cannot set bandwidth to %u: %s", | ||||
|                         settings.m_bandwidth, ex.what()); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     if (forwardChangeOwnDSP) | ||||
|     { | ||||
|         int sampleRate = settings.m_devSampleRate/(1<<settings.m_log2Interp); | ||||
|  | @ -778,7 +804,8 @@ bool SoapySDROutput::applySettings(const SoapySDROutputSettings& settings, bool | |||
|             << " m_centerFrequency: " << m_settings.m_centerFrequency << " Hz" | ||||
|             << " m_LOppmTenths: " << m_settings.m_LOppmTenths | ||||
|             << " m_log2Interp: " << m_settings.m_log2Interp | ||||
|             << " m_devSampleRate: " << m_settings.m_devSampleRate; | ||||
|             << " m_devSampleRate: " << m_settings.m_devSampleRate | ||||
|             << " m_bandwidth: " << m_settings.m_bandwidth; | ||||
| 
 | ||||
|     return true; | ||||
| } | ||||
|  |  | |||
|  | @ -102,6 +102,7 @@ public: | |||
|     void getFrequencyRange(uint64_t& min, uint64_t& max); | ||||
|     const SoapySDR::RangeList& getRateRanges(); | ||||
|     const std::vector<std::string>& getAntennas(); | ||||
|     const SoapySDR::RangeList& getBandwidthRanges(); | ||||
| 
 | ||||
| private: | ||||
|     DeviceSinkAPI *m_deviceAPI; | ||||
|  |  | |||
|  | @ -48,7 +48,15 @@ SoapySDROutputGui::SoapySDROutputGui(DeviceUISet *deviceUISet, QWidget* parent) | |||
|     ui->centerFrequency->setValueRange(7, f_min/1000, f_max/1000); | ||||
| 
 | ||||
|     createAntennasControl(m_sampleSink->getAntennas()); | ||||
|     createRangesControl(m_sampleSink->getRateRanges(), "SR", "kS/s"); | ||||
|     createRangesControl(&m_sampleRateGUI, m_sampleSink->getRateRanges(), "SR", "S/s"); | ||||
|     createRangesControl(&m_bandwidthGUI, m_sampleSink->getBandwidthRanges(), "BW", "Hz"); | ||||
| 
 | ||||
|     if (m_sampleRateGUI) { | ||||
|         connect(m_sampleRateGUI, SIGNAL(valueChanged(double)), this, SLOT(sampleRateChanged(double))); | ||||
|     } | ||||
|     if (m_bandwidthGUI) { | ||||
|         connect(m_bandwidthGUI, SIGNAL(valueChanged(double)), this, SLOT(bandwidthChanged(double))); | ||||
|     } | ||||
| 
 | ||||
|     connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(updateHardware())); | ||||
|     connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus())); | ||||
|  | @ -72,7 +80,11 @@ void SoapySDROutputGui::destroy() | |||
|     delete this; | ||||
| } | ||||
| 
 | ||||
| void SoapySDROutputGui::createRangesControl(const SoapySDR::RangeList& rangeList, const QString& text, const QString& unit) | ||||
| void SoapySDROutputGui::createRangesControl( | ||||
|         ItemSettingGUI **settingGUI, | ||||
|         const SoapySDR::RangeList& rangeList, | ||||
|         const QString& text, | ||||
|         const QString& unit) | ||||
| { | ||||
|     if (rangeList.size() == 0) { // return early if the range list is empty
 | ||||
|         return; | ||||
|  | @ -94,17 +106,15 @@ void SoapySDROutputGui::createRangesControl(const SoapySDR::RangeList& rangeList | |||
|     { | ||||
|         DiscreteRangeGUI *rangeGUI = new DiscreteRangeGUI(this); | ||||
|         rangeGUI->setLabel(text); | ||||
|         rangeGUI->setUnits(unit); | ||||
|         rangeGUI->setUnits(QString("k%1").arg(unit)); | ||||
| 
 | ||||
|         for (const auto &it : rangeList) { | ||||
|             rangeGUI->addItem(QString("%1").arg(QString::number(it.minimum()/1000.0, 'f', 0)), it.minimum()); | ||||
|         } | ||||
| 
 | ||||
|         m_sampleRateGUI = rangeGUI; | ||||
|         *settingGUI = rangeGUI; | ||||
|         QVBoxLayout *layout = (QVBoxLayout *) ui->scrollAreaWidgetContents->layout(); | ||||
|         layout->addWidget(rangeGUI); | ||||
| 
 | ||||
|         connect(m_sampleRateGUI, SIGNAL(valueChanged(double)), this, SLOT(sampleRateChanged(double))); | ||||
|     } | ||||
|     else if (rangeInterval) | ||||
|     { | ||||
|  | @ -118,11 +128,9 @@ void SoapySDROutputGui::createRangesControl(const SoapySDR::RangeList& rangeList | |||
| 
 | ||||
|         rangeGUI->reset(); | ||||
| 
 | ||||
|         m_sampleRateGUI = rangeGUI; | ||||
|         *settingGUI = rangeGUI; | ||||
|         QVBoxLayout *layout = (QVBoxLayout *) ui->scrollAreaWidgetContents->layout(); | ||||
|         layout->addWidget(rangeGUI); | ||||
| 
 | ||||
|         connect(m_sampleRateGUI, SIGNAL(valueChanged(double)), this, SLOT(sampleRateChanged(double))); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | @ -259,10 +267,16 @@ void SoapySDROutputGui::antennasChanged() | |||
| { | ||||
|     const std::string& antennaStr = m_antennas->getCurrentValue(); | ||||
|     m_settings.m_antenna = QString(antennaStr.c_str()); | ||||
| 
 | ||||
|     sendSettings(); | ||||
| } | ||||
| 
 | ||||
| void SoapySDROutputGui::bandwidthChanged(double bandwidth) | ||||
| { | ||||
|     m_settings.m_bandwidth = bandwidth; | ||||
|     sendSettings(); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| void SoapySDROutputGui::on_centerFrequency_changed(quint64 value) | ||||
| { | ||||
|     m_settings.m_centerFrequency = value * 1000; | ||||
|  |  | |||
|  | @ -55,7 +55,11 @@ public: | |||
|     virtual bool handleMessage(const Message& message); | ||||
| 
 | ||||
| private: | ||||
|     void createRangesControl(const SoapySDR::RangeList& rangeList, const QString& text, const QString& unit); | ||||
|     void createRangesControl( | ||||
|             ItemSettingGUI **settingGUI, | ||||
|             const SoapySDR::RangeList& rangeList, | ||||
|             const QString& text, | ||||
|             const QString& unit); | ||||
|     void createAntennasControl(const std::vector<std::string>& antennaList); | ||||
| 
 | ||||
|     Ui::SoapySDROutputGui* ui; | ||||
|  | @ -74,6 +78,7 @@ private: | |||
| 
 | ||||
|     ItemSettingGUI *m_sampleRateGUI; | ||||
|     StringRangeGUI *m_antennas; | ||||
|     ItemSettingGUI *m_bandwidthGUI; | ||||
| 
 | ||||
|     void blockApplySettings(bool block) { m_doApplySettings = !block; } | ||||
|     void displaySettings(); | ||||
|  | @ -84,10 +89,11 @@ private: | |||
| 
 | ||||
| private slots: | ||||
|     void handleInputMessages(); | ||||
|     void on_centerFrequency_changed(quint64 value); | ||||
|     void on_LOppm_valueChanged(int value); | ||||
|     void sampleRateChanged(double sampleRate); | ||||
|     void antennasChanged(); | ||||
|     void bandwidthChanged(double bandwidth); | ||||
|     void on_centerFrequency_changed(quint64 value); | ||||
|     void on_LOppm_valueChanged(int value); | ||||
|     void on_interp_currentIndexChanged(int index); | ||||
|     void on_transverter_clicked(); | ||||
|     void on_startStop_toggled(bool checked); | ||||
|  |  | |||
|  | @ -33,6 +33,7 @@ void SoapySDROutputSettings::resetToDefaults() | |||
|     m_transverterMode = false; | ||||
|     m_transverterDeltaFrequency = 0; | ||||
|     m_antenna = "NONE"; | ||||
|     m_bandwidth = 1000000; | ||||
| } | ||||
| 
 | ||||
| QByteArray SoapySDROutputSettings::serialize() const | ||||
|  | @ -45,6 +46,7 @@ QByteArray SoapySDROutputSettings::serialize() const | |||
|     s.writeBool(4, m_transverterMode); | ||||
|     s.writeS64(5, m_transverterDeltaFrequency); | ||||
|     s.writeString(6, m_antenna); | ||||
|     s.writeU32(7, m_bandwidth); | ||||
| 
 | ||||
|     return s.final(); | ||||
| } | ||||
|  | @ -67,6 +69,7 @@ bool SoapySDROutputSettings::deserialize(const QByteArray& data) | |||
|         d.readBool(4, &m_transverterMode, false); | ||||
|         d.readS64(5, &m_transverterDeltaFrequency, 0); | ||||
|         d.readString(6, &m_antenna, "NONE"); | ||||
|         d.readU32(7, &m_bandwidth, 1000000); | ||||
| 
 | ||||
|         return true; | ||||
|     } | ||||
|  |  | |||
|  | @ -27,6 +27,7 @@ struct SoapySDROutputSettings { | |||
|     bool m_transverterMode; | ||||
|     qint64 m_transverterDeltaFrequency; | ||||
|     QString m_antenna; | ||||
|     quint32 m_bandwidth; | ||||
| 
 | ||||
|     SoapySDROutputSettings(); | ||||
|     void resetToDefaults(); | ||||
|  |  | |||
|  | @ -375,7 +375,7 @@ | |||
|    <item> | ||||
|     <widget class="QScrollArea" name="scrollArea"> | ||||
|      <property name="verticalScrollBarPolicy"> | ||||
|       <enum>Qt::ScrollBarAlwaysOn</enum> | ||||
|       <enum>Qt::ScrollBarAsNeeded</enum> | ||||
|      </property> | ||||
|      <property name="widgetResizable"> | ||||
|       <bool>true</bool> | ||||
|  | @ -385,7 +385,7 @@ | |||
|        <rect> | ||||
|         <x>0</x> | ||||
|         <y>0</y> | ||||
|         <width>304</width> | ||||
|         <width>318</width> | ||||
|         <height>51</height> | ||||
|        </rect> | ||||
|       </property> | ||||
|  |  | |||
|  | @ -96,5 +96,6 @@ void IntervalRangeGUI::on_value_changed(quint64 value) | |||
| void IntervalRangeGUI::on_rangeInterval_currentIndexChanged(int index) | ||||
| { | ||||
|     ui->value->setValueRange(m_nbDigits, m_minima[index], m_maxima[index]); | ||||
|     emit ItemSettingGUI::valueChanged(ui->value->getValueNew()); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Ładowanie…
	
		Reference in New Issue
	
	 f4exb
						f4exb