1
0
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:
f4exb 2019-12-16 01:03:47 +01:00
parent 8d2f65f967
commit d0858f21fb
81 changed files with 448 additions and 102 deletions

View File

@ -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 sdrangel (4.12.2-1) unstable; urgency=medium
* Refactoring of Rx channels code with better separation of concerns * Refactoring of Rx channels code with better separation of concerns

View File

@ -18,7 +18,7 @@ set(CMAKE_CXX_EXTENSIONS OFF)
# configure version # configure version
set(sdrangel_VERSION_MAJOR "4") set(sdrangel_VERSION_MAJOR "4")
set(sdrangel_VERSION_MINOR "12") set(sdrangel_VERSION_MINOR "12")
set(sdrangel_VERSION_PATCH "2") set(sdrangel_VERSION_PATCH "3")
set(sdrangel_VERSION_SUFFIX "") set(sdrangel_VERSION_SUFFIX "")
# SDRAngel cmake options # SDRAngel cmake options

9
debian/changelog vendored
View File

@ -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 sdrangel (4.12.2-1) unstable; urgency=medium
* Refactoring of Rx channels code with better separation of concerns * 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 * Remote Sink and Remote Output: refactoring of UDP blocks handling
* NFMDemod: fixed setSelectedCtcssIndex method * 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 sdrangel (4.12.1-1) unstable; urgency=medium

View File

