#include #include #include "parentFSM.h" #include "FSM_protected.h" #define DEFAULT_STATE Idle typedef struct _ParentFSM { FSM base; }ParentFSM; typedef enum _State{ Idle, A, B, C, Count_State, }State; typedef enum _Event{ Idle_Event, Start, A2B, B2A, B2C, C2A, Count_Event, }Event; const static char *stateStr[] = { "Idle", "A", "B", "C", }; const static char *eventStr[] = { "Idle", "Start", "A2B", "B2A", "B2C", "C2A", }; State StartHandler(){ FSM_LOG(" start "); return A; } State A2BHandler(){ FSM_LOG(" A2B "); return B; } State B2AHandler(){ FSM_LOG(" B2A "); return A; } State B2CHandler(){ FSM_LOG(" B2C "); return C; } State C2AHandler(){ FSM_LOG(" C2A "); return A; } void A_enterAction(){ FSM_LOG(" enterA "); } void A_duringAction(){ FSM_LOG(" duringA "); } void A_exitAction(){ FSM_LOG(" exitA "); } void B_enterAction(void *data, FSM **childFSM){ FSM_LOG(" enterB "); FSM *cFSM = childFSM[0]; cFSM->vtbl.step(cFSM); } void B_duringAction(void *data, FSM **childFSM){ FSM_LOG(" duringB "); FSM *cFSM = childFSM[0]; cFSM->vtbl.step(cFSM); } void B_exitAction(void *data, FSM **childFSM){ FSM *cFSM = childFSM[0]; cFSM->vtbl.reset(cFSM); FSM_LOG(" exitB "); } void C_enterAction(){ FSM_LOG(" enterC "); } void C_duringAction(){ FSM_LOG(" duringC "); } void C_exitAction(){ FSM_LOG(" exitC "); } static void setupHandler(FSMHandler* fcns){ addStateActionFcn(during, A); addStateActionFcn(during, B); addStateActionFcn(during, C); addStateActionFcn(enter, A); addStateActionFcn(enter, B); addStateActionFcn(enter, C); addStateActionFcn(exit, A); addStateActionFcn(exit, B); addStateActionFcn(exit, C); addTransitionHandler(Idle, Start); addTransitionHandler(A, A2B); addTransitionHandler(B, B2A); addTransitionHandler(B, B2C); addTransitionHandler(C, C2A); } /* 用户自定义事件选择逻辑—————————————————begin */ Event peventArr[20] = { Idle_Event, Start, A2B, Idle_Event, Idle_Event, Idle_Event, Idle_Event, Idle_Event, B2C, C2A, A2B, B2A, }; static Event selectEvent(ParentFSMData *data){ return peventArr[data->arrindex]; } /* 用户自定义事件选择逻辑————————end */ static void printFSM(ParentFSM* pFSM){ FSM_LOG("\tParentFSM: "); FSM_LOG("当前状态:%s, 当前事件:%s, 动作:", stateStr[pFSM->base.privateVars.curState], eventStr[pFSM->base.privateVars.curEvent]); } static void step(ParentFSM* pFSM){ printFSM(pFSM); stepBaseFSM(BASE_FSM(pFSM)); } static void reset(ParentFSM* pFSM){ resetBaseFSM(BASE_FSM(pFSM)); FSM_LOG(" ParentFSM-reset"); } static void initData(ParentFSM *pFSM){ ParentFSMData *data = (ParentFSMData *)malloc(sizeof(ParentFSMData)); data->arrindex = 0; pFSM->base.data = data; } static void initDataLoader(ParentFSM *pFSM){ // 必须重新实现 pFSM->base.privateVars.preloader.in = malloc(sizeof(ParentFSMData)); pFSM->base.privateVars.preloader.preloadSize = sizeof(ParentFSMData); } ParentFSM *createParentFSM(){ ParentFSM *pFSM; pFSM = (ParentFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE); pFSM->base.vtbl.step = step; pFSM->base.vtbl.selectNextState = selectEvent; pFSM->base.vtbl.initData = initData; pFSM->base.vtbl.setupHandler = setupHandler; pFSM->base.vtbl.initDataLoader = initDataLoader; constructFSM((FSM *)pFSM); return pFSM; }