From 92e7bb8ebacbfd87b847f96fc7784b4c62ecad89 Mon Sep 17 00:00:00 2001 From: f4exb Date: Sun, 16 Apr 2017 19:30:46 +0200 Subject: [PATCH] LimeSDR support (12) --- .../limesdrinput/limesdrinput.cpp | 164 ++++++++++++++++++ .../limesdrinput/limesdrinputgui.cpp | 9 +- .../limesdrinput/limesdrinputgui.h | 3 +- .../limesdrinput/limesdrinputgui.ui | 29 ---- 4 files changed, 169 insertions(+), 36 deletions(-) diff --git a/plugins/samplesource/limesdrinput/limesdrinput.cpp b/plugins/samplesource/limesdrinput/limesdrinput.cpp index 47e1c1dcf..b6b6e37cc 100644 --- a/plugins/samplesource/limesdrinput/limesdrinput.cpp +++ b/plugins/samplesource/limesdrinput/limesdrinput.cpp @@ -15,12 +15,14 @@ /////////////////////////////////////////////////////////////////////////////////// #include +#include #include #include #include "lime/LimeSuite.h" #include "device/devicesourceapi.h" #include "device/devicesinkapi.h" +#include "dsp/dspcommands.h" #include "limesdrinput.h" #include "limesdrinputthread.h" #include "limesdr/devicelimesdrparam.h" @@ -243,3 +245,165 @@ uint32_t LimeSDRInput::getHWLog2Decim() const return m_deviceShared.m_deviceParams->m_log2OvSRRx; } +bool LimeSDRInput::handleMessage(const Message& message) +{ + if (MsgConfigureLimeSDR::match(message)) + { + MsgConfigureLimeSDR& conf = (MsgConfigureLimeSDR&) message; + qDebug() << "LimeSDRInput::handleMessage: MsgConfigureLimeSDR"; + + if (!applySettings(conf.getSettings(), false)) + { + qDebug("LimeSDRInput::handleMessage config error"); + } + + return true; + } + else + { + return false; + } +} + +bool LimeSDRInput::applySettings(const LimeSDRInputSettings& settings, bool force) +{ + bool forwardChangeOwnDSP = false; + bool forwardChangeRxDSP = false; + bool forwardChangeAllDSP = false; +// QMutexLocker mutexLocker(&m_mutex); + + qDebug() << "LimeSDRInput::applySettings"; + + if (m_settings.m_dcBlock != settings.m_dcBlock) + { + m_settings.m_dcBlock = settings.m_dcBlock; + m_deviceAPI->configureCorrections(m_settings.m_dcBlock, m_settings.m_iqCorrection); + } + + if (m_settings.m_iqCorrection != settings.m_iqCorrection) + { + m_settings.m_iqCorrection = settings.m_iqCorrection; + m_deviceAPI->configureCorrections(m_settings.m_dcBlock, m_settings.m_iqCorrection); + } + + if ((m_settings.m_gain != settings.m_gain) || force) + { + m_settings.m_gain = settings.m_gain; + + if (m_deviceShared.m_deviceParams->getDevice() != 0) + { + if (LMS_SetGaindB(m_deviceShared.m_deviceParams->getDevice(), + LMS_CH_RX, + m_deviceShared.m_channel, + m_settings.m_gain) < 0) + { + qDebug("LimeSDRInput::applySettings: LMS_SetGaindB() failed"); + } + else + { + qDebug() << "LimeSDRInput::applySettings: Gain set to " << m_settings.m_gain; + } + } + } + + if ((m_settings.m_devSampleRate != settings.m_devSampleRate) + || (m_settings.m_log2HardDecim != settings.m_log2HardDecim) || force) + { + forwardChangeRxDSP = m_settings.m_log2HardDecim != settings.m_log2HardDecim; + forwardChangeAllDSP = m_settings.m_devSampleRate != settings.m_devSampleRate; + + m_settings.m_devSampleRate = settings.m_devSampleRate; + m_settings.m_log2HardDecim = settings.m_log2HardDecim; + + if (m_deviceShared.m_deviceParams->getDevice() != 0) + { + if (LMS_SetSampleRateDir(m_deviceShared.m_deviceParams->getDevice(), + LMS_CH_RX, + m_settings.m_devSampleRate, + 1<m_log2OvSRRx = m_settings.m_log2HardDecim; + m_deviceShared.m_deviceParams->m_sampleRate = m_settings.m_devSampleRate; + qDebug("LimeSDRInput::applySettings: set sample rate set to %d with oversampling of %d", + m_settings.m_devSampleRate, + 1<getDevice() != 0) + { + if (LMS_SetLPF(m_deviceShared.m_deviceParams->getDevice(), + LMS_CH_RX, + m_deviceShared.m_channel, + m_settings.m_lpfBW)) + { + qCritical("LimeSDRInput::applySettings: could not set LPF to %f Hz", m_settings.m_lpfBW); + } + else + { + qDebug("LimeSDRInput::applySettings: LPF set to %f Hz", m_settings.m_lpfBW); + } + } + } + + if ((m_settings.m_log2SoftDecim != settings.m_log2SoftDecim) || force) + { + m_settings.m_log2SoftDecim = settings.m_log2SoftDecim; + forwardChangeOwnDSP = true; + + if (m_limeSDRInputThread != 0) + { + m_limeSDRInputThread->setLog2Decimation(m_settings.m_log2SoftDecim); + qDebug() << "LimeSDRInput::applySettings: set soft decimation to " << (1<getDevice() != NULL) + { + if (LMS_SetLOFrequency(m_deviceShared.m_deviceParams->getDevice(), + LMS_CH_RX, + m_deviceShared.m_channel, // same for both channels anyway but switches antenna port automatically + m_settings.m_centerFrequency ) != 0) + { + qDebug("LimeSDRInput::applySettings: LMS_SetLOFrequency(%lu) failed", m_settings.m_centerFrequency); + } + } + } + + if (forwardChangeAllDSP) + { + + } + else if (forwardChangeRxDSP) + { + + } + else if (forwardChangeOwnDSP) + { + int sampleRate = m_settings.m_devSampleRate/(1<<(m_settings.m_log2HardDecim + m_settings.m_log2SoftDecim)); + DSPSignalNotification *notif = new DSPSignalNotification(sampleRate, m_settings.m_centerFrequency); + m_deviceAPI->getDeviceInputMessageQueue()->push(notif); + } + + qDebug() << "LimeSDRInput::applySettings: center freq: " << m_settings.m_centerFrequency << " Hz" + << " device sample rate: " << m_settings.m_devSampleRate << "S/s" + << " Actual sample rate: " << m_settings.m_devSampleRate/(1<addSink(m_fileSink); - connect(m_deviceAPI->getDeviceOutputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleMessagesToUI()), Qt::QueuedConnection); + connect(m_deviceAPI->getDeviceOutputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleMessagesToGUI()), Qt::QueuedConnection); } LimeSDRInputGUI::~LimeSDRInputGUI() @@ -134,13 +134,13 @@ bool LimeSDRInputGUI::deserialize(const QByteArray& data) } } -void LimeSDRInputGUI::handleMessagesToUI() +void LimeSDRInputGUI::handleMessagesToGUI() { Message* message; while ((message = m_deviceAPI->getDeviceOutputMessageQueue()->pop()) != 0) { - qDebug("LimeSDRInputGUI::handleDSPMessages: message: %s", message->getIdentifier()); + qDebug("LimeSDRInputGUI::handleMessagesToGUI: message: %s", message->getIdentifier()); if (DSPSignalNotification::match(*message)) { @@ -173,7 +173,6 @@ void LimeSDRInputGUI::displaySettings() ui->hwDecim->setCurrentIndex(m_settings.m_log2HardDecim); ui->swDecim->setCurrentIndex(m_settings.m_log2SoftDecim); - ui->fcPos->setCurrentIndex((int) m_settings.m_fcPos); ui->lpf->setValue(m_limeSDRInput->getLPIndex(m_settings.m_lpfFIRBW)); ui->lpfText->setText(tr("%1k").arg(QString::number(m_settings.m_lpfFIRBW / 1000.0f, 'f', 0))); @@ -194,7 +193,7 @@ void LimeSDRInputGUI::sendSettings() void LimeSDRInputGUI::updateHardware() { qDebug() << "BladerfGui::updateHardware"; - LimeSDRInput::MsgConfigureLimeSDR* message = LimeSDRInput::MsgConfigureLimeSDR::create( m_settings); + LimeSDRInput::MsgConfigureLimeSDR* message = LimeSDRInput::MsgConfigureLimeSDR::create(m_settings); m_sampleSource->getInputMessageQueue()->push(message); m_updateTimer.stop(); } diff --git a/plugins/samplesource/limesdrinput/limesdrinputgui.h b/plugins/samplesource/limesdrinput/limesdrinputgui.h index c067a2172..332ddd7b8 100644 --- a/plugins/samplesource/limesdrinput/limesdrinputgui.h +++ b/plugins/samplesource/limesdrinput/limesdrinputgui.h @@ -66,7 +66,7 @@ private: void updateSampleRateAndFrequency(); private slots: - void handleMessagesToUI(); + void handleMessagesToGUI(); void on_startStop_toggled(bool checked); void on_record_toggled(bool checked); @@ -76,7 +76,6 @@ private slots: void on_sampleRate_changed(quint64 value); void on_hwDecim_currentIndexChanged(int index); void on_swDecim_currentIndexChanged(int index); - void on_fcPos_currentIndexChanged(int index); void on_lpf_valueChanged(int value); void on_lpFIREnable_toggled(bool checked); void on_lpFIR_changed(quint64 value); diff --git a/plugins/samplesource/limesdrinput/limesdrinputgui.ui b/plugins/samplesource/limesdrinput/limesdrinputgui.ui index 822ef9af6..01d7c5903 100644 --- a/plugins/samplesource/limesdrinput/limesdrinputgui.ui +++ b/plugins/samplesource/limesdrinput/limesdrinputgui.ui @@ -401,35 +401,6 @@ - - - - Fp - - - - - - - Relative position of device center frequency - - - - Inf - - - - - Sup - - - - - Cen - - - -