diff --git a/plugins/samplesource/airspyhf/airspyhfgui.cpp b/plugins/samplesource/airspyhf/airspyhfgui.cpp
index 386dab3ed..cca64d59e 100644
--- a/plugins/samplesource/airspyhf/airspyhfgui.cpp
+++ b/plugins/samplesource/airspyhf/airspyhfgui.cpp
@@ -217,9 +217,9 @@ void AirspyHFGui::displaySettings()
ui->transverter->setDeltaFrequency(m_settings.m_transverterDeltaFrequency);
ui->transverter->setDeltaFrequencyActive(m_settings.m_transverterMode);
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->setCurrentIndex(m_settings.m_devSampleRateIndex);
-
ui->decim->setCurrentIndex(m_settings.m_log2Decim);
ui->band->blockSignals(false);
blockApplySettings(false);
@@ -265,6 +265,18 @@ void AirspyHFGui::on_centerFrequency_changed(quint64 value)
sendSettings();
}
+void AirspyHFGui::on_LOppm_valueChanged(int value)
+{
+ m_settings.m_LOppmTenths = value;
+ ui->LOppmText->setText(QString("%1").arg(QString::number(m_settings.m_LOppmTenths/10.0, 'f', 1)));
+ sendSettings();
+}
+
+void AirspyHFGui::on_resetLOppm_clicked()
+{
+ ui->LOppm->setValue(0);
+}
+
void AirspyHFGui::on_sampleRate_currentIndexChanged(int index)
{
m_settings.m_devSampleRateIndex = index;
diff --git a/plugins/samplesource/airspyhf/airspyhfgui.h b/plugins/samplesource/airspyhf/airspyhfgui.h
index 435f438c4..6efe5ddb4 100644
--- a/plugins/samplesource/airspyhf/airspyhfgui.h
+++ b/plugins/samplesource/airspyhf/airspyhfgui.h
@@ -77,6 +77,8 @@ private:
private slots:
void on_centerFrequency_changed(quint64 value);
+ void on_LOppm_valueChanged(int value);
+ void on_resetLOppm_clicked();
void on_sampleRate_currentIndexChanged(int index);
void on_decim_currentIndexChanged(int index);
void on_startStop_toggled(bool checked);
diff --git a/plugins/samplesource/airspyhf/airspyhfgui.ui b/plugins/samplesource/airspyhf/airspyhfgui.ui
index 621332be4..14e8c53e6 100644
--- a/plugins/samplesource/airspyhf/airspyhfgui.ui
+++ b/plugins/samplesource/airspyhf/airspyhfgui.ui
@@ -7,7 +7,7 @@
0
0
324
- 120
+ 132
@@ -19,7 +19,7 @@
320
- 120
+ 132
@@ -172,6 +172,71 @@
+ -
+
+
-
+
+
+ LO ppm
+
+
+
+ -
+
+
+ Local Oscillator ppm correction
+
+
+ -100
+
+
+ 100
+
+
+ 1
+
+
+ Qt::Horizontal
+
+
+
+ -
+
+
+
+ 36
+ 0
+
+
+
+ LO correction value (ppm)
+
+
+ -00.0
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+
+ 24
+ 16777215
+
+
+
+ Rest LO ppm correction
+
+
+ R
+
+
+
+
+
-
@@ -190,10 +255,10 @@
-
-
+
- 50
- 16777215
+ 56
+ 0
@@ -347,7 +412,7 @@
-
-
-
+
Qt::Vertical
diff --git a/plugins/samplesource/airspyhf/airspyhfinput.cpp b/plugins/samplesource/airspyhf/airspyhfinput.cpp
index 7d5e7c1eb..e126d4fa8 100644
--- a/plugins/samplesource/airspyhf/airspyhfinput.cpp
+++ b/plugins/samplesource/airspyhf/airspyhfinput.cpp
@@ -384,6 +384,23 @@ bool AirspyHFInput::applySettings(const AirspyHFSettings& settings, bool force)
}
}
+ if ((m_settings.m_LOppmTenths != settings.m_LOppmTenths) || force)
+ {
+ if (m_dev != 0)
+ {
+ rc = (airspyhf_error) airspyhf_set_calibration(m_dev, settings.m_LOppmTenths * 100);
+
+ if (rc != AIRSPYHF_SUCCESS)
+ {
+ qCritical("AirspyHFInput::applySettings: could not set LO ppm correction to %f", settings.m_LOppmTenths / 10.0f);
+ }
+ else if (m_airspyHFThread != 0)
+ {
+ qDebug("AirspyHFInput::applySettings: LO ppm correction set to %f", settings.m_LOppmTenths / 10.0f);
+ }
+ }
+ }
+
if (force || (m_settings.m_centerFrequency != settings.m_centerFrequency)
|| (m_settings.m_transverterMode != settings.m_transverterMode)
|| (m_settings.m_transverterDeltaFrequency != settings.m_transverterDeltaFrequency))
diff --git a/plugins/samplesource/airspyhf/airspyhfsettings.cpp b/plugins/samplesource/airspyhf/airspyhfsettings.cpp
index e90fbff74..b1e21d9d5 100644
--- a/plugins/samplesource/airspyhf/airspyhfsettings.cpp
+++ b/plugins/samplesource/airspyhf/airspyhfsettings.cpp
@@ -26,6 +26,7 @@ AirspyHFSettings::AirspyHFSettings()
void AirspyHFSettings::resetToDefaults()
{
m_centerFrequency = 7150*1000;
+ m_LOppmTenths = 0;
m_devSampleRateIndex = 0;
m_log2Decim = 0;
m_transverterMode = false;
@@ -38,6 +39,7 @@ QByteArray AirspyHFSettings::serialize() const
SimpleSerializer s(1);
s.writeU32(1, m_devSampleRateIndex);
+ s.writeS32(2, m_LOppmTenths);
s.writeU32(3, m_log2Decim);
s.writeBool(7, m_transverterMode);
s.writeS64(8, m_transverterDeltaFrequency);
@@ -62,6 +64,7 @@ bool AirspyHFSettings::deserialize(const QByteArray& data)
quint32 uintval;
d.readU32(1, &m_devSampleRateIndex, 0);
+ d.readS32(2, &m_LOppmTenths, 0);
d.readU32(3, &m_log2Decim, 0);
d.readS32(4, &intval, 0);
d.readBool(7, &m_transverterMode, false);
diff --git a/plugins/samplesource/airspyhf/airspyhfsettings.h b/plugins/samplesource/airspyhf/airspyhfsettings.h
index 7e6f7b958..544efe252 100644
--- a/plugins/samplesource/airspyhf/airspyhfsettings.h
+++ b/plugins/samplesource/airspyhf/airspyhfsettings.h
@@ -20,6 +20,7 @@
struct AirspyHFSettings
{
quint64 m_centerFrequency;
+ qint32 m_LOppmTenths;
quint32 m_devSampleRateIndex;
quint32 m_log2Decim;
bool m_transverterMode;