diff --git a/FSM_OOP/usr/keyFSM.c b/FSM_OOP/usr/keyFSM.c index 9f4875c..a306ec0 100644 --- a/FSM_OOP/usr/keyFSM.c +++ b/FSM_OOP/usr/keyFSM.c @@ -8,23 +8,17 @@ /* 重载函数,有些是纯虚的必须重新实现,有些可以不重新实现直接用父类的 */ -static Event ceventArr[20] = { - Idle_Event, - Idle_Event, - Idle2D, - Idle_Event, - Idle_Event, - D2E, - E2D, - D2E, - Idle_Event, - Idle_Event, - Idle_Event, - Idle_Event, -}; static Event selectEvent(KeyFSMData *data){ // 必须重新实现 - return ceventArr[data->arrindex]; + if(data->countDelay == 5){ + return DelayCount5; + } + if(data->in == Up){ + return PhsicalUp; + } + else{ + return PhsicalDown; + } } static void step(KeyFSM* pFSM){ @@ -34,25 +28,32 @@ static void step(KeyFSM* pFSM){ static void initData(KeyFSM *pFSM){ // 必须重新实现 KeyFSMData *data = (KeyFSMData *)malloc(sizeof(KeyFSMData)); - data->arrindex = 0; + data->countDelay = 0; + data->countMultiDown = 0; + data->in = Up; + data->out = Idle; pFSM->base.data = data; } static void setupHandler(FSMHandler* fcns){ // 必须重新实现 - fcns->duringActionTable[E] = (Avoid_WARNING_void_FSM)actionFcn(during, E); - fcns->duringActionTable[D] = (Avoid_WARNING_void_FSM)actionFcn(during, D); + fcns->duringActionTable[Waiting] = (Avoid_WARNING_void_FSM)actionFcn(during, Waiting); + fcns->exitActionTable[Waiting] = (Avoid_WARNING_void_FSM)actionFcn(exit, Waiting); - fcns->enterActionTable[D] = (Avoid_WARNING_void_FSM)actionFcn(enter, D); - fcns->enterActionTable[E] = (Avoid_WARNING_void_FSM)actionFcn(enter, E); + fcns->duringActionTable[DownDebouncing] = (Avoid_WARNING_void_FSM)actionFcn(during, DownDebouncing); - fcns->exitActionTable[D] = (Avoid_WARNING_void_FSM)D_exitAction; - fcns->exitActionTable[E] = (Avoid_WARNING_void_FSM)E_exitAction; + fcns->duringActionTable[Downing] = (Avoid_WARNING_void_FSM)actionFcn(during, Downing); + fcns->exitActionTable[Downing] = (Avoid_WARNING_void_FSM)actionFcn(exit, Downing); - fcns->transitionTable[index(Idle, Idle2D)] = (Avoid_WARNING_int_FSM)transitionHandler(Idle2D); - fcns->transitionTable[index(Idle, Idle2E)] = (Avoid_WARNING_int_FSM)transitionHandler(Idle2E); - fcns->transitionTable[index(D, D2E)] = (Avoid_WARNING_int_FSM)transitionHandler(D2E); - fcns->transitionTable[index(E, E2D)] = (Avoid_WARNING_int_FSM)transitionHandler(E2D); + fcns->duringActionTable[UpDebouncing] = (Avoid_WARNING_void_FSM)actionFcn(during, UpDebouncing); + + + 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, DelayCount5)] = (Avoid_WARNING_int_FSM)transitionHandler(DelayCount5); + fcns->transitionTable[index(Downing, PhsicalUp)] = (Avoid_WARNING_int_FSM)transitionHandler(PhsicalUp); + fcns->transitionTable[index(UpDebouncing, PhsicalDown)] = (Avoid_WARNING_int_FSM)transitionHandler(PhsicalDown); + fcns->transitionTable[index(UpDebouncing, DelayCount5)] = (Avoid_WARNING_int_FSM)transitionHandler(DelayCount5); } /* diff --git a/FSM_OOP/usr/keyFSM.h b/FSM_OOP/usr/keyFSM.h index d7d500d..98fb596 100644 --- a/FSM_OOP/usr/keyFSM.h +++ b/FSM_OOP/usr/keyFSM.h @@ -1,9 +1,27 @@ #ifndef __KEY_FSM_H_ #define __KEY_FSM_H_ + +typedef enum _keyIn{ + Up, + pDown, +}KeyIn; + + +typedef enum _keyOutSignal{ + Idle, + Down, + Hold, + Down_2times, + Down_3times, +}KeyOutSignal; + typedef struct _keyFSMData { - int arrindex; + int countDelay; + int countMultiDown; + KeyIn in; + KeyOutSignal out; }KeyFSMData; typedef struct _KeyFSM KeyFSM; diff --git a/FSM_OOP/usr/keyFSM_private.h b/FSM_OOP/usr/keyFSM_private.h index 73fb50a..dfac4d5 100644 --- a/FSM_OOP/usr/keyFSM_private.h +++ b/FSM_OOP/usr/keyFSM_private.h @@ -4,7 +4,7 @@ #include "FSM_protected.h" #include "keyFSM.h" #include - +#include /* 继承基类 @@ -21,77 +21,133 @@ typedef struct _KeyFSM typedef enum _State { - Idle, - D, - E, + Idle_State, + Waiting, + DownDebouncing, + Downing, + Holding, + UpDebouncing, + MultiClickWaiting, Count_State, } State; -#define DEFAULT_STATE E +#define DEFAULT_STATE Waiting -static void actionFcn(enter, D)() -{ - printf(" enterD "); + +static void actionFcn(during, Waiting)(KeyFSM *pFSM){ + KeyFSMData * data = pFSM->base.data; + data->out = Idle; } -static void actionFcn(during, D)() -{ - printf(" duringD "); -} -static void actionFcn(exit, D)() -{ - printf(" exitD "); +static void actionFcn(exit, Waiting)(KeyFSM *pFSM){ + KeyFSMData * data = pFSM->base.data; + data->out = Idle; } -static void actionFcn(enter, E)() + + +static void actionFcn(during, DownDebouncing)(KeyFSM *pFSM) { - printf(" enterE "); + KeyFSMData * data = pFSM->base.data; + data->countDelay++; + printf(" during开启消抖 "); } -static void actionFcn(during, E)() + + +static void actionFcn(during, Downing)(KeyFSM *pFSM) { - printf(" duringE "); + KeyFSMData * data = pFSM->base.data; + data->countDelay++; + data->out = Idle; } -static void actionFcn(exit, E)() +static void actionFcn(exit, Downing)(KeyFSM *pFSM) { - printf(" exitE "); + KeyFSMData * data = pFSM->base.data; + data->out = Idle; } + + +static void actionFcn(during, UpDebouncing)(KeyFSM *pFSM){ + KeyFSMData * data = pFSM->base.data; + data->countDelay++; +} + + + + /* 事件和对应的转移函数 */ typedef enum _Event{ Idle_Event, - Idle2D, - Idle2E, - D2E, - E2D, + PhsicalDown, + PhsicalUp, + DelayCount5, Count_Event, }Event; - -static State transitionHandler(Idle2D)() +static State transitionHandler(PhsicalDown)(KeyFSM *pFSM) { - printf(" Idle2D "); - return D; + printf(" 物理按键按下 "); + switch (getFSMCurState((FSM_Ptr)pFSM)) + { + case Waiting: + return DownDebouncing; + break; + case UpDebouncing: + return Downing; + break; + default: + printf("检查状态转移表设计,不应该到这里"); + assert(0); + break; + } } -static State transitionHandler(Idle2E)() +static State transitionHandler(PhsicalUp)(KeyFSM *pFSM) { - printf(" Idle2E "); - return E; + printf(" 物理按键松开 "); + switch (getFSMCurState((FSM_Ptr)pFSM)) + { + case DownDebouncing: + return Waiting; + + case Downing: + return UpDebouncing; + + default: + printf("检查状态转移表设计,不应该到这里"); + assert(0); + + } } -static State transitionHandler(D2E)() -{ - printf(" D2E "); - return E; -} +static State transitionHandler(DelayCount5)(KeyFSM *pFSM){ + printf(" 延迟计数到5 "); -static State transitionHandler(E2D)() -{ - printf(" E2D "); - return D; + 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); + } } @@ -102,19 +158,22 @@ static State transitionHandler(E2D)() */ const static char *stateStr[] = { "Idle", - "D", - "E", + "Waiting", + "DownDebouncing", + "Downing", + "Holding", + "UpDebouncing", + "MultiClickWaiting", }; const static char *eventStr[] = { "Idle", - "Idle2D", - "Idle2E", - "D2E", - "E2D", + "PhsicalDown", + "PhsicalUp", + "DelayCount5", }; static void printFSM(KeyFSM* pFSM){ - printf(" \t\tKeyFSM: "); - printf("当前状态:%s, 当前事件:%s, 动作:", stateStr[getFSMCurState((FSM_Ptr)pFSM)], eventStr[getFSMCurEvent((FSM_Ptr)pFSM)]); + printf("\tKeyFSM: "); + printf("当前状态:%s, \t\t当前事件:%s, \t\t动作:", stateStr[getFSMCurState((FSM_Ptr)pFSM)], eventStr[getFSMCurEvent((FSM_Ptr)pFSM)]); } diff --git a/main.c b/main.c index e2ec8d2..103e577 100644 --- a/main.c +++ b/main.c @@ -1,9 +1,31 @@ #include +#include "keyFSM.h" +#include "FSM_public.h" +#define NUM 30 +KeyIn testin[NUM] = { + Up,Up,Up,Up,Up,Up, pDown,pDown,pDown, Up,Up, pDown,pDown,pDown,pDown,pDown,pDown,pDown,pDown +}; int main(){ + + KeyFSM* keyFSM = createKeyFSM(); + + for (int i = 0; i < NUM; i++) + { + printf("第%d次: ",i); + KeyFSMData* data = getData((FSM_Ptr)keyFSM); + data->in = testin[i]; + setEvent((FSM_Ptr)keyFSM); + vptrFSM((FSM_Ptr)keyFSM)->step((FSM_Ptr)keyFSM); + + printf("\n"); + } + + + printf("hello world, 你好世界"); return 0;