diff --git a/CHANGELOG b/CHANGELOG index b3850b025..569cc68d5 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,10 @@ +sdrangel (4.12.3-1) unstable; urgency=medium + + * Added possibility to specify devices that cannot be discovered automatically + * Server: fixed sink device set creation and added MIMO creation + + -- Edouard Griffiths, F4EXB Sun, 15 Dec 2019 23:14:22 +0100 + sdrangel (4.12.2-1) unstable; urgency=medium * Refactoring of Rx channels code with better separation of concerns diff --git a/CMakeLists.txt b/CMakeLists.txt index 37da6ab1d..e5294b619 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,7 +18,7 @@ set(CMAKE_CXX_EXTENSIONS OFF) # configure version set(sdrangel_VERSION_MAJOR "4") set(sdrangel_VERSION_MINOR "12") -set(sdrangel_VERSION_PATCH "2") +set(sdrangel_VERSION_PATCH "3") set(sdrangel_VERSION_SUFFIX "") # SDRAngel cmake options diff --git a/debian/changelog b/debian/changelog index b3850b025..dcca21566 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +sdrangel (4.12.3-1) unstable; urgency=medium + + * Added possibility to specify devices that cannot be discovered automatically + * Server: fixed sink device set creation and added MIMO creation + + -- Edouard Griffiths, F4EXB Sun, 15 Dec 2019 23:14:22 +0100 + sdrangel (4.12.2-1) unstable; urgency=medium * Refactoring of Rx channels code with better separation of concerns @@ -6,7 +13,7 @@ sdrangel (4.12.2-1) unstable; urgency=medium * Remote Sink and Remote Output: refactoring of UDP blocks handling * NFMDemod: fixed setSelectedCtcssIndex method - -- Edouard Griffiths, F4EXB Fri, 14 Dec 2019 06:14:22 +0100 + -- Edouard Griffiths, F4EXB Sat, 14 Dec 2019 06:14:22 +0100 sdrangel (4.12.1-1) unstable; urgency=medium diff --git a/devices/plutosdr/deviceplutosdrparams.cpp b/devices/plutosdr/deviceplutosdrparams.cpp index 22cab0667..fc3f67249 100644 --- a/devices/plutosdr/deviceplutosdrparams.cpp +++ b/devices/plutosdr/deviceplutosdrparams.cpp @@ -31,11 +31,17 @@ DevicePlutoSDRParams::~DevicePlutoSDRParams() bool DevicePlutoSDRParams::open(const std::string& serial) { m_box = DevicePlutoSDR::instance().getDeviceFromSerial(serial); - return m_box != 0; + return m_box != nullptr; +} + +bool DevicePlutoSDRParams::openURI(const std::string& uri) +{ + m_box = DevicePlutoSDR::instance().getDeviceFromURI(uri); + return m_box != nullptr; } void DevicePlutoSDRParams::close() { delete m_box; - m_box = 0; + m_box = nullptr; } diff --git a/devices/plutosdr/deviceplutosdrparams.h b/devices/plutosdr/deviceplutosdrparams.h index 38ea10eae..90750d3ac 100644 --- a/devices/plutosdr/deviceplutosdrparams.h +++ b/devices/plutosdr/deviceplutosdrparams.h @@ -38,6 +38,7 @@ public: ~DevicePlutoSDRParams(); bool open(const std::string& serial); + bool openURI(const std::string& uri); void close(); DevicePlutoSDRBox *getBox() { return m_box; } diff --git a/devices/plutosdr/deviceplutosdrscan.cpp b/devices/plutosdr/deviceplutosdrscan.cpp index 5b9b07a43..79aa0aa6c 100644 --- a/devices/plutosdr/deviceplutosdrscan.cpp +++ b/devices/plutosdr/deviceplutosdrscan.cpp @@ -50,18 +50,6 @@ void DevicePlutoSDRScan::scan() m_scans.clear(); - if (num_contexts == 0) - { - struct iio_context *ctx = iio_create_network_context("pluto.local"); - if(!ctx) { - return; - } - m_scans.push_back({std::string("PlutoSDR"), std::string("networked"), std::string("ip:pluto.local")}); - m_serialMap[m_scans.back().m_serial] = &m_scans.back(); - m_urilMap[m_scans.back().m_uri] = &m_scans.back(); - iio_context_destroy(ctx); - } - for (i = 0; i < num_contexts; i++) { const char *description = iio_context_info_get_description(info[i]); diff --git a/doc/img/MainWindow_user_args.png b/doc/img/MainWindow_user_args.png index 1f32da728..f8005bad2 100644 Binary files a/doc/img/MainWindow_user_args.png and b/doc/img/MainWindow_user_args.png differ diff --git a/doc/img/MainWindow_user_args.xcf b/doc/img/MainWindow_user_args.xcf index 8030792be..bc30496be 100644 Binary files a/doc/img/MainWindow_user_args.xcf and b/doc/img/MainWindow_user_args.xcf differ diff --git a/fcdlib/fcdtraits.cpp b/fcdlib/fcdtraits.cpp index 5d67a6062..581ec0f02 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.10"; -const char *fcd_traits::pluginVersion = "4.11.10"; +const char *fcd_traits::pluginVersion = "4.12.3"; +const char *fcd_traits::pluginVersion = "4.12.3"; const int64_t fcd_traits::loLowLimitFreq = 64000000L; const int64_t fcd_traits::loLowLimitFreq = 150000L; diff --git a/plugins/channelrx/chanalyzer/chanalyzerplugin.cpp b/plugins/channelrx/chanalyzer/chanalyzerplugin.cpp index 7bf9ffddc..016579548 100644 --- a/plugins/channelrx/chanalyzer/chanalyzerplugin.cpp +++ b/plugins/channelrx/chanalyzer/chanalyzerplugin.cpp @@ -24,8 +24,9 @@ #include "chanalyzerwebapiadapter.h" const PluginDescriptor ChannelAnalyzerPlugin::m_pluginDescriptor = { + ChannelAnalyzer::m_channelId, QString("Channel Analyzer"), - QString("4.12.2"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/channelrx/demodam/amdemodplugin.cpp b/plugins/channelrx/demodam/amdemodplugin.cpp index 82ac29c4e..3cb5ff1fe 100644 --- a/plugins/channelrx/demodam/amdemodplugin.cpp +++ b/plugins/channelrx/demodam/amdemodplugin.cpp @@ -9,8 +9,9 @@ #include "amdemodplugin.h" const PluginDescriptor AMDemodPlugin::m_pluginDescriptor = { + AMDemod::m_channelId, QString("AM Demodulator"), - QString("4.12.2"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/channelrx/demodatv/atvdemodplugin.cpp b/plugins/channelrx/demodatv/atvdemodplugin.cpp index e725c980b..12737a75a 100644 --- a/plugins/channelrx/demodatv/atvdemodplugin.cpp +++ b/plugins/channelrx/demodatv/atvdemodplugin.cpp @@ -28,8 +28,9 @@ const PluginDescriptor ATVDemodPlugin::m_ptrPluginDescriptor = { + ATVDemod::m_channelId, QString("ATV Demodulator"), - QString("4.12.2"), + QString("4.12.3"), QString("(c) F4HKW for F4EXB / SDRAngel"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/channelrx/demodbfm/bfmplugin.cpp b/plugins/channelrx/demodbfm/bfmplugin.cpp index 2c65be199..1ce2b5845 100644 --- a/plugins/channelrx/demodbfm/bfmplugin.cpp +++ b/plugins/channelrx/demodbfm/bfmplugin.cpp @@ -29,8 +29,9 @@ #include "bfmplugin.h" const PluginDescriptor BFMPlugin::m_pluginDescriptor = { + BFMDemod::m_channelId, QString("Broadcast FM Demodulator"), - QString("4.12.2"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/channelrx/demoddatv/datvdemodplugin.cpp b/plugins/channelrx/demoddatv/datvdemodplugin.cpp index 5071ceac2..3a352eb7f 100644 --- a/plugins/channelrx/demoddatv/datvdemodplugin.cpp +++ b/plugins/channelrx/demoddatv/datvdemodplugin.cpp @@ -28,8 +28,9 @@ const PluginDescriptor DATVDemodPlugin::m_ptrPluginDescriptor = { + DATVDemod::m_channelId, QString("DATV Demodulator"), - QString("4.11.6"), + QString("4.12.3"), QString("(c) F4HKW for SDRAngel using LeanSDR framework (c) F4DAV"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/channelrx/demoddsd/dsddemodplugin.cpp b/plugins/channelrx/demoddsd/dsddemodplugin.cpp index 2dcd1ef90..8998fa49b 100644 --- a/plugins/channelrx/demoddsd/dsddemodplugin.cpp +++ b/plugins/channelrx/demoddsd/dsddemodplugin.cpp @@ -28,8 +28,9 @@ #include "dsddemodplugin.h" const PluginDescriptor DSDDemodPlugin::m_pluginDescriptor = { + DSDDemod::m_channelId, QString("DSD Demodulator"), - QString("4.12.0"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/channelrx/demodfreedv/freedvplugin.cpp b/plugins/channelrx/demodfreedv/freedvplugin.cpp index d565da3f6..2bbb00470 100644 --- a/plugins/channelrx/demodfreedv/freedvplugin.cpp +++ b/plugins/channelrx/demodfreedv/freedvplugin.cpp @@ -26,8 +26,9 @@ #include "freedvplugin.h" const PluginDescriptor FreeDVPlugin::m_pluginDescriptor = { + FreeDVDemod::m_channelId, QString("FreeDV Demodulator"), - QString("4.12.2"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/channelrx/demodlora/loraplugin.cpp b/plugins/channelrx/demodlora/loraplugin.cpp index 7126b6d4d..48b55de80 100644 --- a/plugins/channelrx/demodlora/loraplugin.cpp +++ b/plugins/channelrx/demodlora/loraplugin.cpp @@ -6,8 +6,9 @@ #include "lorademod.h" const PluginDescriptor LoRaPlugin::m_pluginDescriptor = { + LoRaDemod::m_channelId, QString("LoRa Demodulator"), - QString("4.12.2"), + QString("4.12.3"), QString("(c) 2015 John Greb"), QString("http://www.maintech.de"), true, diff --git a/plugins/channelrx/demodnfm/nfmplugin.cpp b/plugins/channelrx/demodnfm/nfmplugin.cpp index 50df6b86c..b163ce8b3 100644 --- a/plugins/channelrx/demodnfm/nfmplugin.cpp +++ b/plugins/channelrx/demodnfm/nfmplugin.cpp @@ -10,8 +10,9 @@ #include "nfmplugin.h" const PluginDescriptor NFMPlugin::m_pluginDescriptor = { + NFMDemod::m_channelId, QString("NFM Demodulator"), - QString("4.12.2"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/channelrx/demodssb/ssbplugin.cpp b/plugins/channelrx/demodssb/ssbplugin.cpp index 0473bfde8..e50883581 100644 --- a/plugins/channelrx/demodssb/ssbplugin.cpp +++ b/plugins/channelrx/demodssb/ssbplugin.cpp @@ -10,8 +10,9 @@ #include "ssbplugin.h" const PluginDescriptor SSBPlugin::m_pluginDescriptor = { + SSBDemod::m_channelId, QString("SSB Demodulator"), - QString("4.12.2"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/channelrx/demodwfm/wfmplugin.cpp b/plugins/channelrx/demodwfm/wfmplugin.cpp index 52c65fafc..a4f1f8095 100644 --- a/plugins/channelrx/demodwfm/wfmplugin.cpp +++ b/plugins/channelrx/demodwfm/wfmplugin.cpp @@ -11,8 +11,9 @@ #include "wfmplugin.h" const PluginDescriptor WFMPlugin::m_pluginDescriptor = { + WFMDemod::m_channelId, QString("WFM Demodulator"), - QString("4.12.2"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/channelrx/freqtracker/freqtrackerplugin.cpp b/plugins/channelrx/freqtracker/freqtrackerplugin.cpp index 76232a53e..c546d1d1d 100644 --- a/plugins/channelrx/freqtracker/freqtrackerplugin.cpp +++ b/plugins/channelrx/freqtracker/freqtrackerplugin.cpp @@ -26,8 +26,9 @@ #include "freqtrackerplugin.h" const PluginDescriptor FreqTrackerPlugin::m_pluginDescriptor = { + FreqTracker::m_channelId, QString("Frequency Tracker"), - QString("4.12.2"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/channelrx/localsink/localsinkplugin.cpp b/plugins/channelrx/localsink/localsinkplugin.cpp index 61faa5329..b03f7abe5 100644 --- a/plugins/channelrx/localsink/localsinkplugin.cpp +++ b/plugins/channelrx/localsink/localsinkplugin.cpp @@ -28,8 +28,9 @@ #include "localsinkplugin.h" const PluginDescriptor LocalSinkPlugin::m_pluginDescriptor = { + LocalSink::m_channelId, QString("Local channel sink"), - QString("4.12.2"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/channelrx/remotesink/remotesinkplugin.cpp b/plugins/channelrx/remotesink/remotesinkplugin.cpp index e23bd951d..c2d267b71 100644 --- a/plugins/channelrx/remotesink/remotesinkplugin.cpp +++ b/plugins/channelrx/remotesink/remotesinkplugin.cpp @@ -28,8 +28,9 @@ #include "remotesinkplugin.h" const PluginDescriptor RemoteSinkPlugin::m_pluginDescriptor = { + RemoteSink::m_channelId, QString("Remote channel sink"), - QString("4.11.6"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/channelrx/udpsink/udpsinkplugin.cpp b/plugins/channelrx/udpsink/udpsinkplugin.cpp index 108e1344e..e082a0d5a 100644 --- a/plugins/channelrx/udpsink/udpsinkplugin.cpp +++ b/plugins/channelrx/udpsink/udpsinkplugin.cpp @@ -27,8 +27,9 @@ #include "udpsinkplugin.h" const PluginDescriptor UDPSinkPlugin::m_pluginDescriptor = { + UDPSink::m_channelId, QString("UDP Channel Sink"), - QString("4.12.2"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/channeltx/filesource/filesourceplugin.cpp b/plugins/channeltx/filesource/filesourceplugin.cpp index 12210376f..f723f9dcb 100644 --- a/plugins/channeltx/filesource/filesourceplugin.cpp +++ b/plugins/channeltx/filesource/filesourceplugin.cpp @@ -26,8 +26,9 @@ #include "filesourceplugin.h" const PluginDescriptor FileSourcePlugin::m_pluginDescriptor = { + FileSource::m_channelId, QString("File channel source"), - QString("4.12.1"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/channeltx/localsource/localsourceplugin.cpp b/plugins/channeltx/localsource/localsourceplugin.cpp index e62f6120f..147c23056 100644 --- a/plugins/channeltx/localsource/localsourceplugin.cpp +++ b/plugins/channeltx/localsource/localsourceplugin.cpp @@ -28,8 +28,9 @@ #include "localsourceplugin.h" const PluginDescriptor LocalSourcePlugin::m_pluginDescriptor = { + LocalSource::m_channelId, QString("Local channel source"), - QString("4.12.2"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/channeltx/modam/ammodplugin.cpp b/plugins/channeltx/modam/ammodplugin.cpp index 7d1219cb0..ba39da21f 100644 --- a/plugins/channeltx/modam/ammodplugin.cpp +++ b/plugins/channeltx/modam/ammodplugin.cpp @@ -26,8 +26,9 @@ #include "ammodplugin.h" const PluginDescriptor AMModPlugin::m_pluginDescriptor = { + AMMod::m_channelId, QString("AM Modulator"), - QString("4.12.2"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/channeltx/modatv/atvmodplugin.cpp b/plugins/channeltx/modatv/atvmodplugin.cpp index 1a1b3df86..7240c6d69 100644 --- a/plugins/channeltx/modatv/atvmodplugin.cpp +++ b/plugins/channeltx/modatv/atvmodplugin.cpp @@ -26,8 +26,9 @@ #include "atvmodplugin.h" const PluginDescriptor ATVModPlugin::m_pluginDescriptor = { + ATVMod::m_channelId, QString("ATV Modulator"), - QString("4.12.2"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/channeltx/modfreedv/freedvmodplugin.cpp b/plugins/channeltx/modfreedv/freedvmodplugin.cpp index dbcbc57f2..f2073dd83 100644 --- a/plugins/channeltx/modfreedv/freedvmodplugin.cpp +++ b/plugins/channeltx/modfreedv/freedvmodplugin.cpp @@ -26,8 +26,9 @@ #include "freedvmodplugin.h" const PluginDescriptor FreeDVModPlugin::m_pluginDescriptor = { + FreeDVMod::m_channelId, QString("FreeDV Modulator"), - QString("4.12.2"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/channeltx/modnfm/nfmmodplugin.cpp b/plugins/channeltx/modnfm/nfmmodplugin.cpp index 9fd1eb1d2..1970e007c 100644 --- a/plugins/channeltx/modnfm/nfmmodplugin.cpp +++ b/plugins/channeltx/modnfm/nfmmodplugin.cpp @@ -26,8 +26,9 @@ #include "nfmmodplugin.h" const PluginDescriptor NFMModPlugin::m_pluginDescriptor = { + NFMMod::m_channelId, QString("NFM Modulator"), - QString("4.12.2"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/channeltx/modssb/ssbmodplugin.cpp b/plugins/channeltx/modssb/ssbmodplugin.cpp index 590bcfb5c..e853ea544 100644 --- a/plugins/channeltx/modssb/ssbmodplugin.cpp +++ b/plugins/channeltx/modssb/ssbmodplugin.cpp @@ -26,8 +26,9 @@ #include "ssbmodplugin.h" const PluginDescriptor SSBModPlugin::m_pluginDescriptor = { + SSBMod::m_channelId, QString("SSB Modulator"), - QString("4.12.2"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/channeltx/modwfm/wfmmodplugin.cpp b/plugins/channeltx/modwfm/wfmmodplugin.cpp index 09cfd4b10..3a1429057 100644 --- a/plugins/channeltx/modwfm/wfmmodplugin.cpp +++ b/plugins/channeltx/modwfm/wfmmodplugin.cpp @@ -26,8 +26,9 @@ #include "wfmmodplugin.h" const PluginDescriptor WFMModPlugin::m_pluginDescriptor = { + WFMMod::m_channelId, QString("WFM Modulator"), - QString("4.12.2"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/channeltx/remotesource/remotesourceplugin.cpp b/plugins/channeltx/remotesource/remotesourceplugin.cpp index 00d0a1326..eef4a6511 100644 --- a/plugins/channeltx/remotesource/remotesourceplugin.cpp +++ b/plugins/channeltx/remotesource/remotesourceplugin.cpp @@ -26,8 +26,9 @@ #include "remotesourceplugin.h" const PluginDescriptor RemoteSourcePlugin::m_pluginDescriptor = { + RemoteSource::m_channelId, QString("Remote channel source"), - QString("4.12.1"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/channeltx/udpsource/udpsourceplugin.cpp b/plugins/channeltx/udpsource/udpsourceplugin.cpp index 099055b29..fa04e3c84 100644 --- a/plugins/channeltx/udpsource/udpsourceplugin.cpp +++ b/plugins/channeltx/udpsource/udpsourceplugin.cpp @@ -29,8 +29,9 @@ #include "udpsourceplugin.h" const PluginDescriptor UDPSourcePlugin::m_pluginDescriptor = { + UDPSource::m_channelId, QString("UDP Channel Source"), - QString("4.12.2"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/samplemimo/testmi/testmiplugin.cpp b/plugins/samplemimo/testmi/testmiplugin.cpp index 39c52de4f..882107000 100644 --- a/plugins/samplemimo/testmi/testmiplugin.cpp +++ b/plugins/samplemimo/testmi/testmiplugin.cpp @@ -29,8 +29,9 @@ #include "testmiwebapiadapter.h" const PluginDescriptor TestMIPlugin::m_pluginDescriptor = { + QString("TestMI"), QString("Test Multiple Input"), - QString("4.11.10"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/samplesink/bladerf1output/bladerf1outputplugin.cpp b/plugins/samplesink/bladerf1output/bladerf1outputplugin.cpp index ada25a971..8b053a3c2 100644 --- a/plugins/samplesink/bladerf1output/bladerf1outputplugin.cpp +++ b/plugins/samplesink/bladerf1output/bladerf1outputplugin.cpp @@ -30,8 +30,9 @@ #endif const PluginDescriptor Bladerf1OutputPlugin::m_pluginDescriptor = { + QString("BladeRF1"), QString("BladeRF1 Output"), - QString("4.12.0"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/samplesink/bladerf2output/bladerf2outputplugin.cpp b/plugins/samplesink/bladerf2output/bladerf2outputplugin.cpp index 99f6bfa2e..046b6cb1e 100644 --- a/plugins/samplesink/bladerf2output/bladerf2outputplugin.cpp +++ b/plugins/samplesink/bladerf2output/bladerf2outputplugin.cpp @@ -30,8 +30,9 @@ #endif const PluginDescriptor BladeRF2OutputPlugin::m_pluginDescriptor = { + QString("BladeRF2"), QString("BladeRF2 Output"), - QString("4.12.0"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/samplesink/filesink/filesinkplugin.cpp b/plugins/samplesink/filesink/filesinkplugin.cpp index 8c8a58eff..0be33b8be 100644 --- a/plugins/samplesink/filesink/filesinkplugin.cpp +++ b/plugins/samplesink/filesink/filesinkplugin.cpp @@ -28,8 +28,9 @@ #include "filesinkplugin.h" const PluginDescriptor FileSinkPlugin::m_pluginDescriptor = { + QString("FileSink"), QString("File sink output"), - QString("4.12.0"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/samplesink/hackrfoutput/hackrfoutputplugin.cpp b/plugins/samplesink/hackrfoutput/hackrfoutputplugin.cpp index 45d559f08..56a275514 100644 --- a/plugins/samplesink/hackrfoutput/hackrfoutputplugin.cpp +++ b/plugins/samplesink/hackrfoutput/hackrfoutputplugin.cpp @@ -30,8 +30,9 @@ #include "hackrfoutputwebapiadapter.h" const PluginDescriptor HackRFOutputPlugin::m_pluginDescriptor = { + QString("HackRF"), QString("HackRF Output"), - QString("4.12.0"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/samplesink/limesdroutput/limesdroutputplugin.cpp b/plugins/samplesink/limesdroutput/limesdroutputplugin.cpp index f94483ef1..bb3509202 100644 --- a/plugins/samplesink/limesdroutput/limesdroutputplugin.cpp +++ b/plugins/samplesink/limesdroutput/limesdroutputplugin.cpp @@ -33,8 +33,9 @@ #include "limesdroutputwebapiadapter.h" const PluginDescriptor LimeSDROutputPlugin::m_pluginDescriptor = { + QString("LimeSDR"), QString("LimeSDR Output"), - QString("4.12.0"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/samplesink/localoutput/localoutputplugin.cpp b/plugins/samplesink/localoutput/localoutputplugin.cpp index 89a5c5c5d..fb36dd2b6 100644 --- a/plugins/samplesink/localoutput/localoutputplugin.cpp +++ b/plugins/samplesink/localoutput/localoutputplugin.cpp @@ -29,8 +29,9 @@ #include "localoutputwebapiadapter.h" const PluginDescriptor LocalOutputPlugin::m_pluginDescriptor = { + QString("LocalOutput"), QString("Local device output"), - QString("4.12.0"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/samplesink/plutosdroutput/plutosdroutput.cpp b/plugins/samplesink/plutosdroutput/plutosdroutput.cpp index a46dd4939..d1e021e8c 100644 --- a/plugins/samplesink/plutosdroutput/plutosdroutput.cpp +++ b/plugins/samplesink/plutosdroutput/plutosdroutput.cpp @@ -259,11 +259,31 @@ bool PlutoSDROutput::openDevice() else { qDebug("PlutoSDROutput::openDevice: open device here"); - m_deviceShared.m_deviceParams = new DevicePlutoSDRParams(); - char serial[256]; - strcpy(serial, qPrintable(m_deviceAPI->getSamplingDeviceSerial())); - m_deviceShared.m_deviceParams->open(serial); + + if (m_deviceAPI->getHardwareUserArguments().size() != 0) + { + QStringList kv = m_deviceAPI->getHardwareUserArguments().split('='); // expecting "uri=xxx" + + if (kv.size() > 1) + { + if (kv.at(0) == "uri") { + m_deviceShared.m_deviceParams->openURI(kv.at(1).toStdString()); + } else { + return false; + } + } + else + { + return false; + } + } + else + { + char serial[256]; + strcpy(serial, qPrintable(m_deviceAPI->getSamplingDeviceSerial())); + m_deviceShared.m_deviceParams->open(serial); + } } m_deviceAPI->setBuddySharedPtr(&m_deviceShared); // propagate common parameters to API diff --git a/plugins/samplesink/plutosdroutput/plutosdroutputplugin.cpp b/plugins/samplesink/plutosdroutput/plutosdroutputplugin.cpp index 2008dd9dd..b15ad5019 100644 --- a/plugins/samplesink/plutosdroutput/plutosdroutputplugin.cpp +++ b/plugins/samplesink/plutosdroutput/plutosdroutputplugin.cpp @@ -29,8 +29,9 @@ #include "plutosdroutputwebapiadapter.h" const PluginDescriptor PlutoSDROutputPlugin::m_pluginDescriptor = { + QString("PlutoSDR"), QString("PlutoSDR Output"), - QString("4.11.10"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/samplesink/plutosdroutput/plutosdroutputplugin.h b/plugins/samplesink/plutosdroutput/plutosdroutputplugin.h index 5ddef64cb..eb24a876e 100644 --- a/plugins/samplesink/plutosdroutput/plutosdroutputplugin.h +++ b/plugins/samplesink/plutosdroutput/plutosdroutputplugin.h @@ -45,6 +45,8 @@ public: virtual DeviceSampleSink* createSampleSinkPluginInstance(const QString& sinkId, DeviceAPI *deviceAPI); virtual DeviceWebAPIAdapter* createDeviceWebAPIAdapter() const; + virtual QString getDeviceTypeId() const { return m_deviceTypeID; } + static const QString m_hardwareID; static const QString m_deviceTypeID; diff --git a/plugins/samplesink/plutosdroutput/readme.md b/plugins/samplesink/plutosdroutput/readme.md index c9e9025d6..fd2a6c223 100644 --- a/plugins/samplesink/plutosdroutput/readme.md +++ b/plugins/samplesink/plutosdroutput/readme.md @@ -6,6 +6,8 @@ This output sample sink plugin sends its samples to a [PlutoSDR device](https:// ☞ PlutoSDR is physically implemented as a 1x1 SISO device although the AD9363 chip does have a second Rx and a second Tx channel. Revision C of the board claims to have pads to allow hackers connecting the second ports externally however for now only the first Tx channel is supported by this plugin. +☞ When running the Pluto on Ethernet interface you have to create a non discoverable device reference in the [user arguments dialog](https://github.com/f4exb/sdrangel/blob/master/sdrgui/deviceuserargs.md) from the main window Preferences > Devices menu. You must use the `PlutoSDR` hardware ID then specify the device address with a `uri` parameter in the user arguments for example: `uri=ip:192.168.1.10`. Note that this will become effective once SDRangel is restarted. +

