再多划分一个多击的按下消抖状态
This commit is contained in:
parent
b1b74605b8
commit
035e403da5
|
@ -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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)]);
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue