From 38d2a1933828442b16aa82bbd05f9f19ea8fea9d Mon Sep 17 00:00:00 2001 From: f4exb Date: Sun, 2 May 2021 13:06:10 +0200 Subject: [PATCH] PlutoSDR MIMO: recognize user defined MIMO devices --- devices/plutosdr/deviceplutosdrbox.cpp | 14 ++-- .../samplemimo/plutosdrmimo/plutosdrmimo.cpp | 19 +++++- .../samplemimo/plutosdrmimo/plutosdrmimo.h | 2 + .../plutosdrmimo/plutosdrmimoplugin.cpp | 2 +- .../plutosdrmimo/plutosdrmimoplugin.h | 5 +- sdrbase/device/deviceenumerator.cpp | 68 ++++++++++++++++++- sdrbase/device/deviceenumerator.h | 2 + sdrbase/plugin/plugininterface.h | 4 ++ sdrgui/mainwindow.cpp | 23 +++++++ 9 files changed, 128 insertions(+), 11 deletions(-) diff --git a/devices/plutosdr/deviceplutosdrbox.cpp b/devices/plutosdr/deviceplutosdrbox.cpp index 871e5fa5c..b5c4ea081 100644 --- a/devices/plutosdr/deviceplutosdrbox.cpp +++ b/devices/plutosdr/deviceplutosdrbox.cpp @@ -494,7 +494,7 @@ struct iio_buffer *DevicePlutoSDRBox::createRxBuffer(unsigned int size, bool cyc if (m_devRx) { m_rxBuf = iio_device_create_buffer(m_devRx, size, cyclic ? '\1' : '\0'); } else { - m_rxBuf = 0; + m_rxBuf = nullptr; } return m_rxBuf; @@ -505,7 +505,7 @@ struct iio_buffer *DevicePlutoSDRBox::createTxBuffer(unsigned int size, bool cyc if (m_devTx) { m_txBuf = iio_device_create_buffer(m_devTx, size, cyclic ? '\1' : '\0'); } else { - m_txBuf = 0; + m_txBuf = nullptr; } return m_txBuf; @@ -513,17 +513,19 @@ struct iio_buffer *DevicePlutoSDRBox::createTxBuffer(unsigned int size, bool cyc void DevicePlutoSDRBox::deleteRxBuffer() { - if (m_rxBuf) { + if (m_rxBuf) + { iio_buffer_destroy(m_rxBuf); - m_rxBuf = 0; + m_rxBuf = nullptr; } } void DevicePlutoSDRBox::deleteTxBuffer() { - if (m_txBuf) { + if (m_txBuf) + { iio_buffer_destroy(m_txBuf); - m_txBuf = 0; + m_txBuf = nullptr; } } diff --git a/plugins/samplemimo/plutosdrmimo/plutosdrmimo.cpp b/plugins/samplemimo/plutosdrmimo/plutosdrmimo.cpp index 6dc77cb0a..9df05e316 100644 --- a/plugins/samplemimo/plutosdrmimo/plutosdrmimo.cpp +++ b/plugins/samplemimo/plutosdrmimo/plutosdrmimo.cpp @@ -44,9 +44,11 @@ PlutoSDRMIMO::PlutoSDRMIMO(DeviceAPI *deviceAPI) : m_settings(), m_sourceThread(nullptr), m_sinkThread(nullptr), - m_deviceDescription("BladeRF2MIMO"), + m_deviceDescription("PlutoSDRMIMO"), m_runningRx(false), m_runningTx(false), + m_plutoRxBuffer(nullptr), + m_plutoTxBuffer(nullptr), m_plutoParams(nullptr), m_open(false), m_nbRx(0), @@ -83,6 +85,7 @@ void PlutoSDRMIMO::destroy() bool PlutoSDRMIMO::openDevice() { + qDebug("PlutoSDRMIMO::openDevice: open device here"); m_plutoParams = new DevicePlutoSDRParams(); if (m_deviceAPI->getHardwareUserArguments().size() != 0) @@ -116,7 +119,11 @@ bool PlutoSDRMIMO::openDevice() char serial[256]; strcpy(serial, qPrintable(m_deviceAPI->getSamplingDeviceSerial())); - if (!m_plutoParams->open(serial)) + if (m_plutoParams->open(serial)) + { + qDebug("PlutoSDRMIMO::openDevice: device serial %s opened", serial); + } + else { qCritical("PlutoSDRMIMO::openDevice: open serial %s failed", serial); return false; @@ -182,6 +189,7 @@ bool PlutoSDRMIMO::startRx() m_plutoParams->getBox()->openSecondRx(); } + m_plutoRxBuffer = m_plutoParams->getBox()->createRxBuffer(PlutoSDRMIMOSettings::m_plutoSDRBlockSizeSamples, false); m_sourceThread->startWork(); mutexLocker.unlock(); m_runningRx = true; @@ -219,6 +227,7 @@ bool PlutoSDRMIMO::startTx() m_plutoParams->getBox()->openSecondTx(); } + m_plutoTxBuffer = m_plutoParams->getBox()->createRxBuffer(PlutoSDRMIMOSettings::m_plutoSDRBlockSizeSamples, false); m_sinkThread->startWork(); mutexLocker.unlock(); m_runningTx = true; @@ -248,6 +257,9 @@ void PlutoSDRMIMO::stopRx() if (m_nbRx > 0) { m_plutoParams->getBox()->closeRx(); } + + m_plutoParams->getBox()->deleteRxBuffer(); + m_plutoRxBuffer = nullptr; } void PlutoSDRMIMO::stopTx() @@ -272,6 +284,9 @@ void PlutoSDRMIMO::stopTx() if (m_nbTx > 0) { m_plutoParams->getBox()->closeTx(); } + + m_plutoParams->getBox()->deleteTxBuffer(); + m_plutoRxBuffer = nullptr; } QByteArray PlutoSDRMIMO::serialize() const diff --git a/plugins/samplemimo/plutosdrmimo/plutosdrmimo.h b/plugins/samplemimo/plutosdrmimo/plutosdrmimo.h index f646142bb..752cb7193 100644 --- a/plugins/samplemimo/plutosdrmimo/plutosdrmimo.h +++ b/plugins/samplemimo/plutosdrmimo/plutosdrmimo.h @@ -177,6 +177,8 @@ private: QString m_deviceDescription; bool m_runningRx; bool m_runningTx; + struct iio_buffer *m_plutoRxBuffer; + struct iio_buffer *m_plutoTxBuffer; QNetworkAccessManager *m_networkManager; QNetworkRequest m_networkRequest; diff --git a/plugins/samplemimo/plutosdrmimo/plutosdrmimoplugin.cpp b/plugins/samplemimo/plutosdrmimo/plutosdrmimoplugin.cpp index d23fa96d3..4730377ea 100644 --- a/plugins/samplemimo/plutosdrmimo/plutosdrmimoplugin.cpp +++ b/plugins/samplemimo/plutosdrmimo/plutosdrmimoplugin.cpp @@ -39,7 +39,7 @@ const PluginDescriptor PlutoSDRMIMOPlugin::m_pluginDescriptor = { }; static constexpr const char* const m_hardwareID = "PlutoSDR"; -static constexpr const char* const m_deviceTypeID = PLUTOSDRMIMO_DEVICE_TYPE_ID; +const char* const PlutoSDRMIMOPlugin::m_deviceTypeID = PLUTOSDRMIMO_DEVICE_TYPE_ID; PlutoSDRMIMOPlugin::PlutoSDRMIMOPlugin(QObject* parent) : QObject(parent) diff --git a/plugins/samplemimo/plutosdrmimo/plutosdrmimoplugin.h b/plugins/samplemimo/plutosdrmimo/plutosdrmimoplugin.h index d6e74b2af..c72842252 100644 --- a/plugins/samplemimo/plutosdrmimo/plutosdrmimoplugin.h +++ b/plugins/samplemimo/plutosdrmimo/plutosdrmimoplugin.h @@ -23,7 +23,7 @@ class PluginAPI; -#define PLUTOSDRMIMO_DEVICE_TYPE_ID "sdrangel.samplemimo.bladerf2mimo" +#define PLUTOSDRMIMO_DEVICE_TYPE_ID "sdrangel.samplemimo.plutosdrmimo" class PlutoSDRMIMOPlugin : public QObject, public PluginInterface { Q_OBJECT @@ -45,6 +45,9 @@ public: DeviceUISet *deviceUISet); virtual DeviceSampleMIMO* createSampleMIMOPluginInstance(const QString& sourceId, DeviceAPI *deviceAPI); virtual DeviceWebAPIAdapter* createDeviceWebAPIAdapter() const; + virtual QString getDeviceTypeId() const { return m_deviceTypeID; } + + static const char* const m_deviceTypeID; private: static const PluginDescriptor m_pluginDescriptor; diff --git a/sdrbase/device/deviceenumerator.cpp b/sdrbase/device/deviceenumerator.cpp index dfeba5be0..79c985b50 100644 --- a/sdrbase/device/deviceenumerator.cpp +++ b/sdrbase/device/deviceenumerator.cpp @@ -40,6 +40,7 @@ void DeviceEnumerator::addNonDiscoverableDevices(PluginManager *pluginManager, c 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) { @@ -47,6 +48,7 @@ void DeviceEnumerator::addNonDiscoverableDevices(PluginManager *pluginManager, c continue; } + // qDebug("DeviceEnumerator::addNonDiscoverableDevices: device: %s[%d]", qPrintable(argsIt->m_id), argsIt->m_sequence); QString serial = QString("%1-%2").arg(argsIt->m_id).arg(argsIt->m_sequence); PluginInterface *rxPlugin = getRxRegisteredPlugin(pluginManager, argsIt->m_id); @@ -99,7 +101,7 @@ void DeviceEnumerator::addNonDiscoverableDevices(PluginManager *pluginManager, c deviceId, // id serial, argsIt->m_sequence, - rxPlugin->getSamplingDeviceType(), + txPlugin->getSamplingDeviceType(), PluginInterface::SamplingDevice::StreamSingleTx, deviceNbItems, // deviceNbItems deviceIndex // deviceItemIndex @@ -114,6 +116,39 @@ void DeviceEnumerator::addNonDiscoverableDevices(PluginManager *pluginManager, c txIndex++; } } + + PluginInterface *mimoPlugin = getMIMORegisteredPlugin(pluginManager, argsIt->m_id); + + if (mimoPlugin && !isMIMOEnumerated(argsIt->m_id, argsIt->m_sequence)) + { + int deviceNbItems = mimoPlugin->getDefaultMIMONbItems(); + QString deviceId = mimoPlugin->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: MIMO: %s", qPrintable(description)); + PluginInterface::SamplingDevice ndDevice( + description, + argsIt->m_id, + deviceId, // id + serial, + argsIt->m_sequence, + mimoPlugin->getSamplingDeviceType(), + PluginInterface::SamplingDevice::StreamMIMO, + deviceNbItems, // deviceNbItems + deviceIndex // deviceItemIndex + ); + m_mimoEnumeration.push_back( + DeviceEnumeration( + ndDevice, + mimoPlugin, + mimoIndex + ) + ); + mimoIndex++; + } + } } // loop through user args } @@ -180,6 +215,37 @@ bool DeviceEnumerator::isTxEnumerated(const QString& deviceHwId, int deviceSeque return false; } +PluginInterface *DeviceEnumerator::getMIMORegisteredPlugin(PluginManager *pluginManager, const QString& deviceHwId) +{ + PluginAPI::SamplingDeviceRegistrations& mimoDeviceRegistrations = pluginManager->getMIMODeviceRegistrations(); + PluginInterface *mimoPlugin = nullptr; + + for (int i = 0; i < mimoDeviceRegistrations.count(); i++) + { + if (deviceHwId == mimoDeviceRegistrations[i].m_deviceHardwareId) + { + mimoPlugin = mimoDeviceRegistrations[i].m_plugin; + break; + } + } + + return mimoPlugin; +} + +bool DeviceEnumerator::isMIMOEnumerated(const QString& deviceHwId, int deviceSequence) +{ + std::vector::const_iterator mimoIt = m_mimoEnumeration.begin(); + + for (; mimoIt != m_mimoEnumeration.end(); ++mimoIt) + { + if ((mimoIt->m_samplingDevice.hardwareId == deviceHwId) && (mimoIt->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 b2e292717..ab4a5895d 100644 --- a/sdrbase/device/deviceenumerator.h +++ b/sdrbase/device/deviceenumerator.h @@ -87,8 +87,10 @@ private: PluginInterface *getRxRegisteredPlugin(PluginManager *pluginManager, const QString& deviceHwId); PluginInterface *getTxRegisteredPlugin(PluginManager *pluginManager, const QString& deviceHwId); + PluginInterface *getMIMORegisteredPlugin(PluginManager *pluginManager, const QString& deviceHwId); bool isRxEnumerated(const QString& deviceHwId, int deviceSequence); bool isTxEnumerated(const QString& deviceHwId, int deviceSequence); + bool isMIMOEnumerated(const QString& deviceHwId, int deviceSequence); }; #endif /* SDRBASE_DEVICE_DEVICEENUMERATOR_H_ */ diff --git a/sdrbase/plugin/plugininterface.h b/sdrbase/plugin/plugininterface.h index 2ca1b6851..8dff4d372 100644 --- a/sdrbase/plugin/plugininterface.h +++ b/sdrbase/plugin/plugininterface.h @@ -307,6 +307,10 @@ public: virtual void deleteSampleMIMOPluginInstanceMIMO(DeviceSampleMIMO *mimo); + virtual int getDefaultMIMONbItems() const { + return 1; + } + // Callback to allow plugin to add elements to top-level GUI (such as menu items) virtual bool createTopLevelGUI() { diff --git a/sdrgui/mainwindow.cpp b/sdrgui/mainwindow.cpp index f7d2839c4..e84ecfd90 100644 --- a/sdrgui/mainwindow.cpp +++ b/sdrgui/mainwindow.cpp @@ -1794,6 +1794,14 @@ void MainWindow::sampleSourceChanged(int tabIndex, int newDeviceIndex) deviceUI->m_deviceAPI->setSamplingDeviceDisplayName(samplingDevice->displayedName); deviceUI->m_deviceAPI->setSamplingDevicePluginInterface(DeviceEnumerator::instance()->getRxPluginInterface(newDeviceIndex)); + qDebug() << "MainWindow::sampleSourceChanged:" + << "newDeviceIndex:" << newDeviceIndex + << "hardwareId:" << samplingDevice->hardwareId + << "sequence:" << samplingDevice->sequence + << "id:" << samplingDevice->id + << "serial:" << samplingDevice->serial + << "displayedName:" << samplingDevice->displayedName; + if (deviceUI->m_deviceAPI->getSamplingDeviceId().size() == 0) // non existent device => replace by default { qDebug("MainWindow::sampleSourceChanged: non existent device replaced by File Input"); @@ -1899,6 +1907,14 @@ void MainWindow::sampleSinkChanged(int tabIndex, int newDeviceIndex) deviceUI->m_deviceAPI->setSamplingDeviceDisplayName(samplingDevice->displayedName); deviceUI->m_deviceAPI->setSamplingDevicePluginInterface(DeviceEnumerator::instance()->getTxPluginInterface(newDeviceIndex)); + qDebug() << "MainWindow::sampleSinkChanged:" + << "newDeviceIndex:" << newDeviceIndex + << "hardwareId:" << samplingDevice->hardwareId + << "sequence:" << samplingDevice->sequence + << "id:" << samplingDevice->id + << "serial:" << samplingDevice->serial + << "displayedName:" << samplingDevice->displayedName; + if (deviceUI->m_deviceAPI->getSamplingDeviceId().size() == 0) // non existent device => replace by default { qDebug("MainWindow::sampleSinkChanged: non existent device replaced by File Sink"); @@ -1996,6 +2012,13 @@ void MainWindow::sampleMIMOChanged(int tabIndex, int newDeviceIndex) deviceUI->m_deviceAPI->setSamplingDeviceSerial(samplingDevice->serial); deviceUI->m_deviceAPI->setSamplingDeviceDisplayName(samplingDevice->displayedName); deviceUI->m_deviceAPI->setSamplingDevicePluginInterface(DeviceEnumerator::instance()->getMIMOPluginInterface(newDeviceIndex)); + qDebug() << "MainWindow::sampleMIMOChanged:" + << "newDeviceIndex:" << newDeviceIndex + << "hardwareId:" << samplingDevice->hardwareId + << "sequence:" << samplingDevice->sequence + << "id:" << samplingDevice->id + << "serial:" << samplingDevice->serial + << "displayedName:" << samplingDevice->displayedName; if (deviceUI->m_deviceAPI->getSamplingDeviceId().size() == 0) // non existent device => replace by default {