Build

The plugin will be built only if libiio is installed in your system. To build and install libiio from source do: diff --git a/plugins/samplesink/remoteoutput/remoteoutputplugin.cpp b/plugins/samplesink/remoteoutput/remoteoutputplugin.cpp index 446f222b1..27eb994d0 100644 --- a/plugins/samplesink/remoteoutput/remoteoutputplugin.cpp +++ b/plugins/samplesink/remoteoutput/remoteoutputplugin.cpp @@ -29,8 +29,9 @@ #include "remoteoutputwebapiadapter.h" const PluginDescriptor RemoteOutputPlugin::m_pluginDescriptor = { + QString("RemoteOutput"), QString("Remote device output"), - QString("4.12.2"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/samplesink/soapysdroutput/soapysdroutputplugin.cpp b/plugins/samplesink/soapysdroutput/soapysdroutputplugin.cpp index dddcf4ed6..32b694480 100644 --- a/plugins/samplesink/soapysdroutput/soapysdroutputplugin.cpp +++ b/plugins/samplesink/soapysdroutput/soapysdroutputplugin.cpp @@ -31,8 +31,9 @@ #endif const PluginDescriptor SoapySDROutputPlugin::m_pluginDescriptor = { + QString("SoapySDR"), QString("SoapySDR Output"), - QString("4.12.0"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/samplesink/testsink/testsinkplugin.cpp b/plugins/samplesink/testsink/testsinkplugin.cpp index 6c3740d5a..4e2cc1605 100644 --- a/plugins/samplesink/testsink/testsinkplugin.cpp +++ b/plugins/samplesink/testsink/testsinkplugin.cpp @@ -28,8 +28,9 @@ #include "testsinkplugin.h" const PluginDescriptor TestSinkPlugin::m_pluginDescriptor = { + QString("TestSink"), QString("Test Sink Output"), - QString("4.12.0"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/samplesink/xtrxoutput/xtrxoutputplugin.cpp b/plugins/samplesink/xtrxoutput/xtrxoutputplugin.cpp index 3d4e1a181..3275035c6 100644 --- a/plugins/samplesink/xtrxoutput/xtrxoutputplugin.cpp +++ b/plugins/samplesink/xtrxoutput/xtrxoutputplugin.cpp @@ -34,8 +34,9 @@ #include "xtrxoutputwebapiadapter.h" const PluginDescriptor XTRXOutputPlugin::m_pluginDescriptor = { + QString("XTRX"), QString("XTRX Output"), - QString("4.12.0"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/samplesource/airspy/airspyplugin.cpp b/plugins/samplesource/airspy/airspyplugin.cpp index 542d3f26a..c47a47c06 100644 --- a/plugins/samplesource/airspy/airspyplugin.cpp +++ b/plugins/samplesource/airspy/airspyplugin.cpp @@ -32,8 +32,9 @@ const int AirspyPlugin::m_maxDevices = 32; const PluginDescriptor AirspyPlugin::m_pluginDescriptor = { + QString("Airspy"), QString("Airspy Input"), - QString("4.11.10"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/samplesource/airspyhf/airspyhfplugin.cpp b/plugins/samplesource/airspyhf/airspyhfplugin.cpp index 9e59d8ff8..f066a8b27 100644 --- a/plugins/samplesource/airspyhf/airspyhfplugin.cpp +++ b/plugins/samplesource/airspyhf/airspyhfplugin.cpp @@ -30,8 +30,9 @@ const PluginDescriptor AirspyHFPlugin::m_pluginDescriptor = { + QString("AirspyHF"), QString("AirspyHF Input"), - QString("4.11.10"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/samplesource/bladerf1input/bladerf1inputplugin.cpp b/plugins/samplesource/bladerf1input/bladerf1inputplugin.cpp index 205de5710..bd65e5381 100644 --- a/plugins/samplesource/bladerf1input/bladerf1inputplugin.cpp +++ b/plugins/samplesource/bladerf1input/bladerf1inputplugin.cpp @@ -30,8 +30,9 @@ #endif const PluginDescriptor Blderf1InputPlugin::m_pluginDescriptor = { + QString("BladeRF1"), QString("BladeRF1 Input"), - QString("4.11.10"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/samplesource/bladerf2input/bladerf2inputplugin.cpp b/plugins/samplesource/bladerf2input/bladerf2inputplugin.cpp index d6e1e882b..ddd9bdb99 100644 --- a/plugins/samplesource/bladerf2input/bladerf2inputplugin.cpp +++ b/plugins/samplesource/bladerf2input/bladerf2inputplugin.cpp @@ -30,8 +30,9 @@ #endif const PluginDescriptor Blderf2InputPlugin::m_pluginDescriptor = { + QString("BladeRF2"), QString("BladeRF2 Input"), - QString("4.11.10"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/samplesource/fcdpro/fcdproplugin.cpp b/plugins/samplesource/fcdpro/fcdproplugin.cpp index cdb202949..835eb7a68 100644 --- a/plugins/samplesource/fcdpro/fcdproplugin.cpp +++ b/plugins/samplesource/fcdpro/fcdproplugin.cpp @@ -29,6 +29,7 @@ #include "fcdtraits.h" const PluginDescriptor FCDProPlugin::m_pluginDescriptor = { + QString("FCDPro"), QString(fcd_traits::pluginDisplayedName), QString(fcd_traits::pluginVersion), QString("(c) Edouard Griffiths, F4EXB"), diff --git a/plugins/samplesource/fcdproplus/fcdproplusplugin.cpp b/plugins/samplesource/fcdproplus/fcdproplusplugin.cpp index abc2eab1e..da2306984 100644 --- a/plugins/samplesource/fcdproplus/fcdproplusplugin.cpp +++ b/plugins/samplesource/fcdproplus/fcdproplusplugin.cpp @@ -29,6 +29,7 @@ #include "fcdtraits.h" const PluginDescriptor FCDProPlusPlugin::m_pluginDescriptor = { + QString("FCDProPlus"), QString(fcd_traits::pluginDisplayedName), QString(fcd_traits::pluginVersion), QString("(c) Edouard Griffiths, F4EXB"), diff --git a/plugins/samplesource/fileinput/fileinputplugin.cpp b/plugins/samplesource/fileinput/fileinputplugin.cpp index 5d7523620..a1ccecf30 100644 --- a/plugins/samplesource/fileinput/fileinputplugin.cpp +++ b/plugins/samplesource/fileinput/fileinputplugin.cpp @@ -29,8 +29,9 @@ #include "fileinputwebapiadapter.h" const PluginDescriptor FileInputPlugin::m_pluginDescriptor = { + QString("FileInput"), QString("File device input"), - QString("4.11.10"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/samplesource/hackrfinput/hackrfinputplugin.cpp b/plugins/samplesource/hackrfinput/hackrfinputplugin.cpp index c16cfd48f..6b61bd8e4 100644 --- a/plugins/samplesource/hackrfinput/hackrfinputplugin.cpp +++ b/plugins/samplesource/hackrfinput/hackrfinputplugin.cpp @@ -31,8 +31,9 @@ #include "hackrfinputwebapiadapter.h" const PluginDescriptor HackRFInputPlugin::m_pluginDescriptor = { + QString("HackRF"), QString("HackRF Input"), - QString("4.11.10"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/samplesource/kiwisdr/kiwisdrplugin.cpp b/plugins/samplesource/kiwisdr/kiwisdrplugin.cpp index 17c6d4b9d..cf3ae0fc6 100644 --- a/plugins/samplesource/kiwisdr/kiwisdrplugin.cpp +++ b/plugins/samplesource/kiwisdr/kiwisdrplugin.cpp @@ -30,8 +30,9 @@ #include "kiwisdrwebapiadapter.h" const PluginDescriptor KiwiSDRPlugin::m_pluginDescriptor = { + QString("KiwiSDR"), QString("KiwiSDR input"), - QString("4.11.10"), + QString("4.12.3"), QString("(c) Vort (c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/samplesource/limesdrinput/limesdrinputplugin.cpp b/plugins/samplesource/limesdrinput/limesdrinputplugin.cpp index aa094a3a6..a73bd5c9c 100644 --- a/plugins/samplesource/limesdrinput/limesdrinputplugin.cpp +++ b/plugins/samplesource/limesdrinput/limesdrinputplugin.cpp @@ -33,8 +33,9 @@ #include "limesdrinputwebapiadapter.h" const PluginDescriptor LimeSDRInputPlugin::m_pluginDescriptor = { + QString("LimeSDR"), QString("LimeSDR Input"), - QString("4.11.10"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/samplesource/localinput/localinputplugin.cpp b/plugins/samplesource/localinput/localinputplugin.cpp index 718acd2ea..85b59803d 100644 --- a/plugins/samplesource/localinput/localinputplugin.cpp +++ b/plugins/samplesource/localinput/localinputplugin.cpp @@ -29,8 +29,9 @@ #include "localinputwebapiadapter.h" const PluginDescriptor LocalInputPlugin::m_pluginDescriptor = { + QString("LocalInput"), QString("Local device input"), - QString("4.11.10"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/samplesource/perseus/perseusplugin.cpp b/plugins/samplesource/perseus/perseusplugin.cpp index 0a46f6f44..307b8fa3d 100644 --- a/plugins/samplesource/perseus/perseusplugin.cpp +++ b/plugins/samplesource/perseus/perseusplugin.cpp @@ -31,8 +31,9 @@ #endif const PluginDescriptor PerseusPlugin::m_pluginDescriptor = { + QString("Perseus"), QString("Perseus Input"), - QString("4.11.10"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/samplesource/plutosdrinput/plutosdrinput.cpp b/plugins/samplesource/plutosdrinput/plutosdrinput.cpp index a3b8d7ec8..9a8f9a492 100644 --- a/plugins/samplesource/plutosdrinput/plutosdrinput.cpp +++ b/plugins/samplesource/plutosdrinput/plutosdrinput.cpp @@ -295,11 +295,31 @@ bool PlutoSDRInput::openDevice() else { qDebug("PlutoSDRInput::openDevice: open device here"); - m_deviceShared.m_deviceParams = new DevicePlutoSDRParams(); - char serial[256]; - strcpy(serial, qPrintable(m_deviceAPI->getSamplingDeviceSerial())); - m_deviceShared.m_deviceParams->open(serial); + + if (m_deviceAPI->getHardwareUserArguments().size() != 0) + { + QStringList kv = m_deviceAPI->getHardwareUserArguments().split('='); // expecting "uri=xxx" + + if (kv.size() > 1) + { + if (kv.at(0) == "uri") { + m_deviceShared.m_deviceParams->openURI(kv.at(1).toStdString()); + } else { + return false; + } + } + else + { + return false; + } + } + else + { + char serial[256]; + strcpy(serial, qPrintable(m_deviceAPI->getSamplingDeviceSerial())); + m_deviceShared.m_deviceParams->open(serial); + } } m_deviceAPI->setBuddySharedPtr(&m_deviceShared); // propagate common parameters to API diff --git a/plugins/samplesource/plutosdrinput/plutosdrinputplugin.cpp b/plugins/samplesource/plutosdrinput/plutosdrinputplugin.cpp index 5362be1bf..d2637af55 100644 --- a/plugins/samplesource/plutosdrinput/plutosdrinputplugin.cpp +++ b/plugins/samplesource/plutosdrinput/plutosdrinputplugin.cpp @@ -31,8 +31,9 @@ class DeviceAPI; const PluginDescriptor PlutoSDRInputPlugin::m_pluginDescriptor = { + QString("PlutoSDR"), QString("PlutoSDR Input"), - QString("4.11.10"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/samplesource/plutosdrinput/plutosdrinputplugin.h b/plugins/samplesource/plutosdrinput/plutosdrinputplugin.h index 2f2a61969..4f28c8d26 100644 --- a/plugins/samplesource/plutosdrinput/plutosdrinputplugin.h +++ b/plugins/samplesource/plutosdrinput/plutosdrinputplugin.h @@ -45,6 +45,8 @@ public: virtual DeviceSampleSource* createSampleSourcePluginInstance(const QString& sourceId, DeviceAPI *deviceAPI); virtual DeviceWebAPIAdapter* createDeviceWebAPIAdapter() const; + virtual QString getDeviceTypeId() const { return m_deviceTypeID; } + static const QString m_hardwareID; static const QString m_deviceTypeID; diff --git a/plugins/samplesource/plutosdrinput/readme.md b/plugins/samplesource/plutosdrinput/readme.md index 6acc81973..74206c379 100644 --- a/plugins/samplesource/plutosdrinput/readme.md +++ b/plugins/samplesource/plutosdrinput/readme.md @@ -6,6 +6,8 @@ This input sample source plugin gets its samples from a [PlutoSDR device](https: ☞ PlutoSDR is physically implemented as a 1x1 SISO device although the AD9363 chip does have a second Rx and a second Tx channel. Revision C of the board claims to have pads to allow hackers connecting the second ports externally however for now only the first Rx channel is supported by this plugin. +☞ When running the Pluto on Ethernet interface you have to create a non discoverable device reference in the [user arguments dialog](https://github.com/f4exb/sdrangel/blob/master/sdrgui/deviceuserargs.md) from the main window Preferences > Devices menu. You must use the `PlutoSDR` hardware ID then specify the device address with a `uri` parameter in the user arguments for example: `uri=ip:192.168.1.10`. Note that this will become effective once SDRangel is restarted. +

