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-28 23:43:13 +08:00
|
|
|
|
#define during during
|
|
|
|
|
#define enter enter
|
|
|
|
|
#define exit exit
|
2024-01-23 20:05:30 +08:00
|
|
|
|
|
2024-04-20 20:05:10 +08:00
|
|
|
|
#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)
|
|
|
|
|
|
2024-04-23 19:35:16 +08:00
|
|
|
|
#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)
|
|
|
|
|
|
|
|
|
|
|
2024-01-23 20:05:30 +08:00
|
|
|
|
|
|
|
|
|
typedef struct _FSMHandler FSMHandler;
|
2024-04-23 19:35:16 +08:00
|
|
|
|
typedef struct _FSM FSM;
|
2024-04-23 22:09:53 +08:00
|
|
|
|
typedef struct _FSMSignals FSMSignals;
|
2024-04-23 19:35:16 +08:00
|
|
|
|
|
2024-01-30 15:11:15 +08:00
|
|
|
|
typedef void (*Avoid_WARNING_State_Fcns)(void *data, FSM **childFSM);
|
2024-04-23 17:37:25 +08:00
|
|
|
|
typedef void (*Avoid_WARNING_General_Handlers)(void *data);
|
2024-04-23 14:53:47 +08:00
|
|
|
|
typedef void (*Avoid_WARNING_Transition_Handler)(void *data);
|
2024-04-23 22:09:53 +08:00
|
|
|
|
typedef void (*Avoid_WARNING_Overrider_Fcns)(FSM *pFSM);
|
2024-04-24 14:25:31 +08:00
|
|
|
|
typedef void (*Avoid_WARNING_ResetSignals_Fcns)(FSMSignals* signals, void *);
|
|
|
|
|
typedef void (*Avoid_WARNING_loadData_Fcns)(void*);
|
2024-04-23 22:09:53 +08:00
|
|
|
|
typedef int (*Avoid_WARNING_SelectNextState)(void *data, FSMSignals* signals);
|
2024-01-23 20:05:30 +08:00
|
|
|
|
typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns);
|
|
|
|
|
|
2024-04-20 20:05:10 +08:00
|
|
|
|
|
2024-04-23 19:35:16 +08:00
|
|
|
|
/* -------------------------------------------------------------------------- */
|
|
|
|
|
/* private数据类型,但是不能声明到private.h里 */
|
|
|
|
|
/* -------------------------------------------------------------------------- */
|
2024-01-28 23:43:13 +08:00
|
|
|
|
|
2024-01-23 20:05:30 +08:00
|
|
|
|
typedef struct _FSMHandler{
|
2024-04-23 22:09:53 +08:00
|
|
|
|
int (**selectNextState)(void *data, FSMSignals* signals);
|
2024-04-20 20:05:10 +08:00
|
|
|
|
|
2024-04-23 14:53:47 +08:00
|
|
|
|
void (**transitionTable)(void *data);
|
2024-04-20 21:16:26 +08:00
|
|
|
|
void (*transitionGeneralAction)(void *data);
|
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-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
|
|
|
|
|
{
|
2024-04-23 17:37:25 +08:00
|
|
|
|
void *shadowData;
|
2024-01-30 15:11:15 +08:00
|
|
|
|
int isReady;
|
2024-04-19 13:07:09 +08:00
|
|
|
|
int isOverflow;
|
2024-04-23 17:37:25 +08:00
|
|
|
|
size_t size;
|
2024-01-30 15:11:15 +08:00
|
|
|
|
}FSMDataLoader;
|
|
|
|
|
|
2024-01-23 20:05:30 +08:00
|
|
|
|
|
|
|
|
|
typedef struct _FSMPrivateVars
|
|
|
|
|
{
|
2024-04-20 20:05:10 +08:00
|
|
|
|
int numState;
|
2024-01-29 20:32:07 +08:00
|
|
|
|
int defaultState; // Idle状态不能停留,必须指定一个初始状态
|
2024-04-20 20:05:10 +08:00
|
|
|
|
|
|
|
|
|
int curState;
|
|
|
|
|
int nextState;
|
2024-04-23 19:35:16 +08:00
|
|
|
|
int index;
|
2024-01-30 15:11:15 +08:00
|
|
|
|
|
2024-01-23 20:05:30 +08:00
|
|
|
|
FSMHandler fcns;
|
2024-01-30 15:11:15 +08:00
|
|
|
|
|
|
|
|
|
int numChild;
|
|
|
|
|
FSM **childFSM;
|
2024-04-23 17:37:25 +08:00
|
|
|
|
|
2024-04-23 19:35:16 +08:00
|
|
|
|
FSMDataLoader preloader;
|
|
|
|
|
|
2024-01-23 20:05:30 +08:00
|
|
|
|
}FMSPrivateVars;
|
|
|
|
|
|
|
|
|
|
|
2024-04-23 22:09:53 +08:00
|
|
|
|
#define Idle_Signal 16
|
|
|
|
|
typedef struct _FSMSignals
|
|
|
|
|
{
|
2024-04-24 14:25:31 +08:00
|
|
|
|
Uint16 external;
|
2024-04-23 22:09:53 +08:00
|
|
|
|
Uint16 lastTriggeredSignal;
|
|
|
|
|
}FSMSignals;
|
2024-04-23 19:35:16 +08:00
|
|
|
|
|
|
|
|
|
/* -------------------------------------------------------------------------- */
|
|
|
|
|
/* 纯虚函数,子类必须重新实现,父类构造函数不会初始化 */
|
|
|
|
|
/* -------------------------------------------------------------------------- */
|
|
|
|
|
typedef struct _FSMPureVtbl {
|
|
|
|
|
// 状态机控制
|
|
|
|
|
void (*setupHandler)(FSMHandler *fcns); // =0子类必须重新实现
|
|
|
|
|
|
2024-04-24 13:18:59 +08:00
|
|
|
|
void (*initData)(FSM *pFSM); // =0子类必须重新实现
|
|
|
|
|
void (*loadExternalData)(void *extData); // =0子类必须重新实现
|
2024-04-23 19:35:16 +08:00
|
|
|
|
|
2024-04-24 13:18:59 +08:00
|
|
|
|
void (*initDataLoader)(FSM *pFSM); // =0子类必须重新实现
|
2024-04-23 22:09:53 +08:00
|
|
|
|
|
2024-04-24 13:18:59 +08:00
|
|
|
|
void (*initSignals)(FSM *pFSM); // =0子类必须重新实现
|
2024-04-24 14:25:31 +08:00
|
|
|
|
void (*resetSignals)(FSMSignals *signalRegs, void *data); // =0子类必须重新实现
|
2024-04-24 13:18:59 +08:00
|
|
|
|
}FSMPureVtbl;
|
2024-04-23 22:09:53 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-04-23 19:35:16 +08:00
|
|
|
|
/* -------------------------------------------------------------------------- */
|
|
|
|
|
/* 基类定义,纯虚类 */
|
|
|
|
|
/* -------------------------------------------------------------------------- */
|
2024-01-23 20:05:30 +08:00
|
|
|
|
typedef struct _FSM
|
|
|
|
|
{
|
|
|
|
|
// public functions
|
2024-04-23 19:35:16 +08:00
|
|
|
|
void (*step)(FSM *pFSM); // 子类重新实现可以添加一些打印信息
|
|
|
|
|
void (*reset)(FSM *pFSM); // 子类重新实现可以添加一些打印信息
|
2024-01-23 20:05:30 +08:00
|
|
|
|
|
|
|
|
|
// protected
|
2024-04-23 19:35:16 +08:00
|
|
|
|
FSMPureVtbl pureVtbl;
|
|
|
|
|
|
|
|
|
|
void *data;
|
2024-04-23 22:09:53 +08:00
|
|
|
|
FSMSignals signals;
|
2024-04-23 19:35:16 +08:00
|
|
|
|
// private
|
|
|
|
|
FMSPrivateVars privateVars;
|
2024-01-23 20:05:30 +08:00
|
|
|
|
} FSM;
|
|
|
|
|
|
|
|
|
|
|
2024-04-23 19:35:16 +08:00
|
|
|
|
/* -------------------------------------------------------------------------- */
|
|
|
|
|
/* protected函数,子类能用外界用不了 */
|
|
|
|
|
/* -------------------------------------------------------------------------- */
|
|
|
|
|
void stepBaseFSM(FSM *pFSM);
|
2024-01-23 20:05:30 +08:00
|
|
|
|
|
2024-04-23 19:35:16 +08:00
|
|
|
|
void constructFSM(FSM* pFSM);
|
2024-04-20 20:05:10 +08:00
|
|
|
|
FSM* newBaseFSM(int numState, int defaultState);
|
2024-01-23 20:05:30 +08:00
|
|
|
|
void resetBaseFSM(FSM *pFSM);
|
|
|
|
|
|
|
|
|
|
|
2024-04-23 22:09:53 +08:00
|
|
|
|
/* -------------------------------------------------------------------------- */
|
|
|
|
|
/* 内联函数 */
|
|
|
|
|
/* -------------------------------------------------------------------------- */
|
|
|
|
|
static inline void clearSignal(FSMSignals *signals, Uint16 signalFlag){
|
2024-04-24 14:25:31 +08:00
|
|
|
|
signals->external &= ~(1 << signalFlag);
|
2024-04-23 22:09:53 +08:00
|
|
|
|
}
|
|
|
|
|
static inline Uint16 getSignal(FSMSignals *signals, Uint16 signalFlag){
|
2024-04-24 14:25:31 +08:00
|
|
|
|
return (signals->external >> signalFlag) & 1;
|
|
|
|
|
}
|
|
|
|
|
static inline void clearAllSignals(FSMSignals *signals){
|
|
|
|
|
signals->external = 0;
|
2024-04-23 22:09:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2024-01-23 20:05:30 +08:00
|
|
|
|
#endif
|