#ifndef __FSM_PROTECTED_H_ #define __FSM_PROTECTED_H_ #include "FSM_public.h" // #define DSP28377 #ifdef DSP28377 #define NDEBUG #else #define FSM_LOG_ON #endif #ifdef FSM_LOG_ON #define FSM_LOG(...) printf(__VA_ARGS__) #else #define FSM_LOG(...) ((void)0) #endif #define delay delay #define during during #define enter enter #define exit exit #define transitionHandler(event) event##Handler #define delayHanlder(event) event##DelayHandler #define actionFcn(action, state) state##_##action##Action #define index(state, event) (state*Count_Event + event) typedef struct _FSMHandler FSMHandler; typedef void (*Avoid_WARNING_State_Fcns)(void *data, FSM **childFSM); typedef void (*Avoid_WARNING_Delay_Handlers)(void *data); typedef int (*Avoid_WARNING_Transition_Handler)(void *data, int curState, int *); typedef void (*Avoid_WARNING_Overrider_Fcns)(FSM *pFsm); typedef int (*Avoid_WARNING_SelectEvent)(void *data); typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns); #define addStateActionFcn(type, state) fcns->type##ActionTable[state] = (Avoid_WARNING_State_Fcns)actionFcn(type, state) #define addTransitionHandler(state, event) fcns->transitionTable[index(state, event)] = (Avoid_WARNING_Transition_Handler)transitionHandler(event) #define addDelayHandler(event) fcns->transitionDelayTable[event] = (Avoid_WARNING_Delay_Handlers)delayHanlder(event) typedef struct _FSM FSM; typedef struct _FSMHandler{ int (**transitionTable)(void *data, int currentState, int *); void (**enterActionTable)(void *data, FSM **cFSM); void (**duringActionTable)(void *data, FSM **cFSM); void (**exitActionTable)(void *data, FSM **cFSM); int delayedEvent; void (**transitionDelayTable)(void *data); void (**childFSMStepTable)(FSM **cFSM); }FSMHandler; typedef struct _FSMDataLoader { void *in; int isReady; int isOverflow; size_t preloadSize; }FSMDataLoader; typedef struct _FSMPrivateVars { int curState; int defaultState; // Idle状态不能停留,必须指定一个初始状态 int curEvent; int numEvent; FSMDataLoader preloader; FSMHandler fcns; int numChild; FSM **childFSM; }FMSPrivateVars; // 类似于纯虚类, vptr中的函数必须继承后重新实现 typedef struct _FSM { // public functions FSMVtbl vtbl; // private FMSPrivateVars privateVars; // protected void *data; } FSM; // protected, 子类能用, 外界用不了 void constructFSM(FSM* pFSM); // 继承的函数 FSM *newBaseFSM(int numState, int numEvent, int defaultState); void stepBaseFSM(FSM *pFSM); void resetBaseFSM(FSM *pFSM); #endif