Rewrite state manager, clean up states, fixup typos - todo test state display

This commit is contained in:
Lorow
2025-04-21 23:50:41 +02:00
parent f1cf3baf46
commit 4095f00bb0
14 changed files with 273 additions and 154 deletions

View File

@@ -1,8 +1,98 @@
#include "StateManager.hpp"
StateManager<WiFiState_e> wifiStateManager;
StateManager<MDNSState_e> mdnsStateManager;
StateManager<CameraState_e> cameraStateManager;
StateManager<LEDStates_e> ledStateManager;
StateManager<StreamState_e> streamStateManager;
StateManager<ConfigState_e> configStateManager;
StateManager::StateManager(QueueHandle_t eventQueue, QueueHandle_t ledStateQueue) : eventQueue(eventQueue), ledStateQueue(ledStateQueue) {}
void StateManager::HandleUpdateState()
{
SystemEvent eventBuffer;
auto ledStreamState = LEDStates_e::_LedStateNone;
if (xQueueReceive(this->eventQueue, &eventBuffer, portMAX_DELAY))
{
switch (eventBuffer.source)
{
case EventSource::WIFI:
{
this->wifi_state = std::get<WiFiState_e>(eventBuffer.value);
if (this->wifi_state == WiFiState_e::WiFiState_Connecting)
{
ledStreamState = LEDStates_e::_WiFiState_Connecting;
xQueueSend(this->ledStateQueue, &ledStreamState, 10);
}
if (this->wifi_state == WiFiState_e::WiFiState_Connected)
{
ledStreamState = LEDStates_e::_WiFiState_Connected;
xQueueSend(this->ledStateQueue, &ledStreamState, 10);
}
if (this->wifi_state == WiFiState_e::WiFiState_Error)
{
ledStreamState = LEDStates_e::_WiFiState_Error;
xQueueSend(this->ledStateQueue, &ledStreamState, 10);
}
break;
}
case EventSource::MDNS:
{
this->mdns_state = std::get<MDNSState_e>(eventBuffer.value);
break;
}
case EventSource::CAMERA:
{
this->camera_state = std::get<CameraState_e>(eventBuffer.value);
if (this->camera_state == CameraState_e::Camera_Error)
{
ledStreamState = LEDStates_e::_Camera_Error;
xQueueSend(this->ledStateQueue, &ledStreamState, 10);
}
break;
}
case EventSource::STREAM:
{
this->stream_state = std::get<StreamState_e>(eventBuffer.value);
if (this->stream_state == StreamState_e::Stream_ON)
{
ledStreamState = LEDStates_e::_LedStateStreaming;
xQueueSend(this->ledStateQueue, &ledStreamState, 10);
}
if (this->stream_state == StreamState_e::Stream_ON)
{
ledStreamState = LEDStates_e::_LedStateStreaming;
xQueueSend(this->ledStateQueue, &ledStreamState, 10);
}
break;
}
default:
break;
}
}
}
WiFiState_e StateManager::GetWifiState()
{
return this->wifi_state;
}
CameraState_e StateManager::GetCameraState()
{
return this->camera_state;
}
void HandleStateManagerTask(void *pvParameters)
{
StateManager *stateManager = static_cast<StateManager *>(pvParameters);
while (1)
{
stateManager->HandleUpdateState();
}
}

View File

@@ -1,112 +1,90 @@
#pragma once
#ifndef STATEMANAGER_HPP
#define STATEMANAGER_HPP
/*
* StateManager
* All Project States are managed here
*/
struct DeviceStates
#include <variant>
#include "freertos/FreeRTOS.h"
#include "freertos/queue.h"
enum LEDStates_e
{
enum LEDStates_e
{
_LedStateNone,
_LedStateStreaming,
_LedStateStoppedStreaming,
_WiFiState_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 MDNSState_e
{
MDNSState_Stopped,
MDNSState_Starting,
MDNSState_Started,
MDNSState_Stopping,
MDNSState_Error,
MDNSState_QueryStarted,
MDNSState_QueryComplete
};
enum CameraState_e
{
Camera_Disconnected,
Camera_Success,
Camera_Error
};
enum StreamState_e
{
Stream_OFF,
Stream_ON,
Stream_Error
};
_LedStateNone,
_LedStateStreaming,
_LedStateStoppedStreaming,
_Camera_Error,
_WiFiState_Error,
_WiFiState_Connecting,
_WiFiState_Connected
};
enum WiFiState_e
{
WiFiState_NotInitialized,
WiFiState_Initialized,
WiFiState_ReadyToConect,
WiFiState_Connecting,
WiFiState_WaitingForIp,
WiFiState_Connected,
WiFiState_Disconnected,
WiFiState_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_Error
};
enum StreamState_e
{
Stream_OFF,
Stream_ON,
};
enum class EventSource
{
WIFI,
MDNS,
CAMERA,
STREAM
};
struct SystemEvent
{
EventSource source;
std::variant<WiFiState_e, MDNSState_e, CameraState_e, StreamState_e> value;
};
/*
* EventManager
* All Project Events are managed here
*/
template <class T>
class StateManager
{
public:
StateManager() { this->_current_state = static_cast<T>(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; }
StateManager(QueueHandle_t eventQueue, QueueHandle_t ledStateQueue);
void HandleUpdateState();
WiFiState_e GetWifiState();
CameraState_e GetCameraState();
private:
T _current_state;
QueueHandle_t eventQueue;
QueueHandle_t ledStateQueue;
WiFiState_e wifi_state;
MDNSState_e mdns_state;
CameraState_e camera_state;
StreamState_e stream_state;
};
typedef DeviceStates::WiFiState_e WiFiState_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<WiFiState_e> wifiStateManager;
extern StateManager<MDNSState_e> mdnsStateManager;
extern StateManager<CameraState_e> cameraStateManager;
extern StateManager<LEDStates_e> ledStateManager;
extern StateManager<StreamState_e> streamStateManager;
extern StateManager<ConfigState_e> configStateManager;
void HandleStateManagerTask(void *pvParameters);
#endif // STATEMANAGER_HPP