diff --git a/sdrbase/device/deviceapi.cpp b/sdrbase/device/deviceapi.cpp index 54a7f7c99..90412e4c1 100644 --- a/sdrbase/device/deviceapi.cpp +++ b/sdrbase/device/deviceapi.cpp @@ -19,6 +19,7 @@ #include "gui/glspectrum.h" #include "gui/channelwindow.h" #include "mainwindow.h" +#include "settings/preset.h" DeviceAPI::DeviceAPI(MainWindow *mainWindow, int deviceTabIndex, @@ -109,11 +110,6 @@ void DeviceAPI::configureCorrections(bool dcOffsetCorrection, bool iqImbalanceCo m_deviceEngine->configureCorrections(dcOffsetCorrection, iqImbalanceCorrection); } -void DeviceAPI::setSourceSequence(int sourceSequence) -{ - m_deviceEngine->setSourceSequence(sourceSequence); -} - GLSpectrum *DeviceAPI::getSpectrum() { return m_spectrum; @@ -152,6 +148,7 @@ void DeviceAPI::setSampleSourceSerial(const QString& serial) void DeviceAPI::setSampleSourceSequence(int sequence) { m_sampleSourceSequence = sequence; + m_deviceEngine->setSourceSequence(sequence); } void DeviceAPI::setSampleSourcePluginGUI(PluginGUI *gui) @@ -171,3 +168,53 @@ void DeviceAPI::freeAll() m_sampleSourceId.clear(); } } + +void DeviceAPI::loadSourceSettings(const Preset* preset) +{ + qDebug("DeviceAPI::loadSourceSettings: Loading preset [%s | %s]\n", qPrintable(preset->getGroup()), qPrintable(preset->getDescription())); + + if(m_sampleSourcePluginGUI != 0) + { + const QByteArray* sourceConfig = preset->findBestSourceConfig(m_sampleSourceId, m_sampleSourceSerial, m_sampleSourceSequence); + + if (sourceConfig != 0) + { + qDebug() << "DeviceAPI::loadSettings: deserializing source " << qPrintable(m_sampleSourceId); + m_sampleSourcePluginGUI->deserialize(*sourceConfig); + } + + qint64 centerFrequency = preset->getCenterFrequency(); + m_sampleSourcePluginGUI->setCenterFrequency(centerFrequency); + } +} + +void DeviceAPI::saveSourceSettings(Preset* preset) +{ + qDebug("DeviceAPI::saveSourceSettings"); + + if(m_sampleSourcePluginGUI != NULL) + { + preset->addOrUpdateSourceConfig(m_sampleSourceId, m_sampleSourceSerial, m_sampleSourceSequence, m_sampleSourcePluginGUI->serialize()); + preset->setCenterFrequency(m_sampleSourcePluginGUI->getCenterFrequency()); + } +} + +// sort by increasing delta frequency and type (i.e. name) +bool DeviceAPI::ChannelInstanceRegistration::operator<(const ChannelInstanceRegistration& other) const +{ + if (m_gui && other.m_gui) + { + if (m_gui->getCenterFrequency() == other.m_gui->getCenterFrequency()) + { + return m_gui->getName() < other.m_gui->getName(); + } + else + { + return m_gui->getCenterFrequency() < other.m_gui->getCenterFrequency(); + } + } + else + { + return false; + } +} diff --git a/sdrbase/device/deviceapi.h b/sdrbase/device/deviceapi.h index 9f668a6c4..d2e02a295 100644 --- a/sdrbase/device/deviceapi.h +++ b/sdrbase/device/deviceapi.h @@ -35,6 +35,7 @@ class MessageQueue; class ChannelMarker; class QWidget; class PluginGUI; +class Preset; class SDRANGEL_API DeviceAPI : public QObject { Q_OBJECT @@ -56,8 +57,6 @@ public: MessageQueue *getDeviceOutputMessageQueue(); void configureCorrections(bool dcOffsetCorrection, bool iqImbalanceCorrection); //!< Configure current device engine DSP corrections - void setSourceSequence(int sourceSequence); - // device related stuff GLSpectrum *getSpectrum(); //!< Direct spectrum getter void addChannelMarker(ChannelMarker* channelMarker); //!< Add channel marker to spectrum @@ -72,7 +71,30 @@ public: void freeAll(); + void loadSourceSettings(const Preset* preset); + void saveSourceSettings(Preset* preset); + protected: + struct ChannelInstanceRegistration + { + QString m_channelName; + PluginGUI* m_gui; + + ChannelInstanceRegistration() : + m_channelName(), + m_gui(NULL) + { } + + ChannelInstanceRegistration(const QString& channelName, PluginGUI* pluginGUI) : + m_channelName(channelName), + m_gui(pluginGUI) + { } + + bool operator<(const ChannelInstanceRegistration& other) const; + }; + + typedef QList ChannelInstanceRegistrations; + DeviceAPI(MainWindow *mainWindow, int deviceTabIndex, DSPDeviceEngine *deviceEngine, @@ -91,6 +113,8 @@ protected: int m_sampleSourceSequence; PluginGUI* m_sampleSourcePluginGUI; + ChannelInstanceRegistrations m_channelInstanceRegistrations; + friend class MainWindow; }; diff --git a/sdrbase/mainwindow.cpp b/sdrbase/mainwindow.cpp index cdf0cd827..53fd4dd09 100644 --- a/sdrbase/mainwindow.cpp +++ b/sdrbase/mainwindow.cpp @@ -317,6 +317,7 @@ void MainWindow::loadPresetSettings(const Preset* preset) DeviceUISet *deviceUI = m_deviceUIs[currentSourceTabIndex]; deviceUI->m_spectrumGUI->deserialize(preset->getSpectrumConfig()); deviceUI->m_pluginManager->loadSettings(preset, deviceUI->m_deviceAPI); + deviceUI->m_deviceAPI->loadSourceSettings(preset); } // has to be last step @@ -344,6 +345,7 @@ void MainWindow::savePresetSettings(Preset* preset) preset->setSpectrumConfig(deviceUI->m_spectrumGUI->serialize()); preset->clearChannels(); deviceUI->m_pluginManager->saveSettings(preset); + deviceUI->m_deviceAPI->saveSourceSettings(preset); preset->setLayout(saveState()); } @@ -673,11 +675,13 @@ void MainWindow::on_sampleSource_currentIndexChanged(int index) if (currentSourceTabIndex >= 0) { DeviceUISet *deviceUI = m_deviceUIs[currentSourceTabIndex]; - deviceUI->m_pluginManager->saveSourceSettings(m_settings.getWorkingPreset()); + deviceUI->m_deviceAPI->saveSourceSettings(m_settings.getWorkingPreset()); + //deviceUI->m_pluginManager->saveSourceSettings(m_settings.getWorkingPreset()); deviceUI->m_pluginManager->selectSampleSourceByIndex(deviceUI->m_samplingDeviceControl->getDeviceSelector()->currentIndex(), deviceUI->m_deviceAPI); m_settings.setSourceIndex(deviceUI->m_samplingDeviceControl->getDeviceSelector()->currentIndex()); - deviceUI->m_pluginManager->loadSourceSettings(m_settings.getWorkingPreset()); + //deviceUI->m_pluginManager->loadSourceSettings(m_settings.getWorkingPreset()); + deviceUI->m_deviceAPI->loadSourceSettings(m_settings.getWorkingPreset()); } } diff --git a/sdrbase/plugin/pluginmanager.cpp b/sdrbase/plugin/pluginmanager.cpp index 94a9acdd2..a9c1684cf 100644 --- a/sdrbase/plugin/pluginmanager.cpp +++ b/sdrbase/plugin/pluginmanager.cpp @@ -144,27 +144,27 @@ void PluginManager::loadSettings(const Preset* preset, DeviceAPI *deviceAPI) renameChannelInstances(); - loadSourceSettings(preset); +// loadSourceSettings(preset); // FIXME } -void PluginManager::loadSourceSettings(const Preset* preset) -{ - fprintf(stderr, "PluginManager::loadSourceSettings: Loading preset [%s | %s]\n", qPrintable(preset->getGroup()), qPrintable(preset->getDescription())); - - if(m_sampleSourcePluginGUI != 0) - { - const QByteArray* sourceConfig = preset->findBestSourceConfig(m_sampleSourceId, m_sampleSourceSerial, m_sampleSourceSequence); - - if (sourceConfig != 0) - { - qDebug() << "PluginManager::loadSettings: deserializing source " << qPrintable(m_sampleSourceId); - m_sampleSourcePluginGUI->deserialize(*sourceConfig); - } - - qint64 centerFrequency = preset->getCenterFrequency(); - m_sampleSourcePluginGUI->setCenterFrequency(centerFrequency); - } -} +//void PluginManager::loadSourceSettings(const Preset* preset) +//{ +// fprintf(stderr, "PluginManager::loadSourceSettings: Loading preset [%s | %s]\n", qPrintable(preset->getGroup()), qPrintable(preset->getDescription())); +// +// if(m_sampleSourcePluginGUI != 0) +// { +// const QByteArray* sourceConfig = preset->findBestSourceConfig(m_sampleSourceId, m_sampleSourceSerial, m_sampleSourceSequence); +// +// if (sourceConfig != 0) +// { +// qDebug() << "PluginManager::loadSettings: deserializing source " << qPrintable(m_sampleSourceId); +// m_sampleSourcePluginGUI->deserialize(*sourceConfig); +// } +// +// qint64 centerFrequency = preset->getCenterFrequency(); +// m_sampleSourcePluginGUI->setCenterFrequency(centerFrequency); +// } +//} // sort by increasing delta frequency and type (i.e. name) bool PluginManager::ChannelInstanceRegistration::operator<(const ChannelInstanceRegistration& other) const { @@ -182,7 +182,7 @@ bool PluginManager::ChannelInstanceRegistration::operator<(const ChannelInstance void PluginManager::saveSettings(Preset* preset) { qDebug("PluginManager::saveSettings"); - saveSourceSettings(preset); +// saveSourceSettings(preset); // FIXME qSort(m_channelInstanceRegistrations.begin(), m_channelInstanceRegistrations.end()); // sort by increasing delta frequency and type @@ -192,17 +192,17 @@ void PluginManager::saveSettings(Preset* preset) } } -void PluginManager::saveSourceSettings(Preset* preset) -{ - qDebug("PluginManager::saveSourceSettings"); - - if(m_sampleSourcePluginGUI != NULL) - { - preset->addOrUpdateSourceConfig(m_sampleSourceId, m_sampleSourceSerial, m_sampleSourceSequence, m_sampleSourcePluginGUI->serialize()); - //preset->setSourceConfig(m_sampleSourceId, m_sampleSourceSerial, m_sampleSourceSequence, m_sampleSourcePluginGUI->serialize()); - preset->setCenterFrequency(m_sampleSourcePluginGUI->getCenterFrequency()); - } -} +//void PluginManager::saveSourceSettings(Preset* preset) +//{ +// qDebug("PluginManager::saveSourceSettings"); +// +// if(m_sampleSourcePluginGUI != NULL) +// { +// preset->addOrUpdateSourceConfig(m_sampleSourceId, m_sampleSourceSerial, m_sampleSourceSequence, m_sampleSourcePluginGUI->serialize()); +// //preset->setSourceConfig(m_sampleSourceId, m_sampleSourceSerial, m_sampleSourceSequence, m_sampleSourcePluginGUI->serialize()); +// preset->setCenterFrequency(m_sampleSourcePluginGUI->getCenterFrequency()); +// } +//} void PluginManager::freeAll() { @@ -317,7 +317,10 @@ int PluginManager::selectSampleSourceByIndex(int index, DeviceAPI *deviceAPI) PluginGUI *pluginGUI = m_sampleSourceDevices[index].m_plugin->createSampleSourcePluginGUI(m_sampleSourceId, m_sampleSourceDevices[index].m_displayName, deviceAPI); m_sampleSourcePluginGUI = pluginGUI; - deviceAPI->setSourceSequence(m_sampleSourceSequence); + deviceAPI->setSampleSourceSequence(m_sampleSourceDevices[index].m_sourceSequence); + deviceAPI->setSampleSourceId(m_sampleSourceDevices[index].m_sourceId); + deviceAPI->setSampleSourceSerial(m_sampleSourceDevices[index].m_sourceSerial); + deviceAPI->setSampleSourcePluginGUI(pluginGUI); return index; } @@ -372,7 +375,10 @@ int PluginManager::selectFirstSampleSource(const QString& sourceId, DeviceAPI *d PluginGUI *pluginGUI = m_sampleSourceDevices[index].m_plugin->createSampleSourcePluginGUI(m_sampleSourceId, m_sampleSourceDevices[index].m_displayName, deviceAPI); m_sampleSourcePluginGUI = pluginGUI; - deviceAPI->setSourceSequence(m_sampleSourceSequence); + deviceAPI->setSampleSourceSequence(m_sampleSourceDevices[index].m_sourceSequence); + deviceAPI->setSampleSourceId(m_sampleSourceDevices[index].m_sourceId); + deviceAPI->setSampleSourceSerial(m_sampleSourceDevices[index].m_sourceSerial); + deviceAPI->setSampleSourcePluginGUI(pluginGUI); return index; } @@ -441,7 +447,10 @@ int PluginManager::selectSampleSourceBySerialOrSequence(const QString& sourceId, PluginGUI *pluginGUI = m_sampleSourceDevices[index].m_plugin->createSampleSourcePluginGUI(m_sampleSourceId, m_sampleSourceDevices[index].m_displayName, deviceAPI); m_sampleSourcePluginGUI = pluginGUI; - deviceAPI->setSourceSequence(m_sampleSourceSequence); + deviceAPI->setSampleSourceSequence(m_sampleSourceDevices[index].m_sourceSequence); + deviceAPI->setSampleSourceId(m_sampleSourceDevices[index].m_sourceId); + deviceAPI->setSampleSourceSerial(m_sampleSourceDevices[index].m_sourceSerial); + deviceAPI->setSampleSourcePluginGUI(pluginGUI); return index; } diff --git a/sdrbase/plugin/pluginmanager.h b/sdrbase/plugin/pluginmanager.h index dd721c53f..d80aa2728 100644 --- a/sdrbase/plugin/pluginmanager.h +++ b/sdrbase/plugin/pluginmanager.h @@ -48,9 +48,9 @@ public: void registerSampleSource(const QString& sourceName, PluginInterface* plugin); void loadSettings(const Preset* preset, DeviceAPI *deviceAPI); - void loadSourceSettings(const Preset* preset); +// void loadSourceSettings(const Preset* preset); void saveSettings(Preset* preset); - void saveSourceSettings(Preset* preset); +// void saveSourceSettings(Preset* preset); void freeAll(); @@ -129,10 +129,10 @@ private: DSPDeviceEngine* m_dspDeviceEngine; Plugins m_plugins; - ChannelRegistrations m_channelRegistrations; - ChannelInstanceRegistrations m_channelInstanceRegistrations; - SampleSourceRegistrations m_sampleSourceRegistrations; - SampleSourceDevices m_sampleSourceDevices; + ChannelRegistrations m_channelRegistrations; //!< Channel plugins register here + ChannelInstanceRegistrations m_channelInstanceRegistrations; // TODO: remove + SampleSourceRegistrations m_sampleSourceRegistrations; //!< Input source plugins (one per device kind) register here + SampleSourceDevices m_sampleSourceDevices; //!< Instances of input sources present in the system QString m_sampleSourceId; QString m_sampleSourceSerial;