From f97091e0f3523d79c9609adcd94aa30a36ce1727 Mon Sep 17 00:00:00 2001 From: f4exb Date: Thu, 8 Nov 2018 01:31:39 +0100 Subject: [PATCH] SoapySDR support: input: AGC GUI --- .../soapysdrinput/soapysdrinput.cpp | 22 +++++++++++++++ .../soapysdrinput/soapysdrinput.h | 1 + .../soapysdrinput/soapysdrinputgui.cpp | 28 ++++++++++++++++++- .../soapysdrinput/soapysdrinputgui.h | 4 ++- .../soapysdrinput/soapysdrinputgui.ui | 9 +----- .../soapysdrinput/soapysdrinputsettings.cpp | 3 ++ .../soapysdrinput/soapysdrinputsettings.h | 1 + 7 files changed, 58 insertions(+), 10 deletions(-) diff --git a/plugins/samplesource/soapysdrinput/soapysdrinput.cpp b/plugins/samplesource/soapysdrinput/soapysdrinput.cpp index b30553e14..556d72687 100644 --- a/plugins/samplesource/soapysdrinput/soapysdrinput.cpp +++ b/plugins/samplesource/soapysdrinput/soapysdrinput.cpp @@ -221,6 +221,12 @@ void SoapySDRInput::getGlobalGainRange(int& min, int& max) } } +bool SoapySDRInput::isAGCSupported() +{ + const DeviceSoapySDRParams::ChannelSettings* channelSettings = m_deviceShared.m_deviceParams->getRxChannelSettings(m_deviceShared.m_channel); + return channelSettings->m_hasAGC; +} + const std::vector& SoapySDRInput::getAntennas() { const DeviceSoapySDRParams::ChannelSettings* channelSettings = m_deviceShared.m_deviceParams->getRxChannelSettings(m_deviceShared.m_channel); @@ -933,6 +939,22 @@ bool SoapySDRInput::applySettings(const SoapySDRInputSettings& settings, bool fo } } + if ((m_settings.m_autoGain != settings.m_autoGain) || force) + { + if (dev != 0) + { + try + { + dev->setGainMode(SOAPY_SDR_RX, requestedChannel, settings.m_autoGain); + qDebug("SoapySDRInput::applySettings: %s AGC", settings.m_autoGain ? "set" : "unset"); + } + catch (const std::exception &ex) + { + qCritical("SoapySDRInput::applySettings: cannot %s AGC", settings.m_autoGain ? "set" : "unset"); + } + } + } + if (forwardChangeOwnDSP) { int sampleRate = settings.m_devSampleRate/(1<& getAntennas(); const SoapySDR::RangeList& getRateRanges(); const SoapySDR::RangeList& getBandwidthRanges(); diff --git a/plugins/samplesource/soapysdrinput/soapysdrinputgui.cpp b/plugins/samplesource/soapysdrinput/soapysdrinputgui.cpp index 5fd8ccb24..62ebd890f 100644 --- a/plugins/samplesource/soapysdrinput/soapysdrinputgui.cpp +++ b/plugins/samplesource/soapysdrinput/soapysdrinputgui.cpp @@ -15,6 +15,7 @@ /////////////////////////////////////////////////////////////////////////////////// #include +#include #include "dsp/dspengine.h" #include "dsp/dspcommands.h" @@ -44,7 +45,8 @@ SoapySDRInputGui::SoapySDRInputGui(DeviceUISet *deviceUISet, QWidget* parent) : m_antennas(0), m_sampleRateGUI(0), m_bandwidthGUI(0), - m_gainSliderGUI(0) + m_gainSliderGUI(0), + m_autoGain(0) { m_sampleSource = (SoapySDRInput*) m_deviceUISet->m_deviceSourceAPI->getSampleSource(); ui->setupUi(this); @@ -197,6 +199,21 @@ void SoapySDRInputGui::createGlobalGainControl() m_gainSliderGUI->setUnits(QString("")); QVBoxLayout *layout = (QVBoxLayout *) ui->scrollAreaWidgetContents->layout(); + + QFrame *line = new QFrame(this); + line->setFrameShape(QFrame::HLine); + line->setFrameShadow(QFrame::Sunken); + layout->addWidget(line); + + if (m_sampleSource->isAGCSupported()) + { + m_autoGain = new QCheckBox(this); + m_autoGain->setText(QString("AGC")); + layout->addWidget(m_autoGain); + + connect(m_autoGain, SIGNAL(toggled(bool)), this, SLOT(autoGainChanged(bool))); + } + layout->addWidget(m_gainSliderGUI); connect(m_gainSliderGUI, SIGNAL(valueChanged(double)), this, SLOT(globalGainChanged(double))); @@ -376,6 +393,12 @@ void SoapySDRInputGui::globalGainChanged(double gain) sendSettings(); } +void SoapySDRInputGui::autoGainChanged(bool set) +{ + m_settings.m_autoGain = set; + sendSettings(); +} + void SoapySDRInputGui::individualGainChanged(QString name, double value) { m_settings.m_individualGains[name] = value; @@ -478,6 +501,9 @@ void SoapySDRInputGui::displaySettings() if (m_gainSliderGUI) { m_gainSliderGUI->setValue(m_settings.m_globalGain); } + if (m_autoGain) { + m_autoGain->setChecked(m_settings.m_autoGain); + } ui->dcOffset->setChecked(m_settings.m_dcBlock); ui->iqImbalance->setChecked(m_settings.m_iqCorrection); diff --git a/plugins/samplesource/soapysdrinput/soapysdrinputgui.h b/plugins/samplesource/soapysdrinput/soapysdrinputgui.h index ec1903cb5..65fd3a916 100644 --- a/plugins/samplesource/soapysdrinput/soapysdrinputgui.h +++ b/plugins/samplesource/soapysdrinput/soapysdrinputgui.h @@ -19,7 +19,6 @@ #include #include -#include #include "plugin/plugininstancegui.h" #include "util/messagequeue.h" @@ -31,6 +30,7 @@ class ItemSettingGUI; class StringRangeGUI; class DynamicItemSettingGUI; class IntervalSliderGUI; +class QCheckBox; namespace Ui { class SoapySDRInputGui; @@ -86,6 +86,7 @@ private: std::vector m_tunableElementsGUIs; IntervalSliderGUI *m_gainSliderGUI; std::vector m_individualGainsGUIs; + QCheckBox *m_autoGain; void displaySettings(); void displayTunableElementsControlSettings(); @@ -103,6 +104,7 @@ private slots: void bandwidthChanged(double bandwidth); void tunableElementChanged(QString name, double value); void globalGainChanged(double gain); + void autoGainChanged(bool set); void individualGainChanged(QString name, double value); void on_centerFrequency_changed(quint64 value); void on_LOppm_valueChanged(int value); diff --git a/plugins/samplesource/soapysdrinput/soapysdrinputgui.ui b/plugins/samplesource/soapysdrinput/soapysdrinputgui.ui index be2341a59..0bb9c3aec 100644 --- a/plugins/samplesource/soapysdrinput/soapysdrinputgui.ui +++ b/plugins/samplesource/soapysdrinput/soapysdrinputgui.ui @@ -365,13 +365,6 @@ - - - - Qt::Horizontal - - - @@ -386,7 +379,7 @@ 0 0 318 - 51 + 53 diff --git a/plugins/samplesource/soapysdrinput/soapysdrinputsettings.cpp b/plugins/samplesource/soapysdrinput/soapysdrinputsettings.cpp index e8252b2b9..6614e596c 100644 --- a/plugins/samplesource/soapysdrinput/soapysdrinputsettings.cpp +++ b/plugins/samplesource/soapysdrinput/soapysdrinputsettings.cpp @@ -40,6 +40,7 @@ void SoapySDRInputSettings::resetToDefaults() m_antenna = "NONE"; m_bandwidth = 1000000; m_globalGain = 0; + m_autoGain = false; } QByteArray SoapySDRInputSettings::serialize() const @@ -59,6 +60,7 @@ QByteArray SoapySDRInputSettings::serialize() const s.writeBlob(11, serializeNamedElementMap(m_tunableElements)); s.writeS32(12, m_globalGain); s.writeBlob(13, serializeNamedElementMap(m_individualGains)); + s.writeBool(14, m_autoGain); return s.final(); } @@ -94,6 +96,7 @@ bool SoapySDRInputSettings::deserialize(const QByteArray& data) d.readS32(12, &m_globalGain, 0); d.readBlob(13, &blob); deserializeNamedElementMap(blob, m_individualGains); + d.readBool(14, &m_autoGain, false); return true; } diff --git a/plugins/samplesource/soapysdrinput/soapysdrinputsettings.h b/plugins/samplesource/soapysdrinput/soapysdrinputsettings.h index 7acdf6343..67623834c 100644 --- a/plugins/samplesource/soapysdrinput/soapysdrinputsettings.h +++ b/plugins/samplesource/soapysdrinput/soapysdrinputsettings.h @@ -43,6 +43,7 @@ struct SoapySDRInputSettings { QMap m_tunableElements; qint32 m_globalGain; QMap m_individualGains; + bool m_autoGain; SoapySDRInputSettings(); void resetToDefaults();