Build

The plugin will be built only if libiio is installed in your system. To build and install libiio from source do: diff --git a/plugins/samplesource/remoteinput/remoteinputplugin.cpp b/plugins/samplesource/remoteinput/remoteinputplugin.cpp index 0390ad5e4..a60ab135c 100644 --- a/plugins/samplesource/remoteinput/remoteinputplugin.cpp +++ b/plugins/samplesource/remoteinput/remoteinputplugin.cpp @@ -29,8 +29,9 @@ #include "remoteinputwebapiadapter.h" const PluginDescriptor RemoteInputPlugin::m_pluginDescriptor = { + QString("RemoteInput"), QString("Remote device input"), - QString("4.11.10"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/samplesource/rtlsdr/rtlsdrplugin.cpp b/plugins/samplesource/rtlsdr/rtlsdrplugin.cpp index 33fda3928..8668ae297 100644 --- a/plugins/samplesource/rtlsdr/rtlsdrplugin.cpp +++ b/plugins/samplesource/rtlsdr/rtlsdrplugin.cpp @@ -13,8 +13,9 @@ #include "rtlsdrwebapiadapter.h" const PluginDescriptor RTLSDRPlugin::m_pluginDescriptor = { + QString("RTLSDR"), QString("RTL-SDR Input"), - QString("4.11.10"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/samplesource/sdrplay/sdrplayplugin.cpp b/plugins/samplesource/sdrplay/sdrplayplugin.cpp index 4eb235e5d..830dba206 100644 --- a/plugins/samplesource/sdrplay/sdrplayplugin.cpp +++ b/plugins/samplesource/sdrplay/sdrplayplugin.cpp @@ -29,8 +29,9 @@ #include "sdrplaywebapiadapter.h" const PluginDescriptor SDRPlayPlugin::m_pluginDescriptor = { + QString("SDRPlay"), QString("SDRPlay RSP1 Input"), - QString("4.11.10"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/samplesource/soapysdrinput/soapysdrinputplugin.cpp b/plugins/samplesource/soapysdrinput/soapysdrinputplugin.cpp index 7bc5e078e..88b9edebd 100644 --- a/plugins/samplesource/soapysdrinput/soapysdrinputplugin.cpp +++ b/plugins/samplesource/soapysdrinput/soapysdrinputplugin.cpp @@ -30,8 +30,9 @@ #endif const PluginDescriptor SoapySDRInputPlugin::m_pluginDescriptor = { + QString("SoapySDR"), QString("SoapySDR Input"), - QString("4.11.10"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/samplesource/testsource/testsourceplugin.cpp b/plugins/samplesource/testsource/testsourceplugin.cpp index 774ce048b..099ce90b8 100644 --- a/plugins/samplesource/testsource/testsourceplugin.cpp +++ b/plugins/samplesource/testsource/testsourceplugin.cpp @@ -29,8 +29,9 @@ #include "testsourcewebapiadapter.h" const PluginDescriptor TestSourcePlugin::m_pluginDescriptor = { + QString("TestSource"), QString("Test Source input"), - QString("4.11.10"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/samplesource/xtrxinput/xtrxinputplugin.cpp b/plugins/samplesource/xtrxinput/xtrxinputplugin.cpp index ba47649b9..ab6acfe93 100644 --- a/plugins/samplesource/xtrxinput/xtrxinputplugin.cpp +++ b/plugins/samplesource/xtrxinput/xtrxinputplugin.cpp @@ -36,8 +36,9 @@ #endif const PluginDescriptor XTRXInputPlugin::m_pluginDescriptor = { + QString("XTRX"), QString("XTRX Input"), - QString("4.11.10"), + QString("4.12.3"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/sdrbase/device/deviceenumerator.cpp b/sdrbase/device/deviceenumerator.cpp index c34e79f2a..265315096 100644 --- a/sdrbase/device/deviceenumerator.cpp +++ b/sdrbase/device/deviceenumerator.cpp @@ -18,6 +18,8 @@ #include #include "plugin/pluginmanager.h" +#include "device/deviceuserargs.h" + #include "deviceenumerator.h" Q_GLOBAL_STATIC(DeviceEnumerator, deviceEnumerator) @@ -32,6 +34,154 @@ DeviceEnumerator::DeviceEnumerator() DeviceEnumerator::~DeviceEnumerator() {} +void DeviceEnumerator::addNonDiscoverableDevices(PluginManager *pluginManager, const DeviceUserArgs& deviceUserArgs) +{ + qDebug("DeviceEnumerator::addNonDiscoverableDevices: start"); + const QList& args = deviceUserArgs.getArgsByDevice(); + QList::const_iterator argsIt = args.begin(); + unsigned int rxIndex = m_rxEnumeration.size(); + unsigned int txIndex = m_txEnumeration.size(); + unsigned int mimoIndex = m_mimoEnumeration.size(); + + for (; argsIt != args.end(); ++argsIt) + { + if (!argsIt->m_nonDiscoverable) { // this process is for non discoverable devices only + continue; + } + + QString serial = QString("%1-%2").arg(argsIt->m_id).arg(argsIt->m_sequence); + + PluginInterface *rxPlugin = getRxRegisteredPlugin(pluginManager, argsIt->m_id); + + if (rxPlugin && !isRxEnumerated(argsIt->m_id, argsIt->m_sequence)) + { + int deviceNbItems = rxPlugin->getDefaultRxNbItems(); + QString deviceId = rxPlugin->getDeviceTypeId(); + + for (int deviceIndex = 0; deviceIndex < deviceNbItems; deviceIndex++) + { + QString description = QString("%1[%2:%3] user defined").arg(argsIt->m_id).arg(argsIt->m_sequence).arg(deviceIndex); + qDebug("DeviceEnumerator::addNonDiscoverableDevices: Rx: %s", qPrintable(description)); + PluginInterface::SamplingDevice ndDevice( + description, + argsIt->m_id, + deviceId, // id + serial, + argsIt->m_sequence, + rxPlugin->getSamplingDeviceType(), + PluginInterface::SamplingDevice::StreamSingleRx, + deviceNbItems, // deviceNbItems + deviceIndex // deviceItemIndex + ); + m_rxEnumeration.push_back( + DeviceEnumeration( + ndDevice, + rxPlugin, + rxIndex + ) + ); + rxIndex++; + } + } + + PluginInterface *txPlugin = getTxRegisteredPlugin(pluginManager, argsIt->m_id); + + if (txPlugin && !isTxEnumerated(argsIt->m_id, argsIt->m_sequence)) + { + int deviceNbItems = txPlugin->getDefaultTxNbItems(); + QString deviceId = txPlugin->getDeviceTypeId(); + + for (int deviceIndex = 0; deviceIndex < deviceNbItems; deviceIndex++) + { + QString description = QString("%1[%2:%3] user defined").arg(argsIt->m_id).arg(argsIt->m_sequence).arg(deviceIndex); + qDebug("DeviceEnumerator::addNonDiscoverableDevices: Tx: %s", qPrintable(description)); + PluginInterface::SamplingDevice ndDevice( + description, + argsIt->m_id, + deviceId, // id + serial, + argsIt->m_sequence, + rxPlugin->getSamplingDeviceType(), + PluginInterface::SamplingDevice::StreamSingleTx, + deviceNbItems, // deviceNbItems + deviceIndex // deviceItemIndex + ); + m_txEnumeration.push_back( + DeviceEnumeration( + ndDevice, + txPlugin, + txIndex + ) + ); + txIndex++; + } + } + } // loop through user args +} + +PluginInterface *DeviceEnumerator::getRxRegisteredPlugin(PluginManager *pluginManager, const QString& deviceHwId) +{ + PluginAPI::SamplingDeviceRegistrations& rxDeviceRegistrations = pluginManager->getSourceDeviceRegistrations(); + PluginInterface *rxPlugin = nullptr; + + for (int i = 0; i < rxDeviceRegistrations.count(); i++) + { + + if (deviceHwId == rxDeviceRegistrations[i].m_deviceHardwareId) + { + rxPlugin = rxDeviceRegistrations[i].m_plugin; + break; + } + } + + return rxPlugin; +} + +bool DeviceEnumerator::isRxEnumerated(const QString& deviceHwId, int deviceSequence) +{ + std::vector::const_iterator rxIt = m_rxEnumeration.begin(); + + for (; rxIt != m_rxEnumeration.end(); ++rxIt) + { + if ((rxIt->m_samplingDevice.hardwareId == deviceHwId) && (rxIt->m_samplingDevice.sequence == deviceSequence)) { + return true; + } + } + + return false; +} + +PluginInterface *DeviceEnumerator::getTxRegisteredPlugin(PluginManager *pluginManager, const QString& deviceHwId) +{ + PluginAPI::SamplingDeviceRegistrations& txDeviceRegistrations = pluginManager->getSinkDeviceRegistrations(); + PluginInterface *txPlugin = nullptr; + + for (int i = 0; i < txDeviceRegistrations.count(); i++) + { + if (deviceHwId == txDeviceRegistrations[i].m_deviceHardwareId) + { + txPlugin = txDeviceRegistrations[i].m_plugin; + break; + } + } + + return txPlugin; +} + +bool DeviceEnumerator::isTxEnumerated(const QString& deviceHwId, int deviceSequence) +{ + std::vector::const_iterator txIt = m_txEnumeration.begin(); + + for (; txIt != m_txEnumeration.end(); ++txIt) + { + if ((txIt->m_samplingDevice.hardwareId == deviceHwId) && (txIt->m_samplingDevice.sequence == deviceSequence)) { + return true; + } + } + + return false; +} + void DeviceEnumerator::enumerateRxDevices(PluginManager *pluginManager) { m_rxEnumeration.clear(); diff --git a/sdrbase/device/deviceenumerator.h b/sdrbase/device/deviceenumerator.h index 93166949f..feec94720 100644 --- a/sdrbase/device/deviceenumerator.h +++ b/sdrbase/device/deviceenumerator.h @@ -24,6 +24,7 @@ #include "export.h" class PluginManager; +class DeviceUserArgs; class SDRBASE_API DeviceEnumerator { @@ -36,6 +37,7 @@ public: void enumerateRxDevices(PluginManager *pluginManager); void enumerateTxDevices(PluginManager *pluginManager); void enumerateMIMODevices(PluginManager *pluginManager); + void addNonDiscoverableDevices(PluginManager *pluginManager, const DeviceUserArgs& deviceUserArgs); void listRxDeviceNames(QList& list, std::vector& indexes) const; void listTxDeviceNames(QList& list, std::vector& indexes) const; void listMIMODeviceNames(QList& list, std::vector& indexes) const; @@ -82,6 +84,11 @@ private: DevicesEnumeration m_mimoEnumeration; PluginInterface::OriginDevices m_originDevices; QStringList m_originDevicesHwIds; + + PluginInterface *getRxRegisteredPlugin(PluginManager *pluginManager, const QString& deviceHwId); + PluginInterface *getTxRegisteredPlugin(PluginManager *pluginManager, const QString& deviceHwId); + bool isRxEnumerated(const QString& deviceHwId, int deviceSequence); + bool isTxEnumerated(const QString& deviceHwId, int deviceSequence); }; #endif /* SDRBASE_DEVICE_DEVICEENUMERATOR_H_ */ diff --git a/sdrbase/plugin/pluginapi.h b/sdrbase/plugin/pluginapi.h index 3e6ccb13d..78f0c71ec 100644 --- a/sdrbase/plugin/pluginapi.h +++ b/sdrbase/plugin/pluginapi.h @@ -19,9 +19,11 @@ class SDRBASE_API PluginAPI : public QObject { public: struct SamplingDeviceRegistration //!< This is the device registration { + QString m_deviceHardwareId; QString m_deviceId; PluginInterface* m_plugin; - SamplingDeviceRegistration(const QString& deviceId, PluginInterface* plugin) : + SamplingDeviceRegistration(const QString& hardwareId, const QString& deviceId, PluginInterface* plugin) : + m_deviceHardwareId(hardwareId), m_deviceId(deviceId), m_plugin(plugin) { } diff --git a/sdrbase/plugin/plugininterface.h b/sdrbase/plugin/plugininterface.h index 5763ffe86..a3f4d3a0c 100644 --- a/sdrbase/plugin/plugininterface.h +++ b/sdrbase/plugin/plugininterface.h @@ -7,6 +7,7 @@ #include "export.h" struct SDRBASE_API PluginDescriptor { + const QString hardwareId; // general plugin description const QString displayedName; const QString version; @@ -202,6 +203,14 @@ public: (void) originDevices; } + virtual SamplingDevice::SamplingDeviceType getSamplingDeviceType() const { + return SamplingDevice::SamplingDeviceType::PhysicalDevice; + } + + virtual QString getDeviceTypeId() const { + return QString(""); + } + // device source plugins only virtual SamplingDevices enumSampleSources(const OriginDevices& originDevices) @@ -232,6 +241,10 @@ public: virtual void deleteSampleSourcePluginInstanceGUI(PluginInstanceGUI *ui); virtual void deleteSampleSourcePluginInstanceInput(DeviceSampleSource *source); + virtual int getDefaultRxNbItems() const { + return 1; + } + // device sink plugins only virtual SamplingDevices enumSampleSinks(const OriginDevices& originDevices) @@ -263,6 +276,10 @@ public: virtual void deleteSampleSinkPluginInstanceGUI(PluginInstanceGUI *ui); virtual void deleteSampleSinkPluginInstanceOutput(DeviceSampleSink *sink); + virtual int getDefaultTxNbItems() const { + return 1; + } + // device MIMO plugins only virtual SamplingDevices enumSampleMIMO(const OriginDevices& originDevices) diff --git a/sdrbase/plugin/pluginmanager.cpp b/sdrbase/plugin/pluginmanager.cpp index ceafcbe98..72651fd55 100644 --- a/sdrbase/plugin/pluginmanager.cpp +++ b/sdrbase/plugin/pluginmanager.cpp @@ -117,6 +117,11 @@ void PluginManager::loadPluginsFinal() DeviceEnumerator::instance()->enumerateMIMODevices(this); } +void PluginManager::loadPluginsNonDiscoverable(const DeviceUserArgs& deviceUserArgs) +{ + DeviceEnumerator::instance()->addNonDiscoverableDevices(this, deviceUserArgs); +} + void PluginManager::registerRxChannel(const QString& channelIdURI, const QString& channelId, PluginInterface* plugin) { qDebug() << "PluginManager::registerRxChannel " @@ -148,27 +153,42 @@ void PluginManager::registerSampleSource(const QString& sourceName, PluginInterf { qDebug() << "PluginManager::registerSampleSource " << plugin->getPluginDescriptor().displayedName.toStdString().c_str() - << " with source name " << sourceName.toStdString().c_str(); + << " with source name " << sourceName.toStdString().c_str() + << " and hardware id " << plugin->getPluginDescriptor().hardwareId; - m_sampleSourceRegistrations.append(PluginAPI::SamplingDeviceRegistration(sourceName, plugin)); + m_sampleSourceRegistrations.append(PluginAPI::SamplingDeviceRegistration( + plugin->getPluginDescriptor().hardwareId, + sourceName, + plugin + )); } void PluginManager::registerSampleSink(const QString& sinkName, PluginInterface* plugin) { qDebug() << "PluginManager::registerSampleSink " << plugin->getPluginDescriptor().displayedName.toStdString().c_str() - << " with sink name " << sinkName.toStdString().c_str(); + << " with sink name " << sinkName.toStdString().c_str() + << " and hardware id " << plugin->getPluginDescriptor().hardwareId; - m_sampleSinkRegistrations.append(PluginAPI::SamplingDeviceRegistration(sinkName, plugin)); + m_sampleSinkRegistrations.append(PluginAPI::SamplingDeviceRegistration( + plugin->getPluginDescriptor().hardwareId, + sinkName, + plugin + )); } void PluginManager::registerSampleMIMO(const QString& mimoName, PluginInterface* plugin) { qDebug() << "PluginManager::registerSampleMIMO " << plugin->getPluginDescriptor().displayedName.toStdString().c_str() - << " with MIMO name " << mimoName.toStdString().c_str(); + << " with MIMO name " << mimoName.toStdString().c_str() + << " and hardware id " << plugin->getPluginDescriptor().hardwareId; - m_sampleMIMORegistrations.append(PluginAPI::SamplingDeviceRegistration(mimoName, plugin)); + m_sampleMIMORegistrations.append(PluginAPI::SamplingDeviceRegistration( + plugin->getPluginDescriptor().hardwareId, + mimoName, + plugin + )); } void PluginManager::loadPluginsDir(const QDir& dir) diff --git a/sdrbase/plugin/pluginmanager.h b/sdrbase/plugin/pluginmanager.h index cb935e045..296a19f91 100644 --- a/sdrbase/plugin/pluginmanager.h +++ b/sdrbase/plugin/pluginmanager.h @@ -34,6 +34,7 @@ class Preset; class Message; class MessageQueue; class DeviceAPI; +class DeviceUserArgs; class SDRBASE_API PluginManager : public QObject { Q_OBJECT @@ -59,6 +60,7 @@ public: void loadPlugins(const QString& pluginsSubDir); void loadPluginsPart(const QString& pluginsSubDir); void loadPluginsFinal(); + void loadPluginsNonDiscoverable(const DeviceUserArgs& deviceUserArgs); const Plugins& getPlugins() const { return m_plugins; } // Callbacks from the plugins diff --git a/sdrgui/deviceuserargs.md b/sdrgui/deviceuserargs.md index 9777c55b7..e7b9ef549 100644 --- a/sdrgui/deviceuserargs.md +++ b/sdrgui/deviceuserargs.md @@ -18,28 +18,43 @@ This is the list of available devices reported by the initial enumeration. There

