FSM/FSM_OOP/baseFSM/FSM_protected.h

84 lines
2.0 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef __FSM_PROTECTED_H_
#define __FSM_PROTECTED_H_
#include "FSM_public.h"
#define FSM_LOG_ON
#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 transitionHandler(event) event##Handler
#define actionFcn(action, state) state##_##action##Action
#define index(state, event) (state*Count_Event + event)
typedef struct _FSMHandler FSMHandler;
typedef void (*Avoid_WARNING_void_FSM)(FSM *pFSM);
typedef int (*Avoid_WARNING_int_FSM)(FSM *pFSM);
typedef int (*Avoid_WARNING_int_data)(void *data);
typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns);
#define addStateActionFcn(type, state) fcns->type##ActionTable[state] = (Avoid_WARNING_void_FSM)actionFcn(type, state)
#define addTransitionHandler(state, event) fcns->transitionTable[index(state, event)] = (Avoid_WARNING_int_FSM)transitionHandler(event)
typedef struct _FSM FSM;
typedef struct _FSMHandler{
int (**transitionTable)(FSM *pFSM);
void (**enterActionTable)(FSM *pFSM);
void (**duringActionTable)(FSM *pFSM);
void (**exitActionTable)(FSM *pFSM);
}FSMHandler;
typedef struct _FSMPrivateVars
{
int curState;
int defaultState; // Idle状态不能停留必须指定一个初始状态
int curEvent;
int numEvent;
int numChild;
FSM **childFSM;
FSMHandler fcns;
}FMSPrivateVars;
// 类似于纯虚类, vptr中的函数必须继承后重新实现
typedef struct _FSM
{
// public functions
FSMVtbl vtbl;
// private
FMSPrivateVars privateVars;
// protected
void *data;
} FSM;
// protected, 子类能用, 外界用不了
int getFSMCurState(FSM *pFSM);
int getFSMCurEvent(FSM *pFSM);
void constructFSM(FSM* pFSM);
// 继承的函数
FSM *newBaseFSM(int numState, int numEvent, int defaultState);
void stepBaseFSM(FSM *pFSM);
void resetBaseFSM(FSM *pFSM);
#endif