Redo commands structure, simplify it and clean it up

This commit is contained in:
Lorow
2024-12-03 23:57:35 +01:00
parent f453db9476
commit e033f663ff
14 changed files with 212 additions and 194 deletions

View File

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

View File

@@ -8,9 +8,17 @@
#include <unordered_map>
#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 <cJSON.h>
// mostlikely missing commands
// reset config
// restart device
enum CommandType
{
None,

View File

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

View File

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

View File

@@ -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");
}

View File

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

View File

@@ -0,0 +1,7 @@
#include "config_commands.hpp"
CommandResult saveConfigCommand::execute(std::string_view jsonPayload)
{
projectConfig->save();
return CommandResult::getSuccessResult("Config saved");
}

View File

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

View File

@@ -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");
}

View File

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

View File

@@ -0,0 +1,6 @@
#include "simple_commands.hpp"
CommandResult PingCommand::execute(std::string_view jsonPayload)
{
return CommandResult::getSuccessResult("pong");
}

View File

@@ -0,0 +1,8 @@
#include "BaseCommand.hpp"
class PingCommand : public Command
{
public:
PingCommand() = default;
CommandResult execute(std::string_view jsonPayload) override;
};

View File

@@ -1,9 +1,4 @@
#include "Commands.hpp"
CommandResult PingCommand::execute(std::string_view jsonPayload)
{
return CommandResult::getSuccessResult("pong");
}
#include "wifi_commands.hpp"
std::optional<WifiPayload> 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<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");
}

View File

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