From 336db18f97b568c2ef1a6896900be04dcf512bb2 Mon Sep 17 00:00:00 2001 From: Lorow Date: Sat, 21 Sep 2024 14:13:44 +0200 Subject: [PATCH] Add proper state manager --- components/StateManager/CMakeLists.txt | 3 + .../StateManager/StateManager.cpp | 9 ++ .../StateManager/StateManager.hpp | 128 ++++++++++++++++++ components/wifiManager/CMakeLists.txt | 2 +- .../wifiManager/wifiManager/wifiManager.cpp | 11 +- .../wifiManager/wifiManager/wifiManager.hpp | 19 +-- main/openiris_main.cpp | 4 +- 7 files changed, 151 insertions(+), 25 deletions(-) create mode 100644 components/StateManager/CMakeLists.txt create mode 100644 components/StateManager/StateManager/StateManager.cpp create mode 100644 components/StateManager/StateManager/StateManager.hpp diff --git a/components/StateManager/CMakeLists.txt b/components/StateManager/CMakeLists.txt new file mode 100644 index 0000000..f35cd84 --- /dev/null +++ b/components/StateManager/CMakeLists.txt @@ -0,0 +1,3 @@ +idf_component_register(SRCS "StateManager/StateManager.cpp" + INCLUDE_DIRS "StateManager" +) \ No newline at end of file diff --git a/components/StateManager/StateManager/StateManager.cpp b/components/StateManager/StateManager/StateManager.cpp new file mode 100644 index 0000000..bbe18c7 --- /dev/null +++ b/components/StateManager/StateManager/StateManager.cpp @@ -0,0 +1,9 @@ +#include "StateManager.hpp" + +StateManager wifiStateManager; +StateManager webServerStateManager; +StateManager mdnsStateManager; +StateManager cameraStateManager; +StateManager ledStateManager; +StateManager streamStateManager; +StateManager configStateManager; diff --git a/components/StateManager/StateManager/StateManager.hpp b/components/StateManager/StateManager/StateManager.hpp new file mode 100644 index 0000000..3829184 --- /dev/null +++ b/components/StateManager/StateManager/StateManager.hpp @@ -0,0 +1,128 @@ +#pragma once +#ifndef STATEMANAGER_HPP +#define STATEMANAGER_HPP +/* + * StateManager + * All Project States are managed here + */ +struct DeviceStates +{ + enum LEDStates_e + { + _LedStateNone, + _Improv_Start, + _Improv_Stop, + _Improv_Processing, + _Improv_Error, + _WebServerState_Error, + _WiFiState_Error, + _MDNSState_Error, + _Camera_Error, + _WiFiState_Connecting, + _WiFiState_Connected + }; + + enum ConfigState_e + { + configLoaded, + deviceConfigUpdated, + mdnsConfigUpdated, + networksConfigUpdated, + apConfigUpdated, + wifiTxPowerUpdated, + cameraConfigUpdated + }; + + enum WiFiState_e + { + WiFiState_NotInitialized, + WiFiState_Initialized, + WiFiState_ReadyToConect, + WiFiState_Connecting, + WiFiState_WaitingForIp, + WiFiState_Connected, + WiFiState_Disconnected, + WiFiState_ADHOC, + WiFiState_Error + }; + + enum WebServerState_e + { + WebServerState_Stopped, + WebServerState_Starting, + WebServerState_Started, + WebServerState_Stopping, + WebServerState_Error + }; + + enum MDNSState_e + { + MDNSState_Stopped, + MDNSState_Starting, + MDNSState_Started, + MDNSState_Stopping, + MDNSState_Error, + MDNSState_QueryStarted, + MDNSState_QueryComplete + }; + + enum CameraState_e + { + Camera_Disconnected, + Camera_Success, + Camera_Connected, + Camera_Error + }; + + enum StreamState_e + { + Stream_OFF, + Stream_ON, + Stream_Error + }; +}; + +/* + * EventManager + * All Project Events are managed here + */ +template +class StateManager +{ +public: + StateManager() { this->_current_state = static_cast(0); } + + virtual ~StateManager() {} + + /* + * @brief Sets the state of the stateManager + * @param T state - the state to be set + */ + void setState(T state) { _current_state = state; } + + /* + * @brief Returns the current state of the stateManager + */ + T getCurrentState() { return _current_state; } + +private: + T _current_state; +}; + +typedef DeviceStates::WiFiState_e WiFiState_e; +typedef DeviceStates::WebServerState_e WebServerState_e; +typedef DeviceStates::MDNSState_e MDNSState_e; +typedef DeviceStates::CameraState_e CameraState_e; +typedef DeviceStates::LEDStates_e LEDStates_e; +typedef DeviceStates::StreamState_e StreamState_e; +typedef DeviceStates::ConfigState_e ConfigState_e; + +extern StateManager wifiStateManager; +extern StateManager webServerStateManager; +extern StateManager mdnsStateManager; +extern StateManager cameraStateManager; +extern StateManager ledStateManager; +extern StateManager streamStateManager; +extern StateManager configStateManager; + +#endif // STATEMANAGER_HPP diff --git a/components/wifiManager/CMakeLists.txt b/components/wifiManager/CMakeLists.txt index d234210..eb1c1ad 100644 --- a/components/wifiManager/CMakeLists.txt +++ b/components/wifiManager/CMakeLists.txt @@ -1,4 +1,4 @@ idf_component_register(SRCS "wifiManager/wifiManager.cpp" INCLUDE_DIRS "wifiManager" - REQUIRES esp_wifi nvs_flash esp_event esp_netif lwip + REQUIRES esp_wifi nvs_flash esp_event esp_netif lwip StateManager ) \ No newline at end of file diff --git a/components/wifiManager/wifiManager/wifiManager.cpp b/components/wifiManager/wifiManager/wifiManager.cpp index c9c4237..a51606b 100644 --- a/components/wifiManager/wifiManager/wifiManager.cpp +++ b/components/wifiManager/wifiManager/wifiManager.cpp @@ -1,7 +1,5 @@ #include "wifiManager.hpp" -WiFiManager::state_e WiFiManager::_state = {state_e::NOT_INITIALIZED}; - void event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data) { @@ -80,11 +78,11 @@ void WiFiManager::Begin() ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &_wifi_cfg)); - _state = state_e::READY_TO_CONNECT; + wifiStateManager.setState(WiFiState_e::WiFiState_ReadyToConect); esp_wifi_start(); ESP_LOGI(WIFI_MAMANGER_TAG, "wifi_init_sta finished."); - _state = state_e::CONNECTING; + wifiStateManager.setState(WiFiState_e::WiFiState_Connecting); EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group, WIFI_CONNECTED_BIT | WIFI_FAIL_BIT, pdFALSE, @@ -97,14 +95,15 @@ void WiFiManager::Begin() { ESP_LOGI(WIFI_MAMANGER_TAG, "connected to ap SSID:%s password:%s", _wifi_cfg.sta.ssid, _wifi_cfg.sta.password); - _state = state_e::CONNECTED; + + wifiStateManager.setState(WiFiState_e::WiFiState_Connected); } else if (bits & WIFI_FAIL_BIT) { ESP_LOGE(WIFI_MAMANGER_TAG, "Failed to connect to SSID:%s, password:%s", _wifi_cfg.sta.ssid, _wifi_cfg.sta.password); - _state = state_e::ERROR; + wifiStateManager.setState(WiFiState_e::WiFiState_Error); } else { diff --git a/components/wifiManager/wifiManager/wifiManager.hpp b/components/wifiManager/wifiManager/wifiManager.hpp index 2784530..43a89ba 100644 --- a/components/wifiManager/wifiManager/wifiManager.hpp +++ b/components/wifiManager/wifiManager/wifiManager.hpp @@ -5,6 +5,8 @@ #include #include #include +#include + #include "esp_event.h" #include "esp_wifi.h" #include "esp_log.h" @@ -19,20 +21,6 @@ static const char *WIFI_MAMANGER_TAG = "[WIFI_MANAGER]"; class WiFiManager { -public: -public: - enum class state_e - { - NOT_INITIALIZED, - INITIALIZED, - READY_TO_CONNECT, - CONNECTING, - WAITING_FOR_IP, - CONNECTED, - DISCONNECTED, - ERROR - }; - private: uint8_t channel; wifi_init_config_t _wifi_init_cfg = WIFI_INIT_CONFIG_DEFAULT(); @@ -41,8 +29,6 @@ private: esp_event_handler_instance_t instance_any_id; esp_event_handler_instance_t instance_got_ip; - static state_e _state; - int8_t power; bool _enable_adhoc; @@ -51,7 +37,6 @@ private: public: void SetCredentials(const char *ssid, const char *password); - constexpr const state_e &GetState(void) { return _state; } void Begin(); }; diff --git a/main/openiris_main.cpp b/main/openiris_main.cpp index 808d65f..d93dbbc 100644 --- a/main/openiris_main.cpp +++ b/main/openiris_main.cpp @@ -65,7 +65,9 @@ extern "C" void app_main(void) // port the logo - done // port preferences lib - DONE; prolly temporary // then port the config - done, needs todos done - // then port the led manager as this will be fairly easy + // State Management - done + // then port the led manager as this will be fairly easy - in progress + // then add ADHOC and support for more networks in wifi manager // then port the serial manager // then port the camera manager // then port the streaming stuff (web and uvc)