Merge branch 'release/28377测试ok'

This commit is contained in:
godcreator 2024-01-24 23:19:18 +08:00
commit 5133e86de1
4 changed files with 168 additions and 38 deletions

View File

@ -10,17 +10,27 @@
*/ */
static Event selectEvent(KeyFSMData *data){ // 必须重新实现 static Event selectEvent(KeyFSMData *data){ // 必须重新实现
if(data->countDelay == 10){ if(data->countDelay == 4){
return HoldCount10; return HoldCount4;
} }
if(data->countDelay == 5){ if(data->countDelay == 3){
return DelayCount5; if(data->countMultiDown && data->lastState == MultiDownWaiting){
return MultiDown;
}
if(data->lastState == Holding){
return UpDebouncing2Waiting;
}
return DelayCount3;
} }
if(data->in == Up){ if(data->in == Up){
return PhsicalUp; return PhsicalUp;
} }
else{ else{
if(data->lastState == Holding){
return UpDebouncing2Holding;
}
return PhsicalDown; return PhsicalDown;
} }
} }
@ -31,7 +41,7 @@ static void step(KeyFSM* pFSM){
KeyFSMData * data = pFSM->base.data; KeyFSMData * data = pFSM->base.data;
printf(" 信号:%d", data->out); printf("\t信号:%d, 计数%d, 上次状态%s", data->out, data->countDelay, stateStr[data->lastState]);
} }
static void initData(KeyFSM *pFSM){ // 必须重新实现 static void initData(KeyFSM *pFSM){ // 必须重新实现
@ -40,7 +50,7 @@ static void initData(KeyFSM *pFSM){ // 必须重新实现
data->countMultiDown = 0; data->countMultiDown = 0;
data->in = Up; data->in = Up;
data->out = Idle; data->out = Idle;
data->isLastHolding = 0; data->lastState = 0;
pFSM->base.data = data; pFSM->base.data = data;
} }
@ -50,27 +60,44 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现
fcns->exitActionTable[Waiting] = (Avoid_WARNING_void_FSM)actionFcn(exit, Waiting); fcns->exitActionTable[Waiting] = (Avoid_WARNING_void_FSM)actionFcn(exit, Waiting);
fcns->duringActionTable[DownDebouncing] = (Avoid_WARNING_void_FSM)actionFcn(during, DownDebouncing); fcns->duringActionTable[DownDebouncing] = (Avoid_WARNING_void_FSM)actionFcn(during, DownDebouncing);
fcns->exitActionTable[DownDebouncing] = (Avoid_WARNING_void_FSM)actionFcn(exit, DownDebouncing);
fcns->duringActionTable[Downing] = (Avoid_WARNING_void_FSM)actionFcn(during, Downing); fcns->duringActionTable[Downing] = (Avoid_WARNING_void_FSM)actionFcn(during, Downing);
fcns->exitActionTable[Downing] = (Avoid_WARNING_void_FSM)actionFcn(exit, Downing); fcns->exitActionTable[Downing] = (Avoid_WARNING_void_FSM)actionFcn(exit, Downing);
fcns->duringActionTable[UpDebouncing] = (Avoid_WARNING_void_FSM)actionFcn(during, UpDebouncing); 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->duringActionTable[Holding] = (Avoid_WARNING_void_FSM)actionFcn(during, Holding);
fcns->exitActionTable[Holding] = (Avoid_WARNING_void_FSM)actionFcn(exit, Holding);
fcns->duringActionTable[MultiDownWaiting] = (Avoid_WARNING_void_FSM)actionFcn(during, MultiDownWaiting);
fcns->duringActionTable[MultiDowning] = (Avoid_WARNING_void_FSM)actionFcn(during, MultiDowning);
fcns->exitActionTable[MultiDowning] = (Avoid_WARNING_void_FSM)actionFcn(during, MultiDowning);
fcns->transitionTable[index(Waiting, PhsicalDown)] = (Avoid_WARNING_int_FSM)transitionHandler(PhsicalDown); 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, PhsicalUp)] = (Avoid_WARNING_int_FSM)transitionHandler(PhsicalUp);
fcns->transitionTable[index(DownDebouncing, DelayCount5)] = (Avoid_WARNING_int_FSM)transitionHandler(DelayCount5); fcns->transitionTable[index(DownDebouncing, DelayCount3)] = (Avoid_WARNING_int_FSM)transitionHandler(DelayCount3);
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, PhsicalUp)] = (Avoid_WARNING_int_FSM)transitionHandler(PhsicalUp);
fcns->transitionTable[index(Downing, HoldCount10)] = (Avoid_WARNING_int_FSM)transitionHandler(HoldCount10); 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, PhsicalDown)] = (Avoid_WARNING_int_FSM)transitionHandler(PhsicalDown);
fcns->transitionTable[index(UpDebouncing, DelayCount5)] = (Avoid_WARNING_int_FSM)transitionHandler(DelayCount5); 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); fcns->transitionTable[index(Holding, PhsicalUp)] = (Avoid_WARNING_int_FSM)transitionHandler(PhsicalUp);
fcns->transitionTable[index(MultiDownWaiting, PhsicalDown)] = (Avoid_WARNING_int_FSM)transitionHandler(PhsicalDown);
fcns->transitionTable[index(MultiDownWaiting, DelayCount3)] = (Avoid_WARNING_int_FSM)transitionHandler(DelayCount3);
fcns->transitionTable[index(MultiDowning, PhsicalUp)] = (Avoid_WARNING_int_FSM)transitionHandler(PhsicalUp);
} }
/* /*

View File

@ -22,7 +22,7 @@ typedef struct _keyFSMData
int countMultiDown; int countMultiDown;
KeyIn in; KeyIn in;
KeyOutSignal out; KeyOutSignal out;
int isLastHolding; int lastState;
}KeyFSMData; }KeyFSMData;
typedef struct _KeyFSM KeyFSM; typedef struct _KeyFSM KeyFSM;

View File

@ -27,7 +27,8 @@ typedef enum _State
Downing, Downing,
Holding, Holding,
UpDebouncing, UpDebouncing,
MultiClickWaiting, MultiDownWaiting,
MultiDowning,
Count_State, Count_State,
} State; } State;
@ -52,6 +53,12 @@ static void actionFcn(during, DownDebouncing)(KeyFSM *pFSM)
printf(" during开启消抖 "); printf(" during开启消抖 ");
} }
static void actionFcn(exit, DownDebouncing)(KeyFSM *pFSM){
KeyFSMData * data = pFSM->base.data;
data->lastState = Idle_State;
}
static void actionFcn(during, Downing)(KeyFSM *pFSM) static void actionFcn(during, Downing)(KeyFSM *pFSM)
{ {
@ -70,8 +77,13 @@ static void actionFcn(exit, Downing)(KeyFSM *pFSM)
static void actionFcn(during, UpDebouncing)(KeyFSM *pFSM){ static void actionFcn(during, UpDebouncing)(KeyFSM *pFSM){
KeyFSMData * data = pFSM->base.data; KeyFSMData * data = pFSM->base.data;
data->countDelay++; data->countDelay++;
printf(" during消抖 "); printf(" during开消抖 ");
} }
static void actionFcn(exit, UpDebouncing)(KeyFSM *pFSM){
KeyFSMData * data = pFSM->base.data;
data->lastState = Idle_State;
}
@ -87,6 +99,30 @@ static void actionFcn(during, Holding)(KeyFSM *pFSM){
} }
} }
static void actionFcn(exit, Holding)(KeyFSM *pFSM){
KeyFSMData * data = pFSM->base.data;
data->out = Idle;
}
static void actionFcn(during, MultiDownWaiting)(KeyFSM *pFSM){
KeyFSMData * data = pFSM->base.data;
data->countDelay++;
printf(" during多击等待 ");
}
static void actionFcn(during, MultiDowning)(KeyFSM *pFSM)
{
KeyFSMData * data = pFSM->base.data;
data->out = Idle;
}
static void actionFcn(exit, MultiDowning)(KeyFSM *pFSM){
KeyFSMData * data = pFSM->base.data;
data->out = Idle;
}
@ -98,9 +134,12 @@ typedef enum _Event{
Idle_Event, Idle_Event,
PhsicalDown, PhsicalDown,
PhsicalUp, PhsicalUp,
DelayCount5, DelayCount3,
HoldCount10, HoldCount4,
MultiDown,
UpDebouncing2Holding,
UpDebouncing2Waiting,
Count_Event, Count_Event,
}Event; }Event;
@ -116,13 +155,21 @@ static State transitionHandler(PhsicalDown)(KeyFSM *pFSM)
return DownDebouncing; return DownDebouncing;
case UpDebouncing: case UpDebouncing:
if(data->isLastHolding){ if(data->countMultiDown){
data->isLastHolding = 0; return MultiDowning;
}
if(data->lastState == Holding){
data->lastState = Idle_State;
return Holding; return Holding;
} }
else else
return Downing; return Downing;
case MultiDownWaiting:
data->lastState = MultiDownWaiting;
return DownDebouncing;
default: default:
printf("检查状态转移表设计,不应该到这里"); printf("检查状态转移表设计,不应该到这里");
assert(0); assert(0);
@ -138,13 +185,20 @@ static State transitionHandler(PhsicalUp)(KeyFSM *pFSM)
switch (getFSMCurState((FSM_Ptr)pFSM)) switch (getFSMCurState((FSM_Ptr)pFSM))
{ {
case DownDebouncing: case DownDebouncing:
if(data->countMultiDown){
return MultiDownWaiting;
}
return Waiting; return Waiting;
case Downing: case Downing:
return UpDebouncing; return UpDebouncing;
case Holding: case Holding:
data->out = Idle; data->lastState = Holding;
return UpDebouncing; return UpDebouncing;
case MultiDowning:
return UpDebouncing;
default: default:
printf("检查状态转移表设计,不应该到这里"); printf("检查状态转移表设计,不应该到这里");
assert(0); assert(0);
@ -152,24 +206,28 @@ static State transitionHandler(PhsicalUp)(KeyFSM *pFSM)
} }
} }
static State transitionHandler(DelayCount5)(KeyFSM *pFSM){ static State transitionHandler(DelayCount3)(KeyFSM *pFSM){
printf(" 延迟计数到5 "); printf(" 延迟计数到3 ");
KeyFSMData * data = pFSM->base.data; KeyFSMData * data = pFSM->base.data;
data->countDelay = 0;
switch (getFSMCurState((FSM_Ptr)pFSM)) switch (getFSMCurState((FSM_Ptr)pFSM))
{ {
case DownDebouncing: case DownDebouncing:
data->out = Down; data->out = Down;
data->countDelay = 0;
printf("按键按下"); printf("按键按下");
return Downing; return Downing;
case UpDebouncing: case UpDebouncing:
data->out = Up; data->out = Up;
data->countDelay = 0; data->countMultiDown++;
printf("按键松开"); printf("按键松开");
return MultiDownWaiting;
case MultiDownWaiting:
data->out = Idle;
data->countMultiDown = 0;
return Waiting; return Waiting;
default: default:
@ -179,17 +237,55 @@ static State transitionHandler(DelayCount5)(KeyFSM *pFSM){
} }
static State transitionHandler(HoldCount10)(KeyFSM *pFSM){ static State transitionHandler(HoldCount4)(KeyFSM *pFSM){
printf(" 计数到10进入长按模式 "); printf(" 计数到2进入长按模式 ");
KeyFSMData * data = pFSM->base.data; KeyFSMData * data = pFSM->base.data;
data->countDelay = 0; data->countDelay = 0;
data->out = Hold; data->out = Hold;
data->isLastHolding = 1;
return Holding; return Holding;
} }
static State transitionHandler(MultiDown)(KeyFSM *pFSM){
printf(" 多击 ");
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:
printf(" 到达多击次数上限了 ");
break;
}
printf(" 多击%d ", data->countMultiDown+1);
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;
}
/* /*
begin begin
@ -201,18 +297,22 @@ const static char *stateStr[] = {
"Downing", "Downing",
"Holding", "Holding",
"UpDebouncing", "UpDebouncing",
"MultiClickWaiting", "MultiDownWaiting",
"MultiDowning",
}; };
const static char *eventStr[] = { const static char *eventStr[] = {
"Idle", "Idle",
"PhsicalDown", "PhsicalDown",
"PhsicalUp", "PhsicalUp",
"DelayCount5", "DelayCount3",
"HoldCount10", "HoldCount4",
"MultiDown",
"UpDebouncing2Holding",
"UpDebouncing2Waiting"
}; };
static void printFSM(KeyFSM* pFSM){ static void printFSM(KeyFSM* pFSM){
printf("\tKeyFSM: "); printf("\tKeyFSM: ");
printf("当前状态:%s, \t\t当前事件:%s, \t\t动作", stateStr[getFSMCurState((FSM_Ptr)pFSM)], eventStr[getFSMCurEvent((FSM_Ptr)pFSM)]); printf("当前状态:%s, \t\t当前事件:%s, \t\t转移", stateStr[getFSMCurState((FSM_Ptr)pFSM)], eventStr[getFSMCurEvent((FSM_Ptr)pFSM)]);
} }

17
main.c
View File

@ -3,16 +3,15 @@
#include "keyFSM.h" #include "keyFSM.h"
#include "FSM_public.h" #include "FSM_public.h"
#define NUM 50 #define NUM 60
// 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] = { KeyIn testin[NUM] = {
Up,Up,pDown,pDown,Up, Up,Up,pDown,pDown,Up,
pDown,pDown,pDown,pDown,pDown, pDown,pDown,pDown,pDown,pDown,
pDown,pDown,pDown,Up,Up, pDown,pDown,pDown,pDown,pDown,
Up,Up,Up,Up,Up,
Up,Up,pDown,pDown,pDown,
pDown,pDown,pDown,pDown,pDown, pDown,pDown,pDown,pDown,pDown,
pDown,pDown,pDown,pDown,pDown, pDown,pDown,pDown,pDown,pDown,
pDown,pDown,pDown,pDown,pDown, pDown,pDown,pDown,pDown,pDown,
@ -33,11 +32,15 @@ int main(){
setEvent((FSM_Ptr)keyFSM); setEvent((FSM_Ptr)keyFSM);
vptrFSM((FSM_Ptr)keyFSM)->step((FSM_Ptr)keyFSM); vptrFSM((FSM_Ptr)keyFSM)->step((FSM_Ptr)keyFSM);
if(data->out){
printf("\t\t\t\t%d", data->out);
}
printf("\n"); printf("\n");
} }
printf("hello world, 你好世界"); printf("hello world, 你好世界");
return 0; return 0;