kopia lustrzana https://github.com/f4exb/sdrangel
SoapySDR support: output: bandwidth selection GUI
rodzic
0d0b8c9618
commit
52e9a72098
|
@ -195,6 +195,12 @@ const std::vector<std::string>& SoapySDROutput::getAntennas()
|
||||||
return channelSettings->m_antennas;
|
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()
|
void SoapySDROutput::init()
|
||||||
{
|
{
|
||||||
applySettings(m_settings, true);
|
applySettings(m_settings, true);
|
||||||
|
@ -596,6 +602,7 @@ bool SoapySDROutput::handleMessage(const Message& message)
|
||||||
|
|
||||||
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_TX, requestedChannel));
|
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();
|
//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)
|
if (forwardChangeOwnDSP)
|
||||||
{
|
{
|
||||||
int sampleRate = settings.m_devSampleRate/(1<<settings.m_log2Interp);
|
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_centerFrequency: " << m_settings.m_centerFrequency << " Hz"
|
||||||
<< " m_LOppmTenths: " << m_settings.m_LOppmTenths
|
<< " m_LOppmTenths: " << m_settings.m_LOppmTenths
|
||||||
<< " m_log2Interp: " << m_settings.m_log2Interp
|
<< " 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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -102,6 +102,7 @@ public:
|
||||||
void getFrequencyRange(uint64_t& min, uint64_t& max);
|
void getFrequencyRange(uint64_t& min, uint64_t& max);
|
||||||
const SoapySDR::RangeList& getRateRanges();
|
const SoapySDR::RangeList& getRateRanges();
|
||||||
const std::vector<std::string>& getAntennas();
|
const std::vector<std::string>& getAntennas();
|
||||||
|
const SoapySDR::RangeList& getBandwidthRanges();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DeviceSinkAPI *m_deviceAPI;
|
DeviceSinkAPI *m_deviceAPI;
|
||||||
|
|
|
@ -48,7 +48,15 @@ SoapySDROutputGui::SoapySDROutputGui(DeviceUISet *deviceUISet, QWidget* parent)
|
||||||
ui->centerFrequency->setValueRange(7, f_min/1000, f_max/1000);
|
ui->centerFrequency->setValueRange(7, f_min/1000, f_max/1000);
|
||||||
|
|
||||||
createAntennasControl(m_sampleSink->getAntennas());
|
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_updateTimer, SIGNAL(timeout()), this, SLOT(updateHardware()));
|
||||||
connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus()));
|
connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus()));
|
||||||
|
@ -72,7 +80,11 @@ void SoapySDROutputGui::destroy()
|
||||||
delete this;
|
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
|
if (rangeList.size() == 0) { // return early if the range list is empty
|
||||||
return;
|
return;
|
||||||
|
@ -94,17 +106,15 @@ void SoapySDROutputGui::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)));
|
|
||||||
}
|
}
|
||||||
else if (rangeInterval)
|
else if (rangeInterval)
|
||||||
{
|
{
|
||||||
|
@ -118,11 +128,9 @@ void SoapySDROutputGui::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)));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -259,10 +267,16 @@ void SoapySDROutputGui::antennasChanged()
|
||||||
{
|
{
|
||||||
const std::string& antennaStr = m_antennas->getCurrentValue();
|
const std::string& antennaStr = m_antennas->getCurrentValue();
|
||||||
m_settings.m_antenna = QString(antennaStr.c_str());
|
m_settings.m_antenna = QString(antennaStr.c_str());
|
||||||
|
|
||||||
sendSettings();
|
sendSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SoapySDROutputGui::bandwidthChanged(double bandwidth)
|
||||||
|
{
|
||||||
|
m_settings.m_bandwidth = bandwidth;
|
||||||
|
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;
|
||||||
|
|
|
@ -55,7 +55,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::SoapySDROutputGui* ui;
|
Ui::SoapySDROutputGui* ui;
|
||||||
|
@ -74,6 +78,7 @@ private:
|
||||||
|
|
||||||
ItemSettingGUI *m_sampleRateGUI;
|
ItemSettingGUI *m_sampleRateGUI;
|
||||||
StringRangeGUI *m_antennas;
|
StringRangeGUI *m_antennas;
|
||||||
|
ItemSettingGUI *m_bandwidthGUI;
|
||||||
|
|
||||||
void blockApplySettings(bool block) { m_doApplySettings = !block; }
|
void blockApplySettings(bool block) { m_doApplySettings = !block; }
|
||||||
void displaySettings();
|
void displaySettings();
|
||||||
|
@ -84,10 +89,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_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);
|
||||||
|
|
|
@ -33,6 +33,7 @@ void SoapySDROutputSettings::resetToDefaults()
|
||||||
m_transverterMode = false;
|
m_transverterMode = false;
|
||||||
m_transverterDeltaFrequency = 0;
|
m_transverterDeltaFrequency = 0;
|
||||||
m_antenna = "NONE";
|
m_antenna = "NONE";
|
||||||
|
m_bandwidth = 1000000;
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray SoapySDROutputSettings::serialize() const
|
QByteArray SoapySDROutputSettings::serialize() const
|
||||||
|
@ -45,6 +46,7 @@ QByteArray SoapySDROutputSettings::serialize() const
|
||||||
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);
|
s.writeString(6, m_antenna);
|
||||||
|
s.writeU32(7, m_bandwidth);
|
||||||
|
|
||||||
return s.final();
|
return s.final();
|
||||||
}
|
}
|
||||||
|
@ -67,6 +69,7 @@ bool SoapySDROutputSettings::deserialize(const QByteArray& data)
|
||||||
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");
|
d.readString(6, &m_antenna, "NONE");
|
||||||
|
d.readU32(7, &m_bandwidth, 1000000);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,6 +27,7 @@ struct SoapySDROutputSettings {
|
||||||
bool m_transverterMode;
|
bool m_transverterMode;
|
||||||
qint64 m_transverterDeltaFrequency;
|
qint64 m_transverterDeltaFrequency;
|
||||||
QString m_antenna;
|
QString m_antenna;
|
||||||
|
quint32 m_bandwidth;
|
||||||
|
|
||||||
SoapySDROutputSettings();
|
SoapySDROutputSettings();
|
||||||
void resetToDefaults();
|
void resetToDefaults();
|
||||||
|
|
|
@ -375,7 +375,7 @@
|
||||||
<item>
|
<item>
|
||||||
<widget class="QScrollArea" name="scrollArea">
|
<widget class="QScrollArea" name="scrollArea">
|
||||||
<property name="verticalScrollBarPolicy">
|
<property name="verticalScrollBarPolicy">
|
||||||
<enum>Qt::ScrollBarAlwaysOn</enum>
|
<enum>Qt::ScrollBarAsNeeded</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="widgetResizable">
|
<property name="widgetResizable">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
|
@ -385,7 +385,7 @@
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>304</width>
|
<width>318</width>
|
||||||
<height>51</height>
|
<height>51</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
|
|
|
@ -96,5 +96,6 @@ void IntervalRangeGUI::on_value_changed(quint64 value)
|
||||||
void IntervalRangeGUI::on_rangeInterval_currentIndexChanged(int index)
|
void IntervalRangeGUI::on_rangeInterval_currentIndexChanged(int index)
|
||||||
{
|
{
|
||||||
ui->value->setValueRange(m_nbDigits, m_minima[index], m_maxima[index]);
|
ui->value->setValueRange(m_nbDigits, m_minima[index], m_maxima[index]);
|
||||||
|
emit ItemSettingGUI::valueChanged(ui->value->getValueNew());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Ładowanie…
Reference in New Issue