From 3fe745f71bd007d38af015348719e670de38ae66 Mon Sep 17 00:00:00 2001 From: godcreator <974980621@qq.com> Date: Wed, 24 Jan 2024 10:20:05 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A28377=E6=B5=8B=E8=AF=95=E5=90=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FSM_OOP/usr/keyFSM.c | 15 ++++++++++++--- FSM_OOP/usr/keyFSM_private.h | 32 +++++++++++++++++++++++++++----- main.c | 6 ++++++ 3 files changed, 45 insertions(+), 8 deletions(-) diff --git a/FSM_OOP/usr/keyFSM.c b/FSM_OOP/usr/keyFSM.c index b4af347..476fe9e 100644 --- a/FSM_OOP/usr/keyFSM.c +++ b/FSM_OOP/usr/keyFSM.c @@ -10,14 +10,17 @@ */ static Event selectEvent(KeyFSMData *data){ // 必须重新实现 - if(data->countDelay == 2){ - return HoldCount2; + if(data->countDelay == 4){ + return HoldCount4; } if(data->countDelay == 3){ if(data->countMultiDown && data->lastState == MultiDownWaiting){ return MultiDown; } + if(data->lastState == Holding){ + return UpDebouncing2Waiting; + } return DelayCount3; } @@ -25,6 +28,9 @@ static Event selectEvent(KeyFSMData *data){ // 必须重新实现 return PhsicalUp; } else{ + if(data->lastState == Holding){ + return UpDebouncing2Holding; + } return PhsicalDown; } } @@ -60,6 +66,7 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现 fcns->exitActionTable[Downing] = (Avoid_WARNING_void_FSM)actionFcn(exit, Downing); fcns->duringActionTable[UpDebouncing] = (Avoid_WARNING_void_FSM)actionFcn(during, UpDebouncing); + fcns->exitActionTable[UpDebouncing] = (Avoid_WARNING_void_FSM)actionFcn(exit, UpDebouncing); fcns->duringActionTable[Holding] = (Avoid_WARNING_void_FSM)actionFcn(during, Holding); fcns->exitActionTable[Holding] = (Avoid_WARNING_void_FSM)actionFcn(exit, Holding); @@ -77,10 +84,12 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现 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, HoldCount2)] = (Avoid_WARNING_int_FSM)transitionHandler(HoldCount2); + fcns->transitionTable[index(Downing, HoldCount4)] = (Avoid_WARNING_int_FSM)transitionHandler(HoldCount4); fcns->transitionTable[index(UpDebouncing, PhsicalDown)] = (Avoid_WARNING_int_FSM)transitionHandler(PhsicalDown); fcns->transitionTable[index(UpDebouncing, DelayCount3)] = (Avoid_WARNING_int_FSM)transitionHandler(DelayCount3); + fcns->transitionTable[index(UpDebouncing, UpDebouncing2Holding)] = (Avoid_WARNING_int_FSM)transitionHandler(UpDebouncing2Holding); + fcns->transitionTable[index(UpDebouncing, UpDebouncing2Waiting)] = (Avoid_WARNING_int_FSM)transitionHandler(UpDebouncing2Waiting); fcns->transitionTable[index(Holding, PhsicalUp)] = (Avoid_WARNING_int_FSM)transitionHandler(PhsicalUp); diff --git a/FSM_OOP/usr/keyFSM_private.h b/FSM_OOP/usr/keyFSM_private.h index 75052ce..269b343 100644 --- a/FSM_OOP/usr/keyFSM_private.h +++ b/FSM_OOP/usr/keyFSM_private.h @@ -79,6 +79,10 @@ static void actionFcn(during, UpDebouncing)(KeyFSM *pFSM){ data->countDelay++; printf(" during松开消抖 "); } +static void actionFcn(exit, UpDebouncing)(KeyFSM *pFSM){ + KeyFSMData * data = pFSM->base.data; + data->lastState = Idle_State; +} @@ -132,8 +136,10 @@ typedef enum _Event{ PhsicalUp, DelayCount3, - HoldCount2, + HoldCount4, MultiDown, + UpDebouncing2Holding, + UpDebouncing2Waiting, Count_Event, }Event; @@ -150,7 +156,7 @@ static State transitionHandler(PhsicalDown)(KeyFSM *pFSM) case UpDebouncing: if(data->countMultiDown){ - return MultiDown; + return MultiDowning; } if(data->lastState == Holding){ @@ -231,7 +237,7 @@ static State transitionHandler(DelayCount3)(KeyFSM *pFSM){ } -static State transitionHandler(HoldCount2)(KeyFSM *pFSM){ +static State transitionHandler(HoldCount4)(KeyFSM *pFSM){ printf(" 计数到2进入长按模式 "); KeyFSMData * data = pFSM->base.data; data->countDelay = 0; @@ -240,6 +246,7 @@ static State transitionHandler(HoldCount2)(KeyFSM *pFSM){ } + static State transitionHandler(MultiDown)(KeyFSM *pFSM){ printf(" 多击 "); KeyFSMData * data = pFSM->base.data; @@ -263,8 +270,21 @@ static State transitionHandler(MultiDown)(KeyFSM *pFSM){ 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; +} /* @@ -285,8 +305,10 @@ const static char *eventStr[] = { "PhsicalDown", "PhsicalUp", "DelayCount3", - "HoldCount2", + "HoldCount4", "MultiDown", + "UpDebouncing2Holding", + "UpDebouncing2Waiting" }; static void printFSM(KeyFSM* pFSM){ printf("\tKeyFSM: "); diff --git a/main.c b/main.c index 8bbe41a..b00d27e 100644 --- a/main.c +++ b/main.c @@ -5,6 +5,7 @@ #define NUM 60 + KeyIn testin[NUM] = { Up,Up,pDown,pDown,Up, pDown,pDown,pDown,pDown,pDown, @@ -31,6 +32,11 @@ int main(){ setEvent((FSM_Ptr)keyFSM); vptrFSM((FSM_Ptr)keyFSM)->step((FSM_Ptr)keyFSM); + if(data->out){ + printf("\t\t\t\t%d", data->out); + } + + printf("\n"); }