SoapySDR support: input: tunable elements GUIs

pull/263/head
f4exb 2018-11-05 17:27:32 +01:00
rodzic 52e9a72098
commit 0f14527039
11 zmienionych plików z 163 dodań i 13 usunięć

Wyświetl plik

@ -201,6 +201,12 @@ const SoapySDR::RangeList& SoapySDROutput::getBandwidthRanges()
return channelSettings->m_bandwidthsRanges; return channelSettings->m_bandwidthsRanges;
} }
const std::vector<DeviceSoapySDRParams::FrequencySetting>& SoapySDROutput::getTunableElements()
{
const DeviceSoapySDRParams::ChannelSettings* channelSettings = m_deviceShared.m_deviceParams->getTxChannelSettings(m_deviceShared.m_channel);
return channelSettings->m_frequencySettings;
}
void SoapySDROutput::init() void SoapySDROutput::init()
{ {
applySettings(m_settings, true); applySettings(m_settings, true);

Wyświetl plik

@ -103,6 +103,7 @@ public:
const SoapySDR::RangeList& getRateRanges(); const SoapySDR::RangeList& getRateRanges();
const std::vector<std::string>& getAntennas(); const std::vector<std::string>& getAntennas();
const SoapySDR::RangeList& getBandwidthRanges(); const SoapySDR::RangeList& getBandwidthRanges();
const std::vector<DeviceSoapySDRParams::FrequencySetting>& getTunableElements();
private: private:
DeviceSinkAPI *m_deviceAPI; DeviceSinkAPI *m_deviceAPI;

Wyświetl plik

@ -233,6 +233,12 @@ int SoapySDRInput::getAntennaIndex(const std::string& antenna)
} }
} }
const std::vector<DeviceSoapySDRParams::FrequencySetting>& SoapySDRInput::getTunableElements()
{
const DeviceSoapySDRParams::ChannelSettings* channelSettings = m_deviceShared.m_deviceParams->getRxChannelSettings(m_deviceShared.m_channel);
return channelSettings->m_frequencySettings;
}
void SoapySDRInput::init() void SoapySDRInput::init()
{ {
applySettings(m_settings, true); applySettings(m_settings, true);

Wyświetl plik

@ -125,6 +125,7 @@ public:
const SoapySDR::RangeList& getRateRanges(); const SoapySDR::RangeList& getRateRanges();
const SoapySDR::RangeList& getBandwidthRanges(); const SoapySDR::RangeList& getBandwidthRanges();
int getAntennaIndex(const std::string& antenna); int getAntennaIndex(const std::string& antenna);
const std::vector<DeviceSoapySDRParams::FrequencySetting>& getTunableElements();
private: private:
DeviceSourceAPI *m_deviceAPI; DeviceSourceAPI *m_deviceAPI;

Wyświetl plik

@ -24,6 +24,8 @@
#include "gui/glspectrum.h" #include "gui/glspectrum.h"
#include "soapygui/discreterangegui.h" #include "soapygui/discreterangegui.h"
#include "soapygui/intervalrangegui.h" #include "soapygui/intervalrangegui.h"
#include "soapygui/stringrangegui.h"
#include "soapygui/dynamicitemsettinggui.h"
#include "ui_soapysdrinputgui.h" #include "ui_soapysdrinputgui.h"
#include "soapysdrinputgui.h" #include "soapysdrinputgui.h"
@ -52,6 +54,7 @@ SoapySDRInputGui::SoapySDRInputGui(DeviceUISet *deviceUISet, QWidget* parent) :
createAntennasControl(m_sampleSource->getAntennas()); createAntennasControl(m_sampleSource->getAntennas());
createRangesControl(&m_sampleRateGUI, m_sampleSource->getRateRanges(), "SR", "S/s"); createRangesControl(&m_sampleRateGUI, m_sampleSource->getRateRanges(), "SR", "S/s");
createRangesControl(&m_bandwidthGUI, m_sampleSource->getBandwidthRanges(), "BW", "Hz"); createRangesControl(&m_bandwidthGUI, m_sampleSource->getBandwidthRanges(), "BW", "Hz");
createTunableElementsControl(m_sampleSource->getTunableElements());
if (m_sampleRateGUI) { if (m_sampleRateGUI) {
connect(m_sampleRateGUI, SIGNAL(valueChanged(double)), this, SLOT(sampleRateChanged(double))); connect(m_sampleRateGUI, SIGNAL(valueChanged(double)), this, SLOT(sampleRateChanged(double)));
@ -156,6 +159,24 @@ void SoapySDRInputGui::createAntennasControl(const std::vector<std::string>& ant
connect(m_antennas, SIGNAL(valueChanged()), this, SLOT(antennasChanged())); connect(m_antennas, SIGNAL(valueChanged()), this, SLOT(antennasChanged()));
} }
void SoapySDRInputGui::createTunableElementsControl(const std::vector<DeviceSoapySDRParams::FrequencySetting>& tunableElementsList)
{
if (tunableElementsList.size() <= 1) { // This list is created for other elements than the main one (RF) which is always at index 0
return;
}
std::vector<DeviceSoapySDRParams::FrequencySetting>::const_iterator it = tunableElementsList.begin() + 1;
for (int i = 0; it != tunableElementsList.end(); ++it, i++)
{
ItemSettingGUI *rangeGUI;
createRangesControl(&rangeGUI, it->m_ranges, QString("%1 freq").arg(it->m_name.c_str()), QString("Hz"));
DynamicItemSettingGUI *gui = new DynamicItemSettingGUI(rangeGUI, QString(it->m_name.c_str()));
m_tunableElementsGUIs.push_back(gui);
connect(m_tunableElementsGUIs.back(), SIGNAL(valueChanged(QString, double)), this, SLOT(tunableElementChanged(QString, double)));
}
}
void SoapySDRInputGui::setName(const QString& name) void SoapySDRInputGui::setName(const QString& name)
{ {
setObjectName(name); setObjectName(name);
@ -278,6 +299,11 @@ void SoapySDRInputGui::bandwidthChanged(double bandwidth)
sendSettings(); sendSettings();
} }
void SoapySDRInputGui::tunableElementChanged(QString name, double value)
{
qDebug("SoapySDRInputGui::tunableElementChanged: name: %s value: %lf", name.toStdString().c_str(), value);
}
void SoapySDRInputGui::on_centerFrequency_changed(quint64 value) void SoapySDRInputGui::on_centerFrequency_changed(quint64 value)
{ {
m_settings.m_centerFrequency = value * 1000; m_settings.m_centerFrequency = value * 1000;

Wyświetl plik

@ -17,18 +17,19 @@
#ifndef PLUGINS_SAMPLESOURCE_SOAPYSDRINPUT_SOAPYSDRINPUTGUI_H_ #ifndef PLUGINS_SAMPLESOURCE_SOAPYSDRINPUT_SOAPYSDRINPUTGUI_H_
#define PLUGINS_SAMPLESOURCE_SOAPYSDRINPUT_SOAPYSDRINPUTGUI_H_ #define PLUGINS_SAMPLESOURCE_SOAPYSDRINPUT_SOAPYSDRINPUTGUI_H_
#include <soapygui/stringrangegui.h>
#include <QTimer> #include <QTimer>
#include <QWidget> #include <QWidget>
#include <QComboBox> #include <QComboBox>
#include "plugin/plugininstancegui.h" #include "plugin/plugininstancegui.h"
#include "util/messagequeue.h" #include "util/messagequeue.h"
#include "soapysdrinput.h" #include "soapysdrinput.h"
class DeviceUISet; class DeviceUISet;
class ItemSettingGUI; class ItemSettingGUI;
class StringRangeGUI; class StringRangeGUI;
class DynamicItemSettingGUI;
namespace Ui { namespace Ui {
class SoapySDRInputGui; class SoapySDRInputGui;
@ -60,6 +61,7 @@ private:
const QString& text, const QString& text,
const QString& unit); const QString& unit);
void createAntennasControl(const std::vector<std::string>& antennaList); void createAntennasControl(const std::vector<std::string>& antennaList);
void createTunableElementsControl(const std::vector<DeviceSoapySDRParams::FrequencySetting>& tunableElementsList);
Ui::SoapySDRInputGui* ui; Ui::SoapySDRInputGui* ui;
@ -78,6 +80,7 @@ private:
StringRangeGUI *m_antennas; StringRangeGUI *m_antennas;
ItemSettingGUI *m_sampleRateGUI; ItemSettingGUI *m_sampleRateGUI;
ItemSettingGUI *m_bandwidthGUI; ItemSettingGUI *m_bandwidthGUI;
std::vector<DynamicItemSettingGUI*> m_tunableElementsGUIs;
void displaySettings(); void displaySettings();
void sendSettings(); void sendSettings();
@ -90,6 +93,7 @@ private slots:
void handleInputMessages(); void handleInputMessages();
void sampleRateChanged(double sampleRate); void sampleRateChanged(double sampleRate);
void antennasChanged(); void antennasChanged();
void tunableElementChanged(QString name, double value);
void bandwidthChanged(double bandwidth); void bandwidthChanged(double bandwidth);
void on_centerFrequency_changed(quint64 value); void on_centerFrequency_changed(quint64 value);
void on_LOppm_valueChanged(int value); void on_LOppm_valueChanged(int value);

Wyświetl plik

@ -14,6 +14,8 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. // // along with this program. If not, see <http://www.gnu.org/licenses/>. //
/////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////
#include <QDataStream>
#include "util/simpleserializer.h" #include "util/simpleserializer.h"
#include "soapysdrinputsettings.h" #include "soapysdrinputsettings.h"
@ -53,6 +55,7 @@ QByteArray SoapySDRInputSettings::serialize() const
s.writeS64(8, m_transverterDeltaFrequency); s.writeS64(8, m_transverterDeltaFrequency);
s.writeString(9, m_antenna); s.writeString(9, m_antenna);
s.writeU32(10, m_bandwidth); s.writeU32(10, m_bandwidth);
s.writeBlob(11, serializeNamedElementMap(m_tunableElements));
return s.final(); return s.final();
} }
@ -70,6 +73,7 @@ bool SoapySDRInputSettings::deserialize(const QByteArray& data)
if (d.getVersion() == 1) if (d.getVersion() == 1)
{ {
int intval; int intval;
QByteArray blob;
d.readS32(1, &m_devSampleRate, 1024000); d.readS32(1, &m_devSampleRate, 1024000);
d.readU32(2, &m_log2Decim); d.readU32(2, &m_log2Decim);
@ -82,6 +86,8 @@ bool SoapySDRInputSettings::deserialize(const QByteArray& data)
d.readS64(8, &m_transverterDeltaFrequency, 0); d.readS64(8, &m_transverterDeltaFrequency, 0);
d.readString(9, &m_antenna, "NONE"); d.readString(9, &m_antenna, "NONE");
d.readU32(10, &m_bandwidth, 1000000); d.readU32(10, &m_bandwidth, 1000000);
d.readBlob(11, &blob);
deserializeNamedElementMap(blob, m_tunableElements);
return true; return true;
} }
@ -91,3 +97,20 @@ bool SoapySDRInputSettings::deserialize(const QByteArray& data)
return false; return false;
} }
} }
QByteArray SoapySDRInputSettings::serializeNamedElementMap(const QMap<QString, double>& map) const
{
QByteArray data;
QDataStream *stream = new QDataStream(&data, QIODevice::WriteOnly);
(*stream) << map;
delete stream;
return data;
}
void SoapySDRInputSettings::deserializeNamedElementMap(const QByteArray& data, QMap<QString, double>& map)
{
QDataStream *stream = new QDataStream(data);
(*stream) >> map;
delete stream;
}

