搞定最基本的四个状态的,只有开启和关闭消抖
This commit is contained in:
parent
2bbe89d54b
commit
14ac7e2fd5
|
@ -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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
22
main.c
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue