mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-11-25 01:18:38 -05:00
Added possibility to specify devices that cannot be discovered automatically. This implements #445
This commit is contained in:
parent
8d2f65f967
commit
d0858f21fb
@ -1,3 +1,10 @@
|
||||
sdrangel (4.12.3-1) unstable; urgency=medium
|
||||
|
||||
* Added possibility to specify devices that cannot be discovered automatically
|
||||
* Server: fixed sink device set creation and added MIMO creation
|
||||
|
||||
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Sun, 15 Dec 2019 23:14:22 +0100
|
||||
|
||||
sdrangel (4.12.2-1) unstable; urgency=medium
|
||||
|
||||
* Refactoring of Rx channels code with better separation of concerns
|
||||
|
@ -18,7 +18,7 @@ set(CMAKE_CXX_EXTENSIONS OFF)
|
||||
# configure version
|
||||
set(sdrangel_VERSION_MAJOR "4")
|
||||
set(sdrangel_VERSION_MINOR "12")
|
||||
set(sdrangel_VERSION_PATCH "2")
|
||||
set(sdrangel_VERSION_PATCH "3")
|
||||
set(sdrangel_VERSION_SUFFIX "")
|
||||
|
||||
# SDRAngel cmake options
|
||||
|
9
debian/changelog
vendored
9
debian/changelog
vendored
@ -1,3 +1,10 @@
|
||||
sdrangel (4.12.3-1) unstable; urgency=medium
|
||||
|
||||
* Added possibility to specify devices that cannot be discovered automatically
|
||||
* Server: fixed sink device set creation and added MIMO creation
|
||||
|
||||
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Sun, 15 Dec 2019 23:14:22 +0100
|
||||
|
||||
sdrangel (4.12.2-1) unstable; urgency=medium
|
||||
|
||||
* Refactoring of Rx channels code with better separation of concerns
|
||||
@ -6,7 +13,7 @@ sdrangel (4.12.2-1) unstable; urgency=medium
|
||||
* Remote Sink and Remote Output: refactoring of UDP blocks handling
|
||||
* NFMDemod: fixed setSelectedCtcssIndex method
|
||||
|
||||
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Fri, 14 Dec 2019 06:14:22 +0100
|
||||
-- Edouard Griffiths, F4EXB <f4exb06@gmail.com> Sat, 14 Dec 2019 06:14:22 +0100
|
||||
|
||||
sdrangel (4.12.1-1) unstable; urgency=medium
|
||||
|
||||
|
@ -31,11 +31,17 @@ DevicePlutoSDRParams::~DevicePlutoSDRParams()
|
||||
bool DevicePlutoSDRParams::open(const std::string& serial)
|
||||
{
|
||||
m_box = DevicePlutoSDR::instance().getDeviceFromSerial(serial);
|
||||
return m_box != 0;
|
||||
return m_box != nullptr;
|
||||
}
|
||||
|
||||
bool DevicePlutoSDRParams::openURI(const std::string& uri)
|
||||
{
|
||||
m_box = DevicePlutoSDR::instance().getDeviceFromURI(uri);
|
||||
return m_box != nullptr;
|
||||
}
|
||||
|
||||
void DevicePlutoSDRParams::close()
|
||||
{
|
||||
delete m_box;
|
||||
m_box = 0;
|
||||
m_box = nullptr;
|
||||
}
|
||||
|
@ -38,6 +38,7 @@ public:
|
||||
~DevicePlutoSDRParams();
|
||||
|
||||
bool open(const std::string& serial);
|
||||
bool openURI(const std::string& uri);
|
||||
void close();
|
||||
|
||||
DevicePlutoSDRBox *getBox() { return m_box; }
|
||||
|
@ -50,18 +50,6 @@ void DevicePlutoSDRScan::scan()
|
||||
|
||||
m_scans.clear();
|
||||
|
||||
if (num_contexts == 0)
|
||||
{
|
||||
struct iio_context *ctx = iio_create_network_context("pluto.local");
|
||||
if(!ctx) {
|
||||
return;
|
||||
}
|
||||
m_scans.push_back({std::string("PlutoSDR"), std::string("networked"), std::string("ip:pluto.local")});
|
||||
m_serialMap[m_scans.back().m_serial] = &m_scans.back();
|
||||
m_urilMap[m_scans.back().m_uri] = &m_scans.back();
|
||||
iio_context_destroy(ctx);
|
||||
}
|
||||
|
||||
for (i = 0; i < num_contexts; i++)
|
||||
{
|
||||
const char *description = iio_context_info_get_description(info[i]);
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 58 KiB |
Binary file not shown.
@ -35,8 +35,8 @@ const char *fcd_traits<ProPlus>::displayedName = "FunCube Dongle Pro+";
|
||||
const char *fcd_traits<Pro>::pluginDisplayedName = "FunCube Pro Input";
|
||||
const char *fcd_traits<ProPlus>::pluginDisplayedName = "FunCube Pro+ Input";
|
||||
|
||||
const char *fcd_traits<Pro>::pluginVersion = "4.11.10";
|
||||
const char *fcd_traits<ProPlus>::pluginVersion = "4.11.10";
|
||||
const char *fcd_traits<Pro>::pluginVersion = "4.12.3";
|
||||
const char *fcd_traits<ProPlus>::pluginVersion = "4.12.3";
|
||||
|
||||
const int64_t fcd_traits<Pro>::loLowLimitFreq = 64000000L;
|
||||
const int64_t fcd_traits<ProPlus>::loLowLimitFreq = 150000L;
|
||||
|
@ -24,8 +24,9 @@
|
||||
#include "chanalyzerwebapiadapter.h"
|
||||
|
||||
const PluginDescriptor ChannelAnalyzerPlugin::m_pluginDescriptor = {
|
||||
ChannelAnalyzer::m_channelId,
|
||||
QString("Channel Analyzer"),
|
||||
QString("4.12.2"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -9,8 +9,9 @@
|
||||
#include "amdemodplugin.h"
|
||||
|
||||
const PluginDescriptor AMDemodPlugin::m_pluginDescriptor = {
|
||||
AMDemod::m_channelId,
|
||||
QString("AM Demodulator"),
|
||||
QString("4.12.2"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -28,8 +28,9 @@
|
||||
|
||||
const PluginDescriptor ATVDemodPlugin::m_ptrPluginDescriptor =
|
||||
{
|
||||
ATVDemod::m_channelId,
|
||||
QString("ATV Demodulator"),
|
||||
QString("4.12.2"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) F4HKW for F4EXB / SDRAngel"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -29,8 +29,9 @@
|
||||
#include "bfmplugin.h"
|
||||
|
||||
const PluginDescriptor BFMPlugin::m_pluginDescriptor = {
|
||||
BFMDemod::m_channelId,
|
||||
QString("Broadcast FM Demodulator"),
|
||||
QString("4.12.2"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -28,8 +28,9 @@
|
||||
|
||||
const PluginDescriptor DATVDemodPlugin::m_ptrPluginDescriptor =
|
||||
{
|
||||
DATVDemod::m_channelId,
|
||||
QString("DATV Demodulator"),
|
||||
QString("4.11.6"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) F4HKW for SDRAngel using LeanSDR framework (c) F4DAV"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -28,8 +28,9 @@
|
||||
#include "dsddemodplugin.h"
|
||||
|
||||
const PluginDescriptor DSDDemodPlugin::m_pluginDescriptor = {
|
||||
DSDDemod::m_channelId,
|
||||
QString("DSD Demodulator"),
|
||||
QString("4.12.0"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -26,8 +26,9 @@
|
||||
#include "freedvplugin.h"
|
||||
|
||||
const PluginDescriptor FreeDVPlugin::m_pluginDescriptor = {
|
||||
FreeDVDemod::m_channelId,
|
||||
QString("FreeDV Demodulator"),
|
||||
QString("4.12.2"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -6,8 +6,9 @@
|
||||
#include "lorademod.h"
|
||||
|
||||
const PluginDescriptor LoRaPlugin::m_pluginDescriptor = {
|
||||
LoRaDemod::m_channelId,
|
||||
QString("LoRa Demodulator"),
|
||||
QString("4.12.2"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) 2015 John Greb"),
|
||||
QString("http://www.maintech.de"),
|
||||
true,
|
||||
|
@ -10,8 +10,9 @@
|
||||
#include "nfmplugin.h"
|
||||
|
||||
const PluginDescriptor NFMPlugin::m_pluginDescriptor = {
|
||||
NFMDemod::m_channelId,
|
||||
QString("NFM Demodulator"),
|
||||
QString("4.12.2"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -10,8 +10,9 @@
|
||||
#include "ssbplugin.h"
|
||||
|
||||
const PluginDescriptor SSBPlugin::m_pluginDescriptor = {
|
||||
SSBDemod::m_channelId,
|
||||
QString("SSB Demodulator"),
|
||||
QString("4.12.2"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -11,8 +11,9 @@
|
||||
#include "wfmplugin.h"
|
||||
|
||||
const PluginDescriptor WFMPlugin::m_pluginDescriptor = {
|
||||
WFMDemod::m_channelId,
|
||||
QString("WFM Demodulator"),
|
||||
QString("4.12.2"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -26,8 +26,9 @@
|
||||
#include "freqtrackerplugin.h"
|
||||
|
||||
const PluginDescriptor FreqTrackerPlugin::m_pluginDescriptor = {
|
||||
FreqTracker::m_channelId,
|
||||
QString("Frequency Tracker"),
|
||||
QString("4.12.2"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -28,8 +28,9 @@
|
||||
#include "localsinkplugin.h"
|
||||
|
||||
const PluginDescriptor LocalSinkPlugin::m_pluginDescriptor = {
|
||||
LocalSink::m_channelId,
|
||||
QString("Local channel sink"),
|
||||
QString("4.12.2"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -28,8 +28,9 @@
|
||||
#include "remotesinkplugin.h"
|
||||
|
||||
const PluginDescriptor RemoteSinkPlugin::m_pluginDescriptor = {
|
||||
RemoteSink::m_channelId,
|
||||
QString("Remote channel sink"),
|
||||
QString("4.11.6"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -27,8 +27,9 @@
|
||||
#include "udpsinkplugin.h"
|
||||
|
||||
const PluginDescriptor UDPSinkPlugin::m_pluginDescriptor = {
|
||||
UDPSink::m_channelId,
|
||||
QString("UDP Channel Sink"),
|
||||
QString("4.12.2"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -26,8 +26,9 @@
|
||||
#include "filesourceplugin.h"
|
||||
|
||||
const PluginDescriptor FileSourcePlugin::m_pluginDescriptor = {
|
||||
FileSource::m_channelId,
|
||||
QString("File channel source"),
|
||||
QString("4.12.1"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -28,8 +28,9 @@
|
||||
#include "localsourceplugin.h"
|
||||
|
||||
const PluginDescriptor LocalSourcePlugin::m_pluginDescriptor = {
|
||||
LocalSource::m_channelId,
|
||||
QString("Local channel source"),
|
||||
QString("4.12.2"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -26,8 +26,9 @@
|
||||
#include "ammodplugin.h"
|
||||
|
||||
const PluginDescriptor AMModPlugin::m_pluginDescriptor = {
|
||||
AMMod::m_channelId,
|
||||
QString("AM Modulator"),
|
||||
QString("4.12.2"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -26,8 +26,9 @@
|
||||
#include "atvmodplugin.h"
|
||||
|
||||
const PluginDescriptor ATVModPlugin::m_pluginDescriptor = {
|
||||
ATVMod::m_channelId,
|
||||
QString("ATV Modulator"),
|
||||
QString("4.12.2"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -26,8 +26,9 @@
|
||||
#include "freedvmodplugin.h"
|
||||
|
||||
const PluginDescriptor FreeDVModPlugin::m_pluginDescriptor = {
|
||||
FreeDVMod::m_channelId,
|
||||
QString("FreeDV Modulator"),
|
||||
QString("4.12.2"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -26,8 +26,9 @@
|
||||
#include "nfmmodplugin.h"
|
||||
|
||||
const PluginDescriptor NFMModPlugin::m_pluginDescriptor = {
|
||||
NFMMod::m_channelId,
|
||||
QString("NFM Modulator"),
|
||||
QString("4.12.2"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -26,8 +26,9 @@
|
||||
#include "ssbmodplugin.h"
|
||||
|
||||
const PluginDescriptor SSBModPlugin::m_pluginDescriptor = {
|
||||
SSBMod::m_channelId,
|
||||
QString("SSB Modulator"),
|
||||
QString("4.12.2"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -26,8 +26,9 @@
|
||||
#include "wfmmodplugin.h"
|
||||
|
||||
const PluginDescriptor WFMModPlugin::m_pluginDescriptor = {
|
||||
WFMMod::m_channelId,
|
||||
QString("WFM Modulator"),
|
||||
QString("4.12.2"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -26,8 +26,9 @@
|
||||
#include "remotesourceplugin.h"
|
||||
|
||||
const PluginDescriptor RemoteSourcePlugin::m_pluginDescriptor = {
|
||||
RemoteSource::m_channelId,
|
||||
QString("Remote channel source"),
|
||||
QString("4.12.1"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -29,8 +29,9 @@
|
||||
#include "udpsourceplugin.h"
|
||||
|
||||
const PluginDescriptor UDPSourcePlugin::m_pluginDescriptor = {
|
||||
UDPSource::m_channelId,
|
||||
QString("UDP Channel Source"),
|
||||
QString("4.12.2"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -29,8 +29,9 @@
|
||||
#include "testmiwebapiadapter.h"
|
||||
|
||||
const PluginDescriptor TestMIPlugin::m_pluginDescriptor = {
|
||||
QString("TestMI"),
|
||||
QString("Test Multiple Input"),
|
||||
QString("4.11.10"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -30,8 +30,9 @@
|
||||
#endif
|
||||
|
||||
const PluginDescriptor Bladerf1OutputPlugin::m_pluginDescriptor = {
|
||||
QString("BladeRF1"),
|
||||
QString("BladeRF1 Output"),
|
||||
QString("4.12.0"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -30,8 +30,9 @@
|
||||
#endif
|
||||
|
||||
const PluginDescriptor BladeRF2OutputPlugin::m_pluginDescriptor = {
|
||||
QString("BladeRF2"),
|
||||
QString("BladeRF2 Output"),
|
||||
QString("4.12.0"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -28,8 +28,9 @@
|
||||
#include "filesinkplugin.h"
|
||||
|
||||
const PluginDescriptor FileSinkPlugin::m_pluginDescriptor = {
|
||||
QString("FileSink"),
|
||||
QString("File sink output"),
|
||||
QString("4.12.0"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -30,8 +30,9 @@
|
||||
#include "hackrfoutputwebapiadapter.h"
|
||||
|
||||
const PluginDescriptor HackRFOutputPlugin::m_pluginDescriptor = {
|
||||
QString("HackRF"),
|
||||
QString("HackRF Output"),
|
||||
QString("4.12.0"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -33,8 +33,9 @@
|
||||
#include "limesdroutputwebapiadapter.h"
|
||||
|
||||
const PluginDescriptor LimeSDROutputPlugin::m_pluginDescriptor = {
|
||||
QString("LimeSDR"),
|
||||
QString("LimeSDR Output"),
|
||||
QString("4.12.0"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -29,8 +29,9 @@
|
||||
#include "localoutputwebapiadapter.h"
|
||||
|
||||
const PluginDescriptor LocalOutputPlugin::m_pluginDescriptor = {
|
||||
QString("LocalOutput"),
|
||||
QString("Local device output"),
|
||||
QString("4.12.0"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -259,11 +259,31 @@ bool PlutoSDROutput::openDevice()
|
||||
else
|
||||
{
|
||||
qDebug("PlutoSDROutput::openDevice: open device here");
|
||||
|
||||
m_deviceShared.m_deviceParams = new DevicePlutoSDRParams();
|
||||
char serial[256];
|
||||
strcpy(serial, qPrintable(m_deviceAPI->getSamplingDeviceSerial()));
|
||||
m_deviceShared.m_deviceParams->open(serial);
|
||||
|
||||
if (m_deviceAPI->getHardwareUserArguments().size() != 0)
|
||||
{
|
||||
QStringList kv = m_deviceAPI->getHardwareUserArguments().split('='); // expecting "uri=xxx"
|
||||
|
||||
if (kv.size() > 1)
|
||||
{
|
||||
if (kv.at(0) == "uri") {
|
||||
m_deviceShared.m_deviceParams->openURI(kv.at(1).toStdString());
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
char serial[256];
|
||||
strcpy(serial, qPrintable(m_deviceAPI->getSamplingDeviceSerial()));
|
||||
m_deviceShared.m_deviceParams->open(serial);
|
||||
}
|
||||
}
|
||||
|
||||
m_deviceAPI->setBuddySharedPtr(&m_deviceShared); // propagate common parameters to API
|
||||
|
@ -29,8 +29,9 @@
|
||||
#include "plutosdroutputwebapiadapter.h"
|
||||
|
||||
const PluginDescriptor PlutoSDROutputPlugin::m_pluginDescriptor = {
|
||||
QString("PlutoSDR"),
|
||||
QString("PlutoSDR Output"),
|
||||
QString("4.11.10"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -45,6 +45,8 @@ public:
|
||||
virtual DeviceSampleSink* createSampleSinkPluginInstance(const QString& sinkId, DeviceAPI *deviceAPI);
|
||||
virtual DeviceWebAPIAdapter* createDeviceWebAPIAdapter() const;
|
||||
|
||||
virtual QString getDeviceTypeId() const { return m_deviceTypeID; }
|
||||
|
||||
static const QString m_hardwareID;
|
||||
static const QString m_deviceTypeID;
|
||||
|
||||
|
@ -6,6 +6,8 @@ This output sample sink plugin sends its samples to a [PlutoSDR device](https://
|
||||
|
||||
☞ PlutoSDR is physically implemented as a 1x1 SISO device although the AD9363 chip does have a second Rx and a second Tx channel. Revision C of the board claims to have pads to allow hackers connecting the second ports externally however for now only the first Tx channel is supported by this plugin.
|
||||
|
||||
☞ When running the Pluto on Ethernet interface you have to create a non discoverable device reference in the [user arguments dialog](https://github.com/f4exb/sdrangel/blob/master/sdrgui/deviceuserargs.md) from the main window Preferences > Devices menu. You must use the `PlutoSDR` hardware ID then specify the device address with a `uri` parameter in the user arguments for example: `uri=ip:192.168.1.10`. Note that this will become effective once SDRangel is restarted.
|
||||
|
||||
<h2>Build</h2>
|
||||
|
||||
The plugin will be built only if libiio is installed in your system. To build and install libiio from source do:
|
||||
|
@ -29,8 +29,9 @@
|
||||
#include "remoteoutputwebapiadapter.h"
|
||||
|
||||
const PluginDescriptor RemoteOutputPlugin::m_pluginDescriptor = {
|
||||
QString("RemoteOutput"),
|
||||
QString("Remote device output"),
|
||||
QString("4.12.2"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -31,8 +31,9 @@
|
||||
#endif
|
||||
|
||||
const PluginDescriptor SoapySDROutputPlugin::m_pluginDescriptor = {
|
||||
QString("SoapySDR"),
|
||||
QString("SoapySDR Output"),
|
||||
QString("4.12.0"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -28,8 +28,9 @@
|
||||
#include "testsinkplugin.h"
|
||||
|
||||
const PluginDescriptor TestSinkPlugin::m_pluginDescriptor = {
|
||||
QString("TestSink"),
|
||||
QString("Test Sink Output"),
|
||||
QString("4.12.0"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -34,8 +34,9 @@
|
||||
#include "xtrxoutputwebapiadapter.h"
|
||||
|
||||
const PluginDescriptor XTRXOutputPlugin::m_pluginDescriptor = {
|
||||
QString("XTRX"),
|
||||
QString("XTRX Output"),
|
||||
QString("4.12.0"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -32,8 +32,9 @@
|
||||
const int AirspyPlugin::m_maxDevices = 32;
|
||||
|
||||
const PluginDescriptor AirspyPlugin::m_pluginDescriptor = {
|
||||
QString("Airspy"),
|
||||
QString("Airspy Input"),
|
||||
QString("4.11.10"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -30,8 +30,9 @@
|
||||
|
||||
|
||||
const PluginDescriptor AirspyHFPlugin::m_pluginDescriptor = {
|
||||
QString("AirspyHF"),
|
||||
QString("AirspyHF Input"),
|
||||
QString("4.11.10"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -30,8 +30,9 @@
|
||||
#endif
|
||||
|
||||
const PluginDescriptor Blderf1InputPlugin::m_pluginDescriptor = {
|
||||
QString("BladeRF1"),
|
||||
QString("BladeRF1 Input"),
|
||||
QString("4.11.10"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -30,8 +30,9 @@
|
||||
#endif
|
||||
|
||||
const PluginDescriptor Blderf2InputPlugin::m_pluginDescriptor = {
|
||||
QString("BladeRF2"),
|
||||
QString("BladeRF2 Input"),
|
||||
QString("4.11.10"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -29,6 +29,7 @@
|
||||
#include "fcdtraits.h"
|
||||
|
||||
const PluginDescriptor FCDProPlugin::m_pluginDescriptor = {
|
||||
QString("FCDPro"),
|
||||
QString(fcd_traits<Pro>::pluginDisplayedName),
|
||||
QString(fcd_traits<Pro>::pluginVersion),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
|
@ -29,6 +29,7 @@
|
||||
#include "fcdtraits.h"
|
||||
|
||||
const PluginDescriptor FCDProPlusPlugin::m_pluginDescriptor = {
|
||||
QString("FCDProPlus"),
|
||||
QString(fcd_traits<ProPlus>::pluginDisplayedName),
|
||||
QString(fcd_traits<ProPlus>::pluginVersion),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
|
@ -29,8 +29,9 @@
|
||||
#include "fileinputwebapiadapter.h"
|
||||
|
||||
const PluginDescriptor FileInputPlugin::m_pluginDescriptor = {
|
||||
QString("FileInput"),
|
||||
QString("File device input"),
|
||||
QString("4.11.10"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -31,8 +31,9 @@
|
||||
#include "hackrfinputwebapiadapter.h"
|
||||
|
||||
const PluginDescriptor HackRFInputPlugin::m_pluginDescriptor = {
|
||||
QString("HackRF"),
|
||||
QString("HackRF Input"),
|
||||
QString("4.11.10"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -30,8 +30,9 @@
|
||||
#include "kiwisdrwebapiadapter.h"
|
||||
|
||||
const PluginDescriptor KiwiSDRPlugin::m_pluginDescriptor = {
|
||||
QString("KiwiSDR"),
|
||||
QString("KiwiSDR input"),
|
||||
QString("4.11.10"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Vort (c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -33,8 +33,9 @@
|
||||
#include "limesdrinputwebapiadapter.h"
|
||||
|
||||
const PluginDescriptor LimeSDRInputPlugin::m_pluginDescriptor = {
|
||||
QString("LimeSDR"),
|
||||
QString("LimeSDR Input"),
|
||||
QString("4.11.10"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -29,8 +29,9 @@
|
||||
#include "localinputwebapiadapter.h"
|
||||
|
||||
const PluginDescriptor LocalInputPlugin::m_pluginDescriptor = {
|
||||
QString("LocalInput"),
|
||||
QString("Local device input"),
|
||||
QString("4.11.10"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -31,8 +31,9 @@
|
||||
#endif
|
||||
|
||||
const PluginDescriptor PerseusPlugin::m_pluginDescriptor = {
|
||||
QString("Perseus"),
|
||||
QString("Perseus Input"),
|
||||
QString("4.11.10"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -295,11 +295,31 @@ bool PlutoSDRInput::openDevice()
|
||||
else
|
||||
{
|
||||
qDebug("PlutoSDRInput::openDevice: open device here");
|
||||
|
||||
m_deviceShared.m_deviceParams = new DevicePlutoSDRParams();
|
||||
char serial[256];
|
||||
strcpy(serial, qPrintable(m_deviceAPI->getSamplingDeviceSerial()));
|
||||
m_deviceShared.m_deviceParams->open(serial);
|
||||
|
||||
if (m_deviceAPI->getHardwareUserArguments().size() != 0)
|
||||
{
|
||||
QStringList kv = m_deviceAPI->getHardwareUserArguments().split('='); // expecting "uri=xxx"
|
||||
|
||||
if (kv.size() > 1)
|
||||
{
|
||||
if (kv.at(0) == "uri") {
|
||||
m_deviceShared.m_deviceParams->openURI(kv.at(1).toStdString());
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
char serial[256];
|
||||
strcpy(serial, qPrintable(m_deviceAPI->getSamplingDeviceSerial()));
|
||||
m_deviceShared.m_deviceParams->open(serial);
|
||||
}
|
||||
}
|
||||
|
||||
m_deviceAPI->setBuddySharedPtr(&m_deviceShared); // propagate common parameters to API
|
||||
|
@ -31,8 +31,9 @@
|
||||
class DeviceAPI;
|
||||
|
||||
const PluginDescriptor PlutoSDRInputPlugin::m_pluginDescriptor = {
|
||||
QString("PlutoSDR"),
|
||||
QString("PlutoSDR Input"),
|
||||
QString("4.11.10"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -45,6 +45,8 @@ public:
|
||||
virtual DeviceSampleSource* createSampleSourcePluginInstance(const QString& sourceId, DeviceAPI *deviceAPI);
|
||||
virtual DeviceWebAPIAdapter* createDeviceWebAPIAdapter() const;
|
||||
|
||||
virtual QString getDeviceTypeId() const { return m_deviceTypeID; }
|
||||
|
||||
static const QString m_hardwareID;
|
||||
static const QString m_deviceTypeID;
|
||||
|
||||
|
@ -6,6 +6,8 @@ This input sample source plugin gets its samples from a [PlutoSDR device](https:
|
||||
|
||||
☞ PlutoSDR is physically implemented as a 1x1 SISO device although the AD9363 chip does have a second Rx and a second Tx channel. Revision C of the board claims to have pads to allow hackers connecting the second ports externally however for now only the first Rx channel is supported by this plugin.
|
||||
|
||||
☞ When running the Pluto on Ethernet interface you have to create a non discoverable device reference in the [user arguments dialog](https://github.com/f4exb/sdrangel/blob/master/sdrgui/deviceuserargs.md) from the main window Preferences > Devices menu. You must use the `PlutoSDR` hardware ID then specify the device address with a `uri` parameter in the user arguments for example: `uri=ip:192.168.1.10`. Note that this will become effective once SDRangel is restarted.
|
||||
|
||||
<h2>Build</h2>
|
||||
|
||||
The plugin will be built only if libiio is installed in your system. To build and install libiio from source do:
|
||||
|
@ -29,8 +29,9 @@
|
||||
#include "remoteinputwebapiadapter.h"
|
||||
|
||||
const PluginDescriptor RemoteInputPlugin::m_pluginDescriptor = {
|
||||
QString("RemoteInput"),
|
||||
QString("Remote device input"),
|
||||
QString("4.11.10"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -13,8 +13,9 @@
|
||||
#include "rtlsdrwebapiadapter.h"
|
||||
|
||||
const PluginDescriptor RTLSDRPlugin::m_pluginDescriptor = {
|
||||
QString("RTLSDR"),
|
||||
QString("RTL-SDR Input"),
|
||||
QString("4.11.10"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -29,8 +29,9 @@
|
||||
#include "sdrplaywebapiadapter.h"
|
||||
|
||||
const PluginDescriptor SDRPlayPlugin::m_pluginDescriptor = {
|
||||
QString("SDRPlay"),
|
||||
QString("SDRPlay RSP1 Input"),
|
||||
QString("4.11.10"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -30,8 +30,9 @@
|
||||
#endif
|
||||
|
||||
const PluginDescriptor SoapySDRInputPlugin::m_pluginDescriptor = {
|
||||
QString("SoapySDR"),
|
||||
QString("SoapySDR Input"),
|
||||
QString("4.11.10"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -29,8 +29,9 @@
|
||||
#include "testsourcewebapiadapter.h"
|
||||
|
||||
const PluginDescriptor TestSourcePlugin::m_pluginDescriptor = {
|
||||
QString("TestSource"),
|
||||
QString("Test Source input"),
|
||||
QString("4.11.10"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -36,8 +36,9 @@
|
||||
#endif
|
||||
|
||||
const PluginDescriptor XTRXInputPlugin::m_pluginDescriptor = {
|
||||
QString("XTRX"),
|
||||
QString("XTRX Input"),
|
||||
QString("4.11.10"),
|
||||
QString("4.12.3"),
|
||||
QString("(c) Edouard Griffiths, F4EXB"),
|
||||
QString("https://github.com/f4exb/sdrangel"),
|
||||
true,
|
||||
|
@ -18,6 +18,8 @@
|
||||
#include <QGlobalStatic>
|
||||
|
||||
#include "plugin/pluginmanager.h"
|
||||
#include "device/deviceuserargs.h"
|
||||
|
||||
#include "deviceenumerator.h"
|
||||
|
||||
Q_GLOBAL_STATIC(DeviceEnumerator, deviceEnumerator)
|
||||
@ -32,6 +34,154 @@ DeviceEnumerator::DeviceEnumerator()
|
||||
DeviceEnumerator::~DeviceEnumerator()
|
||||
{}
|
||||
|
||||
void DeviceEnumerator::addNonDiscoverableDevices(PluginManager *pluginManager, const DeviceUserArgs& deviceUserArgs)
|
||||
{
|
||||
qDebug("DeviceEnumerator::addNonDiscoverableDevices: start");
|
||||
const QList<DeviceUserArgs::Args>& args = deviceUserArgs.getArgsByDevice();
|
||||
QList<DeviceUserArgs::Args>::const_iterator argsIt = args.begin();
|
||||
unsigned int rxIndex = m_rxEnumeration.size();
|
||||
unsigned int txIndex = m_txEnumeration.size();
|
||||
unsigned int mimoIndex = m_mimoEnumeration.size();
|
||||
|
||||
for (; argsIt != args.end(); ++argsIt)
|
||||
{
|
||||
if (!argsIt->m_nonDiscoverable) { // this process is for non discoverable devices only
|
||||
continue;
|
||||
}
|
||||
|
||||
QString serial = QString("%1-%2").arg(argsIt->m_id).arg(argsIt->m_sequence);
|
||||
|
||||
PluginInterface *rxPlugin = getRxRegisteredPlugin(pluginManager, argsIt->m_id);
|
||||
|
||||
if (rxPlugin && !isRxEnumerated(argsIt->m_id, argsIt->m_sequence))
|
||||
{
|
||||
int deviceNbItems = rxPlugin->getDefaultRxNbItems();
|
||||
QString deviceId = rxPlugin->getDeviceTypeId();
|
||||
|
||||
for (int deviceIndex = 0; deviceIndex < deviceNbItems; deviceIndex++)
|
||||
{
|
||||
QString description = QString("%1[%2:%3] user defined").arg(argsIt->m_id).arg(argsIt->m_sequence).arg(deviceIndex);
|
||||
qDebug("DeviceEnumerator::addNonDiscoverableDevices: Rx: %s", qPrintable(description));
|
||||
PluginInterface::SamplingDevice ndDevice(
|
||||
description,
|
||||
argsIt->m_id,
|
||||
deviceId, // id
|
||||
serial,
|
||||
argsIt->m_sequence,
|
||||
rxPlugin->getSamplingDeviceType(),
|
||||
PluginInterface::SamplingDevice::StreamSingleRx,
|
||||
deviceNbItems, // deviceNbItems
|
||||
deviceIndex // deviceItemIndex
|
||||
);
|
||||
m_rxEnumeration.push_back(
|
||||
DeviceEnumeration(
|
||||
ndDevice,
|
||||
rxPlugin,
|
||||
rxIndex
|
||||
)
|
||||
);
|
||||
rxIndex++;
|
||||
}
|
||||
}
|
||||
|
||||
PluginInterface *txPlugin = getTxRegisteredPlugin(pluginManager, argsIt->m_id);
|
||||
|
||||
if (txPlugin && !isTxEnumerated(argsIt->m_id, argsIt->m_sequence))
|
||||
{
|
||||
int deviceNbItems = txPlugin->getDefaultTxNbItems();
|
||||
QString deviceId = txPlugin->getDeviceTypeId();
|
||||
|
||||
for (int deviceIndex = 0; deviceIndex < deviceNbItems; deviceIndex++)
|
||||
{
|
||||
QString description = QString("%1[%2:%3] user defined").arg(argsIt->m_id).arg(argsIt->m_sequence).arg(deviceIndex);
|
||||
qDebug("DeviceEnumerator::addNonDiscoverableDevices: Tx: %s", qPrintable(description));
|
||||
PluginInterface::SamplingDevice ndDevice(
|
||||
description,
|
||||
argsIt->m_id,
|
||||
deviceId, // id
|
||||
serial,
|
||||
argsIt->m_sequence,
|
||||
rxPlugin->getSamplingDeviceType(),
|
||||
PluginInterface::SamplingDevice::StreamSingleTx,
|
||||
deviceNbItems, // deviceNbItems
|
||||
deviceIndex // deviceItemIndex
|
||||
);
|
||||
m_txEnumeration.push_back(
|
||||
DeviceEnumeration(
|
||||
ndDevice,
|
||||
txPlugin,
|
||||
txIndex
|
||||
)
|
||||
);
|
||||
txIndex++;
|
||||
}
|
||||
}
|
||||
} // loop through user args
|
||||
}
|
||||
|
||||
PluginInterface *DeviceEnumerator::getRxRegisteredPlugin(PluginManager *pluginManager, const QString& deviceHwId)
|
||||
{
|
||||
PluginAPI::SamplingDeviceRegistrations& rxDeviceRegistrations = pluginManager->getSourceDeviceRegistrations();
|
||||
PluginInterface *rxPlugin = nullptr;
|
||||
|
||||
for (int i = 0; i < rxDeviceRegistrations.count(); i++)
|
||||
{
|
||||
|
||||
if (deviceHwId == rxDeviceRegistrations[i].m_deviceHardwareId)
|
||||
{
|
||||
rxPlugin = rxDeviceRegistrations[i].m_plugin;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return rxPlugin;
|
||||
}
|
||||
|
||||
bool DeviceEnumerator::isRxEnumerated(const QString& deviceHwId, int deviceSequence)
|
||||
{
|
||||
std::vector<DeviceEnumeration>::const_iterator rxIt = m_rxEnumeration.begin();
|
||||
|
||||
for (; rxIt != m_rxEnumeration.end(); ++rxIt)
|
||||
{
|
||||
if ((rxIt->m_samplingDevice.hardwareId == deviceHwId) && (rxIt->m_samplingDevice.sequence == deviceSequence)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
PluginInterface *DeviceEnumerator::getTxRegisteredPlugin(PluginManager *pluginManager, const QString& deviceHwId)
|
||||
{
|
||||
PluginAPI::SamplingDeviceRegistrations& txDeviceRegistrations = pluginManager->getSinkDeviceRegistrations();
|
||||
PluginInterface *txPlugin = nullptr;
|
||||
|
||||
for (int i = 0; i < txDeviceRegistrations.count(); i++)
|
||||
{
|
||||
if (deviceHwId == txDeviceRegistrations[i].m_deviceHardwareId)
|
||||
{
|
||||
txPlugin = txDeviceRegistrations[i].m_plugin;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return txPlugin;
|
||||
}
|
||||
|
||||
bool DeviceEnumerator::isTxEnumerated(const QString& deviceHwId, int deviceSequence)
|
||||
{
|
||||
std::vector<DeviceEnumeration>::const_iterator txIt = m_txEnumeration.begin();
|
||||
|
||||
for (; txIt != m_txEnumeration.end(); ++txIt)
|
||||
{
|
||||
if ((txIt->m_samplingDevice.hardwareId == deviceHwId) && (txIt->m_samplingDevice.sequence == deviceSequence)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void DeviceEnumerator::enumerateRxDevices(PluginManager *pluginManager)
|
||||
{
|
||||
m_rxEnumeration.clear();
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include "export.h"
|
||||
|
||||
class PluginManager;
|
||||
class DeviceUserArgs;
|
||||
|
||||
class SDRBASE_API DeviceEnumerator
|
||||
{
|
||||
@ -36,6 +37,7 @@ public:
|
||||
void enumerateRxDevices(PluginManager *pluginManager);
|
||||
void enumerateTxDevices(PluginManager *pluginManager);
|
||||
void enumerateMIMODevices(PluginManager *pluginManager);
|
||||
void addNonDiscoverableDevices(PluginManager *pluginManager, const DeviceUserArgs& deviceUserArgs);
|
||||
void listRxDeviceNames(QList<QString>& list, std::vector<int>& indexes) const;
|
||||
void listTxDeviceNames(QList<QString>& list, std::vector<int>& indexes) const;
|
||||
void listMIMODeviceNames(QList<QString>& list, std::vector<int>& indexes) const;
|
||||
@ -82,6 +84,11 @@ private:
|
||||
DevicesEnumeration m_mimoEnumeration;
|
||||
PluginInterface::OriginDevices m_originDevices;
|
||||
QStringList m_originDevicesHwIds;
|
||||
|
||||
PluginInterface *getRxRegisteredPlugin(PluginManager *pluginManager, const QString& deviceHwId);
|
||||
PluginInterface *getTxRegisteredPlugin(PluginManager *pluginManager, const QString& deviceHwId);
|
||||
bool isRxEnumerated(const QString& deviceHwId, int deviceSequence);
|
||||
bool isTxEnumerated(const QString& deviceHwId, int deviceSequence);
|
||||
};
|
||||
|
||||
#endif /* SDRBASE_DEVICE_DEVICEENUMERATOR_H_ */
|
||||
|
@ -19,9 +19,11 @@ class SDRBASE_API PluginAPI : public QObject {
|
||||
public:
|
||||
struct SamplingDeviceRegistration //!< This is the device registration
|
||||
{
|
||||
QString m_deviceHardwareId;
|
||||
QString m_deviceId;
|
||||
PluginInterface* m_plugin;
|
||||
SamplingDeviceRegistration(const QString& deviceId, PluginInterface* plugin) :
|
||||
SamplingDeviceRegistration(const QString& hardwareId, const QString& deviceId, PluginInterface* plugin) :
|
||||
m_deviceHardwareId(hardwareId),
|
||||
m_deviceId(deviceId),
|
||||
m_plugin(plugin)
|
||||
{ }
|
||||
|
@ -7,6 +7,7 @@
|
||||
#include "export.h"
|
||||
|
||||
struct SDRBASE_API PluginDescriptor {
|
||||
const QString hardwareId;
|
||||
// general plugin description
|
||||
const QString displayedName;
|
||||
const QString version;
|
||||
@ -202,6 +203,14 @@ public:
|
||||
(void) originDevices;
|
||||
}
|
||||
|
||||
virtual SamplingDevice::SamplingDeviceType getSamplingDeviceType() const {
|
||||
return SamplingDevice::SamplingDeviceType::PhysicalDevice;
|
||||
}
|
||||
|
||||
virtual QString getDeviceTypeId() const {
|
||||
return QString("");
|
||||
}
|
||||
|
||||
// device source plugins only
|
||||
|
||||
virtual SamplingDevices enumSampleSources(const OriginDevices& originDevices)
|
||||
@ -232,6 +241,10 @@ public:
|
||||
virtual void deleteSampleSourcePluginInstanceGUI(PluginInstanceGUI *ui);
|
||||
virtual void deleteSampleSourcePluginInstanceInput(DeviceSampleSource *source);
|
||||
|
||||
virtual int getDefaultRxNbItems() const {
|
||||
return 1;
|
||||
}
|
||||
|
||||
// device sink plugins only
|
||||
|
||||
virtual SamplingDevices enumSampleSinks(const OriginDevices& originDevices)
|
||||
@ -263,6 +276,10 @@ public:
|
||||
virtual void deleteSampleSinkPluginInstanceGUI(PluginInstanceGUI *ui);
|
||||
virtual void deleteSampleSinkPluginInstanceOutput(DeviceSampleSink *sink);
|
||||
|
||||
virtual int getDefaultTxNbItems() const {
|
||||
return 1;
|
||||
}
|
||||
|
||||
// device MIMO plugins only
|
||||
|
||||
virtual SamplingDevices enumSampleMIMO(const OriginDevices& originDevices)
|
||||
|
@ -117,6 +117,11 @@ void PluginManager::loadPluginsFinal()
|
||||
DeviceEnumerator::instance()->enumerateMIMODevices(this);
|
||||
}
|
||||
|
||||
void PluginManager::loadPluginsNonDiscoverable(const DeviceUserArgs& deviceUserArgs)
|
||||
{
|
||||
DeviceEnumerator::instance()->addNonDiscoverableDevices(this, deviceUserArgs);
|
||||
}
|
||||
|
||||
void PluginManager::registerRxChannel(const QString& channelIdURI, const QString& channelId, PluginInterface* plugin)
|
||||
{
|
||||
qDebug() << "PluginManager::registerRxChannel "
|
||||
@ -148,27 +153,42 @@ void PluginManager::registerSampleSource(const QString& sourceName, PluginInterf
|
||||
{
|
||||
qDebug() << "PluginManager::registerSampleSource "
|
||||
<< plugin->getPluginDescriptor().displayedName.toStdString().c_str()
|
||||
<< " with source name " << sourceName.toStdString().c_str();
|
||||
<< " with source name " << sourceName.toStdString().c_str()
|
||||
<< " and hardware id " << plugin->getPluginDescriptor().hardwareId;
|
||||
|
||||
m_sampleSourceRegistrations.append(PluginAPI::SamplingDeviceRegistration(sourceName, plugin));
|
||||
m_sampleSourceRegistrations.append(PluginAPI::SamplingDeviceRegistration(
|
||||
plugin->getPluginDescriptor().hardwareId,
|
||||
sourceName,
|
||||
plugin
|
||||
));
|
||||
}
|
||||
|
||||
void PluginManager::registerSampleSink(const QString& sinkName, PluginInterface* plugin)
|
||||
{
|
||||
qDebug() << "PluginManager::registerSampleSink "
|
||||
<< plugin->getPluginDescriptor().displayedName.toStdString().c_str()
|
||||
<< " with sink name " << sinkName.toStdString().c_str();
|
||||
<< " with sink name " << sinkName.toStdString().c_str()
|
||||
<< " and hardware id " << plugin->getPluginDescriptor().hardwareId;
|
||||
|
||||
m_sampleSinkRegistrations.append(PluginAPI::SamplingDeviceRegistration(sinkName, plugin));
|
||||
m_sampleSinkRegistrations.append(PluginAPI::SamplingDeviceRegistration(
|
||||
plugin->getPluginDescriptor().hardwareId,
|
||||
sinkName,
|
||||
plugin
|
||||
));
|
||||
}
|
||||
|
||||
void PluginManager::registerSampleMIMO(const QString& mimoName, PluginInterface* plugin)
|
||||
{
|
||||
qDebug() << "PluginManager::registerSampleMIMO "
|
||||
<< plugin->getPluginDescriptor().displayedName.toStdString().c_str()
|
||||
<< " with MIMO name " << mimoName.toStdString().c_str();
|
||||
<< " with MIMO name " << mimoName.toStdString().c_str()
|
||||
<< " and hardware id " << plugin->getPluginDescriptor().hardwareId;
|
||||
|
||||
m_sampleMIMORegistrations.append(PluginAPI::SamplingDeviceRegistration(mimoName, plugin));
|
||||
m_sampleMIMORegistrations.append(PluginAPI::SamplingDeviceRegistration(
|
||||
plugin->getPluginDescriptor().hardwareId,
|
||||
mimoName,
|
||||
plugin
|
||||
));
|
||||
}
|
||||
|
||||
void PluginManager::loadPluginsDir(const QDir& dir)
|
||||
|
@ -34,6 +34,7 @@ class Preset;
|
||||
class Message;
|
||||
class MessageQueue;
|
||||
class DeviceAPI;
|
||||
class DeviceUserArgs;
|
||||
|
||||
class SDRBASE_API PluginManager : public QObject {
|
||||
Q_OBJECT
|
||||
@ -59,6 +60,7 @@ public:
|
||||
void loadPlugins(const QString& pluginsSubDir);
|
||||
void loadPluginsPart(const QString& pluginsSubDir);
|
||||
void loadPluginsFinal();
|
||||
void loadPluginsNonDiscoverable(const DeviceUserArgs& deviceUserArgs);
|
||||
const Plugins& getPlugins() const { return m_plugins; }
|
||||
|
||||
// Callbacks from the plugins
|
||||
|
@ -18,28 +18,43 @@ This is the list of available devices reported by the initial enumeration. There
|
||||
|
||||
<h2>2 Import device button</h2>
|
||||
|
||||
Use this button to import the selected device in the panel above (1) to the panel below (3) that lists the user arguments by device and sequence. You can only import a device which hardware ID and sequence is not already in the panel below.
|
||||
Use this button to import the selected device in the panel above (1) to the panel below (6) that lists the user arguments by device and sequence. You can only import a device which hardware ID and sequence is not already in the panel below.
|
||||
|
||||
<h2>3 User arguments</h2>
|
||||
<h2>3 Non discoverable device hardware ID</h2>
|
||||
|
||||
This is the list of arguments given by the user and attached to a specific device given its hardware ID and sequence. There are 3 columns:
|
||||
Some devices cannot be discovered automatically. This is the case for networked devices in particular the PlutoSDR. In conjuctions with (4) and (5) you can define devices that can be added to the list of available devices for selection. Note that you will need to restart SDRangel for this to be effective.
|
||||
|
||||
Once the device is defined user arguments like the IP address can be specified for it.
|
||||
|
||||
<h2>4 Non discoverable device sequence</h2>
|
||||
|
||||
In case more than one device with the same hardware ID is used in the system you can differentiate the, with an arbitrary sequence number.
|
||||
|
||||
<h2>5 Add non discoverable device definition</h2>
|
||||
|
||||
Once defined with controls (3) and (4) use this button to add the device to the list of available devices. This will make it appear immediately in the
|
||||
|
||||
<h2>6 User arguments</h2>
|
||||
|
||||
This is the list of arguments given by the user and attached to a specific device given its hardware ID and sequence. There are 4 columns:
|
||||
|
||||
- **ND**: This is the non discoverable device indicator. When tagged with "ND" it means that the line refers to a non discoverable device specified by the user
|
||||
- **HwID**: This is the "hardware ID". It represents a type of device like `HackRF` or `TestSource`
|
||||
- **Seq**: The device sequence in enumeration starting at 0. You may have more that one device of the same type in the system
|
||||
- **Arg string**: The user argument string. It can be of any form and not necessarily in the `key1=value1, key2=value2` form. It is up to the corresponding plugin to interpret the string and to make use of its information.
|
||||
|
||||
<h2>4 Delete button</h2>
|
||||
<h2>7 Delete button</h2>
|
||||
|
||||
Use this button to delete the arguments currently selected in the above panel (3)
|
||||
Use this button to delete the arguments currently selected in the above panel (6)
|
||||
|
||||
<h2>5 Edit arguments</h2>
|
||||
<h2>8 Edit arguments</h2>
|
||||
|
||||
Use this line editor to change the arguments currently selected in the above panel (3). The text will be committed when the focus is lost.
|
||||
Use this line editor to change the arguments currently selected in the above panel (6). The text will be committed when the focus is lost.
|
||||
|
||||
<h2>6 Cancel button</h2>
|
||||
<h2>9 Cancel button</h2>
|
||||
|
||||
The changes made to the argument list are temporary. You can use this button to dismiss the changes and close the dialog.
|
||||
|
||||
<h2>7 OK (confirmation) button</h2>
|
||||
<h2>10 OK (confirmation) button</h2>
|
||||
|
||||
The changes made to the argument list are only temporary. You can use this button to commit the changes and close the dialog.
|
||||
|
@ -76,16 +76,25 @@
|
||||
<property name="text">
|
||||
<string>HwID</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Hardware ID</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Seq</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Sequence</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Description</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Description</string>
|
||||
</property>
|
||||
</column>
|
||||
</widget>
|
||||
<widget class="QWidget" name="horizontalLayoutWidget">
|
||||
|
@ -7,16 +7,21 @@ PluginsDialog::PluginsDialog(PluginManager* pluginManager, QWidget* parent) :
|
||||
ui(new Ui::PluginsDialog)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
|
||||
const PluginManager::Plugins& plugins = pluginManager->getPlugins();
|
||||
for(PluginManager::Plugins::const_iterator it = plugins.constBegin(); it != plugins.constEnd(); ++it) {
|
||||
|
||||
for (PluginManager::Plugins::const_iterator it = plugins.constBegin(); it != plugins.constEnd(); ++it)
|
||||
{
|
||||
QStringList sl;
|
||||
const PluginDescriptor& desc = it->pluginInterface->getPluginDescriptor();
|
||||
sl.append(desc.displayedName);
|
||||
sl.append(desc.version);
|
||||
if(desc.licenseIsGPL)
|
||||
|
||||
if (desc.licenseIsGPL) {
|
||||
sl.append(tr("YES"));
|
||||
else sl.append("no");
|
||||
} else {
|
||||
sl.append("no");
|
||||
}
|
||||
|
||||
QTreeWidgetItem* pluginItem = new QTreeWidgetItem(ui->tree, sl);
|
||||
sl.clear();
|
||||
sl.append(tr("Copyright: %1").arg(desc.copyright));
|
||||
@ -30,8 +35,13 @@ PluginsDialog::PluginsDialog(PluginManager* pluginManager, QWidget* parent) :
|
||||
sl.append(tr("Source Code: %1").arg(desc.sourceCodeURL));
|
||||
item = new QTreeWidgetItem(pluginItem, sl);
|
||||
item->setFirstColumnSpanned(true);
|
||||
sl.clear();
|
||||
sl.append(tr("Hardware ID: %1").arg(desc.hardwareId));
|
||||
item = new QTreeWidgetItem(pluginItem, sl);
|
||||
item->setFirstColumnSpanned(true);
|
||||
}
|
||||
ui->tree->resizeColumnToContents(0);
|
||||
|
||||
ui->tree->resizeColumnToContents(0);
|
||||
ui->tree->resizeColumnToContents(1);
|
||||
ui->tree->resizeColumnToContents(2);
|
||||
}
|
||||
|
@ -193,6 +193,7 @@ MainWindow::MainWindow(qtwebapp::LoggerWithFile *logger, const MainParser& parse
|
||||
|
||||
m_pluginManager = new PluginManager(this);
|
||||
m_pluginManager->loadPlugins(QString("plugins"));
|
||||
m_pluginManager->loadPluginsNonDiscoverable(m_settings.getDeviceUserArgs());
|
||||
|
||||
splash->showStatusMessage("load file input...", Qt::white);
|
||||
qDebug() << "MainWindow::MainWindow: select SampleSource from settings or default (file input)...";
|
||||
@ -1693,7 +1694,7 @@ void MainWindow::sampleSourceChanged()
|
||||
deviceUI->m_deviceAPI->stopDeviceEngine();
|
||||
|
||||
// deletes old UI and input object
|
||||
deviceUI->m_deviceAPI->getSampleSource()->setMessageQueueToGUI(0); // have source stop sending messages to the GUI
|
||||
deviceUI->m_deviceAPI->getSampleSource()->setMessageQueueToGUI(nullptr); // have source stop sending messages to the GUI
|
||||
deviceUI->m_deviceAPI->getPluginInterface()->deleteSampleSourcePluginInstanceGUI(
|
||||
deviceUI->m_deviceAPI->getSamplingDevicePluginInstanceGUI());
|
||||
deviceUI->m_deviceAPI->resetSamplingDeviceId();
|
||||
|
Loading…
Reference in New Issue
Block a user