From 1743321fabfbf8e20407d6db341da22f813f9731 Mon Sep 17 00:00:00 2001 From: godcreator <974980621@qq.com> Date: Wed, 24 Jan 2024 01:26:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=B4=E6=99=95=E4=BA=86=EF=BC=8ClastState?= =?UTF-8?q?=3DHolding=E8=BF=99=E5=8F=A5=E4=B8=8D=E7=9F=A5=E9=81=93?= =?UTF-8?q?=E5=8A=A0=E5=9C=A8=E5=93=AA=E3=80=82=E5=8A=A0=E5=9C=A8exit=20Up?= =?UTF-8?q?debouncing=E7=9A=84=E8=AF=9D=E5=B0=B1=E5=9B=9E=E4=B8=8D?= =?UTF-8?q?=E5=8E=BBHolding=EF=BC=8C=E4=B8=8D=E5=8A=A0=E5=9C=A8=E8=BF=99?= =?UTF-8?q?=E5=B0=B1=E4=BC=9A=E5=AF=BC=E8=87=B4lastState=3DHolding?= =?UTF-8?q?=E5=88=B0=E5=A4=84=E4=BC=A0=E6=92=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FSM_OOP/usr/keyFSM.c | 36 ++++++++--- FSM_OOP/usr/keyFSM.h | 2 +- FSM_OOP/usr/keyFSM_private.h | 118 +++++++++++++++++++++++++++++------ main.c | 15 +---- 4 files changed, 127 insertions(+), 44 deletions(-) diff --git a/FSM_OOP/usr/keyFSM.c b/FSM_OOP/usr/keyFSM.c index 21c81ed..b4af347 100644 --- a/FSM_OOP/usr/keyFSM.c +++ b/FSM_OOP/usr/keyFSM.c @@ -10,13 +10,17 @@ */ static Event selectEvent(KeyFSMData *data){ // 必须重新实现 - if(data->countDelay == 10){ - return HoldCount10; + if(data->countDelay == 2){ + return HoldCount2; } - if(data->countDelay == 5){ - return DelayCount5; + if(data->countDelay == 3){ + if(data->countMultiDown && data->lastState == MultiDownWaiting){ + return MultiDown; + } + return DelayCount3; } + if(data->in == Up){ return PhsicalUp; } @@ -31,7 +35,7 @@ static void step(KeyFSM* pFSM){ KeyFSMData * data = pFSM->base.data; - printf(" 信号:%d, 计数%d", data->out, data->countDelay); + printf("\t信号:%d, 计数%d, 上次状态%s", data->out, data->countDelay, stateStr[data->lastState]); } static void initData(KeyFSM *pFSM){ // 必须重新实现 @@ -40,7 +44,7 @@ static void initData(KeyFSM *pFSM){ // 必须重新实现 data->countMultiDown = 0; data->in = Up; data->out = Idle; - data->isLastHolding = 0; + data->lastState = 0; pFSM->base.data = data; } @@ -50,6 +54,7 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现 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); @@ -57,20 +62,33 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现 fcns->duringActionTable[UpDebouncing] = (Avoid_WARNING_void_FSM)actionFcn(during, 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, DelayCount5)] = (Avoid_WARNING_int_FSM)transitionHandler(DelayCount5); + 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, HoldCount10)] = (Avoid_WARNING_int_FSM)transitionHandler(HoldCount10); + fcns->transitionTable[index(Downing, HoldCount2)] = (Avoid_WARNING_int_FSM)transitionHandler(HoldCount2); fcns->transitionTable[index(UpDebouncing, PhsicalDown)] = (Avoid_WARNING_int_FSM)transitionHandler(PhsicalDown); - fcns->transitionTable[index(UpDebouncing, DelayCount5)] = (Avoid_WARNING_int_FSM)transitionHandler(DelayCount5); + fcns->transitionTable[index(UpDebouncing, DelayCount3)] = (Avoid_WARNING_int_FSM)transitionHandler(DelayCount3); 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); + } /* diff --git a/FSM_OOP/usr/keyFSM.h b/FSM_OOP/usr/keyFSM.h index 16ac470..127a162 100644 --- a/FSM_OOP/usr/keyFSM.h +++ b/FSM_OOP/usr/keyFSM.h @@ -22,7 +22,7 @@ typedef struct _keyFSMData int countMultiDown; KeyIn in; KeyOutSignal out; - int isLastHolding; + int lastState; }KeyFSMData; typedef struct _KeyFSM KeyFSM; diff --git a/FSM_OOP/usr/keyFSM_private.h b/FSM_OOP/usr/keyFSM_private.h index 2f65fbc..75052ce 100644 --- a/FSM_OOP/usr/keyFSM_private.h +++ b/FSM_OOP/usr/keyFSM_private.h @@ -27,7 +27,8 @@ typedef enum _State Downing, Holding, UpDebouncing, - MultiClickWaiting, + MultiDownWaiting, + MultiDowning, Count_State, } State; @@ -52,6 +53,12 @@ static void actionFcn(during, DownDebouncing)(KeyFSM *pFSM) 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) { @@ -70,11 +77,12 @@ static void actionFcn(exit, Downing)(KeyFSM *pFSM) static void actionFcn(during, UpDebouncing)(KeyFSM *pFSM){ KeyFSMData * data = pFSM->base.data; data->countDelay++; - printf(" during开启消抖 "); + printf(" during松开消抖 "); } + static void actionFcn(during, Holding)(KeyFSM *pFSM){ KeyFSMData * data = pFSM->base.data; data->countDelay++; @@ -87,6 +95,30 @@ static void actionFcn(during, Holding)(KeyFSM *pFSM){ } } +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; +} @@ -98,9 +130,10 @@ typedef enum _Event{ Idle_Event, PhsicalDown, PhsicalUp, - DelayCount5, + DelayCount3, - HoldCount10, + HoldCount2, + MultiDown, Count_Event, }Event; @@ -116,13 +149,21 @@ static State transitionHandler(PhsicalDown)(KeyFSM *pFSM) return DownDebouncing; case UpDebouncing: - if(data->isLastHolding){ - data->isLastHolding = 0; + if(data->countMultiDown){ + return MultiDown; + } + + if(data->lastState == Holding){ + data->lastState = Idle_State; return Holding; } else return Downing; + case MultiDownWaiting: + data->lastState = MultiDownWaiting; + return DownDebouncing; + default: printf("检查状态转移表设计,不应该到这里"); assert(0); @@ -138,13 +179,20 @@ static State transitionHandler(PhsicalUp)(KeyFSM *pFSM) switch (getFSMCurState((FSM_Ptr)pFSM)) { case DownDebouncing: + if(data->countMultiDown){ + return MultiDownWaiting; + } return Waiting; case Downing: return UpDebouncing; case Holding: - data->out = Idle; + data->lastState = Holding; return UpDebouncing; + + case MultiDowning: + return UpDebouncing; + default: printf("检查状态转移表设计,不应该到这里"); assert(0); @@ -152,24 +200,28 @@ static State transitionHandler(PhsicalUp)(KeyFSM *pFSM) } } -static State transitionHandler(DelayCount5)(KeyFSM *pFSM){ - printf(" 延迟计数到5 "); - +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; - data->countDelay = 0; - + printf("按键按下"); return Downing; case UpDebouncing: data->out = Up; - data->countDelay = 0; + data->countMultiDown++; printf("按键松开"); + return MultiDownWaiting; + + case MultiDownWaiting: + data->out = Idle; + data->countMultiDown = 0; return Waiting; default: @@ -179,16 +231,40 @@ static State transitionHandler(DelayCount5)(KeyFSM *pFSM){ } -static State transitionHandler(HoldCount10)(KeyFSM *pFSM){ - printf(" 计数到10进入长按模式 "); +static State transitionHandler(HoldCount2)(KeyFSM *pFSM){ + printf(" 计数到2进入长按模式 "); KeyFSMData * data = pFSM->base.data; data->countDelay = 0; data->out = Hold; - data->isLastHolding = 1; 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; +} + + + /* @@ -201,18 +277,20 @@ const static char *stateStr[] = { "Downing", "Holding", "UpDebouncing", - "MultiClickWaiting", + "MultiDownWaiting", + "MultiDowning", }; const static char *eventStr[] = { "Idle", "PhsicalDown", "PhsicalUp", - "DelayCount5", - "HoldCount10", + "DelayCount3", + "HoldCount2", + "MultiDown", }; static void printFSM(KeyFSM* pFSM){ printf("\tKeyFSM: "); - printf("当前状态:%s, \t\t当前事件:%s, \t\t动作:", stateStr[getFSMCurState((FSM_Ptr)pFSM)], eventStr[getFSMCurEvent((FSM_Ptr)pFSM)]); + 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 b65daea..8bbe41a 100644 --- a/main.c +++ b/main.c @@ -3,27 +3,14 @@ #include "keyFSM.h" #include "FSM_public.h" -<<<<<<< HEAD #define NUM 60 -======= -#define NUM 50 ->>>>>>> isLastHolding没初始化 -// KeyIn testin[NUM] = { -// Up,Up,Up,Up,Up, Up,pDown,pDown,pDown,Up, pDown,pDown,pDown,pDown,pDown, -// pDown,pDown,pDown,Up,Up, pDown,pDown, -// }; KeyIn testin[NUM] = { Up,Up,pDown,pDown,Up, -<<<<<<< HEAD pDown,pDown,pDown,pDown,pDown, pDown,pDown,pDown,pDown,pDown, Up,Up,Up,Up,Up, - pDown,pDown,pDown,pDown,pDown, -======= - pDown,pDown,pDown,pDown,pDown, - pDown,pDown,pDown,Up,Up, ->>>>>>> isLastHolding没初始化 + Up,Up,pDown,pDown,pDown, pDown,pDown,pDown,pDown,pDown, pDown,pDown,pDown,pDown,pDown, pDown,pDown,pDown,pDown,pDown,