diff --git a/devices/bladerf2/devicebladerf2shared.h b/devices/bladerf2/devicebladerf2shared.h index 43474d7fa..f4664e6fb 100644 --- a/devices/bladerf2/devicebladerf2shared.h +++ b/devices/bladerf2/devicebladerf2shared.h @@ -36,18 +36,21 @@ public: public: uint64_t getCenterFrequency() const { return m_centerFrequency; } + int getLOppmTenths() const { return m_LOppmTenths; } int getFcPos() const { return m_fcPos; } int getDevSampleRate() const { return m_devSampleRate; } bool getRxElseTx() const { return m_rxElseTx; } static MsgReportBuddyChange* create( uint64_t centerFrequency, + int LOppmTenths, int fcPos, int devSampleRate, bool rxElseTx) { return new MsgReportBuddyChange( centerFrequency, + LOppmTenths, fcPos, devSampleRate, rxElseTx); @@ -55,17 +58,20 @@ public: private: uint64_t m_centerFrequency; //!< Center frequency + int m_LOppmTenths; //!< LO soft correction in tenths of ppm int m_fcPos; //!< Center frequency position int m_devSampleRate; //!< device/host sample rate bool m_rxElseTx; //!< tells which side initiated the message MsgReportBuddyChange( uint64_t centerFrequency, + int LOppmTenths, int fcPos, int devSampleRate, bool rxElseTx) : Message(), m_centerFrequency(centerFrequency), + m_LOppmTenths(LOppmTenths), m_fcPos(fcPos), m_devSampleRate(devSampleRate), m_rxElseTx(rxElseTx) diff --git a/plugins/samplesink/bladerf2output/bladerf2output.cpp b/plugins/samplesink/bladerf2output/bladerf2output.cpp index 87a3f2331..a074f870a 100644 --- a/plugins/samplesink/bladerf2output/bladerf2output.cpp +++ b/plugins/samplesink/bladerf2output/bladerf2output.cpp @@ -803,6 +803,7 @@ bool BladeRF2Output::applySettings(const BladeRF2OutputSettings& settings, bool DeviceBladeRF2Shared::MsgReportBuddyChange *report = DeviceBladeRF2Shared::MsgReportBuddyChange::create( settings.m_centerFrequency, 0, + 0, settings.m_devSampleRate, false); (*itSource)->getSampleSourceInputMessageQueue()->push(report); @@ -820,6 +821,7 @@ bool BladeRF2Output::applySettings(const BladeRF2OutputSettings& settings, bool DeviceBladeRF2Shared::MsgReportBuddyChange *report = DeviceBladeRF2Shared::MsgReportBuddyChange::create( settings.m_centerFrequency, 0, + 0, settings.m_devSampleRate, false); (*itSink)->getSampleSinkInputMessageQueue()->push(report); diff --git a/plugins/samplesink/bladerf2output/bladerf2outputgui.cpp b/plugins/samplesink/bladerf2output/bladerf2outputgui.cpp index 446930cb5..82eea6160 100644 --- a/plugins/samplesink/bladerf2output/bladerf2outputgui.cpp +++ b/plugins/samplesink/bladerf2output/bladerf2outputgui.cpp @@ -67,8 +67,6 @@ BladeRF2OutputGui::BladeRF2OutputGui(DeviceUISet *deviceUISet, QWidget* parent) ui->gain->setPageStep(1); ui->gain->setSingleStep(1); - ui->label_decim->setText(QString::fromUtf8("I\u2191")); - connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(updateHardware())); connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus())); m_statusTimer.start(500); diff --git a/plugins/samplesink/bladerf2output/bladerf2outputgui.ui b/plugins/samplesink/bladerf2output/bladerf2outputgui.ui index 7facfdc9a..e091753f9 100644 --- a/plugins/samplesink/bladerf2output/bladerf2outputgui.ui +++ b/plugins/samplesink/bladerf2output/bladerf2outputgui.ui @@ -319,7 +319,7 @@ - I + Int diff --git a/plugins/samplesource/bladerf2input/bladerf2input.cpp b/plugins/samplesource/bladerf2input/bladerf2input.cpp index 6060311b1..44287e514 100644 --- a/plugins/samplesource/bladerf2input/bladerf2input.cpp +++ b/plugins/samplesource/bladerf2input/bladerf2input.cpp @@ -538,6 +538,25 @@ void BladeRF2Input::setCenterFrequency(qint64 centerFrequency) } } +bool BladeRF2Input::setDeviceCenterFrequency(struct bladerf *dev, int requestedChannel, quint64 freq_hz) +{ + qint64 df = ((qint64)freq_hz * m_settings.m_LOppmTenths) / 10000000LL; + freq_hz += df; + + int status = bladerf_set_frequency(dev, BLADERF_CHANNEL_RX(requestedChannel), freq_hz); + + if (status < 0) { + qWarning("BladeRF2Input::setDeviceCenterFrequency: bladerf_set_frequency(%lld) failed: %s", + freq_hz, bladerf_strerror(status)); + return false; + } + else + { + qDebug("BladeRF2Input::setDeviceCenterFrequency: bladerf_set_frequency(%lld)", freq_hz); + return true; + } +} + void BladeRF2Input::getFrequencyRange(uint64_t& min, uint64_t& max, int& step) { if (m_deviceShared.m_dev) { @@ -595,9 +614,10 @@ bool BladeRF2Input::handleMessage(const Message& message) { int requestedChannel = m_deviceAPI->getItemIndex(); - if (report.getRxElseTx()) // Rx buddy change: check for: frequency, gain mode and value, bias tee, sample rate, bandwidth + if (report.getRxElseTx()) // Rx buddy change: check for: frequency, LO correction, gain mode and value, bias tee, sample rate, bandwidth { settings.m_devSampleRate = report.getDevSampleRate(); + settings.m_LOppmTenths = report.getLOppmTenths(); settings.m_centerFrequency = report.getCenterFrequency(); settings.m_fcPos = (BladeRF2InputSettings::fcPos_t) report.getFcPos(); @@ -785,6 +805,7 @@ bool BladeRF2Input::applySettings(const BladeRF2InputSettings& settings, bool fo } if ((m_settings.m_centerFrequency != settings.m_centerFrequency) + || (m_settings.m_LOppmTenths != settings.m_LOppmTenths) || (m_settings.m_devSampleRate != settings.m_devSampleRate) || (m_settings.m_fcPos != settings.m_fcPos) || (m_settings.m_log2Decim != settings.m_log2Decim) || force) @@ -801,16 +822,8 @@ bool BladeRF2Input::applySettings(const BladeRF2InputSettings& settings, bool fo if (dev != 0) { - int status = bladerf_set_frequency(dev, BLADERF_CHANNEL_RX(requestedChannel), deviceCenterFrequency); - - if (status < 0) { - qWarning("BladeRF2Input::applySettings: bladerf_set_frequency(%lld) failed: %s", - settings.m_centerFrequency, bladerf_strerror(status)); - } - else + if (setDeviceCenterFrequency(dev, requestedChannel, deviceCenterFrequency)) { - qDebug("BladeRF2Input::applySettings: bladerf_set_frequency(%lld)", settings.m_centerFrequency); - if (getMessageQueueToGUI()) { int min, max, step; @@ -882,6 +895,7 @@ bool BladeRF2Input::applySettings(const BladeRF2InputSettings& settings, bool fo { DeviceBladeRF2Shared::MsgReportBuddyChange *report = DeviceBladeRF2Shared::MsgReportBuddyChange::create( settings.m_centerFrequency, + settings.m_LOppmTenths, (int) settings.m_fcPos, settings.m_devSampleRate, true); @@ -899,6 +913,7 @@ bool BladeRF2Input::applySettings(const BladeRF2InputSettings& settings, bool fo { DeviceBladeRF2Shared::MsgReportBuddyChange *report = DeviceBladeRF2Shared::MsgReportBuddyChange::create( settings.m_centerFrequency, + settings.m_LOppmTenths, (int) settings.m_fcPos, settings.m_devSampleRate, true); @@ -910,6 +925,7 @@ bool BladeRF2Input::applySettings(const BladeRF2InputSettings& settings, bool fo qDebug() << "BladeRF2Input::applySettings: " << " m_centerFrequency: " << m_settings.m_centerFrequency << " Hz" + << " m_LOppmTenths: " << m_settings.m_LOppmTenths << " m_bandwidth: " << m_settings.m_bandwidth << " m_log2Decim: " << m_settings.m_log2Decim << " m_fcPos: " << m_settings.m_fcPos diff --git a/plugins/samplesource/bladerf2input/bladerf2input.h b/plugins/samplesource/bladerf2input/bladerf2input.h index af61d5776..9c5c0f81b 100644 --- a/plugins/samplesource/bladerf2input/bladerf2input.h +++ b/plugins/samplesource/bladerf2input/bladerf2input.h @@ -29,6 +29,7 @@ class DeviceSourceAPI; class BladeRF2InputThread; class FileRecord; struct bladerf_gain_modes; +struct bladerf; class BladeRF2Input : public DeviceSampleSource { @@ -191,6 +192,7 @@ private: BladeRF2InputThread *findThread(); void moveThreadToBuddy(); bool applySettings(const BladeRF2InputSettings& settings, bool force = false); + bool setDeviceCenterFrequency(struct bladerf *dev, int requestedChannel, quint64 freq_hz); void webapiFormatDeviceSettings(SWGSDRangel::SWGDeviceSettings& response, const BladeRF2InputSettings& settings); void webapiFormatDeviceReport(SWGSDRangel::SWGDeviceReport& response); }; diff --git a/plugins/samplesource/bladerf2input/bladerf2inputgui.cpp b/plugins/samplesource/bladerf2input/bladerf2inputgui.cpp index 34f44d6a7..3ee2280c7 100644 --- a/plugins/samplesource/bladerf2input/bladerf2inputgui.cpp +++ b/plugins/samplesource/bladerf2input/bladerf2inputgui.cpp @@ -229,6 +229,8 @@ void BladeRF2InputGui::displaySettings() blockApplySettings(true); ui->centerFrequency->setValue(m_settings.m_centerFrequency / 1000); + ui->LOppm->setValue(m_settings.m_LOppmTenths); + ui->LOppmText->setText(QString("%1").arg(QString::number(m_settings.m_LOppmTenths/10.0, 'f', 1))); ui->sampleRate->setValue(m_settings.m_devSampleRate); ui->bandwidth->setValue(m_settings.m_bandwidth / 1000); @@ -262,6 +264,13 @@ void BladeRF2InputGui::on_centerFrequency_changed(quint64 value) sendSettings(); } +void BladeRF2InputGui::on_LOppm_valueChanged(int value) +{ + ui->LOppmText->setText(QString("%1").arg(QString::number(value/10.0, 'f', 1))); + m_settings.m_LOppmTenths = value; + sendSettings(); +} + void BladeRF2InputGui::on_sampleRate_changed(quint64 value) { m_settings.m_devSampleRate = value; diff --git a/plugins/samplesource/bladerf2input/bladerf2inputgui.h b/plugins/samplesource/bladerf2input/bladerf2inputgui.h index f52c82022..6ec59f776 100644 --- a/plugins/samplesource/bladerf2input/bladerf2inputgui.h +++ b/plugins/samplesource/bladerf2input/bladerf2inputgui.h @@ -74,6 +74,7 @@ private: private slots: void handleInputMessages(); void on_centerFrequency_changed(quint64 value); + void on_LOppm_valueChanged(int value); void on_sampleRate_changed(quint64 value); void on_dcOffset_toggled(bool checked); void on_iqImbalance_toggled(bool checked); diff --git a/plugins/samplesource/bladerf2input/bladerf2inputgui.ui b/plugins/samplesource/bladerf2input/bladerf2inputgui.ui index 68aad81a2..c3240635e 100644 --- a/plugins/samplesource/bladerf2input/bladerf2inputgui.ui +++ b/plugins/samplesource/bladerf2input/bladerf2inputgui.ui @@ -7,7 +7,7 @@ 0 0 350 - 200 + 220 @@ -19,7 +19,7 @@ 350 - 200 + 220 @@ -174,11 +174,50 @@ - - - Qt::Horizontal - - + + + + + LO ppm + + + + + + + Local Oscillator ppm correction + + + -20 + + + 20 + + + 1 + + + Qt::Horizontal + + + + + + + + 26 + 0 + + + + -0.0 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + diff --git a/plugins/samplesource/bladerf2input/bladerf2inputsettings.cpp b/plugins/samplesource/bladerf2input/bladerf2inputsettings.cpp index d0bb3e807..07e604ddc 100644 --- a/plugins/samplesource/bladerf2input/bladerf2inputsettings.cpp +++ b/plugins/samplesource/bladerf2input/bladerf2inputsettings.cpp @@ -26,6 +26,7 @@ BladeRF2InputSettings::BladeRF2InputSettings() void BladeRF2InputSettings::resetToDefaults() { m_centerFrequency = 435000*1000; + m_LOppmTenths = 0; m_devSampleRate = 3072000; m_bandwidth = 1500000; m_gainMode = 0; @@ -51,6 +52,7 @@ QByteArray BladeRF2InputSettings::serialize() const s.writeS32(7, (int) m_fcPos); s.writeBool(8, m_dcBlock); s.writeBool(9, m_iqCorrection); + s.writeS32(10, m_LOppmTenths); return s.final(); } @@ -79,6 +81,7 @@ bool BladeRF2InputSettings::deserialize(const QByteArray& data) m_fcPos = (fcPos_t) intval; d.readBool(8, &m_dcBlock); d.readBool(9, &m_iqCorrection); + d.readS32(10, &m_LOppmTenths); return true; } diff --git a/plugins/samplesource/bladerf2input/bladerf2inputsettings.h b/plugins/samplesource/bladerf2input/bladerf2inputsettings.h index b44f63bd3..3cd44fb62 100644 --- a/plugins/samplesource/bladerf2input/bladerf2inputsettings.h +++ b/plugins/samplesource/bladerf2input/bladerf2inputsettings.h @@ -29,6 +29,7 @@ struct BladeRF2InputSettings { } fcPos_t; quint64 m_centerFrequency; + qint32 m_LOppmTenths; qint32 m_devSampleRate; qint32 m_bandwidth; int m_gainMode;