搞定最基本的四个状态的,只有开启和关闭消抖

This commit is contained in:
godcreator 2024-01-23 22:45:29 +08:00
parent 2bbe89d54b
commit 14ac7e2fd5
4 changed files with 176 additions and 76 deletions

View File

@ -8,23 +8,17 @@
/* /*
*/ */
static Event ceventArr[20] = {
Idle_Event,
Idle_Event,
Idle2D,
Idle_Event,
Idle_Event,
D2E,
E2D,
D2E,
Idle_Event,
Idle_Event,
Idle_Event,
Idle_Event,
};
static Event selectEvent(KeyFSMData *data){ // 必须重新实现 static Event selectEvent(KeyFSMData *data){ // 必须重新实现
return ceventArr[data->arrindex]; if(data->countDelay == 5){
return DelayCount5;
}
if(data->in == Up){
return PhsicalUp;
}
else{
return PhsicalDown;
}
} }
static void step(KeyFSM* pFSM){ static void step(KeyFSM* pFSM){
@ -34,25 +28,32 @@ static void step(KeyFSM* pFSM){
static void initData(KeyFSM *pFSM){ // 必须重新实现 static void initData(KeyFSM *pFSM){ // 必须重新实现
KeyFSMData *data = (KeyFSMData *)malloc(sizeof(KeyFSMData)); KeyFSMData *data = (KeyFSMData *)malloc(sizeof(KeyFSMData));
data->arrindex = 0; data->countDelay = 0;
data->countMultiDown = 0;
data->in = Up;
data->out = Idle;
pFSM->base.data = data; pFSM->base.data = data;
} }
static void setupHandler(FSMHandler* fcns){ // 必须重新实现 static void setupHandler(FSMHandler* fcns){ // 必须重新实现
fcns->duringActionTable[E] = (Avoid_WARNING_void_FSM)actionFcn(during, E); fcns->duringActionTable[Waiting] = (Avoid_WARNING_void_FSM)actionFcn(during, Waiting);
fcns->duringActionTable[D] = (Avoid_WARNING_void_FSM)actionFcn(during, D); fcns->exitActionTable[Waiting] = (Avoid_WARNING_void_FSM)actionFcn(exit, Waiting);
fcns->enterActionTable[D] = (Avoid_WARNING_void_FSM)actionFcn(enter, D); fcns->duringActionTable[DownDebouncing] = (Avoid_WARNING_void_FSM)actionFcn(during, DownDebouncing);
fcns->enterActionTable[E] = (Avoid_WARNING_void_FSM)actionFcn(enter, E);
fcns->exitActionTable[D] = (Avoid_WARNING_void_FSM)D_exitAction; fcns->duringActionTable[Downing] = (Avoid_WARNING_void_FSM)actionFcn(during, Downing);
fcns->exitActionTable[E] = (Avoid_WARNING_void_FSM)E_exitAction; fcns->exitActionTable[Downing] = (Avoid_WARNING_void_FSM)actionFcn(exit, Downing);
fcns->transitionTable[index(Idle, Idle2D)] = (Avoid_WARNING_int_FSM)transitionHandler(Idle2D); fcns->duringActionTable[UpDebouncing] = (Avoid_WARNING_void_FSM)actionFcn(during, UpDebouncing);
fcns->transitionTable[index(Idle, Idle2E)] = (Avoid_WARNING_int_FSM)transitionHandler(Idle2E);
fcns->transitionTable[index(D, D2E)] = (Avoid_WARNING_int_FSM)transitionHandler(D2E);
fcns->transitionTable[index(E, E2D)] = (Avoid_WARNING_int_FSM)transitionHandler(E2D); 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(UpDebouncing, PhsicalDown)] = (Avoid_WARNING_int_FSM)transitionHandler(PhsicalDown);
fcns->transitionTable[index(UpDebouncing, DelayCount5)] = (Avoid_WARNING_int_FSM)transitionHandler(DelayCount5);
} }
/* /*

View File

@ -1,9 +1,27 @@
#ifndef __KEY_FSM_H_ #ifndef __KEY_FSM_H_
#define __KEY_FSM_H_ #define __KEY_FSM_H_
typedef enum _keyIn{
Up,
pDown,
}KeyIn;
typedef enum _keyOutSignal{
Idle,
Down,
Hold,
Down_2times,
Down_3times,
}KeyOutSignal;
typedef struct _keyFSMData typedef struct _keyFSMData
{ {
int arrindex; int countDelay;
int countMultiDown;
KeyIn in;
KeyOutSignal out;
}KeyFSMData; }KeyFSMData;
typedef struct _KeyFSM KeyFSM; typedef struct _KeyFSM KeyFSM;

View File

@ -4,7 +4,7 @@
#include "FSM_protected.h" #include "FSM_protected.h"
#include "keyFSM.h" #include "keyFSM.h"
#include <stdio.h> #include <stdio.h>
#include <assert.h>
/* /*
@ -21,77 +21,133 @@ typedef struct _KeyFSM
typedef enum _State typedef enum _State
{ {
Idle, Idle_State,
D, Waiting,
E, DownDebouncing,
Downing,
Holding,
UpDebouncing,
MultiClickWaiting,
Count_State, Count_State,
} State; } State;
#define DEFAULT_STATE E #define DEFAULT_STATE Waiting
static void actionFcn(enter, D)()
{ static void actionFcn(during, Waiting)(KeyFSM *pFSM){
printf(" enterD "); KeyFSMData * data = pFSM->base.data;
data->out = Idle;
} }
static void actionFcn(during, D)() static void actionFcn(exit, Waiting)(KeyFSM *pFSM){
{ KeyFSMData * data = pFSM->base.data;
printf(" duringD "); data->out = Idle;
}
static void actionFcn(exit, D)()
{
printf(" exitD ");
} }
static void actionFcn(enter, E)()
static void actionFcn(during, DownDebouncing)(KeyFSM *pFSM)
{ {
printf(" enterE "); KeyFSMData * data = pFSM->base.data;
data->countDelay++;
printf(" during开启消抖 ");
} }
static void actionFcn(during, E)()
static void actionFcn(during, Downing)(KeyFSM *pFSM)
{ {
printf(" duringE "); KeyFSMData * data = pFSM->base.data;
data->countDelay++;
data->out = Idle;
} }
static void actionFcn(exit, E)() static void actionFcn(exit, Downing)(KeyFSM *pFSM)
{ {
printf(" exitE "); KeyFSMData * data = pFSM->base.data;
data->out = Idle;
} }
static void actionFcn(during, UpDebouncing)(KeyFSM *pFSM){
KeyFSMData * data = pFSM->base.data;
data->countDelay++;
}
/* /*
*/ */
typedef enum _Event{ typedef enum _Event{
Idle_Event, Idle_Event,
Idle2D, PhsicalDown,
Idle2E, PhsicalUp,
D2E, DelayCount5,
E2D,
Count_Event, Count_Event,
}Event; }Event;
static State transitionHandler(PhsicalDown)(KeyFSM *pFSM)
static State transitionHandler(Idle2D)()
{ {
printf(" Idle2D "); printf(" 物理按键按下 ");
return D; switch (getFSMCurState((FSM_Ptr)pFSM))
{
case Waiting:
return DownDebouncing;
break;
case UpDebouncing:
return Downing;
break;
default:
printf("检查状态转移表设计,不应该到这里");
assert(0);
break;
}
} }
static State transitionHandler(Idle2E)() static State transitionHandler(PhsicalUp)(KeyFSM *pFSM)
{ {
printf(" Idle2E "); printf(" 物理按键松开 ");
return E; switch (getFSMCurState((FSM_Ptr)pFSM))
{
case DownDebouncing:
return Waiting;
case Downing:
return UpDebouncing;
default:
printf("检查状态转移表设计,不应该到这里");
assert(0);
}
} }
static State transitionHandler(D2E)() static State transitionHandler(DelayCount5)(KeyFSM *pFSM){
{ printf(" 延迟计数到5 ");
printf(" D2E ");
return E;
}
static State transitionHandler(E2D)() KeyFSMData * data = pFSM->base.data;
{ switch (getFSMCurState((FSM_Ptr)pFSM))
printf(" E2D "); {
return D; case DownDebouncing:
data->out = Down;
data->countDelay = 0;
printf("按键按下");
return Downing;
case UpDebouncing:
data->out = Up;
data->countDelay = 0;
printf("按键松开");
return Waiting;
default:
printf("检查状态转移表设计,不应该到这里");
assert(0);
}
} }
@ -102,19 +158,22 @@ static State transitionHandler(E2D)()
*/ */
const static char *stateStr[] = { const static char *stateStr[] = {
"Idle", "Idle",
"D", "Waiting",
"E", "DownDebouncing",
"Downing",
"Holding",
"UpDebouncing",
"MultiClickWaiting",
}; };
const static char *eventStr[] = { const static char *eventStr[] = {
"Idle", "Idle",
"Idle2D", "PhsicalDown",
"Idle2E", "PhsicalUp",
"D2E", "DelayCount5",
"E2D",
}; };
static void printFSM(KeyFSM* pFSM){ static void printFSM(KeyFSM* pFSM){
printf(" \t\tKeyFSM: "); printf("\tKeyFSM: ");
printf("当前状态:%s, 当前事件:%s, 动作:", 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)]);
} }

22
main.c
View File

@ -1,9 +1,31 @@
#include <stdio.h> #include <stdio.h>
#include "keyFSM.h"
#include "FSM_public.h"
#define NUM 30
KeyIn testin[NUM] = {
Up,Up,Up,Up,Up,Up, pDown,pDown,pDown, Up,Up, pDown,pDown,pDown,pDown,pDown,pDown,pDown,pDown
};
int main(){ int main(){
KeyFSM* keyFSM = createKeyFSM();
for (int i = 0; i < NUM; i++)
{
printf("第%d次: ",i);
KeyFSMData* data = getData((FSM_Ptr)keyFSM);
data->in = testin[i];
setEvent((FSM_Ptr)keyFSM);
vptrFSM((FSM_Ptr)keyFSM)->step((FSM_Ptr)keyFSM);
printf("\n");
}
printf("hello world, 你好世界"); printf("hello world, 你好世界");
return 0; return 0;