Wyświetl plik

@ -19,6 +19,7 @@
#include <QtGlobal> #include <QtGlobal>
#include <QString> #include <QString>
#include <QMap>
struct SoapySDRInputSettings { struct SoapySDRInputSettings {
typedef enum { typedef enum {
@ -39,11 +40,16 @@ struct SoapySDRInputSettings {
QString m_fileRecordName; QString m_fileRecordName;
QString m_antenna; QString m_antenna;
quint32 m_bandwidth; quint32 m_bandwidth;
QMap<QString, double> m_tunableElements;
SoapySDRInputSettings(); SoapySDRInputSettings();
void resetToDefaults(); void resetToDefaults();
QByteArray serialize() const; QByteArray serialize() const;
bool deserialize(const QByteArray& data); bool deserialize(const QByteArray& data);
private:
QByteArray serializeNamedElementMap(const QMap<QString, double>& map) const;
void deserializeNamedElementMap(const QByteArray& data, QMap<QString, double>& map);
}; };
#endif /* PLUGINS_SAMPLESOURCE_SOAPYSDRINPUT_SOAPYSDRINPUTSETTINGS_H_ */ #endif /* PLUGINS_SAMPLESOURCE_SOAPYSDRINPUT_SOAPYSDRINPUTSETTINGS_H_ */

Wyświetl plik

@ -45,20 +45,21 @@ set(sdrgui_SOURCES
gui/tvscreen.cpp gui/tvscreen.cpp
gui/valuedial.cpp gui/valuedial.cpp
gui/valuedialz.cpp gui/valuedialz.cpp
dsp/scopevis.cpp dsp/scopevis.cpp
dsp/scopevismulti.cpp dsp/scopevismulti.cpp
dsp/scopevisxy.cpp dsp/scopevisxy.cpp
dsp/spectrumvis.cpp dsp/spectrumvis.cpp
dsp/spectrumscopecombovis.cpp dsp/spectrumscopecombovis.cpp
device/deviceuiset.cpp device/deviceuiset.cpp
soapygui/discreterangegui.cpp soapygui/discreterangegui.cpp
soapygui/intervalrangegui.cpp soapygui/intervalrangegui.cpp
soapygui/itemsettinggui.cpp soapygui/itemsettinggui.cpp
soapygui/stringrangegui.cpp soapygui/stringrangegui.cpp
soapygui/dynamicitemsettinggui.cpp
webapi/webapiadaptergui.cpp webapi/webapiadaptergui.cpp
) )
@ -92,7 +93,7 @@ set(sdrgui_HEADERS
gui/glspectrumgui.h gui/glspectrumgui.h
gui/indicator.h gui/indicator.h
gui/levelmeter.h gui/levelmeter.h
gui/loggingdialog.h gui/loggingdialog.h
gui/mypositiondialog.h gui/mypositiondialog.h
gui/physicalunit.h gui/physicalunit.h
gui/pluginsdialog.h gui/pluginsdialog.h
@ -104,23 +105,24 @@ set(sdrgui_HEADERS
gui/tickedslider.h gui/tickedslider.h
gui/transverterbutton.h gui/transverterbutton.h
gui/transverterdialog.h gui/transverterdialog.h
gui/tvscreen.h gui/tvscreen.h
gui/valuedial.h gui/valuedial.h
gui/valuedialz.h gui/valuedialz.h
dsp/scopevis.h dsp/scopevis.h
dsp/scopevismulti.h dsp/scopevismulti.h
dsp/scopevisxy.h dsp/scopevisxy.h
dsp/spectrumvis.h dsp/spectrumvis.h
dsp/spectrumscopecombovis.h dsp/spectrumscopecombovis.h
device/deviceuiset.h device/deviceuiset.h
soapygui/discreterangegui.h soapygui/discreterangegui.h
soapygui/intervalrangegui.h soapygui/intervalrangegui.h
soapygui/itemsettinggui.h soapygui/itemsettinggui.h
soapygui/stringrangegui.h soapygui/stringrangegui.h
soapygui/dynamicitemsettinggui.h
webapi/webapiadaptergui.h webapi/webapiadaptergui.h
) )
@ -180,7 +182,7 @@ include_directories(
${CMAKE_SOURCE_DIR}/sdrbase ${CMAKE_SOURCE_DIR}/sdrbase
${CMAKE_SOURCE_DIR}/logging ${CMAKE_SOURCE_DIR}/logging
${CMAKE_SOURCE_DIR}/httpserver ${CMAKE_SOURCE_DIR}/httpserver
${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client ${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client
${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}
${OPENGL_INCLUDE_DIR} ${OPENGL_INCLUDE_DIR}
) )

Wyświetl plik

@ -0,0 +1,34 @@
///////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2018 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 <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////
#include "dynamicitemsettinggui.h"
DynamicItemSettingGUI::DynamicItemSettingGUI(ItemSettingGUI *itemSettingGUI, const QString& name, QObject *parent) :
QObject(parent),
m_itemSettingGUI(itemSettingGUI),
m_name(name)
{
connect(m_itemSettingGUI, SIGNAL(valueChanged(double)), this, SLOT(processValueChanged(double)));
}
DynamicItemSettingGUI::~DynamicItemSettingGUI()
{
disconnect(m_itemSettingGUI, SIGNAL(valueChanged(double)), this, SLOT(processValueChanged(double)));
}
void DynamicItemSettingGUI::processValueChanged(double value) {
emit valueChanged(m_name, value);
}

Wyświetl plik

@ -0,0 +1,41 @@
///////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2018 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 <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////
#include <QObject>
#include <QString>
#include "itemsettinggui.h"
class DynamicItemSettingGUI : public QObject
{
Q_OBJECT
public:
DynamicItemSettingGUI(ItemSettingGUI *itemSettingGUI, const QString& name, QObject *parent = 0);
~DynamicItemSettingGUI();
const QString& getName() const { return m_name; }
double getValue() const { return m_itemSettingGUI->getCurrentValue(); }
signals:
void valueChanged(QString itemName, double value);
private slots:
void processValueChanged(double value);
private:
ItemSettingGUI *m_itemSettingGUI;
QString m_name;
};