FSM/FSM_OOP/usr/keyFSM.c

76 lines
2.1 KiB
C
Raw Normal View History

2024-01-23 20:05:30 +08:00
#include <stdio.h>
#include <stdlib.h>
#include "FSM_protected.h"
#include "keyFSM.h"
#include "keyFSM_private.h"
/*
*/
static Event ceventArr[20] = {
Idle_Event,
Idle_Event,
Idle2D,
Idle_Event,
Idle_Event,
D2E,
E2D,
D2E,
Idle_Event,
Idle_Event,
Idle_Event,
Idle_Event,
};
static Event selectEvent(KeyFSMData *data){ // 必须重新实现
return ceventArr[data->arrindex];
}
static void step(KeyFSM* pFSM){
printFSM(pFSM);
stepBaseFSM(BASE_FSM(pFSM));
}
static void initData(KeyFSM *pFSM){ // 必须重新实现
KeyFSMData *data = (KeyFSMData *)malloc(sizeof(KeyFSMData));
data->arrindex = 0;
pFSM->base.data = data;
}
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
fcns->duringActionTable[E] = (Avoid_WARNING_void_FSM)actionFcn(during, E);
fcns->duringActionTable[D] = (Avoid_WARNING_void_FSM)actionFcn(during, D);
fcns->enterActionTable[D] = (Avoid_WARNING_void_FSM)actionFcn(enter, D);
fcns->enterActionTable[E] = (Avoid_WARNING_void_FSM)actionFcn(enter, E);
fcns->exitActionTable[D] = (Avoid_WARNING_void_FSM)D_exitAction;
fcns->exitActionTable[E] = (Avoid_WARNING_void_FSM)E_exitAction;
fcns->transitionTable[index(Idle, Idle2D)] = (Avoid_WARNING_int_FSM)transitionHandler(Idle2D);
fcns->transitionTable[index(Idle, Idle2E)] = (Avoid_WARNING_int_FSM)transitionHandler(Idle2E);
fcns->transitionTable[index(D, D2E)] = (Avoid_WARNING_int_FSM)transitionHandler(D2E);
fcns->transitionTable[index(E, E2D)] = (Avoid_WARNING_int_FSM)transitionHandler(E2D);
}
/*
*/
KeyFSM *createKeyFSM(){
KeyFSM *pFSM;
pFSM = (KeyFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE);
pFSM->base.vtbl.step = (Avoid_WARNING_void_FSM)step;
pFSM->base.vtbl.selectEvent = (Avoid_WARNING_int_data)selectEvent;
pFSM->base.vtbl.initData = (Avoid_WARNING_void_FSM)initData;
pFSM->base.vtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;
constructFSM((FSM_Ptr)pFSM);
return pFSM;
}