2024-01-23 20:05:30 +08:00
|
|
|
#ifndef __FSM_PUBLIC_H_
|
|
|
|
#define __FSM_PUBLIC_H_
|
|
|
|
|
2024-01-30 16:06:02 +08:00
|
|
|
#define BASE_FSM(ptr) ((FSM *)(ptr))
|
|
|
|
#define BASE_PTR (FSM *)
|
2024-01-23 20:05:30 +08:00
|
|
|
|
|
|
|
typedef struct _FSM FSM;
|
|
|
|
typedef FSM * FSM_Ptr;
|
|
|
|
|
2024-01-30 15:11:15 +08:00
|
|
|
// #define SetEvent(FSM) setEvent((FSM_Ptr)FSM)
|
2024-01-29 20:32:07 +08:00
|
|
|
#define Step(FSM) vptrFSM((FSM_Ptr)FSM)->step((FSM_Ptr)FSM)
|
|
|
|
|
2024-01-23 20:05:30 +08:00
|
|
|
typedef struct _FSMHandler FSMHandler;
|
|
|
|
// 这几个函数可认为是虚函数, 构造函数里不会初始化FSMVtbl, 必须由子类重新实现
|
|
|
|
typedef struct _FSMVtbl {
|
|
|
|
// 状态机控制
|
|
|
|
int (*selectEvent)(void *data); // 可以认为是纯虚函数, 子类必须重新实现
|
|
|
|
void (*reset)(FSM *pFSM); // 子类重新实现可以添加一些打印信息
|
|
|
|
void (*step)(FSM *pFSM); // 子类重新实现可以添加一些打印信息
|
|
|
|
void (*initData)(FSM *pFSM); // 子类必须重新实现
|
|
|
|
void (*setupHandler)(FSMHandler *fcns); // 子类必须重新实现
|
2024-01-30 20:35:05 +08:00
|
|
|
void (*initDataLoader)(FSM *pFSM); // 子类必须重新实现
|
2024-01-23 20:05:30 +08:00
|
|
|
}FSMVtbl;
|
|
|
|
|
|
|
|
|
2024-01-29 20:32:07 +08:00
|
|
|
int getFSMCurState(FSM *pFSM);
|
|
|
|
int getFSMCurEvent(FSM *pFSM);
|
2024-01-30 15:11:15 +08:00
|
|
|
// void setEvent(FSM* pFSM);
|
2024-01-23 20:05:30 +08:00
|
|
|
void setChildNum(FSM *pFSM, int num);
|
|
|
|
void registerChildFSM(FSM *parent, FSM *child, int index);
|
|
|
|
|
2024-01-30 15:11:15 +08:00
|
|
|
const void *getData(FSM* pFSM);
|
|
|
|
void *preloadIn(FSM *pFSM);
|
|
|
|
void preloaderReady(FSM *pFSM);
|
|
|
|
|
2024-01-23 20:05:30 +08:00
|
|
|
FSMVtbl *vptrFSM(FSM* pFSM);
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|