From c91918840e9316fc7d4150be5d88815d00ab80f0 Mon Sep 17 00:00:00 2001 From: f4exb Date: Sat, 25 Nov 2017 20:14:16 +0100 Subject: [PATCH] Web API: /sdrangel/devicesets (GET) implementation --- sdrbase/resources/index.html | 8 +- sdrbase/webapi/webapiadapterinterface.cpp | 1 + sdrbase/webapi/webapiadapterinterface.h | 11 ++ sdrbase/webapi/webapirequestmapper.cpp | 25 ++++ sdrbase/webapi/webapirequestmapper.h | 1 + sdrgui/webapi/webapiadaptergui.cpp | 163 ++++++++++++---------- sdrgui/webapi/webapiadaptergui.h | 5 + swagger/sdrangel/api/swagger/swagger.yaml | 6 +- swagger/sdrangel/code/html2/index.html | 8 +- 9 files changed, 143 insertions(+), 85 deletions(-) diff --git a/sdrbase/resources/index.html b/sdrbase/resources/index.html index fd82e42d5..cb4e02a2d 100644 --- a/sdrbase/resources/index.html +++ b/sdrbase/resources/index.html @@ -2599,7 +2599,7 @@ except ApiException as e:

-

Remove last device set

+

Remove last device set except the first device


/sdrangel/devicesets
@@ -2836,7 +2836,7 @@ except ApiException as e: -

Status: 404 - No more device sets opened in this instance

+

Status: 404 - No more device sets to be deleted

@@ -3207,7 +3207,7 @@ except ApiException as e:

-

Add (append) a new device set

+

Add (append) a new device set with default values


