From 57bda99c2b05326222498518ac8edc5818896798 Mon Sep 17 00:00:00 2001 From: f4exb Date: Sat, 25 Nov 2017 16:08:18 +0100 Subject: [PATCH] Web API: /sdrangel/preset (PATCH) implementation --- sdrbase/settings/mainsettings.cpp | 17 ++++++ sdrbase/settings/mainsettings.h | 1 + sdrbase/webapi/webapiadapterinterface.h | 16 +++++- sdrbase/webapi/webapirequestmapper.cpp | 23 +++++++- sdrgui/mainwindow.cpp | 15 +++++ sdrgui/mainwindow.h | 26 +++++++++ sdrgui/webapi/webapiadaptergui.cpp | 56 +++++++++++++++++++ sdrgui/webapi/webapiadaptergui.h | 5 ++ swagger/sdrangel/api/swagger/swagger.yaml | 12 ++-- .../code/qt5/client/SWGPresetIdentifier.cpp | 8 +-- .../code/qt5/client/SWGPresetIdentifier.h | 6 +- 11 files changed, 169 insertions(+), 16 deletions(-) diff --git a/sdrbase/settings/mainsettings.cpp b/sdrbase/settings/mainsettings.cpp index 3c772d445..75d8ab5e2 100644 --- a/sdrbase/settings/mainsettings.cpp +++ b/sdrbase/settings/mainsettings.cpp @@ -107,3 +107,20 @@ void MainSettings::sortPresets() { qSort(m_presets.begin(), m_presets.end(), Preset::presetCompare); } + +const Preset* MainSettings::getPreset(const QString& groupName, quint64 centerFrequency, const QString& description) const +{ + int nbPresets = getPresetCount(); + + for (int i = 0; i < nbPresets; i++) + { + if ((getPreset(i)->getGroup() == groupName) && + (getPreset(i)->getCenterFrequency() == centerFrequency) && + (getPreset(i)->getDescription() == description)) + { + return getPreset(i); + } + } + + return 0; +} diff --git a/sdrbase/settings/mainsettings.h b/sdrbase/settings/mainsettings.h index 4b9e4a26a..da82e3563 100644 --- a/sdrbase/settings/mainsettings.h +++ b/sdrbase/settings/mainsettings.h @@ -20,6 +20,7 @@ public: void deletePreset(const Preset* preset); int getPresetCount() const { return m_presets.count(); } const Preset* getPreset(int index) const { return m_presets[index]; } + const Preset* getPreset(const QString& groupName, quint64 centerFrequency, const QString& description) const; void sortPresets(); Preset* getWorkingPreset() { return &m_workingPreset; } diff --git a/sdrbase/webapi/webapiadapterinterface.h b/sdrbase/webapi/webapiadapterinterface.h index 8bec970d0..c3db45cf5 100644 --- a/sdrbase/webapi/webapiadapterinterface.h +++ b/sdrbase/webapi/webapiadapterinterface.h @@ -31,8 +31,10 @@ namespace Swagger class SWGAudioDevicesSelect; class SWGLocationInformation; class SWGDVSeralDevices; - class SWGErrorResponse; class SWGPresets; + class SWGPresetTransfer; + class SWGPresetIdentifier; + class SWGErrorResponse; } class WebAPIAdapterInterface @@ -134,7 +136,7 @@ public: { return 501; } /** - * Handler of /sdrangel/location (GET) swagger/sdrangel/code/html2/index.html#api-Default-instanceChannels + * Handler of /sdrangel/preset (GET) swagger/sdrangel/code/html2/index.html#api-Default-instanceChannels * returns the Http status code (default 501: not implemented) */ virtual int instancePresetGet( @@ -142,6 +144,16 @@ public: Swagger::SWGErrorResponse& error __attribute__((unused))) { return 501; } + /** + * Handler of /sdrangel/preset (PATCH) swagger/sdrangel/code/html2/index.html#api-Default-instanceChannels + * returns the Http status code (default 501: not implemented) + */ + virtual int instancePresetPatch( + 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 d6499e4e9..e3306948a 100644 --- a/sdrbase/webapi/webapirequestmapper.cpp +++ b/sdrbase/webapi/webapirequestmapper.cpp @@ -30,6 +30,8 @@ #include "SWGLocationInformation.h" #include "SWGDVSeralDevices.h" #include "SWGPresets.h" +#include "SWGPresetTransfer.h" +#include "SWGPresetIdentifier.h" #include "SWGErrorResponse.h" WebAPIRequestMapper::WebAPIRequestMapper(QObject* parent) : @@ -327,11 +329,11 @@ void WebAPIRequestMapper::instanceDVSerialService(qtwebapp::HttpRequest& request void WebAPIRequestMapper::instancePresetService(qtwebapp::HttpRequest& request, qtwebapp::HttpResponse& response) { - Swagger::SWGPresets normalResponse; Swagger::SWGErrorResponse errorResponse; if (request.getMethod() == "GET") { + Swagger::SWGPresets normalResponse; int status = m_adapter->instancePresetGet(normalResponse, errorResponse); response.setStatus(status); @@ -341,6 +343,25 @@ void WebAPIRequestMapper::instancePresetService(qtwebapp::HttpRequest& request, response.write(errorResponse.asJson().toUtf8()); } } + else if (request.getMethod() == "PATCH") + { + Swagger::SWGPresetTransfer query; + Swagger::SWGPresetIdentifier normalResponse; + QString jsonStr = request.getBody(); + + if (parseJsonBody(jsonStr, response)) + { + query.fromJson(jsonStr); + int status = m_adapter->instancePresetPatch(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 2a7aa055e..51d355ffb 100644 --- a/sdrgui/mainwindow.cpp +++ b/sdrgui/mainwindow.cpp @@ -62,6 +62,8 @@ #include #include +MESSAGE_CLASS_DEFINITION(MainWindow::MsgLoadPreset, Message) + MainWindow *MainWindow::m_instance = 0; MainWindow::MainWindow(qtwebapp::LoggerWithFile *logger, const MainParser& parser, QWidget* parent) : @@ -654,6 +656,18 @@ void MainWindow::applySettings() { } +bool MainWindow::handleMessage(const Message& cmd) +{ + if (MsgLoadPreset::match(cmd)) + { + MsgLoadPreset& notif = (MsgLoadPreset&) cmd; + loadPresetSettings(notif.getPreset(), notif.getDeviceSetIndex()); + return true; + } + + return false; +} + void MainWindow::handleMessages() { Message* message; @@ -661,6 +675,7 @@ void MainWindow::handleMessages() while ((message = m_inputMessageQueue.pop()) != 0) { qDebug("MainWindow::handleMessages: message: %s", message->getIdentifier()); + handleMessage(*message); delete message; } } diff --git a/sdrgui/mainwindow.h b/sdrgui/mainwindow.h index 3ef892cc4..a17d04df1 100644 --- a/sdrgui/mainwindow.h +++ b/sdrgui/mainwindow.h @@ -23,6 +23,7 @@ #include #include "settings/mainsettings.h" +#include "util/message.h" #include "util/messagequeue.h" #include "util/export.h" #include "mainparser.h" @@ -83,6 +84,29 @@ public: friend class WebAPIAdapterGUI; private: + class MsgLoadPreset : public Message { + MESSAGE_CLASS_DECLARATION + + public: + const Preset *getPreset() const { return m_preset; } + int getDeviceSetIndex() const { return m_deviceSetIndex; } + + static MsgLoadPreset* create(const Preset *preset, int deviceSetIndex) + { + return new MsgLoadPreset(preset, deviceSetIndex); + } + + private: + const Preset *m_preset; + int m_deviceSetIndex; + + MsgLoadPreset(const Preset *preset, int deviceSetIndex) : + Message(), + m_preset(preset), + m_deviceSetIndex(deviceSetIndex) + { } + }; + enum { PGroup, PItem @@ -142,6 +166,8 @@ private: void setLoggingOpions(); + bool handleMessage(const Message& cmd); + private slots: void handleMessages(); void updateStatus(); diff --git a/sdrgui/webapi/webapiadaptergui.cpp b/sdrgui/webapi/webapiadaptergui.cpp index 7b9a4885d..ffc06914a 100644 --- a/sdrgui/webapi/webapiadaptergui.cpp +++ b/sdrgui/webapi/webapiadaptergui.cpp @@ -45,6 +45,8 @@ #include "SWGPresets.h" #include "SWGPresetGroup.h" #include "SWGPresetItem.h" +#include "SWGPresetTransfer.h" +#include "SWGPresetIdentifier.h" #include "SWGErrorResponse.h" #include "webapiadaptergui.h" @@ -430,6 +432,60 @@ int WebAPIAdapterGUI::instancePresetGet( return 200; } +int WebAPIAdapterGUI::instancePresetPatch( + 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(); + + 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) + { + *error.getMessage() = QString("There is no preset [%1, %2, %3]") + .arg(*presetIdentifier->getGroupName()) + .arg(presetIdentifier->getCenterFrequency()) + .arg(*presetIdentifier->getName()); + return 404; + } + + DeviceUISet *deviceUI = m_mainWindow.m_deviceUIs[deviceSetIndex]; + + 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::MsgLoadPreset *msg = MainWindow::MsgLoadPreset::create(selectedPreset, deviceSetIndex); + 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 807365eb7..694d575b9 100644 --- a/sdrgui/webapi/webapiadaptergui.h +++ b/sdrgui/webapi/webapiadaptergui.h @@ -78,6 +78,11 @@ public: Swagger::SWGPresets& response, Swagger::SWGErrorResponse& error); + virtual int instancePresetPatch( + 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 51b7ef3a5..1dd251765 100644 --- a/swagger/sdrangel/api/swagger/swagger.yaml +++ b/swagger/sdrangel/api/swagger/swagger.yaml @@ -265,7 +265,9 @@ paths: schema: $ref: "#/definitions/PresetIdentifier" "400": - description: Invalid frequency + description: Preset type and device set type mismatch + schema: + $ref: "#/definitions/ErrorResponse" "404": description: No preset or device set found schema: @@ -293,8 +295,6 @@ paths: description: On success return preset identification schema: $ref: "#/definitions/PresetIdentifier" - "400": - description: Invalid frequency "404": description: No preset or device set found schema: @@ -761,9 +761,9 @@ definitions: description: "Name of the preset group" type: string centerFrequency: - description: "Center freqeuency in MHz" - type: number - format: float + description: "Center freqeuency in Hz" + type: integer + format: int64 type: description: "Type of device set (R: Rx, T: Tx)" type: string diff --git a/swagger/sdrangel/code/qt5/client/SWGPresetIdentifier.cpp b/swagger/sdrangel/code/qt5/client/SWGPresetIdentifier.cpp index 7c3eabb82..1b1cba61d 100644 --- a/swagger/sdrangel/code/qt5/client/SWGPresetIdentifier.cpp +++ b/swagger/sdrangel/code/qt5/client/SWGPresetIdentifier.cpp @@ -38,7 +38,7 @@ SWGPresetIdentifier::~SWGPresetIdentifier() { void SWGPresetIdentifier::init() { group_name = new QString(""); - center_frequency = 0.0f; + center_frequency = 0L; type = new QString(""); name = new QString(""); } @@ -72,7 +72,7 @@ SWGPresetIdentifier::fromJson(QString &json) { void SWGPresetIdentifier::fromJsonObject(QJsonObject &pJson) { ::Swagger::setValue(&group_name, pJson["groupName"], "QString", "QString"); - ::Swagger::setValue(¢er_frequency, pJson["centerFrequency"], "float", ""); + ::Swagger::setValue(¢er_frequency, pJson["centerFrequency"], "qint64", ""); ::Swagger::setValue(&type, pJson["type"], "QString", "QString"); ::Swagger::setValue(&name, pJson["name"], "QString", "QString"); } @@ -111,12 +111,12 @@ SWGPresetIdentifier::setGroupName(QString* group_name) { this->group_name = group_name; } -float +qint64 SWGPresetIdentifier::getCenterFrequency() { return center_frequency; } void -SWGPresetIdentifier::setCenterFrequency(float center_frequency) { +SWGPresetIdentifier::setCenterFrequency(qint64 center_frequency) { this->center_frequency = center_frequency; } diff --git a/swagger/sdrangel/code/qt5/client/SWGPresetIdentifier.h b/swagger/sdrangel/code/qt5/client/SWGPresetIdentifier.h index 891645935..15742b0d2 100644 --- a/swagger/sdrangel/code/qt5/client/SWGPresetIdentifier.h +++ b/swagger/sdrangel/code/qt5/client/SWGPresetIdentifier.h @@ -45,8 +45,8 @@ public: QString* getGroupName(); void setGroupName(QString* group_name); - float getCenterFrequency(); - void setCenterFrequency(float center_frequency); + qint64 getCenterFrequency(); + void setCenterFrequency(qint64 center_frequency); QString* getType(); void setType(QString* type); @@ -57,7 +57,7 @@ public: private: QString* group_name; - float center_frequency; + qint64 center_frequency; QString* type; QString* name; };