#include #include #include "FSM_protected.h" #include "templateFSM.h" #include "templateFSM_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(TemplateFSMData *data){ // 必须重新实现 return ceventArr[data->arrindex]; } static void step(TemplateFSM* pFSM){ printFSM(pFSM); stepBaseFSM(BASE_FSM(pFSM)); } static void initData(TemplateFSM *pFSM){ // 必须重新实现 TemplateFSMData *data = (TemplateFSMData *)malloc(sizeof(TemplateFSMData)); data->arrindex = 0; pFSM->base.data = data; } static void setupHandler(FSMHandler* fcns){ // 必须重新实现 fcns->duringActionTable[E] = (Avoid_WARNING_State_Fcns)actionFcn(during, E); fcns->duringActionTable[D] = (Avoid_WARNING_State_Fcns)actionFcn(during, D); fcns->enterActionTable[D] = (Avoid_WARNING_State_Fcns)actionFcn(enter, D); fcns->enterActionTable[E] = (Avoid_WARNING_State_Fcns)actionFcn(enter, E); fcns->exitActionTable[D] = (Avoid_WARNING_State_Fcns)D_exitAction; fcns->exitActionTable[E] = (Avoid_WARNING_State_Fcns)E_exitAction; fcns->transitionTable[index(Idle, Idle2D)] = (Avoid_WARNING_Transition_Handler)transitionHandler(Idle2D); fcns->transitionTable[index(Idle, Idle2E)] = (Avoid_WARNING_Transition_Handler)transitionHandler(Idle2E); fcns->transitionTable[index(D, D2E)] = (Avoid_WARNING_Transition_Handler)transitionHandler(D2E); fcns->transitionTable[index(E, E2D)] = (Avoid_WARNING_Transition_Handler)transitionHandler(E2D); } /* 唯一外界调用的函数 */ TemplateFSM *createTemplateFSM(){ TemplateFSM *pFSM; pFSM = (TemplateFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE); pFSM->base.vtbl.step = (Avoid_WARNING_State_Fcns)step; pFSM->base.vtbl.selectEvent = (Avoid_WARNING_int_data)selectEvent; pFSM->base.vtbl.initData = (Avoid_WARNING_State_Fcns)initData; pFSM->base.vtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler; constructFSM((FSM_Ptr)pFSM); return pFSM; }