1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-09-04 14:17:50 -04:00

SoapySDR support: output: AGC GUI

This commit is contained in:
f4exb 2018-11-08 01:52:48 +01:00
parent f97091e0f3
commit ef672300d2
7 changed files with 58 additions and 10 deletions

View File

@ -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() 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) if (forwardChangeOwnDSP)
{ {
int sampleRate = settings.m_devSampleRate/(1<<settings.m_log2Interp); int sampleRate = settings.m_devSampleRate/(1<<settings.m_log2Interp);

View File

@ -127,6 +127,7 @@ public:
void getFrequencyRange(uint64_t& min, uint64_t& max); void getFrequencyRange(uint64_t& min, uint64_t& max);
void getGlobalGainRange(int& min, int& max); void getGlobalGainRange(int& min, int& max);
bool isAGCSupported();
const SoapySDR::RangeList& getRateRanges(); const SoapySDR::RangeList& getRateRanges();
const std::vector<std::string>& getAntennas(); const std::vector<std::string>& getAntennas();
const SoapySDR::RangeList& getBandwidthRanges(); const SoapySDR::RangeList& getBandwidthRanges();

View File

@ -15,6 +15,7 @@
/////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////
#include <QMessageBox> #include <QMessageBox>
#include <QCheckBox>
#include "dsp/dspengine.h" #include "dsp/dspengine.h"
#include "dsp/dspcommands.h" #include "dsp/dspcommands.h"
@ -43,7 +44,8 @@ SoapySDROutputGui::SoapySDROutputGui(DeviceUISet *deviceUISet, QWidget* parent)
m_antennas(0), m_antennas(0),
m_sampleRateGUI(0), m_sampleRateGUI(0),
m_bandwidthGUI(0), m_bandwidthGUI(0),
m_gainSliderGUI(0) m_gainSliderGUI(0),
m_autoGain(0)
{ {
m_sampleSink = (SoapySDROutput*) m_deviceUISet->m_deviceSinkAPI->getSampleSink(); m_sampleSink = (SoapySDROutput*) m_deviceUISet->m_deviceSinkAPI->getSampleSink();
ui->setupUi(this); ui->setupUi(this);
@ -196,6 +198,21 @@ void SoapySDROutputGui::createGlobalGainControl()
m_gainSliderGUI->setUnits(QString("")); m_gainSliderGUI->setUnits(QString(""));
QVBoxLayout *layout = (QVBoxLayout *) ui->scrollAreaWidgetContents->layout(); 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); layout->addWidget(m_gainSliderGUI);
connect(m_gainSliderGUI, SIGNAL(valueChanged(double)), this, SLOT(globalGainChanged(double))); connect(m_gainSliderGUI, SIGNAL(valueChanged(double)), this, SLOT(globalGainChanged(double)));
@ -375,6 +392,12 @@ void SoapySDROutputGui::globalGainChanged(double gain)
sendSettings(); sendSettings();
} }
void SoapySDROutputGui::autoGainChanged(bool set)
{
m_settings.m_autoGain = set;
sendSettings();
}
void SoapySDROutputGui::individualGainChanged(QString name, double value) void SoapySDROutputGui::individualGainChanged(QString name, double value)
{ {
m_settings.m_individualGains[name] = value; m_settings.m_individualGains[name] = value;
@ -439,6 +462,9 @@ void SoapySDROutputGui::displaySettings()
if (m_gainSliderGUI) { if (m_gainSliderGUI) {
m_gainSliderGUI->setValue(m_settings.m_globalGain); m_gainSliderGUI->setValue(m_settings.m_globalGain);
} }
if (m_autoGain) {
m_autoGain->setChecked(m_settings.m_autoGain);
}
ui->interp->setCurrentIndex(m_settings.m_log2Interp); ui->interp->setCurrentIndex(m_settings.m_log2Interp);

View File

@ -32,6 +32,7 @@ class ItemSettingGUI;
class StringRangeGUI; class StringRangeGUI;
class DynamicItemSettingGUI; class DynamicItemSettingGUI;
class IntervalSliderGUI; class IntervalSliderGUI;
class QCheckBox;
namespace Ui { namespace Ui {
class SoapySDROutputGui; class SoapySDROutputGui;
@ -87,6 +88,7 @@ private:
std::vector<DynamicItemSettingGUI*> m_tunableElementsGUIs; std::vector<DynamicItemSettingGUI*> m_tunableElementsGUIs;
IntervalSliderGUI *m_gainSliderGUI; IntervalSliderGUI *m_gainSliderGUI;
std::vector<DynamicItemSettingGUI*> m_individualGainsGUIs; std::vector<DynamicItemSettingGUI*> m_individualGainsGUIs;
QCheckBox *m_autoGain;
void blockApplySettings(bool block) { m_doApplySettings = !block; } void blockApplySettings(bool block) { m_doApplySettings = !block; }
void displaySettings(); void displaySettings();
@ -104,6 +106,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 autoGainChanged(bool set);
void individualGainChanged(QString name, double value); 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);

View File

@ -289,13 +289,6 @@
</item> </item>
</layout> </layout>
</item> </item>
<item>
<widget class="Line" name="line_freq">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item> <item>
<widget class="QScrollArea" name="scrollArea"> <widget class="QScrollArea" name="scrollArea">
<property name="widgetResizable"> <property name="widgetResizable">
@ -307,7 +300,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>318</width> <width>318</width>
<height>51</height> <height>53</height>
</rect> </rect>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_3"> <layout class="QVBoxLayout" name="verticalLayout_3">

View File

@ -37,6 +37,7 @@ void SoapySDROutputSettings::resetToDefaults()
m_antenna = "NONE"; m_antenna = "NONE";
m_bandwidth = 1000000; m_bandwidth = 1000000;
m_globalGain = 0; m_globalGain = 0;
m_autoGain = false;
} }
QByteArray SoapySDROutputSettings::serialize() const QByteArray SoapySDROutputSettings::serialize() const
@ -53,6 +54,7 @@ QByteArray SoapySDROutputSettings::serialize() const
s.writeBlob(8, serializeNamedElementMap(m_tunableElements)); s.writeBlob(8, serializeNamedElementMap(m_tunableElements));
s.writeS32(12, m_globalGain); s.writeS32(12, m_globalGain);
s.writeBlob(13, serializeNamedElementMap(m_individualGains)); s.writeBlob(13, serializeNamedElementMap(m_individualGains));
s.writeBool(14, m_autoGain);
return s.final(); return s.final();
} }
@ -83,6 +85,7 @@ bool SoapySDROutputSettings::deserialize(const QByteArray& data)
d.readS32(12, &m_globalGain, 0); d.readS32(12, &m_globalGain, 0);
d.readBlob(13, &blob); d.readBlob(13, &blob);
deserializeNamedElementMap(blob, m_individualGains); deserializeNamedElementMap(blob, m_individualGains);
d.readBool(14, &m_autoGain, false);
return true; return true;
} }
@ -108,4 +111,4 @@ void SoapySDROutputSettings::deserializeNamedElementMap(const QByteArray& data,
QDataStream *stream = new QDataStream(data); QDataStream *stream = new QDataStream(data);
(*stream) >> map; (*stream) >> map;
delete stream; delete stream;
} }

View File

@ -32,6 +32,7 @@ struct SoapySDROutputSettings {
QMap<QString, double> m_tunableElements; QMap<QString, double> m_tunableElements;
qint32 m_globalGain; qint32 m_globalGain;
QMap<QString, double> m_individualGains; QMap<QString, double> m_individualGains;
bool m_autoGain;
SoapySDROutputSettings(); SoapySDROutputSettings();
void resetToDefaults(); void resetToDefaults();