diff --git a/components/CommandManager/CommandManager/CommandManager.cpp b/components/CommandManager/CommandManager/CommandManager.cpp index 024b408..c0d0196 100644 --- a/components/CommandManager/CommandManager/CommandManager.cpp +++ b/components/CommandManager/CommandManager/CommandManager.cpp @@ -8,6 +8,8 @@ std::unique_ptr CommandManager::createCommand(CommandType type) return std::make_unique(); case CommandType::SET_WIFI: return std::make_unique(projectConfig); + case CommandType::DELETE_NETWORK: + return std::make_unique(projectConfig); default: return nullptr; } diff --git a/components/CommandManager/CommandManager/CommandSchema.hpp b/components/CommandManager/CommandManager/CommandSchema.hpp index 5622cf1..b45a609 100644 --- a/components/CommandManager/CommandManager/CommandSchema.hpp +++ b/components/CommandManager/CommandManager/CommandSchema.hpp @@ -6,6 +6,7 @@ class BasePayload class WifiPayload : public BasePayload { +public: std::string networkName; std::string ssid; std::string password; @@ -15,6 +16,7 @@ class WifiPayload : public BasePayload class UpdateWifiPayload : public BasePayload { +public: std::optional networkName; std::optional ssid; std::optional password; @@ -24,7 +26,8 @@ class UpdateWifiPayload : public BasePayload class deleteNetworkPayload : public BasePayload { - std::optional networkName; +public: + std::string networkName; }; #endif \ No newline at end of file diff --git a/components/CommandManager/CommandManager/Commands.cpp b/components/CommandManager/CommandManager/Commands.cpp index cc05882..de98d45 100644 --- a/components/CommandManager/CommandManager/Commands.cpp +++ b/components/CommandManager/CommandManager/Commands.cpp @@ -5,12 +5,100 @@ CommandResult PingCommand::execute(std::string &jsonPayload) return CommandResult::getSuccessResult("pong"); } -WifiPayload setConfigCommand::parsePayload(std::string &jsonPayload) +std::optional setWiFiCommand::parsePayload(std::string &jsonPayload) { - return WifiPayload(); + WifiPayload payload; + cJSON *parsedJson = cJSON_Parse(jsonPayload.c_str()); + + if (parsedJson == nullptr) + return std::nullopt; + + cJSON *networkName = cJSON_GetObjectItem(parsedJson, "name"); + cJSON *ssidPtr = cJSON_GetObjectItem(parsedJson, "ssid"); + cJSON *passwordPtr = cJSON_GetObjectItem(parsedJson, "password"); + cJSON *channelPtr = cJSON_GetObjectItem(parsedJson, "channel"); + cJSON *powerPtr = cJSON_GetObjectItem(parsedJson, "power"); + + if (ssidPtr == nullptr) + { + // without an SSID we can't do anything + cJSON_Delete(parsedJson); + return std::nullopt; + } + + if (networkName == nullptr) + payload.networkName = "main"; + else + payload.networkName = std::string(networkName->valuestring); + + payload.ssid = std::string(ssidPtr->valuestring); + + if (passwordPtr == nullptr) + payload.password = ""; + else + payload.password = std::string(passwordPtr->valuestring); + + if (channelPtr == nullptr) + payload.channel = 0; + else + payload.channel = channelPtr->valueint; + + if (powerPtr == nullptr) + payload.power = 0; + else + payload.power = powerPtr->valueint; + + cJSON_Delete(parsedJson); + return payload; } -CommandResult setConfigCommand::execute(std::string &jsonPayload) +CommandResult setWiFiCommand::execute(std::string &jsonPayload) { - return CommandResult::getSuccessResult("pong"); + auto payload = parsePayload(jsonPayload); + if (!payload.has_value()) + { + return CommandResult::getErrorResult("Invalid payload"); + } + auto wifiConfig = payload.value(); + projectConfig.setWifiConfig( + wifiConfig.networkName, + wifiConfig.ssid, + wifiConfig.password, + wifiConfig.channel, + wifiConfig.power, + false, + false); + + return CommandResult::getSuccessResult("Config updated"); } + +std::optional deleteWifiCommand::parsePayload(std::string &jsonPayload) +{ + deleteNetworkPayload payload; + cJSON *parsedJson = cJSON_Parse(jsonPayload.c_str()); + + if (parsedJson == nullptr) + return std::nullopt; + + cJSON *networkName = cJSON_GetObjectItem(parsedJson, "name"); + if (networkName == nullptr) + { + cJSON_Delete(parsedJson); + return std::nullopt; + } + + payload.networkName = std::string(networkName->valuestring); + + cJSON_Delete(parsedJson); + return payload; +} + +CommandResult deleteWifiCommand::execute(std::string &jsonPayload) +{ + auto payload = parsePayload(jsonPayload); + if (!payload.has_value()) + return CommandResult::getErrorResult("Invalid payload"); + + projectConfig.deleteWifiConfig(payload.value().networkName, false); + return CommandResult::getSuccessResult("Config updated"); +} \ No newline at end of file diff --git a/components/CommandManager/CommandManager/Commands.hpp b/components/CommandManager/CommandManager/Commands.hpp index 481cfde..5a33ff5 100644 --- a/components/CommandManager/CommandManager/Commands.hpp +++ b/components/CommandManager/CommandManager/Commands.hpp @@ -5,6 +5,7 @@ #include #include #include +#include #include "CommandResult.hpp" #include "CommandSchema.hpp" @@ -28,7 +29,17 @@ class setWiFiCommand : public Command public: setWiFiCommand(ProjectConfig &projectConfig) : projectConfig(projectConfig) {}; CommandResult execute(std::string &jsonPayload) override; - WifiPayload parsePayload(std::string &jsonPayload); + std::optional parsePayload(std::string &jsonPayload); +}; + +class deleteWifiCommand : public Command +{ + ProjectConfig &projectConfig; + +public: + deleteWifiCommand(ProjectConfig &projectConfig) : projectConfig(projectConfig) {}; + CommandResult execute(std::string &jsonPayload) override; + std::optional parsePayload(std::string &jsonPayload); }; #endif \ No newline at end of file diff --git a/components/ProjectConfig/ProjectConfig/ProjectConfig.hpp b/components/ProjectConfig/ProjectConfig/ProjectConfig.hpp index e6c5d47..74bf17c 100644 --- a/components/ProjectConfig/ProjectConfig/ProjectConfig.hpp +++ b/components/ProjectConfig/ProjectConfig/ProjectConfig.hpp @@ -131,6 +131,9 @@ public: uint8_t power, bool adhoc, bool shouldNotify); + + void deleteWifiConfig(const std::string &networkName, bool shouldNotify); + void setAPWifiConfig(const std::string &ssid, const std::string &password, uint8_t channel, @@ -138,8 +141,6 @@ public: bool shouldNotify); void setWiFiTxPower(uint8_t power, bool shouldNotify); - void deleteWifiConfig(const std::string &networkName, bool shouldNotify); - private: TrackerConfig_t config; std::string _name;