mirror of
https://github.com/MrUnknownDE/OpenIris-ESPIDF.git
synced 2026-04-23 00:13:43 +02:00
Redo commands structure, simplify it and clean it up
This commit is contained in:
@@ -1,8 +1,13 @@
|
|||||||
idf_component_register(
|
idf_component_register(
|
||||||
SRCS
|
SRCS
|
||||||
"CommandManager/CommandManager.cpp"
|
"CommandManager/CommandManager.cpp"
|
||||||
"CommandManager/Commands.cpp"
|
"CommandManager/commands/simple_commands.cpp"
|
||||||
|
"CommandManager/commands/camera_commands.cpp"
|
||||||
|
"CommandManager/commands/wifi_commands.cpp"
|
||||||
|
"CommandManager/commands/config_commands.cpp"
|
||||||
|
"CommandManager/commands/mdns_commands.cpp"
|
||||||
INCLUDE_DIRS
|
INCLUDE_DIRS
|
||||||
"CommandManager"
|
"CommandManager"
|
||||||
|
"CommandManager/commands"
|
||||||
REQUIRES ProjectConfig cJSON
|
REQUIRES ProjectConfig cJSON
|
||||||
)
|
)
|
||||||
@@ -8,9 +8,17 @@
|
|||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include "CommandResult.hpp"
|
#include "CommandResult.hpp"
|
||||||
#include "CommandSchema.hpp"
|
#include "CommandSchema.hpp"
|
||||||
#include "Commands.hpp"
|
#include "commands/BaseCommand.hpp"
|
||||||
|
#include "commands/simple_commands.hpp"
|
||||||
|
#include "commands/camera_commands.hpp"
|
||||||
|
#include "commands/config_commands.hpp"
|
||||||
|
#include "commands/mdns_commands.hpp"
|
||||||
|
#include "commands/wifi_commands.hpp"
|
||||||
#include <cJSON.h>
|
#include <cJSON.h>
|
||||||
|
|
||||||
|
// mostlikely missing commands
|
||||||
|
// reset config
|
||||||
|
// restart device
|
||||||
enum CommandType
|
enum CommandType
|
||||||
{
|
{
|
||||||
None,
|
None,
|
||||||
|
|||||||
@@ -1,99 +0,0 @@
|
|||||||
#ifndef COMMANDS_HPP
|
|
||||||
#define COMMANDS_HPP
|
|
||||||
#include <ProjectConfig.hpp>
|
|
||||||
#include <memory>
|
|
||||||
#include <string>
|
|
||||||
#include <optional>
|
|
||||||
#include <unordered_map>
|
|
||||||
#include <cJSON.h>
|
|
||||||
#include "CommandResult.hpp"
|
|
||||||
#include "CommandSchema.hpp"
|
|
||||||
|
|
||||||
class Command
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
Command() = default;
|
|
||||||
virtual ~Command() = default;
|
|
||||||
virtual CommandResult execute(std::string_view jsonPayload) = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
class PingCommand : public Command
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
PingCommand() = default;
|
|
||||||
CommandResult execute(std::string_view jsonPayload) override;
|
|
||||||
};
|
|
||||||
|
|
||||||
class setWiFiCommand : public Command
|
|
||||||
{
|
|
||||||
std::shared_ptr<ProjectConfig> projectConfig;
|
|
||||||
|
|
||||||
public:
|
|
||||||
setWiFiCommand(std::shared_ptr<ProjectConfig> projectConfig) : projectConfig(projectConfig) {};
|
|
||||||
CommandResult execute(std::string_view jsonPayload) override;
|
|
||||||
std::optional<WifiPayload> parsePayload(std::string_view jsonPayload);
|
|
||||||
};
|
|
||||||
|
|
||||||
class deleteWifiCommand : public Command
|
|
||||||
{
|
|
||||||
std::shared_ptr<ProjectConfig> projectConfig;
|
|
||||||
|
|
||||||
public:
|
|
||||||
deleteWifiCommand(std::shared_ptr<ProjectConfig> projectConfig) : projectConfig(projectConfig) {};
|
|
||||||
CommandResult execute(std::string_view jsonPayload) override;
|
|
||||||
std::optional<deleteNetworkPayload> parsePayload(std::string_view jsonPayload);
|
|
||||||
};
|
|
||||||
|
|
||||||
class updateWifiCommand : public Command
|
|
||||||
{
|
|
||||||
std::shared_ptr<ProjectConfig> projectConfig;
|
|
||||||
|
|
||||||
public:
|
|
||||||
updateWifiCommand(std::shared_ptr<ProjectConfig> projectConfig) : projectConfig(projectConfig) {};
|
|
||||||
CommandResult execute(std::string_view jsonPayload) override;
|
|
||||||
std::optional<UpdateWifiPayload> parsePayload(std::string_view jsonPayload);
|
|
||||||
};
|
|
||||||
|
|
||||||
class updateAPWiFiCommand : public Command
|
|
||||||
{
|
|
||||||
std::shared_ptr<ProjectConfig> projectConfig;
|
|
||||||
|
|
||||||
public:
|
|
||||||
updateAPWiFiCommand(std::shared_ptr<ProjectConfig> projectConfig) : projectConfig(projectConfig) {};
|
|
||||||
CommandResult execute(std::string_view jsonPayload) override;
|
|
||||||
std::optional<UpdateAPWiFiPayload> parsePayload(std::string_view jsonPayload);
|
|
||||||
};
|
|
||||||
|
|
||||||
class setMDNSCommand : public Command
|
|
||||||
{
|
|
||||||
std::shared_ptr<ProjectConfig> projectConfig;
|
|
||||||
|
|
||||||
public:
|
|
||||||
setMDNSCommand(std::shared_ptr<ProjectConfig> projectConfig) : projectConfig(projectConfig) {};
|
|
||||||
CommandResult execute(std::string_view jsonPayload) override;
|
|
||||||
std::optional<MDNSPayload> parsePayload(std::string_view jsonPayload);
|
|
||||||
};
|
|
||||||
|
|
||||||
class updateCameraCommand : public Command
|
|
||||||
{
|
|
||||||
std::shared_ptr<ProjectConfig> projectConfig;
|
|
||||||
|
|
||||||
public:
|
|
||||||
updateCameraCommand(std::shared_ptr<ProjectConfig> projectConfig) : projectConfig(projectConfig) {};
|
|
||||||
CommandResult execute(std::string_view jsonPayload) override;
|
|
||||||
std::optional<UpdateCameraConfigPayload> parsePayload(std::string_view jsonPayload);
|
|
||||||
};
|
|
||||||
|
|
||||||
class saveConfigCommand : public Command
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
std::shared_ptr<ProjectConfig> projectConfig;
|
|
||||||
saveConfigCommand(std::shared_ptr<ProjectConfig> projectConfig) : projectConfig(projectConfig) {};
|
|
||||||
CommandResult execute(std::string_view jsonPayload) override;
|
|
||||||
};
|
|
||||||
|
|
||||||
// mostlikely missing commands
|
|
||||||
// reset config
|
|
||||||
// restart device
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
#ifndef COMMAND_HPP
|
||||||
|
#define COMMAND_HPP
|
||||||
|
|
||||||
|
#include <ProjectConfig.hpp>
|
||||||
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
|
#include <optional>
|
||||||
|
#include <cJSON.h>
|
||||||
|
#include "CommandResult.hpp"
|
||||||
|
#include "CommandSchema.hpp"
|
||||||
|
|
||||||
|
class Command
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Command() = default;
|
||||||
|
virtual ~Command() = default;
|
||||||
|
virtual CommandResult execute(std::string_view jsonPayload) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
#include "camera_commands.hpp"
|
||||||
|
|
||||||
|
std::optional<UpdateCameraConfigPayload> updateCameraCommand::parsePayload(std::string_view jsonPayload)
|
||||||
|
{
|
||||||
|
UpdateCameraConfigPayload payload;
|
||||||
|
cJSON *parsedJson = cJSON_Parse(jsonPayload.data());
|
||||||
|
|
||||||
|
if (parsedJson == nullptr)
|
||||||
|
return std::nullopt;
|
||||||
|
|
||||||
|
cJSON *vflipObject = cJSON_GetObjectItem(parsedJson, "vflip");
|
||||||
|
cJSON *hrefObject = cJSON_GetObjectItem(parsedJson, "href");
|
||||||
|
cJSON *framesize = cJSON_GetObjectItem(parsedJson, "framesize");
|
||||||
|
cJSON *quality = cJSON_GetObjectItem(parsedJson, "quality");
|
||||||
|
cJSON *brightness = cJSON_GetObjectItem(parsedJson, "brightness");
|
||||||
|
|
||||||
|
if (vflipObject != nullptr)
|
||||||
|
payload.vflip = vflipObject->valueint;
|
||||||
|
if (hrefObject != nullptr)
|
||||||
|
payload.href = hrefObject->valueint;
|
||||||
|
if (framesize != nullptr)
|
||||||
|
payload.framesize = framesize->valueint;
|
||||||
|
if (quality != nullptr)
|
||||||
|
payload.quality = quality->valueint;
|
||||||
|
if (brightness != nullptr)
|
||||||
|
payload.brightness = brightness->valueint;
|
||||||
|
|
||||||
|
cJSON_Delete(parsedJson);
|
||||||
|
return payload;
|
||||||
|
}
|
||||||
|
|
||||||
|
CommandResult updateCameraCommand::execute(std::string_view jsonPayload)
|
||||||
|
{
|
||||||
|
auto payload = parsePayload(jsonPayload);
|
||||||
|
if (!payload.has_value())
|
||||||
|
{
|
||||||
|
return CommandResult::getErrorResult("Invalid payload");
|
||||||
|
}
|
||||||
|
auto updatedConfig = payload.value();
|
||||||
|
|
||||||
|
auto oldConfig = projectConfig->getCameraConfig();
|
||||||
|
this->projectConfig->setCameraConfig(
|
||||||
|
updatedConfig.vflip.has_value() ? updatedConfig.vflip.value() : oldConfig.vflip,
|
||||||
|
updatedConfig.framesize.has_value() ? updatedConfig.framesize.value() : oldConfig.framesize,
|
||||||
|
updatedConfig.href.has_value() ? updatedConfig.href.value() : oldConfig.href,
|
||||||
|
updatedConfig.quality.has_value() ? updatedConfig.quality.value() : oldConfig.quality,
|
||||||
|
updatedConfig.brightness.has_value() ? updatedConfig.brightness.value() : oldConfig.brightness,
|
||||||
|
true);
|
||||||
|
|
||||||
|
return CommandResult::getSuccessResult("Config updated");
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
#include "BaseCommand.hpp"
|
||||||
|
|
||||||
|
class updateCameraCommand : public Command
|
||||||
|
{
|
||||||
|
std::shared_ptr<ProjectConfig> projectConfig;
|
||||||
|
|
||||||
|
public:
|
||||||
|
updateCameraCommand(std::shared_ptr<ProjectConfig> projectConfig) : projectConfig(projectConfig) {};
|
||||||
|
CommandResult execute(std::string_view jsonPayload) override;
|
||||||
|
std::optional<UpdateCameraConfigPayload> parsePayload(std::string_view jsonPayload);
|
||||||
|
};
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
#include "config_commands.hpp"
|
||||||
|
|
||||||
|
CommandResult saveConfigCommand::execute(std::string_view jsonPayload)
|
||||||
|
{
|
||||||
|
projectConfig->save();
|
||||||
|
return CommandResult::getSuccessResult("Config saved");
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
#include "BaseCommand.hpp"
|
||||||
|
|
||||||
|
class saveConfigCommand : public Command
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
std::shared_ptr<ProjectConfig> projectConfig;
|
||||||
|
saveConfigCommand(std::shared_ptr<ProjectConfig> projectConfig) : projectConfig(projectConfig) {};
|
||||||
|
CommandResult execute(std::string_view jsonPayload) override;
|
||||||
|
};
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
#include "mdns_commands.hpp"
|
||||||
|
|
||||||
|
std::optional<MDNSPayload> setMDNSCommand::parsePayload(std::string_view jsonPayload)
|
||||||
|
{
|
||||||
|
MDNSPayload payload;
|
||||||
|
cJSON *parsedJson = cJSON_Parse(jsonPayload.data());
|
||||||
|
if (parsedJson == nullptr)
|
||||||
|
return std::nullopt;
|
||||||
|
|
||||||
|
cJSON *hostnameObject = cJSON_GetObjectItem(parsedJson, "hostname");
|
||||||
|
|
||||||
|
if (hostnameObject == nullptr)
|
||||||
|
{
|
||||||
|
cJSON_Delete(parsedJson);
|
||||||
|
return std::nullopt;
|
||||||
|
}
|
||||||
|
|
||||||
|
payload.hostname = std::string(hostnameObject->valuestring);
|
||||||
|
cJSON_Delete(parsedJson);
|
||||||
|
return payload;
|
||||||
|
}
|
||||||
|
|
||||||
|
CommandResult setMDNSCommand::execute(std::string_view jsonPayload)
|
||||||
|
{
|
||||||
|
auto payload = parsePayload(jsonPayload);
|
||||||
|
if (!payload.has_value())
|
||||||
|
return CommandResult::getErrorResult("Invalid payload");
|
||||||
|
|
||||||
|
projectConfig->setMDNSConfig(payload.value().hostname, true);
|
||||||
|
|
||||||
|
return CommandResult::getSuccessResult("Config updated");
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
#include "BaseCommand.hpp"
|
||||||
|
|
||||||
|
class setMDNSCommand : public Command
|
||||||
|
{
|
||||||
|
std::shared_ptr<ProjectConfig> projectConfig;
|
||||||
|
|
||||||
|
public:
|
||||||
|
setMDNSCommand(std::shared_ptr<ProjectConfig> projectConfig) : projectConfig(projectConfig) {};
|
||||||
|
CommandResult execute(std::string_view jsonPayload) override;
|
||||||
|
std::optional<MDNSPayload> parsePayload(std::string_view jsonPayload);
|
||||||
|
};
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
#include "simple_commands.hpp"
|
||||||
|
|
||||||
|
CommandResult PingCommand::execute(std::string_view jsonPayload)
|
||||||
|
{
|
||||||
|
return CommandResult::getSuccessResult("pong");
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
#include "BaseCommand.hpp"
|
||||||
|
|
||||||
|
class PingCommand : public Command
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
PingCommand() = default;
|
||||||
|
CommandResult execute(std::string_view jsonPayload) override;
|
||||||
|
};
|
||||||
@@ -1,9 +1,4 @@
|
|||||||
#include "Commands.hpp"
|
#include "wifi_commands.hpp"
|
||||||
|
|
||||||
CommandResult PingCommand::execute(std::string_view jsonPayload)
|
|
||||||
{
|
|
||||||
return CommandResult::getSuccessResult("pong");
|
|
||||||
}
|
|
||||||
|
|
||||||
std::optional<WifiPayload> setWiFiCommand::parsePayload(std::string_view jsonPayload)
|
std::optional<WifiPayload> setWiFiCommand::parsePayload(std::string_view jsonPayload)
|
||||||
{
|
{
|
||||||
@@ -195,90 +190,3 @@ CommandResult updateAPWiFiCommand::execute(std::string_view jsonPayload)
|
|||||||
// todo implement updating
|
// todo implement updating
|
||||||
return CommandResult::getSuccessResult("Config updated");
|
return CommandResult::getSuccessResult("Config updated");
|
||||||
}
|
}
|
||||||
|
|
||||||
std::optional<MDNSPayload> setMDNSCommand::parsePayload(std::string_view jsonPayload)
|
|
||||||
{
|
|
||||||
MDNSPayload payload;
|
|
||||||
cJSON *parsedJson = cJSON_Parse(jsonPayload.data());
|
|
||||||
if (parsedJson == nullptr)
|
|
||||||
return std::nullopt;
|
|
||||||
|
|
||||||
cJSON *hostnameObject = cJSON_GetObjectItem(parsedJson, "hostname");
|
|
||||||
|
|
||||||
if (hostnameObject == nullptr)
|
|
||||||
{
|
|
||||||
cJSON_Delete(parsedJson);
|
|
||||||
return std::nullopt;
|
|
||||||
}
|
|
||||||
|
|
||||||
payload.hostname = std::string(hostnameObject->valuestring);
|
|
||||||
cJSON_Delete(parsedJson);
|
|
||||||
return payload;
|
|
||||||
}
|
|
||||||
|
|
||||||
CommandResult setMDNSCommand::execute(std::string_view jsonPayload)
|
|
||||||
{
|
|
||||||
auto payload = parsePayload(jsonPayload);
|
|
||||||
if (!payload.has_value())
|
|
||||||
return CommandResult::getErrorResult("Invalid payload");
|
|
||||||
|
|
||||||
projectConfig->setMDNSConfig(payload.value().hostname, true);
|
|
||||||
|
|
||||||
return CommandResult::getSuccessResult("Config updated");
|
|
||||||
}
|
|
||||||
|
|
||||||
std::optional<UpdateCameraConfigPayload> updateCameraCommand::parsePayload(std::string_view jsonPayload)
|
|
||||||
{
|
|
||||||
UpdateCameraConfigPayload payload;
|
|
||||||
cJSON *parsedJson = cJSON_Parse(jsonPayload.data());
|
|
||||||
|
|
||||||
if (parsedJson == nullptr)
|
|
||||||
return std::nullopt;
|
|
||||||
|
|
||||||
cJSON *vflipObject = cJSON_GetObjectItem(parsedJson, "vflip");
|
|
||||||
cJSON *hrefObject = cJSON_GetObjectItem(parsedJson, "href");
|
|
||||||
cJSON *framesize = cJSON_GetObjectItem(parsedJson, "framesize");
|
|
||||||
cJSON *quality = cJSON_GetObjectItem(parsedJson, "quality");
|
|
||||||
cJSON *brightness = cJSON_GetObjectItem(parsedJson, "brightness");
|
|
||||||
|
|
||||||
if (vflipObject != nullptr)
|
|
||||||
payload.vflip = vflipObject->valueint;
|
|
||||||
if (hrefObject != nullptr)
|
|
||||||
payload.href = hrefObject->valueint;
|
|
||||||
if (framesize != nullptr)
|
|
||||||
payload.framesize = framesize->valueint;
|
|
||||||
if (quality != nullptr)
|
|
||||||
payload.quality = quality->valueint;
|
|
||||||
if (brightness != nullptr)
|
|
||||||
payload.brightness = brightness->valueint;
|
|
||||||
|
|
||||||
cJSON_Delete(parsedJson);
|
|
||||||
return payload;
|
|
||||||
}
|
|
||||||
|
|
||||||
CommandResult updateCameraCommand::execute(std::string_view jsonPayload)
|
|
||||||
{
|
|
||||||
auto payload = parsePayload(jsonPayload);
|
|
||||||
if (!payload.has_value())
|
|
||||||
{
|
|
||||||
return CommandResult::getErrorResult("Invalid payload");
|
|
||||||
}
|
|
||||||
auto updatedConfig = payload.value();
|
|
||||||
|
|
||||||
auto oldConfig = projectConfig->getCameraConfig();
|
|
||||||
this->projectConfig->setCameraConfig(
|
|
||||||
updatedConfig.vflip.has_value() ? updatedConfig.vflip.value() : oldConfig.vflip,
|
|
||||||
updatedConfig.framesize.has_value() ? updatedConfig.framesize.value() : oldConfig.framesize,
|
|
||||||
updatedConfig.href.has_value() ? updatedConfig.href.value() : oldConfig.href,
|
|
||||||
updatedConfig.quality.has_value() ? updatedConfig.quality.value() : oldConfig.quality,
|
|
||||||
updatedConfig.brightness.has_value() ? updatedConfig.brightness.value() : oldConfig.brightness,
|
|
||||||
true);
|
|
||||||
|
|
||||||
return CommandResult::getSuccessResult("Config updated");
|
|
||||||
}
|
|
||||||
|
|
||||||
CommandResult saveConfigCommand::execute(std::string_view jsonPayload)
|
|
||||||
{
|
|
||||||
projectConfig->save();
|
|
||||||
return CommandResult::getSuccessResult("Config saved");
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
#include "BaseCommand.hpp"
|
||||||
|
|
||||||
|
class setWiFiCommand : public Command
|
||||||
|
{
|
||||||
|
std::shared_ptr<ProjectConfig> projectConfig;
|
||||||
|
|
||||||
|
public:
|
||||||
|
setWiFiCommand(std::shared_ptr<ProjectConfig> projectConfig) : projectConfig(projectConfig) {};
|
||||||
|
CommandResult execute(std::string_view jsonPayload) override;
|
||||||
|
std::optional<WifiPayload> parsePayload(std::string_view jsonPayload);
|
||||||
|
};
|
||||||
|
|
||||||
|
class deleteWifiCommand : public Command
|
||||||
|
{
|
||||||
|
std::shared_ptr<ProjectConfig> projectConfig;
|
||||||
|
|
||||||
|
public:
|
||||||
|
deleteWifiCommand(std::shared_ptr<ProjectConfig> projectConfig) : projectConfig(projectConfig) {};
|
||||||
|
CommandResult execute(std::string_view jsonPayload) override;
|
||||||
|
std::optional<deleteNetworkPayload> parsePayload(std::string_view jsonPayload);
|
||||||
|
};
|
||||||
|
|
||||||
|
class updateWifiCommand : public Command
|
||||||
|
{
|
||||||
|
std::shared_ptr<ProjectConfig> projectConfig;
|
||||||
|
|
||||||
|
public:
|
||||||
|
updateWifiCommand(std::shared_ptr<ProjectConfig> projectConfig) : projectConfig(projectConfig) {};
|
||||||
|
CommandResult execute(std::string_view jsonPayload) override;
|
||||||
|
std::optional<UpdateWifiPayload> parsePayload(std::string_view jsonPayload);
|
||||||
|
};
|
||||||
|
|
||||||
|
class updateAPWiFiCommand : public Command
|
||||||
|
{
|
||||||
|
std::shared_ptr<ProjectConfig> projectConfig;
|
||||||
|
|
||||||
|
public:
|
||||||
|
updateAPWiFiCommand(std::shared_ptr<ProjectConfig> projectConfig) : projectConfig(projectConfig) {};
|
||||||
|
CommandResult execute(std::string_view jsonPayload) override;
|
||||||
|
std::optional<UpdateAPWiFiPayload> parsePayload(std::string_view jsonPayload);
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user