mirror of
https://github.com/hyperion-project/hyperion.ng.git
synced 2025-03-01 10:33:28 +00:00
Support direct or multiple instance addressing via single requests
This commit is contained in:
parent
e01e3e70a0
commit
722d6d7ad5
@ -17,7 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
**JSON-API**
|
**JSON-API**
|
||||||
- New subscription support for event updates, i.e. `Suspend, Resume, Idle, idleResume, Restart, Quit`.
|
- New subscription support for event updates, i.e. `Suspend, Resume, Idle, idleResume, Restart, Quit`.
|
||||||
- Support direct instance addressing via individual requests (#809)
|
- Support direct or multiple instance addressing via single requests (#809)
|
||||||
- Support of `serverinfo` subcommands: `getInfo, subscribe, unsubscribe, getSubscriptions, getSubscriptionCommands`
|
- Support of `serverinfo` subcommands: `getInfo, subscribe, unsubscribe, getSubscriptions, getSubscriptionCommands`
|
||||||
- [Overview](https://github.com/hyperion-project/hyperion.ng/blob/API_Auth/doc/development/JSON-API%20_Commands_Overview.md) of API commands and subscription updates
|
- [Overview](https://github.com/hyperion-project/hyperion.ng/blob/API_Auth/doc/development/JSON-API%20_Commands_Overview.md) of API commands and subscription updates
|
||||||
|
|
||||||
|
@ -13,6 +13,7 @@ _Authorization (via password or bearer token)_
|
|||||||
_Instance specific_
|
_Instance specific_
|
||||||
|
|
||||||
**Yes** - A specific instance can be addressed<br>
|
**Yes** - A specific instance can be addressed<br>
|
||||||
|
**Multi** - Multiple instances can be addressed via one request<br>
|
||||||
**No** - The command is not instance related
|
**No** - The command is not instance related
|
||||||
|
|
||||||
_http/s Support_
|
_http/s Support_
|
||||||
@ -20,9 +21,9 @@ _http/s Support_
|
|||||||
**Yes** - Command can be used by individual http/s requests<br>
|
**Yes** - Command can be used by individual http/s requests<br>
|
||||||
**No** - Applies only to WebSocket or http/s sessions
|
**No** - Applies only to WebSocket or http/s sessions
|
||||||
|
|
||||||
| Command | Sub-Command | Authorization | Instance specifc | http/s Support |
|
| Command | Sub-Command | Authorization | Instance specific | http/s Support |
|
||||||
|:---------------|-------------------------|:--------------|:-----------------|:---------------|
|
|:---------------|:------------------------|:--------------|:------------------|:---------------|
|
||||||
| adjustment | - | Yes | Yes | Yes |
|
| adjustment | - | Yes | Multi | Yes |
|
||||||
| authorize | adminRequired | No | No | Yes |
|
| authorize | adminRequired | No | No | Yes |
|
||||||
| authorize | answerRequest | Admin | No | No |
|
| authorize | answerRequest | Admin | No | No |
|
||||||
| authorize | createToken | Admin | No | No |
|
| authorize | createToken | Admin | No | No |
|
||||||
@ -36,10 +37,10 @@ _http/s Support_
|
|||||||
| authorize | renameToken | Admin | No | Yes |
|
| authorize | renameToken | Admin | No | Yes |
|
||||||
| authorize | requestToken | No | No | Yes |
|
| authorize | requestToken | No | No | Yes |
|
||||||
| authorize | tokenRequired | No | No | Yes |
|
| authorize | tokenRequired | No | No | Yes |
|
||||||
| clear | - | Yes | Yes | Yes |
|
| clear | - | Yes | Multi | Yes |
|
||||||
| clearall | - | Yes | Yes | Yes |
|
| clearall | - | Yes | Multi | Yes |
|
||||||
| color | - | Yes | Yes | Yes |
|
| color | - | Yes | Multi | Yes |
|
||||||
| componentstate | - | Yes | Yes | Yes |
|
| componentstate | - | Yes | Multi | Yes |
|
||||||
| config | getconfig | Admin | Yes | Yes |
|
| config | getconfig | Admin | Yes | Yes |
|
||||||
| config | getschema | Admin | Yes | Yes |
|
| config | getschema | Admin | Yes | Yes |
|
||||||
| config | reload | Admin | Yes | Yes |
|
| config | reload | Admin | Yes | Yes |
|
||||||
@ -48,8 +49,8 @@ _http/s Support_
|
|||||||
| correction | - | Yes | Yes | Yes |
|
| correction | - | Yes | Yes | Yes |
|
||||||
| create-effect | - | Yes | Yes | Yes |
|
| create-effect | - | Yes | Yes | Yes |
|
||||||
| delete-effect | - | Yes | Yes | Yes |
|
| delete-effect | - | Yes | Yes | Yes |
|
||||||
| effect | - | Yes | Yes | Yes |
|
| effect | - | Yes | Multi | Yes |
|
||||||
| image | - | Yes | Yes | Yes |
|
| image | - | Yes | Multi | Yes |
|
||||||
| inputsource | discover | Yes | No | Yes |
|
| inputsource | discover | Yes | No | Yes |
|
||||||
| inputsource | getProperties | Yes | No | Yes |
|
| inputsource | getProperties | Yes | No | Yes |
|
||||||
| instance | createInstance | Admin | No | Yes |
|
| instance | createInstance | Admin | No | Yes |
|
||||||
@ -68,7 +69,7 @@ _http/s Support_
|
|||||||
| leddevice | identify | Yes | Yes | Yes |
|
| leddevice | identify | Yes | Yes | Yes |
|
||||||
| logging | start | Yes | No | Yes |
|
| logging | start | Yes | No | Yes |
|
||||||
| logging | stop | Yes | No | Yes |
|
| logging | stop | Yes | No | Yes |
|
||||||
| processing | - | Yes | Yes | Yes |
|
| processing | - | Yes | Multi | Yes |
|
||||||
| serverinfo | - | Yes | Yes | Yes |
|
| serverinfo | - | Yes | Yes | Yes |
|
||||||
| serverinfo | getInfo | Yes | Yes | Yes |
|
| serverinfo | getInfo | Yes | Yes | Yes |
|
||||||
| serverinfo | subscribe | Yes | Yes | No |
|
| serverinfo | subscribe | Yes | Yes | No |
|
||||||
@ -76,7 +77,7 @@ _http/s Support_
|
|||||||
| serverinfo | getSubscriptions | Yes | Yes | No |
|
| serverinfo | getSubscriptions | Yes | Yes | No |
|
||||||
| serverinfo | getSubscriptionCommands | No | No | No |
|
| serverinfo | getSubscriptionCommands | No | No | No |
|
||||||
| service | discover | Yes | No | Yes |
|
| service | discover | Yes | No | Yes |
|
||||||
| sourceselect | - | Yes | No | Yes |
|
| sourceselect | - | Yes | Multi | Yes |
|
||||||
| sysinfo | - | Yes | No | Yes |
|
| sysinfo | - | Yes | No | Yes |
|
||||||
| system | restart | Yes | No | Yes |
|
| system | restart | Yes | No | Yes |
|
||||||
| system | resume | Yes | No | Yes |
|
| system | resume | Yes | No | Yes |
|
||||||
|
@ -176,6 +176,12 @@ protected:
|
|||||||
///
|
///
|
||||||
QVector<QVariantMap> getAllInstanceData() const;
|
QVector<QVariantMap> getAllInstanceData() const;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// @brief Get the current instances index
|
||||||
|
/// @return The instance index set
|
||||||
|
///
|
||||||
|
quint8 getCurrentInstanceIndex() const { return _currInstanceIndex; }
|
||||||
|
|
||||||
///
|
///
|
||||||
/// @brief Start instance
|
/// @brief Start instance
|
||||||
/// @param index The instance index
|
/// @param index The instance index
|
||||||
|
@ -308,6 +308,8 @@ private:
|
|||||||
void handleLedDeviceIdentify(LedDevice& ledDevice, const QJsonObject& message, const JsonApiCommand& cmd);
|
void handleLedDeviceIdentify(LedDevice& ledDevice, const QJsonObject& message, const JsonApiCommand& cmd);
|
||||||
void handleLedDeviceAddAuthorization(LedDevice& ledDevice, const QJsonObject& message, const JsonApiCommand& cmd);
|
void handleLedDeviceAddAuthorization(LedDevice& ledDevice, const QJsonObject& message, const JsonApiCommand& cmd);
|
||||||
|
|
||||||
|
QJsonObject getBasicCommandReply(bool success, const QString &command, int tan, InstanceCmd::Type isInstanceCmd) const;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Send a standard reply indicating success
|
/// Send a standard reply indicating success
|
||||||
///
|
///
|
||||||
|
@ -196,7 +196,8 @@ class InstanceCmd {
|
|||||||
public:
|
public:
|
||||||
enum Type {
|
enum Type {
|
||||||
No,
|
No,
|
||||||
Yes
|
Yes,
|
||||||
|
Multi
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -227,7 +228,7 @@ public:
|
|||||||
|
|
||||||
Command::Type getCommand() const { return command; }
|
Command::Type getCommand() const { return command; }
|
||||||
SubCommand::Type getSubCommand() const { return subCommand; }
|
SubCommand::Type getSubCommand() const { return subCommand; }
|
||||||
InstanceCmd::Type instanceCmd() const { return isInstanceCmd; };
|
InstanceCmd::Type instanceCmd() const { return isInstanceCmd; }
|
||||||
int getTan() const { return tan; }
|
int getTan() const { return tan; }
|
||||||
|
|
||||||
QString toString() const {
|
QString toString() const {
|
||||||
@ -254,7 +255,7 @@ public:
|
|||||||
|
|
||||||
static const CommandLookupMap& getCommandLookup() {
|
static const CommandLookupMap& getCommandLookup() {
|
||||||
static const CommandLookupMap commandLookup {
|
static const CommandLookupMap commandLookup {
|
||||||
{ {"adjustment", ""}, { Command::Adjustment, SubCommand::Empty, Authorization::Yes, InstanceCmd::Yes, NoListenerCmd::Yes} },
|
{ {"adjustment", ""}, { Command::Adjustment, SubCommand::Empty, Authorization::Yes, InstanceCmd::Multi, NoListenerCmd::Yes} },
|
||||||
{ {"authorize", "adminRequired"}, { Command::Authorize, SubCommand::AdminRequired, Authorization::No, InstanceCmd::No, NoListenerCmd::Yes} },
|
{ {"authorize", "adminRequired"}, { Command::Authorize, SubCommand::AdminRequired, Authorization::No, InstanceCmd::No, NoListenerCmd::Yes} },
|
||||||
{ {"authorize", "answerRequest"}, { Command::Authorize, SubCommand::AnswerRequest, Authorization::Admin, InstanceCmd::No, NoListenerCmd::No} },
|
{ {"authorize", "answerRequest"}, { Command::Authorize, SubCommand::AnswerRequest, Authorization::Admin, InstanceCmd::No, NoListenerCmd::No} },
|
||||||
{ {"authorize", "createToken"}, { Command::Authorize, SubCommand::CreateToken, Authorization::Admin, InstanceCmd::No, NoListenerCmd::No} },
|
{ {"authorize", "createToken"}, { Command::Authorize, SubCommand::CreateToken, Authorization::Admin, InstanceCmd::No, NoListenerCmd::No} },
|
||||||
@ -268,10 +269,10 @@ public:
|
|||||||
{ {"authorize", "renameToken"}, { Command::Authorize, SubCommand::RenameToken, Authorization::Admin, InstanceCmd::No, NoListenerCmd::Yes} },
|
{ {"authorize", "renameToken"}, { Command::Authorize, SubCommand::RenameToken, Authorization::Admin, InstanceCmd::No, NoListenerCmd::Yes} },
|
||||||
{ {"authorize", "requestToken"}, { Command::Authorize, SubCommand::RequestToken, Authorization::No, InstanceCmd::No, NoListenerCmd::Yes} },
|
{ {"authorize", "requestToken"}, { Command::Authorize, SubCommand::RequestToken, Authorization::No, InstanceCmd::No, NoListenerCmd::Yes} },
|
||||||
{ {"authorize", "tokenRequired"}, { Command::Authorize, SubCommand::TokenRequired, Authorization::No, InstanceCmd::No, NoListenerCmd::Yes} },
|
{ {"authorize", "tokenRequired"}, { Command::Authorize, SubCommand::TokenRequired, Authorization::No, InstanceCmd::No, NoListenerCmd::Yes} },
|
||||||
{ {"clear", ""}, { Command::Clear, SubCommand::Empty, Authorization::Yes, InstanceCmd::Yes, NoListenerCmd::Yes} },
|
{ {"clear", ""}, { Command::Clear, SubCommand::Empty, Authorization::Yes, InstanceCmd::Multi, NoListenerCmd::Yes} },
|
||||||
{ {"clearall", ""}, { Command::ClearAll, SubCommand::Empty, Authorization::Yes, InstanceCmd::Yes, NoListenerCmd::Yes} },
|
{ {"clearall", ""}, { Command::ClearAll, SubCommand::Empty, Authorization::Yes, InstanceCmd::Multi, NoListenerCmd::Yes} },
|
||||||
{ {"color", ""}, { Command::Color, SubCommand::Empty, Authorization::Yes, InstanceCmd::Yes, NoListenerCmd::Yes} },
|
{ {"color", ""}, { Command::Color, SubCommand::Empty, Authorization::Yes, InstanceCmd::Multi, NoListenerCmd::Yes} },
|
||||||
{ {"componentstate", ""}, { Command::ComponentState, SubCommand::Empty, Authorization::Yes, InstanceCmd::Yes, NoListenerCmd::Yes} },
|
{ {"componentstate", ""}, { Command::ComponentState, SubCommand::Empty, Authorization::Yes, InstanceCmd::Multi, NoListenerCmd::Yes} },
|
||||||
{ {"config", "getconfig"}, { Command::Config, SubCommand::GetConfig, Authorization::Admin, InstanceCmd::Yes, NoListenerCmd::Yes} },
|
{ {"config", "getconfig"}, { Command::Config, SubCommand::GetConfig, Authorization::Admin, InstanceCmd::Yes, NoListenerCmd::Yes} },
|
||||||
{ {"config", "getschema"}, { Command::Config, SubCommand::GetSchema, Authorization::Admin, InstanceCmd::Yes, NoListenerCmd::Yes} },
|
{ {"config", "getschema"}, { Command::Config, SubCommand::GetSchema, Authorization::Admin, InstanceCmd::Yes, NoListenerCmd::Yes} },
|
||||||
{ {"config", "reload"}, { Command::Config, SubCommand::Reload, Authorization::Admin, InstanceCmd::Yes, NoListenerCmd::Yes} },
|
{ {"config", "reload"}, { Command::Config, SubCommand::Reload, Authorization::Admin, InstanceCmd::Yes, NoListenerCmd::Yes} },
|
||||||
@ -280,8 +281,8 @@ public:
|
|||||||
{ {"correction", ""}, { Command::Correction, SubCommand::Empty, Authorization::Yes, InstanceCmd::Yes, NoListenerCmd::Yes} },
|
{ {"correction", ""}, { Command::Correction, SubCommand::Empty, Authorization::Yes, InstanceCmd::Yes, NoListenerCmd::Yes} },
|
||||||
{ {"create-effect", ""}, { Command::CreateEffect, SubCommand::Empty, Authorization::Yes, InstanceCmd::Yes, NoListenerCmd::Yes} },
|
{ {"create-effect", ""}, { Command::CreateEffect, SubCommand::Empty, Authorization::Yes, InstanceCmd::Yes, NoListenerCmd::Yes} },
|
||||||
{ {"delete-effect", ""}, { Command::DeleteEffect, SubCommand::Empty, Authorization::Yes, InstanceCmd::Yes, NoListenerCmd::Yes} },
|
{ {"delete-effect", ""}, { Command::DeleteEffect, SubCommand::Empty, Authorization::Yes, InstanceCmd::Yes, NoListenerCmd::Yes} },
|
||||||
{ {"effect", ""}, { Command::Effect, SubCommand::Empty, Authorization::Yes, InstanceCmd::Yes, NoListenerCmd::Yes} },
|
{ {"effect", ""}, { Command::Effect, SubCommand::Empty, Authorization::Yes, InstanceCmd::Multi, NoListenerCmd::Yes} },
|
||||||
{ {"image", ""}, { Command::Image, SubCommand::Empty, Authorization::Yes, InstanceCmd::Yes, NoListenerCmd::Yes} },
|
{ {"image", ""}, { Command::Image, SubCommand::Empty, Authorization::Yes, InstanceCmd::Multi, NoListenerCmd::Yes} },
|
||||||
{ {"inputsource", "discover"}, { Command::InputSource, SubCommand::Discover, Authorization::Yes, InstanceCmd::No, NoListenerCmd::Yes} },
|
{ {"inputsource", "discover"}, { Command::InputSource, SubCommand::Discover, Authorization::Yes, InstanceCmd::No, NoListenerCmd::Yes} },
|
||||||
{ {"inputsource", "getProperties"}, { Command::InputSource, SubCommand::GetProperties, Authorization::Yes, InstanceCmd::No, NoListenerCmd::Yes} },
|
{ {"inputsource", "getProperties"}, { Command::InputSource, SubCommand::GetProperties, Authorization::Yes, InstanceCmd::No, NoListenerCmd::Yes} },
|
||||||
{ {"instance", "createInstance"}, { Command::Instance, SubCommand::CreateInstance, Authorization::Admin, InstanceCmd::No, NoListenerCmd::Yes} },
|
{ {"instance", "createInstance"}, { Command::Instance, SubCommand::CreateInstance, Authorization::Admin, InstanceCmd::No, NoListenerCmd::Yes} },
|
||||||
@ -300,7 +301,7 @@ public:
|
|||||||
{ {"leddevice", "identify"}, { Command::LedDevice, SubCommand::Identify, Authorization::Yes, InstanceCmd::Yes, NoListenerCmd::Yes} },
|
{ {"leddevice", "identify"}, { Command::LedDevice, SubCommand::Identify, Authorization::Yes, InstanceCmd::Yes, NoListenerCmd::Yes} },
|
||||||
{ {"logging", "start"}, { Command::Logging, SubCommand::Start, Authorization::Yes, InstanceCmd::No, NoListenerCmd::Yes} },
|
{ {"logging", "start"}, { Command::Logging, SubCommand::Start, Authorization::Yes, InstanceCmd::No, NoListenerCmd::Yes} },
|
||||||
{ {"logging", "stop"}, { Command::Logging, SubCommand::Stop, Authorization::Yes, InstanceCmd::No, NoListenerCmd::Yes} },
|
{ {"logging", "stop"}, { Command::Logging, SubCommand::Stop, Authorization::Yes, InstanceCmd::No, NoListenerCmd::Yes} },
|
||||||
{ {"processing", ""}, { Command::Processing, SubCommand::Empty, Authorization::Yes, InstanceCmd::Yes, NoListenerCmd::Yes} },
|
{ {"processing", ""}, { Command::Processing, SubCommand::Empty, Authorization::Yes, InstanceCmd::Multi, NoListenerCmd::Yes} },
|
||||||
{ {"serverinfo", ""}, { Command::ServerInfo, SubCommand::Empty, Authorization::Yes, InstanceCmd::Yes, NoListenerCmd::Yes} },
|
{ {"serverinfo", ""}, { Command::ServerInfo, SubCommand::Empty, Authorization::Yes, InstanceCmd::Yes, NoListenerCmd::Yes} },
|
||||||
{ {"serverinfo", "getInfo"}, { Command::ServerInfo, SubCommand::GetInfo, Authorization::Yes, InstanceCmd::Yes, NoListenerCmd::Yes} },
|
{ {"serverinfo", "getInfo"}, { Command::ServerInfo, SubCommand::GetInfo, Authorization::Yes, InstanceCmd::Yes, NoListenerCmd::Yes} },
|
||||||
{ {"serverinfo", "subscribe"}, { Command::ServerInfo, SubCommand::Subscribe, Authorization::Yes, InstanceCmd::Yes, NoListenerCmd::No} },
|
{ {"serverinfo", "subscribe"}, { Command::ServerInfo, SubCommand::Subscribe, Authorization::Yes, InstanceCmd::Yes, NoListenerCmd::No} },
|
||||||
@ -308,7 +309,7 @@ public:
|
|||||||
{ {"serverinfo", "getSubscriptions"}, { Command::ServerInfo, SubCommand::GetSubscriptions, Authorization::Yes, InstanceCmd::Yes, NoListenerCmd::No} },
|
{ {"serverinfo", "getSubscriptions"}, { Command::ServerInfo, SubCommand::GetSubscriptions, Authorization::Yes, InstanceCmd::Yes, NoListenerCmd::No} },
|
||||||
{ {"serverinfo", "getSubscriptionCommands"}, { Command::ServerInfo, SubCommand::GetSubscriptionCommands, Authorization::No, InstanceCmd::No, NoListenerCmd::No} },
|
{ {"serverinfo", "getSubscriptionCommands"}, { Command::ServerInfo, SubCommand::GetSubscriptionCommands, Authorization::No, InstanceCmd::No, NoListenerCmd::No} },
|
||||||
{ {"service", "discover"}, { Command::Service, SubCommand::Discover, Authorization::Yes, InstanceCmd::No, NoListenerCmd::Yes} },
|
{ {"service", "discover"}, { Command::Service, SubCommand::Discover, Authorization::Yes, InstanceCmd::No, NoListenerCmd::Yes} },
|
||||||
{ {"sourceselect", ""}, { Command::SourceSelect, SubCommand::Empty, Authorization::Yes, InstanceCmd::No, NoListenerCmd::Yes} },
|
{ {"sourceselect", ""}, { Command::SourceSelect, SubCommand::Empty, Authorization::Yes, InstanceCmd::Multi, NoListenerCmd::Yes} },
|
||||||
{ {"sysinfo", ""}, { Command::SysInfo, SubCommand::Empty, Authorization::Yes, InstanceCmd::No, NoListenerCmd::Yes} },
|
{ {"sysinfo", ""}, { Command::SysInfo, SubCommand::Empty, Authorization::Yes, InstanceCmd::No, NoListenerCmd::Yes} },
|
||||||
{ {"system", "restart"}, { Command::System, SubCommand::Restart, Authorization::Yes, InstanceCmd::No, NoListenerCmd::Yes} },
|
{ {"system", "restart"}, { Command::System, SubCommand::Restart, Authorization::Yes, InstanceCmd::No, NoListenerCmd::Yes} },
|
||||||
{ {"system", "resume"}, { Command::System, SubCommand::Resume, Authorization::Yes, InstanceCmd::No, NoListenerCmd::Yes} },
|
{ {"system", "resume"}, { Command::System, SubCommand::Resume, Authorization::Yes, InstanceCmd::No, NoListenerCmd::Yes} },
|
||||||
|
@ -55,10 +55,16 @@ public slots:
|
|||||||
Hyperion* getHyperionInstance(quint8 instance = 0);
|
Hyperion* getHyperionInstance(quint8 instance = 0);
|
||||||
|
|
||||||
///
|
///
|
||||||
/// @brief Get instance data of all instaces in db + running state
|
/// @brief Get instance data of all instances in db + running state
|
||||||
///
|
///
|
||||||
QVector<QVariantMap> getInstanceData() const;
|
QVector<QVariantMap> getInstanceData() const;
|
||||||
|
|
||||||
|
|
||||||
|
///
|
||||||
|
/// @brief Get all instance indicies of running instances
|
||||||
|
///
|
||||||
|
QList<quint8> getRunningInstanceIdx() const;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// @brief Start a Hyperion instance
|
/// @brief Start a Hyperion instance
|
||||||
/// @param instance Instance index
|
/// @param instance Instance index
|
||||||
|
@ -8,9 +8,10 @@
|
|||||||
"enum" : ["adjustment"]
|
"enum" : ["adjustment"]
|
||||||
},
|
},
|
||||||
"instance" : {
|
"instance" : {
|
||||||
"type" : "integer",
|
"type": "array",
|
||||||
"minimum": 0,
|
"required": false,
|
||||||
"maximum": 255
|
"items" : {},
|
||||||
|
"minItems": 1
|
||||||
},
|
},
|
||||||
"tan" : {
|
"tan" : {
|
||||||
"type" : "integer"
|
"type" : "integer"
|
||||||
|
@ -8,9 +8,10 @@
|
|||||||
"enum" : ["clear"]
|
"enum" : ["clear"]
|
||||||
},
|
},
|
||||||
"instance" : {
|
"instance" : {
|
||||||
"type" : "integer",
|
"type": "array",
|
||||||
"minimum": 0,
|
"required": false,
|
||||||
"maximum": 255
|
"items" : {},
|
||||||
|
"minItems": 1
|
||||||
},
|
},
|
||||||
"tan" : {
|
"tan" : {
|
||||||
"type" : "integer"
|
"type" : "integer"
|
||||||
|
@ -8,9 +8,10 @@
|
|||||||
"enum" : ["clearall"]
|
"enum" : ["clearall"]
|
||||||
},
|
},
|
||||||
"instance" : {
|
"instance" : {
|
||||||
"type" : "integer",
|
"type": "array",
|
||||||
"minimum": 0,
|
"required": false,
|
||||||
"maximum": 255
|
"items" : {},
|
||||||
|
"minItems": 1
|
||||||
},
|
},
|
||||||
"tan" : {
|
"tan" : {
|
||||||
"type" : "integer"
|
"type" : "integer"
|
||||||
|
@ -8,9 +8,10 @@
|
|||||||
"enum" : ["color"]
|
"enum" : ["color"]
|
||||||
},
|
},
|
||||||
"instance" : {
|
"instance" : {
|
||||||
"type" : "integer",
|
"type": "array",
|
||||||
"minimum": 0,
|
"required": false,
|
||||||
"maximum": 255
|
"items" : {},
|
||||||
|
"minItems": 1
|
||||||
},
|
},
|
||||||
"tan" : {
|
"tan" : {
|
||||||
"type" : "integer"
|
"type" : "integer"
|
||||||
|
@ -10,9 +10,10 @@
|
|||||||
"enum" : ["componentstate"]
|
"enum" : ["componentstate"]
|
||||||
},
|
},
|
||||||
"instance" : {
|
"instance" : {
|
||||||
"type" : "integer",
|
"type": "array",
|
||||||
"minimum": 0,
|
"required": false,
|
||||||
"maximum": 255
|
"items" : {},
|
||||||
|
"minItems": 1
|
||||||
},
|
},
|
||||||
"tan" : {
|
"tan" : {
|
||||||
"type" : "integer"
|
"type" : "integer"
|
||||||
|
@ -8,9 +8,10 @@
|
|||||||
"enum" : ["effect"]
|
"enum" : ["effect"]
|
||||||
},
|
},
|
||||||
"instance" : {
|
"instance" : {
|
||||||
"type" : "integer",
|
"type": "array",
|
||||||
"minimum": 0,
|
"required": false,
|
||||||
"maximum": 255
|
"items" : {},
|
||||||
|
"minItems": 1
|
||||||
},
|
},
|
||||||
"tan" : {
|
"tan" : {
|
||||||
"type" : "integer"
|
"type" : "integer"
|
||||||
|
@ -8,9 +8,10 @@
|
|||||||
"enum" : ["image"]
|
"enum" : ["image"]
|
||||||
},
|
},
|
||||||
"instance" : {
|
"instance" : {
|
||||||
"type" : "integer",
|
"type": "array",
|
||||||
"minimum": 0,
|
"required": false,
|
||||||
"maximum": 255
|
"items" : {},
|
||||||
|
"minItems": 1
|
||||||
},
|
},
|
||||||
"tan" : {
|
"tan" : {
|
||||||
"type" : "integer"
|
"type" : "integer"
|
||||||
|
@ -8,9 +8,10 @@
|
|||||||
"enum" : ["processing"]
|
"enum" : ["processing"]
|
||||||
},
|
},
|
||||||
"instance" : {
|
"instance" : {
|
||||||
"type" : "integer",
|
"type": "array",
|
||||||
"minimum": 0,
|
"required": false,
|
||||||
"maximum": 255
|
"items" : {},
|
||||||
|
"minItems": 1
|
||||||
},
|
},
|
||||||
"tan" : {
|
"tan" : {
|
||||||
"type" : "integer"
|
"type" : "integer"
|
||||||
|
@ -7,6 +7,12 @@
|
|||||||
"required" : true,
|
"required" : true,
|
||||||
"enum" : ["sourceselect"]
|
"enum" : ["sourceselect"]
|
||||||
},
|
},
|
||||||
|
"instance" : {
|
||||||
|
"type": "array",
|
||||||
|
"required": false,
|
||||||
|
"items" : {},
|
||||||
|
"minItems": 1
|
||||||
|
},
|
||||||
"tan" : {
|
"tan" : {
|
||||||
"type" : "integer"
|
"type" : "integer"
|
||||||
},
|
},
|
||||||
|
@ -230,18 +230,80 @@ void JsonAPI::handleMessage(const QString &messageString, const QString &httpAut
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( message.contains("instance"))
|
if (!message.contains("instance") || cmd.isInstanceCmd == InstanceCmd::No)
|
||||||
{
|
{
|
||||||
const quint8 instance = static_cast<quint8>(message.value("instance").toInt());
|
handleCommand(cmd, message);
|
||||||
if (!setHyperionInstance(instance))
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const QJsonValue instanceElement = message.value("instance");
|
||||||
|
|
||||||
|
QList<quint8> runningInstanceIdxs = _instanceManager->getRunningInstanceIdx();
|
||||||
|
|
||||||
|
QList<quint8> intanceIdxList;
|
||||||
|
QStringList errorDetails;
|
||||||
|
|
||||||
|
QJsonArray instances;
|
||||||
|
|
||||||
|
if (instanceElement.isDouble())
|
||||||
|
{
|
||||||
|
instances.append(instanceElement);
|
||||||
|
} else if (instanceElement.isArray())
|
||||||
|
{
|
||||||
|
instances = instanceElement.toArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (instances.contains("all"))
|
||||||
|
{
|
||||||
|
for (const auto& instanceIdx : runningInstanceIdxs)
|
||||||
|
{
|
||||||
|
intanceIdxList.append(instanceIdx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (const auto &instance : std::as_const(instances)) {
|
||||||
|
|
||||||
|
quint8 instanceIdx = static_cast<quint8>(instance.toInt());
|
||||||
|
if (instance.isDouble() && runningInstanceIdxs.contains(instanceIdx))
|
||||||
|
{
|
||||||
|
intanceIdxList.append(instanceIdx);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
errorDetails.append("Not a running or valid instance: " + instance.toVariant().toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (intanceIdxList.isEmpty() || !errorDetails.isEmpty() )
|
||||||
{
|
{
|
||||||
cmd.isInstanceCmd = InstanceCmd::No;
|
cmd.isInstanceCmd = InstanceCmd::No;
|
||||||
sendErrorReply(QString("Invalid or stopped instance: %1").arg(instance), cmd);
|
sendErrorReply("Invalid instance(s) given", errorDetails, cmd);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
quint8 currentInstanceIdx = getCurrentInstanceIndex();
|
||||||
|
if (intanceIdxList.size() > 1)
|
||||||
|
{
|
||||||
|
if (cmd.isInstanceCmd != InstanceCmd::Multi)
|
||||||
|
{
|
||||||
|
sendErrorReply("Command does not support multiple instances", cmd);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (const auto &instanceIdx : intanceIdxList)
|
||||||
|
{
|
||||||
|
if (setHyperionInstance(instanceIdx))
|
||||||
|
{
|
||||||
handleCommand(cmd, message);
|
handleCommand(cmd, message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
setHyperionInstance(currentInstanceIdx);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void JsonAPI::handleCommand(const JsonApiCommand& cmd, const QJsonObject &message)
|
void JsonAPI::handleCommand(const JsonApiCommand& cmd, const QJsonObject &message)
|
||||||
@ -1314,6 +1376,20 @@ void JsonAPI::handleSystemCommand(const QJsonObject& /*message*/, const JsonApiC
|
|||||||
sendSuccessReply(cmd);
|
sendSuccessReply(cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QJsonObject JsonAPI::getBasicCommandReply(bool success, const QString &command, int tan, InstanceCmd::Type isInstanceCmd) const
|
||||||
|
{
|
||||||
|
QJsonObject reply;
|
||||||
|
reply["success"] = success;
|
||||||
|
reply["command"] = command;
|
||||||
|
reply["tan"] = tan;
|
||||||
|
|
||||||
|
if (isInstanceCmd != InstanceCmd::No && !_noListener)
|
||||||
|
{
|
||||||
|
reply["instance"] = _hyperion->getInstanceIndex();
|
||||||
|
}
|
||||||
|
return reply;
|
||||||
|
}
|
||||||
|
|
||||||
void JsonAPI::sendSuccessReply(const JsonApiCommand& cmd)
|
void JsonAPI::sendSuccessReply(const JsonApiCommand& cmd)
|
||||||
{
|
{
|
||||||
sendSuccessReply(cmd.toString(), cmd.tan, cmd.isInstanceCmd);
|
sendSuccessReply(cmd.toString(), cmd.tan, cmd.isInstanceCmd);
|
||||||
@ -1321,17 +1397,7 @@ void JsonAPI::sendSuccessReply(const JsonApiCommand& cmd)
|
|||||||
|
|
||||||
void JsonAPI::sendSuccessReply(const QString &command, int tan, InstanceCmd::Type isInstanceCmd)
|
void JsonAPI::sendSuccessReply(const QString &command, int tan, InstanceCmd::Type isInstanceCmd)
|
||||||
{
|
{
|
||||||
QJsonObject reply;
|
emit callbackMessage(getBasicCommandReply(true, command, tan , isInstanceCmd));
|
||||||
reply["success"] = true;
|
|
||||||
reply["command"] = command;
|
|
||||||
reply["tan"] = tan;
|
|
||||||
|
|
||||||
if (isInstanceCmd == InstanceCmd::Yes)
|
|
||||||
{
|
|
||||||
reply["instance"] = _hyperion->getInstanceIndex();
|
|
||||||
}
|
|
||||||
|
|
||||||
emit callbackMessage(reply);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void JsonAPI::sendSuccessDataReply(const QJsonValue &infoData, const JsonApiCommand& cmd)
|
void JsonAPI::sendSuccessDataReply(const QJsonValue &infoData, const JsonApiCommand& cmd)
|
||||||
@ -1351,22 +1417,43 @@ void JsonAPI::sendSuccessDataReplyWithError(const QJsonValue &infoData, const Js
|
|||||||
|
|
||||||
void JsonAPI::sendSuccessDataReplyWithError(const QJsonValue &infoData, const QString &command, int tan, const QStringList& errorDetails, InstanceCmd::Type isInstanceCmd)
|
void JsonAPI::sendSuccessDataReplyWithError(const QJsonValue &infoData, const QString &command, int tan, const QStringList& errorDetails, InstanceCmd::Type isInstanceCmd)
|
||||||
{
|
{
|
||||||
QJsonObject reply;
|
QJsonObject reply {getBasicCommandReply(true, command, tan , isInstanceCmd)};
|
||||||
reply["success"] = true;
|
|
||||||
reply["command"] = command;
|
|
||||||
reply["tan"] = tan;
|
|
||||||
|
|
||||||
if (isInstanceCmd == InstanceCmd::Yes)
|
|
||||||
{
|
|
||||||
reply["instance"] = _hyperion->getInstanceIndex();
|
|
||||||
}
|
|
||||||
|
|
||||||
reply["info"] = infoData;
|
reply["info"] = infoData;
|
||||||
|
|
||||||
if (!errorDetails.isEmpty())
|
if (!errorDetails.isEmpty())
|
||||||
{
|
{
|
||||||
QJsonArray errorsArray;
|
QJsonArray errorsArray;
|
||||||
for (const QString& errorString : errorDetails) {
|
for (const QString& errorString : errorDetails)
|
||||||
|
{
|
||||||
|
QJsonObject errorObject;
|
||||||
|
errorObject["description"] = errorString;
|
||||||
|
errorsArray.append(errorObject);
|
||||||
|
}
|
||||||
|
reply["errorData"] = errorsArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
emit callbackMessage(reply);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JsonAPI::sendErrorReply(const QString &error, const JsonApiCommand& cmd)
|
||||||
|
{
|
||||||
|
sendErrorReply(error, {}, cmd.toString(), cmd.tan, cmd.isInstanceCmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JsonAPI::sendErrorReply(const QString &error, const QStringList& errorDetails, const JsonApiCommand& cmd)
|
||||||
|
{
|
||||||
|
sendErrorReply(error, errorDetails, cmd.toString(), cmd.tan, cmd.isInstanceCmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JsonAPI::sendErrorReply(const QString &error, const QStringList& errorDetails, const QString &command, int tan, InstanceCmd::Type isInstanceCmd)
|
||||||
|
{
|
||||||
|
QJsonObject reply {getBasicCommandReply(true, command, tan , isInstanceCmd)};
|
||||||
|
reply["error"] = error;
|
||||||
|
if (!errorDetails.isEmpty())
|
||||||
|
{
|
||||||
|
QJsonArray errorsArray;
|
||||||
|
for (const QString& errorString : errorDetails)
|
||||||
|
{
|
||||||
QJsonObject errorObject;
|
QJsonObject errorObject;
|
||||||
errorObject["description"] = errorString;
|
errorObject["description"] = errorString;
|
||||||
errorsArray.append(errorObject);
|
errorsArray.append(errorObject);
|
||||||
@ -1387,7 +1474,7 @@ void JsonAPI::sendNewRequest(const QJsonValue &infoData, const QString &command,
|
|||||||
QJsonObject request;
|
QJsonObject request;
|
||||||
request["command"] = command;
|
request["command"] = command;
|
||||||
|
|
||||||
if (isInstanceCmd == InstanceCmd::Yes)
|
if (isInstanceCmd != InstanceCmd::No)
|
||||||
{
|
{
|
||||||
request["instance"] = _hyperion->getInstanceIndex();
|
request["instance"] = _hyperion->getInstanceIndex();
|
||||||
}
|
}
|
||||||
@ -1397,49 +1484,11 @@ void JsonAPI::sendNewRequest(const QJsonValue &infoData, const QString &command,
|
|||||||
emit callbackMessage(request);
|
emit callbackMessage(request);
|
||||||
}
|
}
|
||||||
|
|
||||||
void JsonAPI::sendErrorReply(const QString &error, const JsonApiCommand& cmd)
|
|
||||||
{
|
|
||||||
sendErrorReply(error, {}, cmd.toString(), cmd.tan, cmd.isInstanceCmd);
|
|
||||||
}
|
|
||||||
|
|
||||||
void JsonAPI::sendErrorReply(const QString &error, const QStringList& errorDetails, const JsonApiCommand& cmd)
|
|
||||||
{
|
|
||||||
sendErrorReply(error, errorDetails, cmd.toString(), cmd.tan, cmd.isInstanceCmd);
|
|
||||||
}
|
|
||||||
|
|
||||||
void JsonAPI::sendErrorReply(const QString &error, const QStringList& errorDetails, const QString &command, int tan, InstanceCmd::Type isInstanceCmd)
|
|
||||||
{
|
|
||||||
QJsonObject reply;
|
|
||||||
reply["success"] = false;
|
|
||||||
reply["command"] = command;
|
|
||||||
reply["tan"] = tan;
|
|
||||||
|
|
||||||
if (isInstanceCmd == InstanceCmd::Yes)
|
|
||||||
{
|
|
||||||
reply["instance"] = _hyperion->getInstanceIndex();
|
|
||||||
}
|
|
||||||
|
|
||||||
reply["error"] = error;
|
|
||||||
if (!errorDetails.isEmpty())
|
|
||||||
{
|
|
||||||
QJsonArray errorsArray;
|
|
||||||
for (const QString& errorString : errorDetails) {
|
|
||||||
QJsonObject errorObject;
|
|
||||||
errorObject["description"] = errorString;
|
|
||||||
errorsArray.append(errorObject);
|
|
||||||
}
|
|
||||||
reply["errorData"] = errorsArray;
|
|
||||||
}
|
|
||||||
|
|
||||||
emit callbackMessage(reply);
|
|
||||||
}
|
|
||||||
|
|
||||||
void JsonAPI::sendNoAuthorization(const JsonApiCommand& cmd)
|
void JsonAPI::sendNoAuthorization(const JsonApiCommand& cmd)
|
||||||
{
|
{
|
||||||
sendErrorReply(NO_AUTHORIZATION, cmd);
|
sendErrorReply(NO_AUTHORIZATION, cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void JsonAPI::handleInstanceStateChange(InstanceState state, quint8 instance, const QString& /*name */)
|
void JsonAPI::handleInstanceStateChange(InstanceState state, quint8 instance, const QString& /*name */)
|
||||||
{
|
{
|
||||||
switch (state)
|
switch (state)
|
||||||
|
@ -45,6 +45,11 @@ QVector<QVariantMap> HyperionIManager::getInstanceData() const
|
|||||||
return instances;
|
return instances;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QList<quint8> HyperionIManager::getRunningInstanceIdx() const
|
||||||
|
{
|
||||||
|
return _runningInstances.keys();
|
||||||
|
}
|
||||||
|
|
||||||
void HyperionIManager::startAll()
|
void HyperionIManager::startAll()
|
||||||
{
|
{
|
||||||
for(const auto & entry : _instanceTable->getAllInstances(true))
|
for(const auto & entry : _instanceTable->getAllInstances(true))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user