#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 during during #define enter enter #define exit exit #define selectNextStateFcn(curstate) curstate##_##selectNextState #define transitionHandler(curstate, nextstate) curstate##2##nextstate##Handler #define actionFcn(action, curstate) curstate##_##action##Action #define index(curstate, nextstate) (curstate*Count_State + nextstate) #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) typedef struct _FSMHandler FSMHandler; typedef struct _FSM FSM; typedef struct _FSMSignals FSMSignals; typedef void (*Avoid_WARNING_State_Fcns)(void *data, FSM **childFSM); typedef void (*Avoid_WARNING_General_Handlers)(void *data); typedef void (*Avoid_WARNING_Transition_Handler)(void *data); typedef void (*Avoid_WARNING_Overrider_Fcns)(FSM *pFSM); typedef void (*Avoid_WARNING_ResetSignals_Fcns)(FSMSignals* signals, void *); typedef void (*Avoid_WARNING_loadData_Fcns)(void*); typedef int (*Avoid_WARNING_SelectNextState)(void *data, FSMSignals* signals); typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns); /* -------------------------------------------------------------------------- */ /* private数据类型,但是不能声明到private.h里 */ /* -------------------------------------------------------------------------- */ typedef struct _FSMHandler{ int (**selectNextState)(void *data, FSMSignals* signals); void (**transitionTable)(void *data); void (*transitionGeneralAction)(void *data); void (**enterActionTable)(void *data, FSM **cFSM); void (**duringActionTable)(void *data, FSM **cFSM); void (**exitActionTable)(void *data, FSM **cFSM); void (**childFSMStepTable)(FSM **cFSM); }FSMHandler; typedef struct _FSMDataLoader { void *shadowData; int isReady; int isOverflow; size_t size; }FSMDataLoader; typedef struct _FSMPrivateVars { int numState; int defaultState; // Idle状态不能停留,必须指定一个初始状态 int curState; int nextState; int index; FSMHandler fcns; int numChild; FSM **childFSM; FSMDataLoader preloader; }FMSPrivateVars; #define Idle_Signal 16 typedef struct _FSMSignals { Uint16 external; Uint16 lastTriggeredSignal; }FSMSignals; /* -------------------------------------------------------------------------- */ /* 纯虚函数,子类必须重新实现,父类构造函数不会初始化 */ /* -------------------------------------------------------------------------- */ typedef struct _FSMPureVtbl { // 状态机控制 void (*setupHandler)(FSMHandler *fcns); // =0子类必须重新实现 void (*initData)(FSM *pFSM); // =0子类必须重新实现 void (*loadExternalData)(void *extData); // =0子类必须重新实现 void (*initDataLoader)(FSM *pFSM); // =0子类必须重新实现 void (*initSignals)(FSM *pFSM); // =0子类必须重新实现 void (*resetSignals)(FSMSignals *signalRegs, void *data); // =0子类必须重新实现 }FSMPureVtbl; /* -------------------------------------------------------------------------- */ /* 基类定义,纯虚类 */ /* -------------------------------------------------------------------------- */ typedef struct _FSM { // public functions void (*step)(FSM *pFSM); // 子类重新实现可以添加一些打印信息 void (*reset)(FSM *pFSM); // 子类重新实现可以添加一些打印信息 // protected FSMPureVtbl pureVtbl; void *data; FSMSignals signals; // private FMSPrivateVars privateVars; } FSM; /* -------------------------------------------------------------------------- */ /* protected函数,子类能用外界用不了 */ /* -------------------------------------------------------------------------- */ void stepBaseFSM(FSM *pFSM); void constructFSM(FSM* pFSM); FSM* newBaseFSM(int numState, int defaultState); void resetBaseFSM(FSM *pFSM); /* -------------------------------------------------------------------------- */ /* 内联函数 */ /* -------------------------------------------------------------------------- */ static inline void clearSignal(FSMSignals *signals, Uint16 signalFlag){ signals->external &= ~(1 << signalFlag); } static inline Uint16 getSignal(FSMSignals *signals, Uint16 signalFlag){ return (signals->external >> signalFlag) & 1; } static inline void clearAllSignals(FSMSignals *signals){ signals->external = 0; } #endif