Files
xiaozhi-esp32/main/device_state_machine.h

84 lines
2.2 KiB
C
Raw Normal View History

v2.1.0: Upgrade esp-wifi-connect to 3.0; New device state machine (#1528) * 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
2025-12-09 09:24:56 +08:00
#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