#include #include #include #include "FSM_protected.h" #include "parentFSM.h" #include "parentFSM_private.h" /* -------------------------------------------------------------------------- */ /* 纯虚函数,允许调用privateVars */ /* -------------------------------------------------------------------------- */ /** * @brief * @deprecated 暂时没用,后续考虑data是否需要加锁再说 * @param data 主要是外部数据 */ static void loadExternalData(ParentFSMData *data){ // 必须重新实现 } /** * @brief 根据条件重置信号 * @details 清除被响应信号和所有小于被响应信号优先级的信号,具体可以参考notion * @param signals 状态机接收到的信号 * @param data 状态机数据 */ static void resetSignals(FSMSignals *signals, ParentFSMData *data){ // 必须重新实现 clearAllSignals(signals); } /** * @brief 给所有内部、外部数据分配堆空间 * * @param pFSM */ static void initData(ParentFSM *pFSM){ // 必须重新实现 ParentFSMData *data = (ParentFSMData *)malloc(sizeof(ParentFSMData)); ParentFSMData tempData = { .external = { .arrindex = 0, .x = 0, }, .internal = { .inner1 = 0, .y1 = 0, }, }; *data = tempData; pFSM->base.data = data; } /** * @brief * @deprecated 弃用 * @param pFSM */ static void initDataLoader(ParentFSM *pFSM){ // 必须重新实现 // pFSM->base.privateVars->preloader.shadowData = malloc(sizeof(ParentFSMExternalData)); // pFSM->base.privateVars->preloader.size = sizeof(ParentFSMExternalData); } /** * @brief 设置状态选择函数、状态内函数和状态转移函数 * * @param fcns 状态机函数表 */ static void setupHandler(FSMHandler* fcns){ // 必须重新实现 /* ------------------------------- 添加下一个状态选择函数 ------------------------------ */ addSelectNextStateFcn(Idle); addSelectNextStateFcn(A); addSelectNextStateFcn(B); addSelectNextStateFcn(C); /* ----------------------- 添加状态中事件,action during exit ----------------------- */ addStateActionFcn(during, A); addStateActionFcn(during, B); addStateActionFcn(during, C); addStateActionFcn(enter, A); addStateActionFcn(enter, B); addStateActionFcn(enter, C); addStateActionFcn(exit, A); addStateActionFcn(exit, B); addStateActionFcn(exit, C); /* --------------------------- 添加转移函数和转移函数对应的Delay -------------------------- */ addTransitionHandler(Idle, A); addTransitionHandler(A, B); addTransitionHandler(B, A); addTransitionHandler(B, C); addTransitionHandler(C, A); fcns->transitionGeneralAction = (Avoid_WARNING_General_Handlers)transitionGeneralAction; } /* -------------------------------------------------------------------------- */ /* 其他重新实现的函数,父类已有实现,实现多态 */ /* -------------------------------------------------------------------------- */ /** * @brief 重新实现基类的step函数,添加一些打印信息 * * @param pFSM 子类状态机指针 */ static void step(ParentFSM* pFSM){ printFSM(pFSM); stepBaseFSM(BASE_FSM(pFSM)); FSM_LOG("下次状态:%s", stateStr[getFSMNextState((FSM *)pFSM)]); } // 绑定子状态机 void bindChildFSM(FSM *pFSM, FSM *cFSM){ registerChildFSM(pFSM, cFSM, B); } /* -------------------------------------------------------------------------- */ /* 子类构造函数 */ /* -------------------------------------------------------------------------- */ /** * @brief Create a Parent FSM object * @details 子类状态机细节对外隐藏,外部只能访问基类的公有函数来操作子类变量 * @return ParentFSM* */ ParentFSM *createParentFSM(){ ParentFSM *pFSM; pFSM = (ParentFSM *)newBaseFSM(Count_State); // 重新实现的函数 pFSM->base.publicFcns.step = (Avoid_WARNING_Overrider_Fcns)step; pFSM->base.pureVtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData; pFSM->base.pureVtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader; pFSM->base.pureVtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler; pFSM->base.pureVtbl.resetSignals = (Avoid_WARNING_ResetSignals_Fcns)resetSignals; pFSM->base.pureVtbl.loadExternalData = (Avoid_WARNING_loadData_Fcns)loadExternalData; // 调用父类构造函数 constructFSM((FSM *)pFSM); FSM_LOG("ok\n"); return pFSM; }