diff --git a/plugins/samplesink/soapysdroutput/soapysdroutput.cpp b/plugins/samplesink/soapysdroutput/soapysdroutput.cpp index a54e3dc9a..e8eb759c8 100644 --- a/plugins/samplesink/soapysdroutput/soapysdroutput.cpp +++ b/plugins/samplesink/soapysdroutput/soapysdroutput.cpp @@ -201,6 +201,11 @@ void SoapySDROutput::getGlobalGainRange(int& min, int& max) } } +bool SoapySDROutput::isAGCSupported() +{ + const DeviceSoapySDRParams::ChannelSettings* channelSettings = m_deviceShared.m_deviceParams->getTxChannelSettings(m_deviceShared.m_channel); + return channelSettings->m_hasAGC; +} const SoapySDR::RangeList& SoapySDROutput::getRateRanges() { @@ -888,6 +893,22 @@ bool SoapySDROutput::applySettings(const SoapySDROutputSettings& settings, bool } } + if ((m_settings.m_autoGain != settings.m_autoGain) || force) + { + if (dev != 0) + { + try + { + dev->setGainMode(SOAPY_SDR_TX, requestedChannel, settings.m_autoGain); + qDebug("SoapySDROutput::applySettings: %s AGC", settings.m_autoGain ? "set" : "unset"); + } + catch (const std::exception &ex) + { + qCritical("SoapySDROutput::applySettings: cannot %s AGC", settings.m_autoGain ? "set" : "unset"); + } + } + } + if (forwardChangeOwnDSP) { int sampleRate = settings.m_devSampleRate/(1<& getAntennas(); const SoapySDR::RangeList& getBandwidthRanges(); diff --git a/plugins/samplesink/soapysdroutput/soapysdroutputgui.cpp b/plugins/samplesink/soapysdroutput/soapysdroutputgui.cpp index 1b9fc81d6..38b745e1d 100644 --- a/plugins/samplesink/soapysdroutput/soapysdroutputgui.cpp +++ b/plugins/samplesink/soapysdroutput/soapysdroutputgui.cpp @@ -15,6 +15,7 @@ /////////////////////////////////////////////////////////////////////////////////// #include +#include #include "dsp/dspengine.h" #include "dsp/dspcommands.h" @@ -43,7 +44,8 @@ SoapySDROutputGui::SoapySDROutputGui(DeviceUISet *deviceUISet, QWidget* parent) m_antennas(0), m_sampleRateGUI(0), m_bandwidthGUI(0), - m_gainSliderGUI(0) + m_gainSliderGUI(0), + m_autoGain(0) { m_sampleSink = (SoapySDROutput*) m_deviceUISet->m_deviceSinkAPI->getSampleSink(); ui->setupUi(this); @@ -196,6 +198,21 @@ void SoapySDROutputGui::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_sampleSink->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))); @@ -375,6 +392,12 @@ void SoapySDROutputGui::globalGainChanged(double gain) sendSettings(); } +void SoapySDROutputGui::autoGainChanged(bool set) +{ + m_settings.m_autoGain = set; + sendSettings(); +} + void SoapySDROutputGui::individualGainChanged(QString name, double value) { m_settings.m_individualGains[name] = value; @@ -439,6 +462,9 @@ void SoapySDROutputGui::displaySettings() if (m_gainSliderGUI) { m_gainSliderGUI->setValue(m_settings.m_globalGain); } + if (m_autoGain) { + m_autoGain->setChecked(m_settings.m_autoGain); + } ui->interp->setCurrentIndex(m_settings.m_log2Interp); diff --git a/plugins/samplesink/soapysdroutput/soapysdroutputgui.h b/plugins/samplesink/soapysdroutput/soapysdroutputgui.h index 9c9904ba4..c108fa837 100644 --- a/plugins/samplesink/soapysdroutput/soapysdroutputgui.h +++ b/plugins/samplesink/soapysdroutput/soapysdroutputgui.h @@ -32,6 +32,7 @@ class ItemSettingGUI; class StringRangeGUI; class DynamicItemSettingGUI; class IntervalSliderGUI; +class QCheckBox; namespace Ui { class SoapySDROutputGui; @@ -87,6 +88,7 @@ private: std::vector m_tunableElementsGUIs; IntervalSliderGUI *m_gainSliderGUI; std::vector m_individualGainsGUIs; + QCheckBox *m_autoGain; void blockApplySettings(bool block) { m_doApplySettings = !block; } void displaySettings(); @@ -104,6 +106,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/samplesink/soapysdroutput/soapysdroutputgui.ui b/plugins/samplesink/soapysdroutput/soapysdroutputgui.ui index 839ce9fc7..f173efefd 100644 --- a/plugins/samplesink/soapysdroutput/soapysdroutputgui.ui +++ b/plugins/samplesink/soapysdroutput/soapysdroutputgui.ui @@ -289,13 +289,6 @@ - - - - Qt::Horizontal - - - @@ -307,7 +300,7 @@ 0 0 318 - 51 + 53 diff --git a/plugins/samplesink/soapysdroutput/soapysdroutputsettings.cpp b/plugins/samplesink/soapysdroutput/soapysdroutputsettings.cpp index 78f73be43..2be673c1e 100644 --- a/plugins/samplesink/soapysdroutput/soapysdroutputsettings.cpp +++ b/plugins/samplesink/soapysdroutput/soapysdroutputsettings.cpp @@ -37,6 +37,7 @@ void SoapySDROutputSettings::resetToDefaults() m_antenna = "NONE"; m_bandwidth = 1000000; m_globalGain = 0; + m_autoGain = false; } QByteArray SoapySDROutputSettings::serialize() const @@ -53,6 +54,7 @@ QByteArray SoapySDROutputSettings::serialize() const s.writeBlob(8, serializeNamedElementMap(m_tunableElements)); s.writeS32(12, m_globalGain); s.writeBlob(13, serializeNamedElementMap(m_individualGains)); + s.writeBool(14, m_autoGain); return s.final(); } @@ -83,6 +85,7 @@ bool SoapySDROutputSettings::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; } @@ -108,4 +111,4 @@ void SoapySDROutputSettings::deserializeNamedElementMap(const QByteArray& data, QDataStream *stream = new QDataStream(data); (*stream) >> map; delete stream; -} \ No newline at end of file +} diff --git a/plugins/samplesink/soapysdroutput/soapysdroutputsettings.h b/plugins/samplesink/soapysdroutput/soapysdroutputsettings.h index 9ac49a6b6..e5ee04b83 100644 --- a/plugins/samplesink/soapysdroutput/soapysdroutputsettings.h +++ b/plugins/samplesink/soapysdroutput/soapysdroutputsettings.h @@ -32,6 +32,7 @@ struct SoapySDROutputSettings { QMap m_tunableElements; qint32 m_globalGain; QMap m_individualGains; + bool m_autoGain; SoapySDROutputSettings(); void resetToDefaults();