/sdrangel/devicesets
@@ -7638,7 +7638,7 @@ except ApiException as e:
- Generated 2017-11-25T19:38:10.216+01:00 + Generated 2017-11-25T20:11:05.104+01:00
diff --git a/sdrbase/webapi/webapiadapterinterface.cpp b/sdrbase/webapi/webapiadapterinterface.cpp index d90d3776e..0f5807ea4 100644 --- a/sdrbase/webapi/webapiadapterinterface.cpp +++ b/sdrbase/webapi/webapiadapterinterface.cpp @@ -26,3 +26,4 @@ QString WebAPIAdapterInterface::instanceAudioURL = "/sdrangel/audio"; QString WebAPIAdapterInterface::instanceLocationURL = "/sdrangel/location"; QString WebAPIAdapterInterface::instanceDVSerialURL = "/sdrangel/dvserial"; QString WebAPIAdapterInterface::instancePresetURL = "/sdrangel/preset"; +QString WebAPIAdapterInterface::instanceDeviceSetsURL = "/sdrangel/devicesets"; diff --git a/sdrbase/webapi/webapiadapterinterface.h b/sdrbase/webapi/webapiadapterinterface.h index c8719e9bd..19884dc59 100644 --- a/sdrbase/webapi/webapiadapterinterface.h +++ b/sdrbase/webapi/webapiadapterinterface.h @@ -34,6 +34,7 @@ namespace Swagger class SWGPresets; class SWGPresetTransfer; class SWGPresetIdentifier; + class SWGDeviceSetList; class SWGErrorResponse; } @@ -183,6 +184,15 @@ public: Swagger::SWGErrorResponse& error __attribute__((unused))) { return 501; } + /** + * Handler of /sdrangel/preset (DELETE) swagger/sdrangel/code/html2/index.html#api-Default-instanceChannels + * returns the Http status code (default 501: not implemented) + */ + virtual int instanceDeviceSetsGet( + Swagger::SWGDeviceSetList& response __attribute__((unused)), + Swagger::SWGErrorResponse& error __attribute__((unused))) + { return 501; } + static QString instanceSummaryURL; static QString instanceDevicesURL; static QString instanceChannelsURL; @@ -191,6 +201,7 @@ public: static QString instanceLocationURL; static QString instanceDVSerialURL; static QString instancePresetURL; + static QString instanceDeviceSetsURL; }; diff --git a/sdrbase/webapi/webapirequestmapper.cpp b/sdrbase/webapi/webapirequestmapper.cpp index d16f24f7b..434ff3247 100644 --- a/sdrbase/webapi/webapirequestmapper.cpp +++ b/sdrbase/webapi/webapirequestmapper.cpp @@ -75,6 +75,8 @@ void WebAPIRequestMapper::service(qtwebapp::HttpRequest& request, qtwebapp::Http instanceDVSerialService(request, response); } else if (path == WebAPIAdapterInterface::instancePresetURL) { instancePresetService(request, response); + } else if (path == WebAPIAdapterInterface::instanceDeviceSetsURL) { + instanceDeviceSetsService(request, response); } else { @@ -469,6 +471,29 @@ void WebAPIRequestMapper::instancePresetService(qtwebapp::HttpRequest& request, } } +void WebAPIRequestMapper::instanceDeviceSetsService(qtwebapp::HttpRequest& request, qtwebapp::HttpResponse& response) +{ + Swagger::SWGErrorResponse errorResponse; + + if (request.getMethod() == "GET") + { + Swagger::SWGDeviceSetList normalResponse; + int status = m_adapter->instanceDeviceSetsGet(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"); + response.write("Invalid HTTP method"); + } +} + bool WebAPIRequestMapper::parseJsonBody(QString& jsonStr, qtwebapp::HttpResponse& response) { Swagger::SWGErrorResponse errorResponse; diff --git a/sdrbase/webapi/webapirequestmapper.h b/sdrbase/webapi/webapirequestmapper.h index 3b665b3c5..7e19455f6 100644 --- a/sdrbase/webapi/webapirequestmapper.h +++ b/sdrbase/webapi/webapirequestmapper.h @@ -53,6 +53,7 @@ private: void instanceLocationService(qtwebapp::HttpRequest& request, qtwebapp::HttpResponse& response); void instanceDVSerialService(qtwebapp::HttpRequest& request, qtwebapp::HttpResponse& response); void instancePresetService(qtwebapp::HttpRequest& request, qtwebapp::HttpResponse& response); + void instanceDeviceSetsService(qtwebapp::HttpRequest& request, qtwebapp::HttpResponse& response); bool validatePresetTransfer(Swagger::SWGPresetTransfer& presetTransfer); bool validatePresetIdentifer(Swagger::SWGPresetIdentifier& presetIdentifier); diff --git a/sdrgui/webapi/webapiadaptergui.cpp b/sdrgui/webapi/webapiadaptergui.cpp index 0d7ac0f8b..689c6692c 100644 --- a/sdrgui/webapi/webapiadaptergui.cpp +++ b/sdrgui/webapi/webapiadaptergui.cpp @@ -70,87 +70,16 @@ int WebAPIAdapterGUI::instanceSummary( Swagger::SWGLoggingInfo *logging = response.getLogging(); logging->init(); logging->setDumpToFile(m_mainWindow.m_logger->getUseFileLogger() ? 1 : 0); + if (logging->getDumpToFile()) { m_mainWindow.m_logger->getLogFileName(*logging->getFileName()); m_mainWindow.m_logger->getFileMinMessageLevelStr(*logging->getFileLevel()); } + m_mainWindow.m_logger->getConsoleMinMessageLevelStr(*logging->getConsoleLevel()); Swagger::SWGDeviceSetList *deviceSetList = response.getDevicesetlist(); - deviceSetList->init(); - deviceSetList->setDevicesetcount((int) m_mainWindow.m_deviceUIs.size()); - - std::vector::const_iterator it = m_mainWindow.m_deviceUIs.begin(); - - for (int i = 0; it != m_mainWindow.m_deviceUIs.end(); ++it, i++) - { - QList *deviceSet = deviceSetList->getDeviceSets(); - deviceSet->append(new Swagger::SWGDeviceSet()); - Swagger::SWGSamplingDevice *samplingDevice = deviceSet->back()->getSamplingDevice(); - samplingDevice->init(); - samplingDevice->setIndex(i); - samplingDevice->setTx((*it)->m_deviceSinkEngine != 0); - - if ((*it)->m_deviceSinkEngine) // Tx data - { - *samplingDevice->getHwType() = (*it)->m_deviceSinkAPI->getHardwareId(); - *samplingDevice->getSerial() = (*it)->m_deviceSinkAPI->getSampleSinkSerial(); - samplingDevice->setSequence((*it)->m_deviceSinkAPI->getSampleSinkSequence()); - samplingDevice->setNbStreams((*it)->m_deviceSinkAPI->getNbItems()); - samplingDevice->setStreamIndex((*it)->m_deviceSinkAPI->getItemIndex()); - (*it)->m_deviceSinkAPI->getDeviceEngineStateStr(*samplingDevice->getState()); - DeviceSampleSink *sampleSink = (*it)->m_deviceSinkEngine->getSink(); - - if (sampleSink) { - samplingDevice->setCenterFrequency(sampleSink->getCenterFrequency()); - samplingDevice->setBandwidth(sampleSink->getSampleRate()); - } - - deviceSet->back()->setChannelcount((*it)->m_deviceSinkAPI->getNbChannels()); - QList *channels = deviceSet->back()->getChannels(); - - for (int i = 0; i < deviceSet->back()->getChannelcount(); i++) - { - channels->append(new Swagger::SWGChannel); - ChannelSourceAPI *channel = (*it)->m_deviceSinkAPI->getChanelAPIAt(i); - channels->back()->setDeltaFrequency(channel->getDeltaFrequency()); - channels->back()->setIndex(channel->getIndexInDeviceSet()); - channels->back()->setUid(channel->getUID()); - channel->getIdentifier(*channels->back()->getId()); - channel->getTitle(*channels->back()->getTitle()); - } - } - - if ((*it)->m_deviceSourceEngine) // Rx data - { - *samplingDevice->getHwType() = (*it)->m_deviceSourceAPI->getHardwareId(); - *samplingDevice->getSerial() = (*it)->m_deviceSourceAPI->getSampleSourceSerial(); - samplingDevice->setSequence((*it)->m_deviceSourceAPI->getSampleSourceSequence()); - samplingDevice->setNbStreams((*it)->m_deviceSourceAPI->getNbItems()); - samplingDevice->setStreamIndex((*it)->m_deviceSourceAPI->getItemIndex()); - (*it)->m_deviceSourceAPI->getDeviceEngineStateStr(*samplingDevice->getState()); - DeviceSampleSource *sampleSource = (*it)->m_deviceSourceEngine->getSource(); - - if (sampleSource) { - samplingDevice->setCenterFrequency(sampleSource->getCenterFrequency()); - samplingDevice->setBandwidth(sampleSource->getSampleRate()); - } - - deviceSet->back()->setChannelcount((*it)->m_deviceSourceAPI->getNbChannels()); - QList *channels = deviceSet->back()->getChannels(); - - for (int i = 0; i < deviceSet->back()->getChannelcount(); i++) - { - channels->append(new Swagger::SWGChannel); - ChannelSinkAPI *channel = (*it)->m_deviceSourceAPI->getChanelAPIAt(i); - channels->back()->setDeltaFrequency(channel->getDeltaFrequency()); - channels->back()->setIndex(channel->getIndexInDeviceSet()); - channels->back()->setUid(channel->getUID()); - channel->getIdentifier(*channels->back()->getId()); - channel->getTitle(*channels->back()->getTitle()); - } - } - } + getDeviceSetList(deviceSetList); return 200; } @@ -614,6 +543,92 @@ int WebAPIAdapterGUI::instancePresetDelete( return 200; } +int WebAPIAdapterGUI::instanceDeviceSetsGet( + Swagger::SWGDeviceSetList& response, + Swagger::SWGErrorResponse& error __attribute__((unused))) +{ + getDeviceSetList(&response); + return 200; +} + +void WebAPIAdapterGUI::getDeviceSetList(Swagger::SWGDeviceSetList* deviceSetList) +{ + deviceSetList->init(); + deviceSetList->setDevicesetcount((int) m_mainWindow.m_deviceUIs.size()); + + std::vector::const_iterator it = m_mainWindow.m_deviceUIs.begin(); + + for (int i = 0; it != m_mainWindow.m_deviceUIs.end(); ++it, i++) + { + QList *deviceSet = deviceSetList->getDeviceSets(); + deviceSet->append(new Swagger::SWGDeviceSet()); + Swagger::SWGSamplingDevice *samplingDevice = deviceSet->back()->getSamplingDevice(); + samplingDevice->init(); + samplingDevice->setIndex(i); + samplingDevice->setTx((*it)->m_deviceSinkEngine != 0); + + if ((*it)->m_deviceSinkEngine) // Tx data + { + *samplingDevice->getHwType() = (*it)->m_deviceSinkAPI->getHardwareId(); + *samplingDevice->getSerial() = (*it)->m_deviceSinkAPI->getSampleSinkSerial(); + samplingDevice->setSequence((*it)->m_deviceSinkAPI->getSampleSinkSequence()); + samplingDevice->setNbStreams((*it)->m_deviceSinkAPI->getNbItems()); + samplingDevice->setStreamIndex((*it)->m_deviceSinkAPI->getItemIndex()); + (*it)->m_deviceSinkAPI->getDeviceEngineStateStr(*samplingDevice->getState()); + DeviceSampleSink *sampleSink = (*it)->m_deviceSinkEngine->getSink(); + + if (sampleSink) { + samplingDevice->setCenterFrequency(sampleSink->getCenterFrequency()); + samplingDevice->setBandwidth(sampleSink->getSampleRate()); + } + + deviceSet->back()->setChannelcount((*it)->m_deviceSinkAPI->getNbChannels()); + QList *channels = deviceSet->back()->getChannels(); + + for (int i = 0; i < deviceSet->back()->getChannelcount(); i++) + { + channels->append(new Swagger::SWGChannel); + ChannelSourceAPI *channel = (*it)->m_deviceSinkAPI->getChanelAPIAt(i); + channels->back()->setDeltaFrequency(channel->getDeltaFrequency()); + channels->back()->setIndex(channel->getIndexInDeviceSet()); + channels->back()->setUid(channel->getUID()); + channel->getIdentifier(*channels->back()->getId()); + channel->getTitle(*channels->back()->getTitle()); + } + } + + if ((*it)->m_deviceSourceEngine) // Rx data + { + *samplingDevice->getHwType() = (*it)->m_deviceSourceAPI->getHardwareId(); + *samplingDevice->getSerial() = (*it)->m_deviceSourceAPI->getSampleSourceSerial(); + samplingDevice->setSequence((*it)->m_deviceSourceAPI->getSampleSourceSequence()); + samplingDevice->setNbStreams((*it)->m_deviceSourceAPI->getNbItems()); + samplingDevice->setStreamIndex((*it)->m_deviceSourceAPI->getItemIndex()); + (*it)->m_deviceSourceAPI->getDeviceEngineStateStr(*samplingDevice->getState()); + DeviceSampleSource *sampleSource = (*it)->m_deviceSourceEngine->getSource(); + + if (sampleSource) { + samplingDevice->setCenterFrequency(sampleSource->getCenterFrequency()); + samplingDevice->setBandwidth(sampleSource->getSampleRate()); + } + + deviceSet->back()->setChannelcount((*it)->m_deviceSourceAPI->getNbChannels()); + QList *channels = deviceSet->back()->getChannels(); + + for (int i = 0; i < deviceSet->back()->getChannelcount(); i++) + { + channels->append(new Swagger::SWGChannel); + ChannelSinkAPI *channel = (*it)->m_deviceSourceAPI->getChanelAPIAt(i); + channels->back()->setDeltaFrequency(channel->getDeltaFrequency()); + channels->back()->setIndex(channel->getIndexInDeviceSet()); + channels->back()->setUid(channel->getUID()); + channel->getIdentifier(*channels->back()->getId()); + channel->getTitle(*channels->back()->getTitle()); + } + } + } +} + QtMsgType WebAPIAdapterGUI::getMsgTypeFromString(const QString& msgTypeString) { if (msgTypeString == "debug") { diff --git a/sdrgui/webapi/webapiadaptergui.h b/sdrgui/webapi/webapiadaptergui.h index 6417d36e4..60545731e 100644 --- a/sdrgui/webapi/webapiadaptergui.h +++ b/sdrgui/webapi/webapiadaptergui.h @@ -97,9 +97,14 @@ public: Swagger::SWGPresetIdentifier& response, Swagger::SWGErrorResponse& error); + virtual int instanceDeviceSetsGet( + Swagger::SWGDeviceSetList& response, + Swagger::SWGErrorResponse& error); + private: MainWindow& m_mainWindow; + void getDeviceSetList(Swagger::SWGDeviceSetList* deviceSetList); static QtMsgType getMsgTypeFromString(const QString& msgTypeString); static void getMsgTypeString(const QtMsgType& msgType, QString& level); }; diff --git a/swagger/sdrangel/api/swagger/swagger.yaml b/swagger/sdrangel/api/swagger/swagger.yaml index 93381715c..ca24a8358 100644 --- a/swagger/sdrangel/api/swagger/swagger.yaml +++ b/swagger/sdrangel/api/swagger/swagger.yaml @@ -392,7 +392,7 @@ paths: "501": description: Function not implemented post: - description: Add (append) a new device set + description: Add (append) a new device set with default values operationId: instanceDeviceSetsPost parameters: - name: tx @@ -412,7 +412,7 @@ paths: "501": description: Function not implemented delete: - description: "Remove last device set" + description: Remove last device set except the first device operationId: instanceDeviceSetsDelete responses: "200": @@ -420,7 +420,7 @@ paths: schema: $ref: "#/definitions/DeviceSetList" "404": - description: "No more device sets opened in this instance" + description: "No more device sets to be deleted" "500": description: Error schema: diff --git a/swagger/sdrangel/code/html2/index.html b/swagger/sdrangel/code/html2/index.html index fd82e42d5..cb4e02a2d 100644 --- a/swagger/sdrangel/code/html2/index.html +++ b/swagger/sdrangel/code/html2/index.html @@ -2599,7 +2599,7 @@ except ApiException as e:

-

Remove last device set

+

Remove last device set except the first device


/sdrangel/devicesets
@@ -2836,7 +2836,7 @@ except ApiException as e: -

Status: 404 - No more device sets opened in this instance

+

Status: 404 - No more device sets to be deleted

@@ -3207,7 +3207,7 @@ except ApiException as e:

-

Add (append) a new device set

+

Add (append) a new device set with default values


/sdrangel/devicesets
@@ -7638,7 +7638,7 @@ except ApiException as e:
- Generated 2017-11-25T19:38:10.216+01:00 + Generated 2017-11-25T20:11:05.104+01:00