Merge branch 'release/基本4状态开关'
This commit is contained in:
commit
3925c641a8
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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,138 @@ 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++;
|
||||||
|
printf(" during开启消抖 ");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
事件和对应的转移函数
|
事件和对应的转移函数
|
||||||
*/
|
*/
|
||||||
|
|
||||||
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;
|
KeyFSMData * data = pFSM->base.data;
|
||||||
|
data->countDelay = 0;
|
||||||
|
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;
|
KeyFSMData * data = pFSM->base.data;
|
||||||
|
data->countDelay = 0;
|
||||||
|
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 +163,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)]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
23
main.c
23
main.c
|
@ -1,9 +1,32 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "keyFSM.h"
|
||||||
|
#include "FSM_public.h"
|
||||||
|
|
||||||
|
#define NUM 35
|
||||||
|
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,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
int main(){
|
int main(){
|
||||||
|
|
||||||
|
KeyFSM* keyFSM = createKeyFSM();
|
||||||
|
|
||||||
|
for (int i = 0; i < NUM; i++)
|
||||||
|
{
|
||||||
|
printf("第%d次: ",i+1);
|
||||||
|
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;
|
||||||
|
|
Loading…
Reference in New Issue