#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 selectNextStateFcn(curstate) curstate##_##selectNextState #define transitionHandler(curstate, nextstate) curstate##2##nextstate##Handler #define delayHanlder(curstate, nextstate) curstate##2##nextstate##DelayHandler #define actionFcn(action, curstate) curstate##_##action##Action #define index(curstate, nextstate) (curstate*Count_State + nextstate) typedef struct _FSMHandler FSMHandler; typedef void (*Avoid_WARNING_State_Fcns)(void *data, FSM **childFSM); typedef void (*Avoid_WARNING_Delay_Handlers)(void *data); typedef void (*Avoid_WARNING_Transition_Handler)(void *data, int curState, int *); typedef void (*Avoid_WARNING_Overrider_Fcns)(FSM *pFsm); typedef int (*Avoid_WARNING_SelectNextState)(void *data, void *signals); typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns); #define addSelectNextStateFcn(curstate) fcns->selectNextState[curstate] = (Avoid_WARNING_SelectNextState)selectNextStateFcn(curstate) #define addStateActionFcn(type, state) fcns->type##ActionTable[state] = (Avoid_WARNING_State_Fcns)actionFcn(type, state) #define addTransitionHandler(curstate, nextstate) fcns->transitionTable[index(curstate, nextstate)] = (Avoid_WARNING_Transition_Handler)transitionHandler(curstate, nextstate) #define addDelayHandler(curstate, nextstate) fcns->transitionDelayTable[index(curstate, nextstate)] = (Avoid_WARNING_Delay_Handlers)delayHanlder(curstate, nextstate) typedef struct _FSM FSM; typedef struct _FSMHandler{ int (**selectNextState)(void *data, void *signals); void (**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 numState; int defaultState; // Idle状态不能停留,必须指定一个初始状态 int curState; int nextState; FSMDataLoader preloader; FSMHandler fcns; int numChild; FSM **childFSM; }FMSPrivateVars; // 类似于纯虚类, vptr中的函数必须继承后重新实现 typedef struct _FSM { // public functions FSMVtbl vtbl; // private FMSPrivateVars privateVars; // protected void *data; void *signals; } FSM; // protected, 子类能用, 外界用不了 void constructFSM(FSM* pFSM); // 继承的函数 FSM* newBaseFSM(int numState, int defaultState); void stepBaseFSM(FSM *pFSM); void resetBaseFSM(FSM *pFSM); #endif