diff --git a/FSM_OOP/usr/keyFSM.c b/FSM_OOP/usr/keyFSM.c index a306ec0..1529f94 100644 --- a/FSM_OOP/usr/keyFSM.c +++ b/FSM_OOP/usr/keyFSM.c @@ -10,6 +10,10 @@ */ static Event selectEvent(KeyFSMData *data){ // 必须重新实现 + if(data->countDelay == 10){ + return HoldCount10; + } + if(data->countDelay == 5){ return DelayCount5; } @@ -24,6 +28,10 @@ static Event selectEvent(KeyFSMData *data){ // 必须重新实现 static void step(KeyFSM* pFSM){ printFSM(pFSM); stepBaseFSM(BASE_FSM(pFSM)); + + KeyFSMData * data = pFSM->base.data; + + printf(" 信号:%d", data->out); } static void initData(KeyFSM *pFSM){ // 必须重新实现 @@ -47,13 +55,21 @@ 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->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(Downing, HoldCount10)] = (Avoid_WARNING_int_FSM)transitionHandler(HoldCount10); + 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(Holding, PhsicalUp)] = (Avoid_WARNING_int_FSM)transitionHandler(PhsicalUp); } /* diff --git a/FSM_OOP/usr/keyFSM.h b/FSM_OOP/usr/keyFSM.h index 98fb596..16ac470 100644 --- a/FSM_OOP/usr/keyFSM.h +++ b/FSM_OOP/usr/keyFSM.h @@ -22,6 +22,7 @@ typedef struct _keyFSMData int countMultiDown; KeyIn in; KeyOutSignal out; + int isLastHolding; }KeyFSMData; typedef struct _KeyFSM KeyFSM; diff --git a/FSM_OOP/usr/keyFSM_private.h b/FSM_OOP/usr/keyFSM_private.h index 33edc8c..1d1c229 100644 --- a/FSM_OOP/usr/keyFSM_private.h +++ b/FSM_OOP/usr/keyFSM_private.h @@ -75,6 +75,20 @@ static void actionFcn(during, UpDebouncing)(KeyFSM *pFSM){ +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; + } +} + + + /* 事件和对应的转移函数 @@ -86,6 +100,8 @@ typedef enum _Event{ PhsicalUp, DelayCount5, + HoldCount10, + Count_Event, }Event; @@ -98,14 +114,19 @@ static State transitionHandler(PhsicalDown)(KeyFSM *pFSM) { case Waiting: return DownDebouncing; - break; + case UpDebouncing: - return Downing; - break; + if(data->isLastHolding){ + data->isLastHolding = 0; + return Holding; + } + else + return Downing; + default: printf("检查状态转移表设计,不应该到这里"); assert(0); - break; + } } @@ -121,7 +142,9 @@ static State transitionHandler(PhsicalUp)(KeyFSM *pFSM) case Downing: return UpDebouncing; - + case Holding: + data->out = Idle; + return UpDebouncing; default: printf("检查状态转移表设计,不应该到这里"); assert(0); @@ -156,6 +179,16 @@ static State transitionHandler(DelayCount5)(KeyFSM *pFSM){ } +static State transitionHandler(HoldCount10)(KeyFSM *pFSM){ + printf(" 计数到10进入长按模式 "); + KeyFSMData * data = pFSM->base.data; + data->countDelay = 0; + data->out = Hold; + data->isLastHolding = 1; + return Holding; +} + + /* diff --git a/main.c b/main.c index b163f59..8c0a806 100644 --- a/main.c +++ b/main.c @@ -3,10 +3,20 @@ #include "keyFSM.h" #include "FSM_public.h" -#define NUM 35 +#define NUM 40 +// 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,Up,Up,Up, Up,pDown,pDown,pDown,Up, pDown,pDown,pDown,pDown,pDown, - pDown,pDown,pDown,Up,Up, pDown,pDown, + Up,Up,pDown,pDown,Up, + pDown,pDown,pDown,pDown,pDown, + pDown,pDown,pDown,pDown,pDown, + pDown,pDown,pDown,pDown,pDown, + pDown,pDown,pDown,pDown,pDown, + pDown,pDown,pDown,Up,Up, + pDown,pDown,pDown,pDown };