Implement some commands

This commit is contained in:
Lorow
2024-11-10 17:48:21 +01:00
parent edce9e6ce4
commit 9fb7e53824
5 changed files with 113 additions and 8 deletions

View File

@@ -8,6 +8,8 @@ std::unique_ptr<Command> CommandManager::createCommand(CommandType type)
return std::make_unique<PingCommand>();
case CommandType::SET_WIFI:
return std::make_unique<setWiFiCommand>(projectConfig);
case CommandType::DELETE_NETWORK:
return std::make_unique<deleteWifiCommand>(projectConfig);
default:
return nullptr;
}

View File

@@ -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<std::string> networkName;
std::optional<std::string> ssid;
std::optional<std::string> password;
@@ -24,7 +26,8 @@ class UpdateWifiPayload : public BasePayload
class deleteNetworkPayload : public BasePayload
{
std::optional<std::string> networkName;
public:
std::string networkName;
};
#endif

View File

@@ -5,12 +5,100 @@ CommandResult PingCommand::execute(std::string &jsonPayload)
return CommandResult::getSuccessResult("pong");
}
WifiPayload setConfigCommand::parsePayload(std::string &jsonPayload)
std::optional<WifiPayload> 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<deleteNetworkPayload> 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");
}

View File

@@ -5,6 +5,7 @@
#include <string>
#include <optional>
#include <unordered_map>
#include <cJSON.h>
#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<WifiPayload> parsePayload(std::string &jsonPayload);
};
class deleteWifiCommand : public Command
{
ProjectConfig &projectConfig;
public:
deleteWifiCommand(ProjectConfig &projectConfig) : projectConfig(projectConfig) {};
CommandResult execute(std::string &jsonPayload) override;
std::optional<deleteNetworkPayload> parsePayload(std::string &jsonPayload);
};
#endif

View File

@@ -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;