@ -31,11 +31,17 @@ DevicePlutoSDRParams::~DevicePlutoSDRParams()
bool DevicePlutoSDRParams::open(const std::string& serial) bool DevicePlutoSDRParams::open(const std::string& serial)
{ {
m_box = DevicePlutoSDR::instance().getDeviceFromSerial(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() void DevicePlutoSDRParams::close()
{ {
delete m_box; delete m_box;
m_box = 0; m_box = nullptr;
} }

View File

@ -38,6 +38,7 @@ public:
~DevicePlutoSDRParams(); ~DevicePlutoSDRParams();
bool open(const std::string& serial); bool open(const std::string& serial);
bool openURI(const std::string& uri);
void close(); void close();
DevicePlutoSDRBox *getBox() { return m_box; } DevicePlutoSDRBox *getBox() { return m_box; }

View File

@ -50,18 +50,6 @@ void DevicePlutoSDRScan::scan()
m_scans.clear(); 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++) for (i = 0; i < num_contexts; i++)
{ {
const char *description = iio_context_info_get_description(info[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.

View File

@ -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<Pro>::pluginDisplayedName = "FunCube Pro Input";
const char *fcd_traits<ProPlus>::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<Pro>::pluginVersion = "4.12.3";
const char *fcd_traits<ProPlus>::pluginVersion = "4.11.10"; const char *fcd_traits<ProPlus>::pluginVersion = "4.12.3";
const int64_t fcd_traits<Pro>::loLowLimitFreq = 64000000L; const int64_t fcd_traits<Pro>::loLowLimitFreq = 64000000L;
const int64_t fcd_traits<ProPlus>::loLowLimitFreq = 150000L; const int64_t fcd_traits<ProPlus>::loLowLimitFreq = 150000L;

View File

@ -24,8 +24,9 @@
#include "chanalyzerwebapiadapter.h" #include "chanalyzerwebapiadapter.h"
const PluginDescriptor ChannelAnalyzerPlugin::m_pluginDescriptor = { const PluginDescriptor ChannelAnalyzerPlugin::m_pluginDescriptor = {
ChannelAnalyzer::m_channelId,
QString("Channel Analyzer"), QString("Channel Analyzer"),
QString("4.12.2"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -9,8 +9,9 @@
#include "amdemodplugin.h" #include "amdemodplugin.h"
const PluginDescriptor AMDemodPlugin::m_pluginDescriptor = { const PluginDescriptor AMDemodPlugin::m_pluginDescriptor = {
AMDemod::m_channelId,
QString("AM Demodulator"), QString("AM Demodulator"),
QString("4.12.2"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -28,8 +28,9 @@
const PluginDescriptor ATVDemodPlugin::m_ptrPluginDescriptor = const PluginDescriptor ATVDemodPlugin::m_ptrPluginDescriptor =
{ {
ATVDemod::m_channelId,
QString("ATV Demodulator"), QString("ATV Demodulator"),
QString("4.12.2"), QString("4.12.3"),
QString("(c) F4HKW for F4EXB / SDRAngel"), QString("(c) F4HKW for F4EXB / SDRAngel"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -29,8 +29,9 @@
#include "bfmplugin.h" #include "bfmplugin.h"
const PluginDescriptor BFMPlugin::m_pluginDescriptor = { const PluginDescriptor BFMPlugin::m_pluginDescriptor = {
BFMDemod::m_channelId,
QString("Broadcast FM Demodulator"), QString("Broadcast FM Demodulator"),
QString("4.12.2"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -28,8 +28,9 @@
const PluginDescriptor DATVDemodPlugin::m_ptrPluginDescriptor = const PluginDescriptor DATVDemodPlugin::m_ptrPluginDescriptor =
{ {
DATVDemod::m_channelId,
QString("DATV Demodulator"), QString("DATV Demodulator"),
QString("4.11.6"), QString("4.12.3"),
QString("(c) F4HKW for SDRAngel using LeanSDR framework (c) F4DAV"), QString("(c) F4HKW for SDRAngel using LeanSDR framework (c) F4DAV"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -28,8 +28,9 @@
#include "dsddemodplugin.h" #include "dsddemodplugin.h"
const PluginDescriptor DSDDemodPlugin::m_pluginDescriptor = { const PluginDescriptor DSDDemodPlugin::m_pluginDescriptor = {
DSDDemod::m_channelId,
QString("DSD Demodulator"), QString("DSD Demodulator"),
QString("4.12.0"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -26,8 +26,9 @@
#include "freedvplugin.h" #include "freedvplugin.h"
const PluginDescriptor FreeDVPlugin::m_pluginDescriptor = { const PluginDescriptor FreeDVPlugin::m_pluginDescriptor = {
FreeDVDemod::m_channelId,
QString("FreeDV Demodulator"), QString("FreeDV Demodulator"),
QString("4.12.2"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -6,8 +6,9 @@
#include "lorademod.h" #include "lorademod.h"
const PluginDescriptor LoRaPlugin::m_pluginDescriptor = { const PluginDescriptor LoRaPlugin::m_pluginDescriptor = {
LoRaDemod::m_channelId,
QString("LoRa Demodulator"), QString("LoRa Demodulator"),
QString("4.12.2"), QString("4.12.3"),
QString("(c) 2015 John Greb"), QString("(c) 2015 John Greb"),
QString("http://www.maintech.de"), QString("http://www.maintech.de"),
true, true,

View File

@ -10,8 +10,9 @@
#include "nfmplugin.h" #include "nfmplugin.h"
const PluginDescriptor NFMPlugin::m_pluginDescriptor = { const PluginDescriptor NFMPlugin::m_pluginDescriptor = {
NFMDemod::m_channelId,
QString("NFM Demodulator"), QString("NFM Demodulator"),
QString("4.12.2"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -10,8 +10,9 @@
#include "ssbplugin.h" #include "ssbplugin.h"
const PluginDescriptor SSBPlugin::m_pluginDescriptor = { const PluginDescriptor SSBPlugin::m_pluginDescriptor = {
SSBDemod::m_channelId,
QString("SSB Demodulator"), QString("SSB Demodulator"),
QString("4.12.2"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -11,8 +11,9 @@
#include "wfmplugin.h" #include "wfmplugin.h"
const PluginDescriptor WFMPlugin::m_pluginDescriptor = { const PluginDescriptor WFMPlugin::m_pluginDescriptor = {
WFMDemod::m_channelId,
QString("WFM Demodulator"), QString("WFM Demodulator"),
QString("4.12.2"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -26,8 +26,9 @@
#include "freqtrackerplugin.h" #include "freqtrackerplugin.h"
const PluginDescriptor FreqTrackerPlugin::m_pluginDescriptor = { const PluginDescriptor FreqTrackerPlugin::m_pluginDescriptor = {
FreqTracker::m_channelId,
QString("Frequency Tracker"), QString("Frequency Tracker"),
QString("4.12.2"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -28,8 +28,9 @@
#include "localsinkplugin.h" #include "localsinkplugin.h"
const PluginDescriptor LocalSinkPlugin::m_pluginDescriptor = { const PluginDescriptor LocalSinkPlugin::m_pluginDescriptor = {
LocalSink::m_channelId,
QString("Local channel sink"), QString("Local channel sink"),
QString("4.12.2"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -28,8 +28,9 @@
#include "remotesinkplugin.h" #include "remotesinkplugin.h"
const PluginDescriptor RemoteSinkPlugin::m_pluginDescriptor = { const PluginDescriptor RemoteSinkPlugin::m_pluginDescriptor = {
RemoteSink::m_channelId,
QString("Remote channel sink"), QString("Remote channel sink"),
QString("4.11.6"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -27,8 +27,9 @@
#include "udpsinkplugin.h" #include "udpsinkplugin.h"
const PluginDescriptor UDPSinkPlugin::m_pluginDescriptor = { const PluginDescriptor UDPSinkPlugin::m_pluginDescriptor = {
UDPSink::m_channelId,
QString("UDP Channel Sink"), QString("UDP Channel Sink"),
QString("4.12.2"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -26,8 +26,9 @@
#include "filesourceplugin.h" #include "filesourceplugin.h"
const PluginDescriptor FileSourcePlugin::m_pluginDescriptor = { const PluginDescriptor FileSourcePlugin::m_pluginDescriptor = {
FileSource::m_channelId,
QString("File channel source"), QString("File channel source"),
QString("4.12.1"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -28,8 +28,9 @@
#include "localsourceplugin.h" #include "localsourceplugin.h"
const PluginDescriptor LocalSourcePlugin::m_pluginDescriptor = { const PluginDescriptor LocalSourcePlugin::m_pluginDescriptor = {
LocalSource::m_channelId,
QString("Local channel source"), QString("Local channel source"),
QString("4.12.2"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -26,8 +26,9 @@
#include "ammodplugin.h" #include "ammodplugin.h"
const PluginDescriptor AMModPlugin::m_pluginDescriptor = { const PluginDescriptor AMModPlugin::m_pluginDescriptor = {
AMMod::m_channelId,
QString("AM Modulator"), QString("AM Modulator"),
QString("4.12.2"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -26,8 +26,9 @@
#include "atvmodplugin.h" #include "atvmodplugin.h"
const PluginDescriptor ATVModPlugin::m_pluginDescriptor = { const PluginDescriptor ATVModPlugin::m_pluginDescriptor = {
ATVMod::m_channelId,
QString("ATV Modulator"), QString("ATV Modulator"),
QString("4.12.2"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -26,8 +26,9 @@
#include "freedvmodplugin.h" #include "freedvmodplugin.h"
const PluginDescriptor FreeDVModPlugin::m_pluginDescriptor = { const PluginDescriptor FreeDVModPlugin::m_pluginDescriptor = {
FreeDVMod::m_channelId,
QString("FreeDV Modulator"), QString("FreeDV Modulator"),
QString("4.12.2"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -26,8 +26,9 @@
#include "nfmmodplugin.h" #include "nfmmodplugin.h"
const PluginDescriptor NFMModPlugin::m_pluginDescriptor = { const PluginDescriptor NFMModPlugin::m_pluginDescriptor = {
NFMMod::m_channelId,
QString("NFM Modulator"), QString("NFM Modulator"),
QString("4.12.2"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -26,8 +26,9 @@
#include "ssbmodplugin.h" #include "ssbmodplugin.h"
const PluginDescriptor SSBModPlugin::m_pluginDescriptor = { const PluginDescriptor SSBModPlugin::m_pluginDescriptor = {
SSBMod::m_channelId,
QString("SSB Modulator"), QString("SSB Modulator"),
QString("4.12.2"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -26,8 +26,9 @@
#include "wfmmodplugin.h" #include "wfmmodplugin.h"
const PluginDescriptor WFMModPlugin::m_pluginDescriptor = { const PluginDescriptor WFMModPlugin::m_pluginDescriptor = {
WFMMod::m_channelId,
QString("WFM Modulator"), QString("WFM Modulator"),
QString("4.12.2"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -26,8 +26,9 @@
#include "remotesourceplugin.h" #include "remotesourceplugin.h"
const PluginDescriptor RemoteSourcePlugin::m_pluginDescriptor = { const PluginDescriptor RemoteSourcePlugin::m_pluginDescriptor = {
RemoteSource::m_channelId,
QString("Remote channel source"), QString("Remote channel source"),
QString("4.12.1"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -29,8 +29,9 @@
#include "udpsourceplugin.h" #include "udpsourceplugin.h"
const PluginDescriptor UDPSourcePlugin::m_pluginDescriptor = { const PluginDescriptor UDPSourcePlugin::m_pluginDescriptor = {
UDPSource::m_channelId,
QString("UDP Channel Source"), QString("UDP Channel Source"),
QString("4.12.2"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -29,8 +29,9 @@
#include "testmiwebapiadapter.h" #include "testmiwebapiadapter.h"
const PluginDescriptor TestMIPlugin::m_pluginDescriptor = { const PluginDescriptor TestMIPlugin::m_pluginDescriptor = {
QString("TestMI"),
QString("Test Multiple Input"), QString("Test Multiple Input"),
QString("4.11.10"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -30,8 +30,9 @@
#endif #endif
const PluginDescriptor Bladerf1OutputPlugin::m_pluginDescriptor = { const PluginDescriptor Bladerf1OutputPlugin::m_pluginDescriptor = {
QString("BladeRF1"),
QString("BladeRF1 Output"), QString("BladeRF1 Output"),
QString("4.12.0"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -30,8 +30,9 @@
#endif #endif
const PluginDescriptor BladeRF2OutputPlugin::m_pluginDescriptor = { const PluginDescriptor BladeRF2OutputPlugin::m_pluginDescriptor = {
QString("BladeRF2"),
QString("BladeRF2 Output"), QString("BladeRF2 Output"),
QString("4.12.0"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -28,8 +28,9 @@
#include "filesinkplugin.h" #include "filesinkplugin.h"
const PluginDescriptor FileSinkPlugin::m_pluginDescriptor = { const PluginDescriptor FileSinkPlugin::m_pluginDescriptor = {
QString("FileSink"),
QString("File sink output"), QString("File sink output"),
QString("4.12.0"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -30,8 +30,9 @@
#include "hackrfoutputwebapiadapter.h" #include "hackrfoutputwebapiadapter.h"
const PluginDescriptor HackRFOutputPlugin::m_pluginDescriptor = { const PluginDescriptor HackRFOutputPlugin::m_pluginDescriptor = {
QString("HackRF"),
QString("HackRF Output"), QString("HackRF Output"),
QString("4.12.0"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -33,8 +33,9 @@
#include "limesdroutputwebapiadapter.h" #include "limesdroutputwebapiadapter.h"
const PluginDescriptor LimeSDROutputPlugin::m_pluginDescriptor = { const PluginDescriptor LimeSDROutputPlugin::m_pluginDescriptor = {
QString("LimeSDR"),
QString("LimeSDR Output"), QString("LimeSDR Output"),
QString("4.12.0"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -29,8 +29,9 @@
#include "localoutputwebapiadapter.h" #include "localoutputwebapiadapter.h"
const PluginDescriptor LocalOutputPlugin::m_pluginDescriptor = { const PluginDescriptor LocalOutputPlugin::m_pluginDescriptor = {
QString("LocalOutput"),
QString("Local device output"), QString("Local device output"),
QString("4.12.0"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -259,11 +259,31 @@ bool PlutoSDROutput::openDevice()
else else
{ {
qDebug("PlutoSDROutput::openDevice: open device here"); qDebug("PlutoSDROutput::openDevice: open device here");
m_deviceShared.m_deviceParams = new DevicePlutoSDRParams(); m_deviceShared.m_deviceParams = new DevicePlutoSDRParams();
char serial[256];
strcpy(serial, qPrintable(m_deviceAPI->getSamplingDeviceSerial())); if (m_deviceAPI->getHardwareUserArguments().size() != 0)
m_deviceShared.m_deviceParams->open(serial); {
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 m_deviceAPI->setBuddySharedPtr(&m_deviceShared); // propagate common parameters to API

View File

@ -29,8 +29,9 @@
#include "plutosdroutputwebapiadapter.h" #include "plutosdroutputwebapiadapter.h"
const PluginDescriptor PlutoSDROutputPlugin::m_pluginDescriptor = { const PluginDescriptor PlutoSDROutputPlugin::m_pluginDescriptor = {
QString("PlutoSDR"),
QString("PlutoSDR Output"), QString("PlutoSDR Output"),
QString("4.11.10"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -45,6 +45,8 @@ public:
virtual DeviceSampleSink* createSampleSinkPluginInstance(const QString& sinkId, DeviceAPI *deviceAPI); virtual DeviceSampleSink* createSampleSinkPluginInstance(const QString& sinkId, DeviceAPI *deviceAPI);
virtual DeviceWebAPIAdapter* createDeviceWebAPIAdapter() const; virtual DeviceWebAPIAdapter* createDeviceWebAPIAdapter() const;
virtual QString getDeviceTypeId() const { return m_deviceTypeID; }
static const QString m_hardwareID; static const QString m_hardwareID;
static const QString m_deviceTypeID; static const QString m_deviceTypeID;

View File

@ -6,6 +6,8 @@ This output sample sink plugin sends its samples to a [PlutoSDR device](https://
&#9758; 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. &#9758; 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.
&#9758; 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 &gt; 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> <h2>Build</h2>
The plugin will be built only if libiio is installed in your system. To build and install libiio from source do: The plugin will be built only if libiio is installed in your system. To build and install libiio from source do:

View File

@ -29,8 +29,9 @@
#include "remoteoutputwebapiadapter.h" #include "remoteoutputwebapiadapter.h"
const PluginDescriptor RemoteOutputPlugin::m_pluginDescriptor = { const PluginDescriptor RemoteOutputPlugin::m_pluginDescriptor = {
QString("RemoteOutput"),
QString("Remote device output"), QString("Remote device output"),
QString("4.12.2"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -31,8 +31,9 @@
#endif #endif
const PluginDescriptor SoapySDROutputPlugin::m_pluginDescriptor = { const PluginDescriptor SoapySDROutputPlugin::m_pluginDescriptor = {
QString("SoapySDR"),
QString("SoapySDR Output"), QString("SoapySDR Output"),
QString("4.12.0"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -28,8 +28,9 @@
#include "testsinkplugin.h" #include "testsinkplugin.h"
const PluginDescriptor TestSinkPlugin::m_pluginDescriptor = { const PluginDescriptor TestSinkPlugin::m_pluginDescriptor = {
QString("TestSink"),
QString("Test Sink Output"), QString("Test Sink Output"),
QString("4.12.0"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -34,8 +34,9 @@
#include "xtrxoutputwebapiadapter.h" #include "xtrxoutputwebapiadapter.h"
const PluginDescriptor XTRXOutputPlugin::m_pluginDescriptor = { const PluginDescriptor XTRXOutputPlugin::m_pluginDescriptor = {
QString("XTRX"),
QString("XTRX Output"), QString("XTRX Output"),
QString("4.12.0"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -32,8 +32,9 @@
const int AirspyPlugin::m_maxDevices = 32; const int AirspyPlugin::m_maxDevices = 32;
const PluginDescriptor AirspyPlugin::m_pluginDescriptor = { const PluginDescriptor AirspyPlugin::m_pluginDescriptor = {
QString("Airspy"),
QString("Airspy Input"), QString("Airspy Input"),
QString("4.11.10"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -30,8 +30,9 @@
const PluginDescriptor AirspyHFPlugin::m_pluginDescriptor = { const PluginDescriptor AirspyHFPlugin::m_pluginDescriptor = {
QString("AirspyHF"),
QString("AirspyHF Input"), QString("AirspyHF Input"),
QString("4.11.10"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -30,8 +30,9 @@
#endif #endif
const PluginDescriptor Blderf1InputPlugin::m_pluginDescriptor = { const PluginDescriptor Blderf1InputPlugin::m_pluginDescriptor = {
QString("BladeRF1"),
QString("BladeRF1 Input"), QString("BladeRF1 Input"),
QString("4.11.10"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -30,8 +30,9 @@
#endif #endif
const PluginDescriptor Blderf2InputPlugin::m_pluginDescriptor = { const PluginDescriptor Blderf2InputPlugin::m_pluginDescriptor = {
QString("BladeRF2"),
QString("BladeRF2 Input"), QString("BladeRF2 Input"),
QString("4.11.10"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -29,6 +29,7 @@
#include "fcdtraits.h" #include "fcdtraits.h"
const PluginDescriptor FCDProPlugin::m_pluginDescriptor = { const PluginDescriptor FCDProPlugin::m_pluginDescriptor = {
QString("FCDPro"),
QString(fcd_traits<Pro>::pluginDisplayedName), QString(fcd_traits<Pro>::pluginDisplayedName),
QString(fcd_traits<Pro>::pluginVersion), QString(fcd_traits<Pro>::pluginVersion),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),

View File

@ -29,6 +29,7 @@
#include "fcdtraits.h" #include "fcdtraits.h"
const PluginDescriptor FCDProPlusPlugin::m_pluginDescriptor = { const PluginDescriptor FCDProPlusPlugin::m_pluginDescriptor = {
QString("FCDProPlus"),
QString(fcd_traits<ProPlus>::pluginDisplayedName), QString(fcd_traits<ProPlus>::pluginDisplayedName),
QString(fcd_traits<ProPlus>::pluginVersion), QString(fcd_traits<ProPlus>::pluginVersion),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),

View File

@ -29,8 +29,9 @@
#include "fileinputwebapiadapter.h" #include "fileinputwebapiadapter.h"
const PluginDescriptor FileInputPlugin::m_pluginDescriptor = { const PluginDescriptor FileInputPlugin::m_pluginDescriptor = {
QString("FileInput"),
QString("File device input"), QString("File device input"),
QString("4.11.10"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -31,8 +31,9 @@
#include "hackrfinputwebapiadapter.h" #include "hackrfinputwebapiadapter.h"
const PluginDescriptor HackRFInputPlugin::m_pluginDescriptor = { const PluginDescriptor HackRFInputPlugin::m_pluginDescriptor = {
QString("HackRF"),
QString("HackRF Input"), QString("HackRF Input"),
QString("4.11.10"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -30,8 +30,9 @@
#include "kiwisdrwebapiadapter.h" #include "kiwisdrwebapiadapter.h"
const PluginDescriptor KiwiSDRPlugin::m_pluginDescriptor = { const PluginDescriptor KiwiSDRPlugin::m_pluginDescriptor = {
QString("KiwiSDR"),
QString("KiwiSDR input"), QString("KiwiSDR input"),
QString("4.11.10"), QString("4.12.3"),
QString("(c) Vort (c) Edouard Griffiths, F4EXB"), QString("(c) Vort (c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -33,8 +33,9 @@
#include "limesdrinputwebapiadapter.h" #include "limesdrinputwebapiadapter.h"
const PluginDescriptor LimeSDRInputPlugin::m_pluginDescriptor = { const PluginDescriptor LimeSDRInputPlugin::m_pluginDescriptor = {
QString("LimeSDR"),
QString("LimeSDR Input"), QString("LimeSDR Input"),
QString("4.11.10"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -29,8 +29,9 @@
#include "localinputwebapiadapter.h" #include "localinputwebapiadapter.h"
const PluginDescriptor LocalInputPlugin::m_pluginDescriptor = { const PluginDescriptor LocalInputPlugin::m_pluginDescriptor = {
QString("LocalInput"),
QString("Local device input"), QString("Local device input"),
QString("4.11.10"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -31,8 +31,9 @@
#endif #endif
const PluginDescriptor PerseusPlugin::m_pluginDescriptor = { const PluginDescriptor PerseusPlugin::m_pluginDescriptor = {
QString("Perseus"),
QString("Perseus Input"), QString("Perseus Input"),
QString("4.11.10"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -295,11 +295,31 @@ bool PlutoSDRInput::openDevice()
else else
{ {
qDebug("PlutoSDRInput::openDevice: open device here"); qDebug("PlutoSDRInput::openDevice: open device here");
m_deviceShared.m_deviceParams = new DevicePlutoSDRParams(); m_deviceShared.m_deviceParams = new DevicePlutoSDRParams();
char serial[256];
strcpy(serial, qPrintable(m_deviceAPI->getSamplingDeviceSerial())); if (m_deviceAPI->getHardwareUserArguments().size() != 0)
m_deviceShared.m_deviceParams->open(serial); {
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 m_deviceAPI->setBuddySharedPtr(&m_deviceShared); // propagate common parameters to API

View File

@ -31,8 +31,9 @@
class DeviceAPI; class DeviceAPI;
const PluginDescriptor PlutoSDRInputPlugin::m_pluginDescriptor = { const PluginDescriptor PlutoSDRInputPlugin::m_pluginDescriptor = {
QString("PlutoSDR"),
QString("PlutoSDR Input"), QString("PlutoSDR Input"),
QString("4.11.10"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -45,6 +45,8 @@ public:
virtual DeviceSampleSource* createSampleSourcePluginInstance(const QString& sourceId, DeviceAPI *deviceAPI); virtual DeviceSampleSource* createSampleSourcePluginInstance(const QString& sourceId, DeviceAPI *deviceAPI);
virtual DeviceWebAPIAdapter* createDeviceWebAPIAdapter() const; virtual DeviceWebAPIAdapter* createDeviceWebAPIAdapter() const;
virtual QString getDeviceTypeId() const { return m_deviceTypeID; }
static const QString m_hardwareID; static const QString m_hardwareID;
static const QString m_deviceTypeID; static const QString m_deviceTypeID;

View File

@ -6,6 +6,8 @@ This input sample source plugin gets its samples from a [PlutoSDR device](https:
&#9758; 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. &#9758; 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.
&#9758; 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 &gt; 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> <h2>Build</h2>
The plugin will be built only if libiio is installed in your system. To build and install libiio from source do: The plugin will be built only if libiio is installed in your system. To build and install libiio from source do:

View File

@ -29,8 +29,9 @@
#include "remoteinputwebapiadapter.h" #include "remoteinputwebapiadapter.h"
const PluginDescriptor RemoteInputPlugin::m_pluginDescriptor = { const PluginDescriptor RemoteInputPlugin::m_pluginDescriptor = {
QString("RemoteInput"),
QString("Remote device input"), QString("Remote device input"),
QString("4.11.10"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -13,8 +13,9 @@
#include "rtlsdrwebapiadapter.h" #include "rtlsdrwebapiadapter.h"
const PluginDescriptor RTLSDRPlugin::m_pluginDescriptor = { const PluginDescriptor RTLSDRPlugin::m_pluginDescriptor = {
QString("RTLSDR"),
QString("RTL-SDR Input"), QString("RTL-SDR Input"),
QString("4.11.10"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -29,8 +29,9 @@
#include "sdrplaywebapiadapter.h" #include "sdrplaywebapiadapter.h"
const PluginDescriptor SDRPlayPlugin::m_pluginDescriptor = { const PluginDescriptor SDRPlayPlugin::m_pluginDescriptor = {
QString("SDRPlay"),
QString("SDRPlay RSP1 Input"), QString("SDRPlay RSP1 Input"),
QString("4.11.10"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -30,8 +30,9 @@
#endif #endif
const PluginDescriptor SoapySDRInputPlugin::m_pluginDescriptor = { const PluginDescriptor SoapySDRInputPlugin::m_pluginDescriptor = {
QString("SoapySDR"),
QString("SoapySDR Input"), QString("SoapySDR Input"),
QString("4.11.10"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -29,8 +29,9 @@
#include "testsourcewebapiadapter.h" #include "testsourcewebapiadapter.h"
const PluginDescriptor TestSourcePlugin::m_pluginDescriptor = { const PluginDescriptor TestSourcePlugin::m_pluginDescriptor = {
QString("TestSource"),
QString("Test Source input"), QString("Test Source input"),
QString("4.11.10"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -36,8 +36,9 @@
#endif #endif
const PluginDescriptor XTRXInputPlugin::m_pluginDescriptor = { const PluginDescriptor XTRXInputPlugin::m_pluginDescriptor = {
QString("XTRX"),
QString("XTRX Input"), QString("XTRX Input"),
QString("4.11.10"), QString("4.12.3"),
QString("(c) Edouard Griffiths, F4EXB"), QString("(c) Edouard Griffiths, F4EXB"),
QString("https://github.com/f4exb/sdrangel"), QString("https://github.com/f4exb/sdrangel"),
true, true,

View File

@ -18,6 +18,8 @@
#include <QGlobalStatic> #include <QGlobalStatic>
#include "plugin/pluginmanager.h" #include "plugin/pluginmanager.h"
#include "device/deviceuserargs.h"
#include "deviceenumerator.h" #include "deviceenumerator.h"
Q_GLOBAL_STATIC(DeviceEnumerator, deviceEnumerator) Q_GLOBAL_STATIC(DeviceEnumerator, deviceEnumerator)
@ -32,6 +34,154 @@ DeviceEnumerator::DeviceEnumerator()
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) void DeviceEnumerator::enumerateRxDevices(PluginManager *pluginManager)
{ {
m_rxEnumeration.clear(); m_rxEnumeration.clear();

View File

@ -24,6 +24,7 @@
#include "export.h" #include "export.h"
class PluginManager; class PluginManager;
class DeviceUserArgs;
class SDRBASE_API DeviceEnumerator class SDRBASE_API DeviceEnumerator
{ {
@ -36,6 +37,7 @@ public:
void enumerateRxDevices(PluginManager *pluginManager); void enumerateRxDevices(PluginManager *pluginManager);
void enumerateTxDevices(PluginManager *pluginManager); void enumerateTxDevices(PluginManager *pluginManager);
void enumerateMIMODevices(PluginManager *pluginManager); void enumerateMIMODevices(PluginManager *pluginManager);
void addNonDiscoverableDevices(PluginManager *pluginManager, const DeviceUserArgs& deviceUserArgs);
void listRxDeviceNames(QList<QString>& list, std::vector<int>& indexes) const; void listRxDeviceNames(QList<QString>& list, std::vector<int>& indexes) const;
void listTxDeviceNames(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; void listMIMODeviceNames(QList<QString>& list, std::vector<int>& indexes) const;
@ -82,6 +84,11 @@ private:
DevicesEnumeration m_mimoEnumeration; DevicesEnumeration m_mimoEnumeration;
PluginInterface::OriginDevices m_originDevices; PluginInterface::OriginDevices m_originDevices;
QStringList m_originDevicesHwIds; 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_ */ #endif /* SDRBASE_DEVICE_DEVICEENUMERATOR_H_ */

View File

@ -19,9 +19,11 @@ class SDRBASE_API PluginAPI : public QObject {
public: public:
struct SamplingDeviceRegistration //!< This is the device registration struct SamplingDeviceRegistration //!< This is the device registration
{ {
QString m_deviceHardwareId;
QString m_deviceId; QString m_deviceId;
PluginInterface* m_plugin; 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_deviceId(deviceId),
m_plugin(plugin) m_plugin(plugin)
{ } { }

View File

@ -7,6 +7,7 @@
#include "export.h" #include "export.h"
struct SDRBASE_API PluginDescriptor { struct SDRBASE_API PluginDescriptor {
const QString hardwareId;
// general plugin description // general plugin description
const QString displayedName; const QString displayedName;
const QString version; const QString version;
@ -202,6 +203,14 @@ public:
(void) originDevices; (void) originDevices;
} }
virtual SamplingDevice::SamplingDeviceType getSamplingDeviceType() const {
return SamplingDevice::SamplingDeviceType::PhysicalDevice;
}
virtual QString getDeviceTypeId() const {
return QString("");
}
// device source plugins only // device source plugins only
virtual SamplingDevices enumSampleSources(const OriginDevices& originDevices) virtual SamplingDevices enumSampleSources(const OriginDevices& originDevices)
@ -232,6 +241,10 @@ public:
virtual void deleteSampleSourcePluginInstanceGUI(PluginInstanceGUI *ui); virtual void deleteSampleSourcePluginInstanceGUI(PluginInstanceGUI *ui);
virtual void deleteSampleSourcePluginInstanceInput(DeviceSampleSource *source); virtual void deleteSampleSourcePluginInstanceInput(DeviceSampleSource *source);
virtual int getDefaultRxNbItems() const {
return 1;
}
// device sink plugins only // device sink plugins only
virtual SamplingDevices enumSampleSinks(const OriginDevices& originDevices) virtual SamplingDevices enumSampleSinks(const OriginDevices& originDevices)
@ -263,6 +276,10 @@ public:
virtual void deleteSampleSinkPluginInstanceGUI(PluginInstanceGUI *ui); virtual void deleteSampleSinkPluginInstanceGUI(PluginInstanceGUI *ui);
virtual void deleteSampleSinkPluginInstanceOutput(DeviceSampleSink *sink); virtual void deleteSampleSinkPluginInstanceOutput(DeviceSampleSink *sink);
virtual int getDefaultTxNbItems() const {
return 1;
}
// device MIMO plugins only // device MIMO plugins only
virtual SamplingDevices enumSampleMIMO(const OriginDevices& originDevices) virtual SamplingDevices enumSampleMIMO(const OriginDevices& originDevices)

View File

@ -117,6 +117,11 @@ void PluginManager::loadPluginsFinal()
DeviceEnumerator::instance()->enumerateMIMODevices(this); 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) void PluginManager::registerRxChannel(const QString& channelIdURI, const QString& channelId, PluginInterface* plugin)
{ {
qDebug() << "PluginManager::registerRxChannel " qDebug() << "PluginManager::registerRxChannel "
@ -148,27 +153,42 @@ void PluginManager::registerSampleSource(const QString& sourceName, PluginInterf
{ {
qDebug() << "PluginManager::registerSampleSource " qDebug() << "PluginManager::registerSampleSource "
<< plugin->getPluginDescriptor().displayedName.toStdString().c_str() << 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) void PluginManager::registerSampleSink(const QString& sinkName, PluginInterface* plugin)
{ {
qDebug() << "PluginManager::registerSampleSink " qDebug() << "PluginManager::registerSampleSink "
<< plugin->getPluginDescriptor().displayedName.toStdString().c_str() << 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) void PluginManager::registerSampleMIMO(const QString& mimoName, PluginInterface* plugin)
{ {
qDebug() << "PluginManager::registerSampleMIMO " qDebug() << "PluginManager::registerSampleMIMO "
<< plugin->getPluginDescriptor().displayedName.toStdString().c_str() << 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) void PluginManager::loadPluginsDir(const QDir& dir)

View File

@ -34,6 +34,7 @@ class Preset;
class Message; class Message;
class MessageQueue; class MessageQueue;
class DeviceAPI; class DeviceAPI;
class DeviceUserArgs;
class SDRBASE_API PluginManager : public QObject { class SDRBASE_API PluginManager : public QObject {
Q_OBJECT Q_OBJECT
@ -59,6 +60,7 @@ public:
void loadPlugins(const QString& pluginsSubDir); void loadPlugins(const QString& pluginsSubDir);
void loadPluginsPart(const QString& pluginsSubDir); void loadPluginsPart(const QString& pluginsSubDir);
void loadPluginsFinal(); void loadPluginsFinal();
void loadPluginsNonDiscoverable(const DeviceUserArgs& deviceUserArgs);
const Plugins& getPlugins() const { return m_plugins; } const Plugins& getPlugins() const { return m_plugins; }
// Callbacks from the plugins // Callbacks from the plugins

View File

@ -18,28 +18,43 @@ This is the list of available devices reported by the initial enumeration. There
<h2>2 Import device button</h2> <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` - **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 - **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. - **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. 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. The changes made to the argument list are only temporary. You can use this button to commit the changes and close the dialog.

View File

@ -76,16 +76,25 @@
<property name="text"> <property name="text">
<string>HwID</string> <string>HwID</string>
</property> </property>
<property name="toolTip">
<string>Hardware ID</string>
</property>
</column> </column>
<column> <column>
<property name="text"> <property name="text">
<string>Seq</string> <string>Seq</string>
</property> </property>
<property name="toolTip">
<string>Sequence</string>
</property>
</column> </column>
<column> <column>
<property name="text"> <property name="text">
<string>Description</string> <string>Description</string>
</property> </property>
<property name="toolTip">
<string>Description</string>
</property>
</column> </column>
</widget> </widget>
<widget class="QWidget" name="horizontalLayoutWidget"> <widget class="QWidget" name="horizontalLayoutWidget">

View File

@ -7,16 +7,21 @@ PluginsDialog::PluginsDialog(PluginManager* pluginManager, QWidget* parent) :
ui(new Ui::PluginsDialog) ui(new Ui::PluginsDialog)
{ {
ui->setupUi(this); ui->setupUi(this);
const PluginManager::Plugins& plugins = pluginManager->getPlugins(); 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; QStringList sl;
const PluginDescriptor& desc = it->pluginInterface->getPluginDescriptor(); const PluginDescriptor& desc = it->pluginInterface->getPluginDescriptor();
sl.append(desc.displayedName); sl.append(desc.displayedName);
sl.append(desc.version); sl.append(desc.version);
if(desc.licenseIsGPL)
if (desc.licenseIsGPL) {
sl.append(tr("YES")); sl.append(tr("YES"));
else sl.append("no"); } else {
sl.append("no");
}
QTreeWidgetItem* pluginItem = new QTreeWidgetItem(ui->tree, sl); QTreeWidgetItem* pluginItem = new QTreeWidgetItem(ui->tree, sl);
sl.clear(); sl.clear();
sl.append(tr("Copyright: %1").arg(desc.copyright)); 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)); sl.append(tr("Source Code: %1").arg(desc.sourceCodeURL));
item = new QTreeWidgetItem(pluginItem, sl); item = new QTreeWidgetItem(pluginItem, sl);
item->setFirstColumnSpanned(true); 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(1);
ui->tree->resizeColumnToContents(2); ui->tree->resizeColumnToContents(2);
} }

View File

@ -193,6 +193,7 @@ MainWindow::MainWindow(qtwebapp::LoggerWithFile *logger, const MainParser& parse
m_pluginManager = new PluginManager(this); m_pluginManager = new PluginManager(this);
m_pluginManager->loadPlugins(QString("plugins")); m_pluginManager->loadPlugins(QString("plugins"));
m_pluginManager->loadPluginsNonDiscoverable(m_settings.getDeviceUserArgs());
splash->showStatusMessage("load file input...", Qt::white); splash->showStatusMessage("load file input...", Qt::white);
qDebug() << "MainWindow::MainWindow: select SampleSource from settings or default (file input)..."; qDebug() << "MainWindow::MainWindow: select SampleSource from settings or default (file input)...";
@ -1693,7 +1694,7 @@ void MainWindow::sampleSourceChanged()
deviceUI->m_deviceAPI->stopDeviceEngine(); deviceUI->m_deviceAPI->stopDeviceEngine();
// deletes old UI and input object // 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->getPluginInterface()->deleteSampleSourcePluginInstanceGUI(
deviceUI->m_deviceAPI->getSamplingDevicePluginInstanceGUI()); deviceUI->m_deviceAPI->getSamplingDevicePluginInstanceGUI());
deviceUI->m_deviceAPI->resetSamplingDeviceId(); deviceUI->m_deviceAPI->resetSamplingDeviceId();