From 6ed2fbee108eb9fc956aea129094b0f0a766d6dc Mon Sep 17 00:00:00 2001 From: f4exb Date: Sat, 15 Apr 2017 11:45:01 +0200 Subject: [PATCH] LimeSDR support (10) --- .../limesdrinput/limesdrinput.cpp | 25 ++++++ .../samplesource/limesdrinput/limesdrinput.h | 4 + .../limesdrinput/limesdrinputgui.cpp | 85 ++++++++++++++++++ .../limesdrinput/limesdrinputgui.h | 89 +++++++++++++++++++ .../limesdrinput/limesdrinputgui.ui | 2 +- 5 files changed, 204 insertions(+), 1 deletion(-) create mode 100644 plugins/samplesource/limesdrinput/limesdrinputgui.cpp create mode 100644 plugins/samplesource/limesdrinput/limesdrinputgui.h diff --git a/plugins/samplesource/limesdrinput/limesdrinput.cpp b/plugins/samplesource/limesdrinput/limesdrinput.cpp index 9633bbaa8..0bf5be161 100644 --- a/plugins/samplesource/limesdrinput/limesdrinput.cpp +++ b/plugins/samplesource/limesdrinput/limesdrinput.cpp @@ -198,3 +198,28 @@ void LimeSDRInput::stop() m_running = false; } +void LimeSDRInput::getLORange(float& minF, float& maxF, float& stepF) const +{ + lms_range_t range = m_deviceShared.m_deviceParams->m_loRangeRx; + minF = range.min; + maxF = range.max; + stepF = range.step; +} + +void LimeSDRInput::getSRRange(float& minF, float& maxF, float& stepF) const +{ + lms_range_t range = m_deviceShared.m_deviceParams->m_srRangeRx; + minF = range.min; + maxF = range.max; + stepF = range.step; +} + +void LimeSDRInput::getLPRange(float& minF, float& maxF, float& stepF) const +{ + lms_range_t range = m_deviceShared.m_deviceParams->m_lpfRangeRx; + minF = range.min; + maxF = range.max; + stepF = range.step; +} + + diff --git a/plugins/samplesource/limesdrinput/limesdrinput.h b/plugins/samplesource/limesdrinput/limesdrinput.h index 43b155437..c96977225 100644 --- a/plugins/samplesource/limesdrinput/limesdrinput.h +++ b/plugins/samplesource/limesdrinput/limesdrinput.h @@ -41,6 +41,10 @@ public: virtual bool handleMessage(const Message& message); + void getLORange(float& minF, float& maxF, float& stepF) const; + void getSRRange(float& minF, float& maxF, float& stepF) const; + void getLPRange(float& minF, float& maxF, float& stepF) const; + private: DeviceSourceAPI *m_deviceAPI; QMutex m_mutex; diff --git a/plugins/samplesource/limesdrinput/limesdrinputgui.cpp b/plugins/samplesource/limesdrinput/limesdrinputgui.cpp new file mode 100644 index 000000000..fa93e9307 --- /dev/null +++ b/plugins/samplesource/limesdrinput/limesdrinputgui.cpp @@ -0,0 +1,85 @@ +/////////////////////////////////////////////////////////////////////////////////// +// 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 "limesdrinputgui.h" + +#include +#include + +#include "ui_limesdrinputgui.h" +#include "gui/colormapper.h" +#include "gui/glspectrum.h" +#include "dsp/dspengine.h" +#include "dsp/dspcommands.h" +#include "device/devicesourceapi.h" +#include "dsp/filerecord.h" + +LimeSDRInputGUI::LimeSDRInputGUI(DeviceSourceAPI *deviceAPI, QWidget* parent) : + QWidget(parent), + ui(new Ui::BladerfInputGui), + m_deviceAPI(deviceAPI), + m_settings(), + m_sampleSource(0), + m_sampleRate(0), + m_lastEngineState((DSPDeviceSourceEngine::State)-1) +{ + m_limeSDRInput = new LimeSDRInput(m_deviceAPI); + m_sampleSource = (DeviceSampleSource *) m_limeSDRInput; + m_deviceAPI->setSource(m_sampleSource); + + ui->setupUi(this); + + float minF, maxF, stepF; + + m_limeSDRInput->getLORange(minF, maxF, stepF); + ui->centerFrequency->setColorMapper(ColorMapper(ColorMapper::ReverseGold)); + ui->centerFrequency->setValueRange(7, ((uint32_t) minF)/1000, ((uint32_t) maxF)/1000); // frequency dial is in kHz + + m_limeSDRInput->getSRRange(minF, maxF, stepF); + ui->sampleRate->setColorMapper(ColorMapper(ColorMapper::ReverseGreenYellow)); + ui->sampleRate->setValueRange(8, (uint32_t) minF, (uint32_t) maxF); + + m_limeSDRInput->getLPRange(minF, maxF, stepF); + int minLP = (int) (minF / stepF); + int maxLP = (int) (maxF / stepF); + int nbSteps = (int) ((maxF - minF) / stepF); + ui->lpf->setMinimum(minLP); + ui->lpf->setMaximum(maxLP); + + connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(updateHardware())); + connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus())); + m_statusTimer.start(500); + + displaySettings(); + + char recFileNameCStr[30]; + sprintf(recFileNameCStr, "test_%d.sdriq", m_deviceAPI->getDeviceUID()); + m_fileSink = new FileRecord(std::string(recFileNameCStr)); + m_deviceAPI->addSink(m_fileSink); + + connect(m_deviceAPI->getDeviceOutputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleDSPMessages()), Qt::QueuedConnection); +} + +LimeSDRInputGUI::~LimeSDRInputGUI() +{ + m_deviceAPI->removeSink(m_fileSink); + delete m_fileSink; + delete m_sampleSource; // Valgrind memcheck + delete ui; +} + + + diff --git a/plugins/samplesource/limesdrinput/limesdrinputgui.h b/plugins/samplesource/limesdrinput/limesdrinputgui.h new file mode 100644 index 000000000..c8bc2a581 --- /dev/null +++ b/plugins/samplesource/limesdrinput/limesdrinputgui.h @@ -0,0 +1,89 @@ +/////////////////////////////////////////////////////////////////////////////////// +// 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 PLUGINS_SAMPLESOURCE_LIMESDRINPUT_LIMESDRINPUTGUI_H_ +#define PLUGINS_SAMPLESOURCE_LIMESDRINPUT_LIMESDRINPUTGUI_H_ + +#include +#include "plugin/plugingui.h" + +#include "limesdrinput.h" + +class DeviceSourceAPI; +class FileRecord; + +namespace Ui { + class LimeSDRInputGui; +} + +class LimeSDRInputGUI : public QWidget, public PluginGUI { + Q_OBJECT + +public: + explicit LimeSDRInputGUI(DeviceSourceAPI *deviceAPI, QWidget* parent = 0); + virtual ~LimeSDRInputGUI(); + void destroy(); + + void setName(const QString& name); + QString getName() const; + + void resetToDefaults(); + virtual qint64 getCenterFrequency() const; + virtual void setCenterFrequency(qint64 centerFrequency); + QByteArray serialize() const; + bool deserialize(const QByteArray& data); + virtual bool handleMessage(const Message& message); + +private: + Ui::LimeSDRInputGui* ui; + + DeviceSourceAPI* m_deviceAPI; + LimeSDRInput* m_limeSDRInput; //!< Same object as above but gives easy access to LimeSDRInput methods and attributes that are used intensively + LimeSDRInputSettings m_settings; + QTimer m_updateTimer; + QTimer m_statusTimer; + DeviceSampleSource* m_sampleSource; + FileRecord *m_fileSink; //!< File sink to record device I/Q output + int m_sampleRate; + quint64 m_deviceCenterFrequency; //!< Center frequency in device + int m_lastEngineState; + + void displaySettings(); + void sendSettings(); + void updateSampleRateAndFrequency(); + +private slots: + void handleDSPMessages(); + + void on_startStop_toggled(bool checked); + void on_record_toggled(bool checked); + void on_centerFrequency_changed(quint64 value); + void on_dcOffset_toggled(bool checked); + void on_iqImbalance_toggled(bool checked); + 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); + void on_gain_valueChanged(int value); + + void updateHardware(); + void updateStatus(); +}; + +#endif /* PLUGINS_SAMPLESOURCE_LIMESDRINPUT_LIMESDRINPUTGUI_H_ */ diff --git a/plugins/samplesource/limesdrinput/limesdrinputgui.ui b/plugins/samplesource/limesdrinput/limesdrinputgui.ui index e3fcebae2..bd8921974 100644 --- a/plugins/samplesource/limesdrinput/limesdrinputgui.ui +++ b/plugins/samplesource/limesdrinput/limesdrinputgui.ui @@ -287,7 +287,7 @@ - + 50