#include #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, Idle_Event, Idle_Event, Idle_Event, }; static Event selectEvent(TemplateFSMData *data, TemplateFSMSignals *signals){ // 必须重新实现 if(signals->signalA){ return E2D; } if(signals->signalB){ return D2E; } return ceventArr[data->in.arrindex]; } static void step(TemplateFSM* pFSM){ printFSM(pFSM); stepBaseFSM(BASE_FSM(pFSM)); } static void initData(TemplateFSM *pFSM){ // 必须重新实现 TemplateFSMData *data = (TemplateFSMData *)malloc(sizeof(TemplateFSMData)); TemplateFSMData tempData = { .in = { .arrindex = 0, .x = 0, }, .inner1 = 0, .y1 = 0, }; *data = tempData; pFSM->base.data = data; } static void initSignals(TemplateFSM *pFSM){ TemplateFSMSignals *signals = (TemplateFSMSignals *)malloc(sizeof(TemplateFSMSignals)); TemplateFSMSignals tempSignals = { .signalA = 0, .signalB = 0, }; *signals = tempSignals; pFSM->base.signals = signals; } static void resetSignals(TemplateFSM *pFSM){ memset(pFSM->base.signals, 0, sizeof(TemplateFSMSignals)); } static void initDataLoader(TemplateFSM *pFSM){ // 必须重新实现 pFSM->base.privateVars.preloader.in = malloc(sizeof(TemplateFSMIn)); pFSM->base.privateVars.preloader.preloadSize = sizeof(TemplateFSMIn); } static void setupHandler(FSMHandler* fcns){ // 必须重新实现 /* ------------------------------- 添加下一个状态选择函数 ------------------------------ */ /* ----------------------- 添加状态中事件,action during exit ----------------------- */ addStateActionFcn(during, E); addStateActionFcn(during, D); addStateActionFcn(enter, E); addStateActionFcn(enter, D); addStateActionFcn(exit, E); addStateActionFcn(exit, D); /* --------------------------- 添加转移函数和转移函数对应的Delay -------------------------- */ addTransitionHandler(Idle, D); addTransitionHandler(Idle, E); addTransitionHandler(D, E); addTransitionHandler(E, D); addDelayHandler(Idle, D); } /* 唯一外界调用的函数 */ TemplateFSM *createTemplateFSM(){ TemplateFSM *pFSM; pFSM = (TemplateFSM *)newBaseFSM(Count_State, DEFAULT_STATE); pFSM->base.vtbl.step = (Avoid_WARNING_Overrider_Fcns)step; pFSM->base.vtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData; pFSM->base.vtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader; pFSM->base.vtbl.initSignals = (Avoid_WARNING_Overrider_Fcns)initSignals; pFSM->base.vtbl.resetSignals = (Avoid_WARNING_Overrider_Fcns)resetSignals; pFSM->base.vtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler; constructFSM((FSM *)pFSM); return pFSM; }