再多划分一个多击的按下消抖状态
This commit is contained in:
parent
b1b74605b8
commit
035e403da5
|
@ -46,18 +46,23 @@ static void initData(KeyFSM *pFSM){ // 必须重新实现
|
||||||
}
|
}
|
||||||
|
|
||||||
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
||||||
addStateActionFcn(during, Waiting);
|
addStateActionFcn(enter, Waiting);
|
||||||
addStateActionFcn(exit, Waiting);
|
|
||||||
addStateActionFcn(during, DownDebouncing);
|
addStateActionFcn(during, DownDebouncing);
|
||||||
|
addStateActionFcn(exit, DownDebouncing);
|
||||||
addStateActionFcn(during, Downing);
|
addStateActionFcn(during, Downing);
|
||||||
addStateActionFcn(exit, Downing);
|
addStateActionFcn(exit, Downing);
|
||||||
addStateActionFcn(during, UpDebouncing);
|
addStateActionFcn(during, UpDebouncing);
|
||||||
|
addStateActionFcn(exit, UpDebouncing);
|
||||||
addStateActionFcn(during, Holding);
|
addStateActionFcn(during, Holding);
|
||||||
addStateActionFcn(exit, Holding);
|
addStateActionFcn(exit, Holding);
|
||||||
addStateActionFcn(during, MultiDownWaiting);
|
addStateActionFcn(during, MultiDownWaiting);
|
||||||
|
addStateActionFcn(exit, MultiDownWaiting);
|
||||||
addStateActionFcn(during, MultiDowning);
|
addStateActionFcn(during, MultiDowning);
|
||||||
addStateActionFcn(exit, MultiDowning);
|
addStateActionFcn(exit, MultiDowning);
|
||||||
addStateActionFcn(during, HoldUpDebouncing);
|
addStateActionFcn(during, HoldUpDebouncing);
|
||||||
|
addStateActionFcn(exit, HoldUpDebouncing);
|
||||||
|
addStateActionFcn(during, MultiDownDebouncing);
|
||||||
|
addStateActionFcn(exit, MultiDownDebouncing);
|
||||||
|
|
||||||
|
|
||||||
addTransitionHandler(Waiting, PhsicalDown);
|
addTransitionHandler(Waiting, PhsicalDown);
|
||||||
|
@ -73,6 +78,8 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
||||||
addTransitionHandler(MultiDowning, PhsicalUp);
|
addTransitionHandler(MultiDowning, PhsicalUp);
|
||||||
addTransitionHandler(HoldUpDebouncing, PhsicalDown);
|
addTransitionHandler(HoldUpDebouncing, PhsicalDown);
|
||||||
addTransitionHandler(HoldUpDebouncing, DelayCount3);
|
addTransitionHandler(HoldUpDebouncing, DelayCount3);
|
||||||
|
addTransitionHandler(MultiDownDebouncing, DelayCount3);
|
||||||
|
addTransitionHandler(MultiDownDebouncing, PhsicalUp);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
#define __KEY_FSM_H_
|
#define __KEY_FSM_H_
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
typedef enum _keyIn{
|
typedef enum _keyIn{
|
||||||
Up,
|
Up,
|
||||||
pDown,
|
pDown,
|
||||||
|
@ -16,6 +18,15 @@ typedef enum _keyOutSignal{
|
||||||
Down_3times,
|
Down_3times,
|
||||||
}KeyOutSignal;
|
}KeyOutSignal;
|
||||||
|
|
||||||
|
const static char *keyStr[] =
|
||||||
|
{
|
||||||
|
"Idle",
|
||||||
|
"Down",
|
||||||
|
"Hold",
|
||||||
|
"Down_2times",
|
||||||
|
"Down_3times",
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct _keyFSMData
|
typedef struct _keyFSMData
|
||||||
{
|
{
|
||||||
int countDelay;
|
int countDelay;
|
||||||
|
|
|
@ -30,21 +30,19 @@ typedef enum _State
|
||||||
MultiDownWaiting,
|
MultiDownWaiting,
|
||||||
MultiDowning,
|
MultiDowning,
|
||||||
HoldUpDebouncing,
|
HoldUpDebouncing,
|
||||||
|
MultiDownDebouncing,
|
||||||
|
|
||||||
Count_State,
|
Count_State,
|
||||||
} State;
|
} State;
|
||||||
#define DEFAULT_STATE Waiting
|
#define DEFAULT_STATE Waiting
|
||||||
|
|
||||||
|
|
||||||
static void actionFcn(during, Waiting)(KeyFSM *pFSM){
|
static void actionFcn(enter, Waiting)(KeyFSM *pFSM){
|
||||||
KeyFSMData * data = pFSM->base.data;
|
KeyFSMData * data = pFSM->base.data;
|
||||||
data->out = Idle;
|
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)
|
static void actionFcn(during, DownDebouncing)(KeyFSM *pFSM)
|
||||||
|
@ -53,6 +51,11 @@ static void actionFcn(during, DownDebouncing)(KeyFSM *pFSM)
|
||||||
data->countDelay++;
|
data->countDelay++;
|
||||||
FSM_LOG(" during开启消抖 ");
|
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)
|
static void actionFcn(exit, Downing)(KeyFSM *pFSM)
|
||||||
{
|
{
|
||||||
KeyFSMData * data = pFSM->base.data;
|
KeyFSMData * data = pFSM->base.data;
|
||||||
|
data->countDelay = 0;
|
||||||
data->out = Idle;
|
data->out = Idle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -75,6 +79,10 @@ static void actionFcn(during, UpDebouncing)(KeyFSM *pFSM){
|
||||||
data->countDelay++;
|
data->countDelay++;
|
||||||
FSM_LOG(" during松开消抖 ");
|
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){
|
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){
|
static void actionFcn(exit, Holding)(KeyFSM *pFSM){
|
||||||
KeyFSMData * data = pFSM->base.data;
|
KeyFSMData * data = pFSM->base.data;
|
||||||
|
data->countDelay = 0;
|
||||||
data->out = Idle;
|
data->out = Idle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -101,6 +110,10 @@ static void actionFcn(during, MultiDownWaiting)(KeyFSM *pFSM){
|
||||||
data->countDelay++;
|
data->countDelay++;
|
||||||
FSM_LOG(" during多击等待 ");
|
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)
|
static void actionFcn(during, MultiDowning)(KeyFSM *pFSM)
|
||||||
|
@ -119,6 +132,22 @@ static void actionFcn(during, HoldUpDebouncing)(KeyFSM *pFSM)
|
||||||
KeyFSMData * data = pFSM->base.data;
|
KeyFSMData * data = pFSM->base.data;
|
||||||
data->countDelay++;
|
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,
|
PhsicalDown,
|
||||||
PhsicalUp,
|
PhsicalUp,
|
||||||
DelayCount3,
|
DelayCount3,
|
||||||
|
|
||||||
HoldCount4,
|
HoldCount4,
|
||||||
|
|
||||||
Count_Event,
|
Count_Event,
|
||||||
|
@ -141,8 +169,7 @@ static State transitionHandler(PhsicalDown)(KeyFSM *pFSM)
|
||||||
{
|
{
|
||||||
FSM_LOG(" 物理按键按下 ");
|
FSM_LOG(" 物理按键按下 ");
|
||||||
KeyFSMData * data = pFSM->base.data;
|
KeyFSMData * data = pFSM->base.data;
|
||||||
data->countDelay = 0;
|
switch (pFSM->base.privateVars.curState)
|
||||||
switch (getFSMCurState((FSM_Ptr)pFSM))
|
|
||||||
{
|
{
|
||||||
case Waiting:
|
case Waiting:
|
||||||
return DownDebouncing;
|
return DownDebouncing;
|
||||||
|
@ -157,7 +184,7 @@ static State transitionHandler(PhsicalDown)(KeyFSM *pFSM)
|
||||||
return Holding;
|
return Holding;
|
||||||
|
|
||||||
case MultiDownWaiting:
|
case MultiDownWaiting:
|
||||||
return DownDebouncing;
|
return MultiDownDebouncing;
|
||||||
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -171,8 +198,7 @@ static State transitionHandler(PhsicalUp)(KeyFSM *pFSM)
|
||||||
{
|
{
|
||||||
FSM_LOG(" 物理按键松开 ");
|
FSM_LOG(" 物理按键松开 ");
|
||||||
KeyFSMData * data = pFSM->base.data;
|
KeyFSMData * data = pFSM->base.data;
|
||||||
data->countDelay = 0;
|
switch (pFSM->base.privateVars.curState)
|
||||||
switch (getFSMCurState((FSM_Ptr)pFSM))
|
|
||||||
{
|
{
|
||||||
case DownDebouncing:
|
case DownDebouncing:
|
||||||
if(data->countMultiDown){
|
if(data->countMultiDown){
|
||||||
|
@ -198,12 +224,11 @@ static State transitionHandler(PhsicalUp)(KeyFSM *pFSM)
|
||||||
static State transitionHandler(DelayCount3)(KeyFSM *pFSM){
|
static State transitionHandler(DelayCount3)(KeyFSM *pFSM){
|
||||||
FSM_LOG(" 延迟计数到3 ");
|
FSM_LOG(" 延迟计数到3 ");
|
||||||
KeyFSMData * data = pFSM->base.data;
|
KeyFSMData * data = pFSM->base.data;
|
||||||
data->countDelay = 0;
|
|
||||||
switch (getFSMCurState((FSM_Ptr)pFSM))
|
switch (pFSM->base.privateVars.curState)
|
||||||
{
|
{
|
||||||
case DownDebouncing:
|
case DownDebouncing:
|
||||||
data->out = Down;
|
data->out = Down;
|
||||||
|
|
||||||
FSM_LOG("按键按下");
|
FSM_LOG("按键按下");
|
||||||
return Downing;
|
return Downing;
|
||||||
|
|
||||||
|
@ -215,13 +240,28 @@ static State transitionHandler(DelayCount3)(KeyFSM *pFSM){
|
||||||
return MultiDownWaiting;
|
return MultiDownWaiting;
|
||||||
|
|
||||||
case MultiDownWaiting:
|
case MultiDownWaiting:
|
||||||
data->out = Idle;
|
|
||||||
data->countMultiDown = 0;
|
|
||||||
return Waiting;
|
return Waiting;
|
||||||
|
|
||||||
case HoldUpDebouncing:
|
case HoldUpDebouncing:
|
||||||
return Waiting;
|
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:
|
default:
|
||||||
FSM_LOG("检查状态转移表设计,不应该到这里");
|
FSM_LOG("检查状态转移表设计,不应该到这里");
|
||||||
assert(0);
|
assert(0);
|
||||||
|
@ -232,38 +272,12 @@ static State transitionHandler(DelayCount3)(KeyFSM *pFSM){
|
||||||
static State transitionHandler(HoldCount4)(KeyFSM *pFSM){
|
static State transitionHandler(HoldCount4)(KeyFSM *pFSM){
|
||||||
FSM_LOG(" 计数到2进入长按模式 ");
|
FSM_LOG(" 计数到2进入长按模式 ");
|
||||||
KeyFSMData * data = pFSM->base.data;
|
KeyFSMData * data = pFSM->base.data;
|
||||||
data->countDelay = 0;
|
|
||||||
data->out = Hold;
|
data->out = Hold;
|
||||||
return Holding;
|
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
|
用户自定义事件选择逻辑—————————————————begin
|
||||||
|
@ -278,6 +292,7 @@ const static char *stateStr[] = {
|
||||||
"MultiDownWaiting",
|
"MultiDownWaiting",
|
||||||
"MultiDowning",
|
"MultiDowning",
|
||||||
"HoldUpDebouncing",
|
"HoldUpDebouncing",
|
||||||
|
"MultiDownDebouncing",
|
||||||
};
|
};
|
||||||
const static char *eventStr[] = {
|
const static char *eventStr[] = {
|
||||||
"Idle",
|
"Idle",
|
||||||
|
@ -287,8 +302,9 @@ const static char *eventStr[] = {
|
||||||
"HoldCount4",
|
"HoldCount4",
|
||||||
};
|
};
|
||||||
static void printFSM(KeyFSM* pFSM){
|
static void printFSM(KeyFSM* pFSM){
|
||||||
FSM_LOG("\tKeyFSM: ");
|
KeyFSMData * data = pFSM->base.data;
|
||||||
FSM_LOG("当前状态:%s, \t\t当前事件:%s, \t\t转移:", stateStr[getFSMCurState((FSM_Ptr)pFSM)], eventStr[getFSMCurEvent((FSM_Ptr)pFSM)]);
|
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