2 Import device button

-Use this button to import the selected device in the panel above (1) to the panel below (3) that lists the user arguments by device and sequence. You can only import a device which hardware ID and sequence is not already in the panel below. +Use this button to import the selected device in the panel above (1) to the panel below (6) that lists the user arguments by device and sequence. You can only import a device which hardware ID and sequence is not already in the panel below. -

3 User arguments

+

3 Non discoverable device hardware ID

-This is the list of arguments given by the user and attached to a specific device given its hardware ID and sequence. There are 3 columns: +Some devices cannot be discovered automatically. This is the case for networked devices in particular the PlutoSDR. In conjuctions with (4) and (5) you can define devices that can be added to the list of available devices for selection. Note that you will need to restart SDRangel for this to be effective. +Once the device is defined user arguments like the IP address can be specified for it. + +

4 Non discoverable device sequence

+ +In case more than one device with the same hardware ID is used in the system you can differentiate the, with an arbitrary sequence number. + +

5 Add non discoverable device definition

+ +Once defined with controls (3) and (4) use this button to add the device to the list of available devices. This will make it appear immediately in the + +

6 User arguments

+ +This is the list of arguments given by the user and attached to a specific device given its hardware ID and sequence. There are 4 columns: + + - **ND**: This is the non discoverable device indicator. When tagged with "ND" it means that the line refers to a non discoverable device specified by the user - **HwID**: This is the "hardware ID". It represents a type of device like `HackRF` or `TestSource` - **Seq**: The device sequence in enumeration starting at 0. You may have more that one device of the same type in the system - **Arg string**: The user argument string. It can be of any form and not necessarily in the `key1=value1, key2=value2` form. It is up to the corresponding plugin to interpret the string and to make use of its information. -

