forked from xiaozhi/xiaozhi-esp32
* Upgrade component version * update fonts component version * Handle OTA error code * Update project version to 2.1.0 and add device state machine implementation - Upgrade esp-wifi-connect to 3.0.0, allowing reconfiguring wifi without rebooting - Introduce device state machine with state change notification in new files - Remove obsolete device state event files - Update application logic to utilize new state machine - Minor adjustments in various board implementations for state handling * fix compile errors * Refactor power saving mode implementation to use PowerSaveLevel enumeration - Updated Application class to replace SetPowerSaveMode with SetPowerSaveLevel, allowing for LOW_POWER and PERFORMANCE settings. - Modified various board implementations to align with the new power save level structure. - Ensured consistent handling of power save levels across different board files, enhancing code maintainability and clarity. * Refactor power save level checks across multiple board implementations - Updated the condition for power save level checks in various board files to ensure that the power save timer only wakes up when the level is not set to LOW_POWER. - Improved consistency in handling power save levels, enhancing code clarity and maintainability. * Refactor EnterWifiConfigMode calls in board implementations - Updated calls to EnterWifiConfigMode to use the appropriate instance reference (self or board) across multiple board files. - Improved code consistency and clarity in handling device state during WiFi configuration mode entry. * Add cellular modem event handling and improve network status updates - Introduced new network events for cellular modem operations, including detecting, registration errors, and timeouts. - Enhanced the Application class to handle different network states and update the display status accordingly. - Refactored Ml307Board to implement a callback mechanism for network events, improving modularity and responsiveness. - Updated dual_network_board and board headers to support new network event callbacks, ensuring consistent handling across board implementations. * update esp-wifi-connect version * Update WiFi configuration tool messages across multiple board implementations to clarify user actions
84 lines
2.2 KiB
C++
84 lines
2.2 KiB
C++
#ifndef DEVICE_STATE_MACHINE_H
|
|
#define DEVICE_STATE_MACHINE_H
|
|
|
|
#include <atomic>
|
|
#include <functional>
|
|
#include <mutex>
|
|
#include <vector>
|
|
|
|
#include "device_state.h"
|
|
|
|
/**
|
|
* DeviceStateMachine - Manages device state transitions with validation
|
|
*
|
|
* This class ensures strict state transition rules and provides a callback mechanism
|
|
* for components to react to state changes.
|
|
*/
|
|
class DeviceStateMachine {
|
|
public:
|
|
DeviceStateMachine();
|
|
~DeviceStateMachine() = default;
|
|
|
|
// Delete copy constructor and assignment operator
|
|
DeviceStateMachine(const DeviceStateMachine&) = delete;
|
|
DeviceStateMachine& operator=(const DeviceStateMachine&) = delete;
|
|
|
|
/**
|
|
* Get the current device state
|
|
*/
|
|
DeviceState GetState() const { return current_state_.load(); }
|
|
|
|
/**
|
|
* Attempt to transition to a new state
|
|
* @param new_state The target state
|
|
* @return true if transition was successful, false if invalid transition
|
|
*/
|
|
bool TransitionTo(DeviceState new_state);
|
|
|
|
/**
|
|
* Check if transition to target state is valid from current state
|
|
*/
|
|
bool CanTransitionTo(DeviceState target) const;
|
|
|
|
/**
|
|
* State change callback type
|
|
* Parameters: old_state, new_state
|
|
*/
|
|
using StateCallback = std::function<void(DeviceState, DeviceState)>;
|
|
|
|
/**
|
|
* Add a state change listener (observer pattern)
|
|
* Callback is invoked in the context of the caller of TransitionTo()
|
|
* @return listener id for removal
|
|
*/
|
|
int AddStateChangeListener(StateCallback callback);
|
|
|
|
/**
|
|
* Remove a state change listener by id
|
|
*/
|
|
void RemoveStateChangeListener(int listener_id);
|
|
|
|
/**
|
|
* Get state name string for logging
|
|
*/
|
|
static const char* GetStateName(DeviceState state);
|
|
|
|
private:
|
|
std::atomic<DeviceState> current_state_{kDeviceStateUnknown};
|
|
std::vector<std::pair<int, StateCallback>> listeners_;
|
|
int next_listener_id_{0};
|
|
std::mutex mutex_;
|
|
|
|
/**
|
|
* Check if transition from source to target is valid
|
|
*/
|
|
bool IsValidTransition(DeviceState from, DeviceState to) const;
|
|
|
|
/**
|
|
* Notify callback of state change
|
|
*/
|
|
void NotifyStateChange(DeviceState old_state, DeviceState new_state);
|
|
};
|
|
|
|
#endif // DEVICE_STATE_MACHINE_H
|