From 1a8d96d874b3218b878b7cc0813a6a4d7ac232b9 Mon Sep 17 00:00:00 2001 From: f4exb Date: Sun, 8 Jan 2017 02:48:01 +0100 Subject: [PATCH] HackRF input plugin: use actual sample rate and bandwidth values not indexes --- devices/hackrf/CMakeLists.txt | 2 + devices/hackrf/devicehackrf.cpp | 2 +- devices/hackrf/devicehackrfvalues.cpp | 73 +++++++++++++++ devices/hackrf/devicehackrfvalues.h | 36 ++++++++ .../samplesource/hackrfinput/hackrfinput.cpp | 48 ++++------ .../hackrfinput/hackrfinputgui.cpp | 90 ++++++------------- .../samplesource/hackrfinput/hackrfinputgui.h | 16 ---- .../hackrfinput/hackrfinputsettings.cpp | 12 +-- .../hackrfinput/hackrfinputsettings.h | 4 +- 9 files changed, 163 insertions(+), 120 deletions(-) create mode 100644 devices/hackrf/devicehackrfvalues.cpp create mode 100644 devices/hackrf/devicehackrfvalues.h diff --git a/devices/hackrf/CMakeLists.txt b/devices/hackrf/CMakeLists.txt index 3e8617516..b91343c92 100644 --- a/devices/hackrf/CMakeLists.txt +++ b/devices/hackrf/CMakeLists.txt @@ -2,11 +2,13 @@ project(hackrfdevice) set(hackrfdevice_SOURCES devicehackrf.cpp + devicehackrfvalues.cpp ) set(hackrfdevice_HEADERS devicehackrf.h devicehackrfparam.h + devicehackrfvalues.h ) if (BUILD_DEBIAN) diff --git a/devices/hackrf/devicehackrf.cpp b/devices/hackrf/devicehackrf.cpp index a9bb56cf9..bebfb58f9 100644 --- a/devices/hackrf/devicehackrf.cpp +++ b/devices/hackrf/devicehackrf.cpp @@ -21,9 +21,9 @@ hackrf_device *DeviceHackRF::open_hackrf(int sequence) { hackrf_error rc; + // TODO: this may not work if several HackRF Devices are running concurrently. It should be handled globally in the application rc = (hackrf_error) hackrf_init(); - // TODO: this may not work if several HackRF Devices are running concurrently. It should be handled globally in the application if (rc != HACKRF_SUCCESS) { fprintf(stderr, "DeviceHackRF::open_hackrf: failed to initiate HackRF library %s\n", hackrf_error_name(rc)); diff --git a/devices/hackrf/devicehackrfvalues.cpp b/devices/hackrf/devicehackrfvalues.cpp new file mode 100644 index 000000000..c09fa2d0a --- /dev/null +++ b/devices/hackrf/devicehackrfvalues.cpp @@ -0,0 +1,73 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2017 Edouard Griffiths, F4EXB // +// // +// This program is free software; you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation as version 3 of the License, or // +// // +// This program is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#include "devicehackrfvalues.h" + +unsigned int HackRFSampleRates::m_rates_k[] = {2400, 3200, 4800, 5600, 6400, 8000, 9600, 12800, 19200}; + +unsigned int HackRFSampleRates::getRate(unsigned int rate_index) +{ + if (rate_index < m_nb_rates) + { + return m_rates_k[rate_index]; + } + else + { + return m_rates_k[0]; + } +} + +unsigned int HackRFSampleRates::getRateIndex(unsigned int rate) +{ + for (unsigned int i=0; i < m_nb_rates; i++) + { + if (rate == m_rates_k[i]) + { + return i; + } + } + + return 0; +} + +unsigned int HackRFBandwidths::m_bw_k[] = {1750, 2500, 3500, 5000, 5500, 6000, 7000, 8000, 9000, 10000, 12000, 14000, 15000, 20000, 24000, 28000}; + +unsigned int HackRFBandwidths::getBandwidth(unsigned int bandwidth_index) +{ + if (bandwidth_index < m_nb_bw) + { + return m_bw_k[bandwidth_index]; + } + else + { + return m_bw_k[0]; + } +} + +unsigned int HackRFBandwidths::getBandwidthIndex(unsigned int bandwidth) +{ + for (unsigned int i=0; i < m_nb_bw; i++) + { + if (bandwidth == m_bw_k[i]) + { + return i; + } + } + + return 0; +} + + diff --git a/devices/hackrf/devicehackrfvalues.h b/devices/hackrf/devicehackrfvalues.h new file mode 100644 index 000000000..44310a4d2 --- /dev/null +++ b/devices/hackrf/devicehackrfvalues.h @@ -0,0 +1,36 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2017 Edouard Griffiths, F4EXB // +// // +// This program is free software; you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation as version 3 of the License, or // +// // +// This program is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY; without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License V3 for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with this program. If not, see . // +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef DEVICES_HACKRF_DEVICEHACKRFVALUES_H_ +#define DEVICES_HACKRF_DEVICEHACKRFVALUES_H_ + +class HackRFSampleRates { +public: + static unsigned int getRate(unsigned int rate_index); + static unsigned int getRateIndex(unsigned int rate); + static const unsigned int m_nb_rates = 9; + static unsigned int m_rates_k[m_nb_rates]; +}; + +class HackRFBandwidths { +public: + static unsigned int getBandwidth(unsigned int bandwidth_index); + static unsigned int getBandwidthIndex(unsigned int bandwidth); + static const unsigned int m_nb_bw = 16; + static unsigned int m_bw_k[m_nb_bw]; +}; + +#endif /* DEVICES_HACKRF_DEVICEHACKRFVALUES_H_ */ diff --git a/plugins/samplesource/hackrfinput/hackrfinput.cpp b/plugins/samplesource/hackrfinput/hackrfinput.cpp index c466d8521..001494746 100644 --- a/plugins/samplesource/hackrfinput/hackrfinput.cpp +++ b/plugins/samplesource/hackrfinput/hackrfinput.cpp @@ -25,7 +25,7 @@ #include "dsp/dspengine.h" #include "device/devicesourceapi.h" #include "device/devicesinkapi.h" - +#include "hackrf/devicehackrfvalues.h" #include "hackrfinputgui.h" #include "hackrfinputthread.h" @@ -208,8 +208,7 @@ const QString& HackRFInput::getDeviceDescription() const int HackRFInput::getSampleRate() const { - int rate = HackRFSampleRates::m_rates_k[m_settings.m_devSampleRateIndex] * 1000; - return (rate / (1<configureCorrections(m_settings.m_dcBlock, m_settings.m_iqCorrection); } - if ((m_settings.m_devSampleRateIndex != settings.m_devSampleRateIndex) || force) + if ((m_settings.m_devSampleRate != settings.m_devSampleRate) || force) { forwardChange = true; - - if (settings.m_devSampleRateIndex < HackRFSampleRates::m_nb_rates) - { - m_settings.m_devSampleRateIndex = settings.m_devSampleRateIndex; - } - else - { - m_settings.m_devSampleRateIndex = HackRFSampleRates::m_nb_rates - 1; - } + m_settings.m_devSampleRate = settings.m_devSampleRate; if (m_dev != 0) { - rc = (hackrf_error) hackrf_set_sample_rate_manual(m_dev, HackRFSampleRates::m_rates_k[m_settings.m_devSampleRateIndex]*1000, 1); + rc = (hackrf_error) hackrf_set_sample_rate_manual(m_dev, m_settings.m_devSampleRate, 1); if (rc != HACKRF_SUCCESS) { - qCritical("HackRFInput::applySettings: could not set sample rate index %u (%d kS/s): %s", m_settings.m_devSampleRateIndex, HackRFSampleRates::m_rates_k[m_settings.m_devSampleRateIndex], hackrf_error_name(rc)); + qCritical("HackRFInput::applySettings: could not set sample rate TO %d kS/s: %s", m_settings.m_devSampleRate, hackrf_error_name(rc)); } else { - qDebug("HackRFInput::applySettings: sample rate set to index: %u (%d kS/s)", m_settings.m_devSampleRateIndex, HackRFSampleRates::m_rates_k[m_settings.m_devSampleRateIndex]); - m_hackRFThread->setSamplerate(HackRFSampleRates::m_rates_k[m_settings.m_devSampleRateIndex]); + qDebug("HackRFInput::applySettings: sample rate set to %d kS/s", m_settings.m_devSampleRate); + m_hackRFThread->setSamplerate(m_settings.m_devSampleRate); } } } @@ -320,7 +311,7 @@ bool HackRFInput::applySettings(const HackRFInputSettings& settings, bool force) qint64 deviceCenterFrequency = m_settings.m_centerFrequency; qint64 f_img = deviceCenterFrequency; - quint32 devSampleRate = HackRFSampleRates::m_rates_k[m_settings.m_devSampleRateIndex] * 1000; + quint32 devSampleRate =m_settings.m_devSampleRate; if (force || (m_settings.m_centerFrequency != settings.m_centerFrequency) || (m_settings.m_LOppmTenths != settings.m_LOppmTenths) || @@ -411,21 +402,11 @@ bool HackRFInput::applySettings(const HackRFInputSettings& settings, bool force) } } - if ((m_settings.m_bandwidthIndex != settings.m_bandwidthIndex) || force) + if ((m_settings.m_bandwidth != settings.m_bandwidth) || force) { - - if (settings.m_bandwidthIndex < HackRFBandwidths::m_nb_bw) - { - m_settings.m_bandwidthIndex = settings.m_bandwidthIndex; - } - else - { - m_settings.m_bandwidthIndex = HackRFBandwidths::m_nb_bw - 1; - } - if (m_dev != 0) { - uint32_t bw_index = hackrf_compute_baseband_filter_bw_round_down_lt(HackRFBandwidths::m_bw_k[m_settings.m_bandwidthIndex]*1000); + uint32_t bw_index = hackrf_compute_baseband_filter_bw_round_down_lt(m_settings.m_bandwidth); rc = (hackrf_error) hackrf_set_baseband_filter_bandwidth(m_dev, bw_index); if (rc != HACKRF_SUCCESS) @@ -434,7 +415,7 @@ bool HackRFInput::applySettings(const HackRFInputSettings& settings, bool force) } else { - qDebug() << "HackRFInput:applySettings: Baseband BW filter set to " << HackRFBandwidths::m_bw_k[m_settings.m_bandwidthIndex] << " kHz"; + qDebug() << "HackRFInput:applySettings: Baseband BW filter set to " << m_settings.m_bandwidth << " Hz"; } } } @@ -484,6 +465,11 @@ bool HackRFInput::applySettings(const HackRFInputSettings& settings, bool force) m_deviceAPI->getDeviceInputMessageQueue()->push(notif); } + qDebug() << "HackRFInput::applySettings: center freq: " << m_settings.m_centerFrequency << " Hz" + << " device center freq: " << deviceCenterFrequency << " Hz" + << " device sample rate: " << m_settings.m_devSampleRate << "Hz" + << " Actual sample rate: " << m_settings.m_devSampleRate/(1< #include +#include "hackrf/devicehackrfvalues.h" #include "ui_hackrfinputgui.h" @@ -112,11 +113,14 @@ QByteArray HackRFInputGui::serialize() const bool HackRFInputGui::deserialize(const QByteArray& data) { - if(m_settings.deserialize(data)) { + if(m_settings.deserialize(data)) + { displaySettings(); sendSettings(); return true; - } else { + } + else + { resetToDefaults(); return false; } @@ -124,7 +128,15 @@ bool HackRFInputGui::deserialize(const QByteArray& data) bool HackRFInputGui::handleMessage(const Message& message) { - return false; + if (HackRFInput::MsgReportHackRF::match(message)) + { + displaySettings(); + return true; + } + else + { + return false; + } } void HackRFInputGui::handleDSPMessages() @@ -166,7 +178,8 @@ void HackRFInputGui::displaySettings() ui->dcOffset->setChecked(m_settings.m_dcBlock); ui->iqImbalance->setChecked(m_settings.m_iqCorrection); - ui->sampleRate->setCurrentIndex(m_settings.m_devSampleRateIndex); + unsigned int sampleRateIndex = HackRFSampleRates::getRateIndex(m_settings.m_devSampleRate/1000); + ui->sampleRate->setCurrentIndex(sampleRateIndex); ui->biasT->setChecked(m_settings.m_biasT); @@ -178,7 +191,8 @@ void HackRFInputGui::displaySettings() ui->lnaGainText->setText(tr("%1dB").arg(m_settings.m_lnaGain)); ui->lna->setValue(m_settings.m_lnaGain); - ui->bbFilter->setCurrentIndex(m_settings.m_bandwidthIndex); + unsigned int bandwidthIndex = HackRFBandwidths::getBandwidthIndex(m_settings.m_bandwidth/1000); + ui->bbFilter->setCurrentIndex(bandwidthIndex); ui->vgaText->setText(tr("%1dB").arg(m_settings.m_vgaGain)); ui->vga->setValue(m_settings.m_vgaGain); @@ -186,7 +200,7 @@ void HackRFInputGui::displaySettings() void HackRFInputGui::displaySampleRates() { - int savedIndex = m_settings.m_devSampleRateIndex; + int savedIndex = HackRFSampleRates::getRateIndex(m_settings.m_devSampleRate/1000); ui->sampleRate->blockSignals(true); ui->sampleRate->clear(); @@ -209,7 +223,7 @@ void HackRFInputGui::displaySampleRates() void HackRFInputGui::displayBandwidths() { - int savedIndex = m_settings.m_bandwidthIndex; + int savedIndex = HackRFBandwidths::getBandwidthIndex(m_settings.m_bandwidth/1000); ui->bbFilter->blockSignals(true); ui->bbFilter->clear(); @@ -263,13 +277,15 @@ void HackRFInputGui::on_iqImbalance_toggled(bool checked) void HackRFInputGui::on_sampleRate_currentIndexChanged(int index) { - m_settings.m_devSampleRateIndex = index; + int newrate = HackRFSampleRates::getRate(index); + m_settings.m_devSampleRate = newrate * 1000; sendSettings(); } void HackRFInputGui::on_bbFilter_currentIndexChanged(int index) { - m_settings.m_bandwidthIndex = index; + int newBandwidth = HackRFBandwidths::getBandwidth(index); + m_settings.m_bandwidth = newBandwidth * 1000; sendSettings(); } @@ -361,7 +377,7 @@ void HackRFInputGui::on_record_toggled(bool checked) void HackRFInputGui::updateHardware() { qDebug() << "HackRFGui::updateHardware"; - HackRFInput::MsgConfigureHackRF* message = HackRFInput::MsgConfigureHackRF::create( m_settings); + HackRFInput::MsgConfigureHackRF* message = HackRFInput::MsgConfigureHackRF::create(m_settings); m_sampleSource->getInputMessageQueue()->push(message); m_updateTimer.stop(); } @@ -394,57 +410,3 @@ void HackRFInputGui::updateStatus() m_lastEngineState = state; } } - -unsigned int HackRFSampleRates::m_rates_k[] = {2400, 3200, 4800, 5600, 6400, 8000, 9600, 12800, 19200}; - -unsigned int HackRFSampleRates::getRate(unsigned int rate_index) -{ - if (rate_index < m_nb_rates) - { - return m_rates_k[rate_index]; - } - else - { - return m_rates_k[0]; - } -} - -unsigned int HackRFSampleRates::getRateIndex(unsigned int rate) -{ - for (unsigned int i=0; i < m_nb_rates; i++) - { - if (rate/1000 == m_rates_k[i]) - { - return i; - } - } - - return 0; -} - -unsigned int HackRFBandwidths::m_bw_k[] = {1750, 2500, 3500, 5000, 5500, 6000, 7000, 8000, 9000, 10000, 12000, 14000, 15000, 20000, 24000, 28000}; - -unsigned int HackRFBandwidths::getBandwidth(unsigned int bandwidth_index) -{ - if (bandwidth_index < m_nb_bw) - { - return m_bw_k[bandwidth_index]; - } - else - { - return m_bw_k[0]; - } -} - -unsigned int HackRFBandwidths::getBandwidthIndex(unsigned int bandwidth) -{ - for (unsigned int i=0; i < m_nb_bw; i++) - { - if (bandwidth == m_bw_k[i]) - { - return i; - } - } - - return 0; -} diff --git a/plugins/samplesource/hackrfinput/hackrfinputgui.h b/plugins/samplesource/hackrfinput/hackrfinputgui.h index b21b1f003..dfd83cd40 100644 --- a/plugins/samplesource/hackrfinput/hackrfinputgui.h +++ b/plugins/samplesource/hackrfinput/hackrfinputgui.h @@ -96,20 +96,4 @@ private slots: void updateStatus(); }; -class HackRFSampleRates { -public: - static unsigned int getRate(unsigned int rate_index); - static unsigned int getRateIndex(unsigned int rate); - static const unsigned int m_nb_rates = 9; - static unsigned int m_rates_k[m_nb_rates]; -}; - -class HackRFBandwidths { -public: - static unsigned int getBandwidth(unsigned int bandwidth_index); - static unsigned int getBandwidthIndex(unsigned int bandwidth); - static const unsigned int m_nb_bw = 16; - static unsigned int m_bw_k[m_nb_bw]; -}; - #endif // INCLUDE_HACKRFINPUTGUI_H diff --git a/plugins/samplesource/hackrfinput/hackrfinputsettings.cpp b/plugins/samplesource/hackrfinput/hackrfinputsettings.cpp index dca1dabe9..4d3066854 100644 --- a/plugins/samplesource/hackrfinput/hackrfinputsettings.cpp +++ b/plugins/samplesource/hackrfinput/hackrfinputsettings.cpp @@ -29,13 +29,13 @@ void HackRFInputSettings::resetToDefaults() { m_centerFrequency = 435000 * 1000; m_LOppmTenths = 0; - m_devSampleRateIndex = 0; + m_devSampleRate = 2400000; m_biasT = false; m_log2Decim = 0; m_fcPos = FC_POS_CENTER; m_lnaExt = false; m_lnaGain = 16; - m_bandwidthIndex = 0; + m_bandwidth = 1750000; m_vgaGain = 16; m_dcBlock = false; m_iqCorrection = false; @@ -46,13 +46,13 @@ QByteArray HackRFInputSettings::serialize() const SimpleSerializer s(1); s.writeS32(1, m_LOppmTenths); - s.writeU32(2, m_devSampleRateIndex); + s.writeU32(2, m_devSampleRate); s.writeBool(3, m_biasT); s.writeU32(4, m_log2Decim); s.writeS32(5, m_fcPos); s.writeBool(6, m_lnaExt); s.writeU32(7, m_lnaGain); - s.writeU32(8, m_bandwidthIndex); + s.writeU32(8, m_bandwidth); s.writeU32(9, m_vgaGain); s.writeBool(10, m_dcBlock); s.writeBool(11, m_iqCorrection); @@ -75,14 +75,14 @@ bool HackRFInputSettings::deserialize(const QByteArray& data) int intval; d.readS32(1, &m_LOppmTenths, 0); - d.readU32(2, &m_devSampleRateIndex, 0); + d.readU32(2, &m_devSampleRate, 2400000); d.readBool(3, &m_biasT, false); d.readU32(4, &m_log2Decim, 0); d.readS32(5, &intval, 0); m_fcPos = (fcPos_t) intval; d.readBool(6, &m_lnaExt, false); d.readU32(7, &m_lnaGain, 16); - d.readU32(8, &m_bandwidthIndex, 0); + d.readU32(8, &m_bandwidth, 1750000); d.readU32(9, &m_vgaGain, 16); d.readBool(10, &m_dcBlock, false); d.readBool(11, &m_iqCorrection, false); diff --git a/plugins/samplesource/hackrfinput/hackrfinputsettings.h b/plugins/samplesource/hackrfinput/hackrfinputsettings.h index 104f74de2..dbc112189 100644 --- a/plugins/samplesource/hackrfinput/hackrfinputsettings.h +++ b/plugins/samplesource/hackrfinput/hackrfinputsettings.h @@ -28,8 +28,8 @@ struct HackRFInputSettings { quint64 m_centerFrequency; qint32 m_LOppmTenths; - quint32 m_devSampleRateIndex; - quint32 m_bandwidthIndex; + quint32 m_devSampleRate; + quint32 m_bandwidth; quint32 m_lnaGain; quint32 m_vgaGain; quint32 m_log2Decim;