diff --git a/sdrgui/mainwindow.cpp b/sdrgui/mainwindow.cpp index 82cdba556..cced30614 100644 --- a/sdrgui/mainwindow.cpp +++ b/sdrgui/mainwindow.cpp @@ -273,6 +273,8 @@ void MainWindow::addSourceDevice(int deviceIndex) int deviceTabIndex = m_deviceUIs.size(); m_deviceUIs.push_back(new DeviceUISet(deviceTabIndex, 0, m_masterTimer)); m_deviceUIs.back()->m_deviceSourceEngine = dspDeviceSourceEngine; + m_deviceUIs.back()->m_deviceSinkEngine = nullptr; + m_deviceUIs.back()->m_deviceMIMOEngine = nullptr; char tabNameCStr[16]; sprintf(tabNameCStr, "R%d", deviceTabIndex); @@ -352,8 +354,9 @@ void MainWindow::addSinkDevice() int deviceTabIndex = m_deviceUIs.size(); m_deviceUIs.push_back(new DeviceUISet(deviceTabIndex, 1, m_masterTimer)); - m_deviceUIs.back()->m_deviceSourceEngine = 0; + m_deviceUIs.back()->m_deviceSourceEngine = nullptr; m_deviceUIs.back()->m_deviceSinkEngine = dspDeviceSinkEngine; + m_deviceUIs.back()->m_deviceMIMOEngine = nullptr; char tabNameCStr[16]; sprintf(tabNameCStr, "T%d", deviceTabIndex); diff --git a/sdrsrv/maincore.cpp b/sdrsrv/maincore.cpp index 9ed591863..ffd3d5c55 100644 --- a/sdrsrv/maincore.cpp +++ b/sdrsrv/maincore.cpp @@ -24,6 +24,7 @@ #include "dsp/dspengine.h" #include "dsp/dspdevicesourceengine.h" #include "dsp/dspdevicesinkengine.h" +#include "dsp/dspdevicemimoengine.h" #include "device/deviceapi.h" #include "device/deviceset.h" #include "device/deviceenumerator.h" @@ -144,7 +145,9 @@ bool MainCore::handleMessage(const Message& cmd) addSinkDevice(); } else if (direction == 0) { // Single stream Rx addSourceDevice(); - } // device type not (yet) supported + } else if (direction == 2) { // MIMO + addMIMODevice(); + } return true; } @@ -278,8 +281,9 @@ void MainCore::addSinkDevice() int deviceTabIndex = m_deviceSets.size(); m_deviceSets.push_back(new DeviceSet(deviceTabIndex)); - m_deviceSets.back()->m_deviceSourceEngine = 0; - m_deviceSets.back()->m_deviceMIMOEngine = 0; + m_deviceSets.back()->m_deviceSourceEngine = nullptr; + m_deviceSets.back()->m_deviceSinkEngine = dspDeviceSinkEngine; + m_deviceSets.back()->m_deviceMIMOEngine = nullptr; char tabNameCStr[16]; sprintf(tabNameCStr, "T%d", deviceTabIndex); @@ -324,8 +328,8 @@ void MainCore::addSourceDevice() int deviceTabIndex = m_deviceSets.size(); m_deviceSets.push_back(new DeviceSet(deviceTabIndex)); m_deviceSets.back()->m_deviceSourceEngine = dspDeviceSourceEngine; - m_deviceSets.back()->m_deviceSinkEngine = 0; - m_deviceSets.back()->m_deviceMIMOEngine = 0; + m_deviceSets.back()->m_deviceSinkEngine = nullptr; + m_deviceSets.back()->m_deviceMIMOEngine = nullptr; char tabNameCStr[16]; sprintf(tabNameCStr, "R%d", deviceTabIndex); @@ -357,6 +361,49 @@ void MainCore::addSourceDevice() m_deviceSets.back()->m_deviceAPI->setSampleSource(source); } +void MainCore::addMIMODevice() +{ + DSPDeviceMIMOEngine *dspDeviceMIMOEngine = m_dspEngine->addDeviceMIMOEngine(); + dspDeviceMIMOEngine->start(); + + uint dspDeviceMIMOEngineUID = dspDeviceMIMOEngine->getUID(); + char uidCStr[16]; + sprintf(uidCStr, "UID:%d", dspDeviceMIMOEngineUID); + + int deviceTabIndex = m_deviceSets.size(); + m_deviceSets.push_back(new DeviceSet(deviceTabIndex)); + m_deviceSets.back()->m_deviceSourceEngine = nullptr; + m_deviceSets.back()->m_deviceSinkEngine = nullptr; + m_deviceSets.back()->m_deviceMIMOEngine = dspDeviceMIMOEngine; + + char tabNameCStr[16]; + sprintf(tabNameCStr, "M%d", deviceTabIndex); + + DeviceAPI *deviceAPI = new DeviceAPI(DeviceAPI::StreamMIMO, deviceTabIndex, nullptr, nullptr, dspDeviceMIMOEngine); + + // create a test MIMO by default + int testMIMODeviceIndex = DeviceEnumerator::instance()->getTestMIMODeviceIndex(); + const PluginInterface::SamplingDevice *samplingDevice = DeviceEnumerator::instance()->getMIMOSamplingDevice(testMIMODeviceIndex); + m_deviceSets.back()->m_deviceAPI->setSamplingDeviceSequence(samplingDevice->sequence); + m_deviceSets.back()->m_deviceAPI->setDeviceNbItems(samplingDevice->deviceNbItems); + m_deviceSets.back()->m_deviceAPI->setDeviceItemIndex(samplingDevice->deviceItemIndex); + m_deviceSets.back()->m_deviceAPI->setHardwareId(samplingDevice->hardwareId); + m_deviceSets.back()->m_deviceAPI->setSamplingDeviceId(samplingDevice->id); + m_deviceSets.back()->m_deviceAPI->setSamplingDeviceSerial(samplingDevice->serial); + m_deviceSets.back()->m_deviceAPI->setSamplingDeviceDisplayName(samplingDevice->displayedName); + m_deviceSets.back()->m_deviceAPI->setSamplingDevicePluginInterface(DeviceEnumerator::instance()->getMIMOPluginInterface(testMIMODeviceIndex)); + + QString userArgs = m_settings.getDeviceUserArgs().findUserArgs(samplingDevice->hardwareId, samplingDevice->sequence); + + if (userArgs.size() > 0) { + m_deviceSets.back()->m_deviceAPI->setHardwareUserArguments(userArgs); + } + + DeviceSampleMIMO *mimo = m_deviceSets.back()->m_deviceAPI->getPluginInterface()->createSampleMIMOPluginInstance( + m_deviceSets.back()->m_deviceAPI->getSamplingDeviceId(), m_deviceSets.back()->m_deviceAPI); + m_deviceSets.back()->m_deviceAPI->setSampleMIMO(mimo); +} + void MainCore::removeLastDevice() { if (m_deviceSets.back()->m_deviceSourceEngine) // source set diff --git a/sdrsrv/maincore.h b/sdrsrv/maincore.h index c043ad5b5..5073cfaf1 100644 --- a/sdrsrv/maincore.h +++ b/sdrsrv/maincore.h @@ -61,6 +61,7 @@ public: void addSourceDevice(); void addSinkDevice(); + void addMIMODevice(); void removeLastDevice(); void changeSampleSource(int deviceSetIndex, int selectedDeviceIndex); void changeSampleSink(int deviceSetIndex, int selectedDeviceIndex);