#include #include #include "FSM_protected.h" #include "childFSM.h" #include "childFSM_private.h" /* 重载函数,有些是纯虚的必须重新实现,有些可以不重新实现直接用父类的 */ 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(ChildFSMData *data){ // 必须重新实现 return ceventArr[data->arrindex]; } static void step(ChildFSM* pFSM){ printFSM(pFSM); _stepFSM(BASE_FSM(pFSM)); } static void initData(ChildFSM *pFSM){ // 必须重新实现 ChildFSMData *data = (ChildFSMData *)malloc(sizeof(ChildFSMData)); data->arrindex = 0; pFSM->base.privateVars.preloader.in = malloc(sizeof(ChildFSMData)); pFSM->base.privateVars.preloader.preloadSize = sizeof(ChildFSMData); pFSM->base.data = data; } static void initDataLoader(ChildFSM *pFSM){ // 必须重新实现 pFSM->base.privateVars.preloader.in = malloc(sizeof(ChildFSMData)); pFSM->base.privateVars.preloader.preloadSize = sizeof(ChildFSMData); } static void setupHandler(FSMHandler* fcns){ // 必须重新实现 addStateActionFcn(during, E); addStateActionFcn(during, D); addStateActionFcn(enter, D); addStateActionFcn(exit, D); addStateActionFcn(enter, E); addStateActionFcn(exit, E); addTransitionHandler(Idle, Idle2D); addTransitionHandler(Idle, Idle2E); addTransitionHandler(D, D2E); addTransitionHandler(E, E2D); } /* 唯一外界调用的函数 */ ChildFSM *createChildFSM(){ ChildFSM *pFSM; pFSM = (ChildFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE); pFSM->base.pureVtbl.step = step; pFSM->base.pureVtbl.selectNextState = selectEvent; pFSM->base.pureVtbl.initData = initData; pFSM->base.pureVtbl.setupHandler = setupHandler; pFSM->base.pureVtbl.initDataLoader = initDataLoader; constructFSM((FSM *)pFSM); return pFSM; }