FSM/vscode/FSM_OOP/baseFSM/FSM_protected.h

158 lines
5.1 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 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)
#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 _FSMHandler FSMHandler;
typedef struct _FSM FSM;
typedef struct _FSMSignals FSMSignals;
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 void (*Avoid_WARNING_ResetSignals_Fcns)(FSMSignals* signals);
typedef int (*Avoid_WARNING_SelectNextState)(void *data, FSMSignals* signals);
typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns);
/* -------------------------------------------------------------------------- */
/* private数据类型但是不能声明到private.h里 */
/* -------------------------------------------------------------------------- */
typedef struct _FSMHandler{
int (**selectNextState)(void *data, FSMSignals* 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;
int index;
FSMHandler fcns;
int numChild;
FSM **childFSM;
FSMDataLoader preloader;
}FMSPrivateVars;
#define Idle_Signal 16
typedef struct _FSMSignals
{
Uint16 all;
Uint16 lastTriggeredSignal;
}FSMSignals;
/* -------------------------------------------------------------------------- */
/* 纯虚函数,子类必须重新实现,父类构造函数不会初始化 */
/* -------------------------------------------------------------------------- */
typedef struct _FSMPureVtbl {
// 状态机控制
void (*initData)(FSM *pFSM); // =0子类必须重新实现
void (*initSignals)(FSM *pFSM); // =0子类必须重新实现
void (*resetSignals)(FSMSignals *signalRegs); // =0子类必须重新实现
void (*setupHandler)(FSMHandler *fcns); // =0子类必须重新实现
void (*initDataLoader)(FSM *pFSM); // =0子类必须重新实现
}FSMPureVtbl;
/* -------------------------------------------------------------------------- */
/* 基类定义,纯虚类 */
/* -------------------------------------------------------------------------- */
typedef struct _FSM
{
// public functions
void (*step)(FSM *pFSM); // 子类重新实现可以添加一些打印信息
void (*reset)(FSM *pFSM); // 子类重新实现可以添加一些打印信息
// protected
FSMPureVtbl pureVtbl;
void *data;
FSMSignals signals;
// private
FMSPrivateVars privateVars;
} FSM;
/* -------------------------------------------------------------------------- */
/* protected函数子类能用外界用不了 */
/* -------------------------------------------------------------------------- */
void stepBaseFSM(FSM *pFSM);
void constructFSM(FSM* pFSM);
FSM* newBaseFSM(int numState, int defaultState);
void resetBaseFSM(FSM *pFSM);
/* -------------------------------------------------------------------------- */
/* 内联函数 */
/* -------------------------------------------------------------------------- */
static inline void clearSignal(FSMSignals *signals, Uint16 signalFlag){
signals->all &= ~(1 << signalFlag);
}
static inline Uint16 getSignal(FSMSignals *signals, Uint16 signalFlag){
return (signals->all >> signalFlag) & 1;
}
#endif