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

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){ // 必须重新实现
return ceventArr[data->arrindex];
if(data->countDelay == 5){
return DelayCount5;
}
if(data->in == Up){
return PhsicalUp;
}
else{
return PhsicalDown;
}
}
static void step(KeyFSM* pFSM){
@ -34,25 +28,32 @@ static void step(KeyFSM* pFSM){
static void initData(KeyFSM *pFSM){ // 必须重新实现
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;
}
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
fcns->duringActionTable[E] = (Avoid_WARNING_void_FSM)actionFcn(during, E);
fcns->duringActionTable[D] = (Avoid_WARNING_void_FSM)actionFcn(during, D);
fcns->duringActionTable[Waiting] = (Avoid_WARNING_void_FSM)actionFcn(during, Waiting);
fcns->exitActionTable[Waiting] = (Avoid_WARNING_void_FSM)actionFcn(exit, Waiting);
fcns->enterActionTable[D] = (Avoid_WARNING_void_FSM)actionFcn(enter, D);
fcns->enterActionTable[E] = (Avoid_WARNING_void_FSM)actionFcn(enter, E);
fcns->duringActionTable[DownDebouncing] = (Avoid_WARNING_void_FSM)actionFcn(during, DownDebouncing);
fcns->exitActionTable[D] = (Avoid_WARNING_void_FSM)D_exitAction;
fcns->exitActionTable[E] = (Avoid_WARNING_void_FSM)E_exitAction;
fcns->duringActionTable[Downing] = (Avoid_WARNING_void_FSM)actionFcn(during, Downing);
fcns->exitActionTable[Downing] = (Avoid_WARNING_void_FSM)actionFcn(exit, Downing);
fcns->transitionTable[index(Idle, Idle2D)] = (Avoid_WARNING_int_FSM)transitionHandler(Idle2D);
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->duringActionTable[UpDebouncing] = (Avoid_WARNING_void_FSM)actionFcn(during, UpDebouncing);
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_
#define __KEY_FSM_H_
typedef enum _keyIn{
Up,
pDown,
}KeyIn;
typedef enum _keyOutSignal{
Idle,
Down,
Hold,
Down_2times,
Down_3times,
}KeyOutSignal;
typedef struct _keyFSMData
{
int arrindex;
int countDelay;
int countMultiDown;
KeyIn in;
KeyOutSignal out;
}KeyFSMData;
typedef struct _KeyFSM KeyFSM;

View File

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