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)(EventID*);
typedef struct {
State curState;
EventID eventId;
State nextState;
Action action;
}StateTransform;
typedef struct{
State state;
int transNum;
StateTransform* transform;
}StateMachine;
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= %d Do not process enent: %d\r\n", pSM->state,evt);
return;
}
pSM->state = pTrans->nextState;
Action act = pTrans->action;
if (act == NULL) {
printf( "change state to %d. No action\r\n",pSM->state);
return;
}
act(&evt);
}
void f121(EventID* i)
{
printf(" f121\r\n");
}
void f231(EventID* i)
{
printf(" f231\r\n");
}
void f221(EventID* i)
{
printf(" f221\r\n");
}
void f311(EventID* i)
{
printf(" f311\r\n");
}
void f321(EventID* i)
{
printf(" f321\r\n");
}
void f331(EventID* i)
{
printf(" f331\r\n");
}
int run()
{
StateMachine stateMachine;
stateMachine.state = state_1;
stateMachine.transNum = 7;
StateTransform stateTran[] = {
{state_1,event_3,state_2,f121},
{state_1,event_4,state_2,NULL},
{state_2,event_1,state_3,f231},
{state_2,event_4,state_2,f221},
{state_3,event_2,state_1,f311},
{state_3,event_3,state_2,f321},
{state_3,event_5,state_3,f331}
};
stateMachine.transform = stateTran;
EventID inputEvent[15] =
{ event_1, event_2, event_3, event_4, event_5,
event_1, event_2, event_3, event_4, event_5,
event_1, event_2, event_3, event_4, event_5 };
int i;
for (i = 0; i < 15; i++) {
runStateMachine(&stateMachine, inputEvent[i]);
}
return 0;
}
int main(void)
{
run();
return 0;
}