mirror of
https://github.com/f4exb/sdrangel.git
synced 2026-06-20 22:59:41 -04:00
Feature plugins framework: REST API and server implementation
This commit is contained in:
@@ -48,6 +48,10 @@
|
||||
#include "SWGLimeRFEDevices.h"
|
||||
#include "SWGLimeRFESettings.h"
|
||||
#include "SWGLimeRFEPower.h"
|
||||
#include "SWGFeatureSetList.h"
|
||||
#include "SWGFeatureSettings.h"
|
||||
#include "SWGFeatureReport.h"
|
||||
#include "SWGFeatureActions.h"
|
||||
|
||||
#include "maincore.h"
|
||||
#include "loggerwithfile.h"
|
||||
@@ -62,6 +66,8 @@
|
||||
#include "dsp/dspdevicemimoengine.h"
|
||||
#include "dsp/dspengine.h"
|
||||
#include "channel/channelapi.h"
|
||||
#include "feature/featureset.h"
|
||||
#include "feature/feature.h"
|
||||
#include "plugin/pluginapi.h"
|
||||
#include "plugin/pluginmanager.h"
|
||||
#include "util/serialutil.h"
|
||||
@@ -1440,6 +1446,15 @@ int WebAPIAdapterSrv::instanceDeviceSetsGet(
|
||||
return 200;
|
||||
}
|
||||
|
||||
int WebAPIAdapterSrv::instanceFeatureSetsGet(
|
||||
SWGSDRangel::SWGFeatureSetList& response,
|
||||
SWGSDRangel::SWGErrorResponse& error)
|
||||
{
|
||||
(void) error;
|
||||
getFeatureSetList(&response);
|
||||
return 200;
|
||||
}
|
||||
|
||||
int WebAPIAdapterSrv::instanceDeviceSetPost(
|
||||
int direction,
|
||||
SWGSDRangel::SWGSuccessResponse& response,
|
||||
@@ -2882,6 +2897,352 @@ int WebAPIAdapterSrv::devicesetChannelSettingsPutPatch(
|
||||
}
|
||||
}
|
||||
|
||||
int WebAPIAdapterSrv::featuresetFeaturePost(
|
||||
int featureSetIndex,
|
||||
SWGSDRangel::SWGFeatureSettings& query,
|
||||
SWGSDRangel::SWGSuccessResponse& response,
|
||||
SWGSDRangel::SWGErrorResponse& error)
|
||||
{
|
||||
if ((featureSetIndex >= 0) && (featureSetIndex < (int) m_mainCore.m_featureSets.size()))
|
||||
{
|
||||
FeatureSet *featureSet = m_mainCore.m_featureSets[featureSetIndex];
|
||||
|
||||
PluginAPI::FeatureRegistrations *featureRegistrations = m_mainCore.m_pluginManager->getFeatureRegistrations();
|
||||
int nbRegistrations = featureRegistrations->size();
|
||||
int index = 0;
|
||||
|
||||
for (; index < nbRegistrations; index++)
|
||||
{
|
||||
if (featureRegistrations->at(index).m_featureId == *query.getFeatureType()) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (index < nbRegistrations)
|
||||
{
|
||||
MainCore::MsgAddFeature *msg = MainCore::MsgAddFeature::create(featureSetIndex, index);
|
||||
m_mainCore.m_inputMessageQueue.push(msg);
|
||||
|
||||
response.init();
|
||||
*response.getMessage() = QString("Message to add a feature (MsgAddFeature) was submitted successfully");
|
||||
|
||||
return 202;
|
||||
}
|
||||
else
|
||||
{
|
||||
error.init();
|
||||
*error.getMessage() = QString("There is no feature with id %1").arg(*query.getFeatureType());
|
||||
return 404;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
error.init();
|
||||
*error.getMessage() = QString("There is no feature set with index %1").arg(featureSetIndex);
|
||||
return 404;
|
||||
}
|
||||
}
|
||||
|
||||
int WebAPIAdapterSrv::featuresetFeatureDelete(
|
||||
int featureSetIndex,
|
||||
int featureIndex,
|
||||
SWGSDRangel::SWGSuccessResponse& response,
|
||||
SWGSDRangel::SWGErrorResponse& error)
|
||||
{
|
||||
if ((featureSetIndex >= 0) && (featureSetIndex < (int) m_mainCore.m_featureSets.size()))
|
||||
{
|
||||
FeatureSet *featureSet = m_mainCore.m_featureSets[featureSetIndex];
|
||||
|
||||
if (featureIndex < featureSet->getNumberOfFeatures())
|
||||
{
|
||||
MainCore::MsgDeleteFeature *msg = MainCore::MsgDeleteFeature::create(featureSetIndex, featureIndex);
|
||||
m_mainCore.m_inputMessageQueue.push(msg);
|
||||
|
||||
response.init();
|
||||
*response.getMessage() = QString("Message to delete a feature (MsgDeleteFeature) was submitted successfully");
|
||||
|
||||
return 202;
|
||||
}
|
||||
else
|
||||
{
|
||||
error.init();
|
||||
*error.getMessage() = QString("There is no feature at index %1. %2 feature(s) left")
|
||||
.arg(featureIndex)
|
||||
.arg(featureSet->getNumberOfFeatures());
|
||||
return 400;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
error.init();
|
||||
*error.getMessage() = QString("There is no device set with index %1").arg(featureSetIndex);
|
||||
return 404;
|
||||
}
|
||||
}
|
||||
|
||||
int WebAPIAdapterSrv::featuresetFeatureRunGet(
|
||||
int featureSetIndex,
|
||||
int featureIndex,
|
||||
SWGSDRangel::SWGDeviceState& response,
|
||||
SWGSDRangel::SWGErrorResponse& error)
|
||||
{
|
||||
if ((featureSetIndex >= 0) && (featureSetIndex < (int) m_mainCore.m_featureSets.size()))
|
||||
{
|
||||
FeatureSet *featureSet = m_mainCore.m_featureSets[featureSetIndex];
|
||||
|
||||
if (featureIndex < featureSet->getNumberOfFeatures())
|
||||
{
|
||||
response.init();
|
||||
const Feature *feature = featureSet->getFeatureAt(featureIndex);
|
||||
return feature->webapiRunGet(response, *error.getMessage());
|
||||
}
|
||||
else
|
||||
{
|
||||
error.init();
|
||||
*error.getMessage() = QString("There is no feature at index %1. %2 feature(s) left")
|
||||
.arg(featureIndex)
|
||||
.arg(featureSet->getNumberOfFeatures());
|
||||
return 400;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
error.init();
|
||||
*error.getMessage() = QString("There is no feature set with index %1").arg(featureSetIndex);
|
||||
return 404;
|
||||
}
|
||||
}
|
||||
|
||||
int WebAPIAdapterSrv::featuresetFeatureRunPost(
|
||||
int featureSetIndex,
|
||||
int featureIndex,
|
||||
SWGSDRangel::SWGDeviceState& response,
|
||||
SWGSDRangel::SWGErrorResponse& error)
|
||||
{
|
||||
if ((featureSetIndex >= 0) && (featureSetIndex < (int) m_mainCore.m_featureSets.size()))
|
||||
{
|
||||
FeatureSet *featureSet = m_mainCore.m_featureSets[featureSetIndex];
|
||||
|
||||
if (featureIndex < featureSet->getNumberOfFeatures())
|
||||
{
|
||||
response.init();
|
||||
Feature *feature = featureSet->getFeatureAt(featureIndex);
|
||||
return feature->webapiRun(true, response, *error.getMessage());
|
||||
}
|
||||
else
|
||||
{
|
||||
error.init();
|
||||
*error.getMessage() = QString("There is no feature at index %1. %2 feature(s) left")
|
||||
.arg(featureIndex)
|
||||
.arg(featureSet->getNumberOfFeatures());
|
||||
return 400;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
error.init();
|
||||
*error.getMessage() = QString("There is no feature set with index %1").arg(featureSetIndex);
|
||||
return 404;
|
||||
}
|
||||
}
|
||||
|
||||
int WebAPIAdapterSrv::featuresetFeatureRunDelete(
|
||||
int featureSetIndex,
|
||||
int featureIndex,
|
||||
SWGSDRangel::SWGDeviceState& response,
|
||||
SWGSDRangel::SWGErrorResponse& error)
|
||||
{
|
||||
if ((featureSetIndex >= 0) && (featureSetIndex < (int) m_mainCore.m_featureSets.size()))
|
||||
{
|
||||
FeatureSet *featureSet = m_mainCore.m_featureSets[featureSetIndex];
|
||||
|
||||
if (featureIndex < featureSet->getNumberOfFeatures())
|
||||
{
|
||||
response.init();
|
||||
Feature *feature = featureSet->getFeatureAt(featureIndex);
|
||||
return feature->webapiRun(false, response, *error.getMessage());
|
||||
}
|
||||
else
|
||||
{
|
||||
error.init();
|
||||
*error.getMessage() = QString("There is no feature at index %1. %2 feature(s) left")
|
||||
.arg(featureIndex)
|
||||
.arg(featureSet->getNumberOfFeatures());
|
||||
return 400;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
error.init();
|
||||
*error.getMessage() = QString("There is no feature set with index %1").arg(featureSetIndex);
|
||||
return 404;
|
||||
}
|
||||
}
|
||||
|
||||
int WebAPIAdapterSrv::featuresetFeatureSettingsGet(
|
||||
int featureSetIndex,
|
||||
int featureIndex,
|
||||
SWGSDRangel::SWGFeatureSettings& response,
|
||||
SWGSDRangel::SWGErrorResponse& error)
|
||||
{
|
||||
error.init();
|
||||
|
||||
if ((featureSetIndex >= 0) && (featureSetIndex < (int) m_mainCore.m_featureSets.size()))
|
||||
{
|
||||
FeatureSet *featureSet = m_mainCore.m_featureSets[featureSetIndex];
|
||||
Feature *feature = featureSet->getFeatureAt(featureIndex);
|
||||
|
||||
if (feature)
|
||||
{
|
||||
response.setFeatureType(new QString());
|
||||
feature->getIdentifier(*response.getFeatureType());
|
||||
return feature->webapiSettingsGet(response, *error.getMessage());
|
||||
}
|
||||
else
|
||||
{
|
||||
*error.getMessage() = QString("There is no feature with index %1").arg(featureIndex);
|
||||
return 404;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
*error.getMessage() = QString("There is no feature set with index %1").arg(featureSetIndex);
|
||||
return 404;
|
||||
}
|
||||
}
|
||||
|
||||
int WebAPIAdapterSrv::featuresetFeatureSettingsPutPatch(
|
||||
int featureSetIndex,
|
||||
int featureIndex,
|
||||
bool force,
|
||||
const QStringList& featureSettingsKeys,
|
||||
SWGSDRangel::SWGFeatureSettings& response,
|
||||
SWGSDRangel::SWGErrorResponse& error)
|
||||
{
|
||||
error.init();
|
||||
|
||||
if ((featureSetIndex >= 0) && (featureSetIndex < (int) m_mainCore.m_featureSets.size()))
|
||||
{
|
||||
FeatureSet *featureSet = m_mainCore.m_featureSets[featureSetIndex];
|
||||
Feature *feature = featureSet->getFeatureAt(featureIndex);
|
||||
|
||||
if (feature)
|
||||
{
|
||||
QString featureType;
|
||||
feature->getIdentifier(featureType);
|
||||
|
||||
if (featureType == *response.getFeatureType())
|
||||
{
|
||||
return feature->webapiSettingsPutPatch(force, featureSettingsKeys, response, *error.getMessage());
|
||||
}
|
||||
else
|
||||
{
|
||||
*error.getMessage() = QString("There is no feature type %1 at index %2. Found %3.")
|
||||
.arg(*response.getFeatureType())
|
||||
.arg(featureIndex)
|
||||
.arg(featureType);
|
||||
return 404;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
*error.getMessage() = QString("There is no feature with index %1").arg(featureIndex);
|
||||
return 404;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
*error.getMessage() = QString("There is no feature set with index %1").arg(featureSetIndex);
|
||||
return 404;
|
||||
}
|
||||
}
|
||||
|
||||
int WebAPIAdapterSrv::featuresetFeatureReportGet(
|
||||
int featureSetIndex,
|
||||
int featureIndex,
|
||||
SWGSDRangel::SWGFeatureReport& response,
|
||||
SWGSDRangel::SWGErrorResponse& error)
|
||||
{
|
||||
error.init();
|
||||
|
||||
if ((featureSetIndex >= 0) && (featureSetIndex < (int) m_mainCore.m_featureSets.size()))
|
||||
{
|
||||
FeatureSet *featureSet = m_mainCore.m_featureSets[featureSetIndex];
|
||||
Feature *feature = featureSet->getFeatureAt(featureIndex);
|
||||
|
||||
if (feature)
|
||||
{
|
||||
response.setFeatureType(new QString());
|
||||
feature->getIdentifier(*response.getFeatureType());
|
||||
return feature->webapiReportGet(response, *error.getMessage());
|
||||
}
|
||||
else
|
||||
{
|
||||
*error.getMessage() = QString("There is no feature with index %1").arg(featureIndex);
|
||||
return 404;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
*error.getMessage() = QString("There is no feature set with index %1").arg(featureIndex);
|
||||
return 404;
|
||||
}
|
||||
}
|
||||
|
||||
int WebAPIAdapterSrv::featuresetFeatureActionsPost(
|
||||
int featureSetIndex,
|
||||
int featureIndex,
|
||||
const QStringList& featureActionsKeys,
|
||||
SWGSDRangel::SWGFeatureActions& query,
|
||||
SWGSDRangel::SWGSuccessResponse& response,
|
||||
SWGSDRangel::SWGErrorResponse& error)
|
||||
{
|
||||
error.init();
|
||||
|
||||
if ((featureSetIndex >= 0) && (featureSetIndex < (int) m_mainCore.m_featureSets.size()))
|
||||
{
|
||||
FeatureSet *featureSet = m_mainCore.m_featureSets[featureSetIndex];
|
||||
Feature *feature = featureSet->getFeatureAt(featureIndex);
|
||||
|
||||
if (feature)
|
||||
{
|
||||
QString featureType;
|
||||
feature->getIdentifier(featureType);
|
||||
|
||||
if (featureType == *query.getFeatureType())
|
||||
{
|
||||
int res = feature->webapiActionsPost(featureActionsKeys, query, *error.getMessage());
|
||||
|
||||
if (res/100 == 2)
|
||||
{
|
||||
response.init();
|
||||
*response.getMessage() = QString("Message to post action was submitted successfully");
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
else
|
||||
{
|
||||
*error.getMessage() = QString("There is no feature type %1 at index %2. Found %3.")
|
||||
.arg(*query.getFeatureType())
|
||||
.arg(featureIndex)
|
||||
.arg(featureType);
|
||||
return 404;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
*error.getMessage() = QString("There is no feature with index %1").arg(featureIndex);
|
||||
return 404;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
*error.getMessage() = QString("There is no feature set with index %1").arg(featureIndex);
|
||||
return 404;
|
||||
}
|
||||
}
|
||||
|
||||
void WebAPIAdapterSrv::getDeviceSetList(SWGSDRangel::SWGDeviceSetList* deviceSetList)
|
||||
{
|
||||
deviceSetList->init();
|
||||
@@ -3170,6 +3531,63 @@ void WebAPIAdapterSrv::getChannelsDetail(SWGSDRangel::SWGChannelsDetail *channel
|
||||
}
|
||||
}
|
||||
|
||||
int WebAPIAdapterSrv::featuresetGet(
|
||||
int featureSetIndex,
|
||||
SWGSDRangel::SWGFeatureSet& response,
|
||||
SWGSDRangel::SWGErrorResponse& error)
|
||||
{
|
||||
if ((featureSetIndex >= 0) && (featureSetIndex < (int) m_mainCore.m_featureSets.size()))
|
||||
{
|
||||
const FeatureSet *featureSet = m_mainCore.m_featureSets[featureSetIndex];
|
||||
getFeatureSet(&response, featureSet, featureSetIndex);
|
||||
|
||||
return 200;
|
||||
}
|
||||
else
|
||||
{
|
||||
error.init();
|
||||
*error.getMessage() = QString("There is no feature set with index %1").arg(featureSetIndex);
|
||||
|
||||
return 404;
|
||||
}
|
||||
}
|
||||
|
||||
void WebAPIAdapterSrv::getFeatureSetList(SWGSDRangel::SWGFeatureSetList* featureSetList)
|
||||
{
|
||||
featureSetList->init();
|
||||
featureSetList->setFeaturesetcount((int) m_mainCore.m_featureSets.size());
|
||||
|
||||
std::vector<FeatureSet*>::const_iterator it = m_mainCore.m_featureSets.begin();
|
||||
|
||||
for (int i = 0; it != m_mainCore.m_featureSets.end(); ++it, i++)
|
||||
{
|
||||
QList<SWGSDRangel::SWGFeatureSet*> *featureSets = featureSetList->getFeatureSets();
|
||||
featureSets->append(new SWGSDRangel::SWGFeatureSet());
|
||||
|
||||
getFeatureSet(featureSets->back(), *it, i);
|
||||
}
|
||||
}
|
||||
|
||||
void WebAPIAdapterSrv::getFeatureSet(SWGSDRangel::SWGFeatureSet *swgFeatureSet, const FeatureSet* featureSet, int featureSetIndex)
|
||||
{
|
||||
swgFeatureSet->init();
|
||||
swgFeatureSet->setFeaturecount(featureSet->getNumberOfFeatures());
|
||||
QList<SWGSDRangel::SWGFeature*> *features = swgFeatureSet->getFeatures();
|
||||
|
||||
for (int i = 0; i < featureSet->getNumberOfFeatures(); i++)
|
||||
{
|
||||
const Feature *feature = featureSet->getFeatureAt(i);
|
||||
features->append(new SWGSDRangel::SWGFeature);
|
||||
features->back()->setIndex(i);
|
||||
QString s;
|
||||
feature->getTitle(s);
|
||||
features->back()->setTitle(new QString(s));
|
||||
feature->getIdentifier(s);
|
||||
features->back()->setId(new QString(s));
|
||||
features->back()->setUid(feature->getUID());
|
||||
}
|
||||
}
|
||||
|
||||
QtMsgType WebAPIAdapterSrv::getMsgTypeFromString(const QString& msgTypeString)
|
||||
{
|
||||
if (msgTypeString == "debug") {
|
||||
|
||||
Reference in New Issue
Block a user