#ifndef __FSM_PROTECTED_H_ #define __FSM_PROTECTED_H_ #include "FSM_public.h" #define during during #define enter enter #define exit exit #define transitionHandler(event) event##Handler #define actionFcn(action, state) state##_##action##Action #define index(state, event) (state*Count_Event + event) typedef struct _FSMHandler FSMHandler; typedef void (*Avoid_WARNING_void_FSM)(FSM *pFSM); typedef int (*Avoid_WARNING_int_FSM)(FSM *pFSM); typedef int (*Avoid_WARNING_int_data)(void *data); typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns); #define addStateActionFcn(type, state) fcns->type##ActionTable[state] = (Avoid_WARNING_void_FSM)actionFcn(type, state) #define addTransitionHandler(state, event) fcns->transitionTable[index(state, event)] = (Avoid_WARNING_int_FSM)transitionHandler(event) typedef struct _FSM FSM; typedef struct _FSMHandler{ int (**transitionTable)(FSM *pFSM); void (**enterActionTable)(FSM *pFSM); void (**duringActionTable)(FSM *pFSM); void (**exitActionTable)(FSM *pFSM); }FSMHandler; typedef struct _FSMPrivateVars { int curState; int defaultState; // Idle状态不能停留,必须指定一个初始状态 int curEvent; int numEvent; int numChild; FSM **childFSM; FSMHandler fcns; }FMSPrivateVars; // 类似于纯虚类, vptr中的函数必须继承后重新实现 typedef struct _FSM { // public functions FSMVtbl vtbl; // private FMSPrivateVars privateVars; // protected void *data; } FSM; // protected, 子类能用, 外界用不了 int getFSMCurState(FSM *pFSM); int getFSMCurEvent(FSM *pFSM); void constructFSM(FSM* pFSM); // 继承的函数 FSM *newBaseFSM(int numState, int numEvent, int defaultState); void stepBaseFSM(FSM *pFSM); void resetBaseFSM(FSM *pFSM); #endif