From e033f663ff42503fcb21689ced79a6d005ca2bc8 Mon Sep 17 00:00:00 2001 From: Lorow Date: Tue, 3 Dec 2024 23:57:35 +0100 Subject: [PATCH] Redo commands structure, simplify it and clean it up --- components/CommandManager/CMakeLists.txt | 7 +- .../CommandManager/CommandManager.hpp | 10 +- .../CommandManager/Commands.hpp | 99 ------------------- .../CommandManager/commands/BaseCommand.hpp | 20 ++++ .../commands/camera_commands.cpp | 51 ++++++++++ .../commands/camera_commands.hpp | 11 +++ .../commands/config_commands.cpp | 7 ++ .../commands/config_commands.hpp | 9 ++ .../CommandManager/commands/mdns_commands.cpp | 32 ++++++ .../CommandManager/commands/mdns_commands.hpp | 11 +++ .../commands/simple_commands.cpp | 6 ++ .../commands/simple_commands.hpp | 8 ++ .../wifi_commands.cpp} | 94 +----------------- .../CommandManager/commands/wifi_commands.hpp | 41 ++++++++ 14 files changed, 212 insertions(+), 194 deletions(-) delete mode 100644 components/CommandManager/CommandManager/Commands.hpp create mode 100644 components/CommandManager/CommandManager/commands/BaseCommand.hpp create mode 100644 components/CommandManager/CommandManager/commands/camera_commands.cpp create mode 100644 components/CommandManager/CommandManager/commands/camera_commands.hpp create mode 100644 components/CommandManager/CommandManager/commands/config_commands.cpp create mode 100644 components/CommandManager/CommandManager/commands/config_commands.hpp create mode 100644 components/CommandManager/CommandManager/commands/mdns_commands.cpp create mode 100644 components/CommandManager/CommandManager/commands/mdns_commands.hpp create mode 100644 components/CommandManager/CommandManager/commands/simple_commands.cpp create mode 100644 components/CommandManager/CommandManager/commands/simple_commands.hpp rename components/CommandManager/CommandManager/{Commands.cpp => commands/wifi_commands.cpp} (64%) create mode 100644 components/CommandManager/CommandManager/commands/wifi_commands.hpp diff --git a/components/CommandManager/CMakeLists.txt b/components/CommandManager/CMakeLists.txt index b97a3e6..01d8032 100644 --- a/components/CommandManager/CMakeLists.txt +++ b/components/CommandManager/CMakeLists.txt @@ -1,8 +1,13 @@ idf_component_register( SRCS "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 "CommandManager" + "CommandManager/commands" REQUIRES ProjectConfig cJSON ) \ No newline at end of file diff --git a/components/CommandManager/CommandManager/CommandManager.hpp b/components/CommandManager/CommandManager/CommandManager.hpp index 217270d..78dafc6 100644 --- a/components/CommandManager/CommandManager/CommandManager.hpp +++ b/components/CommandManager/CommandManager/CommandManager.hpp @@ -8,9 +8,17 @@ #include #include "CommandResult.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 +// mostlikely missing commands +// reset config +// restart device enum CommandType { None, diff --git a/components/CommandManager/CommandManager/Commands.hpp b/components/CommandManager/CommandManager/Commands.hpp deleted file mode 100644 index eaba497..0000000 --- a/components/CommandManager/CommandManager/Commands.hpp +++ /dev/null @@ -1,99 +0,0 @@ -#ifndef COMMANDS_HPP -#define COMMANDS_HPP -#include -#include -#include -#include -#include -#include -#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; - -public: - setWiFiCommand(std::shared_ptr projectConfig) : projectConfig(projectConfig) {}; - CommandResult execute(std::string_view jsonPayload) override; - std::optional parsePayload(std::string_view jsonPayload); -}; - -class deleteWifiCommand : public Command -{ - std::shared_ptr projectConfig; - -public: - deleteWifiCommand(std::shared_ptr projectConfig) : projectConfig(projectConfig) {}; - CommandResult execute(std::string_view jsonPayload) override; - std::optional parsePayload(std::string_view jsonPayload); -}; - -class updateWifiCommand : public Command -{ - std::shared_ptr projectConfig; - -public: - updateWifiCommand(std::shared_ptr projectConfig) : projectConfig(projectConfig) {}; - CommandResult execute(std::string_view jsonPayload) override; - std::optional parsePayload(std::string_view jsonPayload); -}; - -class updateAPWiFiCommand : public Command -{ - std::shared_ptr projectConfig; - -public: - updateAPWiFiCommand(std::shared_ptr projectConfig) : projectConfig(projectConfig) {}; - CommandResult execute(std::string_view jsonPayload) override; - std::optional parsePayload(std::string_view jsonPayload); -}; - -class setMDNSCommand : public Command -{ - std::shared_ptr projectConfig; - -public: - setMDNSCommand(std::shared_ptr projectConfig) : projectConfig(projectConfig) {}; - CommandResult execute(std::string_view jsonPayload) override; - std::optional parsePayload(std::string_view jsonPayload); -}; - -class updateCameraCommand : public Command -{ - std::shared_ptr projectConfig; - -public: - updateCameraCommand(std::shared_ptr projectConfig) : projectConfig(projectConfig) {}; - CommandResult execute(std::string_view jsonPayload) override; - std::optional parsePayload(std::string_view jsonPayload); -}; - -class saveConfigCommand : public Command -{ -public: - std::shared_ptr projectConfig; - saveConfigCommand(std::shared_ptr projectConfig) : projectConfig(projectConfig) {}; - CommandResult execute(std::string_view jsonPayload) override; -}; - -// mostlikely missing commands -// reset config -// restart device - -#endif \ No newline at end of file diff --git a/components/CommandManager/CommandManager/commands/BaseCommand.hpp b/components/CommandManager/CommandManager/commands/BaseCommand.hpp new file mode 100644 index 0000000..fa528ab --- /dev/null +++ b/components/CommandManager/CommandManager/commands/BaseCommand.hpp @@ -0,0 +1,20 @@ +#ifndef COMMAND_HPP +#define COMMAND_HPP + +#include +#include +#include +#include +#include +#include "CommandResult.hpp" +#include "CommandSchema.hpp" + +class Command +{ +public: + Command() = default; + virtual ~Command() = default; + virtual CommandResult execute(std::string_view jsonPayload) = 0; +}; + +#endif \ No newline at end of file diff --git a/components/CommandManager/CommandManager/commands/camera_commands.cpp b/components/CommandManager/CommandManager/commands/camera_commands.cpp new file mode 100644 index 0000000..0a92144 --- /dev/null +++ b/components/CommandManager/CommandManager/commands/camera_commands.cpp @@ -0,0 +1,51 @@ +#include "camera_commands.hpp" + +std::optional 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"); +} diff --git a/components/CommandManager/CommandManager/commands/camera_commands.hpp b/components/CommandManager/CommandManager/commands/camera_commands.hpp new file mode 100644 index 0000000..35fddaa --- /dev/null +++ b/components/CommandManager/CommandManager/commands/camera_commands.hpp @@ -0,0 +1,11 @@ +#include "BaseCommand.hpp" + +class updateCameraCommand : public Command +{ + std::shared_ptr projectConfig; + +public: + updateCameraCommand(std::shared_ptr projectConfig) : projectConfig(projectConfig) {}; + CommandResult execute(std::string_view jsonPayload) override; + std::optional parsePayload(std::string_view jsonPayload); +}; diff --git a/components/CommandManager/CommandManager/commands/config_commands.cpp b/components/CommandManager/CommandManager/commands/config_commands.cpp new file mode 100644 index 0000000..de0fde3 --- /dev/null +++ b/components/CommandManager/CommandManager/commands/config_commands.cpp @@ -0,0 +1,7 @@ +#include "config_commands.hpp" + +CommandResult saveConfigCommand::execute(std::string_view jsonPayload) +{ + projectConfig->save(); + return CommandResult::getSuccessResult("Config saved"); +} \ No newline at end of file diff --git a/components/CommandManager/CommandManager/commands/config_commands.hpp b/components/CommandManager/CommandManager/commands/config_commands.hpp new file mode 100644 index 0000000..c0345a7 --- /dev/null +++ b/components/CommandManager/CommandManager/commands/config_commands.hpp @@ -0,0 +1,9 @@ +#include "BaseCommand.hpp" + +class saveConfigCommand : public Command +{ +public: + std::shared_ptr projectConfig; + saveConfigCommand(std::shared_ptr projectConfig) : projectConfig(projectConfig) {}; + CommandResult execute(std::string_view jsonPayload) override; +}; \ No newline at end of file diff --git a/components/CommandManager/CommandManager/commands/mdns_commands.cpp b/components/CommandManager/CommandManager/commands/mdns_commands.cpp new file mode 100644 index 0000000..6199965 --- /dev/null +++ b/components/CommandManager/CommandManager/commands/mdns_commands.cpp @@ -0,0 +1,32 @@ +#include "mdns_commands.hpp" + +std::optional 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"); +} diff --git a/components/CommandManager/CommandManager/commands/mdns_commands.hpp b/components/CommandManager/CommandManager/commands/mdns_commands.hpp new file mode 100644 index 0000000..1266bc2 --- /dev/null +++ b/components/CommandManager/CommandManager/commands/mdns_commands.hpp @@ -0,0 +1,11 @@ +#include "BaseCommand.hpp" + +class setMDNSCommand : public Command +{ + std::shared_ptr projectConfig; + +public: + setMDNSCommand(std::shared_ptr projectConfig) : projectConfig(projectConfig) {}; + CommandResult execute(std::string_view jsonPayload) override; + std::optional parsePayload(std::string_view jsonPayload); +}; diff --git a/components/CommandManager/CommandManager/commands/simple_commands.cpp b/components/CommandManager/CommandManager/commands/simple_commands.cpp new file mode 100644 index 0000000..126795a --- /dev/null +++ b/components/CommandManager/CommandManager/commands/simple_commands.cpp @@ -0,0 +1,6 @@ +#include "simple_commands.hpp" + +CommandResult PingCommand::execute(std::string_view jsonPayload) +{ + return CommandResult::getSuccessResult("pong"); +} diff --git a/components/CommandManager/CommandManager/commands/simple_commands.hpp b/components/CommandManager/CommandManager/commands/simple_commands.hpp new file mode 100644 index 0000000..cb1c9d2 --- /dev/null +++ b/components/CommandManager/CommandManager/commands/simple_commands.hpp @@ -0,0 +1,8 @@ +#include "BaseCommand.hpp" + +class PingCommand : public Command +{ +public: + PingCommand() = default; + CommandResult execute(std::string_view jsonPayload) override; +}; diff --git a/components/CommandManager/CommandManager/Commands.cpp b/components/CommandManager/CommandManager/commands/wifi_commands.cpp similarity index 64% rename from components/CommandManager/CommandManager/Commands.cpp rename to components/CommandManager/CommandManager/commands/wifi_commands.cpp index 4b81fbc..fc89b50 100644 --- a/components/CommandManager/CommandManager/Commands.cpp +++ b/components/CommandManager/CommandManager/commands/wifi_commands.cpp @@ -1,9 +1,4 @@ -#include "Commands.hpp" - -CommandResult PingCommand::execute(std::string_view jsonPayload) -{ - return CommandResult::getSuccessResult("pong"); -} +#include "wifi_commands.hpp" std::optional setWiFiCommand::parsePayload(std::string_view jsonPayload) { @@ -195,90 +190,3 @@ CommandResult updateAPWiFiCommand::execute(std::string_view jsonPayload) // todo implement updating return CommandResult::getSuccessResult("Config updated"); } - -std::optional 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 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"); -} \ No newline at end of file diff --git a/components/CommandManager/CommandManager/commands/wifi_commands.hpp b/components/CommandManager/CommandManager/commands/wifi_commands.hpp new file mode 100644 index 0000000..39cb695 --- /dev/null +++ b/components/CommandManager/CommandManager/commands/wifi_commands.hpp @@ -0,0 +1,41 @@ +#include "BaseCommand.hpp" + +class setWiFiCommand : public Command +{ + std::shared_ptr projectConfig; + +public: + setWiFiCommand(std::shared_ptr projectConfig) : projectConfig(projectConfig) {}; + CommandResult execute(std::string_view jsonPayload) override; + std::optional parsePayload(std::string_view jsonPayload); +}; + +class deleteWifiCommand : public Command +{ + std::shared_ptr projectConfig; + +public: + deleteWifiCommand(std::shared_ptr projectConfig) : projectConfig(projectConfig) {}; + CommandResult execute(std::string_view jsonPayload) override; + std::optional parsePayload(std::string_view jsonPayload); +}; + +class updateWifiCommand : public Command +{ + std::shared_ptr projectConfig; + +public: + updateWifiCommand(std::shared_ptr projectConfig) : projectConfig(projectConfig) {}; + CommandResult execute(std::string_view jsonPayload) override; + std::optional parsePayload(std::string_view jsonPayload); +}; + +class updateAPWiFiCommand : public Command +{ + std::shared_ptr projectConfig; + +public: + updateAPWiFiCommand(std::shared_ptr projectConfig) : projectConfig(projectConfig) {}; + CommandResult execute(std::string_view jsonPayload) override; + std::optional parsePayload(std::string_view jsonPayload); +};