/* * @Author: godcreator02 qq974980621@gmail.com * @Date: 2024-04-20 20:08:03 * @LastEditors: godcreator02 qq974980621@gmail.com * @LastEditTime: 2024-04-23 22:08:11 * @FilePath: \vscode\FSM_OOP\template\templateFSM.c * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ #include #include #include #include "FSM_protected.h" #include "templateFSM.h" #include "templateFSM_private.h" /* -------------------------------------------------------------------------- */ /* 纯虚函数,允许调用privateVars */ /* -------------------------------------------------------------------------- */ static void initData(TemplateFSM *pFSM){ // 必须重新实现 TemplateFSMData *data = (TemplateFSMData *)malloc(sizeof(TemplateFSMData)); TemplateFSMData tempData = { .external = { .arrindex = 0, .x = 0, }, .inner = { .inner1 = 0, .y1 = 0, }, }; *data = tempData; pFSM->base.data = data; } static void initDataLoader(TemplateFSM *pFSM){ // 必须重新实现 pFSM->base.privateVars.preloader.shadowData = malloc(sizeof(TemplateFSMExternalData)); pFSM->base.privateVars.preloader.size = sizeof(TemplateFSMExternalData); } static void resetSignals(FSMSignals *signals){ // 必须重新实现 switch (signals->lastTriggeredSignal) { case Signal_A: clearSignal(signals, Signal_A); break; default: break; } } static void setupHandler(FSMHandler* fcns){ // 必须重新实现 /* ------------------------------- 添加下一个状态选择函数 ------------------------------ */ addSelectNextStateFcn(D); addSelectNextStateFcn(E); /* ----------------------- 添加状态中事件,action during exit ----------------------- */ addStateActionFcn(during, E); addStateActionFcn(during, D); addStateActionFcn(enter, E); addStateActionFcn(enter, D); addStateActionFcn(exit, E); addStateActionFcn(exit, D); /* --------------------------- 添加转移函数和转移函数对应的Delay -------------------------- */ addTransitionHandler(Idle, D); addTransitionHandler(Idle, E); addTransitionHandler(D, E); addTransitionHandler(E, D); fcns->transitionGeneralAction = (Avoid_WARNING_General_Handlers)transitionGeneralAction; } /* -------------------------------------------------------------------------- */ /* 其他重新实现的函数,父类已有实现,实现多态 */ /* -------------------------------------------------------------------------- */ static void step(TemplateFSM* pFSM){ printFSM(pFSM); stepBaseFSM(BASE_FSM(pFSM)); FSM_LOG("下次状态:%s", stateStr[getFSMNextState((FSM *)pFSM)]); } /* -------------------------------------------------------------------------- */ /* 子类构造函数 */ /* -------------------------------------------------------------------------- */ TemplateFSM *createTemplateFSM(){ TemplateFSM *pFSM; pFSM = (TemplateFSM *)newBaseFSM(Count_State, DEFAULT_STATE); // 重新实现的函数 pFSM->base.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; // 调用父类构造函数 constructFSM((FSM *)pFSM); return pFSM; }