mirror of https://github.com/f4exb/sdrangel.git
SoapySDR support: input: bandwidth selection GUI
This commit is contained in:
parent
bf3fdcbfc2
commit
0d0b8c9618
|
@ -717,6 +717,23 @@ bool SoapySDROutput::applySettings(const SoapySDROutputSettings& settings, bool
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((m_settings.m_antenna != settings.m_antenna) || force)
|
||||||
|
{
|
||||||
|
if (dev != 0)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
dev->setAntenna(SOAPY_SDR_TX, requestedChannel, settings.m_antenna.toStdString());
|
||||||
|
qDebug("SoapySDROutput::applySettings: set antenna to %s", settings.m_antenna.toStdString().c_str());
|
||||||
|
}
|
||||||
|
catch (const std::exception &ex)
|
||||||
|
{
|
||||||
|
qCritical("SoapySDROutput::applySettings: cannot set antenna to %s: %s",
|
||||||
|
settings.m_antenna.toStdString().c_str(), ex.what());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (forwardChangeOwnDSP)
|
if (forwardChangeOwnDSP)
|
||||||
{
|
{
|
||||||
int sampleRate = settings.m_devSampleRate/(1<<settings.m_log2Interp);
|
int sampleRate = settings.m_devSampleRate/(1<<settings.m_log2Interp);
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#include "gui/glspectrum.h"
|
#include "gui/glspectrum.h"
|
||||||
#include "soapygui/discreterangegui.h"
|
#include "soapygui/discreterangegui.h"
|
||||||
#include "soapygui/intervalrangegui.h"
|
#include "soapygui/intervalrangegui.h"
|
||||||
|
#include "soapygui/stringrangegui.h"
|
||||||
|
|
||||||
#include "soapysdroutputgui.h"
|
#include "soapysdroutputgui.h"
|
||||||
|
|
||||||
|
@ -46,6 +47,7 @@ SoapySDROutputGui::SoapySDROutputGui(DeviceUISet *deviceUISet, QWidget* parent)
|
||||||
m_sampleSink->getFrequencyRange(f_min, f_max);
|
m_sampleSink->getFrequencyRange(f_min, f_max);
|
||||||
ui->centerFrequency->setValueRange(7, f_min/1000, f_max/1000);
|
ui->centerFrequency->setValueRange(7, f_min/1000, f_max/1000);
|
||||||
|
|
||||||
|
createAntennasControl(m_sampleSink->getAntennas());
|
||||||
createRangesControl(m_sampleSink->getRateRanges(), "SR", "kS/s");
|
createRangesControl(m_sampleSink->getRateRanges(), "SR", "kS/s");
|
||||||
|
|
||||||
connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(updateHardware()));
|
connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(updateHardware()));
|
||||||
|
@ -90,7 +92,7 @@ void SoapySDROutputGui::createRangesControl(const SoapySDR::RangeList& rangeList
|
||||||
|
|
||||||
if (rangeDiscrete)
|
if (rangeDiscrete)
|
||||||
{
|
{
|
||||||
DiscreteRangeGUI *rangeGUI = new DiscreteRangeGUI(ui->scrollAreaWidgetContents);
|
DiscreteRangeGUI *rangeGUI = new DiscreteRangeGUI(this);
|
||||||
rangeGUI->setLabel(text);
|
rangeGUI->setLabel(text);
|
||||||
rangeGUI->setUnits(unit);
|
rangeGUI->setUnits(unit);
|
||||||
|
|
||||||
|
@ -99,11 +101,14 @@ void SoapySDROutputGui::createRangesControl(const SoapySDR::RangeList& rangeList
|
||||||
}
|
}
|
||||||
|
|
||||||
m_sampleRateGUI = rangeGUI;
|
m_sampleRateGUI = rangeGUI;
|
||||||
|
QVBoxLayout *layout = (QVBoxLayout *) ui->scrollAreaWidgetContents->layout();
|
||||||
|
layout->addWidget(rangeGUI);
|
||||||
|
|
||||||
connect(m_sampleRateGUI, SIGNAL(valueChanged(double)), this, SLOT(sampleRateChanged(double)));
|
connect(m_sampleRateGUI, SIGNAL(valueChanged(double)), this, SLOT(sampleRateChanged(double)));
|
||||||
}
|
}
|
||||||
else if (rangeInterval)
|
else if (rangeInterval)
|
||||||
{
|
{
|
||||||
IntervalRangeGUI *rangeGUI = new IntervalRangeGUI(ui->scrollAreaWidgetContents);
|
IntervalRangeGUI *rangeGUI = new IntervalRangeGUI(this);
|
||||||
rangeGUI->setLabel(text);
|
rangeGUI->setLabel(text);
|
||||||
rangeGUI->setUnits(unit);
|
rangeGUI->setUnits(unit);
|
||||||
|
|
||||||
|
@ -114,10 +119,33 @@ void SoapySDROutputGui::createRangesControl(const SoapySDR::RangeList& rangeList
|
||||||
rangeGUI->reset();
|
rangeGUI->reset();
|
||||||
|
|
||||||
m_sampleRateGUI = rangeGUI;
|
m_sampleRateGUI = rangeGUI;
|
||||||
|
QVBoxLayout *layout = (QVBoxLayout *) ui->scrollAreaWidgetContents->layout();
|
||||||
|
layout->addWidget(rangeGUI);
|
||||||
|
|
||||||
connect(m_sampleRateGUI, SIGNAL(valueChanged(double)), this, SLOT(sampleRateChanged(double)));
|
connect(m_sampleRateGUI, SIGNAL(valueChanged(double)), this, SLOT(sampleRateChanged(double)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SoapySDROutputGui::createAntennasControl(const std::vector<std::string>& antennaList)
|
||||||
|
{
|
||||||
|
if (antennaList.size() == 0) { // return early if the antenna list is empty
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_antennas = new StringRangeGUI(this);
|
||||||
|
m_antennas->setLabel(QString("Antenna"));
|
||||||
|
m_antennas->setUnits(QString("Port"));
|
||||||
|
|
||||||
|
for (const auto &it : antennaList) {
|
||||||
|
m_antennas->addItem(QString(it.c_str()), it);
|
||||||
|
}
|
||||||
|
|
||||||
|
QVBoxLayout *layout = (QVBoxLayout *) ui->scrollAreaWidgetContents->layout();
|
||||||
|
layout->addWidget(m_antennas);
|
||||||
|
|
||||||
|
connect(m_antennas, SIGNAL(valueChanged()), this, SLOT(antennasChanged()));
|
||||||
|
}
|
||||||
|
|
||||||
void SoapySDROutputGui::setName(const QString& name)
|
void SoapySDROutputGui::setName(const QString& name)
|
||||||
{
|
{
|
||||||
setObjectName(name);
|
setObjectName(name);
|
||||||
|
@ -227,6 +255,14 @@ void SoapySDROutputGui::sampleRateChanged(double sampleRate)
|
||||||
sendSettings();
|
sendSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SoapySDROutputGui::antennasChanged()
|
||||||
|
{
|
||||||
|
const std::string& antennaStr = m_antennas->getCurrentValue();
|
||||||
|
m_settings.m_antenna = QString(antennaStr.c_str());
|
||||||
|
|
||||||
|
sendSettings();
|
||||||
|
}
|
||||||
|
|
||||||
void SoapySDROutputGui::on_centerFrequency_changed(quint64 value)
|
void SoapySDROutputGui::on_centerFrequency_changed(quint64 value)
|
||||||
{
|
{
|
||||||
m_settings.m_centerFrequency = value * 1000;
|
m_settings.m_centerFrequency = value * 1000;
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
class DeviceSampleSink;
|
class DeviceSampleSink;
|
||||||
class DeviceUISet;
|
class DeviceUISet;
|
||||||
class ItemSettingGUI;
|
class ItemSettingGUI;
|
||||||
|
class StringRangeGUI;
|
||||||
|
|
||||||
namespace Ui {
|
namespace Ui {
|
||||||
class SoapySDROutputGui;
|
class SoapySDROutputGui;
|
||||||
|
@ -55,6 +56,8 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void createRangesControl(const SoapySDR::RangeList& rangeList, const QString& text, const QString& unit);
|
void createRangesControl(const SoapySDR::RangeList& rangeList, const QString& text, const QString& unit);
|
||||||
|
void createAntennasControl(const std::vector<std::string>& antennaList);
|
||||||
|
|
||||||
Ui::SoapySDROutputGui* ui;
|
Ui::SoapySDROutputGui* ui;
|
||||||
|
|
||||||
DeviceUISet* m_deviceUISet;
|
DeviceUISet* m_deviceUISet;
|
||||||
|
@ -70,6 +73,7 @@ private:
|
||||||
MessageQueue m_inputMessageQueue;
|
MessageQueue m_inputMessageQueue;
|
||||||
|
|
||||||
ItemSettingGUI *m_sampleRateGUI;
|
ItemSettingGUI *m_sampleRateGUI;
|
||||||
|
StringRangeGUI *m_antennas;
|
||||||
|
|
||||||
void blockApplySettings(bool block) { m_doApplySettings = !block; }
|
void blockApplySettings(bool block) { m_doApplySettings = !block; }
|
||||||
void displaySettings();
|
void displaySettings();
|
||||||
|
@ -83,6 +87,7 @@ private slots:
|
||||||
void on_centerFrequency_changed(quint64 value);
|
void on_centerFrequency_changed(quint64 value);
|
||||||
void on_LOppm_valueChanged(int value);
|
void on_LOppm_valueChanged(int value);
|
||||||
void sampleRateChanged(double sampleRate);
|
void sampleRateChanged(double sampleRate);
|
||||||
|
void antennasChanged();
|
||||||
void on_interp_currentIndexChanged(int index);
|
void on_interp_currentIndexChanged(int index);
|
||||||
void on_transverter_clicked();
|
void on_transverter_clicked();
|
||||||
void on_startStop_toggled(bool checked);
|
void on_startStop_toggled(bool checked);
|
||||||
|
|
|
@ -32,6 +32,7 @@ void SoapySDROutputSettings::resetToDefaults()
|
||||||
m_log2Interp = 0;
|
m_log2Interp = 0;
|
||||||
m_transverterMode = false;
|
m_transverterMode = false;
|
||||||
m_transverterDeltaFrequency = 0;
|
m_transverterDeltaFrequency = 0;
|
||||||
|
m_antenna = "NONE";
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray SoapySDROutputSettings::serialize() const
|
QByteArray SoapySDROutputSettings::serialize() const
|
||||||
|
@ -43,6 +44,7 @@ QByteArray SoapySDROutputSettings::serialize() const
|
||||||
s.writeU32(3, m_log2Interp);
|
s.writeU32(3, m_log2Interp);
|
||||||
s.writeBool(4, m_transverterMode);
|
s.writeBool(4, m_transverterMode);
|
||||||
s.writeS64(5, m_transverterDeltaFrequency);
|
s.writeS64(5, m_transverterDeltaFrequency);
|
||||||
|
s.writeString(6, m_antenna);
|
||||||
|
|
||||||
return s.final();
|
return s.final();
|
||||||
}
|
}
|
||||||
|
@ -64,6 +66,7 @@ bool SoapySDROutputSettings::deserialize(const QByteArray& data)
|
||||||
d.readU32(3, &m_log2Interp);
|
d.readU32(3, &m_log2Interp);
|
||||||
d.readBool(4, &m_transverterMode, false);
|
d.readBool(4, &m_transverterMode, false);
|
||||||
d.readS64(5, &m_transverterDeltaFrequency, 0);
|
d.readS64(5, &m_transverterDeltaFrequency, 0);
|
||||||
|
d.readString(6, &m_antenna, "NONE");
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,8 +24,9 @@ struct SoapySDROutputSettings {
|
||||||
int m_LOppmTenths;
|
int m_LOppmTenths;
|
||||||
qint32 m_devSampleRate;
|
qint32 m_devSampleRate;
|
||||||
quint32 m_log2Interp;
|
quint32 m_log2Interp;
|
||||||
bool m_transverterMode;
|
bool m_transverterMode;
|
||||||
qint64 m_transverterDeltaFrequency;
|
qint64 m_transverterDeltaFrequency;
|
||||||
|
QString m_antenna;
|
||||||
|
|
||||||
SoapySDROutputSettings();
|
SoapySDROutputSettings();
|
||||||
void resetToDefaults();
|
void resetToDefaults();
|
||||||
|
|
|
@ -203,16 +203,22 @@ void SoapySDRInput::getFrequencyRange(uint64_t& min, uint64_t& max)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const std::vector<std::string>& SoapySDRInput::getAntennas()
|
||||||
|
{
|
||||||
|
const DeviceSoapySDRParams::ChannelSettings* channelSettings = m_deviceShared.m_deviceParams->getRxChannelSettings(m_deviceShared.m_channel);
|
||||||
|
return channelSettings->m_antennas;
|
||||||
|
}
|
||||||
|
|
||||||
const SoapySDR::RangeList& SoapySDRInput::getRateRanges()
|
const SoapySDR::RangeList& SoapySDRInput::getRateRanges()
|
||||||
{
|
{
|
||||||
const DeviceSoapySDRParams::ChannelSettings* channelSettings = m_deviceShared.m_deviceParams->getRxChannelSettings(m_deviceShared.m_channel);
|
const DeviceSoapySDRParams::ChannelSettings* channelSettings = m_deviceShared.m_deviceParams->getRxChannelSettings(m_deviceShared.m_channel);
|
||||||
return channelSettings->m_ratesRanges;
|
return channelSettings->m_ratesRanges;
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::vector<std::string>& SoapySDRInput::getAntennas()
|
const SoapySDR::RangeList& SoapySDRInput::getBandwidthRanges()
|
||||||
{
|
{
|
||||||
const DeviceSoapySDRParams::ChannelSettings* channelSettings = m_deviceShared.m_deviceParams->getRxChannelSettings(m_deviceShared.m_channel);
|
const DeviceSoapySDRParams::ChannelSettings* channelSettings = m_deviceShared.m_deviceParams->getRxChannelSettings(m_deviceShared.m_channel);
|
||||||
return channelSettings->m_antennas;
|
return channelSettings->m_bandwidthsRanges;
|
||||||
}
|
}
|
||||||
|
|
||||||
int SoapySDRInput::getAntennaIndex(const std::string& antenna)
|
int SoapySDRInput::getAntennaIndex(const std::string& antenna)
|
||||||
|
@ -645,6 +651,7 @@ bool SoapySDRInput::handleMessage(const Message& message __attribute__((unused))
|
||||||
|
|
||||||
settings.m_centerFrequency = round(centerFrequency/1000.0) * 1000;
|
settings.m_centerFrequency = round(centerFrequency/1000.0) * 1000;
|
||||||
settings.m_devSampleRate = round(m_deviceShared.m_device->getSampleRate(SOAPY_SDR_RX, requestedChannel));
|
settings.m_devSampleRate = round(m_deviceShared.m_device->getSampleRate(SOAPY_SDR_RX, requestedChannel));
|
||||||
|
settings.m_bandwidth = round(m_deviceShared.m_device->getBandwidth(SOAPY_SDR_RX, requestedChannel));
|
||||||
|
|
||||||
SoapySDRInputThread *inputThread = findThread();
|
SoapySDRInputThread *inputThread = findThread();
|
||||||
|
|
||||||
|
@ -780,6 +787,25 @@ bool SoapySDRInput::applySettings(const SoapySDRInputSettings& settings, bool fo
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((m_settings.m_bandwidth != settings.m_bandwidth) || force)
|
||||||
|
{
|
||||||
|
forwardChangeToBuddies = true;
|
||||||
|
|
||||||
|
if (dev != 0)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
dev->setBandwidth(SOAPY_SDR_RX, requestedChannel, settings.m_bandwidth);
|
||||||
|
qDebug("SoapySDRInput::applySettings: bandwidth set to %u", settings.m_bandwidth);
|
||||||
|
}
|
||||||
|
catch (const std::exception &ex)
|
||||||
|
{
|
||||||
|
qCritical("SoapySDRInput::applySettings: cannot set bandwidth to %u: %s",
|
||||||
|
settings.m_bandwidth, ex.what());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (forwardChangeOwnDSP)
|
if (forwardChangeOwnDSP)
|
||||||
{
|
{
|
||||||
int sampleRate = settings.m_devSampleRate/(1<<settings.m_log2Decim);
|
int sampleRate = settings.m_devSampleRate/(1<<settings.m_log2Decim);
|
||||||
|
@ -829,7 +855,8 @@ bool SoapySDRInput::applySettings(const SoapySDRInputSettings& settings, bool fo
|
||||||
<< " m_devSampleRate: " << m_settings.m_devSampleRate
|
<< " m_devSampleRate: " << m_settings.m_devSampleRate
|
||||||
<< " m_dcBlock: " << m_settings.m_dcBlock
|
<< " m_dcBlock: " << m_settings.m_dcBlock
|
||||||
<< " m_iqCorrection: " << m_settings.m_iqCorrection
|
<< " m_iqCorrection: " << m_settings.m_iqCorrection
|
||||||
<< " m_antenna: " << m_settings.m_antenna;
|
<< " m_antenna: " << m_settings.m_antenna
|
||||||
|
<< " m_bandwidth: " << m_settings.m_bandwidth;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -121,8 +121,9 @@ public:
|
||||||
virtual bool handleMessage(const Message& message);
|
virtual bool handleMessage(const Message& message);
|
||||||
|
|
||||||
void getFrequencyRange(uint64_t& min, uint64_t& max);
|
void getFrequencyRange(uint64_t& min, uint64_t& max);
|
||||||
const SoapySDR::RangeList& getRateRanges();
|
|
||||||
const std::vector<std::string>& getAntennas();
|
const std::vector<std::string>& getAntennas();
|
||||||
|
const SoapySDR::RangeList& getRateRanges();
|
||||||
|
const SoapySDR::RangeList& getBandwidthRanges();
|
||||||
int getAntennaIndex(const std::string& antenna);
|
int getAntennaIndex(const std::string& antenna);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -38,7 +38,8 @@ SoapySDRInputGui::SoapySDRInputGui(DeviceUISet *deviceUISet, QWidget* parent) :
|
||||||
m_sampleRate(0),
|
m_sampleRate(0),
|
||||||
m_deviceCenterFrequency(0),
|
m_deviceCenterFrequency(0),
|
||||||
m_lastEngineState(DSPDeviceSourceEngine::StNotStarted),
|
m_lastEngineState(DSPDeviceSourceEngine::StNotStarted),
|
||||||
m_sampleRateGUI(0)
|
m_sampleRateGUI(0),
|
||||||
|
m_bandwidthGUI(0)
|
||||||
{
|
{
|
||||||
m_sampleSource = (SoapySDRInput*) m_deviceUISet->m_deviceSourceAPI->getSampleSource();
|
m_sampleSource = (SoapySDRInput*) m_deviceUISet->m_deviceSourceAPI->getSampleSource();
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
@ -48,8 +49,16 @@ SoapySDRInputGui::SoapySDRInputGui(DeviceUISet *deviceUISet, QWidget* parent) :
|
||||||
m_sampleSource->getFrequencyRange(f_min, f_max);
|
m_sampleSource->getFrequencyRange(f_min, f_max);
|
||||||
ui->centerFrequency->setValueRange(7, f_min/1000, f_max/1000);
|
ui->centerFrequency->setValueRange(7, f_min/1000, f_max/1000);
|
||||||
|
|
||||||
createRangesControl(m_sampleSource->getRateRanges(), "SR", "kS/s");
|
|
||||||
createAntennasControl(m_sampleSource->getAntennas());
|
createAntennasControl(m_sampleSource->getAntennas());
|
||||||
|
createRangesControl(&m_sampleRateGUI, m_sampleSource->getRateRanges(), "SR", "S/s");
|
||||||
|
createRangesControl(&m_bandwidthGUI, m_sampleSource->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_updateTimer, SIGNAL(timeout()), this, SLOT(updateHardware()));
|
||||||
connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus()));
|
connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus()));
|
||||||
|
@ -73,7 +82,11 @@ void SoapySDRInputGui::destroy()
|
||||||
delete this;
|
delete this;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SoapySDRInputGui::createRangesControl(const SoapySDR::RangeList& rangeList, const QString& text, const QString& unit)
|
void SoapySDRInputGui::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
|
if (rangeList.size() == 0) { // return early if the range list is empty
|
||||||
return;
|
return;
|
||||||
|
@ -95,41 +108,15 @@ void SoapySDRInputGui::createRangesControl(const SoapySDR::RangeList& rangeList,
|
||||||
{
|
{
|
||||||
DiscreteRangeGUI *rangeGUI = new DiscreteRangeGUI(this);
|
DiscreteRangeGUI *rangeGUI = new DiscreteRangeGUI(this);
|
||||||
rangeGUI->setLabel(text);
|
rangeGUI->setLabel(text);
|
||||||
rangeGUI->setUnits(unit);
|
rangeGUI->setUnits(QString("k%1").arg(unit));
|
||||||
|
|
||||||
for (const auto &it : rangeList) {
|
for (const auto &it : rangeList) {
|
||||||
rangeGUI->addItem(QString("%1").arg(QString::number(it.minimum()/1000.0, 'f', 0)), it.minimum());
|
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();
|
QVBoxLayout *layout = (QVBoxLayout *) ui->scrollAreaWidgetContents->layout();
|
||||||
layout->addWidget(rangeGUI);
|
layout->addWidget(rangeGUI);
|
||||||
|
|
||||||
connect(m_sampleRateGUI, SIGNAL(valueChanged(double)), this, SLOT(sampleRateChanged(double)));
|
|
||||||
// QHBoxLayout *layout = new QHBoxLayout();
|
|
||||||
// QLabel *rangeLabel = new QLabel();
|
|
||||||
// rangeLabel->setText(text);
|
|
||||||
// QLabel *rangeUnit = new QLabel();
|
|
||||||
// rangeUnit->setText(unit);
|
|
||||||
// QComboBox *rangeCombo = new QComboBox();
|
|
||||||
//
|
|
||||||
// for (const auto &it : rangeList) {
|
|
||||||
// rangeCombo->addItem(QString("%1").arg(QString::number(it.minimum()/1000.0, 'f', 0)));
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// layout->addWidget(rangeLabel);
|
|
||||||
// layout->addWidget(rangeCombo);
|
|
||||||
// layout->addWidget(rangeUnit);
|
|
||||||
// layout->setMargin(0);
|
|
||||||
// layout->setSpacing(6);
|
|
||||||
// rangeLabel->show();
|
|
||||||
// rangeCombo->show();
|
|
||||||
// QWidget *window = new QWidget(ui->scrollAreaWidgetContents);
|
|
||||||
// window->setFixedWidth(300);
|
|
||||||
// window->setFixedHeight(30);
|
|
||||||
// window->setContentsMargins(0,0,0,0);
|
|
||||||
// //window->setStyleSheet("background-color:black;");
|
|
||||||
// window->setLayout(layout);
|
|
||||||
}
|
}
|
||||||
else if (rangeInterval)
|
else if (rangeInterval)
|
||||||
{
|
{
|
||||||
|
@ -143,16 +130,18 @@ void SoapySDRInputGui::createRangesControl(const SoapySDR::RangeList& rangeList,
|
||||||
|
|
||||||
rangeGUI->reset();
|
rangeGUI->reset();
|
||||||
|
|
||||||
m_sampleRateGUI = rangeGUI;
|
*settingGUI = rangeGUI;
|
||||||
QVBoxLayout *layout = (QVBoxLayout *) ui->scrollAreaWidgetContents->layout();
|
QVBoxLayout *layout = (QVBoxLayout *) ui->scrollAreaWidgetContents->layout();
|
||||||
layout->addWidget(rangeGUI);
|
layout->addWidget(rangeGUI);
|
||||||
|
|
||||||
connect(m_sampleRateGUI, SIGNAL(valueChanged(double)), this, SLOT(sampleRateChanged(double)));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SoapySDRInputGui::createAntennasControl(const std::vector<std::string>& antennaList)
|
void SoapySDRInputGui::createAntennasControl(const std::vector<std::string>& antennaList)
|
||||||
{
|
{
|
||||||
|
if (antennaList.size() == 0) { // return early if the antenna list is empty
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
m_antennas = new StringRangeGUI(this);
|
m_antennas = new StringRangeGUI(this);
|
||||||
m_antennas->setLabel(QString("Antenna"));
|
m_antennas->setLabel(QString("Antenna"));
|
||||||
m_antennas->setUnits(QString("Port"));
|
m_antennas->setUnits(QString("Port"));
|
||||||
|
@ -269,17 +258,23 @@ void SoapySDRInputGui::handleInputMessages()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SoapySDRInputGui::antennasChanged()
|
||||||
|
{
|
||||||
|
const std::string& antennaStr = m_antennas->getCurrentValue();
|
||||||
|
m_settings.m_antenna = QString(antennaStr.c_str());
|
||||||
|
|
||||||
|
sendSettings();
|
||||||
|
}
|
||||||
|
|
||||||
void SoapySDRInputGui::sampleRateChanged(double sampleRate)
|
void SoapySDRInputGui::sampleRateChanged(double sampleRate)
|
||||||
{
|
{
|
||||||
m_settings.m_devSampleRate = sampleRate;
|
m_settings.m_devSampleRate = sampleRate;
|
||||||
sendSettings();
|
sendSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SoapySDRInputGui::antennasChanged()
|
void SoapySDRInputGui::bandwidthChanged(double bandwidth)
|
||||||
{
|
{
|
||||||
const std::string& antennaStr = m_antennas->getCurrentValue();
|
m_settings.m_bandwidth = bandwidth;
|
||||||
m_settings.m_antenna = QString(antennaStr.c_str());
|
|
||||||
|
|
||||||
sendSettings();
|
sendSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -366,7 +361,9 @@ void SoapySDRInputGui::displaySettings()
|
||||||
blockApplySettings(true);
|
blockApplySettings(true);
|
||||||
|
|
||||||
ui->centerFrequency->setValue(m_settings.m_centerFrequency / 1000);
|
ui->centerFrequency->setValue(m_settings.m_centerFrequency / 1000);
|
||||||
|
m_antennas->setValue(m_settings.m_antenna.toStdString());
|
||||||
m_sampleRateGUI->setValue(m_settings.m_devSampleRate);
|
m_sampleRateGUI->setValue(m_settings.m_devSampleRate);
|
||||||
|
m_bandwidthGUI->setValue(m_settings.m_bandwidth);
|
||||||
|
|
||||||
ui->dcOffset->setChecked(m_settings.m_dcBlock);
|
ui->dcOffset->setChecked(m_settings.m_dcBlock);
|
||||||
ui->iqImbalance->setChecked(m_settings.m_iqCorrection);
|
ui->iqImbalance->setChecked(m_settings.m_iqCorrection);
|
||||||
|
@ -377,8 +374,6 @@ void SoapySDRInputGui::displaySettings()
|
||||||
ui->LOppm->setValue(m_settings.m_LOppmTenths);
|
ui->LOppm->setValue(m_settings.m_LOppmTenths);
|
||||||
ui->LOppmText->setText(QString("%1").arg(QString::number(m_settings.m_LOppmTenths/10.0, 'f', 1)));
|
ui->LOppmText->setText(QString("%1").arg(QString::number(m_settings.m_LOppmTenths/10.0, 'f', 1)));
|
||||||
|
|
||||||
m_antennas->setValue(m_settings.m_antenna.toStdString());
|
|
||||||
|
|
||||||
blockApplySettings(false);
|
blockApplySettings(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
|
|
||||||
class DeviceUISet;
|
class DeviceUISet;
|
||||||
class ItemSettingGUI;
|
class ItemSettingGUI;
|
||||||
|
class StringRangeGUI;
|
||||||
|
|
||||||
namespace Ui {
|
namespace Ui {
|
||||||
class SoapySDRInputGui;
|
class SoapySDRInputGui;
|
||||||
|
@ -53,7 +54,11 @@ public:
|
||||||
virtual bool handleMessage(const Message& message);
|
virtual bool handleMessage(const Message& message);
|
||||||
|
|
||||||
private:
|
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);
|
void createAntennasControl(const std::vector<std::string>& antennaList);
|
||||||
|
|
||||||
Ui::SoapySDRInputGui* ui;
|
Ui::SoapySDRInputGui* ui;
|
||||||
|
@ -70,8 +75,9 @@ private:
|
||||||
int m_lastEngineState;
|
int m_lastEngineState;
|
||||||
MessageQueue m_inputMessageQueue;
|
MessageQueue m_inputMessageQueue;
|
||||||
|
|
||||||
ItemSettingGUI *m_sampleRateGUI;
|
|
||||||
StringRangeGUI *m_antennas;
|
StringRangeGUI *m_antennas;
|
||||||
|
ItemSettingGUI *m_sampleRateGUI;
|
||||||
|
ItemSettingGUI *m_bandwidthGUI;
|
||||||
|
|
||||||
void displaySettings();
|
void displaySettings();
|
||||||
void sendSettings();
|
void sendSettings();
|
||||||
|
@ -82,10 +88,11 @@ private:
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void handleInputMessages();
|
void handleInputMessages();
|
||||||
void on_centerFrequency_changed(quint64 value);
|
|
||||||
void on_LOppm_valueChanged(int value);
|
|
||||||
void sampleRateChanged(double sampleRate);
|
void sampleRateChanged(double sampleRate);
|
||||||
void antennasChanged();
|
void antennasChanged();
|
||||||
|
void bandwidthChanged(double bandwidth);
|
||||||
|
void on_centerFrequency_changed(quint64 value);
|
||||||
|
void on_LOppm_valueChanged(int value);
|
||||||
void on_dcOffset_toggled(bool checked);
|
void on_dcOffset_toggled(bool checked);
|
||||||
void on_iqImbalance_toggled(bool checked);
|
void on_iqImbalance_toggled(bool checked);
|
||||||
void on_decim_currentIndexChanged(int index);
|
void on_decim_currentIndexChanged(int index);
|
||||||
|
|
|
@ -374,6 +374,9 @@
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QScrollArea" name="scrollArea">
|
<widget class="QScrollArea" name="scrollArea">
|
||||||
|
<property name="verticalScrollBarPolicy">
|
||||||
|
<enum>Qt::ScrollBarAlwaysOn</enum>
|
||||||
|
</property>
|
||||||
<property name="widgetResizable">
|
<property name="widgetResizable">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
|
@ -382,7 +385,7 @@
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>318</width>
|
<width>304</width>
|
||||||
<height>51</height>
|
<height>51</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
|
|
|
@ -36,6 +36,7 @@ void SoapySDRInputSettings::resetToDefaults()
|
||||||
m_transverterDeltaFrequency = 0;
|
m_transverterDeltaFrequency = 0;
|
||||||
m_fileRecordName = "";
|
m_fileRecordName = "";
|
||||||
m_antenna = "NONE";
|
m_antenna = "NONE";
|
||||||
|
m_bandwidth = 1000000;
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray SoapySDRInputSettings::serialize() const
|
QByteArray SoapySDRInputSettings::serialize() const
|
||||||
|
@ -51,6 +52,7 @@ QByteArray SoapySDRInputSettings::serialize() const
|
||||||
s.writeBool(7, m_transverterMode);
|
s.writeBool(7, m_transverterMode);
|
||||||
s.writeS64(8, m_transverterDeltaFrequency);
|
s.writeS64(8, m_transverterDeltaFrequency);
|
||||||
s.writeString(9, m_antenna);
|
s.writeString(9, m_antenna);
|
||||||
|
s.writeU32(10, m_bandwidth);
|
||||||
|
|
||||||
return s.final();
|
return s.final();
|
||||||
}
|
}
|
||||||
|
@ -79,6 +81,7 @@ bool SoapySDRInputSettings::deserialize(const QByteArray& data)
|
||||||
d.readBool(7, &m_transverterMode, false);
|
d.readBool(7, &m_transverterMode, false);
|
||||||
d.readS64(8, &m_transverterDeltaFrequency, 0);
|
d.readS64(8, &m_transverterDeltaFrequency, 0);
|
||||||
d.readString(9, &m_antenna, "NONE");
|
d.readString(9, &m_antenna, "NONE");
|
||||||
|
d.readU32(10, &m_bandwidth, 1000000);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,6 +38,7 @@ struct SoapySDRInputSettings {
|
||||||
qint64 m_transverterDeltaFrequency;
|
qint64 m_transverterDeltaFrequency;
|
||||||
QString m_fileRecordName;
|
QString m_fileRecordName;
|
||||||
QString m_antenna;
|
QString m_antenna;
|
||||||
|
quint32 m_bandwidth;
|
||||||
|
|
||||||
SoapySDRInputSettings();
|
SoapySDRInputSettings();
|
||||||
void resetToDefaults();
|
void resetToDefaults();
|
||||||
|
|
|
@ -10,6 +10,18 @@
|
||||||
<height>30</height>
|
<height>30</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>0</width>
|
||||||
|
<height>30</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
<string>Form</string>
|
<string>Form</string>
|
||||||
</property>
|
</property>
|
||||||
|
|
|
@ -10,6 +10,18 @@
|
||||||
<height>30</height>
|
<height>30</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>0</width>
|
||||||
|
<height>30</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
<string>Form</string>
|
<string>Form</string>
|
||||||
</property>
|
</property>
|
||||||
|
|
Loading…
Reference in New Issue