diff --git a/components/CommandManager/CMakeLists.txt b/components/CommandManager/CMakeLists.txt index 7812a34..9c32fd5 100644 --- a/components/CommandManager/CMakeLists.txt +++ b/components/CommandManager/CMakeLists.txt @@ -1,4 +1,4 @@ idf_component_register(SRCS "CommandManager/CommandManager.cpp" INCLUDE_DIRS "CommandManager" - REQUIRES ProjectConfig + REQUIRES ProjectConfig cJSON ) \ No newline at end of file diff --git a/components/CommandManager/CommandManager/CommandManager.cpp b/components/CommandManager/CommandManager/CommandManager.cpp index bcbf092..024b408 100644 --- a/components/CommandManager/CommandManager/CommandManager.cpp +++ b/components/CommandManager/CommandManager/CommandManager.cpp @@ -6,16 +6,52 @@ std::unique_ptr CommandManager::createCommand(CommandType type) { case CommandType::PING: return std::make_unique(); - break; - case CommandType::UPDATE_WIFI: - return std::make_unique(projectConfig); + case CommandType::SET_WIFI: + return std::make_unique(projectConfig); default: return nullptr; } } -CommandResult CommandManager::executeFromJson(const std::string *json) +CommandResult CommandManager::executeFromJson(std::string *json) { - // parse it, get a type of command, grab a command from the map based on type - // parse the payload json, call execute on the command and return the result + cJSON *parsedJson = cJSON_Parse(json->c_str()); + if (parsedJson == nullptr) + return CommandResult::getErrorResult("Invalid JSON"); + + const cJSON *commandData = nullptr; + const cJSON *commands = cJSON_GetObjectItem(parsedJson, "commands"); + cJSON_ArrayForEach(commandData, commands) + { + const cJSON *commandTypeString = cJSON_GetObjectItem(commandData, "command"); + const cJSON *commandPayload = cJSON_GetObjectItem(commandData, "data"); + + auto commandType = commandTypeMap.at(std::string(commandTypeString->valuestring)); + auto command = createCommand(commandType); + + if (command == nullptr) + { + cJSON_Delete(parsedJson); + return CommandResult::getErrorResult("Unknown command"); + } + + std::string commandPayloadString = std::string(cJSON_Print(commandPayload)); + cJSON_Delete(parsedJson); + return command->execute(commandPayloadString); + } + + cJSON_Delete(parsedJson); + return CommandResult::getErrorResult("Commands missing"); +} + +CommandResult CommandManager::executeFromType(CommandType type, std::string *json) +{ + auto command = createCommand(type); + + if (command == nullptr) + { + return CommandResult::getErrorResult("Unknown command"); + } + + return command->execute(*json); } \ No newline at end of file diff --git a/components/CommandManager/CommandManager/CommandManager.hpp b/components/CommandManager/CommandManager/CommandManager.hpp index 6bd65d7..f8a6aeb 100644 --- a/components/CommandManager/CommandManager/CommandManager.hpp +++ b/components/CommandManager/CommandManager/CommandManager.hpp @@ -1,3 +1,6 @@ +#ifndef COMMANDMANAGER_HPP +#define COMMANDMANAGER_HPP + #include #include #include @@ -6,8 +9,10 @@ #include "CommandResult.hpp" #include "CommandSchema.hpp" #include "Commands.hpp" +#include -const enum CommandType { +enum CommandType +{ None, PING, SET_WIFI, @@ -32,5 +37,8 @@ public: CommandManager(ProjectConfig &projectConfig) : projectConfig(projectConfig) {}; std::unique_ptr createCommand(CommandType type); - CommandResult executeFromJson(const std::string *json); -}; \ No newline at end of file + CommandResult executeFromJson(std::string *json); + CommandResult executeFromType(CommandType type, std::string *json); +}; + +#endif \ No newline at end of file diff --git a/components/CommandManager/CommandManager/CommandResult.hpp b/components/CommandManager/CommandManager/CommandResult.hpp index c59fb4c..8074985 100644 --- a/components/CommandManager/CommandManager/CommandResult.hpp +++ b/components/CommandManager/CommandManager/CommandResult.hpp @@ -1,3 +1,6 @@ +#ifndef COMMAND_RESULT +#define COMMAND_RESULT + class CommandResult { private: @@ -37,3 +40,5 @@ public: std::string getSuccessMessage() const { return successMessage.value(); }; std::string getErrorMessage() const { return errorMessage.value(); } }; + +#endif \ No newline at end of file diff --git a/components/CommandManager/CommandManager/CommandSchema.hpp b/components/CommandManager/CommandManager/CommandSchema.hpp index 92006de..5622cf1 100644 --- a/components/CommandManager/CommandManager/CommandSchema.hpp +++ b/components/CommandManager/CommandManager/CommandSchema.hpp @@ -1,3 +1,5 @@ +#ifndef COMMAND_SCHEMA_HPP +#define COMMAND_SCHEMA_HPP class BasePayload { }; @@ -23,4 +25,6 @@ class UpdateWifiPayload : public BasePayload class deleteNetworkPayload : public BasePayload { std::optional networkName; -}; \ No newline at end of file +}; + +#endif \ No newline at end of file diff --git a/components/CommandManager/CommandManager/Commands.cpp b/components/CommandManager/CommandManager/Commands.cpp index 6dd07fe..cc05882 100644 --- a/components/CommandManager/CommandManager/Commands.cpp +++ b/components/CommandManager/CommandManager/Commands.cpp @@ -1 +1,16 @@ #include "Commands.hpp" + +CommandResult PingCommand::execute(std::string &jsonPayload) +{ + return CommandResult::getSuccessResult("pong"); +} + +WifiPayload setConfigCommand::parsePayload(std::string &jsonPayload) +{ + return WifiPayload(); +} + +CommandResult setConfigCommand::execute(std::string &jsonPayload) +{ + return CommandResult::getSuccessResult("pong"); +} diff --git a/components/CommandManager/CommandManager/Commands.hpp b/components/CommandManager/CommandManager/Commands.hpp index 7178aee..481cfde 100644 --- a/components/CommandManager/CommandManager/Commands.hpp +++ b/components/CommandManager/CommandManager/Commands.hpp @@ -1,3 +1,5 @@ +#ifndef COMMANDS_HPP +#define COMMANDS_HPP #include #include #include @@ -8,31 +10,25 @@ class Command { +public: virtual ~Command() = default; - virtual CommandResult execute(const std::shared_ptr &payload) = 0; - virtual std::shared_ptr parsePayload(const std::string *json) = 0; + virtual CommandResult execute(std::string &jsonPayload) = 0; }; class PingCommand : public Command { public: - CommandResult execute(const std::shared_ptr &payload); - std::shared_ptr parsePayload(const std::string *json); + CommandResult execute(std::string &jsonPayload) override; }; -class setConfigCommand : public Command +class setWiFiCommand : public Command { -public: - CommandResult execute(const std::shared_ptr &payload); - std::shared_ptr parsePayload(const std::string *json); -}; - -class UpdateWifiCommand : public Command -{ -private: ProjectConfig &projectConfig; public: - UpdateWifiCommand(ProjectConfig &projectConfig) : projectConfig(projectConfig) {}; - CommandResult execute(const std::shared_ptr &payload); + setWiFiCommand(ProjectConfig &projectConfig) : projectConfig(projectConfig) {}; + CommandResult execute(std::string &jsonPayload) override; + WifiPayload parsePayload(std::string &jsonPayload); }; + +#endif \ No newline at end of file diff --git a/components/Preferences/Preferences/Preferences.hpp b/components/Preferences/Preferences/Preferences.hpp index 5eef308..7bf624a 100644 --- a/components/Preferences/Preferences/Preferences.hpp +++ b/components/Preferences/Preferences/Preferences.hpp @@ -84,4 +84,4 @@ public: size_t freeEntries(); }; -#endif PREFERENCES_HPP +#endif