diff --git a/components/CommandManager/CMakeLists.txt b/components/CommandManager/CMakeLists.txt index 7eb5c06..30a6234 100644 --- a/components/CommandManager/CMakeLists.txt +++ b/components/CommandManager/CMakeLists.txt @@ -10,5 +10,5 @@ idf_component_register( INCLUDE_DIRS "CommandManager" "CommandManager/commands" - REQUIRES ProjectConfig cJSON CameraManager + REQUIRES ProjectConfig cJSON CameraManager OpenIrisTasks ) \ No newline at end of file diff --git a/components/CommandManager/CommandManager/CommandManager.cpp b/components/CommandManager/CommandManager/CommandManager.cpp index 1aed2f5..9a7f1f6 100644 --- a/components/CommandManager/CommandManager/CommandManager.cpp +++ b/components/CommandManager/CommandManager/CommandManager.cpp @@ -4,6 +4,7 @@ std::unordered_map commandTypeMap = { {"ping", CommandType::PING}, {"set_wifi", CommandType::SET_WIFI}, {"update_wifi", CommandType::UPDATE_WIFI}, + {"set_streaming_mode", CommandType::SET_STREAMING_MODE}, {"update_device", CommandType::UPDATE_DEVICE}, {"delete_network", CommandType::DELETE_NETWORK}, {"update_ap_wifi", CommandType::UPDATE_AP_WIFI}, @@ -22,6 +23,8 @@ std::function CommandManager::createCommand(CommandType type, s { case CommandType::PING: return { PingCommand }; + case CommandType::SET_STREAMING_MODE: + return [this, json] {return setDeviceModeCommand(this->registry, json); }; case CommandType::SET_WIFI: return [this, json] { return setWiFiCommand(this->registry, json); }; case CommandType::UPDATE_WIFI: diff --git a/components/CommandManager/CommandManager/CommandManager.hpp b/components/CommandManager/CommandManager/CommandManager.hpp index 09de8c3..7042db9 100644 --- a/components/CommandManager/CommandManager/CommandManager.hpp +++ b/components/CommandManager/CommandManager/CommandManager.hpp @@ -25,6 +25,7 @@ enum class CommandType PING, SET_WIFI, UPDATE_DEVICE, + SET_STREAMING_MODE, UPDATE_WIFI, DELETE_NETWORK, UPDATE_AP_WIFI, @@ -40,7 +41,6 @@ enum class CommandType class CommandManager { -private: std::shared_ptr registry; public: diff --git a/components/CommandManager/CommandManager/CommandSchema.hpp b/components/CommandManager/CommandManager/CommandSchema.hpp index dfa4a35..991b928 100644 --- a/components/CommandManager/CommandManager/CommandSchema.hpp +++ b/components/CommandManager/CommandManager/CommandSchema.hpp @@ -1,9 +1,7 @@ #ifndef COMMAND_SCHEMA_HPP #define COMMAND_SCHEMA_HPP -struct BasePayload -{ -}; +struct BasePayload {}; struct WifiPayload : BasePayload { @@ -28,7 +26,6 @@ struct deleteNetworkPayload : BasePayload std::string networkName; }; -// implement struct UpdateAPWiFiPayload : BasePayload { std::optional ssid; @@ -36,7 +33,7 @@ struct UpdateAPWiFiPayload : BasePayload std::optional channel; }; -struct MDNSPayload : public BasePayload +struct MDNSPayload : BasePayload { std::string hostname; }; diff --git a/components/CommandManager/CommandManager/commands/config_commands.cpp b/components/CommandManager/CommandManager/commands/config_commands.cpp index d966035..b0d52b9 100644 --- a/components/CommandManager/CommandManager/commands/config_commands.cpp +++ b/components/CommandManager/CommandManager/commands/config_commands.cpp @@ -29,6 +29,7 @@ CommandResult saveConfigCommand(std::shared_ptr registry) projectConfig->save(); return CommandResult::getSuccessResult("Config saved"); } + CommandResult getConfigCommand(std::shared_ptr registry) { std::shared_ptr projectConfig = registry->resolve(DependencyType::project_config); diff --git a/components/CommandManager/CommandManager/commands/device_commands.cpp b/components/CommandManager/CommandManager/commands/device_commands.cpp index e8fbc7f..f3f2a31 100644 --- a/components/CommandManager/CommandManager/commands/device_commands.cpp +++ b/components/CommandManager/CommandManager/commands/device_commands.cpp @@ -1,8 +1,33 @@ #include "device_commands.hpp" -CommandResult restartDeviceCommand() -{ - // todo implement this: https://github.com/EyeTrackVR/OpenIris/blob/master/ESP/lib/src/tasks/tasks.cpp - // OpenIrisTasks::ScheduleRestart(2000); - return CommandResult::getSuccessResult("Device restarted"); -} \ No newline at end of file +#include +#include + +// Implementation inspired by SummerSigh work, initial PR opened in openiris repo, adapted to this rewrite +CommandResult setDeviceModeCommand(std::shared_ptr registry, std::string_view jsonPayload) { + const auto parsedJson = cJSON_Parse(jsonPayload.data()); + if (parsedJson == nullptr) { + return CommandResult::getErrorResult("Invalid payload"); + } + + const auto modeObject = cJSON_GetObjectItem(parsedJson, "mode"); + if (modeObject == nullptr) { + return CommandResult::getErrorResult("Invalid payload - missing mode"); + } + + const auto mode = modeObject->valueint; + + if (mode < 0 || mode > 2) { + return CommandResult::getErrorResult("Invalid payload - unsupported mode"); + } + + const auto projectConfig = registry->resolve(DependencyType::project_config); + projectConfig->setDeviceMode(static_cast(mode)); + + return CommandResult::getSuccessResult("Device mode set"); +} + +CommandResult restartDeviceCommand() { + OpenIrisTasks::ScheduleRestart(2000); + return CommandResult::getSuccessResult("Device restarted"); +} diff --git a/components/CommandManager/CommandManager/commands/device_commands.hpp b/components/CommandManager/CommandManager/commands/device_commands.hpp index b227708..4efa65a 100644 --- a/components/CommandManager/CommandManager/commands/device_commands.hpp +++ b/components/CommandManager/CommandManager/commands/device_commands.hpp @@ -1,3 +1,7 @@ #include "CommandResult.hpp" +#include "OpenIrisTasks.hpp" +#include "DependencyRegistry.hpp" + +CommandResult setDeviceModeCommand(std::shared_ptr registry, std::string_view jsonPayload); CommandResult restartDeviceCommand(); \ No newline at end of file diff --git a/components/ProjectConfig/ProjectConfig/Models.hpp b/components/ProjectConfig/ProjectConfig/Models.hpp index d077779..f931775 100644 --- a/components/ProjectConfig/ProjectConfig/Models.hpp +++ b/components/ProjectConfig/ProjectConfig/Models.hpp @@ -1,6 +1,6 @@ #pragma once -#ifndef _PROJECT_CONFIG_MODELS_HPP_ -#define _PROJECT_CONFIG_MODELS_HPP_ +#ifndef PROJECT_CONFIG_MODELS_HPP +#define PROJECT_CONFIG_MODELS_HPP #include #include @@ -20,6 +20,26 @@ struct BaseConfigModel Preferences *pref; }; +enum class StreamingMode { + AUTO, + UVC, + WIFI, +}; + +struct DeviceMode_t : BaseConfigModel { + StreamingMode mode; + explicit DeviceMode_t( Preferences *pref) : BaseConfigModel(pref), mode(StreamingMode::AUTO){} + + void load() { + this->mode = static_cast(this->pref->getInt("mode", 0)); + } + + void save() const { + this->pref->putInt("mode", static_cast(this->mode)); + } +}; + + struct DeviceConfig_t : BaseConfigModel { DeviceConfig_t(Preferences *pref) : BaseConfigModel(pref) {} @@ -238,6 +258,7 @@ class TrackerConfig_t { public: DeviceConfig_t device; + DeviceMode_t device_mode; CameraConfig_t camera; std::vector networks; AP_WiFiConfig_t ap_network; @@ -246,16 +267,18 @@ public: TrackerConfig_t( DeviceConfig_t device, + DeviceMode_t device_mode, CameraConfig_t camera, std::vector networks, AP_WiFiConfig_t ap_network, MDNSConfig_t mdns, WiFiTxPower_t txpower) : device(std::move(device)), - camera(camera), + device_mode(std::move(device_mode)), + camera(std::move(camera)), networks(std::move(networks)), ap_network(std::move(ap_network)), mdns(std::move(mdns)), - txpower(txpower) {} + txpower(std::move(txpower)) {} std::string toRepresentation() { diff --git a/components/ProjectConfig/ProjectConfig/ProjectConfig.cpp b/components/ProjectConfig/ProjectConfig/ProjectConfig.cpp index 5d9ee06..eb42bdc 100644 --- a/components/ProjectConfig/ProjectConfig/ProjectConfig.cpp +++ b/components/ProjectConfig/ProjectConfig/ProjectConfig.cpp @@ -15,6 +15,7 @@ void saveNetworkCount(Preferences *pref, const int count) ProjectConfig::ProjectConfig(Preferences *pref) : pref(pref), _already_loaded(false), config(DeviceConfig_t(pref), + DeviceMode_t(pref), CameraConfig_t(pref), std::vector{}, AP_WiFiConfig_t(pref), @@ -26,6 +27,7 @@ ProjectConfig::~ProjectConfig() = default; void ProjectConfig::save() const { ESP_LOGD(CONFIGURATION_TAG, "Saving project config"); this->config.device.save(); + this->config.device_mode.save(); this->config.camera.save(); this->config.mdns.save(); this->config.txpower.save(); @@ -61,6 +63,7 @@ void ProjectConfig::load() ESP_LOGI(CONFIGURATION_TAG, "Config loaded: %s", success ? "true" : "false"); this->config.device.load(); + this->config.device_mode.load(); this->config.camera.load(); this->config.mdns.load(); this->config.txpower.load(); @@ -207,6 +210,10 @@ void ProjectConfig::setAPWifiConfig(const std::string &ssid, ESP_LOGD(CONFIGURATION_TAG, "Updating access point config"); } +void ProjectConfig::setDeviceMode(const StreamingMode deviceMode) { + this->config.device_mode.mode = deviceMode; +} + //********************************************************************************************************************** //* //! Get Methods @@ -240,4 +247,8 @@ WiFiTxPower_t &ProjectConfig::getWiFiTxPowerConfig() TrackerConfig_t &ProjectConfig::getTrackerConfig() { return this->config; +} + +DeviceMode_t &ProjectConfig::getDeviceMode() { + return this->config.device_mode; } \ No newline at end of file diff --git a/components/ProjectConfig/ProjectConfig/ProjectConfig.hpp b/components/ProjectConfig/ProjectConfig/ProjectConfig.hpp index cc37eca..da59033 100644 --- a/components/ProjectConfig/ProjectConfig/ProjectConfig.hpp +++ b/components/ProjectConfig/ProjectConfig/ProjectConfig.hpp @@ -31,6 +31,7 @@ public: bool reset(); DeviceConfig_t &getDeviceConfig(); + DeviceMode_t &getDeviceMode(); CameraConfig_t &getCameraConfig(); std::vector &getWifiConfigs(); AP_WiFiConfig_t &getAPWifiConfig(); @@ -59,6 +60,7 @@ public: const std::string &password, uint8_t channel); void setWiFiTxPower(uint8_t power); + void setDeviceMode(StreamingMode deviceMode); private: Preferences *pref;