FSM/FSM_OOP/baseFSM/FSM_protected.h

92 lines
2.3 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"
#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 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_State_Fcns)(void *data);
typedef int (*Avoid_WARNING_Transition_Handler)(void *data, int curState);
typedef void (*Avoid_WARNING_Overrider_Fcns)(FSM *pFsm);
typedef int (*Avoid_WARNING_SelectEvent)(void *data);
typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns);
#define addStateActionFcn(type, state) fcns->type##ActionTable[state] = (Avoid_WARNING_State_Fcns)actionFcn(type, state)
#define addTransitionHandler(state, event) fcns->transitionTable[index(state, event)] = (Avoid_WARNING_Transition_Handler)transitionHandler(event)
typedef struct _FSM FSM;
typedef struct _FSMHandler{
int (**transitionTable)(void *data, int currentState);
void (**enterActionTable)(void *data);
void (**delayActionTable)(void *data);
void (**duringActionTable)(void *data);
void (**exitActionTable)(void *data);
void (**childFSMStepTable)(FSM **cFSM);
}FSMHandler;
typedef struct _FSMPrivateVars
{
int curState;
int curEvent;
int defaultState; // Idle状态不能停留必须指定一个初始状态
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, 子类能用, 外界用不了
void constructFSM(FSM* pFSM);
// 继承的函数
FSM *newBaseFSM(int numState, int numEvent, int defaultState);
void stepBaseFSM(FSM *pFSM);
void resetBaseFSM(FSM *pFSM);
#endif