FSM/vscode/FSM_OOP/baseFSM/FSM_protected.h

106 lines
2.5 KiB
C
Raw Normal View History

2024-01-23 20:05:30 +08:00
#ifndef __FSM_PROTECTED_H_
#define __FSM_PROTECTED_H_
#include "FSM_public.h"
2024-01-30 16:06:02 +08:00
// #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
2024-01-23 20:05:30 +08:00
#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, FSM **childFSM);
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);
2024-01-23 20:05:30 +08:00
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)
2024-01-23 20:05:30 +08:00
2024-01-23 20:05:30 +08:00
typedef struct _FSM FSM;
typedef struct _FSMHandler{
int (**transitionTable)(void *data, int currentState);
void (**enterActionTable)(void *data, FSM **cFSM);
void (**duringActionTable)(void *data, FSM **cFSM);
void (**exitActionTable)(void *data, FSM **cFSM);
2024-01-30 15:44:19 +08:00
int *isDelayActionExcuted;
void (**delayActionTable)(void *data, FSM **childFSM);
void (**childFSMStepTable)(FSM **cFSM);
2024-01-23 20:05:30 +08:00
}FSMHandler;
typedef struct _FSMDataLoader
{
void *in;
int isReady;
size_t preloadSize;
}FSMDataLoader;
2024-01-23 20:05:30 +08:00
typedef struct _FSMPrivateVars
{
int curState;
int defaultState; // Idle状态不能停留必须指定一个初始状态
int curEvent;
2024-01-23 20:05:30 +08:00
int numEvent;
FSMDataLoader preloader;
2024-01-23 20:05:30 +08:00
FSMHandler fcns;
int numChild;
FSM **childFSM;
2024-01-23 20:05:30 +08:00
}FMSPrivateVars;
2024-01-23 20:05:30 +08:00
// 类似于纯虚类, 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