-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathStateMachine.cpp
140 lines (91 loc) · 2.66 KB
/
StateMachine.cpp
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/*
* StateMachine.cpp
*
* Created on: 20 áôáø 2014
* Author: Miro
*/
#include "StateMachine.h"
void StateMachineMode::init(StateMachine& stateMachine) {
stateMachine.addMode(*this);
addStates(stateMachine);
}
StateMachine::StateMachine() : _currMode(UNDEFINED_MODESTATE), _totalModes(0) {
for (uint8_t i = 0; i< SM_TOTAL_MODES; i++) {
_totalStates[i] = 0;
_currState[i] = 0;
}
}
//StateMachine::~StateMachine() {
// // TODO Auto-generated destructor stub
//}
uint8_t StateMachine::addMode(StateMachineMode& mode) {
// Store Mode object
_modesMap[_totalModes] = &mode;
Serial.print("Mode added - ");
Serial.println(_totalModes);
return _totalModes++;
}
uint8_t StateMachine::addState(StateMachineMode::STATE_FUNCTION_STATIC_T state) {
_statesMap[_totalModes-1][_totalStates[_totalModes-1]] = state;
Serial.print("State added - ");
Serial.print(_totalStates[_totalModes-1]);
Serial.print(" mode - ");
Serial.println(_totalModes-1);
return _totalStates[_totalModes-1]++;
}
bool StateMachine::setMode(StateMachineMode& mode, uint8_t state) {
for (uint8_t i = 0; i < _totalModes; i++) {
if (&mode == _modesMap[i]) {
return setMode(i, state);
}
}
Serial.println("HERE");
return false;
}
bool StateMachine::setMode(uint8_t mode, uint8_t state) {
Serial.print("Setting mode to - ");
Serial.println(mode);
// Check valid input
if (mode >= _totalModes || (state > _totalStates[mode] && state != UNDEFINED_MODESTATE)) {
return false;
}
// If same mode - do nothing
if (mode == _currMode) {
return true;
}
// If previously set - call destructor
if (_currMode != UNDEFINED_MODESTATE) {
_modesMap[_currMode]->end();
}
_currMode = mode;
// Init next mode
_modesMap[_currMode]->begin();
return true;
}
bool StateMachine::setState(uint8_t state) {
// Valid input check
if (_currMode == UNDEFINED_MODESTATE || (state > _totalStates[_currMode] && state != UNDEFINED_MODESTATE)) {
return false;
}
_currState[_currMode] = state;
return true;
}
void StateMachine::onEvent(Event* o, uint16_t eventType, uint32_t param1, uint32_t param2) {
if (_currMode == UNDEFINED_MODESTATE) {
return;
}
StateMachineMode::STATE_FUNCTION_STATIC_T currentHandler = _statesMap[_currMode][_currState[_currMode]];
// Call state of the current mode
SM_COMMAND stateResult = currentHandler(_modesMap[_currMode], eventType, param1, param2);
// Check if state should be changed
switch (stateResult) {
case SM_NEXT_STATE:
_currState[_currMode] = (_currState[_currMode] + 1) % _totalStates[_currMode];
break;
case SM_PREV_STATE:
_currState[_currMode] = (_currState[_currMode] - 1) % _totalStates[_currMode];
break;
default:
break;
}
}