#ifdef __CHILDFSM_PRIVATE_FSM_H_ #error This file can only be included once!!! #else #define __CHILDFSM_PRIVATE_FSM_H_ #endif #include "FSM_protected.h" #include "childFSM.h" #include /* -------------------------------------------------------------------------- */ /* 继承基类 */ /* -------------------------------------------------------------------------- */ typedef struct ChildFSM { FSM base; }ChildFSM; /* -------------------------------------------------------------------------- */ /* 状态定义 */ /* -------------------------------------------------------------------------- */ /** * @brief 状态机内状态定义,Idle和Count_State必须占据开头和结尾两个位置 * */ typedef enum _State { Idle, /**< 必须在开头,并且枚举值=0 */ D, E, Count_State, /**< 必须在结尾,用来统计状态数量 */ } State; /* -------------------------------------------------------------------------- */ /* 下一个状态选择函数 */ /* -------------------------------------------------------------------------- */ static State selectNextStateFcn(Idle)(ChildFSMData *data, FSMSignals *signals){ if(data->external.x == 1) return D; else return E; } static State selectNextStateFcn(D)(ChildFSMData *data, FSMSignals *signals){ if(getSignal(signals, Signal_toE)){ signals->lastTriggeredSignal = Signal_toE; return E; } return Idle; } static State selectNextStateFcn(E)(ChildFSMData *data, FSMSignals *signals){ if(getSignal(signals, Signal_toD)){ signals->lastTriggeredSignal = Signal_toD; return D; } return Idle; } /* -------------------------------------------------------------------------- */ /* 对应的 action, exit, during 函数 */ /* -------------------------------------------------------------------------- */ static void actionFcn(enter, D)() { FSM_LOG(" enterD "); } static void actionFcn(during, D)() { FSM_LOG(" duringD "); } static void actionFcn(exit, D)() { FSM_LOG(" exitD "); } static void actionFcn(enter, E)() { FSM_LOG(" enterE "); } static void actionFcn(during, E)() { FSM_LOG(" duringE "); } static void actionFcn(exit, E)() { FSM_LOG(" exitE "); } /* -------------------------------------------------------------------------- */ /* 转移函数 */ /* -------------------------------------------------------------------------- */ static void transitionGeneralAction(FSM pFSM){ // FSM_LOG("general"); } // static void transitionGeneralAction(TemplateFSMData *data){ // FSM_LOG("general"); // } static void transitionHandler(Idle, D)() { FSM_LOG(" Idle2D "); } static void transitionHandler(Idle, E)() { FSM_LOG(" Idle2E "); } static void transitionHandler(D, E)() { FSM_LOG(" D2E "); } static void transitionHandler(E, D)() { FSM_LOG(" E2D "); } /* -------------------------------------------------------------------------- */ /* 打印调试 */ /* -------------------------------------------------------------------------- */ const static char *stateStr[] = { "Idle", "D", "E", }; static void printFSM(ChildFSM* pFSM){ FSM_LOG(" \tChild: "); FSM_LOG("CurrentState:%s, Action", stateStr[getFSMCurState((FSM *)pFSM)]); }