#ifndef __KEY_PRIVATE_FSM_H_ #define __KEY_PRIVATE_FSM_H_ #include "FSM_protected.h" #include "keyFSM.h" #include #include /* 继承基类 */ typedef struct _KeyFSM { // 继承父类 FSM base; }KeyFSM; /* 状态和对应的 action, exit, during 函数 */ typedef enum _State { Idle_State, Waiting, DownDebouncing, Downing, Holding, UpDebouncing, MultiClickWaiting, Count_State, } State; #define DEFAULT_STATE Waiting static void actionFcn(during, Waiting)(KeyFSM *pFSM){ KeyFSMData * data = pFSM->base.data; data->out = Idle; } static void actionFcn(exit, Waiting)(KeyFSM *pFSM){ KeyFSMData * data = pFSM->base.data; data->out = Idle; } static void actionFcn(during, DownDebouncing)(KeyFSM *pFSM) { KeyFSMData * data = pFSM->base.data; data->countDelay++; printf(" during开启消抖 "); } static void actionFcn(during, Downing)(KeyFSM *pFSM) { KeyFSMData * data = pFSM->base.data; data->countDelay++; data->out = Idle; } static void actionFcn(exit, Downing)(KeyFSM *pFSM) { KeyFSMData * data = pFSM->base.data; data->out = Idle; } static void actionFcn(during, UpDebouncing)(KeyFSM *pFSM){ KeyFSMData * data = pFSM->base.data; data->countDelay++; printf(" during开启消抖 "); } static void actionFcn(during, Holding)(KeyFSM *pFSM){ KeyFSMData * data = pFSM->base.data; data->countDelay++; if(data->countDelay == 2){ data->out = Hold; data->countDelay = 0; } else{ data->out = Idle; } } /* 事件和对应的转移函数 */ typedef enum _Event{ Idle_Event, PhsicalDown, PhsicalUp, DelayCount5, HoldCount10, Count_Event, }Event; static State transitionHandler(PhsicalDown)(KeyFSM *pFSM) { printf(" 物理按键按下 "); KeyFSMData * data = pFSM->base.data; data->countDelay = 0; switch (getFSMCurState((FSM_Ptr)pFSM)) { case Waiting: return DownDebouncing; case UpDebouncing: if(data->isLastHolding){ data->isLastHolding = 0; return Holding; } else return Downing; default: printf("检查状态转移表设计,不应该到这里"); assert(0); } } static State transitionHandler(PhsicalUp)(KeyFSM *pFSM) { printf(" 物理按键松开 "); KeyFSMData * data = pFSM->base.data; data->countDelay = 0; switch (getFSMCurState((FSM_Ptr)pFSM)) { case DownDebouncing: return Waiting; case Downing: return UpDebouncing; case Holding: data->out = Idle; return UpDebouncing; default: printf("检查状态转移表设计,不应该到这里"); assert(0); } } static State transitionHandler(DelayCount5)(KeyFSM *pFSM){ printf(" 延迟计数到5 "); KeyFSMData * data = pFSM->base.data; switch (getFSMCurState((FSM_Ptr)pFSM)) { case DownDebouncing: data->out = Down; data->countDelay = 0; printf("按键按下"); return Downing; case UpDebouncing: data->out = Up; data->countDelay = 0; printf("按键松开"); return Waiting; default: printf("检查状态转移表设计,不应该到这里"); assert(0); } } static State transitionHandler(HoldCount10)(KeyFSM *pFSM){ printf(" 计数到10进入长按模式 "); KeyFSMData * data = pFSM->base.data; data->countDelay = 0; data->out = Hold; data->isLastHolding = 1; return Holding; } /* 用户自定义事件选择逻辑—————————————————begin */ const static char *stateStr[] = { "Idle", "Waiting", "DownDebouncing", "Downing", "Holding", "UpDebouncing", "MultiClickWaiting", }; const static char *eventStr[] = { "Idle", "PhsicalDown", "PhsicalUp", "DelayCount5", }; static void printFSM(KeyFSM* pFSM){ printf("\tKeyFSM: "); printf("当前状态:%s, \t\t当前事件:%s, \t\t动作:", stateStr[getFSMCurState((FSM_Ptr)pFSM)], eventStr[getFSMCurEvent((FSM_Ptr)pFSM)]); } #endif