再多划分一个多击的按下消抖状态

This commit is contained in:
godcreator 2024-01-29 14:04:24 +08:00
parent b1b74605b8
commit 035e403da5
3 changed files with 81 additions and 47 deletions

View File

@ -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);
}
/*

View File

@ -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;

View File

@ -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)]);
}