/* * @Author: godcreator02 qq974980621@gmail.com * @Date: 2024-04-20 19:02:11 * @LastEditors: godcreator02 qq974980621@gmail.com * @LastEditTime: 2024-04-23 19:37:03 * @FilePath: \vscode\FSM_OOP\keytest\keyFSM.c * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ #include #include #include #include "FSM_protected.h" #include "keyFSM.h" #include "keyFSM_private.h" /* -------------------------------------------------------------------------- */ /* 纯虚函数,允许调用privateVars */ /* -------------------------------------------------------------------------- */ static void initData(KeyFSM *pFSM){ // 必须重新实现 KeyFSMData *data = (KeyFSMData *)malloc(sizeof(KeyFSMData)); data->countDelay = 0; data->countMultiDown = 0; data->in = Up; data->out = Idle; pFSM->base.data = data; pFSM->base.signals = &data->out; } static void initDataLoader(KeyFSM *pFSM){ // 必须重新实现 pFSM->base.privateVars.preloader.shadowData = malloc(sizeof(KeyIn)); pFSM->base.privateVars.preloader.size = sizeof(KeyIn); } static void initSignals(KeyFSM *pFSM){ // 必须重新实现 pFSM->base.signalSize = sizeof(KeyOutSignal); } static void setupHandler(FSMHandler* fcns){ // 必须重新实现 /* ------------------------------- 添加下一个状态选择函数 ------------------------------ */ addSelectNextStateFcn(Waiting); addSelectNextStateFcn(DownDebouncing); addSelectNextStateFcn(Downing); addSelectNextStateFcn(Holding); addSelectNextStateFcn(HoldUpDebouncing); addSelectNextStateFcn(UpDebouncing); addSelectNextStateFcn(MultiDownWaiting); addSelectNextStateFcn(MultiDowning); addSelectNextStateFcn(MultiDownDebouncing); /* ----------------------- 添加状态中事件,action during exit ----------------------- */ addStateActionFcn(enter, Waiting); addStateActionFcn(during, DownDebouncing); addStateActionFcn(during, Downing); addStateActionFcn(during, UpDebouncing); addStateActionFcn(during, Holding); addStateActionFcn(exit, Holding); addStateActionFcn(during, MultiDownWaiting); addStateActionFcn(during, HoldUpDebouncing); addStateActionFcn(during, MultiDownDebouncing); /* --------------------------- 添加转移函数和转移函数对应的Delay -------------------------- */ addTransitionHandler(DownDebouncing, Downing); addTransitionHandler(UpDebouncing, MultiDownWaiting); addTransitionHandler(MultiDownDebouncing, MultiDowning); addTransitionHandler(Downing, Holding); addTransitionHandler(MultiDownWaiting, Waiting); fcns->transitionGeneralAction = (Avoid_WARNING_General_Handlers)transitionGeneralAction; } /* -------------------------------------------------------------------------- */ /* 其他重新实现的函数,父类已有实现,实现多态 */ /* -------------------------------------------------------------------------- */ static void step(KeyFSM* pFSM){ printFSM(pFSM); stepBaseFSM(BASE_FSM(pFSM)); KeyFSMData * data = pFSM->base.data; FSM_LOG("\t信号:%d, 计数%d ", data->out, data->countDelay); } /* 唯一外界调用的函数 */ KeyFSM *createKeyFSM(){ KeyFSM *pFSM; pFSM = (KeyFSM *)newBaseFSM(Count_State, DEFAULT_STATE); #ifndef DSP28377 pFSM->base.step = (Avoid_WARNING_Overrider_Fcns)step; #endif pFSM->base.pureVtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler; pFSM->base.pureVtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData; pFSM->base.pureVtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader; pFSM->base.pureVtbl.initSignals = (Avoid_WARNING_Overrider_Fcns)initSignals; constructFSM((FSM *)pFSM); return pFSM; }