From 52e9a720989426b82322f239fcdd03d307f81626 Mon Sep 17 00:00:00 2001 From: f4exb Date: Mon, 5 Nov 2018 02:40:02 +0100 Subject: [PATCH] SoapySDR support: output: bandwidth selection GUI --- .../soapysdroutput/soapysdroutput.cpp | 29 +++++++++++++++- .../soapysdroutput/soapysdroutput.h | 1 + .../soapysdroutput/soapysdroutputgui.cpp | 34 +++++++++++++------ .../soapysdroutput/soapysdroutputgui.h | 12 +++++-- .../soapysdroutput/soapysdroutputsettings.cpp | 3 ++ .../soapysdroutput/soapysdroutputsettings.h | 1 + .../soapysdrinput/soapysdrinputgui.ui | 4 +-- sdrgui/soapygui/intervalrangegui.cpp | 1 + 8 files changed, 69 insertions(+), 16 deletions(-) diff --git a/plugins/samplesink/soapysdroutput/soapysdroutput.cpp b/plugins/samplesink/soapysdroutput/soapysdroutput.cpp index 8272d92e9..7e4d4992f 100644 --- a/plugins/samplesink/soapysdroutput/soapysdroutput.cpp +++ b/plugins/samplesink/soapysdroutput/soapysdroutput.cpp @@ -195,6 +195,12 @@ const std::vector& 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<& getAntennas(); + const SoapySDR::RangeList& getBandwidthRanges(); private: DeviceSinkAPI *m_deviceAPI; diff --git a/plugins/samplesink/soapysdroutput/soapysdroutputgui.cpp b/plugins/samplesink/soapysdroutput/soapysdroutputgui.cpp index 7ec22a0e4..42bf83b1f 100644 --- a/plugins/samplesink/soapysdroutput/soapysdroutputgui.cpp +++ b/plugins/samplesink/soapysdroutput/soapysdroutputgui.cpp @@ -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; diff --git a/plugins/samplesink/soapysdroutput/soapysdroutputgui.h b/plugins/samplesink/soapysdroutput/soapysdroutputgui.h index 84b9250eb..f75108544 100644 --- a/plugins/samplesink/soapysdroutput/soapysdroutputgui.h +++ b/plugins/samplesink/soapysdroutput/soapysdroutputgui.h @@ -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& 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); diff --git a/plugins/samplesink/soapysdroutput/soapysdroutputsettings.cpp b/plugins/samplesink/soapysdroutput/soapysdroutputsettings.cpp index ec2e6c869..2efd42e74 100644 --- a/plugins/samplesink/soapysdroutput/soapysdroutputsettings.cpp +++ b/plugins/samplesink/soapysdroutput/soapysdroutputsettings.cpp @@ -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; } diff --git a/plugins/samplesink/soapysdroutput/soapysdroutputsettings.h b/plugins/samplesink/soapysdroutput/soapysdroutputsettings.h index a5a4b0181..9e368bc45 100644 --- a/plugins/samplesink/soapysdroutput/soapysdroutputsettings.h +++ b/plugins/samplesink/soapysdroutput/soapysdroutputsettings.h @@ -27,6 +27,7 @@ struct SoapySDROutputSettings { bool m_transverterMode; qint64 m_transverterDeltaFrequency; QString m_antenna; + quint32 m_bandwidth; SoapySDROutputSettings(); void resetToDefaults(); diff --git a/plugins/samplesource/soapysdrinput/soapysdrinputgui.ui b/plugins/samplesource/soapysdrinput/soapysdrinputgui.ui index 89d9fa789..be2341a59 100644 --- a/plugins/samplesource/soapysdrinput/soapysdrinputgui.ui +++ b/plugins/samplesource/soapysdrinput/soapysdrinputgui.ui @@ -375,7 +375,7 @@ - Qt::ScrollBarAlwaysOn + Qt::ScrollBarAsNeeded true @@ -385,7 +385,7 @@ 0 0 - 304 + 318 51 diff --git a/sdrgui/soapygui/intervalrangegui.cpp b/sdrgui/soapygui/intervalrangegui.cpp index 10a3df81e..346227e9b 100644 --- a/sdrgui/soapygui/intervalrangegui.cpp +++ b/sdrgui/soapygui/intervalrangegui.cpp @@ -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()); }