-
Notifications
You must be signed in to change notification settings - Fork 0
/
STATE_MACHINE.cpp
79 lines (68 loc) · 2.09 KB
/
STATE_MACHINE.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
#include "mainwindow.h"
#include <QApplication>
#include <QDebug>
typedef enum{STATE_A,STATE_B,STATE_C,STATE_D,NUM_STATES}StateType;
StateType fsmState = STATE_A;
typedef enum{RETURN_OK,RETURN_FAIL,RETURN_REPEAT}ReturnCodes;
ReturnCodes entry_state(void){qDebug()<<"entry";return RETURN_OK;}
ReturnCodes foo_state(void){qDebug()<<"foo";return RETURN_OK;}
ReturnCodes bar_state(void){qDebug()<<"bar";return RETURN_OK;}
ReturnCodes baz_state(void){qDebug()<<"baz";return RETURN_OK;}
typedef struct{
StateType CurrentState;
ReturnCodes ReturnState;
StateType NextState;
ReturnCodes(*fptr)(void);
}StateMachineType;
static const StateMachineType FSM[] =
{
// Current Transition Next
// State ID Letter State ID
{STATE_A ,RETURN_OK ,STATE_B ,entry_state},
{STATE_B ,RETURN_OK ,STATE_C ,foo_state},
{STATE_C ,RETURN_OK ,STATE_D ,bar_state},
{STATE_D ,RETURN_OK ,STATE_A ,baz_state},
};
StateMachineType const *table_begin(void);
StateMachineType const *table_end(void);
void lookup_transition(StateType fsmstate, ReturnCodes returnCodes);
static const int SIZE_FSM = sizeof(FSM)/sizeof(FSM[0]);
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
ReturnCodes rc;
while(1){
rc = (*FSM[fsmState].fptr)();
lookup_transition(fsmState,rc);
}
return a.exec();
}
StateMachineType const *
table_begin(void)
{
return &FSM[0];
}
StateMachineType const *
table_end(void)
{
return &FSM[SIZE_FSM];
}
//! Buscamos el estado de transicion
void lookup_transition(StateType fsmstate, ReturnCodes returnCodes)
{
StateMachineType const * pEntry = table_begin();
StateMachineType const * pEnd = table_end();
bool bStateFound = false;
while ((!bStateFound) && (pEntry != pEnd)){
if (pEntry->CurrentState == fsmstate){
if (pEntry->ReturnState == returnCodes){
fsmState = pEntry->NextState;
bStateFound = true;
break;
}
}
++pEntry;
}
}