From e9bbf0b266f57a3e0d7b5328d5380c9faf066da9 Mon Sep 17 00:00:00 2001 From: f4exb Date: Tue, 17 Sep 2019 00:34:11 +0200 Subject: [PATCH] Plugins device enumeration optimization --- fcdlib/fcdtraits.cpp | 4 +- plugins/samplemimo/testmi/testmiplugin.cpp | 48 +++++++++---- plugins/samplemimo/testmi/testmiplugin.h | 3 +- .../bladerf1output/bladerf1outputplugin.cpp | 58 ++++++++++----- .../bladerf1output/bladerf1outputplugin.h | 3 +- .../bladerf2output/bladerf2outputplugin.cpp | 67 ++++++++++++----- .../bladerf2output/bladerf2outputplugin.h | 3 +- .../samplesink/filesink/filesinkplugin.cpp | 49 +++++++++---- plugins/samplesink/filesink/filesinkplugin.h | 3 +- .../hackrfoutput/hackrfoutputplugin.cpp | 59 ++++++++++----- .../hackrfoutput/hackrfoutputplugin.h | 3 +- .../limesdroutput/limesdroutputplugin.cpp | 71 +++++++++++++------ .../limesdroutput/limesdroutputplugin.h | 3 +- .../localoutput/localoutputplugin.cpp | 49 +++++++++---- .../localoutput/localoutputplugin.h | 3 +- .../plutosdroutput/plutosdroutputplugin.cpp | 52 ++++++++++---- .../plutosdroutput/plutosdroutputplugin.h | 3 +- .../remoteoutput/remoteoutputplugin.cpp | 49 +++++++++---- .../remoteoutput/remoteoutputplugin.h | 3 +- .../soapysdroutput/soapysdroutputplugin.cpp | 59 +++++++++++---- .../soapysdroutput/soapysdroutputplugin.h | 3 +- .../xtrxoutput/xtrxoutputplugin.cpp | 64 ++++++++++++----- .../samplesink/xtrxoutput/xtrxoutputplugin.h | 3 +- plugins/samplesource/airspy/airspyplugin.cpp | 66 ++++++++++++----- plugins/samplesource/airspy/airspyplugin.h | 3 +- .../samplesource/airspyhf/airspyhfplugin.cpp | 60 +++++++++++----- .../samplesource/airspyhf/airspyhfplugin.h | 3 +- .../bladerf1input/bladerf1inputplugin.cpp | 53 ++++++++++---- .../bladerf1input/bladerf1inputplugin.h | 3 +- .../bladerf2input/bladerf2inputplugin.cpp | 65 ++++++++++++----- .../bladerf2input/bladerf2inputplugin.h | 3 +- plugins/samplesource/fcdpro/fcdproplugin.cpp | 49 +++++++++---- plugins/samplesource/fcdpro/fcdproplugin.h | 3 +- .../fcdproplus/fcdproplusplugin.cpp | 50 +++++++++---- .../fcdproplus/fcdproplusplugin.h | 3 +- .../fileinput/fileinputplugin.cpp | 49 +++++++++---- .../samplesource/fileinput/fileinputplugin.h | 3 +- .../hackrfinput/hackrfinputplugin.cpp | 66 ++++++++++------- .../hackrfinput/hackrfinputplugin.h | 3 +- .../samplesource/kiwisdr/kiwisdrplugin.cpp | 49 +++++++++---- plugins/samplesource/kiwisdr/kiwisdrplugin.h | 3 +- .../limesdrinput/limesdrinputplugin.cpp | 71 +++++++++++++------ .../limesdrinput/limesdrinputplugin.h | 3 +- .../localinput/localinputplugin.cpp | 49 +++++++++---- .../localinput/localinputplugin.h | 3 +- .../samplesource/perseus/perseusplugin.cpp | 52 ++++++++++---- plugins/samplesource/perseus/perseusplugin.h | 3 +- .../plutosdrinput/plutosdrinputplugin.cpp | 52 ++++++++++---- .../plutosdrinput/plutosdrinputplugin.h | 3 +- .../remoteinput/remoteinputplugin.cpp | 49 +++++++++---- .../remoteinput/remoteinputplugin.h | 3 +- plugins/samplesource/rtlsdr/rtlsdrplugin.cpp | 58 +++++++++++---- plugins/samplesource/rtlsdr/rtlsdrplugin.h | 3 +- .../samplesource/sdrplay/sdrplayplugin.cpp | 56 +++++++++++---- plugins/samplesource/sdrplay/sdrplayplugin.h | 3 +- .../soapysdrinput/soapysdrinputplugin.cpp | 61 ++++++++++++---- .../soapysdrinput/soapysdrinputplugin.h | 3 +- .../testsource/testsourceplugin.cpp | 49 +++++++++---- .../testsource/testsourceplugin.h | 3 +- .../xtrxinput/xtrxinputplugin.cpp | 64 ++++++++++++----- .../samplesource/xtrxinput/xtrxinputplugin.h | 5 +- sdrbase/device/deviceenumerator.cpp | 9 ++- sdrbase/device/deviceenumerator.h | 2 + sdrbase/plugin/plugininterface.h | 57 ++++++++++++++- 64 files changed, 1377 insertions(+), 480 deletions(-) diff --git a/fcdlib/fcdtraits.cpp b/fcdlib/fcdtraits.cpp index c3d6c045d..5d67a6062 100644 --- a/fcdlib/fcdtraits.cpp +++ b/fcdlib/fcdtraits.cpp @@ -35,8 +35,8 @@ const char *fcd_traits::displayedName = "FunCube Dongle Pro+"; const char *fcd_traits::pluginDisplayedName = "FunCube Pro Input"; const char *fcd_traits::pluginDisplayedName = "FunCube Pro+ Input"; -const char *fcd_traits::pluginVersion = "4.11.6"; -const char *fcd_traits::pluginVersion = "4.11.6"; +const char *fcd_traits::pluginVersion = "4.11.10"; +const char *fcd_traits::pluginVersion = "4.11.10"; const int64_t fcd_traits::loLowLimitFreq = 64000000L; const int64_t fcd_traits::loLowLimitFreq = 150000L; diff --git a/plugins/samplemimo/testmi/testmiplugin.cpp b/plugins/samplemimo/testmi/testmiplugin.cpp index efd8c561d..8a4568a63 100644 --- a/plugins/samplemimo/testmi/testmiplugin.cpp +++ b/plugins/samplemimo/testmi/testmiplugin.cpp @@ -30,7 +30,7 @@ const PluginDescriptor TestMIPlugin::m_pluginDescriptor = { QString("Test Multiple Input"), - QString("4.11.6"), + QString("4.11.10"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -55,20 +55,44 @@ void TestMIPlugin::initPlugin(PluginAPI* pluginAPI) pluginAPI->registerSampleMIMO(m_deviceTypeID, this); } -PluginInterface::SamplingDevices TestMIPlugin::enumSampleMIMO() +void TestMIPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices) +{ + if (listedHwIds.contains(m_hardwareID)) { // check if it was done + return; + } + + originDevices.append(OriginDevice( + "TestMI", // Displayable name + m_hardwareID, // Hardware ID + QString::null, // Serial + 0, // Sequence + 2, // Number of Rx streams + 0 // Number of Tx streams + )); + + listedHwIds.append(m_hardwareID); +} + +PluginInterface::SamplingDevices TestMIPlugin::enumSampleMIMO(const OriginDevices& originDevices) { SamplingDevices result; - result.append(SamplingDevice( - "TestMI", - m_hardwareID, - m_deviceTypeID, - QString::null, - 0, - PluginInterface::SamplingDevice::BuiltInDevice, - PluginInterface::SamplingDevice::StreamMIMO, - 1, - 0)); + for (OriginDevices::const_iterator it = originDevices.begin(); it != originDevices.end(); ++it) + { + if (it->hardwareId == m_hardwareID) + { + result.append(SamplingDevice( + "TestMI", + m_hardwareID, + m_deviceTypeID, + it->serial, + it->sequence, + PluginInterface::SamplingDevice::BuiltInDevice, + PluginInterface::SamplingDevice::StreamMIMO, + 1, // MIMO is always considered as a single device + 0)); + } + } return result; } diff --git a/plugins/samplemimo/testmi/testmiplugin.h b/plugins/samplemimo/testmi/testmiplugin.h index 6a32508c0..c1a2d8622 100644 --- a/plugins/samplemimo/testmi/testmiplugin.h +++ b/plugins/samplemimo/testmi/testmiplugin.h @@ -36,7 +36,8 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - virtual SamplingDevices enumSampleMIMO(); + virtual void enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices); + virtual SamplingDevices enumSampleMIMO(const OriginDevices& originDevices); virtual PluginInstanceGUI* createSampleMIMOPluginInstanceGUI( const QString& sourceId, QWidget **widget, diff --git a/plugins/samplesink/bladerf1output/bladerf1outputplugin.cpp b/plugins/samplesink/bladerf1output/bladerf1outputplugin.cpp index ecd1b7737..4229336ce 100644 --- a/plugins/samplesink/bladerf1output/bladerf1outputplugin.cpp +++ b/plugins/samplesink/bladerf1output/bladerf1outputplugin.cpp @@ -31,7 +31,7 @@ const PluginDescriptor Bladerf1OutputPlugin::m_pluginDescriptor = { QString("BladeRF1 Output"), - QString("4.11.6"), + QString("4.11.10"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -56,9 +56,12 @@ void Bladerf1OutputPlugin::initPlugin(PluginAPI* pluginAPI) pluginAPI->registerSampleSink(m_deviceTypeID, this); } -PluginInterface::SamplingDevices Bladerf1OutputPlugin::enumSampleSinks() +void Bladerf1OutputPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices) { - SamplingDevices result; + if (listedHwIds.contains(m_hardwareID)) { // check if it was done + return; + } + struct bladerf_devinfo *devinfo = 0; int count = bladerf_get_device_list(&devinfo); @@ -73,12 +76,12 @@ PluginInterface::SamplingDevices Bladerf1OutputPlugin::enumSampleSinks() if (status == BLADERF_ERR_NODEV) { - qCritical("BladerfOutputPlugin::enumSampleSinks: No device at index %d", i); + qCritical("BladerfOutputPlugin::enumOriginDevices: No device at index %d", i); continue; } else if (status != 0) { - qCritical("BladerfOutputPlugin::enumSampleSinks: Failed to open device at index %d", i); + qCritical("BladerfOutputPlugin::enumOriginDevices: Failed to open device at index %d", i); continue; } @@ -86,18 +89,16 @@ PluginInterface::SamplingDevices Bladerf1OutputPlugin::enumSampleSinks() if (strcmp(boardName, "bladerf1") == 0) { - QString displayedName(QString("BladeRF1[%1] %2").arg(devinfo[i].instance).arg(devinfo[i].serial)); - - result.append(SamplingDevice(displayedName, - m_hardwareID, - m_deviceTypeID, - QString(devinfo[i].serial), - i, - PluginInterface::SamplingDevice::PhysicalDevice, - PluginInterface::SamplingDevice::StreamSingleTx, - 1, - 0)); + QString displayableName(QString("BladeRF1[%1] %2").arg(devinfo[i].instance).arg(devinfo[i].serial)); + originDevices.append(OriginDevice( + displayableName, + m_hardwareID, + QString(devinfo[i].serial), + i, // Sequence + 1, // Has 1 Rx known by construction + 1 // Has 1 Tx known by construction + )); } bladerf_close(dev); @@ -106,6 +107,31 @@ PluginInterface::SamplingDevices Bladerf1OutputPlugin::enumSampleSinks() bladerf_free_device_list(devinfo); // Valgrind memcheck } + listedHwIds.append(m_hardwareID); +} + +PluginInterface::SamplingDevices Bladerf1OutputPlugin::enumSampleSinks(const OriginDevices& originDevices) +{ + SamplingDevices result; + + for (OriginDevices::const_iterator it = originDevices.begin(); it != originDevices.end(); ++it) + { + if (it->hardwareId == m_hardwareID) + { + result.append(SamplingDevice( + it->displayableName, + it->hardwareId, + m_deviceTypeID, + it->serial, + it->sequence, + PluginInterface::SamplingDevice::PhysicalDevice, + PluginInterface::SamplingDevice::StreamSingleTx, + 1, // Nb of Tx streams + 0 // Stream index + )); + } + } + return result; } diff --git a/plugins/samplesink/bladerf1output/bladerf1outputplugin.h b/plugins/samplesink/bladerf1output/bladerf1outputplugin.h index ec8d46cd1..ce3e32184 100644 --- a/plugins/samplesink/bladerf1output/bladerf1outputplugin.h +++ b/plugins/samplesink/bladerf1output/bladerf1outputplugin.h @@ -36,7 +36,8 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - virtual SamplingDevices enumSampleSinks(); + virtual void enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices); + virtual SamplingDevices enumSampleSinks(const OriginDevices& originDevices); virtual PluginInstanceGUI* createSampleSinkPluginInstanceGUI( const QString& sinkId, diff --git a/plugins/samplesink/bladerf2output/bladerf2outputplugin.cpp b/plugins/samplesink/bladerf2output/bladerf2outputplugin.cpp index 3ba22ed37..ca58e3cf8 100644 --- a/plugins/samplesink/bladerf2output/bladerf2outputplugin.cpp +++ b/plugins/samplesink/bladerf2output/bladerf2outputplugin.cpp @@ -31,7 +31,7 @@ const PluginDescriptor BladeRF2OutputPlugin::m_pluginDescriptor = { QString("BladeRF2 Output"), - QString("4.11.6"), + QString("4.11.10"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -56,9 +56,12 @@ void BladeRF2OutputPlugin::initPlugin(PluginAPI* pluginAPI) pluginAPI->registerSampleSink(m_deviceTypeID, this); } -PluginInterface::SamplingDevices BladeRF2OutputPlugin::enumSampleSinks() +void BladeRF2OutputPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices) { - SamplingDevices result; + if (listedHwIds.contains(m_hardwareID)) { // check if it was done + return; + } + struct bladerf_devinfo *devinfo = 0; int count = bladerf_get_device_list(&devinfo); @@ -73,12 +76,12 @@ PluginInterface::SamplingDevices BladeRF2OutputPlugin::enumSampleSinks() if (status == BLADERF_ERR_NODEV) { - qCritical("Bladerf2OutputPlugin::enumSampleSinks: No device at index %d", i); + qCritical("Bladerf2OutputPlugin::enumOriginDevices: No device at index %d", i); continue; } else if (status != 0) { - qCritical("Bladerf2OutputPlugin::enumSampleSinks: Failed to open device at index %d", i); + qCritical("Bladerf2OutputPlugin::enumOriginDevices: Failed to open device at index %d", i); continue; } @@ -86,22 +89,19 @@ PluginInterface::SamplingDevices BladeRF2OutputPlugin::enumSampleSinks() if (strcmp(boardName, "bladerf2") == 0) { + unsigned int nbRxChannels = bladerf_get_channel_count(dev, BLADERF_RX); unsigned int nbTxChannels = bladerf_get_channel_count(dev, BLADERF_TX); + // make the stream index a placeholder for future arg() hence the arg("%1") + QString displayableName(QString("BladeRF2[%1:%2] %3").arg(devinfo[i].instance).arg("%1").arg(devinfo[i].serial)); - for (unsigned int j = 0; j < nbTxChannels; j++) - { - qDebug("Blderf2InputPlugin::enumSampleSinks: device #%d (%s) channel %u", i, devinfo[i].serial, j); - QString displayedName(QString("BladeRF2[%1:%2] %3").arg(devinfo[i].instance).arg(j).arg(devinfo[i].serial)); - result.append(SamplingDevice(displayedName, - m_hardwareID, - m_deviceTypeID, - QString(devinfo[i].serial), - i, - PluginInterface::SamplingDevice::PhysicalDevice, - PluginInterface::SamplingDevice::StreamSingleTx, - nbTxChannels, - j)); - } + originDevices.append(OriginDevice( + displayableName, + m_hardwareID, + QString(devinfo[i].serial), + i, // Sequence + nbRxChannels, + nbTxChannels + )); } bladerf_close(dev); @@ -110,6 +110,35 @@ PluginInterface::SamplingDevices BladeRF2OutputPlugin::enumSampleSinks() bladerf_free_device_list(devinfo); // Valgrind memcheck } + listedHwIds.append(m_hardwareID); +} + +PluginInterface::SamplingDevices BladeRF2OutputPlugin::enumSampleSinks(const OriginDevices& originDevices) +{ + SamplingDevices result; + + for (OriginDevices::const_iterator it = originDevices.begin(); it != originDevices.end(); ++it) + { + if (it->hardwareId == m_hardwareID) + { + for (int j = 0; j < it->nbTxStreams; j++) + { + QString displayedName(it->displayableName.arg(j)); + result.append(SamplingDevice( + displayedName, + it->hardwareId, + m_deviceTypeID, + it->serial, + it->sequence, + PluginInterface::SamplingDevice::PhysicalDevice, + PluginInterface::SamplingDevice::StreamSingleTx, + it->nbTxStreams, + j + )); + } + } + } + return result; } diff --git a/plugins/samplesink/bladerf2output/bladerf2outputplugin.h b/plugins/samplesink/bladerf2output/bladerf2outputplugin.h index a19a7fc44..a2c6e7552 100644 --- a/plugins/samplesink/bladerf2output/bladerf2outputplugin.h +++ b/plugins/samplesink/bladerf2output/bladerf2outputplugin.h @@ -36,7 +36,8 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - virtual SamplingDevices enumSampleSinks(); + virtual void enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices); + virtual SamplingDevices enumSampleSinks(const OriginDevices& originDevices); virtual PluginInstanceGUI* createSampleSinkPluginInstanceGUI( const QString& sinkId, diff --git a/plugins/samplesink/filesink/filesinkplugin.cpp b/plugins/samplesink/filesink/filesinkplugin.cpp index 5eafa8f88..83405500d 100644 --- a/plugins/samplesink/filesink/filesinkplugin.cpp +++ b/plugins/samplesink/filesink/filesinkplugin.cpp @@ -29,7 +29,7 @@ const PluginDescriptor FileSinkPlugin::m_pluginDescriptor = { QString("File sink output"), - QString("4.2.1"), + QString("4.11.10"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -54,20 +54,45 @@ void FileSinkPlugin::initPlugin(PluginAPI* pluginAPI) pluginAPI->registerSampleSink(m_deviceTypeID, this); } -PluginInterface::SamplingDevices FileSinkPlugin::enumSampleSinks() +void FileSinkPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices) +{ + if (listedHwIds.contains(m_hardwareID)) { // check if it was done + return; + } + + originDevices.append(OriginDevice( + "FileSink", + m_hardwareID, + QString::null, + 0, // Sequence + 0, // nb Rx + 1 // nb Tx + )); + + listedHwIds.append(m_hardwareID); +} + +PluginInterface::SamplingDevices FileSinkPlugin::enumSampleSinks(const OriginDevices& originDevices) { SamplingDevices result; - result.append(SamplingDevice( - "FileSink", - m_hardwareID, - m_deviceTypeID, - QString::null, - 0, - PluginInterface::SamplingDevice::BuiltInDevice, - PluginInterface::SamplingDevice::StreamSingleTx, - 1, - 0)); + for (OriginDevices::const_iterator it = originDevices.begin(); it != originDevices.end(); ++it) + { + if (it->hardwareId == m_hardwareID) + { + result.append(SamplingDevice( + it->displayableName, + it->hardwareId, + m_deviceTypeID, + it->serial, + it->sequence, + PluginInterface::SamplingDevice::BuiltInDevice, + PluginInterface::SamplingDevice::StreamSingleTx, + 1, + 0 + )); + } + } return result; } diff --git a/plugins/samplesink/filesink/filesinkplugin.h b/plugins/samplesink/filesink/filesinkplugin.h index 805ff7d94..b7989571c 100644 --- a/plugins/samplesink/filesink/filesinkplugin.h +++ b/plugins/samplesink/filesink/filesinkplugin.h @@ -37,7 +37,8 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - virtual SamplingDevices enumSampleSinks(); + virtual void enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices); + virtual SamplingDevices enumSampleSinks(const OriginDevices& originDevices); virtual PluginInstanceGUI* createSampleSinkPluginInstanceGUI( const QString& sinkId, QWidget **widget, diff --git a/plugins/samplesink/hackrfoutput/hackrfoutputplugin.cpp b/plugins/samplesink/hackrfoutput/hackrfoutputplugin.cpp index 580417012..616b068f2 100644 --- a/plugins/samplesink/hackrfoutput/hackrfoutputplugin.cpp +++ b/plugins/samplesink/hackrfoutput/hackrfoutputplugin.cpp @@ -31,7 +31,7 @@ const PluginDescriptor HackRFOutputPlugin::m_pluginDescriptor = { QString("HackRF Output"), - QString("4.11.8"), + QString("4.11.10"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -56,9 +56,12 @@ void HackRFOutputPlugin::initPlugin(PluginAPI* pluginAPI) pluginAPI->registerSampleSink(m_deviceTypeID, this); } -PluginInterface::SamplingDevices HackRFOutputPlugin::enumSampleSinks() +void HackRFOutputPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices) { - SamplingDevices result; + if (listedHwIds.contains(m_hardwareID)) { // check if it was done + return; + } + hackrf_device_list_t *hackrf_devices = hackrf_device_list(); hackrf_device *hackrf_ptr; read_partid_serialno_t read_partid_serialno; @@ -70,13 +73,13 @@ PluginInterface::SamplingDevices HackRFOutputPlugin::enumSampleSinks() if (rc == HACKRF_SUCCESS) { - qDebug("HackRFOutputPlugin::enumSampleSinks: try to enumerate HackRF device #%d", i); + qDebug("HackRFOutputPlugin::enumOriginDevices: try to enumerate HackRF device #%d", i); rc = (hackrf_error) hackrf_board_partid_serialno_read(hackrf_ptr, &read_partid_serialno); if (rc != HACKRF_SUCCESS) { - qDebug("HackRFOutputPlugin::enumSampleSinks: failed to read serial no: %s", hackrf_error_name(rc)); + qDebug("HackRFOutputPlugin::enumOriginDevices: failed to read serial no: %s", hackrf_error_name(rc)); hackrf_close(hackrf_ptr); continue; // next } @@ -88,27 +91,51 @@ PluginInterface::SamplingDevices HackRFOutputPlugin::enumSampleSinks() //uint64_t serial_num = (((uint64_t) serial_msb)<<32) + serial_lsb; QString displayedName(QString("HackRF[%1] %2").arg(i).arg(serial_str)); - result.append(SamplingDevice(displayedName, - m_hardwareID, - m_deviceTypeID, - serial_str, - i, - PluginInterface::SamplingDevice::PhysicalDevice, - PluginInterface::SamplingDevice::StreamSingleTx, - 1, - 0)); + originDevices.append(OriginDevice( + displayedName, + m_hardwareID, + serial_str, + i, + 1, + 1 + )); - qDebug("HackRFOutputPlugin::enumSampleSinks: enumerated HackRF device #%d", i); + qDebug("HackRFOutputPlugin::enumOriginDevices: enumerated HackRF device #%d", i); hackrf_close(hackrf_ptr); } else { - qDebug("HackRFOutputPlugin::enumSampleSinks: failed to enumerate HackRF device #%d: %s", i, hackrf_error_name(rc)); + qDebug("HackRFOutputPlugin::enumOriginDevices: failed to enumerate HackRF device #%d: %s", i, hackrf_error_name(rc)); } } hackrf_device_list_free(hackrf_devices); + listedHwIds.append(m_hardwareID); +} + +PluginInterface::SamplingDevices HackRFOutputPlugin::enumSampleSinks(const OriginDevices& originDevices) +{ + SamplingDevices result; + + for (OriginDevices::const_iterator it = originDevices.begin(); it != originDevices.end(); ++it) + { + if (it->hardwareId == m_hardwareID) + { + result.append(SamplingDevice( + it->displayableName, + it->hardwareId, + m_deviceTypeID, + it->serial, + it->sequence, + PluginInterface::SamplingDevice::PhysicalDevice, + PluginInterface::SamplingDevice::StreamSingleTx, + 1, + 0 + )); + } + } + return result; } diff --git a/plugins/samplesink/hackrfoutput/hackrfoutputplugin.h b/plugins/samplesink/hackrfoutput/hackrfoutputplugin.h index 9e50e1d40..6310f82e2 100644 --- a/plugins/samplesink/hackrfoutput/hackrfoutputplugin.h +++ b/plugins/samplesink/hackrfoutput/hackrfoutputplugin.h @@ -36,7 +36,8 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - virtual SamplingDevices enumSampleSinks(); + virtual void enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices); + virtual SamplingDevices enumSampleSinks(const OriginDevices& originDevices); virtual PluginInstanceGUI* createSampleSinkPluginInstanceGUI( const QString& sinkId, QWidget **widget, diff --git a/plugins/samplesink/limesdroutput/limesdroutputplugin.cpp b/plugins/samplesink/limesdroutput/limesdroutputplugin.cpp index 31e29de50..febd1bf75 100644 --- a/plugins/samplesink/limesdroutput/limesdroutputplugin.cpp +++ b/plugins/samplesink/limesdroutput/limesdroutputplugin.cpp @@ -35,7 +35,7 @@ const PluginDescriptor LimeSDROutputPlugin::m_pluginDescriptor = { QString("LimeSDR Output"), - QString("4.11.6"), + QString("4.11.10"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -60,25 +60,29 @@ void LimeSDROutputPlugin::initPlugin(PluginAPI* pluginAPI) pluginAPI->registerSampleSink(m_deviceTypeID, this); } -PluginInterface::SamplingDevices LimeSDROutputPlugin::enumSampleSinks() +void LimeSDROutputPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices) { + if (listedHwIds.contains(m_hardwareID)) { // check if it was done + return; + } + lms_info_str_t* deviceList; int nbDevices; SamplingDevices result; if ((nbDevices = LMS_GetDeviceList(0)) <= 0) { - qDebug("LimeSDROutputPlugin::enumSampleSources: Could not find any LimeSDR device"); - return result; // empty result + qDebug("LimeSDROutputPlugin::enumOriginDevices: Could not find any LimeSDR device"); + return; // do nothing } deviceList = new lms_info_str_t[nbDevices]; if (LMS_GetDeviceList(deviceList) < 0) { - qDebug("LimeSDROutputPlugin::enumSampleSources: Could not obtain LimeSDR devices information"); + qDebug("LimeSDROutputPlugin::enumOriginDevices: Could not obtain LimeSDR devices information"); delete[] deviceList; - return result; // empty result + return; // do nothing } else { @@ -91,24 +95,51 @@ PluginInterface::SamplingDevices LimeSDROutputPlugin::enumSampleSinks() limeSDRParams.open(deviceList[i]); limeSDRParams.close(); - for (unsigned int j = 0; j < limeSDRParams.m_nbTxChannels; j++) - { - qDebug("LimeSDROutputPlugin::enumSampleSources: device #%d channel %u: %s", i, j, (char *) deviceList[i]); - QString displayedName(QString("LimeSDR[%1:%2] %3").arg(i).arg(j).arg(serial.c_str())); - result.append(SamplingDevice(displayedName, - m_hardwareID, - m_deviceTypeID, - QString(deviceList[i]), - i, - PluginInterface::SamplingDevice::PhysicalDevice, - PluginInterface::SamplingDevice::StreamSingleTx, - limeSDRParams.m_nbTxChannels, - j)); - } + QString displayedName(QString("LimeSDR[%1:%2] %3").arg(i).arg("%1").arg(serial.c_str())); + + originDevices.append(OriginDevice( + displayedName, + m_hardwareID, + QString(deviceList[i]), + i, + limeSDRParams.m_nbRxChannels, + limeSDRParams.m_nbTxChannels + )); } } delete[] deviceList; + + listedHwIds.append(m_hardwareID); +} + +PluginInterface::SamplingDevices LimeSDROutputPlugin::enumSampleSinks(const OriginDevices& originDevices) +{ + SamplingDevices result; + + for (OriginDevices::const_iterator it = originDevices.begin(); it != originDevices.end(); ++it) + { + if (it->hardwareId == m_hardwareID) + { + for (unsigned int j = 0; j < it->nbTxStreams; j++) + { + qDebug("LimeSDROutputPlugin::enumSampleSinks: device #%d channel %u: %s", it->sequence, j, qPrintable(it->serial)); + QString displayedName(it->displayableName.arg(j)); + result.append(SamplingDevice( + displayedName, + it->hardwareId, + m_deviceTypeID, + it->serial, + it->sequence, + PluginInterface::SamplingDevice::PhysicalDevice, + PluginInterface::SamplingDevice::StreamSingleTx, + it->nbTxStreams, + j + )); + } + } + } + return result; } diff --git a/plugins/samplesink/limesdroutput/limesdroutputplugin.h b/plugins/samplesink/limesdroutput/limesdroutputplugin.h index 32c75527f..0acace287 100644 --- a/plugins/samplesink/limesdroutput/limesdroutputplugin.h +++ b/plugins/samplesink/limesdroutput/limesdroutputplugin.h @@ -36,7 +36,8 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - virtual SamplingDevices enumSampleSinks(); + virtual void enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices); + virtual SamplingDevices enumSampleSinks(const OriginDevices& originDevices); virtual PluginInstanceGUI* createSampleSinkPluginInstanceGUI( const QString& sinkId, QWidget **widget, diff --git a/plugins/samplesink/localoutput/localoutputplugin.cpp b/plugins/samplesink/localoutput/localoutputplugin.cpp index 8ef43eff5..ce51ff8b6 100644 --- a/plugins/samplesink/localoutput/localoutputplugin.cpp +++ b/plugins/samplesink/localoutput/localoutputplugin.cpp @@ -30,7 +30,7 @@ const PluginDescriptor LocalOutputPlugin::m_pluginDescriptor = { QString("Local device output"), - QString("4.11.6"), + QString("4.11.10"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -55,20 +55,45 @@ void LocalOutputPlugin::initPlugin(PluginAPI* pluginAPI) pluginAPI->registerSampleSink(m_deviceTypeID, this); } -PluginInterface::SamplingDevices LocalOutputPlugin::enumSampleSinks() +void LocalOutputPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices) +{ + if (listedHwIds.contains(m_hardwareID)) { // check if it was done + return; + } + + originDevices.append(OriginDevice( + "LocalOutput", + m_hardwareID, + QString::null, + 0, // Sequence + 0, // nb Rx + 1 // nb Tx + )); + + listedHwIds.append(m_hardwareID); +} + +PluginInterface::SamplingDevices LocalOutputPlugin::enumSampleSinks(const OriginDevices& originDevices) { SamplingDevices result; - result.append(SamplingDevice( - "LocalOutput", - m_hardwareID, - m_deviceTypeID, - QString::null, - 0, - PluginInterface::SamplingDevice::BuiltInDevice, - PluginInterface::SamplingDevice::StreamSingleTx, - 1, - 0)); + for (OriginDevices::const_iterator it = originDevices.begin(); it != originDevices.end(); ++it) + { + if (it->hardwareId == m_hardwareID) + { + result.append(SamplingDevice( + it->displayableName, + it->hardwareId, + m_deviceTypeID, + it->serial, + it->sequence, + PluginInterface::SamplingDevice::BuiltInDevice, + PluginInterface::SamplingDevice::StreamSingleTx, + 1, + 0 + )); + } + } return result; } diff --git a/plugins/samplesink/localoutput/localoutputplugin.h b/plugins/samplesink/localoutput/localoutputplugin.h index 64b8e012a..2f34d1e7e 100644 --- a/plugins/samplesink/localoutput/localoutputplugin.h +++ b/plugins/samplesink/localoutput/localoutputplugin.h @@ -36,7 +36,8 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - virtual SamplingDevices enumSampleSinks(); + virtual void enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices); + virtual SamplingDevices enumSampleSinks(const OriginDevices& originDevices); virtual PluginInstanceGUI* createSampleSinkPluginInstanceGUI( const QString& sinkId, QWidget **widget, diff --git a/plugins/samplesink/plutosdroutput/plutosdroutputplugin.cpp b/plugins/samplesink/plutosdroutput/plutosdroutputplugin.cpp index 1cc5c0345..99a495993 100644 --- a/plugins/samplesink/plutosdroutput/plutosdroutputplugin.cpp +++ b/plugins/samplesink/plutosdroutput/plutosdroutputplugin.cpp @@ -30,7 +30,7 @@ const PluginDescriptor PlutoSDROutputPlugin::m_pluginDescriptor = { QString("PlutoSDR Output"), - QString("4.11.6"), + QString("4.11.10"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -56,33 +56,61 @@ void PlutoSDROutputPlugin::initPlugin(PluginAPI* pluginAPI) DevicePlutoSDR::instance(); // create singleton } -PluginInterface::SamplingDevices PlutoSDROutputPlugin::enumSampleSinks() +void PlutoSDROutputPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices) { + if (listedHwIds.contains(m_hardwareID)) { // check if it was done + return; + } + DevicePlutoSDR::instance().scan(); std::vector serials; DevicePlutoSDR::instance().getSerials(serials); std::vector::const_iterator it = serials.begin(); int i; - SamplingDevices result; for (i = 0; it != serials.end(); ++it, ++i) { QString serial_str = QString::fromLocal8Bit(it->c_str()); - QString displayedName(QString("PlutoSDR[%1] %2").arg(i).arg(serial_str)); + QString displayableName(QString("PlutoSDR[%1] %2").arg(i).arg(serial_str)); - result.append(SamplingDevice(displayedName, - m_hardwareID, + originDevices.append(OriginDevice( + displayableName, + m_hardwareID, + serial_str, + i, // sequence + 1, // Nb Rx + 1 // Nb Tx + )); + + qDebug("PlutoSDROutputPlugin::enumOriginDevices: enumerated PlutoSDR device #%d", i); + } + + listedHwIds.append(m_hardwareID); +} + +PluginInterface::SamplingDevices PlutoSDROutputPlugin::enumSampleSinks(const OriginDevices& originDevices) +{ + SamplingDevices result; + + for (OriginDevices::const_iterator it = originDevices.begin(); it != originDevices.end(); ++it) + { + if (it->hardwareId == m_hardwareID) + { + result.append(SamplingDevice( + it->displayableName, + it->hardwareId, m_deviceTypeID, - serial_str, - i, + it->serial, + it->sequence, PluginInterface::SamplingDevice::PhysicalDevice, PluginInterface::SamplingDevice::StreamSingleTx, 1, - 0)); - - qDebug("PlutoSDROutputPlugin::enumSampleSources: enumerated PlutoSDR device #%d", i); - } + 0 + )); + qDebug("PlutoSDROutputPlugin::enumSampleSources: enumerated PlutoSDR device #%d", it->sequence); + } + } return result; } diff --git a/plugins/samplesink/plutosdroutput/plutosdroutputplugin.h b/plugins/samplesink/plutosdroutput/plutosdroutputplugin.h index 3a60b4a58..5ddef64cb 100644 --- a/plugins/samplesink/plutosdroutput/plutosdroutputplugin.h +++ b/plugins/samplesink/plutosdroutput/plutosdroutputplugin.h @@ -36,7 +36,8 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - virtual SamplingDevices enumSampleSinks(); + virtual void enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices); + virtual SamplingDevices enumSampleSinks(const OriginDevices& originDevices); virtual PluginInstanceGUI* createSampleSinkPluginInstanceGUI( const QString& sinkId, QWidget **widget, diff --git a/plugins/samplesink/remoteoutput/remoteoutputplugin.cpp b/plugins/samplesink/remoteoutput/remoteoutputplugin.cpp index 17c09c47d..b9689676e 100644 --- a/plugins/samplesink/remoteoutput/remoteoutputplugin.cpp +++ b/plugins/samplesink/remoteoutput/remoteoutputplugin.cpp @@ -30,7 +30,7 @@ const PluginDescriptor RemoteOutputPlugin::m_pluginDescriptor = { QString("Remote device output"), - QString("4.11.6"), + QString("4.11.10"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -55,20 +55,45 @@ void RemoteOutputPlugin::initPlugin(PluginAPI* pluginAPI) pluginAPI->registerSampleSink(m_deviceTypeID, this); } -PluginInterface::SamplingDevices RemoteOutputPlugin::enumSampleSinks() +void RemoteOutputPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices) +{ + if (listedHwIds.contains(m_hardwareID)) { // check if it was done + return; + } + + originDevices.append(OriginDevice( + "RemoteOutput", + m_hardwareID, + QString::null, + 0, // Sequence + 0, // nb Rx + 1 // nb Tx + )); + + listedHwIds.append(m_hardwareID); +} + +PluginInterface::SamplingDevices RemoteOutputPlugin::enumSampleSinks(const OriginDevices& originDevices) { SamplingDevices result; - result.append(SamplingDevice( - "RemoteOutput", - m_hardwareID, - m_deviceTypeID, - QString::null, - 0, - PluginInterface::SamplingDevice::BuiltInDevice, - PluginInterface::SamplingDevice::StreamSingleTx, - 1, - 0)); + for (OriginDevices::const_iterator it = originDevices.begin(); it != originDevices.end(); ++it) + { + if (it->hardwareId == m_hardwareID) + { + result.append(SamplingDevice( + it->displayableName, + it->hardwareId, + m_deviceTypeID, + it->serial, + it->sequence, + PluginInterface::SamplingDevice::BuiltInDevice, + PluginInterface::SamplingDevice::StreamSingleTx, + 1, + 0 + )); + } + } return result; } diff --git a/plugins/samplesink/remoteoutput/remoteoutputplugin.h b/plugins/samplesink/remoteoutput/remoteoutputplugin.h index f204112b0..1f44f0f95 100644 --- a/plugins/samplesink/remoteoutput/remoteoutputplugin.h +++ b/plugins/samplesink/remoteoutput/remoteoutputplugin.h @@ -37,7 +37,8 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - virtual SamplingDevices enumSampleSinks(); + virtual void enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices); + virtual SamplingDevices enumSampleSinks(const OriginDevices& originDevices); virtual PluginInstanceGUI* createSampleSinkPluginInstanceGUI( const QString& sinkId, QWidget **widget, diff --git a/plugins/samplesink/soapysdroutput/soapysdroutputplugin.cpp b/plugins/samplesink/soapysdroutput/soapysdroutputplugin.cpp index a8646ed0b..6ab741b3c 100644 --- a/plugins/samplesink/soapysdroutput/soapysdroutputplugin.cpp +++ b/plugins/samplesink/soapysdroutput/soapysdroutputplugin.cpp @@ -32,7 +32,7 @@ const PluginDescriptor SoapySDROutputPlugin::m_pluginDescriptor = { QString("SoapySDR Output"), - QString("4.11.6"), + QString("4.11.10"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -57,33 +57,62 @@ void SoapySDROutputPlugin::initPlugin(PluginAPI* pluginAPI) pluginAPI->registerSampleSink(m_deviceTypeID, this); } -PluginInterface::SamplingDevices SoapySDROutputPlugin::enumSampleSinks() +void SoapySDROutputPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices) { - SamplingDevices result; + if (listedHwIds.contains(m_hardwareID)) { // check if it was done + return; + } + DeviceSoapySDR& deviceSoapySDR = DeviceSoapySDR::instance(); const std::vector& devicesEnumeration = deviceSoapySDR.getDevicesEnumeration(); - qDebug("SoapySDROutputPlugin::enumSampleSinks: %lu SoapySDR devices. Enumerate these with Tx channel(s):", devicesEnumeration.size()); + qDebug("SoapySDROutputPlugin::enumOriginDevices: %lu SoapySDR devices", devicesEnumeration.size()); std::vector::const_iterator it = devicesEnumeration.begin(); for (int idev = 0; it != devicesEnumeration.end(); ++it, idev++) { - unsigned int nbTxChannels = it->m_nbTx; + QString displayedName(QString("SoapySDR[%1:%2] %3").arg(idev).arg("%1").arg(it->m_label)); + QString serial(QString("%1-%2").arg(it->m_driverName).arg(it->m_sequence)); - for (unsigned int ichan = 0; ichan < nbTxChannels; ichan++) + originDevices.append(OriginDevice( + displayedName, + m_hardwareID, + serial, + idev, // Sequence + it->m_nbRx, // nb Rx + it->m_nbTx // nb Tx + )); + } + + listedHwIds.append(m_hardwareID); +} + +PluginInterface::SamplingDevices SoapySDROutputPlugin::enumSampleSinks(const OriginDevices& originDevices) +{ + SamplingDevices result; + + for (OriginDevices::const_iterator it = originDevices.begin(); it != originDevices.end(); ++it) + { + if (it->hardwareId == m_hardwareID) { - QString displayedName(QString("SoapySDR[%1:%2] %3").arg(idev).arg(ichan).arg(it->m_label)); - QString serial(QString("%1-%2").arg(it->m_driverName).arg(it->m_sequence)); - qDebug("SoapySDROutputPlugin::enumSampleSinks: device #%d (%s) serial %s channel %u", - idev, it->m_label.toStdString().c_str(), serial.toStdString().c_str(), ichan); - result.append(SamplingDevice(displayedName, - m_hardwareID, + unsigned int nbTxChannels = it->nbTxStreams; + + for (unsigned int ichan = 0; ichan < nbTxChannels; ichan++) + { + QString displayedName(it->displayableName.arg(ichan)); + qDebug("SoapySDROutputPlugin::enumSampleSinks: device #%d serial %s channel %u", + it->sequence, it->serial.toStdString().c_str(), ichan); + result.append(SamplingDevice( + displayedName, + it->hardwareId, m_deviceTypeID, - serial, - idev, + it->serial, + it->sequence, PluginInterface::SamplingDevice::PhysicalDevice, PluginInterface::SamplingDevice::StreamSingleTx, nbTxChannels, - ichan)); + ichan + )); + } } } diff --git a/plugins/samplesink/soapysdroutput/soapysdroutputplugin.h b/plugins/samplesink/soapysdroutput/soapysdroutputplugin.h index 819b4007b..98af4ae5d 100644 --- a/plugins/samplesink/soapysdroutput/soapysdroutputplugin.h +++ b/plugins/samplesink/soapysdroutput/soapysdroutputplugin.h @@ -36,7 +36,8 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - virtual SamplingDevices enumSampleSinks(); + virtual void enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices); + virtual SamplingDevices enumSampleSinks(const OriginDevices& originDevices); virtual PluginInstanceGUI* createSampleSinkPluginInstanceGUI( const QString& sinkId, diff --git a/plugins/samplesink/xtrxoutput/xtrxoutputplugin.cpp b/plugins/samplesink/xtrxoutput/xtrxoutputplugin.cpp index 0ac9d6db9..ecd99abde 100644 --- a/plugins/samplesink/xtrxoutput/xtrxoutputplugin.cpp +++ b/plugins/samplesink/xtrxoutput/xtrxoutputplugin.cpp @@ -35,7 +35,7 @@ const PluginDescriptor XTRXOutputPlugin::m_pluginDescriptor = { QString("XTRX Output"), - QString("4.11.6"), + QString("4.11.10"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -60,29 +60,61 @@ void XTRXOutputPlugin::initPlugin(PluginAPI* pluginAPI) pluginAPI->registerSampleSink(m_deviceTypeID, this); } -PluginInterface::SamplingDevices XTRXOutputPlugin::enumSampleSinks() +void XTRXOutputPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices) { - SamplingDevices result; + if (listedHwIds.contains(m_hardwareID)) { // check if it was done + return; + } + xtrx_device_info_t devs[32]; int res = xtrx_discovery(devs, 32); int i; - for (i = 0; i < res; i++) { + + for (i = 0; i < res; i++) + { DeviceXTRXParams XTRXParams; - for (unsigned int j = 0; j < XTRXParams.m_nbTxChannels; j++) + QString displayableName(QString("XTRX[%1:%2] %3").arg(i).arg("%1").arg(devs[i].uniqname)); + + originDevices.append(OriginDevice( + displayableName, + m_hardwareID, + QString(devs[i].uniqname), + i, + XTRXParams.m_nbRxChannels, + XTRXParams.m_nbTxChannels + )); + } + + listedHwIds.append(m_hardwareID); +} + +PluginInterface::SamplingDevices XTRXOutputPlugin::enumSampleSinks(const OriginDevices& originDevices) +{ + SamplingDevices result; + + for (OriginDevices::const_iterator it = originDevices.begin(); it != originDevices.end(); ++it) + { + if (it->hardwareId == m_hardwareID) { - qDebug("XTRXInputPlugin::enumSampleSinks: device #%d channel %u: %s", i, j, devs[i].uniqname); - QString displayedName(QString("XTRX[%1:%2] %3").arg(i).arg(j).arg(devs[i].uniqname)); - result.append(SamplingDevice(displayedName, - m_hardwareID, - m_deviceTypeID, - QString(devs[i].uniqname), - i, - PluginInterface::SamplingDevice::PhysicalDevice, - PluginInterface::SamplingDevice::StreamSingleTx, - XTRXParams.m_nbTxChannels, - j)); + for (unsigned int j = 0; j < it->nbTxStreams; j++) + { + qDebug("XTRXInputPlugin::enumSampleSinks: device #%d channel %u: %s", it->sequence, j, qPrintable(it->serial)); + QString displayedName(it->displayableName.arg(j)); + result.append(SamplingDevice( + displayedName, + it->hardwareId, + m_deviceTypeID, + it->serial, + it->sequence, + PluginInterface::SamplingDevice::PhysicalDevice, + PluginInterface::SamplingDevice::StreamSingleTx, + it->nbTxStreams, + j + )); + } } } + return result; } diff --git a/plugins/samplesink/xtrxoutput/xtrxoutputplugin.h b/plugins/samplesink/xtrxoutput/xtrxoutputplugin.h index 423c0341b..a2b36c55a 100644 --- a/plugins/samplesink/xtrxoutput/xtrxoutputplugin.h +++ b/plugins/samplesink/xtrxoutput/xtrxoutputplugin.h @@ -36,7 +36,8 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - virtual SamplingDevices enumSampleSinks(); + virtual void enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices); + virtual SamplingDevices enumSampleSinks(const OriginDevices& originDevices); virtual PluginInstanceGUI* createSampleSinkPluginInstanceGUI( const QString& sinkId, QWidget **widget, diff --git a/plugins/samplesource/airspy/airspyplugin.cpp b/plugins/samplesource/airspy/airspyplugin.cpp index 9a2e220eb..542d3f26a 100644 --- a/plugins/samplesource/airspy/airspyplugin.cpp +++ b/plugins/samplesource/airspy/airspyplugin.cpp @@ -33,7 +33,7 @@ const int AirspyPlugin::m_maxDevices = 32; const PluginDescriptor AirspyPlugin::m_pluginDescriptor = { QString("Airspy Input"), - QString("4.11.6"), + QString("4.11.10"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -58,9 +58,12 @@ void AirspyPlugin::initPlugin(PluginAPI* pluginAPI) pluginAPI->registerSampleSource(m_deviceTypeID, this); } -PluginInterface::SamplingDevices AirspyPlugin::enumSampleSources() +void AirspyPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices) { - SamplingDevices result; + if (listedHwIds.contains(m_hardwareID)) { // check if it was done + return; + } + airspy_read_partid_serialno_t read_partid_serialno; struct airspy_device *devinfo; uint32_t serial_msb = 0; @@ -72,7 +75,7 @@ PluginInterface::SamplingDevices AirspyPlugin::enumSampleSources() if (rc != AIRSPY_SUCCESS) { - qCritical("AirspyPlugin::enumSampleSources: failed to initiate Airspy library: %s", airspy_error_name(rc)); + qCritical("AirspyPlugin::enumOriginDevices: failed to initiate Airspy library: %s", airspy_error_name(rc)); } for (i=0; i < m_maxDevices; i++) @@ -81,13 +84,13 @@ PluginInterface::SamplingDevices AirspyPlugin::enumSampleSources() if (rc == AIRSPY_SUCCESS) { - qDebug("AirspyPlugin::enumSampleSources: try to enumerate Airspy device #%d", i); + qDebug("AirspyPlugin::enumOriginDevices: try to enumerate Airspy device #%d", i); rc = (airspy_error) airspy_board_partid_serialno_read(devinfo, &read_partid_serialno); if (rc != AIRSPY_SUCCESS) { - qDebug("AirspyPlugin::enumSampleSources: failed to read serial no: %s", airspy_error_name(rc)); + qDebug("AirspyPlugin::enumOriginDevices: failed to read serial no: %s", airspy_error_name(rc)); airspy_close(devinfo); continue; // next } @@ -99,32 +102,57 @@ PluginInterface::SamplingDevices AirspyPlugin::enumSampleSources() QString serial_str = QString::number(serial_msb, 16) + QString::number(serial_lsb, 16); //uint64_t serial_num = (((uint64_t) serial_msb)<<32) + serial_lsb; - QString displayedName(QString("Airspy[%1] %2").arg(i).arg(serial_str)); + QString displayableName(QString("Airspy[%1] %2").arg(i).arg(serial_str)); - result.append(SamplingDevice(displayedName, - m_hardwareID, - m_deviceTypeID, - serial_str, - i, - PluginInterface::SamplingDevice::PhysicalDevice, - PluginInterface::SamplingDevice::StreamSingleRx, - 1, - 0)); + originDevices.append(OriginDevice( + displayableName, + m_hardwareID, + serial_str, + i, + 1, + 0 + )); - qDebug("AirspyPlugin::enumSampleSources: enumerated Airspy device #%d", i); + qDebug("AirspyPlugin::enumOriginDevices: enumerated Airspy device #%d", i); } airspy_close(devinfo); } else { - qDebug("AirspyPlugin::enumSampleSources: enumerated %d Airspy devices %s", i, airspy_error_name(rc)); + qDebug("AirspyPlugin::enumOriginDevices: enumerated %d Airspy devices %s", i, airspy_error_name(rc)); break; // finished } } rc = (airspy_error) airspy_exit(); - qDebug("AirspyPlugin::enumSampleSources: airspy_exit: %s", airspy_error_name(rc)); + qDebug("AirspyPlugin::enumOriginDevices: airspy_exit: %s", airspy_error_name(rc)); + + listedHwIds.append(m_hardwareID); +} + +PluginInterface::SamplingDevices AirspyPlugin::enumSampleSources(const OriginDevices& originDevices) +{ + SamplingDevices result; + + for (OriginDevices::const_iterator it = originDevices.begin(); it != originDevices.end(); ++it) + { + if (it->hardwareId == m_hardwareID) + { + result.append(SamplingDevice( + it->displayableName, + m_hardwareID, + m_deviceTypeID, + it->serial, + it->sequence, + PluginInterface::SamplingDevice::PhysicalDevice, + PluginInterface::SamplingDevice::StreamSingleRx, + 1, + 0 + )); + qDebug("AirspyPlugin::enumSampleSources: enumerated Airspy device #%d", it->sequence); + } + } return result; } diff --git a/plugins/samplesource/airspy/airspyplugin.h b/plugins/samplesource/airspy/airspyplugin.h index ce268d4d9..2d3ac93b4 100644 --- a/plugins/samplesource/airspy/airspyplugin.h +++ b/plugins/samplesource/airspy/airspyplugin.h @@ -36,7 +36,8 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - virtual SamplingDevices enumSampleSources(); + virtual void enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices); + virtual SamplingDevices enumSampleSources(const OriginDevices& originDevices); virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI( const QString& sourceId, QWidget **widget, diff --git a/plugins/samplesource/airspyhf/airspyhfplugin.cpp b/plugins/samplesource/airspyhf/airspyhfplugin.cpp index 61476bde3..9e59d8ff8 100644 --- a/plugins/samplesource/airspyhf/airspyhfplugin.cpp +++ b/plugins/samplesource/airspyhf/airspyhfplugin.cpp @@ -31,7 +31,7 @@ const PluginDescriptor AirspyHFPlugin::m_pluginDescriptor = { QString("AirspyHF Input"), - QString("4.11.6"), + QString("4.11.10"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -57,9 +57,12 @@ void AirspyHFPlugin::initPlugin(PluginAPI* pluginAPI) pluginAPI->registerSampleSource(m_deviceTypeID, this); } -PluginInterface::SamplingDevices AirspyHFPlugin::enumSampleSources() +void AirspyHFPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices) { - SamplingDevices result; + if (listedHwIds.contains(m_hardwareID)) { // check if it was done + return; + } + int nbDevices; uint64_t deviceSerials[m_maxDevices]; @@ -67,7 +70,7 @@ PluginInterface::SamplingDevices AirspyHFPlugin::enumSampleSources() if (nbDevices < 0) { - qCritical("AirspyHFPlugin::enumSampleSources: failed to list Airspy HF devices"); + qCritical("AirspyHFPlugin::enumOriginDevices: failed to list Airspy HF devices"); } for (int i = 0; i < nbDevices; i++) @@ -75,27 +78,52 @@ PluginInterface::SamplingDevices AirspyHFPlugin::enumSampleSources() if (deviceSerials[i]) { QString serial_str = QString::number(deviceSerials[i], 16); - QString displayedName(QString("AirspyHF[%1] %2").arg(i).arg(serial_str)); + QString displayableName(QString("AirspyHF[%1] %2").arg(i).arg(serial_str)); - result.append(SamplingDevice(displayedName, - m_hardwareID, - m_deviceTypeID, - serial_str, - i, - PluginInterface::SamplingDevice::PhysicalDevice, - PluginInterface::SamplingDevice::StreamSingleRx, - 1, - 0)); + originDevices.append(OriginDevice( + displayableName, + m_hardwareID, + serial_str, + i, + 1, + 0 + )); - qDebug("AirspyHFPlugin::enumSampleSources: enumerated Airspy HF device #%d", i); + qDebug("AirspyHFPlugin::enumOriginDevices: enumerated Airspy HF device #%d", i); } else { - qDebug("AirspyHFPlugin::enumSampleSources: finished to enumerate Airspy HF. %d devices found", i); + qDebug("AirspyHFPlugin::enumOriginDevices: finished to enumerate Airspy HF. %d devices found", i); break; // finished } } + listedHwIds.append(m_hardwareID); +} + +PluginInterface::SamplingDevices AirspyHFPlugin::enumSampleSources(const OriginDevices& originDevices) +{ + SamplingDevices result; + + for (OriginDevices::const_iterator it = originDevices.begin(); it != originDevices.end(); ++it) + { + if (it->hardwareId == m_hardwareID) + { + result.append(SamplingDevice( + it->displayableName, + m_hardwareID, + m_deviceTypeID, + it->serial, + it->sequence, + PluginInterface::SamplingDevice::PhysicalDevice, + PluginInterface::SamplingDevice::StreamSingleRx, + 1, + 0 + )); + qDebug("AirspyHFPlugin::enumSampleSources: enumerated Airspy HF device #%d", it->sequence); + } + } + return result; } diff --git a/plugins/samplesource/airspyhf/airspyhfplugin.h b/plugins/samplesource/airspyhf/airspyhfplugin.h index 75ae2873a..029c7d26f 100644 --- a/plugins/samplesource/airspyhf/airspyhfplugin.h +++ b/plugins/samplesource/airspyhf/airspyhfplugin.h @@ -36,7 +36,8 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - virtual SamplingDevices enumSampleSources(); + virtual void enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices); + virtual SamplingDevices enumSampleSources(const OriginDevices& originDevices); virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI( const QString& sourceId, QWidget **widget, diff --git a/plugins/samplesource/bladerf1input/bladerf1inputplugin.cpp b/plugins/samplesource/bladerf1input/bladerf1inputplugin.cpp index fa9b0f1e0..5b247f58c 100644 --- a/plugins/samplesource/bladerf1input/bladerf1inputplugin.cpp +++ b/plugins/samplesource/bladerf1input/bladerf1inputplugin.cpp @@ -31,7 +31,7 @@ const PluginDescriptor Blderf1InputPlugin::m_pluginDescriptor = { QString("BladeRF1 Input"), - QString("4.5.4"), + QString("4.11.10"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -56,11 +56,13 @@ void Blderf1InputPlugin::initPlugin(PluginAPI* pluginAPI) pluginAPI->registerSampleSource(m_deviceTypeID, this); } -PluginInterface::SamplingDevices Blderf1InputPlugin::enumSampleSources() +void Blderf1InputPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices) { - SamplingDevices result; - struct bladerf_devinfo *devinfo = nullptr; + if (listedHwIds.contains(m_hardwareID)) { // check if it was done + return; + } + struct bladerf_devinfo *devinfo = nullptr; int count = bladerf_get_device_list(&devinfo); if (devinfo) @@ -86,17 +88,16 @@ PluginInterface::SamplingDevices Blderf1InputPlugin::enumSampleSources() if (strcmp(boardName, "bladerf1") == 0) { - QString displayedName(QString("BladeRF1[%1] %2").arg(devinfo[i].instance).arg(devinfo[i].serial)); + QString displayableName(QString("BladeRF1[%1] %2").arg(devinfo[i].instance).arg(devinfo[i].serial)); - result.append(SamplingDevice(displayedName, - m_hardwareID, - m_deviceTypeID, - QString(devinfo[i].serial), - i, - PluginInterface::SamplingDevice::PhysicalDevice, - PluginInterface::SamplingDevice::StreamSingleRx, - 1, - 0)); + originDevices.append(OriginDevice( + displayableName, + m_hardwareID, + devinfo[i].serial, + i, + 1, // nb Rx + 1 // nb Tx + )); } bladerf_close(dev); @@ -105,6 +106,30 @@ PluginInterface::SamplingDevices Blderf1InputPlugin::enumSampleSources() bladerf_free_device_list(devinfo); // Valgrind memcheck } + listedHwIds.append(m_hardwareID); +} + +PluginInterface::SamplingDevices Blderf1InputPlugin::enumSampleSources(const OriginDevices& originDevices) +{ + SamplingDevices result; + + for (OriginDevices::const_iterator it = originDevices.begin(); it != originDevices.end(); ++it) + { + if (it->hardwareId == m_hardwareID) + { + result.append(SamplingDevice( + it->displayableName, + m_hardwareID, + m_deviceTypeID, + it->serial, + it->sequence, + PluginInterface::SamplingDevice::PhysicalDevice, + PluginInterface::SamplingDevice::StreamSingleRx, + 1, + 0)); + } + } + return result; } diff --git a/plugins/samplesource/bladerf1input/bladerf1inputplugin.h b/plugins/samplesource/bladerf1input/bladerf1inputplugin.h index 61809a3d9..6349474d2 100644 --- a/plugins/samplesource/bladerf1input/bladerf1inputplugin.h +++ b/plugins/samplesource/bladerf1input/bladerf1inputplugin.h @@ -38,7 +38,8 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - virtual SamplingDevices enumSampleSources(); + virtual void enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices); + virtual SamplingDevices enumSampleSources(const OriginDevices& originDevices); virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI( const QString& sourceId, QWidget **widget, diff --git a/plugins/samplesource/bladerf2input/bladerf2inputplugin.cpp b/plugins/samplesource/bladerf2input/bladerf2inputplugin.cpp index 587cc4678..34a063e49 100644 --- a/plugins/samplesource/bladerf2input/bladerf2inputplugin.cpp +++ b/plugins/samplesource/bladerf2input/bladerf2inputplugin.cpp @@ -31,7 +31,7 @@ const PluginDescriptor Blderf2InputPlugin::m_pluginDescriptor = { QString("BladeRF2 Input"), - QString("4.11.6"), + QString("4.11.10"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -56,9 +56,12 @@ void Blderf2InputPlugin::initPlugin(PluginAPI* pluginAPI) pluginAPI->registerSampleSource(m_deviceTypeID, this); } -PluginInterface::SamplingDevices Blderf2InputPlugin::enumSampleSources() +void Blderf2InputPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices) { - SamplingDevices result; + if (listedHwIds.contains(m_hardwareID)) { // check if it was done + return; + } + struct bladerf_devinfo *devinfo = 0; int count = bladerf_get_device_list(&devinfo); @@ -73,12 +76,12 @@ PluginInterface::SamplingDevices Blderf2InputPlugin::enumSampleSources() if (status == BLADERF_ERR_NODEV) { - qCritical("Blderf2InputPlugin::enumSampleSources: No device at index %d", i); + qCritical("Blderf2InputPlugin::enumOriginDevices: No device at index %d", i); continue; } else if (status != 0) { - qCritical("Blderf2InputPlugin::enumSampleSources: Failed to open device at index %d", i); + qCritical("Blderf2InputPlugin::enumOriginDevices: Failed to open device at index %d", i); continue; } @@ -87,21 +90,18 @@ PluginInterface::SamplingDevices Blderf2InputPlugin::enumSampleSources() if (strcmp(boardName, "bladerf2") == 0) { unsigned int nbRxChannels = bladerf_get_channel_count(dev, BLADERF_RX); + unsigned int nbTxChannels = bladerf_get_channel_count(dev, BLADERF_TX); + qDebug("Blderf2InputPlugin::enumOriginDevices: device #%d (%s)", i, devinfo[i].serial); + QString displayableName(QString("BladeRF2[%1:%2] %3").arg(devinfo[i].instance).arg("%1").arg(devinfo[i].serial)); - for (unsigned int j = 0; j < nbRxChannels; j++) - { - qDebug("Blderf2InputPlugin::enumSampleSources: device #%d (%s) channel %u", i, devinfo[i].serial, j); - QString displayedName(QString("BladeRF2[%1:%2] %3").arg(devinfo[i].instance).arg(j).arg(devinfo[i].serial)); - result.append(SamplingDevice(displayedName, - m_hardwareID, - m_deviceTypeID, - QString(devinfo[i].serial), - i, - PluginInterface::SamplingDevice::PhysicalDevice, - PluginInterface::SamplingDevice::StreamSingleRx, - nbRxChannels, - j)); - } + originDevices.append(OriginDevice( + displayableName, + m_hardwareID, + devinfo[i].serial, + i, + 2, // nb Rx + 2 // nb Tx + )); } bladerf_close(dev); @@ -110,6 +110,33 @@ PluginInterface::SamplingDevices Blderf2InputPlugin::enumSampleSources() bladerf_free_device_list(devinfo); // Valgrind memcheck } + listedHwIds.append(m_hardwareID); +} + +PluginInterface::SamplingDevices Blderf2InputPlugin::enumSampleSources(const OriginDevices& originDevices) +{ + SamplingDevices result; + + for (OriginDevices::const_iterator it = originDevices.begin(); it != originDevices.end(); ++it) + { + if (it->hardwareId == m_hardwareID) + { + for (int j=0; j < it->nbRxStreams; j++) + { + result.append(SamplingDevice( + it->displayableName, + m_hardwareID, + m_deviceTypeID, + it->serial, + it->sequence, + PluginInterface::SamplingDevice::PhysicalDevice, + PluginInterface::SamplingDevice::StreamSingleRx, + it->nbRxStreams, + j)); + } + } + } + return result; } diff --git a/plugins/samplesource/bladerf2input/bladerf2inputplugin.h b/plugins/samplesource/bladerf2input/bladerf2inputplugin.h index b16b53058..de7d17df6 100644 --- a/plugins/samplesource/bladerf2input/bladerf2inputplugin.h +++ b/plugins/samplesource/bladerf2input/bladerf2inputplugin.h @@ -38,7 +38,8 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - virtual SamplingDevices enumSampleSources(); + virtual void enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices); + virtual SamplingDevices enumSampleSources(const OriginDevices& originDevices); virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI( const QString& sourceId, QWidget **widget, diff --git a/plugins/samplesource/fcdpro/fcdproplugin.cpp b/plugins/samplesource/fcdpro/fcdproplugin.cpp index b5170b99f..cdb202949 100644 --- a/plugins/samplesource/fcdpro/fcdproplugin.cpp +++ b/plugins/samplesource/fcdpro/fcdproplugin.cpp @@ -52,9 +52,11 @@ void FCDProPlugin::initPlugin(PluginAPI* pluginAPI) pluginAPI->registerSampleSource(fcd_traits::interfaceIID, this); } -PluginInterface::SamplingDevices FCDProPlugin::enumSampleSources() +void FCDProPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices) { - SamplingDevices result; + if (listedHwIds.contains(fcd_traits::hardwareID)) { // check if it was done + return; + } int i = 0; struct hid_device_info *device_info = hid_enumerate(fcd_traits::vendorId, fcd_traits::productId); @@ -62,22 +64,45 @@ PluginInterface::SamplingDevices FCDProPlugin::enumSampleSources() while (device_info != 0) { QString serialNumber = QString::fromWCharArray(device_info->serial_number); - QString displayedName(QString("%1[%2] %3").arg(fcd_traits::displayedName).arg(i).arg(serialNumber)); + QString displayableName(QString("%1[%2] %3").arg(fcd_traits::displayedName).arg(i).arg(serialNumber)); - result.append(SamplingDevice(displayedName, - fcd_traits::hardwareID, - fcd_traits::interfaceIID, - serialNumber, - i, - PluginInterface::SamplingDevice::PhysicalDevice, - PluginInterface::SamplingDevice::StreamSingleRx, - 1, - 0)); + originDevices.append(OriginDevice( + displayableName, + fcd_traits::hardwareID, + serialNumber, + i, + 1, // nb Rx + 0 // nb Tx + )); device_info = device_info->next; i++; } + listedHwIds.append(fcd_traits::hardwareID); +} + +PluginInterface::SamplingDevices FCDProPlugin::enumSampleSources(const OriginDevices& originDevices) +{ + SamplingDevices result; + + for (OriginDevices::const_iterator it = originDevices.begin(); it != originDevices.end(); ++it) + { + if (it->hardwareId == fcd_traits::hardwareID) + { + result.append(SamplingDevice( + it->displayableName, + fcd_traits::hardwareID, + fcd_traits::interfaceIID, + it->serial, + it->sequence, + PluginInterface::SamplingDevice::PhysicalDevice, + PluginInterface::SamplingDevice::StreamSingleRx, + 1, + 0)); + } + } + return result; } diff --git a/plugins/samplesource/fcdpro/fcdproplugin.h b/plugins/samplesource/fcdpro/fcdproplugin.h index de495de7e..832f725e5 100644 --- a/plugins/samplesource/fcdpro/fcdproplugin.h +++ b/plugins/samplesource/fcdpro/fcdproplugin.h @@ -19,7 +19,8 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - virtual SamplingDevices enumSampleSources(); + virtual void enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices); + virtual SamplingDevices enumSampleSources(const OriginDevices& originDevices); virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI( const QString& sourceId, QWidget **widget, diff --git a/plugins/samplesource/fcdproplus/fcdproplusplugin.cpp b/plugins/samplesource/fcdproplus/fcdproplusplugin.cpp index 9efd59975..abc2eab1e 100644 --- a/plugins/samplesource/fcdproplus/fcdproplusplugin.cpp +++ b/plugins/samplesource/fcdproplus/fcdproplusplugin.cpp @@ -54,9 +54,11 @@ void FCDProPlusPlugin::initPlugin(PluginAPI* pluginAPI) pluginAPI->registerSampleSource(fcd_traits::interfaceIID, this); } -PluginInterface::SamplingDevices FCDProPlusPlugin::enumSampleSources() +void FCDProPlusPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices) { - SamplingDevices result; + if (listedHwIds.contains(fcd_traits::hardwareID)) { // check if it was done + return; + } int i = 0; struct hid_device_info *device_info = hid_enumerate(fcd_traits::vendorId, fcd_traits::productId); @@ -64,22 +66,46 @@ PluginInterface::SamplingDevices FCDProPlusPlugin::enumSampleSources() while (device_info != 0) { QString serialNumber = QString::fromWCharArray(device_info->serial_number); - QString displayedName(QString("%1[%2] %3").arg(fcd_traits::displayedName).arg(i).arg(serialNumber)); + QString displayableName(QString("%1[%2] %3").arg(fcd_traits::displayedName).arg(i).arg(serialNumber)); - result.append(SamplingDevice(displayedName, - fcd_traits::hardwareID, - fcd_traits::interfaceIID, - serialNumber, - i, - PluginInterface::SamplingDevice::PhysicalDevice, - PluginInterface::SamplingDevice::StreamSingleRx, - 1, - 0)); + originDevices.append(OriginDevice( + displayableName, + fcd_traits::hardwareID, + serialNumber, + i, + 1, // nb Rx + 0 // nb Tx + )); device_info = device_info->next; i++; } + listedHwIds.append(fcd_traits::hardwareID); +} + +PluginInterface::SamplingDevices FCDProPlusPlugin::enumSampleSources(const OriginDevices& originDevices) +{ + SamplingDevices result; + + for (OriginDevices::const_iterator it = originDevices.begin(); it != originDevices.end(); ++it) + { + if (it->hardwareId == fcd_traits::hardwareID) + { + result.append(SamplingDevice( + it->displayableName, + fcd_traits::hardwareID, + fcd_traits::interfaceIID, + it->serial, + it->sequence, + PluginInterface::SamplingDevice::PhysicalDevice, + PluginInterface::SamplingDevice::StreamSingleRx, + 1, + 0 + )); + } + } + return result; } diff --git a/plugins/samplesource/fcdproplus/fcdproplusplugin.h b/plugins/samplesource/fcdproplus/fcdproplusplugin.h index 580252e91..74cbe9c4d 100644 --- a/plugins/samplesource/fcdproplus/fcdproplusplugin.h +++ b/plugins/samplesource/fcdproplus/fcdproplusplugin.h @@ -19,7 +19,8 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - virtual SamplingDevices enumSampleSources(); + virtual void enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices); + virtual SamplingDevices enumSampleSources(const OriginDevices& originDevices); virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI( const QString& sourceId, QWidget **widget, diff --git a/plugins/samplesource/fileinput/fileinputplugin.cpp b/plugins/samplesource/fileinput/fileinputplugin.cpp index c2848affc..09759da01 100644 --- a/plugins/samplesource/fileinput/fileinputplugin.cpp +++ b/plugins/samplesource/fileinput/fileinputplugin.cpp @@ -30,7 +30,7 @@ const PluginDescriptor FileInputPlugin::m_pluginDescriptor = { QString("File device input"), - QString("4.11.6"), + QString("4.11.10"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -55,20 +55,45 @@ void FileInputPlugin::initPlugin(PluginAPI* pluginAPI) pluginAPI->registerSampleSource(m_deviceTypeID, this); } -PluginInterface::SamplingDevices FileInputPlugin::enumSampleSources() +void FileInputPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices) +{ + if (listedHwIds.contains(m_hardwareID)) { // check if it was done + return; + } + + originDevices.append(OriginDevice( + "FileInput", + m_hardwareID, + QString::null, + 0, + 1, // nb Rx + 0 // nb Tx + )); + + listedHwIds.append(m_hardwareID); +} + +PluginInterface::SamplingDevices FileInputPlugin::enumSampleSources(const OriginDevices& originDevices) { SamplingDevices result; - result.append(SamplingDevice( - "FileInput", - m_hardwareID, - m_deviceTypeID, - QString::null, - 0, - PluginInterface::SamplingDevice::BuiltInDevice, - PluginInterface::SamplingDevice::StreamSingleRx, - 1, - 0)); + for (OriginDevices::const_iterator it = originDevices.begin(); it != originDevices.end(); ++it) + { + if (it->hardwareId == m_hardwareID) + { + result.append(SamplingDevice( + it->displayableName, + m_hardwareID, + m_deviceTypeID, + it->serial, + it->sequence, + PluginInterface::SamplingDevice::BuiltInDevice, + PluginInterface::SamplingDevice::StreamSingleRx, + 1, + 0 + )); + } + } return result; } diff --git a/plugins/samplesource/fileinput/fileinputplugin.h b/plugins/samplesource/fileinput/fileinputplugin.h index 47ea96e65..bf359d570 100644 --- a/plugins/samplesource/fileinput/fileinputplugin.h +++ b/plugins/samplesource/fileinput/fileinputplugin.h @@ -36,7 +36,8 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - virtual SamplingDevices enumSampleSources(); + virtual void enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices); + virtual SamplingDevices enumSampleSources(const OriginDevices& originDevices); virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI( const QString& sourceId, QWidget **widget, diff --git a/plugins/samplesource/hackrfinput/hackrfinputplugin.cpp b/plugins/samplesource/hackrfinput/hackrfinputplugin.cpp index 12107be6c..49c9f6f1f 100644 --- a/plugins/samplesource/hackrfinput/hackrfinputplugin.cpp +++ b/plugins/samplesource/hackrfinput/hackrfinputplugin.cpp @@ -32,7 +32,7 @@ const PluginDescriptor HackRFInputPlugin::m_pluginDescriptor = { QString("HackRF Input"), - QString("4.11.8"), + QString("4.11.10"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -57,17 +57,12 @@ void HackRFInputPlugin::initPlugin(PluginAPI* pluginAPI) pluginAPI->registerSampleSource(m_deviceTypeID, this); } -PluginInterface::SamplingDevices HackRFInputPlugin::enumSampleSources() +void HackRFInputPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices) { - DeviceHackRF::instance(); -// hackrf_error rc = (hackrf_error) hackrf_init(); -// -// if (rc != HACKRF_SUCCESS) -// { -// qCritical("HackRFPlugin::SampleSourceDevices: failed to initiate HackRF library: %s", hackrf_error_name(rc)); -// } + if (listedHwIds.contains(m_hardwareID)) { // check if it was done + return; + } - SamplingDevices result; hackrf_device_list_t *hackrf_devices = hackrf_device_list(); hackrf_device *hackrf_ptr; read_partid_serialno_t read_partid_serialno; @@ -79,13 +74,13 @@ PluginInterface::SamplingDevices HackRFInputPlugin::enumSampleSources() if (rc == HACKRF_SUCCESS) { - qDebug("HackRFPlugin::enumSampleSources: try to enumerate HackRF device #%d", i); + qDebug("HackRFInputPlugin::enumOriginDevices: try to enumerate HackRF device #%d", i); rc = (hackrf_error) hackrf_board_partid_serialno_read(hackrf_ptr, &read_partid_serialno); if (rc != HACKRF_SUCCESS) { - qDebug("HackRFPlugin::enumSampleSources: failed to read serial no: %s", hackrf_error_name(rc)); + qDebug("HackRFInputPlugin::enumOriginDevices: failed to read serial no: %s", hackrf_error_name(rc)); hackrf_close(hackrf_ptr); continue; // next } @@ -97,29 +92,50 @@ PluginInterface::SamplingDevices HackRFInputPlugin::enumSampleSources() //uint64_t serial_num = (((uint64_t) serial_msb)<<32) + serial_lsb; QString displayedName(QString("HackRF[%1] %2").arg(i).arg(serial_str)); - result.append(SamplingDevice(displayedName, - m_hardwareID, - m_deviceTypeID, - serial_str, - i, - PluginInterface::SamplingDevice::PhysicalDevice, - PluginInterface::SamplingDevice::StreamSingleRx, - 1, - 0)); + originDevices.append(OriginDevice( + displayedName, + m_hardwareID, + serial_str, + i, + 1, + 1 + )); - qDebug("HackRFPlugin::enumSampleSources: enumerated HackRF device #%d", i); + qDebug("HackRFInputPlugin::enumOriginDevices: enumerated HackRF device #%d", i); hackrf_close(hackrf_ptr); } else { - qDebug("HackRFPlugin::enumSampleSources: failed to enumerate HackRF device #%d: %s", i, hackrf_error_name(rc)); + qDebug("HackRFOutputPlugin::enumOriginDevices: failed to enumerate HackRF device #%d: %s", i, hackrf_error_name(rc)); } } hackrf_device_list_free(hackrf_devices); -// rc = (hackrf_error) hackrf_exit(); -// qDebug("HackRFPlugin::enumSampleSources: hackrf_exit: %s", hackrf_error_name(rc)); + listedHwIds.append(m_hardwareID); +} + +PluginInterface::SamplingDevices HackRFInputPlugin::enumSampleSources(const OriginDevices& originDevices) +{ + SamplingDevices result; + + for (OriginDevices::const_iterator it = originDevices.begin(); it != originDevices.end(); ++it) + { + if (it->hardwareId == m_hardwareID) + { + result.append(SamplingDevice( + it->displayableName, + it->hardwareId, + m_deviceTypeID, + it->serial, + it->sequence, + PluginInterface::SamplingDevice::PhysicalDevice, + PluginInterface::SamplingDevice::StreamSingleRx, + 1, + 0 + )); + } + } return result; } diff --git a/plugins/samplesource/hackrfinput/hackrfinputplugin.h b/plugins/samplesource/hackrfinput/hackrfinputplugin.h index b91713ddd..e7860233e 100644 --- a/plugins/samplesource/hackrfinput/hackrfinputplugin.h +++ b/plugins/samplesource/hackrfinput/hackrfinputplugin.h @@ -36,7 +36,8 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - virtual SamplingDevices enumSampleSources(); + virtual void enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices); + virtual SamplingDevices enumSampleSources(const OriginDevices& originDevices); virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI( const QString& sourceId, QWidget **widget, diff --git a/plugins/samplesource/kiwisdr/kiwisdrplugin.cpp b/plugins/samplesource/kiwisdr/kiwisdrplugin.cpp index 34a623108..a2652ff4f 100644 --- a/plugins/samplesource/kiwisdr/kiwisdrplugin.cpp +++ b/plugins/samplesource/kiwisdr/kiwisdrplugin.cpp @@ -31,7 +31,7 @@ const PluginDescriptor KiwiSDRPlugin::m_pluginDescriptor = { QString("KiwiSDR input"), - QString("4.11.6"), + QString("4.11.10"), QString("(c) Vort (c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -56,20 +56,45 @@ void KiwiSDRPlugin::initPlugin(PluginAPI* pluginAPI) pluginAPI->registerSampleSource(m_deviceTypeID, this); } -PluginInterface::SamplingDevices KiwiSDRPlugin::enumSampleSources() +void KiwiSDRPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices) +{ + if (listedHwIds.contains(m_hardwareID)) { // check if it was done + return; + } + + originDevices.append(OriginDevice( + "KiwiSDR", + m_hardwareID, + QString::null, + 0, + 1, // nb Rx + 0 // nb Tx + )); + + listedHwIds.append(m_hardwareID); +} + +PluginInterface::SamplingDevices KiwiSDRPlugin::enumSampleSources(const OriginDevices& originDevices) { SamplingDevices result; - result.append(SamplingDevice( - "KiwiSDR", - m_hardwareID, - m_deviceTypeID, - QString::null, - 0, - PluginInterface::SamplingDevice::BuiltInDevice, - PluginInterface::SamplingDevice::StreamSingleRx, - 1, - 0)); + for (OriginDevices::const_iterator it = originDevices.begin(); it != originDevices.end(); ++it) + { + if (it->hardwareId == m_hardwareID) + { + result.append(SamplingDevice( + it->displayableName, + m_hardwareID, + m_deviceTypeID, + it->serial, + it->sequence, + PluginInterface::SamplingDevice::BuiltInDevice, + PluginInterface::SamplingDevice::StreamSingleRx, + 1, + 0 + )); + } + } return result; } diff --git a/plugins/samplesource/kiwisdr/kiwisdrplugin.h b/plugins/samplesource/kiwisdr/kiwisdrplugin.h index c27cde86e..07232ecc0 100644 --- a/plugins/samplesource/kiwisdr/kiwisdrplugin.h +++ b/plugins/samplesource/kiwisdr/kiwisdrplugin.h @@ -37,7 +37,8 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - virtual SamplingDevices enumSampleSources(); + virtual void enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices); + virtual SamplingDevices enumSampleSources(const OriginDevices& originDevices); virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI( const QString& sourceId, QWidget **widget, diff --git a/plugins/samplesource/limesdrinput/limesdrinputplugin.cpp b/plugins/samplesource/limesdrinput/limesdrinputplugin.cpp index 23bd81247..252d1fc04 100644 --- a/plugins/samplesource/limesdrinput/limesdrinputplugin.cpp +++ b/plugins/samplesource/limesdrinput/limesdrinputplugin.cpp @@ -34,7 +34,7 @@ const PluginDescriptor LimeSDRInputPlugin::m_pluginDescriptor = { QString("LimeSDR Input"), - QString("4.11.6"), + QString("4.11.10"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -59,25 +59,29 @@ void LimeSDRInputPlugin::initPlugin(PluginAPI* pluginAPI) pluginAPI->registerSampleSource(m_deviceTypeID, this); } -PluginInterface::SamplingDevices LimeSDRInputPlugin::enumSampleSources() +void LimeSDRInputPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices) { + if (listedHwIds.contains(m_hardwareID)) { // check if it was done + return; + } + lms_info_str_t* deviceList; int nbDevices; SamplingDevices result; if ((nbDevices = LMS_GetDeviceList(0)) <= 0) { - qDebug("LimeSDRInputPlugin::enumSampleSources: Could not find any LimeSDR device"); - return result; // empty result + qDebug("LimeSDRInputPlugin::enumOriginDevices: Could not find any LimeSDR device"); + return; // do nothing } deviceList = new lms_info_str_t[nbDevices]; if (LMS_GetDeviceList(deviceList) < 0) { - qDebug("LimeSDRInputPlugin::enumSampleSources: Could not obtain LimeSDR devices information"); + qDebug("LimeSDRInputPlugin::enumOriginDevices: Could not obtain LimeSDR devices information"); delete[] deviceList; - return result; // empty result + return; // do nothing } else { @@ -90,24 +94,51 @@ PluginInterface::SamplingDevices LimeSDRInputPlugin::enumSampleSources() limeSDRParams.open(deviceList[i]); limeSDRParams.close(); - for (unsigned int j = 0; j < limeSDRParams.m_nbRxChannels; j++) - { - qDebug("LimeSDRInputPlugin::enumSampleSources: device #%d channel %u: %s", i, j, (char *) deviceList[i]); - QString displayedName(QString("LimeSDR[%1:%2] %3").arg(i).arg(j).arg(serial.c_str())); - result.append(SamplingDevice(displayedName, - m_hardwareID, - m_deviceTypeID, - QString(deviceList[i]), - i, - PluginInterface::SamplingDevice::PhysicalDevice, - PluginInterface::SamplingDevice::StreamSingleRx, - limeSDRParams.m_nbRxChannels, - j)); - } + QString displayedName(QString("LimeSDR[%1:%2] %3").arg(i).arg("%1").arg(serial.c_str())); + + originDevices.append(OriginDevice( + displayedName, + m_hardwareID, + QString(deviceList[i]), + i, + limeSDRParams.m_nbRxChannels, + limeSDRParams.m_nbTxChannels + )); } } delete[] deviceList; + + listedHwIds.append(m_hardwareID); +} + +PluginInterface::SamplingDevices LimeSDRInputPlugin::enumSampleSources(const OriginDevices& originDevices) +{ + SamplingDevices result; + + for (OriginDevices::const_iterator it = originDevices.begin(); it != originDevices.end(); ++it) + { + if (it->hardwareId == m_hardwareID) + { + for (unsigned int j = 0; j < it->nbRxStreams; j++) + { + qDebug("LimeSDRInputPlugin::enumSampleSources: device #%d channel %u: %s", it->sequence, j, qPrintable(it->serial)); + QString displayedName(it->displayableName.arg(j)); + result.append(SamplingDevice( + displayedName, + it->hardwareId, + m_deviceTypeID, + it->serial, + it->sequence, + PluginInterface::SamplingDevice::PhysicalDevice, + PluginInterface::SamplingDevice::StreamSingleRx, + it->nbRxStreams, + j + )); + } + } + } + return result; } diff --git a/plugins/samplesource/limesdrinput/limesdrinputplugin.h b/plugins/samplesource/limesdrinput/limesdrinputplugin.h index 71d8de574..6eb53893a 100644 --- a/plugins/samplesource/limesdrinput/limesdrinputplugin.h +++ b/plugins/samplesource/limesdrinput/limesdrinputplugin.h @@ -36,7 +36,8 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - virtual SamplingDevices enumSampleSources(); + virtual void enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices); + virtual SamplingDevices enumSampleSources(const OriginDevices& originDevices); virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI( const QString& sourceId, QWidget **widget, diff --git a/plugins/samplesource/localinput/localinputplugin.cpp b/plugins/samplesource/localinput/localinputplugin.cpp index 7a505461a..3c46dec0a 100644 --- a/plugins/samplesource/localinput/localinputplugin.cpp +++ b/plugins/samplesource/localinput/localinputplugin.cpp @@ -30,7 +30,7 @@ const PluginDescriptor LocalInputPlugin::m_pluginDescriptor = { QString("Local device input"), - QString("4.11.6"), + QString("4.11.10"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -55,20 +55,45 @@ void LocalInputPlugin::initPlugin(PluginAPI* pluginAPI) pluginAPI->registerSampleSource(m_deviceTypeID, this); } -PluginInterface::SamplingDevices LocalInputPlugin::enumSampleSources() +void LocalInputPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices) +{ + if (listedHwIds.contains(m_hardwareID)) { // check if it was done + return; + } + + originDevices.append(OriginDevice( + "LocalInput", + m_hardwareID, + QString::null, + 0, + 1, // nb Rx + 0 // nb Tx + )); + + listedHwIds.append(m_hardwareID); +} + +PluginInterface::SamplingDevices LocalInputPlugin::enumSampleSources(const OriginDevices& originDevices) { SamplingDevices result; - result.append(SamplingDevice( - "LocalInput", - m_hardwareID, - m_deviceTypeID, - QString::null, - 0, - PluginInterface::SamplingDevice::BuiltInDevice, - PluginInterface::SamplingDevice::StreamSingleRx, - 1, - 0)); + for (OriginDevices::const_iterator it = originDevices.begin(); it != originDevices.end(); ++it) + { + if (it->hardwareId == m_hardwareID) + { + result.append(SamplingDevice( + it->displayableName, + m_hardwareID, + m_deviceTypeID, + it->serial, + it->sequence, + PluginInterface::SamplingDevice::BuiltInDevice, + PluginInterface::SamplingDevice::StreamSingleRx, + 1, + 0 + )); + } + } return result; } diff --git a/plugins/samplesource/localinput/localinputplugin.h b/plugins/samplesource/localinput/localinputplugin.h index ab29f1f1e..f36d0f24c 100644 --- a/plugins/samplesource/localinput/localinputplugin.h +++ b/plugins/samplesource/localinput/localinputplugin.h @@ -36,7 +36,8 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - virtual SamplingDevices enumSampleSources(); + virtual void enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices); + virtual SamplingDevices enumSampleSources(const OriginDevices& originDevices); virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI( const QString& sourceId, QWidget **widget, diff --git a/plugins/samplesource/perseus/perseusplugin.cpp b/plugins/samplesource/perseus/perseusplugin.cpp index b76c4e7d7..0a46f6f44 100644 --- a/plugins/samplesource/perseus/perseusplugin.cpp +++ b/plugins/samplesource/perseus/perseusplugin.cpp @@ -32,7 +32,7 @@ const PluginDescriptor PerseusPlugin::m_pluginDescriptor = { QString("Perseus Input"), - QString("4.11.6"), + QString("4.11.10"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -58,33 +58,61 @@ void PerseusPlugin::initPlugin(PluginAPI* pluginAPI) pluginAPI->registerSampleSource(m_deviceTypeID, this); } -PluginInterface::SamplingDevices PerseusPlugin::enumSampleSources() +void PerseusPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices) { + if (listedHwIds.contains(m_hardwareID)) { // check if it was done + return; + } + DevicePerseus::instance().scan(); std::vector serials; DevicePerseus::instance().getSerials(serials); std::vector::const_iterator it = serials.begin(); int i; - SamplingDevices result; for (i = 0; it != serials.end(); ++it, ++i) { QString serial_str = QString::fromLocal8Bit(it->c_str()); - QString displayedName(QString("Perseus[%1] %2").arg(i).arg(serial_str)); + QString displayableName(QString("Perseus[%1] %2").arg(i).arg(serial_str)); - result.append(SamplingDevice(displayedName, - m_hardwareID, + originDevices.append(OriginDevice( + displayableName, + m_hardwareID, + serial_str, + i, // sequence + 1, // Nb Rx + 0 // Nb Tx + )); + + qDebug("PerseusPlugin::enumOriginDevices: enumerated Perseus device #%d", i); + } + + listedHwIds.append(m_hardwareID); +} + +PluginInterface::SamplingDevices PerseusPlugin::enumSampleSources(const OriginDevices& originDevices) +{ + SamplingDevices result; + + for (OriginDevices::const_iterator it = originDevices.begin(); it != originDevices.end(); ++it) + { + if (it->hardwareId == m_hardwareID) + { + result.append(SamplingDevice( + it->displayableName, + it->hardwareId, m_deviceTypeID, - serial_str, - i, + it->serial, + it->sequence, PluginInterface::SamplingDevice::PhysicalDevice, PluginInterface::SamplingDevice::StreamSingleRx, 1, - 0)); - - qDebug("PerseusPlugin::enumSampleSources: enumerated Perseus device #%d", i); - } + 0 + )); + qDebug("PerseusPlugin::enumSampleSources: enumerated Perseus device #%d", it->sequence); + } + } return result; } diff --git a/plugins/samplesource/perseus/perseusplugin.h b/plugins/samplesource/perseus/perseusplugin.h index 1ad2ecfa9..5d79c2b26 100644 --- a/plugins/samplesource/perseus/perseusplugin.h +++ b/plugins/samplesource/perseus/perseusplugin.h @@ -36,7 +36,8 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - virtual SamplingDevices enumSampleSources(); + virtual void enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices); + virtual SamplingDevices enumSampleSources(const OriginDevices& originDevices); virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI( const QString& sourceId, QWidget **widget, diff --git a/plugins/samplesource/plutosdrinput/plutosdrinputplugin.cpp b/plugins/samplesource/plutosdrinput/plutosdrinputplugin.cpp index 93cca92b4..eb3f45c12 100644 --- a/plugins/samplesource/plutosdrinput/plutosdrinputplugin.cpp +++ b/plugins/samplesource/plutosdrinput/plutosdrinputplugin.cpp @@ -32,7 +32,7 @@ class DeviceAPI; const PluginDescriptor PlutoSDRInputPlugin::m_pluginDescriptor = { QString("PlutoSDR Input"), - QString("4.11.3"), + QString("4.11.10"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -58,33 +58,61 @@ void PlutoSDRInputPlugin::initPlugin(PluginAPI* pluginAPI) DevicePlutoSDR::instance(); // create singleton } -PluginInterface::SamplingDevices PlutoSDRInputPlugin::enumSampleSources() +void PlutoSDRInputPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices) { + if (listedHwIds.contains(m_hardwareID)) { // check if it was done + return; + } + DevicePlutoSDR::instance().scan(); std::vector serials; DevicePlutoSDR::instance().getSerials(serials); std::vector::const_iterator it = serials.begin(); int i; - SamplingDevices result; for (i = 0; it != serials.end(); ++it, ++i) { QString serial_str = QString::fromLocal8Bit(it->c_str()); - QString displayedName(QString("PlutoSDR[%1] %2").arg(i).arg(serial_str)); + QString displayableName(QString("PlutoSDR[%1] %2").arg(i).arg(serial_str)); - result.append(SamplingDevice(displayedName, - m_hardwareID, + originDevices.append(OriginDevice( + displayableName, + m_hardwareID, + serial_str, + i, // sequence + 1, // Nb Rx + 1 // Nb Tx + )); + + qDebug("PlutoSDRInputPlugin::enumOriginDevices: enumerated PlutoSDR device #%d", i); + } + + listedHwIds.append(m_hardwareID); +} + +PluginInterface::SamplingDevices PlutoSDRInputPlugin::enumSampleSources(const OriginDevices& originDevices) +{ + SamplingDevices result; + + for (OriginDevices::const_iterator it = originDevices.begin(); it != originDevices.end(); ++it) + { + if (it->hardwareId == m_hardwareID) + { + result.append(SamplingDevice( + it->displayableName, + it->hardwareId, m_deviceTypeID, - serial_str, - i, + it->serial, + it->sequence, PluginInterface::SamplingDevice::PhysicalDevice, PluginInterface::SamplingDevice::StreamSingleRx, 1, - 0)); - - qDebug("PlutoSDRInputPlugin::enumSampleSources: enumerated PlutoSDR device #%d", i); - } + 0 + )); + qDebug("PlutoSDRInputPlugin::enumSampleSources: enumerated PlutoSDR device #%d", it->sequence); + } + } return result; } diff --git a/plugins/samplesource/plutosdrinput/plutosdrinputplugin.h b/plugins/samplesource/plutosdrinput/plutosdrinputplugin.h index 216aec18b..2f2a61969 100644 --- a/plugins/samplesource/plutosdrinput/plutosdrinputplugin.h +++ b/plugins/samplesource/plutosdrinput/plutosdrinputplugin.h @@ -36,7 +36,8 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - virtual SamplingDevices enumSampleSources(); + virtual void enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices); + virtual SamplingDevices enumSampleSources(const OriginDevices& originDevices); virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI( const QString& sourceId, QWidget **widget, diff --git a/plugins/samplesource/remoteinput/remoteinputplugin.cpp b/plugins/samplesource/remoteinput/remoteinputplugin.cpp index 2ef5f284f..1401ac5b0 100644 --- a/plugins/samplesource/remoteinput/remoteinputplugin.cpp +++ b/plugins/samplesource/remoteinput/remoteinputplugin.cpp @@ -30,7 +30,7 @@ const PluginDescriptor RemoteInputPlugin::m_pluginDescriptor = { QString("Remote device input"), - QString("4.11.6"), + QString("4.11.10"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -55,20 +55,45 @@ void RemoteInputPlugin::initPlugin(PluginAPI* pluginAPI) pluginAPI->registerSampleSource(m_deviceTypeID, this); } -PluginInterface::SamplingDevices RemoteInputPlugin::enumSampleSources() +void RemoteInputPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices) +{ + if (listedHwIds.contains(m_hardwareID)) { // check if it was done + return; + } + + originDevices.append(OriginDevice( + "RemoteInput", + m_hardwareID, + QString::null, + 0, + 1, // nb Rx + 0 // nb Tx + )); + + listedHwIds.append(m_hardwareID); +} + +PluginInterface::SamplingDevices RemoteInputPlugin::enumSampleSources(const OriginDevices& originDevices) { SamplingDevices result; - result.append(SamplingDevice( - "RemoteInput", - m_hardwareID, - m_deviceTypeID, - QString::null, - 0, - PluginInterface::SamplingDevice::BuiltInDevice, - PluginInterface::SamplingDevice::StreamSingleRx, - 1, - 0)); + for (OriginDevices::const_iterator it = originDevices.begin(); it != originDevices.end(); ++it) + { + if (it->hardwareId == m_hardwareID) + { + result.append(SamplingDevice( + it->displayableName, + m_hardwareID, + m_deviceTypeID, + it->serial, + it->sequence, + PluginInterface::SamplingDevice::BuiltInDevice, + PluginInterface::SamplingDevice::StreamSingleRx, + 1, + 0 + )); + } + } return result; } diff --git a/plugins/samplesource/remoteinput/remoteinputplugin.h b/plugins/samplesource/remoteinput/remoteinputplugin.h index 618accef9..286976292 100644 --- a/plugins/samplesource/remoteinput/remoteinputplugin.h +++ b/plugins/samplesource/remoteinput/remoteinputplugin.h @@ -36,7 +36,8 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - virtual SamplingDevices enumSampleSources(); + virtual void enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices); + virtual SamplingDevices enumSampleSources(const OriginDevices& originDevices); virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI( const QString& sourceId, QWidget **widget, diff --git a/plugins/samplesource/rtlsdr/rtlsdrplugin.cpp b/plugins/samplesource/rtlsdr/rtlsdrplugin.cpp index eec4b1ee3..33fda3928 100644 --- a/plugins/samplesource/rtlsdr/rtlsdrplugin.cpp +++ b/plugins/samplesource/rtlsdr/rtlsdrplugin.cpp @@ -14,7 +14,7 @@ const PluginDescriptor RTLSDRPlugin::m_pluginDescriptor = { QString("RTL-SDR Input"), - QString("4.11.6"), + QString("4.11.10"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -39,33 +39,63 @@ void RTLSDRPlugin::initPlugin(PluginAPI* pluginAPI) pluginAPI->registerSampleSource(m_deviceTypeID, this); } -PluginInterface::SamplingDevices RTLSDRPlugin::enumSampleSources() +void RTLSDRPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices) { - SamplingDevices result; + if (listedHwIds.contains(m_hardwareID)) { // check if it was done + return; + } + int count = rtlsdr_get_device_count(); char vendor[256]; char product[256]; char serial[256]; - for(int i = 0; i < count; i++) { + for(int i = 0; i < count; i++) + { vendor[0] = '\0'; product[0] = '\0'; serial[0] = '\0'; if(rtlsdr_get_device_usb_strings((uint32_t)i, vendor, product, serial) != 0) continue; - QString displayedName(QString("RTL-SDR[%1] %2").arg(i).arg(serial)); + QString displayableName(QString("RTL-SDR[%1] %2").arg(i).arg(serial)); - result.append(SamplingDevice(displayedName, - m_hardwareID, - m_deviceTypeID, - QString(serial), - i, - PluginInterface::SamplingDevice::PhysicalDevice, - PluginInterface::SamplingDevice::StreamSingleRx, - 1, - 0)); + originDevices.append(OriginDevice( + displayableName, + m_hardwareID, + serial, + i, // sequence + 1, // Nb Rx + 0 // Nb Tx + )); } + + listedHwIds.append(m_hardwareID); +} + +PluginInterface::SamplingDevices RTLSDRPlugin::enumSampleSources(const OriginDevices& originDevices) +{ + SamplingDevices result; + + for (OriginDevices::const_iterator it = originDevices.begin(); it != originDevices.end(); ++it) + { + if (it->hardwareId == m_hardwareID) + { + result.append(SamplingDevice( + it->displayableName, + it->hardwareId, + m_deviceTypeID, + it->serial, + it->sequence, + PluginInterface::SamplingDevice::PhysicalDevice, + PluginInterface::SamplingDevice::StreamSingleRx, + 1, + 0 + )); + qDebug("RTLSDRPlugin::enumSampleSources: enumerated RTL-SDR device #%d", it->sequence); + } + } + return result; } diff --git a/plugins/samplesource/rtlsdr/rtlsdrplugin.h b/plugins/samplesource/rtlsdr/rtlsdrplugin.h index aee6cdd38..001c7c049 100644 --- a/plugins/samplesource/rtlsdr/rtlsdrplugin.h +++ b/plugins/samplesource/rtlsdr/rtlsdrplugin.h @@ -19,7 +19,8 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - virtual SamplingDevices enumSampleSources(); + virtual void enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices); + virtual SamplingDevices enumSampleSources(const OriginDevices& originDevices); virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI( const QString& sourceId, QWidget **widget, diff --git a/plugins/samplesource/sdrplay/sdrplayplugin.cpp b/plugins/samplesource/sdrplay/sdrplayplugin.cpp index e2dd2bc7e..4eb235e5d 100644 --- a/plugins/samplesource/sdrplay/sdrplayplugin.cpp +++ b/plugins/samplesource/sdrplay/sdrplayplugin.cpp @@ -30,7 +30,7 @@ const PluginDescriptor SDRPlayPlugin::m_pluginDescriptor = { QString("SDRPlay RSP1 Input"), - QString("4.11.6"), + QString("4.11.10"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -55,9 +55,12 @@ void SDRPlayPlugin::initPlugin(PluginAPI* pluginAPI) pluginAPI->registerSampleSource(m_deviceTypeID, this); } -PluginInterface::SamplingDevices SDRPlayPlugin::enumSampleSources() +void SDRPlayPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices) { - SamplingDevices result; + if (listedHwIds.contains(m_hardwareID)) { // check if it was done + return; + } + int count = mirisdr_get_device_count(); char vendor[256]; @@ -76,20 +79,45 @@ PluginInterface::SamplingDevices SDRPlayPlugin::enumSampleSources() } qDebug("SDRPlayPlugin::enumSampleSources: found %s:%s (%s)", vendor, product, serial); - QString displayedName(QString("SDRPlay[%1] %2").arg(i).arg(serial)); + QString displayableName(QString("SDRPlay[%1] %2").arg(i).arg(serial)); - result.append(SamplingDevice(displayedName, - m_hardwareID, - m_deviceTypeID, - QString(serial), - i, - PluginInterface::SamplingDevice::PhysicalDevice, - PluginInterface::SamplingDevice::StreamSingleRx, - 1, - 0)); + originDevices.append(OriginDevice( + displayableName, + m_hardwareID, + serial, + i, // sequence + 1, // Nb Rx + 0 // Nb Tx + )); } - return result; + listedHwIds.append(m_hardwareID); +} + +PluginInterface::SamplingDevices SDRPlayPlugin::enumSampleSources(const OriginDevices& originDevices) +{ + SamplingDevices result; + + for (OriginDevices::const_iterator it = originDevices.begin(); it != originDevices.end(); ++it) + { + if (it->hardwareId == m_hardwareID) + { + result.append(SamplingDevice( + it->displayableName, + it->hardwareId, + m_deviceTypeID, + it->serial, + it->sequence, + PluginInterface::SamplingDevice::PhysicalDevice, + PluginInterface::SamplingDevice::StreamSingleRx, + 1, + 0 + )); + qDebug("SDRPlayPlugin::enumSampleSources: enumerated SDRPlay RSP1 device #%d", it->sequence); + } + } + + return result; } #ifdef SERVER_MODE diff --git a/plugins/samplesource/sdrplay/sdrplayplugin.h b/plugins/samplesource/sdrplay/sdrplayplugin.h index 67155614b..001abaf36 100644 --- a/plugins/samplesource/sdrplay/sdrplayplugin.h +++ b/plugins/samplesource/sdrplay/sdrplayplugin.h @@ -36,7 +36,8 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - virtual SamplingDevices enumSampleSources(); + virtual void enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices); + virtual SamplingDevices enumSampleSources(const OriginDevices& originDevices); virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI( const QString& sourceId, QWidget **widget, diff --git a/plugins/samplesource/soapysdrinput/soapysdrinputplugin.cpp b/plugins/samplesource/soapysdrinput/soapysdrinputplugin.cpp index c5f7c008a..f2d716550 100644 --- a/plugins/samplesource/soapysdrinput/soapysdrinputplugin.cpp +++ b/plugins/samplesource/soapysdrinput/soapysdrinputplugin.cpp @@ -31,7 +31,7 @@ const PluginDescriptor SoapySDRInputPlugin::m_pluginDescriptor = { QString("SoapySDR Input"), - QString("4.11.6"), + QString("4.11.10"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -56,33 +56,66 @@ void SoapySDRInputPlugin::initPlugin(PluginAPI* pluginAPI) pluginAPI->registerSampleSource(m_deviceTypeID, this); } -PluginInterface::SamplingDevices SoapySDRInputPlugin::enumSampleSources() +void SoapySDRInputPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices) { - SamplingDevices result; + if (listedHwIds.contains(m_hardwareID)) { // check if it was done + return; + } + DeviceSoapySDR& deviceSoapySDR = DeviceSoapySDR::instance(); const std::vector& devicesEnumeration = deviceSoapySDR.getDevicesEnumeration(); - qDebug("SoapySDRInputPlugin::enumSampleSources: %lu SoapySDR devices. Enumerate these with Rx channel(s):", devicesEnumeration.size()); + qDebug("SoapySDRInputPlugin::enumOriginDevices: %lu SoapySDR devices", devicesEnumeration.size()); std::vector::const_iterator it = devicesEnumeration.begin(); for (int idev = 0; it != devicesEnumeration.end(); ++it, idev++) { unsigned int nbRxChannels = it->m_nbRx; + unsigned int nbTxChannels = it->m_nbTx; + QString displayableName(QString("SoapySDR[%1:%2] %3").arg(idev).arg("%1").arg(it->m_label)); + QString serial(QString("%1-%2").arg(it->m_driverName).arg(it->m_sequence)); + qDebug("SoapySDRInputPlugin::enumOriginDevices: device #%d (%s) serial %s", + idev, it->m_label.toStdString().c_str(), serial.toStdString().c_str()); - for (unsigned int ichan = 0; ichan < nbRxChannels; ichan++) + originDevices.append(OriginDevice( + displayableName, + m_hardwareID, + serial, + idev, // sequence + nbRxChannels, // Nb Rx + nbTxChannels // Nb Tx + )); + } + + listedHwIds.append(m_hardwareID); +} + +PluginInterface::SamplingDevices SoapySDRInputPlugin::enumSampleSources(const OriginDevices& originDevices) +{ + SamplingDevices result; + + for (OriginDevices::const_iterator it = originDevices.begin(); it != originDevices.end(); ++it) + { + if (it->hardwareId == m_hardwareID) { - QString displayedName(QString("SoapySDR[%1:%2] %3").arg(idev).arg(ichan).arg(it->m_label)); - QString serial(QString("%1-%2").arg(it->m_driverName).arg(it->m_sequence)); - qDebug("SoapySDRInputPlugin::enumSampleSources: device #%d (%s) serial %s channel %u", - idev, it->m_label.toStdString().c_str(), serial.toStdString().c_str(), ichan); - result.append(SamplingDevice(displayedName, - m_hardwareID, + unsigned int nbRxChannels = it->nbRxStreams; + + for (unsigned int ichan = 0; ichan < nbRxChannels; ichan++) + { + QString displayedName(it->displayableName.arg(ichan)); + qDebug("SoapySDRInputPlugin::enumSampleSources: device #%d serial %s channel %u", + it->sequence, it->serial.toStdString().c_str(), ichan); + result.append(SamplingDevice( + displayedName, + it->hardwareId, m_deviceTypeID, - serial, - idev, + it->serial, + it->sequence, PluginInterface::SamplingDevice::PhysicalDevice, PluginInterface::SamplingDevice::StreamSingleRx, nbRxChannels, - ichan)); + ichan + )); + } } } diff --git a/plugins/samplesource/soapysdrinput/soapysdrinputplugin.h b/plugins/samplesource/soapysdrinput/soapysdrinputplugin.h index 5fc1b95b9..cb1729663 100644 --- a/plugins/samplesource/soapysdrinput/soapysdrinputplugin.h +++ b/plugins/samplesource/soapysdrinput/soapysdrinputplugin.h @@ -38,7 +38,8 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - virtual SamplingDevices enumSampleSources(); + virtual void enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices); + virtual SamplingDevices enumSampleSources(const OriginDevices& originDevices); virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI( const QString& sourceId, QWidget **widget, diff --git a/plugins/samplesource/testsource/testsourceplugin.cpp b/plugins/samplesource/testsource/testsourceplugin.cpp index 571c46c72..f4b45022d 100644 --- a/plugins/samplesource/testsource/testsourceplugin.cpp +++ b/plugins/samplesource/testsource/testsourceplugin.cpp @@ -30,7 +30,7 @@ const PluginDescriptor TestSourcePlugin::m_pluginDescriptor = { QString("Test Source input"), - QString("4.11.6"), + QString("4.11.10"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -55,20 +55,45 @@ void TestSourcePlugin::initPlugin(PluginAPI* pluginAPI) pluginAPI->registerSampleSource(m_deviceTypeID, this); } -PluginInterface::SamplingDevices TestSourcePlugin::enumSampleSources() +void TestSourcePlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices) +{ + if (listedHwIds.contains(m_hardwareID)) { // check if it was done + return; + } + + originDevices.append(OriginDevice( + "TestSource", + m_hardwareID, + QString::null, + 0, + 1, // nb Rx + 0 // nb Tx + )); + + listedHwIds.append(m_hardwareID); +} + +PluginInterface::SamplingDevices TestSourcePlugin::enumSampleSources(const OriginDevices& originDevices) { SamplingDevices result; - result.append(SamplingDevice( - "TestSource", - m_hardwareID, - m_deviceTypeID, - QString::null, - 0, - PluginInterface::SamplingDevice::BuiltInDevice, - PluginInterface::SamplingDevice::StreamSingleRx, - 1, - 0)); + for (OriginDevices::const_iterator it = originDevices.begin(); it != originDevices.end(); ++it) + { + if (it->hardwareId == m_hardwareID) + { + result.append(SamplingDevice( + it->displayableName, + m_hardwareID, + m_deviceTypeID, + it->serial, + it->sequence, + PluginInterface::SamplingDevice::BuiltInDevice, + PluginInterface::SamplingDevice::StreamSingleRx, + 1, + 0 + )); + } + } return result; } diff --git a/plugins/samplesource/testsource/testsourceplugin.h b/plugins/samplesource/testsource/testsourceplugin.h index f1276b67f..b09e9db69 100644 --- a/plugins/samplesource/testsource/testsourceplugin.h +++ b/plugins/samplesource/testsource/testsourceplugin.h @@ -36,7 +36,8 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - virtual SamplingDevices enumSampleSources(); + virtual void enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices); + virtual SamplingDevices enumSampleSources(const OriginDevices& originDevices); virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI( const QString& sourceId, QWidget **widget, diff --git a/plugins/samplesource/xtrxinput/xtrxinputplugin.cpp b/plugins/samplesource/xtrxinput/xtrxinputplugin.cpp index 4ef269bf9..fa8eb0662 100644 --- a/plugins/samplesource/xtrxinput/xtrxinputplugin.cpp +++ b/plugins/samplesource/xtrxinput/xtrxinputplugin.cpp @@ -36,7 +36,7 @@ const PluginDescriptor XTRXInputPlugin::m_pluginDescriptor = { QString("XTRX Input"), - QString("4.11.6"), + QString("4.11.10"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, @@ -61,29 +61,61 @@ void XTRXInputPlugin::initPlugin(PluginAPI* pluginAPI) pluginAPI->registerSampleSource(m_deviceTypeID, this); } -PluginInterface::SamplingDevices XTRXInputPlugin::enumSampleSources() +void XTRXInputPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices) { - SamplingDevices result; + if (listedHwIds.contains(m_hardwareID)) { // check if it was done + return; + } + xtrx_device_info_t devs[32]; int res = xtrx_discovery(devs, 32); int i; - for (i = 0; i < res; i++) { + + for (i = 0; i < res; i++) + { DeviceXTRXParams XTRXParams; - for (unsigned int j = 0; j < XTRXParams.m_nbRxChannels; j++) + QString displayableName(QString("XTRX[%1:%2] %3").arg(i).arg("%1").arg(devs[i].uniqname)); + + originDevices.append(OriginDevice( + displayableName, + m_hardwareID, + QString(devs[i].uniqname), + i, + XTRXParams.m_nbRxChannels, + XTRXParams.m_nbTxChannels + )); + } + + listedHwIds.append(m_hardwareID); +} + +PluginInterface::SamplingDevices XTRXInputPlugin::enumSampleSources(const OriginDevices& originDevices) +{ + SamplingDevices result; + + for (OriginDevices::const_iterator it = originDevices.begin(); it != originDevices.end(); ++it) + { + if (it->hardwareId == m_hardwareID) { - qDebug("XTRXInputPlugin::enumSampleSources: device #%d channel %u: %s", i, j, devs[i].uniqname); - QString displayedName(QString("XTRX[%1:%2] %3").arg(i).arg(j).arg(devs[i].uniqname)); - result.append(SamplingDevice(displayedName, - m_hardwareID, - m_deviceTypeID, - QString(devs[i].uniqname), - i, - PluginInterface::SamplingDevice::PhysicalDevice, - PluginInterface::SamplingDevice::StreamSingleRx, - XTRXParams.m_nbRxChannels, - j)); + for (unsigned int j = 0; j < it->nbRxStreams; j++) + { + qDebug("XTRXInputPlugin::enumSampleSources: device #%d channel %u: %s", it->sequence, j, qPrintable(it->serial)); + QString displayedName(it->displayableName.arg(j)); + result.append(SamplingDevice( + displayedName, + it->hardwareId, + m_deviceTypeID, + it->serial, + it->sequence, + PluginInterface::SamplingDevice::PhysicalDevice, + PluginInterface::SamplingDevice::StreamSingleRx, + it->nbRxStreams, + j + )); + } } } + return result; } diff --git a/plugins/samplesource/xtrxinput/xtrxinputplugin.h b/plugins/samplesource/xtrxinput/xtrxinputplugin.h index 344275498..a62a119be 100644 --- a/plugins/samplesource/xtrxinput/xtrxinputplugin.h +++ b/plugins/samplesource/xtrxinput/xtrxinputplugin.h @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////////////// -// Copyright (C) 2017, 2018 Edouard Griffiths, F4EXB // +// Copyright (C) 2017, 2019 Edouard Griffiths, F4EXB // // Copyright (C) 2017 Sergey Kostanbaev, Fairwaves Inc. // // // // This program is free software; you can redistribute it and/or modify // @@ -37,7 +37,8 @@ public: const PluginDescriptor& getPluginDescriptor() const; void initPlugin(PluginAPI* pluginAPI); - virtual SamplingDevices enumSampleSources(); + virtual void enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices); + virtual SamplingDevices enumSampleSources(const OriginDevices& originDevices); virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI( const QString& sourceId, QWidget **widget, diff --git a/sdrbase/device/deviceenumerator.cpp b/sdrbase/device/deviceenumerator.cpp index 15f939be0..c34e79f2a 100644 --- a/sdrbase/device/deviceenumerator.cpp +++ b/sdrbase/device/deviceenumerator.cpp @@ -41,7 +41,8 @@ void DeviceEnumerator::enumerateRxDevices(PluginManager *pluginManager) for (int i = 0; i < rxDeviceRegistrations.count(); i++) { qDebug("DeviceEnumerator::enumerateRxDevices: %s", qPrintable(rxDeviceRegistrations[i].m_deviceId)); - PluginInterface::SamplingDevices samplingDevices = rxDeviceRegistrations[i].m_plugin->enumSampleSources(); + rxDeviceRegistrations[i].m_plugin->enumOriginDevices(m_originDevicesHwIds, m_originDevices); + PluginInterface::SamplingDevices samplingDevices = rxDeviceRegistrations[i].m_plugin->enumSampleSources(m_originDevices); for (int j = 0; j < samplingDevices.count(); j++) { @@ -66,7 +67,8 @@ void DeviceEnumerator::enumerateTxDevices(PluginManager *pluginManager) for (int i = 0; i < txDeviceRegistrations.count(); i++) { qDebug("DeviceEnumerator::enumerateTxDevices: %s", qPrintable(txDeviceRegistrations[i].m_deviceId)); - PluginInterface::SamplingDevices samplingDevices = txDeviceRegistrations[i].m_plugin->enumSampleSinks(); + txDeviceRegistrations[i].m_plugin->enumOriginDevices(m_originDevicesHwIds, m_originDevices); + PluginInterface::SamplingDevices samplingDevices = txDeviceRegistrations[i].m_plugin->enumSampleSinks(m_originDevices); for (int j = 0; j < samplingDevices.count(); j++) { @@ -91,7 +93,8 @@ void DeviceEnumerator::enumerateMIMODevices(PluginManager *pluginManager) for (int i = 0; i < mimoDeviceRegistrations.count(); i++) { qDebug("DeviceEnumerator::enumerateMIMODevices: %s", qPrintable(mimoDeviceRegistrations[i].m_deviceId)); - PluginInterface::SamplingDevices samplingDevices = mimoDeviceRegistrations[i].m_plugin->enumSampleMIMO(); + mimoDeviceRegistrations[i].m_plugin->enumOriginDevices(m_originDevicesHwIds, m_originDevices); + PluginInterface::SamplingDevices samplingDevices = mimoDeviceRegistrations[i].m_plugin->enumSampleMIMO(m_originDevices); for (int j = 0; j < samplingDevices.count(); j++) { diff --git a/sdrbase/device/deviceenumerator.h b/sdrbase/device/deviceenumerator.h index 8181e02a6..93166949f 100644 --- a/sdrbase/device/deviceenumerator.h +++ b/sdrbase/device/deviceenumerator.h @@ -80,6 +80,8 @@ private: DevicesEnumeration m_rxEnumeration; DevicesEnumeration m_txEnumeration; DevicesEnumeration m_mimoEnumeration; + PluginInterface::OriginDevices m_originDevices; + QStringList m_originDevicesHwIds; }; #endif /* SDRBASE_DEVICE_DEVICEENUMERATOR_H_ */ diff --git a/sdrbase/plugin/plugininterface.h b/sdrbase/plugin/plugininterface.h index c94cd20b8..d9ff9d2bb 100644 --- a/sdrbase/plugin/plugininterface.h +++ b/sdrbase/plugin/plugininterface.h @@ -82,6 +82,37 @@ public: }; typedef QList SamplingDevices; + /** This is the device from which the sampling devices are derived. For physical devices this represents + * a single physical unit (a LimeSDR, HackRF, BladeRF, RTL-SDR dongle, ...) that is enumerated once and + * reported in the system so that the "sampling devices" used in the system can be registered + */ + struct OriginDevice + { + QString displayableName; //!< A human readable name + QString hardwareId; //!< The internal id that identifies the type of hardware (i.e. HackRF, BladeRF, ...) + QString serial; //!< The device serial number defined by the vendor or a fake one (SDRplay) + int sequence; //!< The device sequence in order of enumeration + int nbRxStreams; //!< Number of receiver streams + int nbTxStreams; //!< Number of transmitter streams + + OriginDevice( + const QString& _displayableName, + const QString& _hardwareId, + const QString& _serial, + int _sequence, + int _nbRxStreams, + int _nbTxStreams + ) : + displayableName(_displayableName), + hardwareId(_hardwareId), + serial(_serial), + sequence(_sequence), + nbRxStreams(_nbRxStreams), + nbTxStreams(_nbTxStreams) + {} + }; + typedef QList OriginDevices; + virtual ~PluginInterface() { } virtual const PluginDescriptor& getPluginDescriptor() const = 0; @@ -163,9 +194,21 @@ public: return nullptr; } + // any device + + virtual void enumOriginDevices(QStringList& listedHwIds, OriginDevices& originDevices) + { + (void) listedHwIds; + (void) originDevices; + } + // device source plugins only - virtual SamplingDevices enumSampleSources() { return SamplingDevices(); } + virtual SamplingDevices enumSampleSources(const OriginDevices& originDevices) + { + (void) originDevices; + return SamplingDevices(); + } virtual PluginInstanceGUI* createSampleSourcePluginInstanceGUI( const QString& sourceId, @@ -191,7 +234,11 @@ public: // device sink plugins only - virtual SamplingDevices enumSampleSinks() { return SamplingDevices(); } + virtual SamplingDevices enumSampleSinks(const OriginDevices& originDevices) + { + (void) originDevices; + return SamplingDevices(); + } virtual PluginInstanceGUI* createSampleSinkPluginInstanceGUI( const QString& sinkId, @@ -218,7 +265,11 @@ public: // device MIMO plugins only - virtual SamplingDevices enumSampleMIMO() { return SamplingDevices(); } + virtual SamplingDevices enumSampleMIMO(const OriginDevices& originDevices) + { + (void) originDevices; + return SamplingDevices(); + } virtual PluginInstanceGUI* createSampleMIMOPluginInstanceGUI( const QString& mimoId,