mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-12-23 01:55:48 -05:00
MainCore: added feature and channel maps. FeatureSet and FeatureUISet: simplify feature registrations. Channel and feature names fix
This commit is contained in:
parent
97b757fa98
commit
8b05670814
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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_
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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<FeatureInstanceRegistration> FeatureInstanceRegistrations;
|
||||
typedef QList<Feature*> FeatureInstanceRegistrations;
|
||||
|
||||
FeatureInstanceRegistrations m_featureInstanceRegistrations;
|
||||
int m_featureTabIndex;
|
||||
|
||||
void renameFeatureInstances();
|
||||
static bool compareFeatures(Feature *featureA, Feature *featureB);
|
||||
};
|
||||
|
||||
#endif // SDRBASE_FEATURE_FEATURESET_H_
|
||||
|
@ -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<DeviceSet*, int>::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<FeatureSet*, int>::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<ChannelAPI*, DeviceSet*>::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<Feature*, FeatureSet*>::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()));
|
||||
}
|
||||
}
|
||||
|
@ -20,6 +20,7 @@
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include <QMap>
|
||||
#include <QTimer>
|
||||
|
||||
#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<DeviceSet*> m_deviceSets;
|
||||
std::vector<FeatureSet*> m_featureSets;
|
||||
QMap<DeviceSet*, int> m_deviceSetsMap; //!< Device set instance to device set index map
|
||||
QMap<FeatureSet*, int> m_featureSetsMap; //!< Feature set instance to feature set index map
|
||||
QMap<ChannelAPI*, DeviceSet*> m_channelsMap; //!< Channel to device set map
|
||||
QMap<Feature*, FeatureSet*> m_featuresMap; //!< Feature to feature set map
|
||||
PluginManager* m_pluginManager;
|
||||
|
||||
void debugMaps();
|
||||
};
|
||||
|
||||
#endif // SDRBASE_MAINCORE_H_
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
{ }
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user