4 Delete button

+

7 Delete button

-Use this button to delete the arguments currently selected in the above panel (3) +Use this button to delete the arguments currently selected in the above panel (6) -

5 Edit arguments

+

8 Edit arguments

-Use this line editor to change the arguments currently selected in the above panel (3). The text will be committed when the focus is lost. +Use this line editor to change the arguments currently selected in the above panel (6). The text will be committed when the focus is lost. -

6 Cancel button

+

9 Cancel button

The changes made to the argument list are temporary. You can use this button to dismiss the changes and close the dialog. -

7 OK (confirmation) button

+

10 OK (confirmation) button

The changes made to the argument list are only temporary. You can use this button to commit the changes and close the dialog. diff --git a/sdrgui/gui/deviceuserargsdialog.ui b/sdrgui/gui/deviceuserargsdialog.ui index 9fce99a83..95a6479cf 100644 --- a/sdrgui/gui/deviceuserargsdialog.ui +++ b/sdrgui/gui/deviceuserargsdialog.ui @@ -76,16 +76,25 @@ HwID + + Hardware ID + Seq + + Sequence + Description + + Description + diff --git a/sdrgui/gui/pluginsdialog.cpp b/sdrgui/gui/pluginsdialog.cpp index cb8a26fec..9aa33db4d 100644 --- a/sdrgui/gui/pluginsdialog.cpp +++ b/sdrgui/gui/pluginsdialog.cpp @@ -7,16 +7,21 @@ PluginsDialog::PluginsDialog(PluginManager* pluginManager, QWidget* parent) : ui(new Ui::PluginsDialog) { ui->setupUi(this); - const PluginManager::Plugins& plugins = pluginManager->getPlugins(); - for(PluginManager::Plugins::const_iterator it = plugins.constBegin(); it != plugins.constEnd(); ++it) { + + for (PluginManager::Plugins::const_iterator it = plugins.constBegin(); it != plugins.constEnd(); ++it) + { QStringList sl; const PluginDescriptor& desc = it->pluginInterface->getPluginDescriptor(); sl.append(desc.displayedName); sl.append(desc.version); - if(desc.licenseIsGPL) + + if (desc.licenseIsGPL) { sl.append(tr("YES")); - else sl.append("no"); + } else { + sl.append("no"); + } + QTreeWidgetItem* pluginItem = new QTreeWidgetItem(ui->tree, sl); sl.clear(); sl.append(tr("Copyright: %1").arg(desc.copyright)); @@ -30,8 +35,13 @@ PluginsDialog::PluginsDialog(PluginManager* pluginManager, QWidget* parent) : sl.append(tr("Source Code: %1").arg(desc.sourceCodeURL)); item = new QTreeWidgetItem(pluginItem, sl); item->setFirstColumnSpanned(true); + sl.clear(); + sl.append(tr("Hardware ID: %1").arg(desc.hardwareId)); + item = new QTreeWidgetItem(pluginItem, sl); + item->setFirstColumnSpanned(true); } - ui->tree->resizeColumnToContents(0); + + ui->tree->resizeColumnToContents(0); ui->tree->resizeColumnToContents(1); ui->tree->resizeColumnToContents(2); } diff --git a/sdrgui/mainwindow.cpp b/sdrgui/mainwindow.cpp index cced30614..797bb3a27 100644 --- a/sdrgui/mainwindow.cpp +++ b/sdrgui/mainwindow.cpp @@ -193,6 +193,7 @@ MainWindow::MainWindow(qtwebapp::LoggerWithFile *logger, const MainParser& parse m_pluginManager = new PluginManager(this); m_pluginManager->loadPlugins(QString("plugins")); + m_pluginManager->loadPluginsNonDiscoverable(m_settings.getDeviceUserArgs()); splash->showStatusMessage("load file input...", Qt::white); qDebug() << "MainWindow::MainWindow: select SampleSource from settings or default (file input)..."; @@ -1693,7 +1694,7 @@ void MainWindow::sampleSourceChanged() deviceUI->m_deviceAPI->stopDeviceEngine(); // deletes old UI and input object - deviceUI->m_deviceAPI->getSampleSource()->setMessageQueueToGUI(0); // have source stop sending messages to the GUI + deviceUI->m_deviceAPI->getSampleSource()->setMessageQueueToGUI(nullptr); // have source stop sending messages to the GUI deviceUI->m_deviceAPI->getPluginInterface()->deleteSampleSourcePluginInstanceGUI( deviceUI->m_deviceAPI->getSamplingDevicePluginInstanceGUI()); deviceUI->m_deviceAPI->resetSamplingDeviceId();