-
Notifications
You must be signed in to change notification settings - Fork 97
/
Fsm.h
85 lines (66 loc) · 1.98 KB
/
Fsm.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
78
79
80
81
82
83
84
85
// This file is part of arduino-fsm.
//
// arduino-fsm is free software: you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License as published by the Free
// Software Foundation, either version 3 of the License, or (at your option)
// any later version.
//
// arduino-fsm is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
// for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with arduino-fsm. If not, see <http://www.gnu.org/licenses/>.
#ifndef FSM_H
#define FSM_H
#if defined(ARDUINO) && ARDUINO >= 100
#include <Arduino.h>
#else
#include <WProgram.h>
#endif
struct State
{
State(void (*on_enter)(), void (*on_state)(), void (*on_exit)());
void (*on_enter)();
void (*on_state)();
void (*on_exit)();
};
class Fsm
{
public:
Fsm(State* initial_state);
~Fsm();
void add_transition(State* state_from, State* state_to, int event,
void (*on_transition)());
void add_timed_transition(State* state_from, State* state_to,
unsigned long interval, void (*on_transition)());
void check_timed_transitions();
void trigger(int event);
void run_machine();
private:
struct Transition
{
State* state_from;
State* state_to;
int event;
void (*on_transition)();
};
struct TimedTransition
{
Transition transition;
unsigned long start;
unsigned long interval;
};
static Transition create_transition(State* state_from, State* state_to,
int event, void (*on_transition)());
void make_transition(Transition* transition);
private:
State* m_current_state;
Transition* m_transitions;
int m_num_transitions;
TimedTransition* m_timed_transitions;
int m_num_timed_transitions;
bool m_initialized;
};
#endif