From 035e403da5fc9667a6ba7f68a87228a3dba3f873 Mon Sep 17 00:00:00 2001 From: godcreator <974980621@qq.com> Date: Mon, 29 Jan 2024 14:04:24 +0800 Subject: [PATCH] =?UTF-8?q?=E5=86=8D=E5=A4=9A=E5=88=92=E5=88=86=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E5=A4=9A=E5=87=BB=E7=9A=84=E6=8C=89=E4=B8=8B=E6=B6=88?= =?UTF-8?q?=E6=8A=96=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FSM_OOP/usr/keyFSM.c | 11 +++- FSM_OOP/usr/keyFSM.h | 11 ++++ FSM_OOP/usr/keyFSM_private.h | 106 ++++++++++++++++++++--------------- 3 files changed, 81 insertions(+), 47 deletions(-) diff --git a/FSM_OOP/usr/keyFSM.c b/FSM_OOP/usr/keyFSM.c index 4a4a4e4..adf2053 100644 --- a/FSM_OOP/usr/keyFSM.c +++ b/FSM_OOP/usr/keyFSM.c @@ -46,18 +46,23 @@ static void initData(KeyFSM *pFSM){ // 必须重新实现 } static void setupHandler(FSMHandler* fcns){ // 必须重新实现 - addStateActionFcn(during, Waiting); - addStateActionFcn(exit, Waiting); + addStateActionFcn(enter, Waiting); addStateActionFcn(during, DownDebouncing); + addStateActionFcn(exit, DownDebouncing); addStateActionFcn(during, Downing); addStateActionFcn(exit, Downing); addStateActionFcn(during, UpDebouncing); + addStateActionFcn(exit, UpDebouncing); addStateActionFcn(during, Holding); addStateActionFcn(exit, Holding); addStateActionFcn(during, MultiDownWaiting); + addStateActionFcn(exit, MultiDownWaiting); addStateActionFcn(during, MultiDowning); addStateActionFcn(exit, MultiDowning); addStateActionFcn(during, HoldUpDebouncing); + addStateActionFcn(exit, HoldUpDebouncing); + addStateActionFcn(during, MultiDownDebouncing); + addStateActionFcn(exit, MultiDownDebouncing); addTransitionHandler(Waiting, PhsicalDown); @@ -73,6 +78,8 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现 addTransitionHandler(MultiDowning, PhsicalUp); addTransitionHandler(HoldUpDebouncing, PhsicalDown); addTransitionHandler(HoldUpDebouncing, DelayCount3); + addTransitionHandler(MultiDownDebouncing, DelayCount3); + addTransitionHandler(MultiDownDebouncing, PhsicalUp); } /* diff --git a/FSM_OOP/usr/keyFSM.h b/FSM_OOP/usr/keyFSM.h index 98fb596..022df66 100644 --- a/FSM_OOP/usr/keyFSM.h +++ b/FSM_OOP/usr/keyFSM.h @@ -2,6 +2,8 @@ #define __KEY_FSM_H_ + + typedef enum _keyIn{ Up, pDown, @@ -16,6 +18,15 @@ typedef enum _keyOutSignal{ Down_3times, }KeyOutSignal; +const static char *keyStr[] = +{ + "Idle", + "Down", + "Hold", + "Down_2times", + "Down_3times", +}; + typedef struct _keyFSMData { int countDelay; diff --git a/FSM_OOP/usr/keyFSM_private.h b/FSM_OOP/usr/keyFSM_private.h index 5594fb9..1791681 100644 --- a/FSM_OOP/usr/keyFSM_private.h +++ b/FSM_OOP/usr/keyFSM_private.h @@ -30,21 +30,19 @@ typedef enum _State MultiDownWaiting, MultiDowning, HoldUpDebouncing, + MultiDownDebouncing, Count_State, } State; #define DEFAULT_STATE Waiting -static void actionFcn(during, Waiting)(KeyFSM *pFSM){ +static void actionFcn(enter, Waiting)(KeyFSM *pFSM){ KeyFSMData * data = pFSM->base.data; data->out = Idle; + data->countDelay = 0; + data->countMultiDown = 0; } -static void actionFcn(exit, Waiting)(KeyFSM *pFSM){ - KeyFSMData * data = pFSM->base.data; - data->out = Idle; -} - static void actionFcn(during, DownDebouncing)(KeyFSM *pFSM) @@ -53,6 +51,11 @@ static void actionFcn(during, DownDebouncing)(KeyFSM *pFSM) data->countDelay++; FSM_LOG(" during开启消抖 "); } +static void actionFcn(exit, DownDebouncing)(KeyFSM *pFSM) +{ + KeyFSMData * data = pFSM->base.data; + data->countDelay = 0; +} @@ -65,6 +68,7 @@ static void actionFcn(during, Downing)(KeyFSM *pFSM) static void actionFcn(exit, Downing)(KeyFSM *pFSM) { KeyFSMData * data = pFSM->base.data; + data->countDelay = 0; data->out = Idle; } @@ -75,6 +79,10 @@ static void actionFcn(during, UpDebouncing)(KeyFSM *pFSM){ data->countDelay++; FSM_LOG(" during松开消抖 "); } +static void actionFcn(exit, UpDebouncing)(KeyFSM *pFSM){ + KeyFSMData * data = pFSM->base.data; + data->countDelay = 0; +} static void actionFcn(during, Holding)(KeyFSM *pFSM){ @@ -91,6 +99,7 @@ static void actionFcn(during, Holding)(KeyFSM *pFSM){ static void actionFcn(exit, Holding)(KeyFSM *pFSM){ KeyFSMData * data = pFSM->base.data; + data->countDelay = 0; data->out = Idle; } @@ -101,6 +110,10 @@ static void actionFcn(during, MultiDownWaiting)(KeyFSM *pFSM){ data->countDelay++; FSM_LOG(" during多击等待 "); } +static void actionFcn(exit, MultiDownWaiting)(KeyFSM *pFSM){ + KeyFSMData * data = pFSM->base.data; + data->countDelay = 0; +} static void actionFcn(during, MultiDowning)(KeyFSM *pFSM) @@ -119,6 +132,22 @@ static void actionFcn(during, HoldUpDebouncing)(KeyFSM *pFSM) KeyFSMData * data = pFSM->base.data; data->countDelay++; } +static void actionFcn(exit, HoldUpDebouncing)(KeyFSM *pFSM) +{ + KeyFSMData * data = pFSM->base.data; + data->countDelay = 0; +} + +static void actionFcn(during, MultiDownDebouncing)(KeyFSM *pFSM) +{ + KeyFSMData * data = pFSM->base.data; + data->countDelay++; +} +static void actionFcn(exit, MultiDownDebouncing)(KeyFSM *pFSM) +{ + KeyFSMData * data = pFSM->base.data; + data->countDelay = 0; +} @@ -131,7 +160,6 @@ typedef enum _Event{ PhsicalDown, PhsicalUp, DelayCount3, - HoldCount4, Count_Event, @@ -141,8 +169,7 @@ static State transitionHandler(PhsicalDown)(KeyFSM *pFSM) { FSM_LOG(" 物理按键按下 "); KeyFSMData * data = pFSM->base.data; - data->countDelay = 0; - switch (getFSMCurState((FSM_Ptr)pFSM)) + switch (pFSM->base.privateVars.curState) { case Waiting: return DownDebouncing; @@ -157,7 +184,7 @@ static State transitionHandler(PhsicalDown)(KeyFSM *pFSM) return Holding; case MultiDownWaiting: - return DownDebouncing; + return MultiDownDebouncing; default: @@ -171,8 +198,7 @@ static State transitionHandler(PhsicalUp)(KeyFSM *pFSM) { FSM_LOG(" 物理按键松开 "); KeyFSMData * data = pFSM->base.data; - data->countDelay = 0; - switch (getFSMCurState((FSM_Ptr)pFSM)) + switch (pFSM->base.privateVars.curState) { case DownDebouncing: if(data->countMultiDown){ @@ -198,12 +224,11 @@ static State transitionHandler(PhsicalUp)(KeyFSM *pFSM) static State transitionHandler(DelayCount3)(KeyFSM *pFSM){ FSM_LOG(" 延迟计数到3 "); KeyFSMData * data = pFSM->base.data; - data->countDelay = 0; - switch (getFSMCurState((FSM_Ptr)pFSM)) + + switch (pFSM->base.privateVars.curState) { case DownDebouncing: data->out = Down; - FSM_LOG("按键按下"); return Downing; @@ -215,13 +240,28 @@ static State transitionHandler(DelayCount3)(KeyFSM *pFSM){ return MultiDownWaiting; case MultiDownWaiting: - data->out = Idle; - data->countMultiDown = 0; return Waiting; case HoldUpDebouncing: return Waiting; + case MultiDownDebouncing: + switch (data->countMultiDown + 1) + { + case 2: + data->out = Down_2times; + break; + case 3: + data->out = Down_3times; + break; + + default: + printf("reach MultiDown Limit!\n"); + break; + } + FSM_LOG(" 多击%d ", data->countMultiDown+1); + return MultiDowning; + default: FSM_LOG("检查状态转移表设计,不应该到这里"); assert(0); @@ -232,38 +272,12 @@ static State transitionHandler(DelayCount3)(KeyFSM *pFSM){ static State transitionHandler(HoldCount4)(KeyFSM *pFSM){ FSM_LOG(" 计数到2进入长按模式 "); KeyFSMData * data = pFSM->base.data; - data->countDelay = 0; data->out = Hold; return Holding; } -static State transitionHandler(MultiDown)(KeyFSM *pFSM){ - FSM_LOG(" 多击 "); - 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: - FSM_LOG(" 到达多击次数上限了 "); - break; - } - - FSM_LOG(" 多击%d ", data->countMultiDown+1); - return MultiDowning; -} - - - /* 用户自定义事件选择逻辑—————————————————begin @@ -278,6 +292,7 @@ const static char *stateStr[] = { "MultiDownWaiting", "MultiDowning", "HoldUpDebouncing", + "MultiDownDebouncing", }; const static char *eventStr[] = { "Idle", @@ -287,8 +302,9 @@ const static char *eventStr[] = { "HoldCount4", }; static void printFSM(KeyFSM* pFSM){ - FSM_LOG("\tKeyFSM: "); - FSM_LOG("当前状态:%s, \t\t当前事件:%s, \t\t转移:", stateStr[getFSMCurState((FSM_Ptr)pFSM)], eventStr[getFSMCurEvent((FSM_Ptr)pFSM)]); + KeyFSMData * data = pFSM->base.data; + FSM_LOG("KeyFSM: "); + FSM_LOG("%d, 当前状态:%s, \t当前事件:%s \t转移:", data->countDelay, stateStr[getFSMCurState((FSM_Ptr)pFSM)], eventStr[getFSMCurEvent((FSM_Ptr)pFSM)]); }