-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAutoStateMachine.h
77 lines (62 loc) · 1.98 KB
/
AutoStateMachine.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#ifndef AUTOSTATEMACHINE_H
#define AUTOSTATEMACHINE_H
#include <Arduino.h>
// Define callback function pointer types
typedef void (*StateFunction)();
typedef void (*TransitionCallback)();
typedef bool (*TransitionCondition)();
template <uint8_t MAX_STATES = 10, uint8_t MAX_TRANSITIONS = 20>
class AutoStateMachine {
public:
AutoStateMachine();
// State management
bool addState(uint8_t id, StateFunction func,
TransitionCallback onEnter = nullptr,
TransitionCallback onExit = nullptr);
void setInitialState(uint8_t id);
// State machine control
void transitionTo(uint8_t id);
bool handleEvent(uint8_t eventId, void* eventData = nullptr);
void run();
void update();
void reset();
// Transition configuration
bool addTransition(uint8_t fromState, uint8_t eventId, uint8_t toState,
TransitionCondition condition = nullptr);
void setTimeout(uint8_t stateId, unsigned long timeoutMs, uint8_t timeoutState);
// Debugging
void enableDebug(Print& debugStream);
void disableDebug();
// State information
uint8_t getCurrentState() const;
bool stateExists(uint8_t id) const;
private:
struct State {
uint8_t id;
StateFunction func;
TransitionCallback onEnter;
TransitionCallback onExit;
unsigned long timeoutMs;
uint8_t timeoutState;
};
struct Transition {
uint8_t fromState;
uint8_t eventId;
uint8_t toState;
TransitionCondition condition;
};
State states[MAX_STATES];
Transition transitions[MAX_TRANSITIONS];
uint8_t stateCount;
uint8_t transitionCount;
uint8_t currentStateId;
uint8_t initialStateId;
unsigned long stateEnterTime;
Print* debugStream;
void* currentEventData;
void log(const char* message);
void callStateCallback(TransitionCallback callback);
bool executeTransition(const Transition& transition);
};
#include "AutoStateMachine.tpp"
#endif // AUTOSTATEMACHINE_H