#include #include #include "FSM_protected.h" #include "keyFSM.h" #include "keyFSM_private.h" /* 重载函数,有些是纯虚的必须重新实现,有些可以不重新实现直接用父类的 */ static Event selectEvent(KeyFSMData *data){ // 必须重新实现 if(data->countDelay == 4){ return HoldCount4; } if(data->countDelay == 3){ if(data->countMultiDown && data->lastState == MultiDownWaiting){ return MultiDown; } if(data->lastState == Holding){ return UpDebouncing2Waiting; } return DelayCount3; } if(data->in == Up){ return PhsicalUp; } else{ if(data->lastState == Holding){ return UpDebouncing2Holding; } return PhsicalDown; } } static void step(KeyFSM* pFSM){ printFSM(pFSM); stepBaseFSM(BASE_FSM(pFSM)); KeyFSMData * data = pFSM->base.data; printf("\t信号:%d, 计数%d, 上次状态%s", data->out, data->countDelay, stateStr[data->lastState]); } static void initData(KeyFSM *pFSM){ // 必须重新实现 KeyFSMData *data = (KeyFSMData *)malloc(sizeof(KeyFSMData)); data->countDelay = 0; data->countMultiDown = 0; data->in = Up; data->out = Idle; data->lastState = 0; pFSM->base.data = data; } static void setupHandler(FSMHandler* fcns){ // 必须重新实现 fcns->duringActionTable[Waiting] = (Avoid_WARNING_void_FSM)actionFcn(during, Waiting); fcns->exitActionTable[Waiting] = (Avoid_WARNING_void_FSM)actionFcn(exit, Waiting); fcns->duringActionTable[DownDebouncing] = (Avoid_WARNING_void_FSM)actionFcn(during, DownDebouncing); fcns->exitActionTable[DownDebouncing] = (Avoid_WARNING_void_FSM)actionFcn(exit, DownDebouncing); fcns->duringActionTable[Downing] = (Avoid_WARNING_void_FSM)actionFcn(during, Downing); fcns->exitActionTable[Downing] = (Avoid_WARNING_void_FSM)actionFcn(exit, Downing); fcns->duringActionTable[UpDebouncing] = (Avoid_WARNING_void_FSM)actionFcn(during, UpDebouncing); fcns->exitActionTable[UpDebouncing] = (Avoid_WARNING_void_FSM)actionFcn(exit, UpDebouncing); fcns->duringActionTable[Holding] = (Avoid_WARNING_void_FSM)actionFcn(during, Holding); fcns->exitActionTable[Holding] = (Avoid_WARNING_void_FSM)actionFcn(exit, Holding); fcns->duringActionTable[MultiDownWaiting] = (Avoid_WARNING_void_FSM)actionFcn(during, MultiDownWaiting); fcns->duringActionTable[MultiDowning] = (Avoid_WARNING_void_FSM)actionFcn(during, MultiDowning); fcns->exitActionTable[MultiDowning] = (Avoid_WARNING_void_FSM)actionFcn(during, MultiDowning); fcns->transitionTable[index(Waiting, PhsicalDown)] = (Avoid_WARNING_int_FSM)transitionHandler(PhsicalDown); fcns->transitionTable[index(DownDebouncing, PhsicalUp)] = (Avoid_WARNING_int_FSM)transitionHandler(PhsicalUp); fcns->transitionTable[index(DownDebouncing, DelayCount3)] = (Avoid_WARNING_int_FSM)transitionHandler(DelayCount3); fcns->transitionTable[index(DownDebouncing, MultiDown)] = (Avoid_WARNING_int_FSM)transitionHandler(MultiDown); fcns->transitionTable[index(Downing, PhsicalUp)] = (Avoid_WARNING_int_FSM)transitionHandler(PhsicalUp); fcns->transitionTable[index(Downing, HoldCount4)] = (Avoid_WARNING_int_FSM)transitionHandler(HoldCount4); fcns->transitionTable[index(UpDebouncing, PhsicalDown)] = (Avoid_WARNING_int_FSM)transitionHandler(PhsicalDown); fcns->transitionTable[index(UpDebouncing, DelayCount3)] = (Avoid_WARNING_int_FSM)transitionHandler(DelayCount3); fcns->transitionTable[index(UpDebouncing, UpDebouncing2Holding)] = (Avoid_WARNING_int_FSM)transitionHandler(UpDebouncing2Holding); fcns->transitionTable[index(UpDebouncing, UpDebouncing2Waiting)] = (Avoid_WARNING_int_FSM)transitionHandler(UpDebouncing2Waiting); fcns->transitionTable[index(Holding, PhsicalUp)] = (Avoid_WARNING_int_FSM)transitionHandler(PhsicalUp); fcns->transitionTable[index(MultiDownWaiting, PhsicalDown)] = (Avoid_WARNING_int_FSM)transitionHandler(PhsicalDown); fcns->transitionTable[index(MultiDownWaiting, DelayCount3)] = (Avoid_WARNING_int_FSM)transitionHandler(DelayCount3); fcns->transitionTable[index(MultiDowning, PhsicalUp)] = (Avoid_WARNING_int_FSM)transitionHandler(PhsicalUp); } /* 唯一外界调用的函数 */ KeyFSM *createKeyFSM(){ KeyFSM *pFSM; pFSM = (KeyFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE); pFSM->base.vtbl.step = (Avoid_WARNING_void_FSM)step; pFSM->base.vtbl.selectEvent = (Avoid_WARNING_int_data)selectEvent; pFSM->base.vtbl.initData = (Avoid_WARNING_void_FSM)initData; pFSM->base.vtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler; constructFSM((FSM_Ptr)pFSM); return pFSM; }