mirror of
https://github.com/f4exb/sdrangel.git
synced 2025-02-03 09:44:01 -05:00
SoapySDR support: output: bandwidth selection GUI
This commit is contained in:
parent
0d0b8c9618
commit
52e9a72098
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -27,6 +27,7 @@ struct SoapySDROutputSettings {
|
||||
bool m_transverterMode;
|
||||
qint64 m_transverterDeltaFrequency;
|
||||
QString m_antenna;
|
||||
quint32 m_bandwidth;
|
||||
|
||||
SoapySDROutputSettings();
|
||||
void resetToDefaults();
|
||||
|
@ -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>
|
||||
|
@ -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());
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user