Hallo,
ich habe etwas ähnliches auf einem Arduino programmiert.
Aufruf:
mystate = Statmen.StateMachine(mystate,mystimuli);
/***************************************/
statemen.h
typedef struct {
char state;
char input;
char nextstate;
}M_NEXT_STATE;
static M_NEXT_STATE mnextst[] = {
{ST_START, KEY_NEXT, ST_TIME},
{ST_START, KEY_PREV , ST_OPTIONS},
// usw.
}
typedef struct {
unsigned char state;
char *pText;
char (*pFunc)(char input);
}M_STATE;
static M_STATE mstate[] = {
{ST_START, MT_START, NULL},
{ST_TIME, MT_TIME, NULL},
{ST_TIMEMOD, MT_TIMEMODE, NULL},
{ST_OPTIONS, MT_OPTIONS, NULL},
{ST_TIME_CLOCK_FUNC, NULL, PR_TIME_CLOCK_SET},
// usw.
}
/*****************************************/
statemen.cpp
unsigned char MyStatmen::StateMachine(char state, unsigned char stimuli)
{
unsigned char nextstate = state;
unsigned char i;
for (i=0 ; mnextst[i].state ; i++)
{
// LCDchar(mnextst[i].state);
if((mnextst[i].state == state) && (mnextst[i].input == stimuli))
{
nextstate = mnextst[i].nextstate;
// break;
}
}
if (nextstate != state)
{
state = nextstate;
for (i=0; mstate[i].state; i++)
{
if (mstate[i].state == state)
{
statetext = mstate[i].pText;
pStateFunc = mstate[i].pFunc;
break;
}
}
if(statetext)
LCDstr(statetext);
if(pStateFunc)
nextstate = pStateFunc(state);
}
return nextstate;
}