From 33e39f161ae7bbfdffb9dd54d3a8e3790ece2eca Mon Sep 17 00:00:00 2001 From: f4exb Date: Sat, 25 Nov 2017 16:47:13 +0100 Subject: [PATCH] Web API: /sdrangel/preset (PUT) implementation --- sdrbase/webapi/webapiadapterinterface.h | 10 +++++ sdrbase/webapi/webapirequestmapper.cpp | 19 ++++++++ sdrgui/mainwindow.cpp | 10 +++++ sdrgui/mainwindow.h | 26 +++++++++++ sdrgui/webapi/webapiadaptergui.cpp | 55 +++++++++++++++++++++++ sdrgui/webapi/webapiadaptergui.h | 5 +++ swagger/sdrangel/api/swagger/swagger.yaml | 2 +- 7 files changed, 126 insertions(+), 1 deletion(-) diff --git a/sdrbase/webapi/webapiadapterinterface.h b/sdrbase/webapi/webapiadapterinterface.h index c3db45cf5..203830bc7 100644 --- a/sdrbase/webapi/webapiadapterinterface.h +++ b/sdrbase/webapi/webapiadapterinterface.h @@ -154,6 +154,16 @@ public: Swagger::SWGErrorResponse& error __attribute__((unused))) { return 501; } + /** + * Handler of /sdrangel/preset (PUT) swagger/sdrangel/code/html2/index.html#api-Default-instanceChannels + * returns the Http status code (default 501: not implemented) + */ + virtual int instancePresetPut( + Swagger::SWGPresetTransfer& query __attribute__((unused)), + Swagger::SWGPresetIdentifier& response __attribute__((unused)), + Swagger::SWGErrorResponse& error __attribute__((unused))) + { return 501; } + static QString instanceSummaryURL; static QString instanceDevicesURL; static QString instanceChannelsURL; diff --git a/sdrbase/webapi/webapirequestmapper.cpp b/sdrbase/webapi/webapirequestmapper.cpp index e3306948a..9e2925f6d 100644 --- a/sdrbase/webapi/webapirequestmapper.cpp +++ b/sdrbase/webapi/webapirequestmapper.cpp @@ -362,6 +362,25 @@ void WebAPIRequestMapper::instancePresetService(qtwebapp::HttpRequest& request, } } } + else if (request.getMethod() == "PUT") + { + Swagger::SWGPresetTransfer query; + Swagger::SWGPresetIdentifier normalResponse; + QString jsonStr = request.getBody(); + + if (parseJsonBody(jsonStr, response)) + { + query.fromJson(jsonStr); + int status = m_adapter->instancePresetPut(query, normalResponse, errorResponse); + response.setStatus(status); + + if (status == 200) { + response.write(normalResponse.asJson().toUtf8()); + } else { + response.write(errorResponse.asJson().toUtf8()); + } + } + } else { response.setStatus(405,"Invalid HTTP method"); diff --git a/sdrgui/mainwindow.cpp b/sdrgui/mainwindow.cpp index 51d355ffb..1370bda17 100644 --- a/sdrgui/mainwindow.cpp +++ b/sdrgui/mainwindow.cpp @@ -63,6 +63,7 @@ #include MESSAGE_CLASS_DEFINITION(MainWindow::MsgLoadPreset, Message) +MESSAGE_CLASS_DEFINITION(MainWindow::MsgSavePreset, Message) MainWindow *MainWindow::m_instance = 0; @@ -664,6 +665,15 @@ bool MainWindow::handleMessage(const Message& cmd) loadPresetSettings(notif.getPreset(), notif.getDeviceSetIndex()); return true; } + else if (MsgSavePreset::match(cmd)) + { + MsgSavePreset& notif = (MsgSavePreset&) cmd; + savePresetSettings(notif.getPreset(), notif.getDeviceSetIndex()); + if (notif.isNewPreset()) { ui->presetTree->setCurrentItem(addPresetToTree(notif.getPreset())); } + m_settings.sortPresets(); + m_settings.save(); + return true; + } return false; } diff --git a/sdrgui/mainwindow.h b/sdrgui/mainwindow.h index a17d04df1..4552afd6e 100644 --- a/sdrgui/mainwindow.h +++ b/sdrgui/mainwindow.h @@ -107,6 +107,32 @@ private: { } }; + class MsgSavePreset : public Message { + MESSAGE_CLASS_DECLARATION + + public: + Preset *getPreset() const { return m_preset; } + int getDeviceSetIndex() const { return m_deviceSetIndex; } + bool isNewPreset() const { return m_newPreset; } + + static MsgSavePreset* create(Preset *preset, int deviceSetIndex, bool newPreset) + { + return new MsgSavePreset(preset, deviceSetIndex, newPreset); + } + + private: + Preset *m_preset; + int m_deviceSetIndex; + bool m_newPreset; + + MsgSavePreset(Preset *preset, int deviceSetIndex, bool newPreset) : + Message(), + m_preset(preset), + m_deviceSetIndex(deviceSetIndex), + m_newPreset(newPreset) + { } + }; + enum { PGroup, PItem diff --git a/sdrgui/webapi/webapiadaptergui.cpp b/sdrgui/webapi/webapiadaptergui.cpp index ffc06914a..bebf58824 100644 --- a/sdrgui/webapi/webapiadaptergui.cpp +++ b/sdrgui/webapi/webapiadaptergui.cpp @@ -486,6 +486,61 @@ int WebAPIAdapterGUI::instancePresetPatch( return 200; } +int WebAPIAdapterGUI::instancePresetPut( + Swagger::SWGPresetTransfer& query, + Swagger::SWGPresetIdentifier& response, + Swagger::SWGErrorResponse& error) +{ + int deviceSetIndex = query.getDeviceSetIndex(); + Swagger::SWGPresetIdentifier *presetIdentifier = query.getPreset(); + int nbDeviceSets = m_mainWindow.m_deviceUIs.size(); + bool newPreset; + + if (deviceSetIndex > nbDeviceSets) + { + *error.getMessage() = QString("There is no device set at index %1. Number of device sets is %2").arg(deviceSetIndex).arg(nbDeviceSets); + return 404; + } + + const Preset *selectedPreset = m_mainWindow.m_settings.getPreset(*presetIdentifier->getGroupName(), + presetIdentifier->getCenterFrequency(), + *presetIdentifier->getName()); + + if (selectedPreset == 0) // save on a new preset + { + selectedPreset = m_mainWindow.m_settings.newPreset(*presetIdentifier->getGroupName(), *presetIdentifier->getName()); + newPreset = true; + } + else // update existing preset + { + DeviceUISet *deviceUI = m_mainWindow.m_deviceUIs[deviceSetIndex]; + newPreset = false; + + if (deviceUI->m_deviceSourceEngine && !selectedPreset->isSourcePreset()) + { + *error.getMessage() = QString("Preset type (T) and device set type (Rx) mismatch"); + return 404; + } + + if (deviceUI->m_deviceSinkEngine && selectedPreset->isSourcePreset()) + { + *error.getMessage() = QString("Preset type (R) and device set type (Tx) mismatch"); + return 404; + } + } + + MainWindow::MsgSavePreset *msg = MainWindow::MsgSavePreset::create(const_cast(selectedPreset), deviceSetIndex, newPreset); + m_mainWindow.m_inputMessageQueue.push(msg); + + response.init(); + response.setCenterFrequency(selectedPreset->getCenterFrequency()); + *response.getGroupName() = selectedPreset->getGroup(); + *response.getType() = selectedPreset->isSourcePreset() ? "R" : "T"; + *response.getName() = selectedPreset->getDescription(); + + return 200; +} + QtMsgType WebAPIAdapterGUI::getMsgTypeFromString(const QString& msgTypeString) { if (msgTypeString == "debug") { diff --git a/sdrgui/webapi/webapiadaptergui.h b/sdrgui/webapi/webapiadaptergui.h index 694d575b9..53c219c99 100644 --- a/sdrgui/webapi/webapiadaptergui.h +++ b/sdrgui/webapi/webapiadaptergui.h @@ -83,6 +83,11 @@ public: Swagger::SWGPresetIdentifier& response, Swagger::SWGErrorResponse& error); + virtual int instancePresetPut( + Swagger::SWGPresetTransfer& query, + Swagger::SWGPresetIdentifier& response, + Swagger::SWGErrorResponse& error); + private: MainWindow& m_mainWindow; diff --git a/swagger/sdrangel/api/swagger/swagger.yaml b/swagger/sdrangel/api/swagger/swagger.yaml index 1dd251765..0a13cb5fc 100644 --- a/swagger/sdrangel/api/swagger/swagger.yaml +++ b/swagger/sdrangel/api/swagger/swagger.yaml @@ -279,7 +279,7 @@ paths: "501": description: Function not implemented put: - description: Save device set settings on a preset + description: Save device set settings on a preset. Preset is updated if it already exists else it is created with the given name and group. If created given frequency and type is ignored and is determined with the device set values. operationId: instancePresetPut consumes: - application/json