FSM/vscode/FSM_OOP/baseFSM/FSM_protected.h

116 lines
3.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 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 selectNextStateFcn(curstate) curstate##_##selectNextState
#define transitionHandler(curstate, nextstate) curstate##2##nextstate##Handler
#define actionFcn(action, curstate) curstate##_##action##Action
#define index(curstate, nextstate) (curstate*Count_State + nextstate)
typedef struct _FSMHandler FSMHandler;
typedef void (*Avoid_WARNING_State_Fcns)(void *data, FSM **childFSM);
typedef void (*Avoid_WARNING_General_Handlers)(void *data);
typedef void (*Avoid_WARNING_Transition_Handler)(void *data);
typedef void (*Avoid_WARNING_Overrider_Fcns)(FSM *pFsm);
typedef int (*Avoid_WARNING_SelectNextState)(void *data, void *signals);
typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns);
#define addSelectNextStateFcn(curstate) fcns->selectNextState[curstate] = (Avoid_WARNING_SelectNextState)selectNextStateFcn(curstate)
#define addStateActionFcn(type, state) fcns->type##ActionTable[state] = (Avoid_WARNING_State_Fcns)actionFcn(type, state)
#define addTransitionHandler(curstate, nextstate) fcns->transitionTable[index(curstate, nextstate)] = (Avoid_WARNING_Transition_Handler)transitionHandler(curstate, nextstate)
typedef struct _FSM FSM;
typedef struct _FSMHandler{
int (**selectNextState)(void *data, void *signals);
void (**transitionTable)(void *data);
void (*transitionGeneralAction)(void *data);
void (**enterActionTable)(void *data, FSM **cFSM);
void (**duringActionTable)(void *data, FSM **cFSM);
void (**exitActionTable)(void *data, FSM **cFSM);
void (**childFSMStepTable)(FSM **cFSM);
}FSMHandler;
typedef struct _FSMDataLoader
{
void *shadowData;
int isReady;
int isOverflow;
size_t size;
}FSMDataLoader;
typedef struct _FSMPrivateVars
{
int numState;
int defaultState; // Idle状态不能停留必须指定一个初始状态
int curState;
int nextState;
FSMHandler fcns;
int numChild;
FSM **childFSM;
void *data;
}FMSPrivateVars;
// 类似于纯虚类, vptr中的函数必须继承后重新实现
typedef struct _FSM
{
// public functions
FSMVtbl vtbl;
// private
FMSPrivateVars privateVars;
// protected
FSMDataLoader preloader;
void *signals;
int signalSize;
} FSM;
// protected, 子类能用, 外界用不了
void constructFSM(FSM* pFSM);
// 继承的函数
FSM* newBaseFSM(int numState, int defaultState);
void stepBaseFSM(FSM *pFSM);
void resetBaseFSM(FSM *pFSM);
#endif