From af6218611ab94b9427267477891d321f999e43be Mon Sep 17 00:00:00 2001 From: f4exb Date: Sat, 10 Aug 2019 05:16:25 +0200 Subject: [PATCH] REST API: config: PUT (6): mapper work and rework --- sdrbase/settings/preset.cpp | 20 +++- sdrbase/settings/preset.h | 10 +- sdrbase/webapi/webapiadapterbase.cpp | 135 ++++++++++++++++++++++----- sdrbase/webapi/webapiadapterbase.h | 3 +- sdrgui/webapi/webapiadaptergui.cpp | 10 +- 5 files changed, 148 insertions(+), 30 deletions(-) diff --git a/sdrbase/settings/preset.cpp b/sdrbase/settings/preset.cpp index f2315320d..601c65f23 100644 --- a/sdrbase/settings/preset.cpp +++ b/sdrbase/settings/preset.cpp @@ -224,7 +224,25 @@ void Preset::addOrUpdateDeviceConfig(const QString& sourceId, } } -const QByteArray* Preset::findBestDeviceConfig(const QString& sourceId, +const QByteArray* Preset::findDeviceConfig( + const QString& deviceId, + const QString& deviceSerial, + int deviceSequence) const +{ + DeviceeConfigs::const_iterator it = m_deviceConfigs.begin(); + + for (; it != m_deviceConfigs.end(); ++it) + { + if ((it->m_deviceId == deviceId) && (it->m_deviceSerial == deviceSerial) && (it->m_deviceSerial == deviceSerial)) { + return &it->m_config; + } + } + + return nullptr; +} + +const QByteArray* Preset::findBestDeviceConfig( + const QString& sourceId, const QString& sourceSerial, int sourceSequence) const { diff --git a/sdrbase/settings/preset.h b/sdrbase/settings/preset.h index 6bd6aec0a..52fdb75ec 100644 --- a/sdrbase/settings/preset.h +++ b/sdrbase/settings/preset.h @@ -79,7 +79,9 @@ public: const QByteArray& getSpectrumConfig() const { return m_spectrumConfig; } bool hasDCOffsetCorrection() const { return m_dcOffsetCorrection; } + void setDCOffsetCorrection(bool dcOffsetCorrection) { m_dcOffsetCorrection = dcOffsetCorrection; } bool hasIQImbalanceCorrection() const { return m_iqImbalanceCorrection; } + void setIQImbalanceCorrection(bool iqImbalanceCorrection) { m_iqImbalanceCorrection = iqImbalanceCorrection; } void setLayout(const QByteArray& data) { m_layout = data; } const QByteArray& getLayout() const { return m_layout; } @@ -101,7 +103,13 @@ public: int deviceSequence, const QByteArray& config); - const QByteArray* findBestDeviceConfig(const QString& deviceId, + const QByteArray* findBestDeviceConfig( + const QString& deviceId, + const QString& deviceSerial, + int deviceSequence) const; + + const QByteArray* findDeviceConfig( + const QString& deviceId, const QString& deviceSerial, int deviceSequence) const; diff --git a/sdrbase/webapi/webapiadapterbase.cpp b/sdrbase/webapi/webapiadapterbase.cpp index 6b3415ee0..3f3296e1f 100644 --- a/sdrbase/webapi/webapiadapterbase.cpp +++ b/sdrbase/webapi/webapiadapterbase.cpp @@ -88,28 +88,6 @@ void WebAPIAdapterBase::webapiUpdatePreferences( if (preferenceKeys.contains("useLogFile")) { preferences.setUseLogFile(apiPreferences->getUseLogFile() != 0); } - - if (preferenceKeys.contains("consoleMinLogLevel")) - - - if (apiPreferences->getSourceDevice()) { - preferences.setSourceDevice(*apiPreferences->getSourceDevice()); - } - preferences.setSourceIndex(apiPreferences->getSourceIndex()); - if (apiPreferences->getAudioType()) { - preferences.setAudioType(*apiPreferences->getAudioType()); - } - if (apiPreferences->getAudioDevice()) { - preferences.setAudioDevice(*apiPreferences->getAudioDevice()); - } - preferences.setLatitude(apiPreferences->getLatitude()); - preferences.setLongitude(apiPreferences->getLongitude()); - preferences.setConsoleMinLogLevel((QtMsgType) apiPreferences->getConsoleMinLogLevel()); - preferences.setUseLogFile(apiPreferences->getUseLogFile() != 0); - if (apiPreferences->getLogFileName()) { - preferences.setLogFileName(*apiPreferences->getLogFileName()); - } - preferences.setFileMinLogLevel((QtMsgType) apiPreferences->getFileMinLogLevel()); } void WebAPIAdapterBase::webapiFormatPreset( @@ -200,11 +178,124 @@ void WebAPIAdapterBase::webapiFormatPreset( } void WebAPIAdapterBase::webapiUpdatePreset( + bool force, SWGSDRangel::SWGPreset *apiPreset, const WebAPIAdapterInterface::PresetKeys& presetKeys, Preset& preset ) { + if (presetKeys.m_keys.contains("centerFrequency")) { + preset.setCenterFrequency(apiPreset->getCenterFrequency()); + } + if (presetKeys.m_keys.contains("dcOffsetCorrection")) { + preset.setDCOffsetCorrection(apiPreset->getDcOffsetCorrection() != 0); + } + if (presetKeys.m_keys.contains("iqImbalanceCorrection")) { + preset.setIQImbalanceCorrection(apiPreset->getIqImbalanceCorrection() != 0); + } + if (presetKeys.m_keys.contains("sourcePreset")) { + preset.setSourcePreset(apiPreset->getSourcePreset() != 0); + } + if (presetKeys.m_keys.contains("description")) { + preset.setDescription(*apiPreset->getDescription()); + } + if (presetKeys.m_keys.contains("group")) { + preset.setGroup(*apiPreset->getGroup()); + } + + if (force) { // PUT replaces devices list possibly erasing it if no devices are given + preset.clearDevices(); + } + + QString errorMessage; + QList::const_iterator deviceKeysIt = presetKeys.m_devicesKeys.begin(); + int i = 0; + for (; deviceKeysIt != presetKeys.m_devicesKeys.end(); ++deviceKeysIt, i++) + { + SWGSDRangel::SWGDeviceConfig *swgDeviceConfig = apiPreset->getDeviceConfigs()->at(i); + if (!swgDeviceConfig) { // safety measure but should not happen + continue; + } + + QString deviceId; + int deviceSequence = 0; + QString deviceSerial; + + if (deviceKeysIt->m_keys.contains("deviceId")) { + deviceId = *swgDeviceConfig->getDeviceId(); + } + if (deviceKeysIt->m_keys.contains("deviceSequence")) { + deviceSequence = swgDeviceConfig->getDeviceSequence(); + } + if (deviceKeysIt->m_keys.contains("deviceSerial")) { + deviceSerial = *swgDeviceConfig->getDeviceSerial(); + } + + DeviceWebAPIAdapter *deviceWebAPIAdapter = m_webAPIDeviceAdapters.getDeviceWebAPIAdapter(deviceId, m_pluginManager); + + if (deviceWebAPIAdapter) + { + if (!force) // In PATCH mode you must find the exact device and deserialize its current settings to be able to patch it + { + const QByteArray *config = preset.findDeviceConfig(deviceId, deviceSerial, deviceSequence); + + if (!config) { + continue; + } + + if (!deviceWebAPIAdapter->deserialize(*config)) { + continue; + } + } + + deviceWebAPIAdapter->webapiSettingsPutPatch( + force, + deviceKeysIt->m_deviceKeys, + *swgDeviceConfig->getConfig(), + errorMessage + ); + + QByteArray config = deviceWebAPIAdapter->serialize(); + preset.setDeviceConfig(deviceId, deviceSerial, deviceSequence, config); // add or update device + } + } + + if (force) { // PUT replaces channel list possibly erasing it if no channels are given + preset.clearChannels(); + } + + QList::const_iterator channelKeysIt = presetKeys.m_channelsKeys.begin(); + i = 0; + for (; channelKeysIt != presetKeys.m_channelsKeys.end(); ++channelKeysIt, i++) + { + SWGSDRangel::SWGChannelConfig *swgChannelConfig = apiPreset->getChannelConfigs()->at(i); + if (!swgChannelConfig) { // safety measure but should not happen + continue; + } + + if (channelKeysIt->m_keys.contains("channelIdURI")) + { + QString *channelIdURI = swgChannelConfig->getChannelIdUri(); + if (!channelIdURI) { + continue; + } + + ChannelWebAPIAdapter *channelWebAPIAdapter = m_webAPIChannelAdapters.getChannelWebAPIAdapter(*channelIdURI, m_pluginManager); + if (!channelWebAPIAdapter) { + continue; + } + + channelWebAPIAdapter->webapiSettingsPutPatch( + true, // channels are always appended + channelKeysIt->m_channelKeys, + *swgChannelConfig->getConfig(), + errorMessage + ); + + QByteArray config = channelWebAPIAdapter->serialize(); + preset.addChannel(*channelIdURI, config); + } + } } void WebAPIAdapterBase::webapiFormatCommand( diff --git a/sdrbase/webapi/webapiadapterbase.h b/sdrbase/webapi/webapiadapterbase.h index ee6c883d8..4ce6ee6f5 100644 --- a/sdrbase/webapi/webapiadapterbase.h +++ b/sdrbase/webapi/webapiadapterbase.h @@ -66,7 +66,8 @@ public: const QStringList& preferenceKeys, Preferences& preferences ); - static void webapiUpdatePreset( + void webapiUpdatePreset( + bool force, SWGSDRangel::SWGPreset *apiPreset, const WebAPIAdapterInterface::PresetKeys& presetKeys, Preset& preset diff --git a/sdrgui/webapi/webapiadaptergui.cpp b/sdrgui/webapi/webapiadaptergui.cpp index 4c20c3c32..1ceab85ab 100644 --- a/sdrgui/webapi/webapiadaptergui.cpp +++ b/sdrgui/webapi/webapiadaptergui.cpp @@ -160,9 +160,9 @@ int WebAPIAdapterGUI::instanceConfigPutPatch( { WebAPIAdapterBase webAPIAdapterBase; webAPIAdapterBase.setPluginManager(m_mainWindow.getPluginManager()); - qDebug("WebAPIAdapterGUI::instanceConfigPutPatch: configKeys:"); - configKeys.debug(); - return 200; + // qDebug("WebAPIAdapterGUI::instanceConfigPutPatch: configKeys:"); + // configKeys.debug(); + // return 200; if (force) { webAPIAdapterBase.webapiInitConfig(m_mainWindow.m_settings); @@ -173,7 +173,7 @@ int WebAPIAdapterGUI::instanceConfigPutPatch( m_mainWindow.m_settings.setPreferences(newPreferences); Preset *workingPreset = m_mainWindow.m_settings.getWorkingPreset(); - webAPIAdapterBase.webapiUpdatePreset(query.getWorkingPreset(), configKeys.m_workingPresetKeys, *workingPreset); + webAPIAdapterBase.webapiUpdatePreset(force, query.getWorkingPreset(), configKeys.m_workingPresetKeys, *workingPreset); QList::const_iterator presetKeysIt = configKeys.m_presetKeys.begin(); int i = 0; @@ -181,7 +181,7 @@ int WebAPIAdapterGUI::instanceConfigPutPatch( { Preset *newPreset = new Preset(); // created with default values SWGSDRangel::SWGPreset *swgPreset = query.getPresets()->at(i); - webAPIAdapterBase.webapiUpdatePreset(swgPreset, *presetKeysIt, *newPreset); + webAPIAdapterBase.webapiUpdatePreset(force, swgPreset, *presetKeysIt, *newPreset); m_mainWindow.m_settings.addPreset(newPreset); }