#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, MultiDownWaiting, MultiDowning, 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(exit, DownDebouncing)(KeyFSM *pFSM){ KeyFSMData * data = pFSM->base.data; data->lastState = Idle_State; } 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(exit, UpDebouncing)(KeyFSM *pFSM){ KeyFSMData * data = pFSM->base.data; data->lastState = Idle_State; } 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; } } static void actionFcn(exit, Holding)(KeyFSM *pFSM){ KeyFSMData * data = pFSM->base.data; data->out = Idle; } static void actionFcn(during, MultiDownWaiting)(KeyFSM *pFSM){ KeyFSMData * data = pFSM->base.data; data->countDelay++; printf(" during多击等待 "); } static void actionFcn(during, MultiDowning)(KeyFSM *pFSM) { KeyFSMData * data = pFSM->base.data; data->out = Idle; } static void actionFcn(exit, MultiDowning)(KeyFSM *pFSM){ KeyFSMData * data = pFSM->base.data; data->out = Idle; } /* 事件和对应的转移函数 */ typedef enum _Event{ Idle_Event, PhsicalDown, PhsicalUp, DelayCount3, HoldCount4, MultiDown, UpDebouncing2Holding, UpDebouncing2Waiting, 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->countMultiDown){ return MultiDowning; } if(data->lastState == Holding){ data->lastState = Idle_State; return Holding; } else return Downing; case MultiDownWaiting: data->lastState = MultiDownWaiting; return DownDebouncing; 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: if(data->countMultiDown){ return MultiDownWaiting; } return Waiting; case Downing: return UpDebouncing; case Holding: data->lastState = Holding; return UpDebouncing; case MultiDowning: return UpDebouncing; default: printf("检查状态转移表设计,不应该到这里"); assert(0); } } static State transitionHandler(DelayCount3)(KeyFSM *pFSM){ printf(" 延迟计数到3 "); KeyFSMData * data = pFSM->base.data; data->countDelay = 0; switch (getFSMCurState((FSM_Ptr)pFSM)) { case DownDebouncing: data->out = Down; printf("按键按下"); return Downing; case UpDebouncing: data->out = Up; data->countMultiDown++; printf("按键松开"); return MultiDownWaiting; case MultiDownWaiting: data->out = Idle; data->countMultiDown = 0; return Waiting; default: printf("检查状态转移表设计,不应该到这里"); assert(0); } } static State transitionHandler(HoldCount4)(KeyFSM *pFSM){ printf(" 计数到2进入长按模式 "); KeyFSMData * data = pFSM->base.data; data->countDelay = 0; data->out = Hold; return Holding; } static State transitionHandler(MultiDown)(KeyFSM *pFSM){ printf(" 多击 "); KeyFSMData * data = pFSM->base.data; data->countDelay = 0; switch (data->countMultiDown + 1) { case 2: data->out = Down_2times; break; case 3: data->out = Down_3times; break; default: printf(" 到达多击次数上限了 "); break; } printf(" 多击%d ", data->countMultiDown+1); return MultiDowning; } static State transitionHandler(UpDebouncing2Holding)(KeyFSM *pFSM){ printf(" 回到长按 "); KeyFSMData * data = pFSM->base.data; data->countDelay = 0; data->out = Idle; return Holding; } static State transitionHandler(UpDebouncing2Waiting)(KeyFSM *pFSM){ printf(" 关闭消抖到等待 "); KeyFSMData * data = pFSM->base.data; data->countDelay = 0; data->out = Idle; return Waiting; } /* 用户自定义事件选择逻辑—————————————————begin */ const static char *stateStr[] = { "Idle", "Waiting", "DownDebouncing", "Downing", "Holding", "UpDebouncing", "MultiDownWaiting", "MultiDowning", }; const static char *eventStr[] = { "Idle", "PhsicalDown", "PhsicalUp", "DelayCount3", "HoldCount4", "MultiDown", "UpDebouncing2Holding", "UpDebouncing2Waiting" }; 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