From 7a8715508693efc026f4c14beccf50049dce2048 Mon Sep 17 00:00:00 2001 From: f4exb Date: Mon, 26 Sep 2022 22:26:28 +0200 Subject: [PATCH] HackRF: use software LO ppm correction since hardware correction does not work. Fixes #1443 --- plugins/samplesink/hackrfoutput/hackrfoutput.cpp | 14 ++++++++------ plugins/samplesink/hackrfoutput/hackrfoutput.h | 2 +- plugins/samplesource/hackrfinput/hackrfinput.cpp | 16 ++++++++-------- plugins/samplesource/hackrfinput/hackrfinput.h | 2 +- 4 files changed, 18 insertions(+), 16 deletions(-) diff --git a/plugins/samplesink/hackrfoutput/hackrfoutput.cpp b/plugins/samplesink/hackrfoutput/hackrfoutput.cpp index 8390930d8..c1c2d194a 100644 --- a/plugins/samplesink/hackrfoutput/hackrfoutput.cpp +++ b/plugins/samplesink/hackrfoutput/hackrfoutput.cpp @@ -316,12 +316,15 @@ bool HackRFOutput::handleMessage(const Message& message) } } -void HackRFOutput::setDeviceCenterFrequency(quint64 freq_hz) +void HackRFOutput::setDeviceCenterFrequency(quint64 freq_hz, int loPpmTenths) { if (!m_dev) { return; } + qint64 df = ((qint64)freq_hz * loPpmTenths) / 10000000LL; + freq_hz += df; + hackrf_error rc = (hackrf_error) hackrf_set_freq(m_dev, static_cast(freq_hz)); if (rc != HACKRF_SUCCESS) { @@ -422,10 +425,8 @@ bool HackRFOutput::applySettings(const HackRFOutputSettings& settings, bool forc if ((m_settings.m_centerFrequency != settings.m_centerFrequency) || force) { reverseAPIKeys.append("centerFrequency"); } - if ((m_settings.m_LOppmTenths != settings.m_LOppmTenths) || force) - { + if ((m_settings.m_LOppmTenths != settings.m_LOppmTenths) || force) { reverseAPIKeys.append("LOppmTenths"); - DeviceHackRF::setDevicePPMCorrection(m_dev, settings.m_LOppmTenths); } if ((m_settings.m_fcPos != settings.m_fcPos) || force) { reverseAPIKeys.append("fcPos"); @@ -442,7 +443,8 @@ bool HackRFOutput::applySettings(const HackRFOutputSettings& settings, bool forc (m_settings.m_log2Interp != settings.m_log2Interp) || (m_settings.m_fcPos != settings.m_fcPos) || (m_settings.m_transverterMode != settings.m_transverterMode) || - (m_settings.m_transverterDeltaFrequency != settings.m_transverterDeltaFrequency) || force) + (m_settings.m_transverterDeltaFrequency != settings.m_transverterDeltaFrequency) || + (m_settings.m_LOppmTenths != settings.m_LOppmTenths) || force) { qint64 deviceCenterFrequency = DeviceSampleSink::calculateDeviceCenterFrequency( settings.m_centerFrequency, @@ -451,7 +453,7 @@ bool HackRFOutput::applySettings(const HackRFOutputSettings& settings, bool forc (DeviceSampleSink::fcPos_t) settings.m_fcPos, settings.m_devSampleRate, settings.m_transverterMode); - setDeviceCenterFrequency(deviceCenterFrequency); + setDeviceCenterFrequency(deviceCenterFrequency, settings.m_LOppmTenths); if (m_deviceAPI->getSourceBuddies().size() > 0) { diff --git a/plugins/samplesink/hackrfoutput/hackrfoutput.h b/plugins/samplesink/hackrfoutput/hackrfoutput.h index 7ee60d44f..be5a0902a 100644 --- a/plugins/samplesink/hackrfoutput/hackrfoutput.h +++ b/plugins/samplesink/hackrfoutput/hackrfoutput.h @@ -159,7 +159,7 @@ private: void closeDevice(); bool applySettings(const HackRFOutputSettings& settings, bool force); // hackrf_device *open_hackrf_from_sequence(int sequence); - void setDeviceCenterFrequency(quint64 freq_hz); + void setDeviceCenterFrequency(quint64 freq_hz, int loPpmTenths); void webapiReverseSendSettings(QList& deviceSettingsKeys, const HackRFOutputSettings& settings, bool force); void webapiReverseSendStartStop(bool start); diff --git a/plugins/samplesource/hackrfinput/hackrfinput.cpp b/plugins/samplesource/hackrfinput/hackrfinput.cpp index 4eb5a4ead..1fa810fe0 100644 --- a/plugins/samplesource/hackrfinput/hackrfinput.cpp +++ b/plugins/samplesource/hackrfinput/hackrfinput.cpp @@ -329,12 +329,15 @@ bool HackRFInput::handleMessage(const Message& message) } } -void HackRFInput::setDeviceCenterFrequency(quint64 freq_hz) +void HackRFInput::setDeviceCenterFrequency(quint64 freq_hz, int loPpmTenths) { if (!m_dev) { return; } + qint64 df = ((qint64)freq_hz * loPpmTenths) / 10000000LL; + freq_hz += df; + hackrf_error rc = (hackrf_error) hackrf_set_freq(m_dev, static_cast(freq_hz)); if (rc != HACKRF_SUCCESS) { @@ -421,13 +424,9 @@ bool HackRFInput::applySettings(const HackRFInputSettings& settings, bool force) if (force || (m_settings.m_centerFrequency != settings.m_centerFrequency)) { reverseAPIKeys.append("centerFrequency"); } - - if ((m_settings.m_LOppmTenths != settings.m_LOppmTenths) || force) - { + if ((m_settings.m_LOppmTenths != settings.m_LOppmTenths) || force) { reverseAPIKeys.append("LOppmTenths"); - DeviceHackRF::setDevicePPMCorrection(m_dev, settings.m_LOppmTenths); } - if ((m_settings.m_fcPos != settings.m_fcPos) || force) { reverseAPIKeys.append("fcPos"); } @@ -443,7 +442,8 @@ bool HackRFInput::applySettings(const HackRFInputSettings& settings, bool force) (m_settings.m_log2Decim != settings.m_log2Decim) || (m_settings.m_fcPos != settings.m_fcPos) || (m_settings.m_transverterMode != settings.m_transverterMode) || - (m_settings.m_transverterDeltaFrequency != settings.m_transverterDeltaFrequency) || force) + (m_settings.m_transverterDeltaFrequency != settings.m_transverterDeltaFrequency) || + (m_settings.m_LOppmTenths != settings.m_LOppmTenths) || force) { qint64 deviceCenterFrequency = DeviceSampleSource::calculateDeviceCenterFrequency( settings.m_centerFrequency, @@ -453,7 +453,7 @@ bool HackRFInput::applySettings(const HackRFInputSettings& settings, bool force) settings.m_devSampleRate, DeviceSampleSource::FrequencyShiftScheme::FSHIFT_TXSYNC, settings.m_transverterMode); - setDeviceCenterFrequency(deviceCenterFrequency); + setDeviceCenterFrequency(deviceCenterFrequency, settings.m_LOppmTenths); if (m_deviceAPI->getSinkBuddies().size() > 0) // forward to buddy if necessary { diff --git a/plugins/samplesource/hackrfinput/hackrfinput.h b/plugins/samplesource/hackrfinput/hackrfinput.h index bd7619828..e60230fff 100644 --- a/plugins/samplesource/hackrfinput/hackrfinput.h +++ b/plugins/samplesource/hackrfinput/hackrfinput.h @@ -159,7 +159,7 @@ private: bool openDevice(); void closeDevice(); bool applySettings(const HackRFInputSettings& settings, bool force); - void setDeviceCenterFrequency(quint64 freq); + void setDeviceCenterFrequency(quint64 freq, int loPpmTenths); void webapiReverseSendSettings(QList& deviceSettingsKeys, const HackRFInputSettings& settings, bool force); void webapiReverseSendStartStop(bool start);