1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-09-03 05:37:50 -04:00

Presets for MIMO

This commit is contained in:
f4exb 2019-09-13 13:40:31 +02:00
parent d3176ef578
commit 500f5bc82c
22 changed files with 954 additions and 642 deletions

View File

@ -123,6 +123,8 @@ public:
virtual quint64 getSinkCenterFrequency(int index) const { return 0; (void) index; } virtual quint64 getSinkCenterFrequency(int index) const { return 0; (void) index; }
virtual void setSinkCenterFrequency(qint64 centerFrequency, int index) { (void) centerFrequency; (void) index; } virtual void setSinkCenterFrequency(qint64 centerFrequency, int index) { (void) centerFrequency; (void) index; }
virtual quint64 getMIMOCenterFrequency() const { return getSourceCenterFrequency(0); }
virtual bool handleMessage(const Message& message); virtual bool handleMessage(const Message& message);
virtual int webapiSettingsGet( virtual int webapiSettingsGet(

View File

@ -512,13 +512,13 @@ void DeviceAPI::loadSamplingDeviceSettings(const Preset* preset)
{ {
if (m_deviceSourceEngine && (preset->isSourcePreset())) if (m_deviceSourceEngine && (preset->isSourcePreset()))
{ {
qDebug("DeviceAPI::loadSamplingDeviceSettings: Loading preset [%s | %s]", qPrintable(preset->getGroup()), qPrintable(preset->getDescription())); qDebug("DeviceAPI::loadSamplingDeviceSettings: Loading Rx preset [%s | %s]", qPrintable(preset->getGroup()), qPrintable(preset->getDescription()));
const QByteArray* sourceConfig = preset->findBestDeviceConfig(m_samplingDeviceId, m_samplingDeviceSerial, m_samplingDeviceSequence); const QByteArray* sourceConfig = preset->findBestDeviceConfig(m_samplingDeviceId, m_samplingDeviceSerial, m_samplingDeviceSequence);
qint64 centerFrequency = preset->getCenterFrequency(); qint64 centerFrequency = preset->getCenterFrequency();
qDebug("DeviceAPI::loadSamplingDeviceSettings: center frequency: %llu Hz", centerFrequency); qDebug("DeviceAPI::loadSamplingDeviceSettings: source center frequency: %llu Hz", centerFrequency);
if (sourceConfig != 0) if (sourceConfig)
{ {
qDebug("DeviceAPI::loadSamplingDeviceSettings: deserializing source %s[%d]: %s", qDebug("DeviceAPI::loadSamplingDeviceSettings: deserializing source %s[%d]: %s",
qPrintable(m_samplingDeviceId), m_samplingDeviceSequence, qPrintable(m_samplingDeviceSerial)); qPrintable(m_samplingDeviceId), m_samplingDeviceSequence, qPrintable(m_samplingDeviceSerial));
@ -556,15 +556,15 @@ void DeviceAPI::loadSamplingDeviceSettings(const Preset* preset)
qDebug("DeviceAPI::loadSamplingDeviceSettings: no source"); qDebug("DeviceAPI::loadSamplingDeviceSettings: no source");
} }
} }
else if (m_deviceSinkEngine && (!preset->isSourcePreset())) // TODO: refine preset stream type else if (m_deviceSinkEngine && preset->isSinkPreset())
{ {
qDebug("DeviceAPI::loadSamplingDeviceSettings: Loading preset [%s | %s]", qPrintable(preset->getGroup()), qPrintable(preset->getDescription())); qDebug("DeviceAPI::loadSamplingDeviceSettings: Loading Tx preset [%s | %s]", qPrintable(preset->getGroup()), qPrintable(preset->getDescription()));
const QByteArray* sinkConfig = preset->findBestDeviceConfig(m_samplingDeviceId, m_samplingDeviceSerial, m_samplingDeviceSequence); const QByteArray* sinkConfig = preset->findBestDeviceConfig(m_samplingDeviceId, m_samplingDeviceSerial, m_samplingDeviceSequence);
qint64 centerFrequency = preset->getCenterFrequency(); qint64 centerFrequency = preset->getCenterFrequency();
qDebug("DeviceAPI::loadSamplingDeviceSettings: center frequency: %llu Hz", centerFrequency); qDebug("DeviceAPI::loadSamplingDeviceSettings: sink center frequency: %llu Hz", centerFrequency);
if (sinkConfig != 0) if (sinkConfig)
{ {
qDebug("DeviceAPI::loadSamplingDeviceSettings: deserializing sink %s[%d]: %s", qDebug("DeviceAPI::loadSamplingDeviceSettings: deserializing sink %s[%d]: %s",
qPrintable(m_samplingDeviceId), m_samplingDeviceSequence, qPrintable(m_samplingDeviceSerial)); qPrintable(m_samplingDeviceId), m_samplingDeviceSequence, qPrintable(m_samplingDeviceSerial));
@ -590,6 +590,40 @@ void DeviceAPI::loadSamplingDeviceSettings(const Preset* preset)
qPrintable(m_samplingDeviceId), m_samplingDeviceSequence, qPrintable(m_samplingDeviceSerial)); qPrintable(m_samplingDeviceId), m_samplingDeviceSequence, qPrintable(m_samplingDeviceSerial));
} }
} }
else if (m_deviceMIMOEngine && preset->isMIMOPreset())
{
qDebug("DeviceAPI::loadSamplingDeviceSettings: Loading MIMO preset [%s | %s]", qPrintable(preset->getGroup()), qPrintable(preset->getDescription()));
const QByteArray* mimoConfig = preset->findBestDeviceConfig(m_samplingDeviceId, m_samplingDeviceSerial, m_samplingDeviceSequence);
qint64 centerFrequency = preset->getCenterFrequency();
qDebug("DeviceAPI::loadSamplingDeviceSettings: MIMO center frequency: %llu Hz", centerFrequency);
if (mimoConfig)
{
qDebug("DeviceAPI::loadSamplingDeviceSettings: deserializing MIMO %s[%d]: %s",
qPrintable(m_samplingDeviceId), m_samplingDeviceSequence, qPrintable(m_samplingDeviceSerial));
if (m_samplingDevicePluginInstanceUI != 0) // GUI flavor
{
m_samplingDevicePluginInstanceUI->deserialize(*mimoConfig);
m_samplingDevicePluginInstanceUI->setCenterFrequency(centerFrequency);
}
else if (m_deviceSinkEngine->getSink() != 0) // Server flavor
{
m_deviceSinkEngine->getSink()->deserialize(*mimoConfig);
m_deviceSinkEngine->getSink()->setCenterFrequency(centerFrequency);
}
else
{
qDebug("DeviceAPI::loadSamplingDeviceSettings: no MIMO");
}
}
else
{
qDebug("DeviceAPI::loadSamplingDeviceSettings: MIMO %s[%d]: %s not found",
qPrintable(m_samplingDeviceId), m_samplingDeviceSequence, qPrintable(m_samplingDeviceSerial));
}
}
else else
{ {
qDebug("DeviceAPI::loadSamplingDeviceSettings: Loading preset [%s | %s] is not a suitable preset", qPrintable(preset->getGroup()), qPrintable(preset->getDescription())); qDebug("DeviceAPI::loadSamplingDeviceSettings: Loading preset [%s | %s] is not a suitable preset", qPrintable(preset->getGroup()), qPrintable(preset->getDescription()));
@ -603,12 +637,12 @@ void DeviceAPI::saveSamplingDeviceSettings(Preset* preset)
qDebug("DeviceAPI::saveSamplingDeviceSettings: serializing source %s[%d]: %s", qDebug("DeviceAPI::saveSamplingDeviceSettings: serializing source %s[%d]: %s",
qPrintable(m_samplingDeviceId), m_samplingDeviceSequence, qPrintable(m_samplingDeviceSerial)); qPrintable(m_samplingDeviceId), m_samplingDeviceSequence, qPrintable(m_samplingDeviceSerial));
if (m_samplingDevicePluginInstanceUI != 0) if (m_samplingDevicePluginInstanceUI) // GUI flavor
{ {
preset->addOrUpdateDeviceConfig(m_samplingDeviceId, m_samplingDeviceSerial, m_samplingDeviceSequence, m_samplingDevicePluginInstanceUI->serialize()); preset->addOrUpdateDeviceConfig(m_samplingDeviceId, m_samplingDeviceSerial, m_samplingDeviceSequence, m_samplingDevicePluginInstanceUI->serialize());
preset->setCenterFrequency(m_samplingDevicePluginInstanceUI->getCenterFrequency()); preset->setCenterFrequency(m_samplingDevicePluginInstanceUI->getCenterFrequency());
} }
else if (m_deviceSourceEngine->getSource() != 0) else if (m_deviceSourceEngine->getSource()) // Server flavor
{ {
preset->addOrUpdateDeviceConfig(m_samplingDeviceId, m_samplingDeviceSerial, m_samplingDeviceSequence, m_deviceSourceEngine->getSource()->serialize()); preset->addOrUpdateDeviceConfig(m_samplingDeviceId, m_samplingDeviceSerial, m_samplingDeviceSequence, m_deviceSourceEngine->getSource()->serialize());
preset->setCenterFrequency(m_deviceSourceEngine->getSource()->getCenterFrequency()); preset->setCenterFrequency(m_deviceSourceEngine->getSource()->getCenterFrequency());
@ -618,17 +652,17 @@ void DeviceAPI::saveSamplingDeviceSettings(Preset* preset)
qDebug("DeviceAPI::saveSamplingDeviceSettings: no source"); qDebug("DeviceAPI::saveSamplingDeviceSettings: no source");
} }
} }
else if (m_deviceSinkEngine && (!preset->isSourcePreset())) // TODO: refine preset stream type else if (m_deviceSinkEngine && preset->isSinkPreset())
{ {
qDebug("DeviceAPI::saveSamplingDeviceSettings: serializing sink %s[%d]: %s", qDebug("DeviceAPI::saveSamplingDeviceSettings: serializing sink %s[%d]: %s",
qPrintable(m_samplingDeviceId), m_samplingDeviceSequence, qPrintable(m_samplingDeviceSerial)); qPrintable(m_samplingDeviceId), m_samplingDeviceSequence, qPrintable(m_samplingDeviceSerial));
if (m_samplingDevicePluginInstanceUI != 0) // GUI flavor if (m_samplingDevicePluginInstanceUI) // GUI flavor
{ {
preset->addOrUpdateDeviceConfig(m_samplingDeviceId, m_samplingDeviceSerial, m_samplingDeviceSequence, m_deviceSinkEngine->getSink()->serialize()); preset->addOrUpdateDeviceConfig(m_samplingDeviceId, m_samplingDeviceSerial, m_samplingDeviceSequence, m_deviceSinkEngine->getSink()->serialize());
preset->setCenterFrequency(m_deviceSinkEngine->getSink()->getCenterFrequency()); preset->setCenterFrequency(m_deviceSinkEngine->getSink()->getCenterFrequency());
} }
else if (m_deviceSinkEngine->getSink() != 0) // Server flavor else if (m_deviceSinkEngine->getSink()) // Server flavor
{ {
preset->addOrUpdateDeviceConfig(m_samplingDeviceId, m_samplingDeviceSerial, m_samplingDeviceSequence, m_deviceSinkEngine->getSink()->serialize()); preset->addOrUpdateDeviceConfig(m_samplingDeviceId, m_samplingDeviceSerial, m_samplingDeviceSequence, m_deviceSinkEngine->getSink()->serialize());
preset->setCenterFrequency(m_deviceSinkEngine->getSink()->getCenterFrequency()); preset->setCenterFrequency(m_deviceSinkEngine->getSink()->getCenterFrequency());
@ -638,6 +672,26 @@ void DeviceAPI::saveSamplingDeviceSettings(Preset* preset)
qDebug("DeviceAPI::saveSamplingDeviceSettings: no sink"); qDebug("DeviceAPI::saveSamplingDeviceSettings: no sink");
} }
} }
else if (m_deviceMIMOEngine && preset->isMIMOPreset())
{
qDebug("DeviceAPI::saveSamplingDeviceSettings: serializing MIMO %s[%d]: %s",
qPrintable(m_samplingDeviceId), m_samplingDeviceSequence, qPrintable(m_samplingDeviceSerial));
if (m_samplingDevicePluginInstanceUI) // GUI flavor
{
preset->addOrUpdateDeviceConfig(m_samplingDeviceId, m_samplingDeviceSerial, m_samplingDeviceSequence, m_deviceMIMOEngine->getMIMO()->serialize());
preset->setCenterFrequency(m_deviceMIMOEngine->getMIMO()->getMIMOCenterFrequency());
}
else if (m_deviceMIMOEngine->getMIMO()) // Server flavor
{
preset->addOrUpdateDeviceConfig(m_samplingDeviceId, m_samplingDeviceSerial, m_samplingDeviceSequence, m_deviceMIMOEngine->getMIMO()->serialize());
preset->setCenterFrequency(m_deviceMIMOEngine->getMIMO()->getMIMOCenterFrequency());
}
else
{
qDebug("DeviceAPI::saveSamplingDeviceSettings: no MIMO");
}
}
else else
{ {
qDebug("DeviceAPI::saveSamplingDeviceSettings: not a suitable preset"); qDebug("DeviceAPI::saveSamplingDeviceSettings: not a suitable preset");

View File

@ -74,6 +74,8 @@ public:
virtual quint64 getSourceCenterFrequency(int index) const = 0; //!< Center frequency exposed by the source at index virtual quint64 getSourceCenterFrequency(int index) const = 0; //!< Center frequency exposed by the source at index
virtual void setSourceCenterFrequency(qint64 centerFrequency, int index) = 0; virtual void setSourceCenterFrequency(qint64 centerFrequency, int index) = 0;
virtual quint64 getMIMOCenterFrequency() const = 0; //!< Unique center frequency for preset identification or any unique reference
virtual bool handleMessage(const Message& message) = 0; virtual bool handleMessage(const Message& message) = 0;
virtual int webapiSettingsGet( virtual int webapiSettingsGet(

File diff suppressed because one or more lines are too long

View File

@ -22,8 +22,8 @@ ChannelConfig:
Preset: Preset:
description: Represents a Preset object description: Represents a Preset object
properties: properties:
sourcePreset: presetType:
description: boolean description: See Preset::PresetType
type: integer type: integer
group: group:
type: string type: string

View File

@ -217,7 +217,9 @@ const Preset* MainSettings::getPreset(const QString& groupName, quint64 centerFr
{ {
if (type == "R" && getPreset(i)->isSourcePreset()) { if (type == "R" && getPreset(i)->isSourcePreset()) {
return getPreset(i); return getPreset(i);
} else if (type == "T" && !getPreset(i)->isSourcePreset()) { } else if (type == "T" && getPreset(i)->isSinkPreset()) {
return getPreset(i);
} else if (type == "M" && getPreset(i)->isMIMOPreset()) {
return getPreset(i); return getPreset(i);
} }
} }

View File

@ -41,7 +41,7 @@ Preset::Preset(const Preset& other) :
void Preset::resetToDefaults() void Preset::resetToDefaults()
{ {
m_sourcePreset = true; m_presetType == PresetSource; // Rx
m_group = "default"; m_group = "default";
m_description = "no name"; m_description = "no name";
m_centerFrequency = 0; m_centerFrequency = 0;
@ -67,7 +67,8 @@ QByteArray Preset::serialize() const
s.writeU64(3, m_centerFrequency); s.writeU64(3, m_centerFrequency);
s.writeBlob(4, m_layout); s.writeBlob(4, m_layout);
s.writeBlob(5, m_spectrumConfig); s.writeBlob(5, m_spectrumConfig);
s.writeBool(6, m_sourcePreset); s.writeBool(6, m_presetType == PresetSource);
s.writeS32(7, (int) m_presetType);
s.writeS32(20, m_deviceConfigs.size()); s.writeS32(20, m_deviceConfigs.size());
@ -115,12 +116,21 @@ bool Preset::deserialize(const QByteArray& data)
if (d.getVersion() == 1) if (d.getVersion() == 1)
{ {
bool tmpBool;
int tmp;
d.readString(1, &m_group, "default"); d.readString(1, &m_group, "default");
d.readString(2, &m_description, "no name"); d.readString(2, &m_description, "no name");
d.readU64(3, &m_centerFrequency, 0); d.readU64(3, &m_centerFrequency, 0);
d.readBlob(4, &m_layout); d.readBlob(4, &m_layout);
d.readBlob(5, &m_spectrumConfig); d.readBlob(5, &m_spectrumConfig);
d.readBool(6, &m_sourcePreset, true); d.readBool(6, &tmpBool, true);
d.readS32(7, &tmp, PresetSource);
m_presetType = tmp < (int) PresetSource ? PresetSource : tmp > (int) PresetMIMO ? PresetMIMO : (PresetType) tmp;
if (m_presetType != PresetMIMO) {
m_presetType = tmpBool ? PresetSource : PresetSink;
}
// qDebug("Preset::deserialize: m_group: %s mode: %s m_description: %s m_centerFrequency: %llu", // qDebug("Preset::deserialize: m_group: %s mode: %s m_description: %s m_centerFrequency: %llu",
// qPrintable(m_group), // qPrintable(m_group),
@ -291,25 +301,25 @@ const QByteArray* Preset::findBestDeviceConfig(
{ {
if (itMatchSequence != m_deviceConfigs.end()) // match sequence ? if (itMatchSequence != m_deviceConfigs.end()) // match sequence ?
{ {
qDebug("Preset::findBestSourceConfig: sequence matched: id: %s ser: %s seq: %d", qDebug("Preset::findBestDeviceConfig: sequence matched: id: %s ser: %s seq: %d",
qPrintable(itMatchSequence->m_deviceId), qPrintable(itMatchSequence->m_deviceSerial), itMatchSequence->m_deviceSequence); qPrintable(itMatchSequence->m_deviceId), qPrintable(itMatchSequence->m_deviceSerial), itMatchSequence->m_deviceSequence);
return &(itMatchSequence->m_config); return &(itMatchSequence->m_config);
} }
else if (itFirstOfKind != m_deviceConfigs.end()) // match source type ? else if (itFirstOfKind != m_deviceConfigs.end()) // match source type ?
{ {
qDebug("Preset::findBestSourceConfig: first of kind matched: id: %s ser: %s seq: %d", qDebug("Preset::findBestDeviceConfig: first of kind matched: id: %s ser: %s seq: %d",
qPrintable(itFirstOfKind->m_deviceId), qPrintable(itFirstOfKind->m_deviceSerial), itFirstOfKind->m_deviceSequence); qPrintable(itFirstOfKind->m_deviceId), qPrintable(itFirstOfKind->m_deviceSerial), itFirstOfKind->m_deviceSequence);
return &(itFirstOfKind->m_config); return &(itFirstOfKind->m_config);
} }
else // definitely not found ! else // definitely not found !
{ {
qDebug("Preset::findBestSourceConfig: no match"); qDebug("Preset::findBestDeviceConfig: no match");
return 0; return nullptr;
} }
} }
else // exact match else // exact match
{ {
qDebug("Preset::findBestSourceConfig: serial matched (exact): id: %s ser: %s", qDebug("Preset::findBestDeviceConfig: serial matched (exact): id: %s ser: %s",
qPrintable(it->m_deviceId), qPrintable(it->m_deviceSerial)); qPrintable(it->m_deviceId), qPrintable(it->m_deviceSerial));
return &(it->m_config); return &(it->m_config);
} }
@ -364,7 +374,7 @@ const QByteArray* Preset::findBestDeviceConfigSoapy(const QString& sourceId, con
} }
else else
{ {
qDebug("Preset::findBestSourceConfig: first of kind matched: id: %s ser: %s seq: %d", qDebug("Preset::findBestDeviceConfigSoapy: first of kind matched: id: %s ser: %s seq: %d",
qPrintable(itFirstOfKind->m_deviceId), qPrintable(itFirstOfKind->m_deviceSerial), itFirstOfKind->m_deviceSequence); qPrintable(itFirstOfKind->m_deviceId), qPrintable(itFirstOfKind->m_deviceSerial), itFirstOfKind->m_deviceSequence);
return &(itFirstOfKind->m_config); return &(itFirstOfKind->m_config);
} }

View File

@ -57,13 +57,26 @@ public:
}; };
typedef QList<DeviceConfig> DeviceeConfigs; typedef QList<DeviceConfig> DeviceeConfigs;
enum PresetType
{
PresetSource, // Rx
PresetSink, // Tx
PresetMIMO // MIMO
};
Preset(); Preset();
Preset(const Preset& other); Preset(const Preset& other);
void resetToDefaults(); void resetToDefaults();
void setSourcePreset(bool isSourcePreset) { m_sourcePreset = isSourcePreset; } void setSourcePreset() { m_presetType = PresetSource; }
bool isSourcePreset() const { return m_sourcePreset; } bool isSourcePreset() const { return m_presetType == PresetSource; }
void setSinkPreset() { m_presetType = PresetSink; }
bool isSinkPreset() const { return m_presetType == PresetSink; }
void setMIMOPreset() { m_presetType = PresetMIMO; }
bool isMIMOPreset() const { return m_presetType == PresetMIMO; }
PresetType getPresetType() const { return m_presetType; }
void setPresetType(PresetType presetType) { m_presetType = presetType; }
QByteArray serialize() const; QByteArray serialize() const;
bool deserialize(const QByteArray& data); bool deserialize(const QByteArray& data);
@ -130,7 +143,7 @@ public:
} }
protected: protected:
bool m_sourcePreset; PresetType m_presetType;
// group and preset description // group and preset description
QString m_group; QString m_group;

View File

@ -96,7 +96,7 @@ void WebAPIAdapterBase::webapiFormatPreset(
) )
{ {
apiPreset->init(); apiPreset->init();
apiPreset->setSourcePreset(preset.isSourcePreset() ? 1 : 0); apiPreset->setPresetType(preset.getPresetType());
apiPreset->setGroup(new QString(preset.getGroup())); apiPreset->setGroup(new QString(preset.getGroup()));
apiPreset->setDescription(new QString(preset.getDescription())); apiPreset->setDescription(new QString(preset.getDescription()));
apiPreset->setCenterFrequency(preset.getCenterFrequency()); apiPreset->setCenterFrequency(preset.getCenterFrequency());
@ -195,8 +195,8 @@ void WebAPIAdapterBase::webapiUpdatePreset(
if (presetKeys.m_keys.contains("iqImbalanceCorrection")) { if (presetKeys.m_keys.contains("iqImbalanceCorrection")) {
preset->setIQImbalanceCorrection(apiPreset->getIqImbalanceCorrection() != 0); preset->setIQImbalanceCorrection(apiPreset->getIqImbalanceCorrection() != 0);
} }
if (presetKeys.m_keys.contains("sourcePreset")) { if (presetKeys.m_keys.contains("presetType")) {
preset->setSourcePreset(apiPreset->getSourcePreset() != 0); preset->setPresetType((Preset::PresetType) apiPreset->getPresetType());
} }
if (presetKeys.m_keys.contains("description")) { if (presetKeys.m_keys.contains("description")) {
preset->setDescription(*apiPreset->getDescription()); preset->setDescription(*apiPreset->getDescription());

View File

@ -2325,8 +2325,8 @@ bool WebAPIRequestMapper::appendPresetKeys(
} }
if (presetJson.contains("iqImbalanceCorrection")) if (presetJson.contains("iqImbalanceCorrection"))
{ {
preset->setSourcePreset(presetJson["sourcePreset"].toInt()); preset->setPresetType(presetJson["presetType"].toInt());
presetKeys.m_keys.append("sourcePreset"); presetKeys.m_keys.append("presetType");
} }
if (presetJson.contains("description")) if (presetJson.contains("description"))
{ {

View File

@ -229,7 +229,7 @@ void DeviceUISet::saveRxChannelSettings(Preset *preset)
for(int i = 0; i < m_channelInstanceRegistrations.count(); i++) for(int i = 0; i < m_channelInstanceRegistrations.count(); i++)
{ {
qDebug("DeviceUISet::saveRxChannelSettings: channel [%s] saved", qPrintable(m_channelInstanceRegistrations[i].m_channelName)); qDebug("DeviceUISet::saveRxChannelSettings: saving channel [%s]", qPrintable(m_channelInstanceRegistrations[i].m_channelName));
preset->addChannel(m_channelInstanceRegistrations[i].m_channelName, m_channelInstanceRegistrations[i].m_gui->serialize()); preset->addChannel(m_channelInstanceRegistrations[i].m_channelName, m_channelInstanceRegistrations[i].m_gui->serialize());
} }
} }
@ -241,11 +241,7 @@ void DeviceUISet::saveRxChannelSettings(Preset *preset)
void DeviceUISet::loadTxChannelSettings(const Preset *preset, PluginAPI *pluginAPI) void DeviceUISet::loadTxChannelSettings(const Preset *preset, PluginAPI *pluginAPI)
{ {
if (preset->isSourcePreset()) if (preset->isSinkPreset())
{
qDebug("DeviceUISet::loadTxChannelSettings: Loading preset [%s | %s] not a sink preset", qPrintable(preset->getGroup()), qPrintable(preset->getDescription()));
}
else
{ {
qDebug("DeviceUISet::loadTxChannelSettings: Loading preset [%s | %s]", qPrintable(preset->getGroup()), qPrintable(preset->getDescription())); qDebug("DeviceUISet::loadTxChannelSettings: Loading preset [%s | %s]", qPrintable(preset->getGroup()), qPrintable(preset->getDescription()));
@ -296,24 +292,107 @@ void DeviceUISet::loadTxChannelSettings(const Preset *preset, PluginAPI *pluginA
renameChannelInstances(); renameChannelInstances();
} }
else
{
qDebug("DeviceUISet::loadTxChannelSettings: Loading preset [%s | %s] not a sink preset", qPrintable(preset->getGroup()), qPrintable(preset->getDescription()));
}
} }
void DeviceUISet::saveTxChannelSettings(Preset *preset) void DeviceUISet::saveTxChannelSettings(Preset *preset)
{ {
if (preset->isSourcePreset()) if (preset->isSinkPreset())
{
qDebug("DeviceUISet::saveTxChannelSettings: not a sink preset");
}
else
{ {
qSort(m_channelInstanceRegistrations.begin(), m_channelInstanceRegistrations.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_channelInstanceRegistrations.count(); i++) for(int i = 0; i < m_channelInstanceRegistrations.count(); i++)
{ {
qDebug("DeviceUISet::saveTxChannelSettings: channel [%s] saved", qPrintable(m_channelInstanceRegistrations[i].m_channelName)); qDebug("DeviceUISet::saveTxChannelSettings: saving channel [%s]", qPrintable(m_channelInstanceRegistrations[i].m_channelName));
preset->addChannel(m_channelInstanceRegistrations[i].m_channelName, m_channelInstanceRegistrations[i].m_gui->serialize()); preset->addChannel(m_channelInstanceRegistrations[i].m_channelName, m_channelInstanceRegistrations[i].m_gui->serialize());
} }
} }
else
{
qDebug("DeviceUISet::saveTxChannelSettings: not a sink preset");
}
}
void DeviceUISet::loadMIMOChannelSettings(const Preset *preset, PluginAPI *pluginAPI)
{
if (preset->isMIMOPreset())
{
qDebug("DeviceUISet::loadMIMOChannelSettings: Loading preset [%s | %s]", qPrintable(preset->getGroup()), qPrintable(preset->getDescription()));
// Available channel plugins
PluginAPI::ChannelRegistrations *channelRegistrations = pluginAPI->getMIMOChannelRegistrations();
// copy currently open channels and clear list
ChannelInstanceRegistrations openChannels = m_channelInstanceRegistrations;
m_channelInstanceRegistrations.clear();
for(int i = 0; i < openChannels.count(); i++)
{
qDebug("DeviceUISet::loadMIMOChannelSettings: destroying old channel [%s]", qPrintable(openChannels[i].m_channelName));
openChannels[i].m_gui->destroy(); // FIXME: stop channel before
}
qDebug("DeviceUISet::loadMIMOChannelSettings: %d channel(s) in preset", preset->getChannelCount());
for (int i = 0; i < preset->getChannelCount(); i++)
{
const Preset::ChannelConfig& channelConfig = preset->getChannelConfig(i);
ChannelInstanceRegistration reg;
// create channel instance
for(int i = 0; i < channelRegistrations->count(); i++)
{
//if((*channelRegistrations)[i].m_channelIdURI == channelConfig.m_channelIdURI)
if (ChannelUtils::compareChannelURIs((*channelRegistrations)[i].m_channelIdURI, channelConfig.m_channelIdURI))
{
qDebug("DeviceUISet::loadMIMOChannelSettings: creating new channel [%s] from config [%s]",
qPrintable((*channelRegistrations)[i].m_channelIdURI),
qPrintable(channelConfig.m_channelIdURI));
MIMOChannel *mimoChannel =
(*channelRegistrations)[i].m_plugin->createMIMOChannelBS(m_deviceAPI);
PluginInstanceGUI *mimoChannelGUI =
(*channelRegistrations)[i].m_plugin->createMIMOChannelGUI(this, mimoChannel);
reg = ChannelInstanceRegistration(channelConfig.m_channelIdURI, mimoChannelGUI, 2);
break;
}
}
if (reg.m_gui != 0)
{
qDebug("DeviceUISet::loadMIMOChannelSettings: deserializing channel [%s]", qPrintable(channelConfig.m_channelIdURI));
reg.m_gui->deserialize(channelConfig.m_config);
}
}
renameChannelInstances();
}
else
{
qDebug("DeviceUISet::loadMIMOChannelSettings: Loading preset [%s | %s] not a MIMO preset", qPrintable(preset->getGroup()), qPrintable(preset->getDescription()));
}
}
void DeviceUISet::saveMIMOChannelSettings(Preset *preset)
{
if (preset->isMIMOPreset())
{
qSort(m_channelInstanceRegistrations.begin(), m_channelInstanceRegistrations.end()); // sort by increasing delta frequency and type
for(int i = 0; i < m_channelInstanceRegistrations.count(); i++)
{
qDebug("DeviceUISet::saveMIMOChannelSettings: saving channel [%s]", qPrintable(m_channelInstanceRegistrations[i].m_channelName));
preset->addChannel(m_channelInstanceRegistrations[i].m_channelName, m_channelInstanceRegistrations[i].m_gui->serialize());
}
}
else
{
qDebug("DeviceUISet::saveMIMOChannelSettings: not a MIMO preset");
}
} }
void DeviceUISet::renameChannelInstances() void DeviceUISet::renameChannelInstances()

View File

@ -71,7 +71,8 @@ public:
void saveRxChannelSettings(Preset* preset); void saveRxChannelSettings(Preset* preset);
void loadTxChannelSettings(const Preset* preset, PluginAPI *pluginAPI); void loadTxChannelSettings(const Preset* preset, PluginAPI *pluginAPI);
void saveTxChannelSettings(Preset* preset); void saveTxChannelSettings(Preset* preset);
//TODO: load and save MIMO channel settings when preset has MIMO type defined void loadMIMOChannelSettings(const Preset* preset, PluginAPI *pluginAPI);
void saveMIMOChannelSettings(Preset* preset);
// These are the number of channel types available for selection // These are the number of channel types available for selection
void setNumberOfAvailableRxChannels(int number) { m_nbAvailableRxChannels = number; } void setNumberOfAvailableRxChannels(int number) { m_nbAvailableRxChannels = number; }

View File

@ -737,6 +737,8 @@ void MainWindow::loadPresetSettings(const Preset* preset, int tabIndex)
deviceUI->loadRxChannelSettings(preset, m_pluginManager->getPluginAPI()); deviceUI->loadRxChannelSettings(preset, m_pluginManager->getPluginAPI());
} else if (deviceUI->m_deviceSinkEngine) { // sink device } else if (deviceUI->m_deviceSinkEngine) { // sink device
deviceUI->loadTxChannelSettings(preset, m_pluginManager->getPluginAPI()); deviceUI->loadTxChannelSettings(preset, m_pluginManager->getPluginAPI());
} else if (deviceUI->m_deviceMIMOEngine) { // MIMO device
deviceUI->loadMIMOChannelSettings(preset, m_pluginManager->getPluginAPI());
} }
} }
@ -763,6 +765,7 @@ void MainWindow::savePresetSettings(Preset* preset, int tabIndex)
{ {
preset->setSpectrumConfig(deviceUI->m_spectrumGUI->serialize()); preset->setSpectrumConfig(deviceUI->m_spectrumGUI->serialize());
preset->clearChannels(); preset->clearChannels();
preset->setSourcePreset();
deviceUI->saveRxChannelSettings(preset); deviceUI->saveRxChannelSettings(preset);
deviceUI->m_deviceAPI->saveSamplingDeviceSettings(preset); deviceUI->m_deviceAPI->saveSamplingDeviceSettings(preset);
} }
@ -770,10 +773,18 @@ void MainWindow::savePresetSettings(Preset* preset, int tabIndex)
{ {
preset->setSpectrumConfig(deviceUI->m_spectrumGUI->serialize()); preset->setSpectrumConfig(deviceUI->m_spectrumGUI->serialize());
preset->clearChannels(); preset->clearChannels();
preset->setSourcePreset(false); preset->setSinkPreset();
deviceUI->saveTxChannelSettings(preset); deviceUI->saveTxChannelSettings(preset);
deviceUI->m_deviceAPI->saveSamplingDeviceSettings(preset); deviceUI->m_deviceAPI->saveSamplingDeviceSettings(preset);
} }
else if (deviceUI->m_deviceMIMOEngine) // MIMO device
{
preset->setSpectrumConfig(deviceUI->m_spectrumGUI->serialize());
preset->clearChannels();
preset->setMIMOPreset();
deviceUI->saveMIMOChannelSettings(preset);
deviceUI->m_deviceAPI->saveSamplingDeviceSettings(preset);
}
preset->setLayout(saveState()); preset->setLayout(saveState());
} }
@ -854,7 +865,7 @@ QTreeWidgetItem* MainWindow::addPresetToTree(const Preset* preset)
QStringList sl; QStringList sl;
sl.append(QString("%1").arg(preset->getCenterFrequency() / 1e6f, 0, 'f', 3)); // frequency column sl.append(QString("%1").arg(preset->getCenterFrequency() / 1e6f, 0, 'f', 3)); // frequency column
sl.append(QString("%1").arg(preset->isSourcePreset() ? 'R' : 'T')); // mode column sl.append(QString("%1").arg(preset->isSourcePreset() ? 'R' : preset->isSinkPreset() ? 'T' : preset->isMIMOPreset() ? 'M' : 'X')); // mode column
sl.append(preset->getDescription()); // description column sl.append(preset->getDescription()); // description column
PresetItem* item = new PresetItem(group, sl, preset->getCenterFrequency(), PItem); PresetItem* item = new PresetItem(group, sl, preset->getCenterFrequency(), PItem);
item->setTextAlignment(0, Qt::AlignRight); item->setTextAlignment(0, Qt::AlignRight);
@ -968,7 +979,7 @@ bool MainWindow::handleMessage(const Message& cmd)
if ((preset->getGroup() == presetToDelete->getGroup()) && if ((preset->getGroup() == presetToDelete->getGroup()) &&
(preset->getCenterFrequency() == presetToDelete->getCenterFrequency()) && (preset->getCenterFrequency() == presetToDelete->getCenterFrequency()) &&
(preset->getDescription() == presetToDelete->getDescription()) && (preset->getDescription() == presetToDelete->getDescription()) &&
(preset->isSourcePreset() == presetToDelete->isSourcePreset())) (preset->getPresetType() == presetToDelete->getPresetType()))
{ {
groupItem->takeChild(ip); groupItem->takeChild(ip);
} }

View File

@ -853,7 +853,7 @@ int WebAPIAdapterGUI::instancePresetsGet(
swgPresets->append(new SWGSDRangel::SWGPresetItem); swgPresets->append(new SWGSDRangel::SWGPresetItem);
swgPresets->back()->init(); swgPresets->back()->init();
swgPresets->back()->setCenterFrequency(preset->getCenterFrequency()); swgPresets->back()->setCenterFrequency(preset->getCenterFrequency());
*swgPresets->back()->getType() = preset->isSourcePreset() ? "R" : "T"; *swgPresets->back()->getType() = preset->isSourcePreset() ? "R" : preset->isSinkPreset() ? "T" : preset->isMIMOPreset() ? "M" : "X";
*swgPresets->back()->getName() = preset->getDescription(); *swgPresets->back()->getName() = preset->getDescription();
nbPresetsThisGroup++; nbPresetsThisGroup++;
} }
@ -901,14 +901,21 @@ int WebAPIAdapterGUI::instancePresetPatch(
if (deviceUI->m_deviceSourceEngine && !selectedPreset->isSourcePreset()) if (deviceUI->m_deviceSourceEngine && !selectedPreset->isSourcePreset())
{ {
error.init(); error.init();
*error.getMessage() = QString("Preset type (T) and device set type (Rx) mismatch"); *error.getMessage() = QString("Preset type and device set type (Rx) mismatch");
return 404; return 404;
} }
if (deviceUI->m_deviceSinkEngine && selectedPreset->isSourcePreset()) if (deviceUI->m_deviceSinkEngine && !selectedPreset->isSinkPreset())
{ {
error.init(); error.init();
*error.getMessage() = QString("Preset type (R) and device set type (Tx) mismatch"); *error.getMessage() = QString("Preset type and device set type (Tx) mismatch");
return 404;
}
if (deviceUI->m_deviceMIMOEngine && !selectedPreset->isMIMOPreset())
{
error.init();
*error.getMessage() = QString("Preset type and device set type (MIMO) mismatch");
return 404; return 404;
} }
@ -918,7 +925,7 @@ int WebAPIAdapterGUI::instancePresetPatch(
response.init(); response.init();
response.setCenterFrequency(selectedPreset->getCenterFrequency()); response.setCenterFrequency(selectedPreset->getCenterFrequency());
*response.getGroupName() = selectedPreset->getGroup(); *response.getGroupName() = selectedPreset->getGroup();
*response.getType() = selectedPreset->isSourcePreset() ? "R" : "T"; *response.getType() = selectedPreset->isSourcePreset() ? "R" : selectedPreset->isSinkPreset() ? "T" : selectedPreset->isMIMOPreset() ? "M" : "X";
*response.getName() = selectedPreset->getDescription(); *response.getName() = selectedPreset->getDescription();
return 202; return 202;
@ -962,14 +969,21 @@ int WebAPIAdapterGUI::instancePresetPut(
if (deviceUI->m_deviceSourceEngine && !selectedPreset->isSourcePreset()) if (deviceUI->m_deviceSourceEngine && !selectedPreset->isSourcePreset())
{ {
error.init(); error.init();
*error.getMessage() = QString("Preset type (T) and device set type (Rx) mismatch"); *error.getMessage() = QString("Preset type and device set type (Rx) mismatch");
return 404; return 404;
} }
if (deviceUI->m_deviceSinkEngine && selectedPreset->isSourcePreset()) if (deviceUI->m_deviceSinkEngine && !selectedPreset->isSinkPreset())
{ {
error.init(); error.init();
*error.getMessage() = QString("Preset type (R) and device set type (Tx) mismatch"); *error.getMessage() = QString("Preset type and device set type (Tx) mismatch");
return 404;
}
if (deviceUI->m_deviceMIMOEngine && !selectedPreset->isMIMOPreset())
{
error.init();
*error.getMessage() = QString("Preset type and device set type (MIMO) mismatch");
return 404; return 404;
} }
} }
@ -980,7 +994,7 @@ int WebAPIAdapterGUI::instancePresetPut(
response.init(); response.init();
response.setCenterFrequency(selectedPreset->getCenterFrequency()); response.setCenterFrequency(selectedPreset->getCenterFrequency());
*response.getGroupName() = selectedPreset->getGroup(); *response.getGroupName() = selectedPreset->getGroup();
*response.getType() = selectedPreset->isSourcePreset() ? "R" : "T"; *response.getType() = selectedPreset->isSourcePreset() ? "R" : selectedPreset->isSinkPreset() ? "T": selectedPreset->isMIMOPreset() ? "M" : "X";
*response.getName() = selectedPreset->getDescription(); *response.getName() = selectedPreset->getDescription();
return 202; return 202;
@ -1041,7 +1055,7 @@ int WebAPIAdapterGUI::instancePresetPost(
response.init(); response.init();
response.setCenterFrequency(selectedPreset->getCenterFrequency()); response.setCenterFrequency(selectedPreset->getCenterFrequency());
*response.getGroupName() = selectedPreset->getGroup(); *response.getGroupName() = selectedPreset->getGroup();
*response.getType() = selectedPreset->isSourcePreset() ? "R" : "T"; *response.getType() = selectedPreset->isSourcePreset() ? "R" : selectedPreset->isSinkPreset() ? "T" : selectedPreset->isMIMOPreset() ? "M" : "X";
*response.getName() = selectedPreset->getDescription(); *response.getName() = selectedPreset->getDescription();
return 202; return 202;
@ -1068,7 +1082,7 @@ int WebAPIAdapterGUI::instancePresetDelete(
response.setCenterFrequency(selectedPreset->getCenterFrequency()); response.setCenterFrequency(selectedPreset->getCenterFrequency());
*response.getGroupName() = selectedPreset->getGroup(); *response.getGroupName() = selectedPreset->getGroup();
*response.getType() = selectedPreset->isSourcePreset() ? "R" : "T"; *response.getType() = selectedPreset->isSourcePreset() ? "R" : selectedPreset->isSinkPreset() ? "T" : selectedPreset->isMIMOPreset() ? "M" : "X";
*response.getName() = selectedPreset->getDescription(); *response.getName() = selectedPreset->getDescription();
MainWindow::MsgDeletePreset *msg = MainWindow::MsgDeletePreset::create(const_cast<Preset*>(selectedPreset)); MainWindow::MsgDeletePreset *msg = MainWindow::MsgDeletePreset::create(const_cast<Preset*>(selectedPreset));

View File

@ -249,13 +249,9 @@ void DeviceSet::saveRxChannelSettings(Preset *preset)
void DeviceSet::loadTxChannelSettings(const Preset *preset, PluginAPI *pluginAPI) void DeviceSet::loadTxChannelSettings(const Preset *preset, PluginAPI *pluginAPI)
{ {
if (preset->isSourcePreset()) if (preset->isSinkPreset())
{ {
qDebug("DeviceSet::loadChannelSettings: Loading preset [%s | %s] not a sink preset", qPrintable(preset->getGroup()), qPrintable(preset->getDescription())); qDebug("DeviceSet::loadTxChannelSettings: Loading preset [%s | %s]", qPrintable(preset->getGroup()), qPrintable(preset->getDescription()));
}
else
{
qDebug("DeviceSet::loadChannelSettings: Loading preset [%s | %s]", qPrintable(preset->getGroup()), qPrintable(preset->getDescription()));
// Available channel plugins // Available channel plugins
PluginAPI::ChannelRegistrations *channelRegistrations = pluginAPI->getTxChannelRegistrations(); PluginAPI::ChannelRegistrations *channelRegistrations = pluginAPI->getTxChannelRegistrations();
@ -264,7 +260,7 @@ void DeviceSet::loadTxChannelSettings(const Preset *preset, PluginAPI *pluginAPI
ChannelInstanceRegistrations openChannels = m_channelInstanceRegistrations; ChannelInstanceRegistrations openChannels = m_channelInstanceRegistrations;
m_channelInstanceRegistrations.clear(); m_channelInstanceRegistrations.clear();
qDebug("DeviceSet::loadChannelSettings: %d channel(s) in preset", preset->getChannelCount()); qDebug("DeviceSet::loadTxChannelSettings: %d channel(s) in preset", preset->getChannelCount());
for (int i = 0; i < preset->getChannelCount(); i++) for (int i = 0; i < preset->getChannelCount(); i++)
{ {
@ -275,11 +271,11 @@ void DeviceSet::loadTxChannelSettings(const Preset *preset, PluginAPI *pluginAPI
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)); qDebug("DeviceSet::loadTxChannelSettings: 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)); qDebug("DeviceSet::loadTxChannelSettings: channel [%s] found", qPrintable(openChannels[i].m_channelName));
reg = openChannels.takeAt(i); reg = openChannels.takeAt(i);
m_channelInstanceRegistrations.append(reg); m_channelInstanceRegistrations.append(reg);
break; break;
@ -294,7 +290,7 @@ void DeviceSet::loadTxChannelSettings(const Preset *preset, PluginAPI *pluginAPI
{ {
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)); qDebug("DeviceSet::loadTxChannelSettings: creating new channel [%s]", qPrintable(channelConfig.m_channelIdURI));
ChannelAPI *txChannel = (*channelRegistrations)[i].m_plugin->createTxChannelCS(m_deviceAPI); ChannelAPI *txChannel = (*channelRegistrations)[i].m_plugin->createTxChannelCS(m_deviceAPI);
reg = ChannelInstanceRegistration(channelConfig.m_channelIdURI, txChannel); reg = ChannelInstanceRegistration(channelConfig.m_channelIdURI, txChannel);
m_channelInstanceRegistrations.append(reg); m_channelInstanceRegistrations.append(reg);
@ -305,7 +301,7 @@ void DeviceSet::loadTxChannelSettings(const Preset *preset, PluginAPI *pluginAPI
if (reg.m_channelAPI != nullptr) if (reg.m_channelAPI != nullptr)
{ {
qDebug("DeviceSet::loadChannelSettings: deserializing channel [%s]", qPrintable(channelConfig.m_channelIdURI)); qDebug("DeviceSet::loadTxChannelSettings: deserializing channel [%s]", qPrintable(channelConfig.m_channelIdURI));
reg.m_channelAPI->deserialize(channelConfig.m_config); reg.m_channelAPI->deserialize(channelConfig.m_config);
} }
} }
@ -313,30 +309,131 @@ void DeviceSet::loadTxChannelSettings(const Preset *preset, PluginAPI *pluginAPI
// everything, that is still "available" is not needed anymore // 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)); qDebug("DeviceSet::loadTxChannelSettings: destroying spare channel [%s]", qPrintable(openChannels[i].m_channelName));
openChannels[i].m_channelAPI->destroy(); openChannels[i].m_channelAPI->destroy();
} }
renameChannelInstances(); renameChannelInstances();
} }
else
{
qDebug("DeviceSet::loadTxChannelSettings: Loading preset [%s | %s] not a sink preset", qPrintable(preset->getGroup()), qPrintable(preset->getDescription()));
}
} }
void DeviceSet::saveTxChannelSettings(Preset *preset) void DeviceSet::saveTxChannelSettings(Preset *preset)
{ {
if (preset->isSourcePreset()) if (preset->isSinkPreset())
{
qDebug("DeviceSet::saveChannelSettings: not a sink preset");
}
else
{ {
qSort(m_channelInstanceRegistrations.begin(), m_channelInstanceRegistrations.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_channelInstanceRegistrations.count(); i++) for (int i = 0; i < m_channelInstanceRegistrations.count(); i++)
{ {
qDebug("DeviceSet::saveChannelSettings: channel [%s] saved", qPrintable(m_channelInstanceRegistrations[i].m_channelName)); qDebug("DeviceSet::saveTxChannelSettings: channel [%s] saved", qPrintable(m_channelInstanceRegistrations[i].m_channelName));
preset->addChannel(m_channelInstanceRegistrations[i].m_channelName, m_channelInstanceRegistrations[i].m_channelAPI->serialize()); preset->addChannel(m_channelInstanceRegistrations[i].m_channelName, m_channelInstanceRegistrations[i].m_channelAPI->serialize());
} }
} }
else
{
qDebug("DeviceSet::saveTxChannelSettings: not a sink preset");
}
}
void DeviceSet::loadMIMOChannelSettings(const Preset *preset, PluginAPI *pluginAPI)
{
if (preset->isMIMOPreset())
{
qDebug("DeviceSet::loadMIMOChannelSettings: Loading preset [%s | %s]", qPrintable(preset->getGroup()), qPrintable(preset->getDescription()));
// Available channel plugins
PluginAPI::ChannelRegistrations *channelRegistrations = pluginAPI->getMIMOChannelRegistrations();
// copy currently open channels and clear list
ChannelInstanceRegistrations openChannels = m_channelInstanceRegistrations;
m_channelInstanceRegistrations.clear();
qDebug("DeviceSet::loadMIMOChannelSettings: %d channel(s) in preset", preset->getChannelCount());
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++)
{
qDebug("DeviceSet::loadMIMOChannelSettings: channels compare [%s] vs [%s]", qPrintable(openChannels[i].m_channelName), qPrintable(channelConfig.m_channelIdURI));
//if(openChannels[i].m_channelName == channelConfig.m_channelIdURI)
if (ChannelUtils::compareChannelURIs(openChannels[i].m_channelName, channelConfig.m_channelIdURI))
{
qDebug("DeviceSet::loadMIMOChannelSettings: channel [%s] found", qPrintable(openChannels[i].m_channelName));
reg = openChannels.takeAt(i);
m_channelInstanceRegistrations.append(reg);
break;
}
}
// if we haven't one already, create one
if (reg.m_channelAPI == nullptr)
{
for (int i = 0; i < channelRegistrations->count(); i++)
{
//if((*channelRegistrations)[i].m_channelIdURI == channelConfig.m_channelIdURI)
if (ChannelUtils::compareChannelURIs((*channelRegistrations)[i].m_channelIdURI, channelConfig.m_channelIdURI))
{
qDebug("DeviceSet::loadMIMOChannelSettings: creating new channel [%s] from config [%s]",
qPrintable((*channelRegistrations)[i].m_channelIdURI),
qPrintable(channelConfig.m_channelIdURI));
ChannelAPI *mimoChannel = (*channelRegistrations)[i].m_plugin->createMIMOChannelCS(m_deviceAPI);
reg = ChannelInstanceRegistration(channelConfig.m_channelIdURI, mimoChannel);
m_channelInstanceRegistrations.append(reg);
break;
}
}
}
if (reg.m_channelAPI != nullptr)
{
qDebug("DeviceSet::loadMIMOChannelSettings: deserializing channel [%s]", qPrintable(channelConfig.m_channelIdURI));
reg.m_channelAPI->deserialize(channelConfig.m_config);
}
}
// everything, that is still "available" is not needed anymore
for (int i = 0; i < openChannels.count(); i++)
{
qDebug("DeviceSet::loadMIMOChannelSettings: destroying spare channel [%s]", qPrintable(openChannels[i].m_channelName));
openChannels[i].m_channelAPI->destroy();
}
renameChannelInstances();
}
else
{
qDebug("DeviceSet::loadChannelSettings: Loading preset [%s | %s] not a MIMO preset", qPrintable(preset->getGroup()), qPrintable(preset->getDescription()));
}
}
void DeviceSet::saveMIMOChannelSettings(Preset *preset)
{
if (preset->isMIMOPreset())
{
qSort(m_channelInstanceRegistrations.begin(), m_channelInstanceRegistrations.end()); // sort by increasing delta frequency and type
for (int i = 0; i < m_channelInstanceRegistrations.count(); i++)
{
qDebug("DeviceSet::saveMIMOChannelSettings: channel [%s] saved", qPrintable(m_channelInstanceRegistrations[i].m_channelName));
preset->addChannel(m_channelInstanceRegistrations[i].m_channelName, m_channelInstanceRegistrations[i].m_channelAPI->serialize());
}
}
else
{
qDebug("DeviceSet::saveMIMOChannelSettings: not a MIMO preset");
}
} }
void DeviceSet::renameChannelInstances() void DeviceSet::renameChannelInstances()

View File

@ -55,6 +55,8 @@ public:
void saveRxChannelSettings(Preset* preset); void saveRxChannelSettings(Preset* preset);
void loadTxChannelSettings(const Preset* preset, PluginAPI *pluginAPI); void loadTxChannelSettings(const Preset* preset, PluginAPI *pluginAPI);
void saveTxChannelSettings(Preset* preset); void saveTxChannelSettings(Preset* preset);
void loadMIMOChannelSettings(const Preset* preset, PluginAPI *pluginAPI);
void saveMIMOChannelSettings(Preset* preset);
private: private:
struct ChannelInstanceRegistration struct ChannelInstanceRegistration

View File

@ -574,16 +574,14 @@ void MainCore::loadPresetSettings(const Preset* preset, int tabIndex)
if (tabIndex >= 0) if (tabIndex >= 0)
{ {
DeviceSet *deviceSet = m_deviceSets[tabIndex]; DeviceSet *deviceSet = m_deviceSets[tabIndex];
deviceSet->m_deviceAPI->loadSamplingDeviceSettings(preset);
if (deviceSet->m_deviceSourceEngine) // source device if (deviceSet->m_deviceSourceEngine) { // source device
{
deviceSet->m_deviceAPI->loadSamplingDeviceSettings(preset);
deviceSet->loadRxChannelSettings(preset, m_pluginManager->getPluginAPI()); deviceSet->loadRxChannelSettings(preset, m_pluginManager->getPluginAPI());
} } else if (deviceSet->m_deviceSinkEngine) { // sink device
else if (deviceSet->m_deviceSinkEngine) // sink device
{
deviceSet->m_deviceAPI->loadSamplingDeviceSettings(preset);
deviceSet->loadTxChannelSettings(preset, m_pluginManager->getPluginAPI()); deviceSet->loadTxChannelSettings(preset, m_pluginManager->getPluginAPI());
} else if (deviceSet->m_deviceMIMOEngine) { // MIMO device
deviceSet->loadMIMOChannelSettings(preset, m_pluginManager->getPluginAPI());
} }
} }
} }
@ -601,15 +599,23 @@ void MainCore::savePresetSettings(Preset* preset, int tabIndex)
if (deviceSet->m_deviceSourceEngine) // source device if (deviceSet->m_deviceSourceEngine) // source device
{ {
preset->clearChannels(); preset->clearChannels();
preset->setSourcePreset();
deviceSet->saveRxChannelSettings(preset); deviceSet->saveRxChannelSettings(preset);
deviceSet->m_deviceAPI->saveSamplingDeviceSettings(preset); deviceSet->m_deviceAPI->saveSamplingDeviceSettings(preset);
} }
else if (deviceSet->m_deviceSinkEngine) // sink device else if (deviceSet->m_deviceSinkEngine) // sink device
{ {
preset->clearChannels(); preset->clearChannels();
preset->setSourcePreset(false); preset->setSinkPreset();
deviceSet->saveTxChannelSettings(preset); deviceSet->saveTxChannelSettings(preset);
deviceSet->m_deviceAPI->saveSamplingDeviceSettings(preset); deviceSet->m_deviceAPI->saveSamplingDeviceSettings(preset);
} }
else if (deviceSet->m_deviceMIMOEngine) // MIMO device
{
preset->clearChannels();
preset->setMIMOPreset();
deviceSet->saveMIMOChannelSettings(preset);
deviceSet->m_deviceAPI->saveSamplingDeviceSettings(preset);
}
} }

View File

@ -51,8 +51,10 @@
#include "device/deviceenumerator.h" #include "device/deviceenumerator.h"
#include "dsp/devicesamplesink.h" #include "dsp/devicesamplesink.h"
#include "dsp/devicesamplesource.h" #include "dsp/devicesamplesource.h"
#include "dsp/devicesamplemimo.h"
#include "dsp/dspdevicesourceengine.h" #include "dsp/dspdevicesourceengine.h"
#include "dsp/dspdevicesinkengine.h" #include "dsp/dspdevicesinkengine.h"
#include "dsp/dspdevicemimoengine.h"
#include "dsp/dspengine.h" #include "dsp/dspengine.h"
#include "channel/channelapi.h" #include "channel/channelapi.h"
#include "plugin/pluginapi.h" #include "plugin/pluginapi.h"
@ -833,7 +835,7 @@ int WebAPIAdapterSrv::instancePresetFilePut(
response.init(); response.init();
response.setCenterFrequency(preset->getCenterFrequency()); response.setCenterFrequency(preset->getCenterFrequency());
*response.getGroupName() = preset->getGroup(); *response.getGroupName() = preset->getGroup();
*response.getType() = preset->isSourcePreset() ? "R" : "T"; *response.getType() = preset->isSourcePreset() ? "R" : preset->isSinkPreset() ? "T" : preset->isMIMOPreset() ? "M" : "X";
*response.getName() = preset->getDescription(); *response.getName() = preset->getDescription();
return 200; return 200;
@ -898,7 +900,7 @@ int WebAPIAdapterSrv::instancePresetFilePost(
response.init(); response.init();
response.setCenterFrequency(selectedPreset->getCenterFrequency()); response.setCenterFrequency(selectedPreset->getCenterFrequency());
*response.getGroupName() = selectedPreset->getGroup(); *response.getGroupName() = selectedPreset->getGroup();
*response.getType() = selectedPreset->isSourcePreset() ? "R" : "T"; *response.getType() = selectedPreset->isSourcePreset() ? "R" : selectedPreset->isSinkPreset() ? "T" : selectedPreset->isMIMOPreset() ? "M" : "X";
*response.getName() = selectedPreset->getDescription(); *response.getName() = selectedPreset->getDescription();
return 200; return 200;
@ -952,7 +954,7 @@ int WebAPIAdapterSrv::instancePresetsGet(
swgPresets->append(new SWGSDRangel::SWGPresetItem); swgPresets->append(new SWGSDRangel::SWGPresetItem);
swgPresets->back()->init(); swgPresets->back()->init();
swgPresets->back()->setCenterFrequency(preset->getCenterFrequency()); swgPresets->back()->setCenterFrequency(preset->getCenterFrequency());
*swgPresets->back()->getType() = preset->isSourcePreset() ? "R" : "T"; *swgPresets->back()->getType() = preset->isSourcePreset() ? "R" : preset->isSinkPreset() ? "T" : preset->isMIMOPreset() ? "M" : "X";
*swgPresets->back()->getName() = preset->getDescription(); *swgPresets->back()->getName() = preset->getDescription();
nbPresetsThisGroup++; nbPresetsThisGroup++;
} }
@ -1000,14 +1002,21 @@ int WebAPIAdapterSrv::instancePresetPatch(
if (deviceSet->m_deviceSourceEngine && !selectedPreset->isSourcePreset()) if (deviceSet->m_deviceSourceEngine && !selectedPreset->isSourcePreset())
{ {
error.init(); error.init();
*error.getMessage() = QString("Preset type (T) and device set type (Rx) mismatch"); *error.getMessage() = QString("Preset type and device set type (Rx) mismatch");
return 404; return 404;
} }
if (deviceSet->m_deviceSinkEngine && selectedPreset->isSourcePreset()) if (deviceSet->m_deviceSinkEngine && !selectedPreset->isSinkPreset())
{ {
error.init(); error.init();
*error.getMessage() = QString("Preset type (R) and device set type (Tx) mismatch"); *error.getMessage() = QString("Preset type and device set type (Tx) mismatch");
return 404;
}
if (deviceSet->m_deviceMIMOEngine && !selectedPreset->isMIMOPreset())
{
error.init();
*error.getMessage() = QString("Preset type and device set type (MIMO) mismatch");
return 404; return 404;
} }
@ -1017,7 +1026,7 @@ int WebAPIAdapterSrv::instancePresetPatch(
response.init(); response.init();
response.setCenterFrequency(selectedPreset->getCenterFrequency()); response.setCenterFrequency(selectedPreset->getCenterFrequency());
*response.getGroupName() = selectedPreset->getGroup(); *response.getGroupName() = selectedPreset->getGroup();
*response.getType() = selectedPreset->isSourcePreset() ? "R" : "T"; *response.getType() = selectedPreset->isSourcePreset() ? "R" : selectedPreset->isSinkPreset() ? "T" : selectedPreset->isMIMOPreset() ? "M" : "X";
*response.getName() = selectedPreset->getDescription(); *response.getName() = selectedPreset->getDescription();
return 202; return 202;
@ -1061,14 +1070,21 @@ int WebAPIAdapterSrv::instancePresetPut(
if (deviceSet->m_deviceSourceEngine && !selectedPreset->isSourcePreset()) if (deviceSet->m_deviceSourceEngine && !selectedPreset->isSourcePreset())
{ {
error.init(); error.init();
*error.getMessage() = QString("Preset type (T) and device set type (Rx) mismatch"); *error.getMessage() = QString("Preset type and device set type (Rx) mismatch");
return 404; return 404;
} }
if (deviceSet->m_deviceSinkEngine && selectedPreset->isSourcePreset()) if (deviceSet->m_deviceSinkEngine && !selectedPreset->isSinkPreset())
{ {
error.init(); error.init();
*error.getMessage() = QString("Preset type (R) and device set type (Tx) mismatch"); *error.getMessage() = QString("Preset type and device set type (Tx) mismatch");
return 404;
}
if (deviceSet->m_deviceSinkEngine && !selectedPreset->isMIMOPreset())
{
error.init();
*error.getMessage() = QString("Preset type and device set type (MIMO) mismatch");
return 404; return 404;
} }
} }
@ -1079,7 +1095,7 @@ int WebAPIAdapterSrv::instancePresetPut(
response.init(); response.init();
response.setCenterFrequency(selectedPreset->getCenterFrequency()); response.setCenterFrequency(selectedPreset->getCenterFrequency());
*response.getGroupName() = selectedPreset->getGroup(); *response.getGroupName() = selectedPreset->getGroup();
*response.getType() = selectedPreset->isSourcePreset() ? "R" : "T"; *response.getType() = selectedPreset->isSourcePreset() ? "R" : selectedPreset->isSinkPreset() ? "T": selectedPreset->isMIMOPreset() ? "M" : "X";
*response.getName() = selectedPreset->getDescription(); *response.getName() = selectedPreset->getDescription();
return 202; return 202;
@ -1103,14 +1119,17 @@ int WebAPIAdapterSrv::instancePresetPost(
DeviceSet *deviceSet = m_mainCore.m_deviceSets[deviceSetIndex]; DeviceSet *deviceSet = m_mainCore.m_deviceSets[deviceSetIndex];
int deviceCenterFrequency = 0; int deviceCenterFrequency = 0;
bool isSourcePreset; int presetTypeCode;
if (deviceSet->m_deviceSourceEngine) { // Rx if (deviceSet->m_deviceSourceEngine) { // Rx
deviceCenterFrequency = deviceSet->m_deviceSourceEngine->getSource()->getCenterFrequency(); deviceCenterFrequency = deviceSet->m_deviceSourceEngine->getSource()->getCenterFrequency();
isSourcePreset = true; presetTypeCode = 0;
} else if (deviceSet->m_deviceSinkEngine) { // Tx } else if (deviceSet->m_deviceSinkEngine) { // Tx
deviceCenterFrequency = deviceSet->m_deviceSinkEngine->getSink()->getCenterFrequency(); deviceCenterFrequency = deviceSet->m_deviceSinkEngine->getSink()->getCenterFrequency();
isSourcePreset = false; presetTypeCode = 1;
} else if (deviceSet->m_deviceMIMOEngine) { // MIMO
deviceCenterFrequency = deviceSet->m_deviceMIMOEngine->getMIMO()->getMIMOCenterFrequency();
presetTypeCode = 2;
} else { } else {
error.init(); error.init();
*error.getMessage() = QString("Device set error"); *error.getMessage() = QString("Device set error");
@ -1143,7 +1162,7 @@ int WebAPIAdapterSrv::instancePresetPost(
response.init(); response.init();
response.setCenterFrequency(deviceCenterFrequency); response.setCenterFrequency(deviceCenterFrequency);
*response.getGroupName() = selectedPreset->getGroup(); *response.getGroupName() = selectedPreset->getGroup();
*response.getType() = isSourcePreset ? "R" : "T"; *response.getType() = presetTypeCode == 0 ? "R" : presetTypeCode == 1 ? "T" : presetTypeCode == 2 ? "M" : "X";
*response.getName() = selectedPreset->getDescription(); *response.getName() = selectedPreset->getDescription();
return 202; return 202;
@ -1171,7 +1190,7 @@ int WebAPIAdapterSrv::instancePresetDelete(
response.setCenterFrequency(selectedPreset->getCenterFrequency()); response.setCenterFrequency(selectedPreset->getCenterFrequency());
*response.getGroupName() = selectedPreset->getGroup(); *response.getGroupName() = selectedPreset->getGroup();
*response.getType() = selectedPreset->isSourcePreset() ? "R" : "T"; *response.getType() = selectedPreset->isSourcePreset() ? "R" : selectedPreset->isSinkPreset() ? "T" : selectedPreset->isMIMOPreset() ? "M" : "X";
*response.getName() = selectedPreset->getDescription(); *response.getName() = selectedPreset->getDescription();
MainCore::MsgDeletePreset *msg = MainCore::MsgDeletePreset::create(const_cast<Preset*>(selectedPreset)); MainCore::MsgDeletePreset *msg = MainCore::MsgDeletePreset::create(const_cast<Preset*>(selectedPreset));

View File

@ -22,8 +22,8 @@ ChannelConfig:
Preset: Preset:
description: Represents a Preset object description: Represents a Preset object
properties: properties:
sourcePreset: presetType:
description: boolean description: See Preset::PresetType
type: integer type: integer
group: group:
type: string type: string

File diff suppressed because one or more lines are too long

View File

@ -28,8 +28,8 @@ SWGPreset::SWGPreset(QString* json) {
} }
SWGPreset::SWGPreset() { SWGPreset::SWGPreset() {
source_preset = 0; preset_type = 0;
m_source_preset_isSet = false; m_preset_type_isSet = false;
group = nullptr; group = nullptr;
m_group_isSet = false; m_group_isSet = false;
description = nullptr; description = nullptr;
@ -56,8 +56,8 @@ SWGPreset::~SWGPreset() {
void void
SWGPreset::init() { SWGPreset::init() {
source_preset = 0; preset_type = 0;
m_source_preset_isSet = false; m_preset_type_isSet = false;
group = new QString(""); group = new QString("");
m_group_isSet = false; m_group_isSet = false;
description = new QString(""); description = new QString("");
@ -123,7 +123,7 @@ SWGPreset::fromJson(QString &json) {
void void
SWGPreset::fromJsonObject(QJsonObject &pJson) { SWGPreset::fromJsonObject(QJsonObject &pJson) {
::SWGSDRangel::setValue(&source_preset, pJson["sourcePreset"], "qint32", ""); ::SWGSDRangel::setValue(&preset_type, pJson["presetType"], "qint32", "");
::SWGSDRangel::setValue(&group, pJson["group"], "QString", "QString"); ::SWGSDRangel::setValue(&group, pJson["group"], "QString", "QString");
@ -159,8 +159,8 @@ SWGPreset::asJson ()
QJsonObject* QJsonObject*
SWGPreset::asJsonObject() { SWGPreset::asJsonObject() {
QJsonObject* obj = new QJsonObject(); QJsonObject* obj = new QJsonObject();
if(m_source_preset_isSet){ if(m_preset_type_isSet){
obj->insert("sourcePreset", QJsonValue(source_preset)); obj->insert("presetType", QJsonValue(preset_type));
} }
if(group != nullptr && *group != QString("")){ if(group != nullptr && *group != QString("")){
toJsonValue(QString("group"), group, obj, QString("QString")); toJsonValue(QString("group"), group, obj, QString("QString"));
@ -194,13 +194,13 @@ SWGPreset::asJsonObject() {
} }
qint32 qint32
SWGPreset::getSourcePreset() { SWGPreset::getPresetType() {
return source_preset; return preset_type;
} }
void void
SWGPreset::setSourcePreset(qint32 source_preset) { SWGPreset::setPresetType(qint32 preset_type) {
this->source_preset = source_preset; this->preset_type = preset_type;
this->m_source_preset_isSet = true; this->m_preset_type_isSet = true;
} }
QString* QString*
@ -298,7 +298,7 @@ bool
SWGPreset::isSet(){ SWGPreset::isSet(){
bool isObjectUpdated = false; bool isObjectUpdated = false;
do{ do{
if(m_source_preset_isSet){ if(m_preset_type_isSet){
isObjectUpdated = true; break; isObjectUpdated = true; break;
} }
if(group && *group != QString("")){ if(group && *group != QString("")){

View File

@ -46,8 +46,8 @@ public:
virtual void fromJsonObject(QJsonObject &json) override; virtual void fromJsonObject(QJsonObject &json) override;
virtual SWGPreset* fromJson(QString &jsonString) override; virtual SWGPreset* fromJson(QString &jsonString) override;
qint32 getSourcePreset(); qint32 getPresetType();
void setSourcePreset(qint32 source_preset); void setPresetType(qint32 preset_type);
QString* getGroup(); QString* getGroup();
void setGroup(QString* group); void setGroup(QString* group);
@ -80,8 +80,8 @@ public:
virtual bool isSet() override; virtual bool isSet() override;
private: private:
qint32 source_preset; qint32 preset_type;
bool m_source_preset_isSet; bool m_preset_type_isSet;
QString* group; QString* group;
bool m_group_isSet; bool m_group_isSet;