From eaa60cb877564d29f402e572ea17f262beee4458 Mon Sep 17 00:00:00 2001 From: Lorow Date: Wed, 9 Apr 2025 21:43:49 +0200 Subject: [PATCH] Refactor command system - remove BaseCommand class implementation in favour of std::function --- .../CommandManager/CommandManager.cpp | 42 +++--- .../CommandManager/CommandManager.hpp | 13 +- .../CommandManager/DependencyRegistry.hpp | 37 +++++ .../CommandManager/commands/BaseCommand.hpp | 20 --- .../commands/camera_commands.cpp | 52 +++---- .../commands/camera_commands.hpp | 33 ++--- .../commands/config_commands.cpp | 44 +++--- .../commands/config_commands.hpp | 40 ++--- .../commands/device_commands.cpp | 2 +- .../commands/device_commands.hpp | 7 +- .../CommandManager/commands/mdns_commands.cpp | 7 +- .../CommandManager/commands/mdns_commands.hpp | 20 +-- .../commands/simple_commands.cpp | 4 +- .../commands/simple_commands.hpp | 15 +- .../CommandManager/commands/wifi_commands.cpp | 137 ++++++++++-------- .../CommandManager/commands/wifi_commands.hpp | 53 ++----- main/openiris_main.cpp | 13 +- 17 files changed, 268 insertions(+), 271 deletions(-) create mode 100644 components/CommandManager/CommandManager/DependencyRegistry.hpp delete mode 100644 components/CommandManager/CommandManager/commands/BaseCommand.hpp diff --git a/components/CommandManager/CommandManager/CommandManager.cpp b/components/CommandManager/CommandManager/CommandManager.cpp index f76bf72..12858a5 100644 --- a/components/CommandManager/CommandManager/CommandManager.cpp +++ b/components/CommandManager/CommandManager/CommandManager.cpp @@ -8,37 +8,39 @@ std::unordered_map commandTypeMap = { {"save_config", CommandType::SAVE_CONFIG}, }; -std::unique_ptr CommandManager::createCommand(CommandType type) +std::function CommandManager::createCommand(CommandType type, std::string_view json) { + typedef std::function CommandFunction; + switch (type) { case CommandType::PING: - return std::make_unique(); + return CommandFunction(PingCommand); case CommandType::SET_WIFI: - return std::make_unique(projectConfig); + return CommandFunction(std::bind(setWiFiCommand, this->registry, json)); case CommandType::UPDATE_WIFI: - return std::make_unique(projectConfig); + return CommandFunction(std::bind(updateWiFiCommand, this->registry, json)); case CommandType::UPDATE_AP_WIFI: - return std::make_unique(projectConfig); + return CommandFunction(std::bind(updateAPWiFiCommand, this->registry, json)); case CommandType::DELETE_NETWORK: - return std::make_unique(projectConfig); + return CommandFunction(std::bind(deleteWiFiCommand, this->registry, json)); case CommandType::SET_MDNS: - return std::make_unique(projectConfig); + return CommandFunction(std::bind(setMDNSCommand, this->registry, json)); // updating the mnds name is essentially the same operation case CommandType::UPDATE_MDNS: - return std::make_unique(projectConfig); + return CommandFunction(std::bind(setMDNSCommand, this->registry, json)); case CommandType::UPDATE_CAMERA: - return std::make_unique(projectConfig); + return CommandFunction(std::bind(updateCameraCommand, this->registry, json)); case CommandType::RESTART_CAMERA: - return std::make_unique(cameraManager); + return CommandFunction(std::bind(restartCameraCommand, this->registry, json)); case CommandType::GET_CONFIG: - return std::make_unique(projectConfig); + return CommandFunction(std::bind(getConfigCommand, this->registry)); case CommandType::SAVE_CONFIG: - return std::make_unique(projectConfig); + return CommandFunction(std::bind(saveConfigCommand, this->registry)); case CommandType::RESET_CONFIG: - return std::make_unique(projectConfig); + return CommandFunction(std::bind(resetConfigCommand, this->registry, json)); case CommandType::RESTART_DEVICE: - return std::make_unique(); + return CommandFunction(restartDeviceCommand); default: return nullptr; } @@ -56,9 +58,10 @@ CommandResult CommandManager::executeFromJson(std::string_view json) { 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); + + std::string commandPayloadString = std::string(cJSON_Print(commandPayload)); + auto command = createCommand(commandType, commandPayloadString); if (command == nullptr) { @@ -66,9 +69,8 @@ CommandResult CommandManager::executeFromJson(std::string_view json) return CommandResult::getErrorResult("Unknown command"); } - std::string commandPayloadString = std::string(cJSON_Print(commandPayload)); cJSON_Delete(parsedJson); - return command->execute(commandPayloadString); + return command(); } cJSON_Delete(parsedJson); @@ -77,12 +79,12 @@ CommandResult CommandManager::executeFromJson(std::string_view json) CommandResult CommandManager::executeFromType(CommandType type, std::string_view json) { - auto command = createCommand(type); + auto command = createCommand(type, json); if (command == nullptr) { return CommandResult::getErrorResult("Unknown command"); } - return command->execute(json); + return command(); } \ No newline at end of file diff --git a/components/CommandManager/CommandManager/CommandManager.hpp b/components/CommandManager/CommandManager/CommandManager.hpp index 13e33ca..dba6b32 100644 --- a/components/CommandManager/CommandManager/CommandManager.hpp +++ b/components/CommandManager/CommandManager/CommandManager.hpp @@ -7,9 +7,10 @@ #include #include #include +#include #include "CommandResult.hpp" #include "CommandSchema.hpp" -#include "commands/BaseCommand.hpp" +#include "DependencyRegistry.hpp" #include "commands/simple_commands.hpp" #include "commands/camera_commands.hpp" #include "commands/config_commands.hpp" @@ -18,9 +19,6 @@ #include "commands/device_commands.hpp" #include -// mostlikely missing commands -// reset config -// restart device enum CommandType { None, @@ -43,12 +41,11 @@ enum CommandType class CommandManager { private: - std::shared_ptr projectConfig; - std::shared_ptr cameraManager; + std::shared_ptr registry; public: - CommandManager(std::shared_ptr projectConfig, std::shared_ptr cameraManager) : projectConfig(projectConfig), cameraManager(cameraManager) {}; - std::unique_ptr createCommand(CommandType type); + CommandManager(std::shared_ptr DependencyRegistry) : registry(DependencyRegistry) {}; + std::function createCommand(CommandType type, std::string_view json); CommandResult executeFromJson(std::string_view json); CommandResult executeFromType(CommandType type, std::string_view json); diff --git a/components/CommandManager/CommandManager/DependencyRegistry.hpp b/components/CommandManager/CommandManager/DependencyRegistry.hpp new file mode 100644 index 0000000..7aa9326 --- /dev/null +++ b/components/CommandManager/CommandManager/DependencyRegistry.hpp @@ -0,0 +1,37 @@ +#ifndef _DEPENDENCY_REGISTRY_HPP_ +#define _DEPENDENCY_REGISTRY_HPP_ + +#include +#include + +enum DependencyType +{ + project_config, + camera_manager +}; + +class DependencyRegistry +{ + std::unordered_map> services; + +public: + template + void registerService(DependencyType dependencyType, std::shared_ptr service) + { + this->services[dependencyType] = std::static_pointer_cast(service); + } + + template + std::shared_ptr resolve(DependencyType dependencyType) + { + auto serviceIT = this->services.find(dependencyType); + if (serviceIT != this->services.end()) + { + return std::static_pointer_cast(serviceIT->second); + } + + return nullptr; + } +}; + +#endif \ No newline at end of file diff --git a/components/CommandManager/CommandManager/commands/BaseCommand.hpp b/components/CommandManager/CommandManager/commands/BaseCommand.hpp deleted file mode 100644 index fa528ab..0000000 --- a/components/CommandManager/CommandManager/commands/BaseCommand.hpp +++ /dev/null @@ -1,20 +0,0 @@ -#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 index 89e2123..b092541 100644 --- a/components/CommandManager/CommandManager/commands/camera_commands.cpp +++ b/components/CommandManager/CommandManager/commands/camera_commands.cpp @@ -1,6 +1,6 @@ #include "camera_commands.hpp" -std::optional updateCameraCommand::parsePayload(std::string_view jsonPayload) +std::optional parseUpdateCameraPayload(std::string_view jsonPayload) { UpdateCameraConfigPayload payload; cJSON *parsedJson = cJSON_Parse(jsonPayload.data()); @@ -29,27 +29,7 @@ std::optional updateCameraCommand::parsePayload(std:: 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); - - return CommandResult::getSuccessResult("Config updated"); -} - -std::optional restartCameraCommand::parsePayload(std::string_view jsonPayload) +std::optional parseRestartCameraPayload(std::string_view jsonPayload) { RestartCameraPayload payload; cJSON *parsedJson = cJSON_Parse(jsonPayload.data()); @@ -71,14 +51,36 @@ std::optional restartCameraCommand::parsePayload(std::stri return payload; } -CommandResult restartCameraCommand::execute(std::string_view jsonPayload) +CommandResult updateCameraCommand(std::shared_ptr registry, std::string_view jsonPayload) { - auto payload = parsePayload(jsonPayload); + auto payload = parseUpdateCameraPayload(jsonPayload); + if (!payload.has_value()) + { + return CommandResult::getErrorResult("Invalid payload"); + } + auto updatedConfig = payload.value(); + + std::shared_ptr projectConfig = registry->resolve(DependencyType::project_config); + auto oldConfig = projectConfig->getCameraConfig(); + 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); + + return CommandResult::getSuccessResult("Config updated"); +} + +CommandResult restartCameraCommand(std::shared_ptr registry, std::string_view jsonPayload) +{ + auto payload = parseRestartCameraPayload(jsonPayload); if (!payload.has_value()) { return CommandResult::getErrorResult("Invalid payload"); } - this->cameraManager->resetCamera(payload.value().mode); + std::shared_ptr cameraManager = registry->resolve(DependencyType::camera_manager); + cameraManager->resetCamera(payload.value().mode); return CommandResult::getSuccessResult("Camera restarted"); } \ No newline at end of file diff --git a/components/CommandManager/CommandManager/commands/camera_commands.hpp b/components/CommandManager/CommandManager/commands/camera_commands.hpp index 9070132..9de565a 100644 --- a/components/CommandManager/CommandManager/commands/camera_commands.hpp +++ b/components/CommandManager/CommandManager/commands/camera_commands.hpp @@ -1,27 +1,20 @@ #ifndef CAMERA_COMMANDS_HPP #define CAMERA_COMMANDS_HPP -#include "BaseCommand.hpp" +#include +#include +#include +#include +#include +#include "CommandResult.hpp" +#include "CommandSchema.hpp" +#include "DependencyRegistry.hpp" #include -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 restartCameraCommand : public Command -{ - std::shared_ptr cameraManager; - -public: - restartCameraCommand(std::shared_ptr cameraManager) : cameraManager(cameraManager) {}; - CommandResult execute(std::string_view jsonPayload) override; - std::optional parsePayload(std::string_view jsonPayload); -}; +std::optional parseUpdateCameraPayload(std::string_view jsonPayload); +CommandResult updateCameraCommand(std::shared_ptr registry, std::string_view jsonPayload); +std::optional parseRestartCameraPayload(std::string_view jsonPayload); +CommandResult restartCameraCommand(std::shared_ptr registry, std::string_view jsonPayload); #endif + // add cropping command \ No newline at end of file diff --git a/components/CommandManager/CommandManager/commands/config_commands.cpp b/components/CommandManager/CommandManager/commands/config_commands.cpp index 8b49191..d966035 100644 --- a/components/CommandManager/CommandManager/commands/config_commands.cpp +++ b/components/CommandManager/CommandManager/commands/config_commands.cpp @@ -1,18 +1,6 @@ #include "config_commands.hpp" -CommandResult saveConfigCommand::execute(std::string_view jsonPayload) -{ - projectConfig->save(); - return CommandResult::getSuccessResult("Config saved"); -} - -CommandResult getConfigCommand::execute(std::string_view jsonPayload) -{ - auto configRepresentation = projectConfig->getTrackerConfig().toRepresentation(); - return CommandResult::getSuccessResult(configRepresentation); -} - -std::optional resetConfigCommand::parsePayload(std::string_view jsonPayload) +std::optional parseResetConfigCommandPayload(std::string_view jsonPayload) { ResetConfigPayload payload; cJSON *parsedJson = cJSON_Parse(jsonPayload.data()); @@ -34,9 +22,28 @@ std::optional resetConfigCommand::parsePayload(std::string_v return payload; } -CommandResult resetConfigCommand::execute(std::string_view jsonPayload) +CommandResult saveConfigCommand(std::shared_ptr registry) { - auto payload = parsePayload(jsonPayload); + std::shared_ptr projectConfig = registry->resolve(DependencyType::project_config); + + projectConfig->save(); + return CommandResult::getSuccessResult("Config saved"); +} +CommandResult getConfigCommand(std::shared_ptr registry) +{ + std::shared_ptr projectConfig = registry->resolve(DependencyType::project_config); + + auto configRepresentation = projectConfig->getTrackerConfig().toRepresentation(); + return CommandResult::getSuccessResult(configRepresentation); +} + +CommandResult resetConfigCommand(std::shared_ptr registry, std::string_view jsonPayload) +{ + std::array supported_sections = { + "all", + }; + + auto payload = parseResetConfigCommandPayload(jsonPayload); if (!payload.has_value()) { @@ -45,7 +52,7 @@ CommandResult resetConfigCommand::execute(std::string_view jsonPayload) auto sectionPayload = payload.value(); - if (std::find(this->supported_sections.begin(), this->supported_sections.end(), sectionPayload.section) == this->supported_sections.end()) + if (std::find(supported_sections.begin(), supported_sections.end(), sectionPayload.section) == supported_sections.end()) { return CommandResult::getErrorResult("Selected section is unsupported"); } @@ -53,7 +60,10 @@ CommandResult resetConfigCommand::execute(std::string_view jsonPayload) // we cannot match on string, and making a map would be overkill right now, sooo // todo, add more granual control for other sections, like only reset camera, or only reset wifi if (sectionPayload.section == "all") - this->projectConfig->reset(); + { + std::shared_ptr projectConfig = registry->resolve(DependencyType::project_config); + projectConfig->reset(); + } return CommandResult::getSuccessResult("Config reset"); } \ No newline at end of file diff --git a/components/CommandManager/CommandManager/commands/config_commands.hpp b/components/CommandManager/CommandManager/commands/config_commands.hpp index 03229af..1266425 100644 --- a/components/CommandManager/CommandManager/commands/config_commands.hpp +++ b/components/CommandManager/CommandManager/commands/config_commands.hpp @@ -1,30 +1,14 @@ -#include "BaseCommand.hpp" +#include +#include +#include +#include +#include +#include "CommandResult.hpp" +#include "CommandSchema.hpp" +#include "DependencyRegistry.hpp" -class saveConfigCommand : public Command -{ -public: - std::shared_ptr projectConfig; - saveConfigCommand(std::shared_ptr projectConfig) : projectConfig(projectConfig) {}; - CommandResult execute(std::string_view jsonPayload) override; -}; +CommandResult saveConfigCommand(std::shared_ptr registry); +CommandResult getConfigCommand(std::shared_ptr registry); -class getConfigCommand : public Command -{ -public: - std::shared_ptr projectConfig; - getConfigCommand(std::shared_ptr projectConfig) : projectConfig(projectConfig) {}; - CommandResult execute(std::string_view jsonPayload) override; -}; - -class resetConfigCommand : public Command -{ - std::array supported_sections = { - "all", - }; - -public: - std::shared_ptr projectConfig; - resetConfigCommand(std::shared_ptr projectConfig) : projectConfig(projectConfig) {}; - CommandResult execute(std::string_view jsonPayload) override; - std::optional parsePayload(std::string_view jsonPayload); -}; \ No newline at end of file +std::optional parseresetConfigCommandPayload(std::string_view jsonPayload); +CommandResult resetConfigCommand(std::shared_ptr registry, std::string_view jsonPayload); \ No newline at end of file diff --git a/components/CommandManager/CommandManager/commands/device_commands.cpp b/components/CommandManager/CommandManager/commands/device_commands.cpp index 6b356a3..e8fbc7f 100644 --- a/components/CommandManager/CommandManager/commands/device_commands.cpp +++ b/components/CommandManager/CommandManager/commands/device_commands.cpp @@ -1,6 +1,6 @@ #include "device_commands.hpp" -CommandResult restartDeviceCommand::execute(std::string_view jsonPayload) +CommandResult restartDeviceCommand() { // todo implement this: https://github.com/EyeTrackVR/OpenIris/blob/master/ESP/lib/src/tasks/tasks.cpp // OpenIrisTasks::ScheduleRestart(2000); diff --git a/components/CommandManager/CommandManager/commands/device_commands.hpp b/components/CommandManager/CommandManager/commands/device_commands.hpp index 789e7c3..b227708 100644 --- a/components/CommandManager/CommandManager/commands/device_commands.hpp +++ b/components/CommandManager/CommandManager/commands/device_commands.hpp @@ -1,6 +1,3 @@ -#include "BaseCommand.hpp" +#include "CommandResult.hpp" -class restartDeviceCommand : public Command -{ - CommandResult execute(std::string_view jsonPayload) override; -}; \ No newline at end of file +CommandResult restartDeviceCommand(); \ No newline at end of file diff --git a/components/CommandManager/CommandManager/commands/mdns_commands.cpp b/components/CommandManager/CommandManager/commands/mdns_commands.cpp index 1b21826..c098506 100644 --- a/components/CommandManager/CommandManager/commands/mdns_commands.cpp +++ b/components/CommandManager/CommandManager/commands/mdns_commands.cpp @@ -1,6 +1,6 @@ #include "mdns_commands.hpp" -std::optional setMDNSCommand::parsePayload(std::string_view jsonPayload) +std::optional parseMDNSCommandPayload(std::string_view jsonPayload) { MDNSPayload payload; cJSON *parsedJson = cJSON_Parse(jsonPayload.data()); @@ -20,12 +20,13 @@ std::optional setMDNSCommand::parsePayload(std::string_view jsonPay return payload; } -CommandResult setMDNSCommand::execute(std::string_view jsonPayload) +CommandResult setMDNSCommand(std::shared_ptr registry, std::string_view jsonPayload) { - auto payload = parsePayload(jsonPayload); + auto payload = parseMDNSCommandPayload(jsonPayload); if (!payload.has_value()) return CommandResult::getErrorResult("Invalid payload"); + std::shared_ptr projectConfig = registry->resolve(DependencyType::project_config); projectConfig->setMDNSConfig(payload.value().hostname); return CommandResult::getSuccessResult("Config updated"); diff --git a/components/CommandManager/CommandManager/commands/mdns_commands.hpp b/components/CommandManager/CommandManager/commands/mdns_commands.hpp index 1266bc2..b40e641 100644 --- a/components/CommandManager/CommandManager/commands/mdns_commands.hpp +++ b/components/CommandManager/CommandManager/commands/mdns_commands.hpp @@ -1,11 +1,11 @@ -#include "BaseCommand.hpp" +#include +#include +#include +#include +#include +#include "CommandResult.hpp" +#include "CommandSchema.hpp" +#include "DependencyRegistry.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); -}; +std::optional parseMDNSCommandPayload(std::string_view jsonPayload); +CommandResult setMDNSCommand(std::shared_ptr registry, std::string_view jsonPayload); \ No newline at end of file diff --git a/components/CommandManager/CommandManager/commands/simple_commands.cpp b/components/CommandManager/CommandManager/commands/simple_commands.cpp index 126795a..b1fc7b9 100644 --- a/components/CommandManager/CommandManager/commands/simple_commands.cpp +++ b/components/CommandManager/CommandManager/commands/simple_commands.cpp @@ -1,6 +1,6 @@ #include "simple_commands.hpp" -CommandResult PingCommand::execute(std::string_view jsonPayload) +CommandResult PingCommand() { return CommandResult::getSuccessResult("pong"); -} +}; diff --git a/components/CommandManager/CommandManager/commands/simple_commands.hpp b/components/CommandManager/CommandManager/commands/simple_commands.hpp index cb1c9d2..0883da9 100644 --- a/components/CommandManager/CommandManager/commands/simple_commands.hpp +++ b/components/CommandManager/CommandManager/commands/simple_commands.hpp @@ -1,8 +1,9 @@ -#include "BaseCommand.hpp" +#ifndef SIMPLE_COMMANDS +#define SIMPLE_COMMANDS -class PingCommand : public Command -{ -public: - PingCommand() = default; - CommandResult execute(std::string_view jsonPayload) override; -}; +#include +#include "CommandResult.hpp" + +CommandResult PingCommand(); + +#endif \ No newline at end of file diff --git a/components/CommandManager/CommandManager/commands/wifi_commands.cpp b/components/CommandManager/CommandManager/commands/wifi_commands.cpp index 9ab9f76..9596153 100644 --- a/components/CommandManager/CommandManager/commands/wifi_commands.cpp +++ b/components/CommandManager/CommandManager/commands/wifi_commands.cpp @@ -1,6 +1,6 @@ #include "wifi_commands.hpp" -std::optional setWiFiCommand::parsePayload(std::string_view jsonPayload) +std::optional parseSetWiFiCommandPayload(std::string_view jsonPayload) { WifiPayload payload; cJSON *parsedJson = cJSON_Parse(jsonPayload.data()); @@ -47,25 +47,7 @@ std::optional setWiFiCommand::parsePayload(std::string_view jsonPay return payload; } -CommandResult setWiFiCommand::execute(std::string_view jsonPayload) -{ - 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); - - return CommandResult::getSuccessResult("Config updated"); -} - -std::optional deleteWifiCommand::parsePayload(std::string_view jsonPayload) +std::optional parseDeleteWifiCommandPayload(std::string_view jsonPayload) { deleteNetworkPayload payload; cJSON *parsedJson = cJSON_Parse(jsonPayload.data()); @@ -86,17 +68,7 @@ std::optional deleteWifiCommand::parsePayload(std::string_ return payload; } -CommandResult deleteWifiCommand::execute(std::string_view jsonPayload) -{ - auto payload = parsePayload(jsonPayload); - if (!payload.has_value()) - return CommandResult::getErrorResult("Invalid payload"); - - projectConfig->deleteWifiConfig(payload.value().networkName); - return CommandResult::getSuccessResult("Config updated"); -} - -std::optional updateWifiCommand::parsePayload(std::string_view jsonPayload) +std::optional parseUpdateWifiCommandPayload(std::string_view jsonPayload) { UpdateWifiPayload payload; cJSON *parsedJson = cJSON_Parse(jsonPayload.data()); @@ -141,37 +113,7 @@ std::optional updateWifiCommand::parsePayload(std::string_vie return payload; } -CommandResult updateWifiCommand::execute(std::string_view jsonPayload) -{ - auto payload = parsePayload(jsonPayload); - if (!payload.has_value()) - { - return CommandResult::getErrorResult("Invalid payload"); - } - - auto updatedConfig = payload.value(); - auto storedNetworks = projectConfig->getWifiConfigs(); - if (auto networkToUpdate = std::find_if( - storedNetworks.begin(), - storedNetworks.end(), - [&](auto &network) - { return network.name == updatedConfig.networkName; }); - networkToUpdate != storedNetworks.end()) - { - projectConfig->setWifiConfig( - updatedConfig.networkName, - updatedConfig.ssid.has_value() ? updatedConfig.ssid.value() : networkToUpdate->ssid, - updatedConfig.password.has_value() ? updatedConfig.password.value() : networkToUpdate->password, - updatedConfig.channel.has_value() ? updatedConfig.channel.value() : networkToUpdate->channel, - updatedConfig.power.has_value() ? updatedConfig.power.value() : networkToUpdate->power); - - return CommandResult::getSuccessResult("Config updated"); - } - else - return CommandResult::getErrorResult("Requested network does not exist"); -} - -std::optional updateAPWiFiCommand::parsePayload(std::string_view jsonPayload) +std::optional parseUpdateAPWiFiCommandPayload(std::string_view jsonPayload) { UpdateAPWiFiPayload payload; cJSON *parsedJson = cJSON_Parse(jsonPayload.data()); @@ -198,14 +140,81 @@ std::optional updateAPWiFiCommand::parsePayload(std::string return payload; } -CommandResult updateAPWiFiCommand::execute(std::string_view jsonPayload) +CommandResult setWiFiCommand(std::shared_ptr registry, std::string_view jsonPayload) { - auto payload = parsePayload(jsonPayload); + auto payload = parseSetWiFiCommandPayload(jsonPayload); + + if (!payload.has_value()) + { + return CommandResult::getErrorResult("Invalid payload"); + } + auto wifiConfig = payload.value(); + + std::shared_ptr projectConfig = registry->resolve(DependencyType::project_config); + projectConfig->setWifiConfig( + wifiConfig.networkName, + wifiConfig.ssid, + wifiConfig.password, + wifiConfig.channel, + wifiConfig.power); + + return CommandResult::getSuccessResult("Config updated"); +} + +CommandResult deleteWiFiCommand(std::shared_ptr registry, std::string_view jsonPayload) +{ + auto payload = parseDeleteWifiCommandPayload(jsonPayload); + if (!payload.has_value()) + return CommandResult::getErrorResult("Invalid payload"); + + std::shared_ptr projectConfig = registry->resolve(DependencyType::project_config); + + projectConfig->deleteWifiConfig(payload.value().networkName); + return CommandResult::getSuccessResult("Config updated"); +} + +CommandResult updateWiFiCommand(std::shared_ptr registry, std::string_view jsonPayload) +{ + auto payload = parseUpdateWifiCommandPayload(jsonPayload); + if (!payload.has_value()) + { + return CommandResult::getErrorResult("Invalid payload"); + } + + auto updatedConfig = payload.value(); + + std::shared_ptr projectConfig = registry->resolve(DependencyType::project_config); + auto storedNetworks = projectConfig->getWifiConfigs(); + if (auto networkToUpdate = std::find_if( + storedNetworks.begin(), + storedNetworks.end(), + [&](auto &network) + { return network.name == updatedConfig.networkName; }); + networkToUpdate != storedNetworks.end()) + { + projectConfig->setWifiConfig( + updatedConfig.networkName, + updatedConfig.ssid.has_value() ? updatedConfig.ssid.value() : networkToUpdate->ssid, + updatedConfig.password.has_value() ? updatedConfig.password.value() : networkToUpdate->password, + updatedConfig.channel.has_value() ? updatedConfig.channel.value() : networkToUpdate->channel, + updatedConfig.power.has_value() ? updatedConfig.power.value() : networkToUpdate->power); + + return CommandResult::getSuccessResult("Config updated"); + } + else + return CommandResult::getErrorResult("Requested network does not exist"); +} + +CommandResult updateAPWiFiCommand(std::shared_ptr registry, std::string_view jsonPayload) +{ + auto payload = parseUpdateAPWiFiCommandPayload(jsonPayload); if (!payload.has_value()) return CommandResult::getErrorResult("Invalid payload"); auto updatedConfig = payload.value(); + + std::shared_ptr projectConfig = registry->resolve(DependencyType::project_config); auto previousAPConfig = projectConfig->getAPWifiConfig(); projectConfig->setAPWifiConfig( diff --git a/components/CommandManager/CommandManager/commands/wifi_commands.hpp b/components/CommandManager/CommandManager/commands/wifi_commands.hpp index 39cb695..e344427 100644 --- a/components/CommandManager/CommandManager/commands/wifi_commands.hpp +++ b/components/CommandManager/CommandManager/commands/wifi_commands.hpp @@ -1,41 +1,20 @@ -#include "BaseCommand.hpp" +#include +#include +#include +#include +#include +#include "CommandResult.hpp" +#include "CommandSchema.hpp" +#include "DependencyRegistry.hpp" -class setWiFiCommand : public Command -{ - std::shared_ptr projectConfig; +std::optional parseSetWiFiCommandPayload(std::string_view jsonPayload); +CommandResult setWiFiCommand(std::shared_ptr registry, std::string_view jsonPayload); -public: - setWiFiCommand(std::shared_ptr projectConfig) : projectConfig(projectConfig) {}; - CommandResult execute(std::string_view jsonPayload) override; - std::optional parsePayload(std::string_view jsonPayload); -}; +std::optional parseDeleteWifiCommandPayload(std::string_view jsonPayload); +CommandResult deleteWiFiCommand(std::shared_ptr registry, std::string_view jsonPayload); -class deleteWifiCommand : public Command -{ - std::shared_ptr projectConfig; +std::optional parseUpdateWifiCommandPayload(std::string_view jsonPayload); +CommandResult updateWiFiCommand(std::shared_ptr registry, std::string_view jsonPayload); -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); -}; +std::optional parseUpdateAPWiFiCommandPayload(std::string_view jsonPayload); +CommandResult updateAPWiFiCommand(std::shared_ptr registry, std::string_view jsonPayload); diff --git a/main/openiris_main.cpp b/main/openiris_main.cpp index 22e7fe9..1a1c65a 100644 --- a/main/openiris_main.cpp +++ b/main/openiris_main.cpp @@ -30,16 +30,19 @@ static const char *TAG = "[MAIN]"; +std::shared_ptr dependencyRegistry = std::make_unique(); +std::shared_ptr commandManager = std::make_shared(dependencyRegistry); + WebSocketLogger webSocketLogger; Preferences preferences; -auto deviceConfig = std::make_shared(&preferences); +std::shared_ptr deviceConfig = std::make_shared(&preferences); WiFiManager wifiManager(deviceConfig); MDNSManager mdnsManager(deviceConfig); + std::shared_ptr cameraHandler = std::make_shared(deviceConfig); StreamServer streamServer(80); -auto commandManager = std::make_shared(deviceConfig, cameraHandler); RestAPI restAPI("http://0.0.0.0:81", commandManager); #ifdef CONFIG_WIRED_MODE @@ -71,8 +74,10 @@ int test_log(const char *format, va_list args) extern "C" void app_main(void) { - // uvc plan + dependencyRegistry->registerService(DependencyType::project_config, deviceConfig); + dependencyRegistry->registerService(DependencyType::camera_manager, cameraHandler); + // uvc plan // cleanup the logs - done // prepare the camera to be initialized with UVC - done? // debug uvc performance - done @@ -90,7 +95,7 @@ extern "C" void app_main(void) // then add ADHOC and support for more networks in wifi manager - done // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - // simplify commands - a simple dependency injection + std::function should do it + // simplify commands - a simple dependency injection + std::function should do it - DONE // something like // template // void registerService(std::shared_pointer service)