FSM/vscode/FSM_OOP/baseFSM/FSM_protected.h

109 lines
2.8 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 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 delay delay
#define during during
#define enter enter
#define exit exit
#define transitionHandler(event) event##Handler
#define delayHanlder(event) event##DelayHandler
#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, FSM **childFSM);
typedef void (*Avoid_WARNING_Delay_Handlers)(void *data);
typedef int (*Avoid_WARNING_Transition_Handler)(void *data, int curState, int *);
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)
#define addDelayHandler(event) fcns->transitionDelayTable[event] = (Avoid_WARNING_Delay_Handlers)delayHanlder(event)
typedef struct _FSM FSM;
typedef struct _FSMHandler{
int (**transitionTable)(void *data, int currentState, int *);
void (**enterActionTable)(void *data, FSM **cFSM);
void (**duringActionTable)(void *data, FSM **cFSM);
void (**exitActionTable)(void *data, FSM **cFSM);
int *isDelayExcuted;
void (**transitionDelayTable)(void *data);
void (**childFSMStepTable)(FSM **cFSM);
}FSMHandler;
typedef struct _FSMDataLoader
{
void *in;
int isReady;
size_t preloadSize;
}FSMDataLoader;
typedef struct _FSMPrivateVars
{
int curState;
int defaultState; // Idle状态不能停留必须指定一个初始状态
int curEvent;
int numEvent;
FSMDataLoader preloader;
FSMHandler fcns;
int numChild;
FSM **childFSM;
}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