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
|
2024-01-29 20:32:07 +08:00
|
|
|
|
#ifdef DSP28377
|
|
|
|
|
#define NDEBUG
|
|
|
|
|
#else
|
|
|
|
|
#define FSM_LOG_ON
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
2024-01-29 11:12:32 +08:00
|
|
|
|
#ifdef FSM_LOG_ON
|
|
|
|
|
#define FSM_LOG(...) printf(__VA_ARGS__)
|
|
|
|
|
#else
|
|
|
|
|
#define FSM_LOG(...) ((void)0)
|
|
|
|
|
#endif
|
|
|
|
|
|
2024-01-29 20:32:07 +08:00
|
|
|
|
#define delay delay
|
2024-01-28 23:43:13 +08:00
|
|
|
|
#define during during
|
|
|
|
|
#define enter enter
|
|
|
|
|
#define exit exit
|
2024-01-23 20:05:30 +08:00
|
|
|
|
|
|
|
|
|
#define transitionHandler(event) event##Handler
|
2024-01-30 19:38:48 +08:00
|
|
|
|
#define delayHanlder(event) event##DelayHandler
|
2024-01-23 20:05:30 +08:00
|
|
|
|
#define actionFcn(action, state) state##_##action##Action
|
|
|
|
|
#define index(state, event) (state*Count_Event + event)
|
|
|
|
|
|
|
|
|
|
typedef struct _FSMHandler FSMHandler;
|
2024-01-30 15:11:15 +08:00
|
|
|
|
typedef void (*Avoid_WARNING_State_Fcns)(void *data, FSM **childFSM);
|
2024-01-30 19:38:48 +08:00
|
|
|
|
typedef void (*Avoid_WARNING_Delay_Handlers)(void *data);
|
|
|
|
|
typedef int (*Avoid_WARNING_Transition_Handler)(void *data, int curState, int *);
|
2024-01-29 20:32:07 +08:00
|
|
|
|
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);
|
|
|
|
|
|
2024-01-28 23:43:13 +08:00
|
|
|
|
|
2024-01-29 20:32:07 +08:00
|
|
|
|
#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-30 19:38:48 +08:00
|
|
|
|
#define addDelayHandler(event) fcns->transitionDelayTable[event] = (Avoid_WARNING_Delay_Handlers)delayHanlder(event)
|
2024-01-28 23:43:13 +08:00
|
|
|
|
|
2024-01-23 20:05:30 +08:00
|
|
|
|
|
2024-01-30 15:11:15 +08:00
|
|
|
|
|
2024-01-23 20:05:30 +08:00
|
|
|
|
typedef struct _FSM FSM;
|
|
|
|
|
typedef struct _FSMHandler{
|
2024-01-30 19:38:48 +08:00
|
|
|
|
int (**transitionTable)(void *data, int currentState, int *);
|
2024-01-29 20:32:07 +08:00
|
|
|
|
|
2024-01-30 15:11:15 +08:00
|
|
|
|
void (**enterActionTable)(void *data, FSM **cFSM);
|
|
|
|
|
void (**duringActionTable)(void *data, FSM **cFSM);
|
|
|
|
|
void (**exitActionTable)(void *data, FSM **cFSM);
|
|
|
|
|
|
2024-01-30 20:35:05 +08:00
|
|
|
|
int delayedEvent;
|
2024-01-30 19:38:48 +08:00
|
|
|
|
void (**transitionDelayTable)(void *data);
|
2024-01-29 20:32:07 +08:00
|
|
|
|
|
|
|
|
|
void (**childFSMStepTable)(FSM **cFSM);
|
2024-01-23 20:05:30 +08:00
|
|
|
|
}FSMHandler;
|
|
|
|
|
|
2024-01-30 15:11:15 +08:00
|
|
|
|
typedef struct _FSMDataLoader
|
|
|
|
|
{
|
|
|
|
|
void *in;
|
|
|
|
|
int isReady;
|
2024-04-19 13:07:09 +08:00
|
|
|
|
int isOverflow;
|
2024-01-30 15:11:15 +08:00
|
|
|
|
size_t preloadSize;
|
|
|
|
|
}FSMDataLoader;
|
|
|
|
|
|
2024-01-23 20:05:30 +08:00
|
|
|
|
|
|
|
|
|
typedef struct _FSMPrivateVars
|
|
|
|
|
{
|
|
|
|
|
int curState;
|
2024-01-29 20:32:07 +08:00
|
|
|
|
int defaultState; // Idle状态不能停留,必须指定一个初始状态
|
2024-01-30 15:11:15 +08:00
|
|
|
|
|
|
|
|
|
int curEvent;
|
2024-01-23 20:05:30 +08:00
|
|
|
|
int numEvent;
|
2024-01-30 15:11:15 +08:00
|
|
|
|
|
|
|
|
|
FSMDataLoader preloader;
|
2024-01-23 20:05:30 +08:00
|
|
|
|
|
|
|
|
|
FSMHandler fcns;
|
2024-01-30 15:11:15 +08:00
|
|
|
|
|
|
|
|
|
int numChild;
|
|
|
|
|
FSM **childFSM;
|
2024-01-23 20:05:30 +08:00
|
|
|
|
}FMSPrivateVars;
|
|
|
|
|
|
|
|
|
|
|
2024-01-30 15:11:15 +08:00
|
|
|
|
|
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
|