typedef enum {
state_1 = 1,
state_2,
state_3
}
State;
typedef enum {
event_1 = 1,
event_2,
event_3,
event_4,
event_5
}EventID;
typedef void (*Action)(const EventID *);
typedef struct {
State curState;
EventID eventId;
State nextState;
Action action;
}StateTransform;
typedef struct {
State state;
int transNum;
StateTransform* transform;
}StateMachine;
void runStateMachine(StateMachine* pSM, const EventID evt);
StateTransform* findTranss(StateMachine* pSM, const EventID evt)
{
int i;
for (i = 0; i < pSM->transNum; i++) {
if ((pSM->transform[i].curState == pSM->state) && (pSM->transform[i].eventId == evt)) {
return &pSM->transform[i];
}
}
return NULL;
}
void runStateMachine(StateMachine* pSM, EventID evt) {
StateTransform* pTrans;
pTrans = findTranss(pSM, evt);
if (pTrans == NULL)
{
printf("CurState= %s Do not process enent: %s\r\n", pSM->state, evt);
return;
}
pSM->state = pTrans->nextState;
Action act = pTrans->action;
if (act == NULL) {
printf("change state to %s. No action\r\n", pSM->state);
return;
}
act(&evt);
}