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
* Refactoring of Rx channels code with better separation of concerns

View File

@ -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
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
* 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

View File

@ -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;
}

View File

@ -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; }

View File

@ -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.

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<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;

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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

View File

@ -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,

View File

@ -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;

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; 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>
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"
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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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"),

View File

@ -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"),

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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

View File

@ -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,

View File

@ -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;

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; 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>
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"
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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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();

View File

@ -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_ */

View File

@ -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)
{ }

View File

@ -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)

View File

@ -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)

View File

@ -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

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>
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.

View File

@ -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">

View File

@ -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);
}

View File

@ -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();