SoapySDR support: output: bandwidth selection GUI

pull/263/head
f4exb 2018-11-05 02:40:02 +01:00
rodzic 0d0b8c9618
commit 52e9a72098
8 zmienionych plików z 69 dodań i 16 usunięć

Wyświetl plik

@ -195,6 +195,12 @@ const std::vector<std::string>& 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<<settings.m_log2Interp);
@ -778,7 +804,8 @@ bool SoapySDROutput::applySettings(const SoapySDROutputSettings& settings, bool
<< " m_centerFrequency: " << m_settings.m_centerFrequency << " Hz"
<< " m_LOppmTenths: " << m_settings.m_LOppmTenths
<< " m_log2Interp: " << m_settings.m_log2Interp
<< " m_devSampleRate: " << m_settings.m_devSampleRate;
<< " m_devSampleRate: " << m_settings.m_devSampleRate
<< " m_bandwidth: " << m_settings.m_bandwidth;
return true;
}

Wyświetl plik

@ -102,6 +102,7 @@ public:
void getFrequencyRange(uint64_t& min, uint64_t& max);
const SoapySDR::RangeList& getRateRanges();
const std::vector<std::string>& getAntennas();
const SoapySDR::RangeList& getBandwidthRanges();
private:
DeviceSinkAPI *m_deviceAPI;

Wyświetl plik

@ -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;

Wyświetl plik

@ -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<std::string>& 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);

Wyświetl plik

@ -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;
}

Wyświetl plik

@ -27,6 +27,7 @@ struct SoapySDROutputSettings {
bool m_transverterMode;
qint64 m_transverterDeltaFrequency;
QString m_antenna;
quint32 m_bandwidth;
SoapySDROutputSettings();
void resetToDefaults();

Wyświetl plik

@ -375,7 +375,7 @@
<item>
<widget class="QScrollArea" name="scrollArea">
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOn</enum>
<enum>Qt::ScrollBarAsNeeded</enum>
</property>
<property name="widgetResizable">
<bool>true</bool>
@ -385,7 +385,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>304</width>
<width>318</width>
<height>51</height>
</rect>
</property>

Wyświetl plik

@ -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());
}