#ifndef __FSM_PUBLIC_H_ #define __FSM_PUBLIC_H_ #define BASE_FSM(ptr) ((FSM *)(ptr)) #define BASE_PTR (FSM *) typedef struct _FSM FSM; #define Step(pFSM) _vptrFSM((FSM *)pFSM)->step((FSM *)pFSM) #define PreloaderGetReady(pFSM) _preloaderGetReady((FSM *)pFSM); #define GetPreloaderOverFlag(pFSM) _getPreloaderOverFlag((FSM *)pFSM) #define ClearPreloaderOverFlag(pFSM) _clearPreloaderOverFlag((FSM *)pFSM) #define GetData(pFSM) _getData((FSM*)pFSM) typedef struct _FSMHandler FSMHandler; // 这几个函数可认为是虚函数, 构造函数里不会初始化FSMVtbl, 必须由子类重新实现 typedef struct _FSMVtbl { // 状态机控制 int (*selectEvent)(void *data, void *signals); // 可以认为是纯虚函数, 子类必须重新实现 void (*reset)(FSM *pFSM); // 子类重新实现可以添加一些打印信息 void (*step)(FSM *pFSM); // 子类重新实现可以添加一些打印信息 void (*initData)(FSM *pFSM); // 子类必须重新实现 void (*initSignals)(FSM *pFSM); // 子类必须重新实现 void (*resetSignals)(FSM *pFSM); // 子类必须重新实现 void (*setupHandler)(FSMHandler *fcns); // 子类必须重新实现 void (*initDataLoader)(FSM *pFSM); // 子类必须重新实现 }FSMVtbl; /* --------------------------------- 状态机信息获取 -------------------------------- */ int getFSMCurState(FSM *pFSM); int getFSMCurEvent(FSM *pFSM); void setChildNum(FSM *pFSM, int num); void registerChildFSM(FSM *parent, FSM *child, int index); /* ------------------------------ Data和Signals ------------------------------ */ const void *_getData(FSM* pFSM); void *_getSignals(FSM* pFSM); /* ---------------------------------- 预装载器 ---------------------------------- */ void *_preloadIn(FSM *pFSM); void _preloaderGetReady(FSM *pFSM); int _getPreloaderOverFlag(FSM *pFSM); void _clearPreloaderOverFlag(FSM *pFSM); FSMVtbl *_vptrFSM(FSM* pFSM); #endif