#ifdef __PARENTFSM_PRIVATE_FSM_H_ #error This file can only be included once!!! #else #define __PARENTFSM_PRIVATE_FSM_H_ #endif #include "FSM_protected.h" #include "parentFSM.h" #include /* -------------------------------------------------------------------------- */ /* 继承基类 */ /* -------------------------------------------------------------------------- */ typedef struct ParentFSM { FSM base; }ParentFSM; /* -------------------------------------------------------------------------- */ /* 状态定义 */ /* -------------------------------------------------------------------------- */ /** * @brief 状态机内状态定义,Idle和Count_State必须占据开头和结尾两个位置 * */ typedef enum _State { Idle, /**< 必须在开头,并且枚举值=0 */ A, B, C, Count_State, /**< 必须在结尾,用来统计状态数量 */ } State; /* -------------------------------------------------------------------------- */ /* 下一个状态选择函数 */ /* -------------------------------------------------------------------------- */ static State selectNextStateFcn(Idle)(ParentFSMData *data, FSMSignals *signals){ return A; } static State selectNextStateFcn(A)(ParentFSMData *data, FSMSignals *signals){ if(getSignal(signals, Signal_toB)){ signals->lastTriggeredSignal = Signal_toB; return B; } return Idle; } static State selectNextStateFcn(B)(ParentFSMData *data, FSMSignals *signals){ if(getSignal(signals, Signal_toA)){ signals->lastTriggeredSignal = Signal_toA; return A; } else if(getSignal(signals, Signal_toC)){ signals->lastTriggeredSignal = Signal_toC; return C; } return Idle; } static State selectNextStateFcn(C)(ParentFSM *data, FSMSignals *signals){ if(getSignal(signals, Signal_toA)){ signals->lastTriggeredSignal = Signal_toA; return A; } return Idle; } /* -------------------------------------------------------------------------- */ /* 对应的 action, exit, during 函数 */ /* -------------------------------------------------------------------------- */ static void actionFcn(enter, A)() { FSM_LOG(" enterA "); } static void actionFcn(during, A)() { FSM_LOG(" duringA "); } static void actionFcn(exit, A)() { FSM_LOG(" exitA "); } static void actionFcn(enter, B)() { FSM_LOG(" enterB "); } static void actionFcn(during, B)() { FSM_LOG(" duringB "); } static void actionFcn(exit, B)() { FSM_LOG(" exitB "); } static void actionFcn(enter, C)() { FSM_LOG(" enterC "); } static void actionFcn(during, C)() { FSM_LOG(" duringC "); } static void actionFcn(exit, C)() { FSM_LOG(" exitC"); } /* -------------------------------------------------------------------------- */ /* 转移函数 */ /* -------------------------------------------------------------------------- */ static void transitionGeneralAction(FSM pFSM){ // FSM_LOG("general"); } // static void transitionGeneralAction(TemplateFSMData *data){ // FSM_LOG("general"); // } static void transitionHandler(Idle, A)() { FSM_LOG(" Idle2A "); } static void transitionHandler(A, B)() { FSM_LOG(" A2B "); } static void transitionHandler(B, A)() { FSM_LOG(" B2A "); } static void transitionHandler(B, C)() { FSM_LOG(" B2C "); } static void transitionHandler(C, A)() { FSM_LOG(" C2A "); } /* -------------------------------------------------------------------------- */ /* 打印调试 */ /* -------------------------------------------------------------------------- */ const static char *stateStr[] = { "Idle", "A", "B", "C", }; static void printFSM(ParentFSM* pFSM){ FSM_LOG(" \tParent: "); FSM_LOG("当前状态:%s, 动作:", stateStr[getFSMCurState((FSM *)pFSM)]); }