From 836fd6f4e2bf926198b04fe66d46fffe10570ea1 Mon Sep 17 00:00:00 2001 From: f4exb Date: Sun, 8 Sep 2019 00:44:56 +0200 Subject: [PATCH] Device UI set and Device set channel registrations unification --- sdrgui/device/deviceuiset.cpp | 137 +++++++++---------- sdrgui/device/deviceuiset.h | 30 ++-- sdrgui/mainwindow.cpp | 17 +-- sdrgui/mainwindow.h | 11 +- sdrgui/webapi/webapiadaptergui.cpp | 50 ++----- sdrsrv/device/deviceset.cpp | 212 +++++++++++++---------------- sdrsrv/device/deviceset.h | 24 ++-- sdrsrv/maincore.cpp | 14 +- sdrsrv/maincore.h | 11 +- sdrsrv/webapi/webapiadaptersrv.cpp | 50 ++----- 10 files changed, 221 insertions(+), 335 deletions(-) diff --git a/sdrgui/device/deviceuiset.cpp b/sdrgui/device/deviceuiset.cpp index 3bed0760b..d6cdb730f 100644 --- a/sdrgui/device/deviceuiset.cpp +++ b/sdrgui/device/deviceuiset.cpp @@ -82,85 +82,82 @@ void DeviceUISet::addRollupWidget(QWidget *widget) void DeviceUISet::registerRxChannelInstance(const QString& channelName, PluginInstanceGUI* pluginGUI) { - m_rxChannelInstanceRegistrations.append(ChannelInstanceRegistration(channelName, pluginGUI)); - renameRxChannelInstances(); + m_channelInstanceRegistrations.append(ChannelInstanceRegistration(channelName, pluginGUI, 0)); + renameChannelInstances(); } void DeviceUISet::registerTxChannelInstance(const QString& channelName, PluginInstanceGUI* pluginGUI) { - m_txChannelInstanceRegistrations.append(ChannelInstanceRegistration(channelName, pluginGUI)); - renameTxChannelInstances(); + m_channelInstanceRegistrations.append(ChannelInstanceRegistration(channelName, pluginGUI, 1)); + renameChannelInstances(); +} + +void DeviceUISet::registerChannelInstance(const QString& channelName, PluginInstanceGUI* pluginGUI) +{ + m_channelInstanceRegistrations.append(ChannelInstanceRegistration(channelName, pluginGUI, 2)); + renameChannelInstances(); } void DeviceUISet::removeRxChannelInstance(PluginInstanceGUI* pluginGUI) { - for(ChannelInstanceRegistrations::iterator it = m_rxChannelInstanceRegistrations.begin(); it != m_rxChannelInstanceRegistrations.end(); ++it) + for (ChannelInstanceRegistrations::iterator it = m_channelInstanceRegistrations.begin(); it != m_channelInstanceRegistrations.end(); ++it) { - if(it->m_gui == pluginGUI) + if (it->m_gui == pluginGUI) { - m_rxChannelInstanceRegistrations.erase(it); + m_channelInstanceRegistrations.erase(it); break; } } - renameRxChannelInstances(); + renameChannelInstances(); } void DeviceUISet::removeTxChannelInstance(PluginInstanceGUI* pluginGUI) { - for(ChannelInstanceRegistrations::iterator it = m_txChannelInstanceRegistrations.begin(); it != m_txChannelInstanceRegistrations.end(); ++it) + for (ChannelInstanceRegistrations::iterator it = m_channelInstanceRegistrations.begin(); it != m_channelInstanceRegistrations.end(); ++it) { - if(it->m_gui == pluginGUI) + if (it->m_gui == pluginGUI) { - m_txChannelInstanceRegistrations.erase(it); + m_channelInstanceRegistrations.erase(it); break; } } - renameTxChannelInstances(); + renameChannelInstances(); } -void DeviceUISet::freeRxChannels() +void DeviceUISet::removeChannelInstance(PluginInstanceGUI* pluginGUI) { - for(int i = 0; i < m_rxChannelInstanceRegistrations.count(); i++) + for (ChannelInstanceRegistrations::iterator it = m_channelInstanceRegistrations.begin(); it != m_channelInstanceRegistrations.end(); ++it) { - qDebug("DeviceUISet::freeAll: destroying channel [%s]", qPrintable(m_rxChannelInstanceRegistrations[i].m_channelName)); - m_rxChannelInstanceRegistrations[i].m_gui->destroy(); + if (it->m_gui == pluginGUI) + { + m_channelInstanceRegistrations.erase(it); + break; + } + } + + renameChannelInstances(); +} + +void DeviceUISet::freeChannels() +{ + for(int i = 0; i < m_channelInstanceRegistrations.count(); i++) + { + qDebug("DeviceUISet::freeChannels: destroying channel [%s]", qPrintable(m_channelInstanceRegistrations[i].m_channelName)); + m_channelInstanceRegistrations[i].m_gui->destroy(); } } -void DeviceUISet::freeTxChannels() +void DeviceUISet::deleteChannel(int channelIndex) { - for(int i = 0; i < m_txChannelInstanceRegistrations.count(); i++) + if ((channelIndex >= 0) && (channelIndex < m_channelInstanceRegistrations.count())) { - qDebug("DeviceUISet::freeAll: destroying channel [%s]", qPrintable(m_txChannelInstanceRegistrations[i].m_channelName)); - m_txChannelInstanceRegistrations[i].m_gui->destroy(); - } -} - -void DeviceUISet::deleteRxChannel(int channelIndex) -{ - if ((channelIndex >= 0) && (channelIndex < m_rxChannelInstanceRegistrations.count())) - { - qDebug("DeviceUISet::deleteRxChennel: delete channel [%s] at %d", - qPrintable(m_rxChannelInstanceRegistrations[channelIndex].m_channelName), + qDebug("DeviceUISet::deleteChannel: delete channel [%s] at %d", + qPrintable(m_channelInstanceRegistrations[channelIndex].m_channelName), channelIndex); - m_rxChannelInstanceRegistrations[channelIndex].m_gui->destroy(); - m_rxChannelInstanceRegistrations.removeAt(channelIndex); - renameRxChannelInstances(); - } -} - -void DeviceUISet::deleteTxChannel(int channelIndex) -{ - if ((channelIndex >= 0) && (channelIndex < m_txChannelInstanceRegistrations.count())) - { - qDebug("DeviceUISet::deleteTxChennel: delete channel [%s] at %d", - qPrintable(m_txChannelInstanceRegistrations[channelIndex].m_channelName), - channelIndex); - m_txChannelInstanceRegistrations[channelIndex].m_gui->destroy(); - m_txChannelInstanceRegistrations.removeAt(channelIndex); - renameTxChannelInstances(); + m_channelInstanceRegistrations.removeAt(channelIndex); + renameChannelInstances(); } } @@ -174,8 +171,8 @@ void DeviceUISet::loadRxChannelSettings(const Preset *preset, PluginAPI *pluginA PluginAPI::ChannelRegistrations *channelRegistrations = pluginAPI->getRxChannelRegistrations(); // copy currently open channels and clear list - ChannelInstanceRegistrations openChannels = m_rxChannelInstanceRegistrations; - m_rxChannelInstanceRegistrations.clear(); + ChannelInstanceRegistrations openChannels = m_channelInstanceRegistrations; + m_channelInstanceRegistrations.clear(); for(int i = 0; i < openChannels.count(); i++) { @@ -204,7 +201,7 @@ void DeviceUISet::loadRxChannelSettings(const Preset *preset, PluginAPI *pluginA (*channelRegistrations)[i].m_plugin->createRxChannelBS(m_deviceAPI); PluginInstanceGUI *rxChannelGUI = (*channelRegistrations)[i].m_plugin->createRxChannelGUI(this, rxChannel); - reg = ChannelInstanceRegistration(channelConfig.m_channelIdURI, rxChannelGUI); + reg = ChannelInstanceRegistration(channelConfig.m_channelIdURI, rxChannelGUI, 0); break; } } @@ -216,7 +213,7 @@ void DeviceUISet::loadRxChannelSettings(const Preset *preset, PluginAPI *pluginA } } - renameRxChannelInstances(); + renameChannelInstances(); } else { @@ -228,12 +225,12 @@ void DeviceUISet::saveRxChannelSettings(Preset *preset) { if (preset->isSourcePreset()) { - qSort(m_rxChannelInstanceRegistrations.begin(), m_rxChannelInstanceRegistrations.end()); // sort by increasing delta frequency and type + qSort(m_channelInstanceRegistrations.begin(), m_channelInstanceRegistrations.end()); // sort by increasing delta frequency and type - for(int i = 0; i < m_rxChannelInstanceRegistrations.count(); i++) + for(int i = 0; i < m_channelInstanceRegistrations.count(); i++) { - qDebug("DeviceUISet::saveRxChannelSettings: channel [%s] saved", qPrintable(m_rxChannelInstanceRegistrations[i].m_channelName)); - preset->addChannel(m_rxChannelInstanceRegistrations[i].m_channelName, m_rxChannelInstanceRegistrations[i].m_gui->serialize()); + qDebug("DeviceUISet::saveRxChannelSettings: channel [%s] saved", qPrintable(m_channelInstanceRegistrations[i].m_channelName)); + preset->addChannel(m_channelInstanceRegistrations[i].m_channelName, m_channelInstanceRegistrations[i].m_gui->serialize()); } } else @@ -256,8 +253,8 @@ void DeviceUISet::loadTxChannelSettings(const Preset *preset, PluginAPI *pluginA PluginAPI::ChannelRegistrations *channelRegistrations = pluginAPI->getTxChannelRegistrations(); // copy currently open channels and clear list - ChannelInstanceRegistrations openChannels = m_txChannelInstanceRegistrations; - m_txChannelInstanceRegistrations.clear(); + ChannelInstanceRegistrations openChannels = m_channelInstanceRegistrations; + m_channelInstanceRegistrations.clear(); for(int i = 0; i < openChannels.count(); i++) { @@ -285,7 +282,7 @@ void DeviceUISet::loadTxChannelSettings(const Preset *preset, PluginAPI *pluginA (*channelRegistrations)[i].m_plugin->createTxChannelBS(m_deviceAPI); PluginInstanceGUI *txChannelGUI = (*channelRegistrations)[i].m_plugin->createTxChannelGUI(this, txChannel); - reg = ChannelInstanceRegistration(channelConfig.m_channelIdURI, txChannelGUI); + reg = ChannelInstanceRegistration(channelConfig.m_channelIdURI, txChannelGUI, 1); break; } } @@ -297,7 +294,7 @@ void DeviceUISet::loadTxChannelSettings(const Preset *preset, PluginAPI *pluginA } } - renameTxChannelInstances(); + renameChannelInstances(); } } @@ -309,29 +306,27 @@ void DeviceUISet::saveTxChannelSettings(Preset *preset) } else { - qSort(m_txChannelInstanceRegistrations.begin(), m_txChannelInstanceRegistrations.end()); // sort by increasing delta frequency and type + qSort(m_channelInstanceRegistrations.begin(), m_channelInstanceRegistrations.end()); // sort by increasing delta frequency and type - for(int i = 0; i < m_txChannelInstanceRegistrations.count(); i++) + for(int i = 0; i < m_channelInstanceRegistrations.count(); i++) { - qDebug("DeviceUISet::saveTxChannelSettings: channel [%s] saved", qPrintable(m_txChannelInstanceRegistrations[i].m_channelName)); - preset->addChannel(m_txChannelInstanceRegistrations[i].m_channelName, m_txChannelInstanceRegistrations[i].m_gui->serialize()); + qDebug("DeviceUISet::saveTxChannelSettings: channel [%s] saved", qPrintable(m_channelInstanceRegistrations[i].m_channelName)); + preset->addChannel(m_channelInstanceRegistrations[i].m_channelName, m_channelInstanceRegistrations[i].m_gui->serialize()); } } } -void DeviceUISet::renameRxChannelInstances() +void DeviceUISet::renameChannelInstances() { - for(int i = 0; i < m_rxChannelInstanceRegistrations.count(); i++) - { - m_rxChannelInstanceRegistrations[i].m_gui->setName(QString("%1:%2").arg(m_rxChannelInstanceRegistrations[i].m_channelName).arg(i)); - } -} + int mimoCount = 0; -void DeviceUISet::renameTxChannelInstances() -{ - for(int i = 0; i < m_txChannelInstanceRegistrations.count(); i++) + for(int i = 0; i < m_channelInstanceRegistrations.count(); i++) { - m_txChannelInstanceRegistrations[i].m_gui->setName(QString("%1:%2").arg(m_txChannelInstanceRegistrations[i].m_channelName).arg(i)); + if (m_channelInstanceTypes[i] == 2) + { + m_channelInstanceRegistrations[i].m_gui->setName(QString("%1:%2").arg(m_channelInstanceRegistrations[i].m_channelName).arg(i)); + mimoCount++; + } } } diff --git a/sdrgui/device/deviceuiset.h b/sdrgui/device/deviceuiset.h index 9ae2b786d..783cb56ce 100644 --- a/sdrgui/device/deviceuiset.h +++ b/sdrgui/device/deviceuiset.h @@ -58,20 +58,20 @@ public: void addChannelMarker(ChannelMarker* channelMarker); //!< Add channel marker to spectrum void addRollupWidget(QWidget *widget); //!< Add rollup widget to channel window - int getNumberOfRxChannels() const { return m_rxChannelInstanceRegistrations.size(); } - int getNumberOfTxChannels() const { return m_txChannelInstanceRegistrations.size(); } + int getNumberOfChannels() const { return m_channelInstanceRegistrations.size(); } void registerRxChannelInstance(const QString& channelName, PluginInstanceGUI* pluginGUI); void registerTxChannelInstance(const QString& channelName, PluginInstanceGUI* pluginGUI); + void registerChannelInstance(const QString& channelName, PluginInstanceGUI* pluginGUI); void removeRxChannelInstance(PluginInstanceGUI* pluginGUI); void removeTxChannelInstance(PluginInstanceGUI* pluginGUI); - void freeRxChannels(); - void freeTxChannels(); - void deleteRxChannel(int channelIndex); - void deleteTxChannel(int channelIndex); + void removeChannelInstance(PluginInstanceGUI* pluginGUI); + void freeChannels(); + void deleteChannel(int channelIndex); void loadRxChannelSettings(const Preset* preset, PluginAPI *pluginAPI); void saveRxChannelSettings(Preset* preset); void loadTxChannelSettings(const Preset* preset, PluginAPI *pluginAPI); void saveTxChannelSettings(Preset* preset); + //TODO: load and save MIMO channel settings when preset has MIMO type defined // These are the number of channel types available for selection void setNumberOfAvailableRxChannels(int number) { m_nbAvailableRxChannels = number; } @@ -86,15 +86,18 @@ private: { QString m_channelName; PluginInstanceGUI* m_gui; + int m_channelType; ChannelInstanceRegistration() : m_channelName(), - m_gui(nullptr) + m_gui(nullptr), + m_channelType(0) { } - ChannelInstanceRegistration(const QString& channelName, PluginInstanceGUI* pluginGUI) : + ChannelInstanceRegistration(const QString& channelName, PluginInstanceGUI* pluginGUI, int channelType) : m_channelName(channelName), - m_gui(pluginGUI) + m_gui(pluginGUI), + m_channelType(channelType) { } bool operator<(const ChannelInstanceRegistration& other) const; @@ -102,15 +105,16 @@ private: typedef QList ChannelInstanceRegistrations; - ChannelInstanceRegistrations m_rxChannelInstanceRegistrations; - ChannelInstanceRegistrations m_txChannelInstanceRegistrations; + // ChannelInstanceRegistrations m_rxChannelInstanceRegistrations; + // ChannelInstanceRegistrations m_txChannelInstanceRegistrations; + ChannelInstanceRegistrations m_channelInstanceRegistrations; + QList m_channelInstanceTypes; int m_deviceTabIndex; int m_nbAvailableRxChannels; //!< Number of Rx channels available for selection int m_nbAvailableTxChannels; //!< Number of Tx channels available for selection int m_nbAvailableMIMOChannels; //!< Number of MIMO channels available for selection - void renameRxChannelInstances(); - void renameTxChannelInstances(); + void renameChannelInstances(); }; diff --git a/sdrgui/mainwindow.cpp b/sdrgui/mainwindow.cpp index 3ef1058d1..3273d7c66 100644 --- a/sdrgui/mainwindow.cpp +++ b/sdrgui/mainwindow.cpp @@ -518,7 +518,7 @@ void MainWindow::removeLastDevice() ui->tabSpectra->removeTab(ui->tabSpectra->count() - 1); // deletes old UI and input object - m_deviceUIs.back()->freeRxChannels(); // destroys the channel instances + m_deviceUIs.back()->freeChannels(); // destroys the channel instances m_deviceUIs.back()->m_deviceAPI->getSampleSource()->setMessageQueueToGUI(0); // have source stop sending messages to the GUI m_deviceUIs.back()->m_deviceAPI->getPluginInterface()->deleteSampleSourcePluginInstanceGUI( m_deviceUIs.back()->m_deviceAPI->getSamplingDevicePluginInstanceGUI()); @@ -560,7 +560,7 @@ void MainWindow::removeLastDevice() ui->tabSpectra->removeTab(ui->tabSpectra->count() - 1); // deletes old UI and output object - m_deviceUIs.back()->freeTxChannels(); + m_deviceUIs.back()->freeChannels(); m_deviceUIs.back()->m_deviceAPI->getSampleSink()->setMessageQueueToGUI(0); // have sink stop sending messages to the GUI m_deviceUIs.back()->m_deviceAPI->getPluginInterface()->deleteSampleSourcePluginInstanceGUI( m_deviceUIs.back()->m_deviceAPI->getSamplingDevicePluginInstanceGUI()); @@ -602,8 +602,7 @@ void MainWindow::removeLastDevice() ui->tabSpectra->removeTab(ui->tabSpectra->count() - 1); // deletes old UI and output object - m_deviceUIs.back()->freeRxChannels(); - m_deviceUIs.back()->freeTxChannels(); + m_deviceUIs.back()->freeChannels(); m_deviceUIs.back()->m_deviceAPI->getSampleMIMO()->setMessageQueueToGUI(nullptr); // have sink stop sending messages to the GUI m_deviceUIs.back()->m_deviceAPI->getPluginInterface()->deleteSampleMIMOPluginInstanceGUI( m_deviceUIs.back()->m_deviceAPI->getSamplingDevicePluginInstanceGUI()); @@ -642,15 +641,7 @@ void MainWindow::deleteChannel(int deviceSetIndex, int channelIndex) if ((deviceSetIndex >= 0) && (deviceSetIndex < (int) m_deviceUIs.size())) { DeviceUISet *deviceSet = m_deviceUIs[deviceSetIndex]; - - if (deviceSet->m_deviceSourceEngine) // source device => Rx channels - { - deviceSet->deleteRxChannel(channelIndex); - } - else if (deviceSet->m_deviceSinkEngine) // sink device => Tx channels - { - deviceSet->deleteTxChannel(channelIndex); - } + deviceSet->deleteChannel(channelIndex); } } diff --git a/sdrgui/mainwindow.h b/sdrgui/mainwindow.h index 3d58029f0..88aed8cb6 100644 --- a/sdrgui/mainwindow.h +++ b/sdrgui/mainwindow.h @@ -250,23 +250,20 @@ private: public: int getDeviceSetIndex() const { return m_deviceSetIndex; } int getChannelIndex() const { return m_channelIndex; } - bool isTx() const { return m_tx; } - static MsgDeleteChannel* create(int deviceSetIndex, int channelIndex, bool tx) + static MsgDeleteChannel* create(int deviceSetIndex, int channelIndex) { - return new MsgDeleteChannel(deviceSetIndex, channelIndex, tx); + return new MsgDeleteChannel(deviceSetIndex, channelIndex); } private: int m_deviceSetIndex; int m_channelIndex; - bool m_tx; - MsgDeleteChannel(int deviceSetIndex, int channelIndex, bool tx) : + MsgDeleteChannel(int deviceSetIndex, int channelIndex) : Message(), m_deviceSetIndex(deviceSetIndex), - m_channelIndex(channelIndex), - m_tx(tx) + m_channelIndex(channelIndex) { } }; diff --git a/sdrgui/webapi/webapiadaptergui.cpp b/sdrgui/webapi/webapiadaptergui.cpp index e5846f6ac..26be6005a 100644 --- a/sdrgui/webapi/webapiadaptergui.cpp +++ b/sdrgui/webapi/webapiadaptergui.cpp @@ -1648,53 +1648,23 @@ int WebAPIAdapterGUI::devicesetChannelDelete( { DeviceUISet *deviceSet = m_mainWindow.m_deviceUIs[deviceSetIndex]; - if (deviceSet->m_deviceSourceEngine) // Rx + if (channelIndex < deviceSet->getNumberOfChannels()) { - if (channelIndex < deviceSet->getNumberOfRxChannels()) - { - MainWindow::MsgDeleteChannel *msg = MainWindow::MsgDeleteChannel::create(deviceSetIndex, channelIndex, false); - m_mainWindow.m_inputMessageQueue.push(msg); + MainWindow::MsgDeleteChannel *msg = MainWindow::MsgDeleteChannel::create(deviceSetIndex, channelIndex); + m_mainWindow.m_inputMessageQueue.push(msg); - response.init(); - *response.getMessage() = QString("Message to delete a channel (MsgDeleteChannel) was submitted successfully"); + response.init(); + *response.getMessage() = QString("Message to delete a channel (MsgDeleteChannel) was submitted successfully"); - return 202; - } - else - { - error.init(); - *error.getMessage() = QString("There is no channel at index %1. There are %2 Rx channels") - .arg(channelIndex) - .arg(channelIndex < deviceSet->getNumberOfRxChannels()); - return 400; - } - } - else if (deviceSet->m_deviceSinkEngine) // Tx - { - if (channelIndex < deviceSet->getNumberOfTxChannels()) - { - MainWindow::MsgDeleteChannel *msg = MainWindow::MsgDeleteChannel::create(deviceSetIndex, channelIndex, true); - m_mainWindow.m_inputMessageQueue.push(msg); - - response.init(); - *response.getMessage() = QString("Message to delete a channel (MsgDeleteChannel) was submitted successfully"); - - return 202; - } - else - { - error.init(); - *error.getMessage() = QString("There is no channel at index %1. There are %2 Tx channels") - .arg(channelIndex) - .arg(channelIndex < deviceSet->getNumberOfRxChannels()); - return 400; - } + return 202; } else { error.init(); - *error.getMessage() = QString("DeviceSet error"); - return 500; + *error.getMessage() = QString("There is no channel at index %1. There are %2 channels") + .arg(channelIndex) + .arg(channelIndex < deviceSet->getNumberOfChannels()); + return 400; } } else diff --git a/sdrsrv/device/deviceset.cpp b/sdrsrv/device/deviceset.cpp index 5ead690e8..77a2f7ff4 100644 --- a/sdrsrv/device/deviceset.cpp +++ b/sdrsrv/device/deviceset.cpp @@ -29,25 +29,8 @@ DeviceSet::ChannelInstanceRegistration::ChannelInstanceRegistration(const QString& channelName, ChannelAPI* channelAPI) : m_channelName(channelName), - m_channelSinkAPI(channelAPI), - m_channelSourceAPI(0) -{ - if (channelAPI->getStreamType() == ChannelAPI::StreamSingleSink) - { - m_channelSinkAPI = channelAPI; - m_channelSourceAPI = nullptr; - } - else if (channelAPI->getStreamType() == ChannelAPI::StreamSingleSource) - { - m_channelSinkAPI = nullptr; - m_channelSourceAPI = channelAPI; - } - else - { - m_channelSinkAPI = nullptr; - m_channelSourceAPI = nullptr; - } -} + m_channelAPI(channelAPI) +{} DeviceSet::DeviceSet(int tabIndex) { @@ -64,79 +47,80 @@ DeviceSet::~DeviceSet() void DeviceSet::registerRxChannelInstance(const QString& channelName, ChannelAPI* channelAPI) { - m_rxChannelInstanceRegistrations.append(ChannelInstanceRegistration(channelName, channelAPI)); - renameRxChannelInstances(); + m_channelInstanceRegistrations.append(ChannelInstanceRegistration(channelName, channelAPI)); + renameChannelInstances(); } void DeviceSet::registerTxChannelInstance(const QString& channelName, ChannelAPI* channelAPI) { - m_txChannelInstanceRegistrations.append(ChannelInstanceRegistration(channelName, channelAPI)); - renameTxChannelInstances(); + m_channelInstanceRegistrations.append(ChannelInstanceRegistration(channelName, channelAPI)); + renameChannelInstances(); +} + +void DeviceSet::registerChannelInstance(const QString& channelName, ChannelAPI* channelAPI) +{ + m_channelInstanceRegistrations.append(ChannelInstanceRegistration(channelName, channelAPI)); + renameChannelInstances(); } void DeviceSet::removeRxChannelInstance(ChannelAPI* channelAPI) { - for(ChannelInstanceRegistrations::iterator it = m_rxChannelInstanceRegistrations.begin(); it != m_rxChannelInstanceRegistrations.end(); ++it) + for (ChannelInstanceRegistrations::iterator it = m_channelInstanceRegistrations.begin(); it != m_channelInstanceRegistrations.end(); ++it) { - if(it->m_channelSinkAPI == channelAPI) + if (it->m_channelAPI == channelAPI) { - m_rxChannelInstanceRegistrations.erase(it); + m_channelInstanceRegistrations.erase(it); break; } } - renameRxChannelInstances(); + renameChannelInstances(); } void DeviceSet::removeTxChannelInstance(ChannelAPI* channelAPI) { - for(ChannelInstanceRegistrations::iterator it = m_txChannelInstanceRegistrations.begin(); it != m_txChannelInstanceRegistrations.end(); ++it) + for(ChannelInstanceRegistrations::iterator it = m_channelInstanceRegistrations.begin(); it != m_channelInstanceRegistrations.end(); ++it) { - if(it->m_channelSourceAPI == channelAPI) + if(it->m_channelAPI == channelAPI) { - m_txChannelInstanceRegistrations.erase(it); + m_channelInstanceRegistrations.erase(it); break; } } - renameTxChannelInstances(); + renameChannelInstances(); } -void DeviceSet::freeRxChannels() +void DeviceSet::removeChannelInstance(ChannelAPI* channelAPI) { - for(int i = 0; i < m_rxChannelInstanceRegistrations.count(); i++) + for(ChannelInstanceRegistrations::iterator it = m_channelInstanceRegistrations.begin(); it != m_channelInstanceRegistrations.end(); ++it) { - qDebug("DeviceSet::freeAll: destroying channel [%s]", qPrintable(m_rxChannelInstanceRegistrations[i].m_channelName)); - m_rxChannelInstanceRegistrations[i].m_channelSinkAPI->destroy(); + if(it->m_channelAPI == channelAPI) + { + m_channelInstanceRegistrations.erase(it); + break; + } + } + + renameChannelInstances(); +} + +void DeviceSet::freeChannels() +{ + for(int i = 0; i < m_channelInstanceRegistrations.count(); i++) + { + qDebug("DeviceSet::freeChannels: destroying channel [%s]", qPrintable(m_channelInstanceRegistrations[i].m_channelName)); + m_channelInstanceRegistrations[i].m_channelAPI->destroy(); } } -void DeviceSet::freeTxChannels() +void DeviceSet::deleteChannel(int channelIndex) { - for(int i = 0; i < m_txChannelInstanceRegistrations.count(); i++) + if (channelIndex < m_channelInstanceRegistrations.count()) { - qDebug("DeviceSet::freeAll: destroying channel [%s]", qPrintable(m_txChannelInstanceRegistrations[i].m_channelName)); - m_txChannelInstanceRegistrations[i].m_channelSourceAPI->destroy(); - } -} - -void DeviceSet::deleteRxChannel(int channelIndex) -{ - if (channelIndex < m_rxChannelInstanceRegistrations.count()) - { - m_rxChannelInstanceRegistrations[channelIndex].m_channelSinkAPI->destroy(); - m_rxChannelInstanceRegistrations.removeAt(channelIndex); - renameRxChannelInstances(); - } -} - -void DeviceSet::deleteTxChannel(int channelIndex) -{ - if (channelIndex < m_txChannelInstanceRegistrations.count()) - { - m_txChannelInstanceRegistrations[channelIndex].m_channelSourceAPI->destroy(); - m_txChannelInstanceRegistrations.removeAt(channelIndex); - renameTxChannelInstances(); + m_channelInstanceRegistrations[channelIndex].m_channelAPI->destroy(); + m_channelInstanceRegistrations.removeAt(channelIndex); + renameChannelInstances(); } } @@ -145,7 +129,7 @@ void DeviceSet::addRxChannel(int selectedChannelIndex, PluginAPI *pluginAPI) PluginAPI::ChannelRegistrations *channelRegistrations = pluginAPI->getRxChannelRegistrations(); // Available channel plugins ChannelAPI *rxChannel =(*channelRegistrations)[selectedChannelIndex].m_plugin->createRxChannelCS(m_deviceAPI); ChannelInstanceRegistration reg = ChannelInstanceRegistration(rxChannel->getName(), rxChannel); - m_rxChannelInstanceRegistrations.append(reg); + m_channelInstanceRegistrations.append(reg); qDebug("DeviceSet::addRxChannel: %s", qPrintable(rxChannel->getName())); } @@ -154,10 +138,19 @@ void DeviceSet::addTxChannel(int selectedChannelIndex, PluginAPI *pluginAPI) PluginAPI::ChannelRegistrations *channelRegistrations = pluginAPI->getTxChannelRegistrations(); // Available channel plugins ChannelAPI *txChannel = (*channelRegistrations)[selectedChannelIndex].m_plugin->createTxChannelCS(m_deviceAPI); ChannelInstanceRegistration reg = ChannelInstanceRegistration(txChannel->getName(), txChannel); - m_txChannelInstanceRegistrations.append(reg); + m_channelInstanceRegistrations.append(reg); qDebug("DeviceSet::addTxChannel: %s", qPrintable(txChannel->getName())); } +void DeviceSet::addMIMOChannel(int selectedChannelIndex, PluginAPI *pluginAPI) +{ + PluginAPI::ChannelRegistrations *channelRegistrations = pluginAPI->getMIMOChannelRegistrations(); // Available channel plugins + ChannelAPI *mimoChannel = (*channelRegistrations)[selectedChannelIndex].m_plugin->createMIMOChannelCS(m_deviceAPI); + ChannelInstanceRegistration reg = ChannelInstanceRegistration(mimoChannel->getName(), mimoChannel); + m_channelInstanceRegistrations.append(reg); + qDebug("DeviceSet::addMIMOChannel: %s", qPrintable(mimoChannel->getName())); +} + void DeviceSet::loadRxChannelSettings(const Preset *preset, PluginAPI *pluginAPI) { if (preset->isSourcePreset()) @@ -168,8 +161,8 @@ void DeviceSet::loadRxChannelSettings(const Preset *preset, PluginAPI *pluginAPI PluginAPI::ChannelRegistrations *channelRegistrations = pluginAPI->getRxChannelRegistrations(); // copy currently open channels and clear list - ChannelInstanceRegistrations openChannels = m_rxChannelInstanceRegistrations; - m_rxChannelInstanceRegistrations.clear(); + ChannelInstanceRegistrations openChannels = m_channelInstanceRegistrations; + m_channelInstanceRegistrations.clear(); qDebug("DeviceSet::loadChannelSettings: %d channel(s) in preset", preset->getChannelCount()); @@ -189,14 +182,14 @@ void DeviceSet::loadRxChannelSettings(const Preset *preset, PluginAPI *pluginAPI { qDebug("DeviceSet::loadChannelSettings: channel [%s] found", qPrintable(openChannels[i].m_channelName)); reg = openChannels.takeAt(i); - m_rxChannelInstanceRegistrations.append(reg); + m_channelInstanceRegistrations.append(reg); break; } } // if we haven't one already, create one - if (reg.m_channelSinkAPI == 0) + if (reg.m_channelAPI == nullptr) { for (int i = 0; i < channelRegistrations->count(); i++) { @@ -208,16 +201,16 @@ void DeviceSet::loadRxChannelSettings(const Preset *preset, PluginAPI *pluginAPI qPrintable(channelConfig.m_channelIdURI)); ChannelAPI *rxChannel = (*channelRegistrations)[i].m_plugin->createRxChannelCS(m_deviceAPI); reg = ChannelInstanceRegistration(channelConfig.m_channelIdURI, rxChannel); - m_rxChannelInstanceRegistrations.append(reg); + m_channelInstanceRegistrations.append(reg); break; } } } - if (reg.m_channelSinkAPI != 0) + if (reg.m_channelAPI != nullptr) { qDebug("DeviceSet::loadChannelSettings: deserializing channel [%s]", qPrintable(channelConfig.m_channelIdURI)); - reg.m_channelSinkAPI->deserialize(channelConfig.m_config); + reg.m_channelAPI->deserialize(channelConfig.m_config); } } @@ -225,10 +218,10 @@ void DeviceSet::loadRxChannelSettings(const Preset *preset, PluginAPI *pluginAPI for (int i = 0; i < openChannels.count(); i++) { qDebug("DeviceSet::loadChannelSettings: destroying spare channel [%s]", qPrintable(openChannels[i].m_channelName)); - openChannels[i].m_channelSinkAPI->destroy(); + openChannels[i].m_channelAPI->destroy(); } - renameRxChannelInstances(); + renameChannelInstances(); } else { @@ -240,12 +233,12 @@ void DeviceSet::saveRxChannelSettings(Preset *preset) { if (preset->isSourcePreset()) { - qSort(m_rxChannelInstanceRegistrations.begin(), m_rxChannelInstanceRegistrations.end()); // sort by increasing delta frequency and type + qSort(m_channelInstanceRegistrations.begin(), m_channelInstanceRegistrations.end()); // sort by increasing delta frequency and type - for(int i = 0; i < m_rxChannelInstanceRegistrations.count(); i++) + for (int i = 0; i < m_channelInstanceRegistrations.count(); i++) { - qDebug("DeviceSet::saveChannelSettings: channel [%s] saved", qPrintable(m_rxChannelInstanceRegistrations[i].m_channelName)); - preset->addChannel(m_rxChannelInstanceRegistrations[i].m_channelName, m_rxChannelInstanceRegistrations[i].m_channelSinkAPI->serialize()); + qDebug("DeviceSet::saveChannelSettings: channel [%s] saved", qPrintable(m_channelInstanceRegistrations[i].m_channelName)); + preset->addChannel(m_channelInstanceRegistrations[i].m_channelName, m_channelInstanceRegistrations[i].m_channelAPI->serialize()); } } else @@ -268,63 +261,63 @@ void DeviceSet::loadTxChannelSettings(const Preset *preset, PluginAPI *pluginAPI PluginAPI::ChannelRegistrations *channelRegistrations = pluginAPI->getTxChannelRegistrations(); // copy currently open channels and clear list - ChannelInstanceRegistrations openChannels = m_txChannelInstanceRegistrations; - m_txChannelInstanceRegistrations.clear(); + ChannelInstanceRegistrations openChannels = m_channelInstanceRegistrations; + m_channelInstanceRegistrations.clear(); qDebug("DeviceSet::loadChannelSettings: %d channel(s) in preset", preset->getChannelCount()); - for(int i = 0; i < preset->getChannelCount(); i++) + for (int i = 0; i < preset->getChannelCount(); i++) { const Preset::ChannelConfig& channelConfig = preset->getChannelConfig(i); ChannelInstanceRegistration reg; // if we have one instance available already, use it - for(int i = 0; i < openChannels.count(); i++) + for (int i = 0; i < openChannels.count(); i++) { qDebug("DeviceSet::loadChannelSettings: channels compare [%s] vs [%s]", qPrintable(openChannels[i].m_channelName), qPrintable(channelConfig.m_channelIdURI)); - if(openChannels[i].m_channelName == channelConfig.m_channelIdURI) + if (openChannels[i].m_channelName == channelConfig.m_channelIdURI) { qDebug("DeviceSet::loadChannelSettings: channel [%s] found", qPrintable(openChannels[i].m_channelName)); reg = openChannels.takeAt(i); - m_txChannelInstanceRegistrations.append(reg); + m_channelInstanceRegistrations.append(reg); break; } } // if we haven't one already, create one - if(reg.m_channelSourceAPI == 0) + if (reg.m_channelAPI == nullptr) { - for(int i = 0; i < channelRegistrations->count(); i++) + for (int i = 0; i < channelRegistrations->count(); i++) { - if((*channelRegistrations)[i].m_channelIdURI == channelConfig.m_channelIdURI) + if ((*channelRegistrations)[i].m_channelIdURI == channelConfig.m_channelIdURI) { qDebug("DeviceSet::loadChannelSettings: creating new channel [%s]", qPrintable(channelConfig.m_channelIdURI)); ChannelAPI *txChannel = (*channelRegistrations)[i].m_plugin->createTxChannelCS(m_deviceAPI); reg = ChannelInstanceRegistration(channelConfig.m_channelIdURI, txChannel); - m_txChannelInstanceRegistrations.append(reg); + m_channelInstanceRegistrations.append(reg); break; } } } - if(reg.m_channelSourceAPI != 0) + if (reg.m_channelAPI != nullptr) { qDebug("DeviceSet::loadChannelSettings: deserializing channel [%s]", qPrintable(channelConfig.m_channelIdURI)); - reg.m_channelSourceAPI->deserialize(channelConfig.m_config); + reg.m_channelAPI->deserialize(channelConfig.m_config); } } // everything, that is still "available" is not needed anymore - for(int i = 0; i < openChannels.count(); i++) + for (int i = 0; i < openChannels.count(); i++) { qDebug("DeviceSet::loadChannelSettings: destroying spare channel [%s]", qPrintable(openChannels[i].m_channelName)); - openChannels[i].m_channelSourceAPI->destroy(); + openChannels[i].m_channelAPI->destroy(); } - renameTxChannelInstances(); + renameChannelInstances(); } } @@ -336,55 +329,36 @@ void DeviceSet::saveTxChannelSettings(Preset *preset) } else { - qSort(m_txChannelInstanceRegistrations.begin(), m_txChannelInstanceRegistrations.end()); // sort by increasing delta frequency and type + qSort(m_channelInstanceRegistrations.begin(), m_channelInstanceRegistrations.end()); // sort by increasing delta frequency and type - for(int i = 0; i < m_txChannelInstanceRegistrations.count(); i++) + for (int i = 0; i < m_channelInstanceRegistrations.count(); i++) { - qDebug("DeviceSet::saveChannelSettings: channel [%s] saved", qPrintable(m_txChannelInstanceRegistrations[i].m_channelName)); - preset->addChannel(m_txChannelInstanceRegistrations[i].m_channelName, m_txChannelInstanceRegistrations[i].m_channelSourceAPI->serialize()); + qDebug("DeviceSet::saveChannelSettings: channel [%s] saved", qPrintable(m_channelInstanceRegistrations[i].m_channelName)); + preset->addChannel(m_channelInstanceRegistrations[i].m_channelName, m_channelInstanceRegistrations[i].m_channelAPI->serialize()); } } } -void DeviceSet::renameRxChannelInstances() +void DeviceSet::renameChannelInstances() { - for(int i = 0; i < m_rxChannelInstanceRegistrations.count(); i++) + for (int i = 0; i < m_channelInstanceRegistrations.count(); i++) { - m_rxChannelInstanceRegistrations[i].m_channelSinkAPI->setName(QString("%1:%2").arg(m_rxChannelInstanceRegistrations[i].m_channelName).arg(i)); - } -} - -void DeviceSet::renameTxChannelInstances() -{ - for(int i = 0; i < m_txChannelInstanceRegistrations.count(); i++) - { - m_txChannelInstanceRegistrations[i].m_channelSourceAPI->setName(QString("%1:%2").arg(m_txChannelInstanceRegistrations[i].m_channelName).arg(i)); + m_channelInstanceRegistrations[i].m_channelAPI->setName(QString("%1:%2").arg(m_channelInstanceRegistrations[i].m_channelName).arg(i)); } } // sort by increasing delta frequency and type (i.e. name) bool DeviceSet::ChannelInstanceRegistration::operator<(const ChannelInstanceRegistration& other) const { - if (m_channelSinkAPI && other.m_channelSinkAPI) + if (m_channelAPI && other.m_channelAPI) { - if (m_channelSinkAPI->getCenterFrequency() == other.m_channelSinkAPI->getCenterFrequency()) + if (m_channelAPI->getCenterFrequency() == other.m_channelAPI->getCenterFrequency()) { - return m_channelSinkAPI->getName() < other.m_channelSinkAPI->getName(); + return m_channelAPI->getName() < other.m_channelAPI->getName(); } else { - return m_channelSinkAPI->getCenterFrequency() < other.m_channelSinkAPI->getCenterFrequency(); - } - } - else if (m_channelSourceAPI && other.m_channelSourceAPI) - { - if (m_channelSourceAPI->getCenterFrequency() == other.m_channelSourceAPI->getCenterFrequency()) - { - return m_channelSourceAPI->getName() < other.m_channelSourceAPI->getName(); - } - else - { - return m_channelSourceAPI->getCenterFrequency() < other.m_channelSourceAPI->getCenterFrequency(); + return m_channelAPI->getCenterFrequency() < other.m_channelAPI->getCenterFrequency(); } } else diff --git a/sdrsrv/device/deviceset.h b/sdrsrv/device/deviceset.h index dab2524e8..f09d2511d 100644 --- a/sdrsrv/device/deviceset.h +++ b/sdrsrv/device/deviceset.h @@ -39,18 +39,18 @@ public: DeviceSet(int tabIndex); ~DeviceSet(); - int getNumberOfRxChannels() const { return m_rxChannelInstanceRegistrations.size(); } - int getNumberOfTxChannels() const { return m_txChannelInstanceRegistrations.size(); } + int getNumberOfChannels() const { return m_channelInstanceRegistrations.size(); } void addRxChannel(int selectedChannelIndex, PluginAPI *pluginAPI); void addTxChannel(int selectedChannelIndex, PluginAPI *pluginAPI); - void deleteRxChannel(int channelIndex); - void deleteTxChannel(int channelIndex); + void addMIMOChannel(int selectedChannelIndex, PluginAPI *pluginAPI); + void deleteChannel(int channelIndex); void registerRxChannelInstance(const QString& channelName, ChannelAPI* channelAPI); void registerTxChannelInstance(const QString& channelName, ChannelAPI* channelAPI); + void registerChannelInstance(const QString& channelName, ChannelAPI* channelAPI); void removeRxChannelInstance(ChannelAPI* channelAPI); void removeTxChannelInstance(ChannelAPI* channelAPI); - void freeRxChannels(); - void freeTxChannels(); + void removeChannelInstance(ChannelAPI* channelAPI); + void freeChannels(); void loadRxChannelSettings(const Preset* preset, PluginAPI *pluginAPI); void saveRxChannelSettings(Preset* preset); void loadTxChannelSettings(const Preset* preset, PluginAPI *pluginAPI); @@ -60,13 +60,11 @@ private: struct ChannelInstanceRegistration { QString m_channelName; - ChannelAPI *m_channelSinkAPI; - ChannelAPI *m_channelSourceAPI; + ChannelAPI *m_channelAPI; ChannelInstanceRegistration() : m_channelName(), - m_channelSinkAPI(nullptr), - m_channelSourceAPI(nullptr) + m_channelAPI(nullptr) { } ChannelInstanceRegistration(const QString& channelName, ChannelAPI* channelAPI); @@ -76,12 +74,10 @@ private: typedef QList ChannelInstanceRegistrations; - ChannelInstanceRegistrations m_rxChannelInstanceRegistrations; - ChannelInstanceRegistrations m_txChannelInstanceRegistrations; + ChannelInstanceRegistrations m_channelInstanceRegistrations; int m_deviceTabIndex; - void renameRxChannelInstances(); - void renameTxChannelInstances(); + void renameChannelInstances(); }; #endif /* SDRSRV_DEVICE_DEVICESET_H_ */ diff --git a/sdrsrv/maincore.cpp b/sdrsrv/maincore.cpp index ee19ee2ee..aefbfc3f3 100644 --- a/sdrsrv/maincore.cpp +++ b/sdrsrv/maincore.cpp @@ -365,7 +365,7 @@ void MainCore::removeLastDevice() lastDeviceEngine->stopAcquistion(); // deletes old UI and input object - m_deviceSets.back()->freeRxChannels(); // destroys the channel instances + m_deviceSets.back()->freeChannels(); // destroys the channel instances m_deviceSets.back()->m_deviceAPI->resetSamplingDeviceId(); m_deviceSets.back()->m_deviceAPI->getPluginInterface()->deleteSampleSourcePluginInstanceInput( m_deviceSets.back()->m_deviceAPI->getSampleSource()); @@ -385,7 +385,7 @@ void MainCore::removeLastDevice() lastDeviceEngine->stopGeneration(); // deletes old UI and output object - m_deviceSets.back()->freeTxChannels(); + m_deviceSets.back()->freeChannels(); m_deviceSets.back()->m_deviceAPI->resetSamplingDeviceId(); m_deviceSets.back()->m_deviceAPI->getPluginInterface()->deleteSampleSinkPluginInstanceOutput( m_deviceSets.back()->m_deviceAPI->getSampleSink()); @@ -561,15 +561,7 @@ void MainCore::deleteChannel(int deviceSetIndex, int channelIndex) if (deviceSetIndex >= 0) { DeviceSet *deviceSet = m_deviceSets[deviceSetIndex]; - - if (deviceSet->m_deviceSourceEngine) // source device => Rx channels - { - deviceSet->deleteRxChannel(channelIndex); - } - else if (deviceSet->m_deviceSinkEngine) // sink device => Tx channels - { - deviceSet->deleteTxChannel(channelIndex); - } + deviceSet->deleteChannel(channelIndex); } } diff --git a/sdrsrv/maincore.h b/sdrsrv/maincore.h index 9f6bd41e7..c043ad5b5 100644 --- a/sdrsrv/maincore.h +++ b/sdrsrv/maincore.h @@ -250,23 +250,20 @@ private: public: int getDeviceSetIndex() const { return m_deviceSetIndex; } int getChannelIndex() const { return m_channelIndex; } - bool isTx() const { return m_tx; } - static MsgDeleteChannel* create(int deviceSetIndex, int channelIndex, bool tx) + static MsgDeleteChannel* create(int deviceSetIndex, int channelIndex) { - return new MsgDeleteChannel(deviceSetIndex, channelIndex, tx); + return new MsgDeleteChannel(deviceSetIndex, channelIndex); } private: int m_deviceSetIndex; int m_channelIndex; - bool m_tx; - MsgDeleteChannel(int deviceSetIndex, int channelIndex, bool tx) : + MsgDeleteChannel(int deviceSetIndex, int channelIndex) : Message(), m_deviceSetIndex(deviceSetIndex), - m_channelIndex(channelIndex), - m_tx(tx) + m_channelIndex(channelIndex) { } }; diff --git a/sdrsrv/webapi/webapiadaptersrv.cpp b/sdrsrv/webapi/webapiadaptersrv.cpp index 9b2cbcae1..af1d36119 100644 --- a/sdrsrv/webapi/webapiadaptersrv.cpp +++ b/sdrsrv/webapi/webapiadaptersrv.cpp @@ -1733,53 +1733,23 @@ int WebAPIAdapterSrv::devicesetChannelDelete( { DeviceSet *deviceSet = m_mainCore.m_deviceSets[deviceSetIndex]; - if (deviceSet->m_deviceSourceEngine) // Rx + if (channelIndex < deviceSet->getNumberOfChannels()) { - if (channelIndex < deviceSet->getNumberOfRxChannels()) - { - MainCore::MsgDeleteChannel *msg = MainCore::MsgDeleteChannel::create(deviceSetIndex, channelIndex, false); - m_mainCore.m_inputMessageQueue.push(msg); + MainCore::MsgDeleteChannel *msg = MainCore::MsgDeleteChannel::create(deviceSetIndex, channelIndex); + m_mainCore.m_inputMessageQueue.push(msg); - response.init(); - *response.getMessage() = QString("Message to delete a channel (MsgDeleteChannel) was submitted successfully"); + response.init(); + *response.getMessage() = QString("Message to delete a channel (MsgDeleteChannel) was submitted successfully"); - return 202; - } - else - { - error.init(); - *error.getMessage() = QString("There is no channel at index %1. There are %2 Rx channels") - .arg(channelIndex) - .arg(channelIndex < deviceSet->getNumberOfRxChannels()); - return 400; - } - } - else if (deviceSet->m_deviceSinkEngine) // Tx - { - if (channelIndex < deviceSet->getNumberOfTxChannels()) - { - MainCore::MsgDeleteChannel *msg = MainCore::MsgDeleteChannel::create(deviceSetIndex, channelIndex, true); - m_mainCore.m_inputMessageQueue.push(msg); - - response.init(); - *response.getMessage() = QString("Message to delete a channel (MsgDeleteChannel) was submitted successfully"); - - return 202; - } - else - { - error.init(); - *error.getMessage() = QString("There is no channel at index %1. There are %2 Tx channels") - .arg(channelIndex) - .arg(channelIndex < deviceSet->getNumberOfRxChannels()); - return 400; - } + return 202; } else { error.init(); - *error.getMessage() = QString("DeviceSet error"); - return 500; + *error.getMessage() = QString("There is no channel at index %1. There are %2 channels") + .arg(channelIndex) + .arg(channelIndex < deviceSet->getNumberOfChannels()); + return 400; } } else