#include #include #include #include "FSM_private.h" #include "FSM_protected.h" #include "FSM_public.h" /* protected 函数 */ void resetBaseFSM(FSM *pFSM) { if (pFSM->privateVars.fcns.exitActionTable[pFSM->privateVars.curState] != NULL) pFSM->privateVars.fcns.exitActionTable[pFSM->privateVars.curState](pFSM); pFSM->privateVars.curState = 0; } void stepBaseFSM(FSM *pFSM) { int index = pFSM->privateVars.curState * pFSM->privateVars.numEvent + pFSM->privateVars.curEvent; if (pFSM->privateVars.fcns.transitionTable[index] != NULL) { if (pFSM->privateVars.fcns.exitActionTable[pFSM->privateVars.curState] != NULL) pFSM->privateVars.fcns.exitActionTable[pFSM->privateVars.curState](pFSM); pFSM->privateVars.curState = (*pFSM->privateVars.fcns.transitionTable[index])(pFSM); if (pFSM->privateVars.fcns.enterActionTable[pFSM->privateVars.curState] != NULL) pFSM->privateVars.fcns.enterActionTable[pFSM->privateVars.curState](pFSM); } else if(pFSM->privateVars.curState == 0){ pFSM->privateVars.curState = pFSM->privateVars.defaultState; if (pFSM->privateVars.fcns.enterActionTable[pFSM->privateVars.curState] != NULL) pFSM->privateVars.fcns.enterActionTable[pFSM->privateVars.curState](pFSM); } else { if (pFSM->privateVars.fcns.duringActionTable[pFSM->privateVars.curState] != NULL) pFSM->privateVars.fcns.duringActionTable[pFSM->privateVars.curState](pFSM); } } FSM* newBaseFSM(int numState, int numEvent, int defaultState){ typedef void (*StateFuncPtr)(FSM* pFSM); typedef int (*TransitionFuncPtr)(FSM* pFSM); FSM *pFSM = calloc(1, sizeof(FSM)); pFSM->privateVars.curEvent = 0; pFSM->privateVars.curState = 0; pFSM->privateVars.numEvent = numEvent; pFSM->privateVars.defaultState = defaultState; pFSM->privateVars.numChild = 0; pFSM->privateVars.fcns.duringActionTable = calloc(numState, sizeof(StateFuncPtr)); pFSM->privateVars.fcns.enterActionTable = calloc(numState, sizeof(StateFuncPtr)); pFSM->privateVars.fcns.exitActionTable = calloc(numState, sizeof(StateFuncPtr)); pFSM->privateVars.fcns.transitionTable = calloc(numState * numEvent, sizeof(TransitionFuncPtr)); FSMVtbl vtbl = { .reset = resetBaseFSM, .step = stepBaseFSM, .selectEvent = NULL, .setupHandler = NULL, .initData = NULL, }; pFSM->vtbl = vtbl; return pFSM; } void constructFSM(FSM* pFSM){ assert(pFSM->vtbl.setupHandler); assert(pFSM->vtbl.initData); pFSM->vtbl.setupHandler(&pFSM->privateVars.fcns); pFSM->vtbl.initData(pFSM); } /* public 函数 */ int getFSMCurState(FSM *pFSM){ return pFSM->privateVars.curState; } int getFSMCurEvent(FSM *pFSM){ return pFSM->privateVars.curEvent; } void setEvent(FSM* pFSM){ assert(pFSM->vtbl.selectEvent); pFSM->privateVars.curEvent = pFSM->vtbl.selectEvent(pFSM->data); if(0 == pFSM->privateVars.numChild){ return; } for (int i = 0; i < pFSM->privateVars.numChild; i++) { FSM *cFSM = pFSM->privateVars.childFSM[i]; setEvent(cFSM); } } void setChildNum(FSM *pFSM, int num){ pFSM->privateVars.numChild = num; pFSM->privateVars.childFSM = (FSM **)calloc(num, sizeof(FSM *)); } void registerChildFSM(FSM *parent, FSM *child, int index){ parent->privateVars.childFSM[index] = child; } void *getData(FSM* pFSM){ return pFSM->data; } FSMVtbl *vptrFSM(FSM* pFSM){ return &pFSM->vtbl; }