diff --git a/components/CommandManager/CommandManager/CommandSchema.hpp b/components/CommandManager/CommandManager/CommandSchema.hpp index 2f012c4..dbbe5e5 100644 --- a/components/CommandManager/CommandManager/CommandSchema.hpp +++ b/components/CommandManager/CommandManager/CommandSchema.hpp @@ -44,15 +44,14 @@ struct MDNSPayload : public BasePayload std::string hostname; }; -// todo implement struct UpdateCameraConfigPayload : BasePayload { - uint8_t vflip; - uint8_t href; - uint8_t framesize; - uint8_t quality; - uint8_t brightness; - // todo add more options here + std::optional vflip; + std::optional href; + std::optional framesize; + std::optional quality; + std::optional brightness; + // TODO add more options here }; #endif \ No newline at end of file diff --git a/components/CommandManager/CommandManager/Commands.cpp b/components/CommandManager/CommandManager/Commands.cpp index b1bf753..c9277fb 100644 --- a/components/CommandManager/CommandManager/Commands.cpp +++ b/components/CommandManager/CommandManager/Commands.cpp @@ -227,6 +227,26 @@ std::optional updateCameraCommand::parsePayload(std:: UpdateCameraConfigPayload payload; cJSON *parsedJson = cJSON_Parse(jsonPayload.c_str()); + 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; } @@ -234,7 +254,21 @@ std::optional updateCameraCommand::parsePayload(std:: CommandResult updateCameraCommand::execute(std::string &jsonPayload) { auto payload = parsePayload(jsonPayload); - // todo implement updating + 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"); } diff --git a/components/ProjectConfig/ProjectConfig/ProjectConfig.cpp b/components/ProjectConfig/ProjectConfig/ProjectConfig.cpp index a55fe85..f23c05d 100644 --- a/components/ProjectConfig/ProjectConfig/ProjectConfig.cpp +++ b/components/ProjectConfig/ProjectConfig/ProjectConfig.cpp @@ -1,5 +1,7 @@ #include "ProjectConfig.hpp" +// TODO the current implementation is kinda wack, rethink it + ProjectConfig::ProjectConfig(const std::string &name, const std::string &mdnsName) : _name(std::move(name)),