From 8b056708142b0b3b93d6a1f49999775f271372c4 Mon Sep 17 00:00:00 2001 From: f4exb Date: Fri, 16 Oct 2020 08:35:06 +0200 Subject: [PATCH] MainCore: added feature and channel maps. FeatureSet and FeatureUISet: simplify feature registrations. Channel and feature names fix --- plugins/channeltx/localsource/localsource.cpp | 2 +- sdrbase/device/deviceset.cpp | 54 ++++++-- sdrbase/device/deviceset.h | 1 + sdrbase/feature/feature.h | 3 + sdrbase/feature/featureset.cpp | 70 +++++++---- sdrbase/feature/featureset.h | 24 +--- sdrbase/maincore.cpp | 118 +++++++++++++++++- sdrbase/maincore.h | 19 +++ sdrgui/feature/featureuiset.cpp | 18 +-- sdrgui/feature/featureuiset.h | 7 +- sdrgui/mainwindow.cpp | 2 +- 11 files changed, 243 insertions(+), 75 deletions(-) diff --git a/plugins/channeltx/localsource/localsource.cpp b/plugins/channeltx/localsource/localsource.cpp index bfdb7e83e..8ef035656 100644 --- a/plugins/channeltx/localsource/localsource.cpp +++ b/plugins/channeltx/localsource/localsource.cpp @@ -513,4 +513,4 @@ void LocalSource::networkManagerFinished(QNetworkReply *reply) uint32_t LocalSource::getNumberOfDeviceStreams() const { return m_deviceAPI->getNbSinkStreams(); -} \ No newline at end of file +} diff --git a/sdrbase/device/deviceset.cpp b/sdrbase/device/deviceset.cpp index c8a7aa6f3..064f6a8e4 100644 --- a/sdrbase/device/deviceset.cpp +++ b/sdrbase/device/deviceset.cpp @@ -25,6 +25,7 @@ #include "channel/channelapi.h" #include "channel/channelutils.h" #include "settings/preset.h" +#include "maincore.h" #include "deviceset.h" @@ -51,6 +52,8 @@ void DeviceSet::freeChannels() qDebug("DeviceSet::freeChannels: destroying channel [%s]", qPrintable(m_channelInstanceRegistrations[i]->getURI())); m_channelInstanceRegistrations[i]->destroy(); } + + MainCore::instance()->clearChannels(this); } const ChannelAPI *DeviceSet::getChannelAt(int channelIndex) const @@ -77,6 +80,7 @@ void DeviceSet::deleteChannel(int channelIndex) { m_channelInstanceRegistrations[channelIndex]->destroy(); m_channelInstanceRegistrations.removeAt(channelIndex); + MainCore::instance()->removeChannelInstanceAt(this, channelIndex); renameChannelInstances(); } } @@ -86,8 +90,10 @@ void DeviceSet::addRxChannel(int selectedChannelIndex, PluginAPI *pluginAPI) PluginAPI::ChannelRegistrations *channelRegistrations = pluginAPI->getRxChannelRegistrations(); // Available channel plugins ChannelAPI *rxChannel; (*channelRegistrations)[selectedChannelIndex].m_plugin->createRxChannel(m_deviceAPI, nullptr, &rxChannel); - ChannelAPI *reg = rxChannel; - m_channelInstanceRegistrations.append(reg); + ChannelAPI *channelAPI = rxChannel; + m_channelInstanceRegistrations.append(channelAPI); + MainCore::instance()->addChannelInstance(this, channelAPI); + renameChannelInstances(); qDebug("DeviceSet::addRxChannel: %s", qPrintable(rxChannel->getName())); } @@ -96,8 +102,10 @@ void DeviceSet::addTxChannel(int selectedChannelIndex, PluginAPI *pluginAPI) PluginAPI::ChannelRegistrations *channelRegistrations = pluginAPI->getTxChannelRegistrations(); // Available channel plugins ChannelAPI *txChannel; (*channelRegistrations)[selectedChannelIndex].m_plugin->createTxChannel(m_deviceAPI, nullptr, &txChannel); - ChannelAPI *reg = txChannel; - m_channelInstanceRegistrations.append(reg); + ChannelAPI *channelAPI = txChannel; + m_channelInstanceRegistrations.append(channelAPI); + MainCore::instance()->addChannelInstance(this, channelAPI); + renameChannelInstances(); qDebug("DeviceSet::addTxChannel: %s", qPrintable(txChannel->getName())); } @@ -106,8 +114,10 @@ void DeviceSet::addMIMOChannel(int selectedChannelIndex, PluginAPI *pluginAPI) PluginAPI::ChannelRegistrations *channelRegistrations = pluginAPI->getMIMOChannelRegistrations(); // Available channel plugins ChannelAPI *mimoChannel; (*channelRegistrations)[selectedChannelIndex].m_plugin->createMIMOChannel(m_deviceAPI, nullptr, &mimoChannel); - ChannelAPI *reg = mimoChannel; - m_channelInstanceRegistrations.append(reg); + ChannelAPI *channelAPI = mimoChannel; + m_channelInstanceRegistrations.append(channelAPI); + MainCore::instance()->addChannelInstance(this, channelAPI); + renameChannelInstances(); qDebug("DeviceSet::addMIMOChannel: %s", qPrintable(mimoChannel->getName())); } @@ -115,6 +125,7 @@ void DeviceSet::loadRxChannelSettings(const Preset *preset, PluginAPI *pluginAPI { if (preset->isSourcePreset()) { + MainCore *mainCore = MainCore::instance(); qDebug("DeviceSet::loadChannelSettings: Loading preset [%s | %s]", qPrintable(preset->getGroup()), qPrintable(preset->getDescription())); // Available channel plugins @@ -123,6 +134,7 @@ void DeviceSet::loadRxChannelSettings(const Preset *preset, PluginAPI *pluginAPI // copy currently open channels and clear list ChannelInstanceRegistrations openChannels = m_channelInstanceRegistrations; m_channelInstanceRegistrations.clear(); + mainCore->clearChannels(this); qDebug("DeviceSet::loadChannelSettings: %d channel(s) in preset", preset->getChannelCount()); @@ -144,6 +156,7 @@ void DeviceSet::loadRxChannelSettings(const Preset *preset, PluginAPI *pluginAPI qDebug("DeviceSet::loadChannelSettings: channel [%s] found", qPrintable(openChannels[i]->getURI())); channelAPI = openChannels.takeAt(i); m_channelInstanceRegistrations.append(channelAPI); + mainCore->addChannelInstance(this, channelAPI); break; } } @@ -164,6 +177,7 @@ void DeviceSet::loadRxChannelSettings(const Preset *preset, PluginAPI *pluginAPI (*channelRegistrations)[i].m_plugin->createRxChannel(m_deviceAPI, nullptr, &rxChannel); channelAPI = rxChannel; m_channelInstanceRegistrations.append(channelAPI); + mainCore->addChannelInstance(this, channelAPI); break; } } @@ -214,6 +228,7 @@ void DeviceSet::loadTxChannelSettings(const Preset *preset, PluginAPI *pluginAPI { if (preset->isSinkPreset()) { + MainCore *mainCore = MainCore::instance(); qDebug("DeviceSet::loadTxChannelSettings: Loading preset [%s | %s]", qPrintable(preset->getGroup()), qPrintable(preset->getDescription())); // Available channel plugins @@ -222,6 +237,7 @@ void DeviceSet::loadTxChannelSettings(const Preset *preset, PluginAPI *pluginAPI // copy currently open channels and clear list ChannelInstanceRegistrations openChannels = m_channelInstanceRegistrations; m_channelInstanceRegistrations.clear(); + mainCore->clearChannels(this); qDebug("DeviceSet::loadTxChannelSettings: %d channel(s) in preset", preset->getChannelCount()); @@ -242,6 +258,7 @@ void DeviceSet::loadTxChannelSettings(const Preset *preset, PluginAPI *pluginAPI qDebug("DeviceSet::loadTxChannelSettings: channel [%s] found", qPrintable(openChannels[i]->getURI())); channelAPI = openChannels.takeAt(i); m_channelInstanceRegistrations.append(channelAPI); + mainCore->addChannelInstance(this, channelAPI); break; } } @@ -259,6 +276,7 @@ void DeviceSet::loadTxChannelSettings(const Preset *preset, PluginAPI *pluginAPI (*channelRegistrations)[i].m_plugin->createTxChannel(m_deviceAPI, nullptr, &txChannel); channelAPI = txChannel; m_channelInstanceRegistrations.append(channelAPI); + mainCore->addChannelInstance(this, channelAPI); break; } } @@ -311,6 +329,7 @@ void DeviceSet::loadMIMOChannelSettings(const Preset *preset, PluginAPI *pluginA { if (preset->isMIMOPreset()) { + MainCore *mainCore = MainCore::instance(); qDebug("DeviceSet::loadMIMOChannelSettings: Loading preset [%s | %s]", qPrintable(preset->getGroup()), qPrintable(preset->getDescription())); // Available channel plugins @@ -319,6 +338,7 @@ void DeviceSet::loadMIMOChannelSettings(const Preset *preset, PluginAPI *pluginA // copy currently open channels and clear list ChannelInstanceRegistrations openChannels = m_channelInstanceRegistrations; m_channelInstanceRegistrations.clear(); + mainCore->clearChannels(this); qDebug("DeviceSet::loadMIMOChannelSettings: %d channel(s) in preset", preset->getChannelCount()); @@ -340,6 +360,7 @@ void DeviceSet::loadMIMOChannelSettings(const Preset *preset, PluginAPI *pluginA qDebug("DeviceSet::loadMIMOChannelSettings: channel [%s] found", qPrintable(openChannels[i]->getURI())); channelAPI = openChannels.takeAt(i); m_channelInstanceRegistrations.append(channelAPI); + mainCore->addChannelInstance(this, channelAPI); break; } } @@ -360,6 +381,7 @@ void DeviceSet::loadMIMOChannelSettings(const Preset *preset, PluginAPI *pluginA (*channelRegistrations)[i].m_plugin->createMIMOChannel(m_deviceAPI, nullptr, &mimoChannel); channelAPI = mimoChannel; m_channelInstanceRegistrations.append(channelAPI); + mainCore->addChannelInstance(this, channelAPI); break; } } @@ -408,8 +430,10 @@ void DeviceSet::saveMIMOChannelSettings(Preset *preset) void DeviceSet::renameChannelInstances() { - for (int i = 0; i < m_channelInstanceRegistrations.count(); i++) { + for (int i = 0; i < m_channelInstanceRegistrations.count(); i++) + { m_channelInstanceRegistrations[i]->setName(QString("%1:%2").arg(m_channelInstanceRegistrations[i]->getURI()).arg(i)); + m_channelInstanceRegistrations[i]->setIndexInDeviceSet(i); } } @@ -432,29 +456,43 @@ bool DeviceSet::compareChannels(const ChannelAPI *channelA, const ChannelAPI *ch void DeviceSet::addChannelInstance(ChannelAPI *channelAPI) { + MainCore *mainCore = MainCore::instance(); m_channelInstanceRegistrations.append(channelAPI); + mainCore->addChannelInstance(this, channelAPI); + renameChannelInstances(); } void DeviceSet::removeChannelInstanceAt(int index) { - if (index < m_channelInstanceRegistrations.size()) { + if (index < m_channelInstanceRegistrations.size()) + { + MainCore *mainCore = MainCore::instance(); m_channelInstanceRegistrations.removeAt(index); + mainCore->removeChannelInstanceAt(this, index); + renameChannelInstances(); } } void DeviceSet::removeChannelInstance(ChannelAPI *channelAPI) { + MainCore *mainCore = MainCore::instance(); + for (int i = 0; i < m_channelInstanceRegistrations.count(); i++) { if (m_channelInstanceRegistrations.at(i) == channelAPI) { m_channelInstanceRegistrations.removeAt(i); + mainCore->removeChannelInstance(channelAPI); break; } } + + renameChannelInstances(); } void DeviceSet::clearChannels() { + MainCore *mainCore = MainCore::instance(); m_channelInstanceRegistrations.clear(); + mainCore->clearChannels(this); } diff --git a/sdrbase/device/deviceset.h b/sdrbase/device/deviceset.h index 377f45bfa..8276450a4 100644 --- a/sdrbase/device/deviceset.h +++ b/sdrbase/device/deviceset.h @@ -42,6 +42,7 @@ public: ~DeviceSet(); int getNumberOfChannels() const { return m_channelInstanceRegistrations.size(); } + int getIndex() const { return m_deviceTabIndex; } void freeChannels(); const ChannelAPI *getChannelAt(int channelIndex) const; ChannelAPI *getChannelAt(int channelIndex); diff --git a/sdrbase/feature/feature.h b/sdrbase/feature/feature.h index 62ce0e5a4..f41b79e21 100644 --- a/sdrbase/feature/feature.h +++ b/sdrbase/feature/feature.h @@ -132,6 +132,8 @@ public: errorMessage = "Not implemented"; return 501; } + int getIndexInFeatureSet() const { return m_indexInFeatureSet; } + void setIndexInFeatureSet(int indexInFeatureSet) { m_indexInFeatureSet = indexInFeatureSet; } uint64_t getUID() const { return m_uid; } FeatureState getState() const { return m_state; } const QString& getErrorMessage() const { return m_errorMessage; } @@ -155,6 +157,7 @@ protected slots: private: QString m_name; uint64_t m_uid; + int m_indexInFeatureSet; }; #endif // SDRBASE_FETURE_FEATUREAPI_H_ diff --git a/sdrbase/feature/featureset.cpp b/sdrbase/feature/featureset.cpp index e009df34e..636f24d1f 100644 --- a/sdrbase/feature/featureset.cpp +++ b/sdrbase/feature/featureset.cpp @@ -21,6 +21,7 @@ #include "feature/feature.h" #include "feature/featureutils.h" #include "settings/featuresetpreset.h" +#include "maincore.h" #include "featureset.h" @@ -39,7 +40,8 @@ void FeatureSet::addFeature(int selectedFeatureIndex, PluginAPI *pluginAPI, WebA Feature *feature = featureRegistrations->at(selectedFeatureIndex).m_plugin->createFeature(apiAdapter); QString featureName; feature->getIdentifier(featureName); - m_featureInstanceRegistrations.append(FeatureInstanceRegistration(featureName, feature)); + m_featureInstanceRegistrations.append(feature); + MainCore::instance()->addFeatureInstance(this, feature); renameFeatureInstances(); } @@ -47,9 +49,11 @@ void FeatureSet::removeFeatureInstance(Feature* feature) { for (FeatureInstanceRegistrations::iterator it = m_featureInstanceRegistrations.begin(); it != m_featureInstanceRegistrations.end(); ++it) { - if (it->m_feature == feature) + if (*it == feature) { m_featureInstanceRegistrations.erase(it); + feature->setIndexInFeatureSet(-1); + MainCore::instance()->removeFeatureInstance(feature); break; } } @@ -59,16 +63,18 @@ void FeatureSet::removeFeatureInstance(Feature* feature) void FeatureSet::renameFeatureInstances() { - for (int i = 0; i < m_featureInstanceRegistrations.count(); i++) { - m_featureInstanceRegistrations[i].m_feature->setName(QString("%1:%2").arg(m_featureInstanceRegistrations[i].m_featureName).arg(i)); + for (int i = 0; i < m_featureInstanceRegistrations.count(); i++) + { + m_featureInstanceRegistrations[i]->setName(QString("%1:%2").arg(m_featureInstanceRegistrations[i]->getURI()).arg(i)); + m_featureInstanceRegistrations[i]->setIndexInFeatureSet(i); } } // sort by name -bool FeatureSet::FeatureInstanceRegistration::operator<(const FeatureInstanceRegistration& other) const +bool FeatureSet::compareFeatures(Feature *featureA, Feature *featureB) { - if (m_feature && other.m_feature) { - return m_feature->getName() < other.m_feature->getName(); + if (featureA && featureB) { + return featureA->getName() < featureB->getName(); } else { return false; } @@ -78,9 +84,11 @@ void FeatureSet::freeFeatures() { for(int i = 0; i < m_featureInstanceRegistrations.count(); i++) { - qDebug("FeatureSet::freeFeatures: destroying feature [%s]", qPrintable(m_featureInstanceRegistrations[i].m_featureName)); - m_featureInstanceRegistrations[i].m_feature->destroy(); + qDebug("FeatureSet::freeFeatures: destroying feature [%s]", qPrintable(m_featureInstanceRegistrations[i]->getURI())); + m_featureInstanceRegistrations[i]->destroy(); } + + MainCore::instance()->clearFeatures(this); } void FeatureSet::deleteFeature(int featureIndex) @@ -88,10 +96,11 @@ void FeatureSet::deleteFeature(int featureIndex) if ((featureIndex >= 0) && (featureIndex < m_featureInstanceRegistrations.count())) { qDebug("FeatureSet::deleteFeature: delete feature [%s] at %d", - qPrintable(m_featureInstanceRegistrations[featureIndex].m_featureName), + qPrintable(m_featureInstanceRegistrations[featureIndex]->getURI()), featureIndex); - m_featureInstanceRegistrations[featureIndex].m_feature->destroy(); + m_featureInstanceRegistrations[featureIndex]->destroy(); m_featureInstanceRegistrations.removeAt(featureIndex); + MainCore::instance()->removeFeatureInstanceAt(this, featureIndex); renameFeatureInstances(); } } @@ -99,7 +108,7 @@ void FeatureSet::deleteFeature(int featureIndex) const Feature *FeatureSet::getFeatureAt(int featureIndex) const { if ((featureIndex >= 0) && (featureIndex < m_featureInstanceRegistrations.count())) { - return m_featureInstanceRegistrations[featureIndex].m_feature; + return m_featureInstanceRegistrations[featureIndex]; } else{ return nullptr; } @@ -108,7 +117,7 @@ const Feature *FeatureSet::getFeatureAt(int featureIndex) const Feature *FeatureSet::getFeatureAt(int featureIndex) { if ((featureIndex >= 0) && (featureIndex < m_featureInstanceRegistrations.count())) { - return m_featureInstanceRegistrations[featureIndex].m_feature; + return m_featureInstanceRegistrations[featureIndex]; } else{ return nullptr; } @@ -116,6 +125,7 @@ Feature *FeatureSet::getFeatureAt(int featureIndex) void FeatureSet::loadFeatureSetSettings(const FeatureSetPreset *preset, PluginAPI *pluginAPI, WebAPIAdapterInterface *apiAdapter) { + MainCore *mainCore = MainCore::instance(); qDebug("FeatureSet::loadFeatureSetSettings: Loading preset [%s | %s]", qPrintable(preset->getGroup()), qPrintable(preset->getDescription())); // Available feature plugins @@ -124,11 +134,12 @@ void FeatureSet::loadFeatureSetSettings(const FeatureSetPreset *preset, PluginAP // copy currently open features and clear list FeatureInstanceRegistrations openFeatures = m_featureInstanceRegistrations; m_featureInstanceRegistrations.clear(); + mainCore->clearFeatures(this); for (int i = 0; i < openFeatures.count(); i++) { - qDebug("FeatureSet::loadFeatureSetSettings: destroying old feature [%s]", qPrintable(openFeatures[i].m_featureName)); - openFeatures[i].m_feature->destroy(); + qDebug("FeatureSet::loadFeatureSetSettings: destroying old feature [%s]", qPrintable(openFeatures[i]->getURI())); + openFeatures[i]->destroy(); } qDebug("FeatureSet::loadFeatureSetSettings: %d feature(s) in preset", preset->getFeatureCount()); @@ -136,7 +147,7 @@ void FeatureSet::loadFeatureSetSettings(const FeatureSetPreset *preset, PluginAP for (int i = 0; i < preset->getFeatureCount(); i++) { const FeatureSetPreset::FeatureConfig& featureConfig = preset->getFeatureConfig(i); - FeatureInstanceRegistration reg; + Feature* reg = nullptr; // create feature instance @@ -149,15 +160,17 @@ void FeatureSet::loadFeatureSetSettings(const FeatureSetPreset *preset, PluginAP qPrintable(featureConfig.m_featureIdURI)); Feature *feature = (*featureRegistrations)[i].m_plugin->createFeature(apiAdapter); - reg = FeatureInstanceRegistration(featureConfig.m_featureIdURI, feature); + reg = feature; + m_featureInstanceRegistrations.append(feature); + mainCore->addFeatureInstance(this, feature); break; } } - if (reg.m_feature) + if (reg) { qDebug("FeatureSet::loadFeatureSetSettings: deserializing feature [%s]", qPrintable(featureConfig.m_featureIdURI)); - reg.m_feature->deserialize(featureConfig.m_config); + reg->deserialize(featureConfig.m_config); } } @@ -166,29 +179,34 @@ void FeatureSet::loadFeatureSetSettings(const FeatureSetPreset *preset, PluginAP void FeatureSet::saveFeatureSetSettings(FeatureSetPreset *preset) { - std::sort(m_featureInstanceRegistrations.begin(), m_featureInstanceRegistrations.end()); // sort by increasing delta frequency and type + std::sort(m_featureInstanceRegistrations.begin(), m_featureInstanceRegistrations.end(), compareFeatures); for (int i = 0; i < m_featureInstanceRegistrations.count(); i++) { - qDebug("FeatureSet::saveFeatureSetSettings: saving feature [%s]", qPrintable(m_featureInstanceRegistrations[i].m_featureName)); - preset->addFeature(m_featureInstanceRegistrations[i].m_featureName, m_featureInstanceRegistrations[i].m_feature->serialize()); + qDebug("FeatureSet::saveFeatureSetSettings: saving feature [%s]", qPrintable(m_featureInstanceRegistrations[i]->getURI())); + preset->addFeature(m_featureInstanceRegistrations[i]->getURI(), m_featureInstanceRegistrations[i]->serialize()); } } -void FeatureSet::addFeatureInstance(const QString& featureURI, Feature *feature) +void FeatureSet::addFeatureInstance(Feature *feature) { - qDebug("FeatureSet::addFeatureInstance"); - m_featureInstanceRegistrations.push_back(FeatureInstanceRegistration(featureURI, feature)); + m_featureInstanceRegistrations.push_back(feature); + renameFeatureInstances(); + MainCore::instance()->addFeatureInstance(this, feature); } void FeatureSet::removeFeatureInstanceAt(int index) { - if (index < m_featureInstanceRegistrations.size()) { + if (index < m_featureInstanceRegistrations.size()) + { m_featureInstanceRegistrations.removeAt(index); + renameFeatureInstances(); + MainCore::instance()->removeFeatureInstanceAt(this, index); } } void FeatureSet::clearFeatures() { m_featureInstanceRegistrations.clear(); + MainCore::instance()->clearFeatures(this); } diff --git a/sdrbase/feature/featureset.h b/sdrbase/feature/featureset.h index 4336b4426..c5ea50421 100644 --- a/sdrbase/feature/featureset.h +++ b/sdrbase/feature/featureset.h @@ -35,6 +35,7 @@ public: ~FeatureSet(); int getNumberOfFeatures() const { return m_featureInstanceRegistrations.size(); } + int getIndex() const { return m_featureTabIndex; } void addFeature(int selectedFeatureIndex, PluginAPI *pluginAPI, WebAPIAdapterInterface *apiAdapter); void removeFeatureInstance(Feature* feature); void freeFeatures(); @@ -44,35 +45,18 @@ public: void loadFeatureSetSettings(const FeatureSetPreset* preset, PluginAPI *pluginAPI, WebAPIAdapterInterface *apiAdapter); void saveFeatureSetSettings(FeatureSetPreset* preset); // slave mode - void addFeatureInstance(const QString& featureURI, Feature *feature); + void addFeatureInstance(Feature *feature); void removeFeatureInstanceAt(int index); void clearFeatures(); private: - struct FeatureInstanceRegistration - { - QString m_featureName; - Feature* m_feature; - - FeatureInstanceRegistration() : - m_featureName(), - m_feature(nullptr) - { } - - FeatureInstanceRegistration(const QString& featureName, Feature *feature) : - m_featureName(featureName), - m_feature(feature) - { } - - bool operator<(const FeatureInstanceRegistration& other) const; - }; - - typedef QList FeatureInstanceRegistrations; + typedef QList FeatureInstanceRegistrations; FeatureInstanceRegistrations m_featureInstanceRegistrations; int m_featureTabIndex; void renameFeatureInstances(); + static bool compareFeatures(Feature *featureA, Feature *featureB); }; #endif // SDRBASE_FEATURE_FEATURESET_H_ diff --git a/sdrbase/maincore.cpp b/sdrbase/maincore.cpp index 4ab638ea9..be6186d79 100644 --- a/sdrbase/maincore.cpp +++ b/sdrbase/maincore.cpp @@ -22,7 +22,9 @@ #include "loggerwithfile.h" #include "dsp/dsptypes.h" #include "feature/featureset.h" +#include "feature/feature.h" #include "device/deviceset.h" +#include "channel/channelapi.h" #include "maincore.h" @@ -129,19 +131,27 @@ Feature *MainCore::getFeature(int featureSetIndex, int featureIndex) void MainCore::appendFeatureSet() { int newIndex = m_featureSets.size(); - m_featureSets.push_back(new FeatureSet(newIndex)); + FeatureSet *featureSet = new FeatureSet(newIndex); + m_featureSets.push_back(featureSet); + m_featureSetsMap.insert(featureSet, newIndex); } void MainCore::removeFeatureSet(int index) { - if (index < m_featureSets.size()) { + if (index < m_featureSets.size()) + { + FeatureSet *featureSet = m_featureSets[index]; + m_featureSetsMap.remove(featureSet); m_featureSets.erase(m_featureSets.begin() + index); } } void MainCore::removeLastFeatureSet() { - if (m_featureSets.size() != 0) { + if (m_featureSets.size() != 0) + { + FeatureSet *featureSet = m_featureSets.back(); + m_featureSetsMap.remove(featureSet); m_featureSets.pop_back(); } } @@ -149,12 +159,110 @@ void MainCore::removeLastFeatureSet() void MainCore::appendDeviceSet(int deviceType) { int newIndex = m_deviceSets.size(); - m_deviceSets.push_back(new DeviceSet(newIndex, deviceType)); + DeviceSet *deviceSet = new DeviceSet(newIndex, deviceType); + m_deviceSets.push_back(deviceSet); + m_deviceSetsMap.insert(deviceSet, newIndex); } void MainCore::removeLastDeviceSet() { - if (m_deviceSets.size() != 0) { + if (m_deviceSets.size() != 0) + { + DeviceSet *deviceSet = m_deviceSets.back(); + m_deviceSetsMap.remove(deviceSet); m_deviceSets.pop_back(); } } + +void MainCore::addChannelInstance(DeviceSet *deviceSet, ChannelAPI *channelAPI) +{ + m_channelsMap.insert(channelAPI, deviceSet); + // debugMaps(); +} + +void MainCore::removeChannelInstanceAt(DeviceSet *deviceSet, int channelIndex) +{ + int deviceSetIndex = m_deviceSetsMap[deviceSet]; + ChannelAPI *channelAPI = m_deviceSets[deviceSetIndex]->getChannelAt(channelIndex); + + if (channelAPI) { + m_channelsMap.remove(channelAPI); + } +} + +void MainCore::removeChannelInstance(ChannelAPI *channelAPI) +{ + if (channelAPI) { + m_channelsMap.remove(channelAPI); + } +} + +void MainCore::clearChannels(DeviceSet *deviceSet) +{ + for (int i = 0; i < deviceSet->getNumberOfChannels(); i++) + { + ChannelAPI *channelAPI = deviceSet->getChannelAt(i); + m_channelsMap.remove(channelAPI); + } +} + +void MainCore::addFeatureInstance(FeatureSet *featureSet, Feature *feature) +{ + m_featuresMap.insert(feature, featureSet); + // debugMaps(); +} + +void MainCore::removeFeatureInstanceAt(FeatureSet *featureSet, int featureIndex) +{ + int featureSetIndex = m_featureSetsMap[featureSet]; + Feature *feature = m_featureSets[featureSetIndex]->getFeatureAt(featureIndex); + + if (feature) { + m_featuresMap.remove(feature); + } +} + +void MainCore::removeFeatureInstance(Feature *feature) +{ + if (feature) { + m_featuresMap.remove(feature); + } +} + +void MainCore::clearFeatures(FeatureSet *featureSet) +{ + for (int i = 0; i < featureSet->getNumberOfFeatures(); i++) + { + Feature *feature = featureSet->getFeatureAt(i); + m_featuresMap.remove(feature); + } +} + +void MainCore::debugMaps() +{ + QMap::const_iterator dsIt = m_deviceSetsMap.begin(); + + for (; dsIt != m_deviceSetsMap.end(); ++dsIt) { + qDebug("MainCore::debugMaps: device set %d #%d", dsIt.key()->getIndex(), dsIt.value()); + } + + QMap::const_iterator fsIt = m_featureSetsMap.begin(); + + for (; fsIt != m_featureSetsMap.end(); ++fsIt) { + qDebug("MainCore::debugMaps: feature set %d #%d", fsIt.key()->getIndex(), fsIt.value()); + } + + QMap::const_iterator chIt = m_channelsMap.begin(); + + for (; chIt != m_channelsMap.end(); ++chIt) { + qDebug("MainCore::debugMaps: channel ds: %d - %d: %s %s", + chIt.value()->getIndex(), chIt.key()->getIndexInDeviceSet(), qPrintable(chIt.key()->getURI()), qPrintable(chIt.key()->getName())); + } + + QMap::const_iterator feIt = m_featuresMap.begin(); + + for (; feIt != m_featuresMap.end(); ++feIt) { + qDebug("MainCore::debugMaps: feature fs: %d - %d: %s %s", + feIt.value()->getIndex(), feIt.key()->getIndexInFeatureSet(), qPrintable(feIt.key()->getURI()), qPrintable(feIt.key()->getName())); + } +} diff --git a/sdrbase/maincore.h b/sdrbase/maincore.h index 46bd6cc36..5c9011566 100644 --- a/sdrbase/maincore.h +++ b/sdrbase/maincore.h @@ -20,6 +20,7 @@ #include +#include #include #include "export.h" @@ -414,12 +415,24 @@ public: void setLoggingOptions(); ChannelAPI *getChannel(int deviceSetIndex, int channelIndex); Feature *getFeature(int featureSetIndex, int featureIndex); + bool existsChannel(ChannelAPI *channel) const { return m_channelsMap.contains(channel); } + bool existsFeature(Feature *feature) const { return m_featuresMap.contains(feature); } // slave mode void appendFeatureSet(); void removeFeatureSet(int index); void removeLastFeatureSet(); void appendDeviceSet(int deviceType); void removeLastDeviceSet(); + // slave mode - channels + void addChannelInstance(DeviceSet *deviceSet, ChannelAPI *channelAPI); + void removeChannelInstanceAt(DeviceSet *deviceSet, int channelIndex); + void removeChannelInstance(ChannelAPI *channelAPI); + void clearChannels(DeviceSet *deviceSet); + // slave mode - features + void addFeatureInstance(FeatureSet *featureSet, Feature *feature); + void removeFeatureInstanceAt(FeatureSet *featureSet, int featureIndex); + void removeFeatureInstance(Feature *feature); + void clearFeatures(FeatureSet *featureSet); friend class MainServer; friend class MainWindow; @@ -433,7 +446,13 @@ private: QTimer m_masterTimer; std::vector m_deviceSets; std::vector m_featureSets; + QMap m_deviceSetsMap; //!< Device set instance to device set index map + QMap m_featureSetsMap; //!< Feature set instance to feature set index map + QMap m_channelsMap; //!< Channel to device set map + QMap m_featuresMap; //!< Feature to feature set map PluginManager* m_pluginManager; + + void debugMaps(); }; #endif // SDRBASE_MAINCORE_H_ diff --git a/sdrgui/feature/featureuiset.cpp b/sdrgui/feature/featureuiset.cpp index 048375b1e..40b676a86 100644 --- a/sdrgui/feature/featureuiset.cpp +++ b/sdrgui/feature/featureuiset.cpp @@ -43,10 +43,10 @@ void FeatureUISet::addRollupWidget(QWidget *widget) m_featureWindow->addRollupWidget(widget); } -void FeatureUISet::registerFeatureInstance(const QString& featureURI, FeatureGUI* featureGUI, Feature *feature) +void FeatureUISet::registerFeatureInstance(FeatureGUI* featureGUI, Feature *feature) { - m_featureInstanceRegistrations.append(FeatureInstanceRegistration(featureURI, featureGUI, feature)); - m_featureSet->addFeatureInstance(featureURI, feature); + m_featureInstanceRegistrations.append(FeatureInstanceRegistration(featureGUI, feature)); + m_featureSet->addFeatureInstance(feature); QObject::connect( featureGUI, &FeatureGUI::closing, @@ -70,7 +70,7 @@ void FeatureUISet::freeFeatures() { for(int i = 0; i < m_featureInstanceRegistrations.count(); i++) { - qDebug("FeatureUISet::freeFeatures: destroying feature [%s]", qPrintable(m_featureInstanceRegistrations[i].m_featureURI)); + qDebug("FeatureUISet::freeFeatures: destroying feature [%s]", qPrintable(m_featureInstanceRegistrations[i].m_feature->getURI())); m_featureInstanceRegistrations[i].m_gui->destroy(); m_featureInstanceRegistrations[i].m_feature->destroy(); } @@ -83,7 +83,7 @@ void FeatureUISet::deleteFeature(int featureIndex) if ((featureIndex >= 0) && (featureIndex < m_featureInstanceRegistrations.count())) { qDebug("FeatureUISet::deleteFeature: delete feature [%s] at %d", - qPrintable(m_featureInstanceRegistrations[featureIndex].m_featureURI), + qPrintable(m_featureInstanceRegistrations[featureIndex].m_feature->getURI()), featureIndex); m_featureInstanceRegistrations[featureIndex].m_gui->destroy(); m_featureInstanceRegistrations[featureIndex].m_feature->destroy(); @@ -123,7 +123,7 @@ void FeatureUISet::loadFeatureSetSettings(const FeatureSetPreset *preset, Plugin for (int i = 0; i < openFeatures.count(); i++) { - qDebug("FeatureUISet::loadFeatureSetSettings: destroying old feature [%s]", qPrintable(openFeatures[i].m_featureURI)); + qDebug("FeatureUISet::loadFeatureSetSettings: destroying old feature [%s]", qPrintable(openFeatures[i].m_feature->getURI())); openFeatures[i].m_gui->destroy(); openFeatures[i].m_feature->destroy(); } @@ -148,7 +148,7 @@ void FeatureUISet::loadFeatureSetSettings(const FeatureSetPreset *preset, Plugin (*featureRegistrations)[i].m_plugin->createFeature(apiAdapter); featureGUI = (*featureRegistrations)[i].m_plugin->createFeatureGUI(this, feature); - registerFeatureInstance(feature->getURI(), featureGUI, feature); + registerFeatureInstance(featureGUI, feature); break; } } @@ -167,8 +167,8 @@ void FeatureUISet::saveFeatureSetSettings(FeatureSetPreset *preset) for (int i = 0; i < m_featureInstanceRegistrations.count(); i++) { - qDebug("FeatureUISet::saveFeatureSetSettings: saving feature [%s]", qPrintable(m_featureInstanceRegistrations[i].m_featureURI)); - preset->addFeature(m_featureInstanceRegistrations[i].m_featureURI, m_featureInstanceRegistrations[i].m_gui->serialize()); + qDebug("FeatureUISet::saveFeatureSetSettings: saving feature [%s]", qPrintable(m_featureInstanceRegistrations[i].m_feature->getURI())); + preset->addFeature(m_featureInstanceRegistrations[i].m_feature->getURI(), m_featureInstanceRegistrations[i].m_gui->serialize()); } } diff --git a/sdrgui/feature/featureuiset.h b/sdrgui/feature/featureuiset.h index 96e92f672..af9aa9c5c 100644 --- a/sdrgui/feature/featureuiset.h +++ b/sdrgui/feature/featureuiset.h @@ -42,7 +42,7 @@ public: void addRollupWidget(QWidget *widget); //!< Add feature rollup widget to feature window int getNumberOfFeatures() const { return m_featureInstanceRegistrations.size(); } - void registerFeatureInstance(const QString& featureURI, FeatureGUI* featureGUI, Feature *feature); + void registerFeatureInstance(FeatureGUI* featureGUI, Feature *feature); void deleteFeature(int featureIndex); const Feature *getFeatureAt(int featureIndex) const; Feature *getFeatureAt(int featureIndex); @@ -54,18 +54,15 @@ public: private: struct FeatureInstanceRegistration { - QString m_featureURI; FeatureGUI* m_gui; Feature* m_feature; FeatureInstanceRegistration() : - m_featureURI(), m_gui(nullptr), m_feature(nullptr) { } - FeatureInstanceRegistration(const QString& featureURI, FeatureGUI* pluginGUI, Feature *feature) : - m_featureURI(featureURI), + FeatureInstanceRegistration(FeatureGUI* pluginGUI, Feature *feature) : m_gui(pluginGUI), m_feature(feature) { } diff --git a/sdrgui/mainwindow.cpp b/sdrgui/mainwindow.cpp index 58d382b69..2695fa42b 100644 --- a/sdrgui/mainwindow.cpp +++ b/sdrgui/mainwindow.cpp @@ -1982,7 +1982,7 @@ void MainWindow::featureAddClicked(int featureIndex) PluginInterface *pluginInterface = (*featureRegistrations)[featureIndex].m_plugin; Feature *feature = pluginInterface->createFeature(m_apiAdapter); FeatureGUI *gui = pluginInterface->createFeatureGUI(featureUISet, feature); - featureUISet->registerFeatureInstance(feature->getURI(), gui, feature); + featureUISet->registerFeatureInstance(gui, feature); } }