去掉所有事件,仅用状态表示。目前template测试么问题,按键测试还有段错误,马拉松回来再搞
This commit is contained in:
parent
75ce4d1a9a
commit
60bdcfe50b
|
@ -6,7 +6,7 @@ include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM)
|
||||||
aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM SRC_FSM_OOP)
|
aux_source_directory(${PROJECT_SOURCE_DIR}/FSM_OOP/baseFSM SRC_FSM_OOP)
|
||||||
|
|
||||||
|
|
||||||
# set(keytest 789)
|
set(keytest 789)
|
||||||
# set(child_parent 789)
|
# set(child_parent 789)
|
||||||
if(DEFINED keytest)
|
if(DEFINED keytest)
|
||||||
include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/keytest)
|
include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/keytest)
|
||||||
|
|
|
@ -21,7 +21,9 @@ void resetBaseFSM(FSM *pFSM)
|
||||||
|
|
||||||
static inline void setNextState(FSM* pFSM){
|
static inline void setNextState(FSM* pFSM){
|
||||||
int curState = pFSM->privateVars.curState;
|
int curState = pFSM->privateVars.curState;
|
||||||
|
if(curState != 0){
|
||||||
pFSM->privateVars.nextState = pFSM->privateVars.fcns.selectNextState[curState](pFSM->data, pFSM->signals);
|
pFSM->privateVars.nextState = pFSM->privateVars.fcns.selectNextState[curState](pFSM->data, pFSM->signals);
|
||||||
|
}
|
||||||
|
|
||||||
if(0 == pFSM->privateVars.numChild){
|
if(0 == pFSM->privateVars.numChild){
|
||||||
return;
|
return;
|
||||||
|
@ -52,12 +54,12 @@ void stepBaseFSM(FSM *pFSM)
|
||||||
int curState = pFSM->privateVars.curState;
|
int curState = pFSM->privateVars.curState;
|
||||||
void *data = pFSM->data;
|
void *data = pFSM->data;
|
||||||
FSM **childFSM = pFSM->privateVars.childFSM;
|
FSM **childFSM = pFSM->privateVars.childFSM;
|
||||||
int index = pFSM->privateVars.curState * pFSM->privateVars.numState + pFSM->privateVars.numState;
|
int index = pFSM->privateVars.curState * pFSM->privateVars.numState + pFSM->privateVars.nextState;
|
||||||
int nextState = pFSM->privateVars.nextState;
|
int nextState = pFSM->privateVars.nextState;
|
||||||
|
|
||||||
if(fcns->delayedEvent){
|
if(fcns->delayedIndex){
|
||||||
fcns->transitionDelayTable[fcns->delayedEvent](data);
|
fcns->transitionDelayTable[fcns->delayedIndex](data);
|
||||||
fcns->delayedEvent = 0;
|
fcns->delayedIndex = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fcns->transitionTable[index] != NULL)
|
if (fcns->transitionTable[index] != NULL)
|
||||||
|
@ -65,7 +67,9 @@ void stepBaseFSM(FSM *pFSM)
|
||||||
if (fcns->exitActionTable[curState] != NULL)
|
if (fcns->exitActionTable[curState] != NULL)
|
||||||
fcns->exitActionTable[curState](data, childFSM);
|
fcns->exitActionTable[curState](data, childFSM);
|
||||||
|
|
||||||
(*fcns->transitionTable[index])(data, curState, &fcns->delayedEvent);
|
|
||||||
|
(*fcns->transitionTable[index])(data, &fcns->delayedIndex);
|
||||||
|
fcns->transitionGeneralAction(data);
|
||||||
|
|
||||||
if (fcns->enterActionTable[nextState] != NULL)
|
if (fcns->enterActionTable[nextState] != NULL)
|
||||||
fcns->enterActionTable[nextState](data, childFSM);
|
fcns->enterActionTable[nextState](data, childFSM);
|
||||||
|
@ -86,10 +90,10 @@ void stepBaseFSM(FSM *pFSM)
|
||||||
}
|
}
|
||||||
|
|
||||||
FSM* newBaseFSM(int numState, int defaultState){
|
FSM* newBaseFSM(int numState, int defaultState){
|
||||||
typedef void (*StateFuncPtr)(void *data);
|
typedef void (*StateFuncPtr)(void *);
|
||||||
typedef void (*ChildFSMStepFuncPtr)(FSM **cFSM);
|
typedef void (*ChildFSMStepFuncPtr)(FSM **);
|
||||||
typedef int (*TransitionFuncPtr)(void *data, int currentState);
|
typedef int (*TransitionFuncPtr)(void *, int *);
|
||||||
typedef int (*SelectNextStateFcnPtr)(void *data, void *signals);
|
typedef int (*SelectNextStateFcnPtr)(void *, void *);
|
||||||
|
|
||||||
FSM *pFSM = calloc(1, sizeof(FSM));
|
FSM *pFSM = calloc(1, sizeof(FSM));
|
||||||
pFSM->privateVars.numState = numState;
|
pFSM->privateVars.numState = numState;
|
||||||
|
@ -106,6 +110,7 @@ FSM* newBaseFSM(int numState, int defaultState){
|
||||||
|
|
||||||
pFSM->privateVars.fcns.selectNextState = calloc(numState, sizeof(SelectNextStateFcnPtr));
|
pFSM->privateVars.fcns.selectNextState = calloc(numState, sizeof(SelectNextStateFcnPtr));
|
||||||
pFSM->privateVars.fcns.transitionTable = calloc(numState * numState, sizeof(TransitionFuncPtr));
|
pFSM->privateVars.fcns.transitionTable = calloc(numState * numState, sizeof(TransitionFuncPtr));
|
||||||
|
pFSM->privateVars.fcns.transitionGeneralAction = calloc(1, sizeof(StateFuncPtr));
|
||||||
pFSM->privateVars.fcns.transitionDelayTable = calloc(numState * numState, sizeof(StateFuncPtr));
|
pFSM->privateVars.fcns.transitionDelayTable = calloc(numState * numState, sizeof(StateFuncPtr));
|
||||||
|
|
||||||
pFSM->privateVars.fcns.childFSMStepTable = calloc(numState * numState, sizeof(ChildFSMStepFuncPtr));
|
pFSM->privateVars.fcns.childFSMStepTable = calloc(numState * numState, sizeof(ChildFSMStepFuncPtr));
|
||||||
|
|
|
@ -45,18 +45,18 @@ typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns);
|
||||||
#define addDelayHandler(curstate, nextstate) fcns->transitionDelayTable[index(curstate, nextstate)] = (Avoid_WARNING_Delay_Handlers)delayHanlder(curstate, nextstate)
|
#define addDelayHandler(curstate, nextstate) fcns->transitionDelayTable[index(curstate, nextstate)] = (Avoid_WARNING_Delay_Handlers)delayHanlder(curstate, nextstate)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct _FSM FSM;
|
typedef struct _FSM FSM;
|
||||||
typedef struct _FSMHandler{
|
typedef struct _FSMHandler{
|
||||||
int (**selectNextState)(void *data, void *signals);
|
int (**selectNextState)(void *data, void *signals);
|
||||||
|
|
||||||
void (**transitionTable)(void *data, int currentState, int *);
|
void (**transitionTable)(void *data, int *delayedIndex);
|
||||||
|
void (*transitionGeneralAction)(void *data);
|
||||||
|
|
||||||
void (**enterActionTable)(void *data, FSM **cFSM);
|
void (**enterActionTable)(void *data, FSM **cFSM);
|
||||||
void (**duringActionTable)(void *data, FSM **cFSM);
|
void (**duringActionTable)(void *data, FSM **cFSM);
|
||||||
void (**exitActionTable)(void *data, FSM **cFSM);
|
void (**exitActionTable)(void *data, FSM **cFSM);
|
||||||
|
|
||||||
int delayedEvent;
|
int delayedIndex;
|
||||||
void (**transitionDelayTable)(void *data);
|
void (**transitionDelayTable)(void *data);
|
||||||
|
|
||||||
void (**childFSMStepTable)(FSM **cFSM);
|
void (**childFSMStepTable)(FSM **cFSM);
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* @Author: godcreator02 qq974980621@gmail.com
|
* @Author: godcreator02 qq974980621@gmail.com
|
||||||
* @Date: 2024-04-20 19:02:11
|
* @Date: 2024-04-20 19:02:11
|
||||||
* @LastEditors: godcreator02 qq974980621@gmail.com
|
* @LastEditors: godcreator02 qq974980621@gmail.com
|
||||||
* @LastEditTime: 2024-04-20 19:44:58
|
* @LastEditTime: 2024-04-20 21:15:18
|
||||||
* @FilePath: \vscode\FSM_OOP\keytest\keyFSM.c
|
* @FilePath: \vscode\FSM_OOP\keytest\keyFSM.c
|
||||||
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
|
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
|
||||||
*/
|
*/
|
||||||
|
@ -41,6 +41,14 @@ static void initDataLoader(KeyFSM *pFSM){ // 必须重新实现
|
||||||
pFSM->base.privateVars.preloader.preloadSize = sizeof(KeyIn);
|
pFSM->base.privateVars.preloader.preloadSize = sizeof(KeyIn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void initSignals(KeyFSM *pFSM){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static void resetSignals(KeyFSM *pFSM){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
||||||
addStateActionFcn(enter, Waiting);
|
addStateActionFcn(enter, Waiting);
|
||||||
addStateActionFcn(during, DownDebouncing);
|
addStateActionFcn(during, DownDebouncing);
|
||||||
|
@ -53,23 +61,16 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
||||||
addStateActionFcn(during, MultiDownDebouncing);
|
addStateActionFcn(during, MultiDownDebouncing);
|
||||||
|
|
||||||
|
|
||||||
addTransitionHandler(Waiting, PhsicalDown);
|
|
||||||
addTransitionHandler(DownDebouncing, PhsicalUp);
|
|
||||||
addTransitionHandler(DownDebouncing, DelayCount3);
|
|
||||||
addTransitionHandler(Downing, PhsicalUp);
|
|
||||||
addTransitionHandler(Downing, HoldCount4);
|
|
||||||
addTransitionHandler(UpDebouncing, PhsicalDown);
|
|
||||||
addTransitionHandler(UpDebouncing, DelayCount3);
|
|
||||||
addTransitionHandler(Holding, PhsicalUp);
|
|
||||||
addTransitionHandler(MultiDownWaiting, PhsicalDown);
|
|
||||||
addTransitionHandler(MultiDownWaiting, DelayCount3);
|
|
||||||
addTransitionHandler(MultiDowning, PhsicalUp);
|
|
||||||
addTransitionHandler(HoldUpDebouncing, PhsicalDown);
|
|
||||||
addTransitionHandler(HoldUpDebouncing, DelayCount3);
|
|
||||||
addTransitionHandler(MultiDownDebouncing, DelayCount3);
|
|
||||||
addTransitionHandler(MultiDownDebouncing, PhsicalUp);
|
|
||||||
|
|
||||||
addDelayHandler(DelayCount3);
|
addTransitionHandler(DownDebouncing, Downing);
|
||||||
|
addDelayHandler(DownDebouncing, Downing);
|
||||||
|
|
||||||
|
addTransitionHandler(UpDebouncing, MultiDownWaiting);
|
||||||
|
addTransitionHandler(MultiDownDebouncing, MultiDowning);
|
||||||
|
addTransitionHandler(Downing, Holding);
|
||||||
|
|
||||||
|
|
||||||
|
fcns->transitionGeneralAction = &transitionGeneralAction;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -79,16 +80,17 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
||||||
KeyFSM *createKeyFSM(){
|
KeyFSM *createKeyFSM(){
|
||||||
|
|
||||||
KeyFSM *pFSM;
|
KeyFSM *pFSM;
|
||||||
pFSM = (KeyFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE);
|
pFSM = (KeyFSM *)newBaseFSM(Count_State, DEFAULT_STATE);
|
||||||
|
|
||||||
#ifndef DSP28377
|
#ifndef DSP28377
|
||||||
pFSM->base.vtbl.step = (Avoid_WARNING_Overrider_Fcns)step;
|
pFSM->base.vtbl.step = (Avoid_WARNING_Overrider_Fcns)step;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
pFSM->base.vtbl.selectNextState = (Avoid_WARNING_SelectNextState)selectEvent;
|
|
||||||
pFSM->base.vtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;
|
pFSM->base.vtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;
|
||||||
pFSM->base.vtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData;
|
pFSM->base.vtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData;
|
||||||
pFSM->base.vtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader;
|
pFSM->base.vtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader;
|
||||||
|
pFSM->base.vtbl.initSignals = (Avoid_WARNING_Overrider_Fcns)initSignals;
|
||||||
|
pFSM->base.vtbl.resetSignals = (Avoid_WARNING_Overrider_Fcns)resetSignals;
|
||||||
|
|
||||||
constructFSM((FSM *)pFSM);
|
constructFSM((FSM *)pFSM);
|
||||||
|
|
||||||
|
|
|
@ -26,35 +26,119 @@ typedef enum _State
|
||||||
DownDebouncing,
|
DownDebouncing,
|
||||||
Downing,
|
Downing,
|
||||||
Holding,
|
Holding,
|
||||||
|
HoldUpDebouncing,
|
||||||
UpDebouncing,
|
UpDebouncing,
|
||||||
MultiDownWaiting,
|
MultiDownWaiting,
|
||||||
MultiDowning,
|
MultiDowning,
|
||||||
HoldUpDebouncing,
|
|
||||||
MultiDownDebouncing,
|
MultiDownDebouncing,
|
||||||
|
|
||||||
Count_State,
|
Count_State,
|
||||||
} State;
|
} State;
|
||||||
#define DEFAULT_STATE Waiting
|
#define DEFAULT_STATE Waiting
|
||||||
|
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
/* 下一个状态选择函数 */
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
static State selectNextStateFcn(Waiting)(KeyFSMData *data){
|
||||||
|
if(data->in == Down){
|
||||||
|
FSM_LOG(" 物理按键按下 ");
|
||||||
|
return DownDebouncing;
|
||||||
|
}
|
||||||
|
return Idle_State;
|
||||||
|
}
|
||||||
|
|
||||||
static Event selectNextStateFcn(Waiting)(KeyFSMData *data){
|
static State selectNextStateFcn(DownDebouncing)(KeyFSMData *data){
|
||||||
|
if(data->in == Up){
|
||||||
if(data->countDelay == 10){
|
FSM_LOG(" 物理按键松开 ");
|
||||||
return HoldCount4;
|
return Waiting;
|
||||||
}
|
}
|
||||||
else if(data->countDelay == 5){
|
else if(data->countDelay == 5){
|
||||||
return DelayCount3;
|
return Downing;
|
||||||
}
|
}
|
||||||
else if(data->in == Up){
|
return Idle_State;
|
||||||
return PhsicalUp;
|
}
|
||||||
|
|
||||||
|
static State selectNextStateFcn(Downing)(KeyFSMData *data){
|
||||||
|
if(data->in == Up){
|
||||||
|
FSM_LOG(" 物理按键松开 ");
|
||||||
|
return UpDebouncing;
|
||||||
|
}
|
||||||
|
else if(data->countDelay == 10){
|
||||||
|
return Holding;
|
||||||
|
}
|
||||||
|
return Idle_State;
|
||||||
|
}
|
||||||
|
|
||||||
|
static State selectNextStateFcn(Holding)(KeyFSMData *data){
|
||||||
|
if(data->in == Up){
|
||||||
|
FSM_LOG(" 物理按键松开 ");
|
||||||
|
return HoldUpDebouncing;
|
||||||
|
}
|
||||||
|
return Idle_State;
|
||||||
|
}
|
||||||
|
|
||||||
|
static State selectNextStateFcn(HoldUpDebouncing)(KeyFSMData *data){
|
||||||
|
if(data->in == Down){
|
||||||
|
FSM_LOG(" 物理按键按下 ");
|
||||||
|
return Holding;
|
||||||
|
}
|
||||||
|
else if(data->countDelay == 5){
|
||||||
|
return Waiting;
|
||||||
|
}
|
||||||
|
return Idle_State;
|
||||||
|
}
|
||||||
|
|
||||||
|
static State selectNextStateFcn(UpDebouncing)(KeyFSMData *data){
|
||||||
|
if(data->in == Down){
|
||||||
|
FSM_LOG(" 物理按键按下 ");
|
||||||
|
if(data->countMultiDown){
|
||||||
|
return MultiDowning;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
return PhsicalDown;
|
return Downing;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if(data->countDelay == 5){
|
||||||
|
return MultiDownWaiting;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Idle_State;
|
||||||
|
}
|
||||||
|
|
||||||
|
static State selectNextStateFcn(MultiDownWaiting)(KeyFSMData *data){
|
||||||
|
if(data->in == Down){
|
||||||
|
FSM_LOG(" 物理按键按下 ");
|
||||||
|
return MultiDownDebouncing;
|
||||||
|
}
|
||||||
|
else if(data->countDelay == 5){
|
||||||
|
return Waiting;
|
||||||
|
}
|
||||||
|
return Idle_State;
|
||||||
|
}
|
||||||
|
|
||||||
|
static State selectNextStateFcn(MultiDowning)(KeyFSMData *data){
|
||||||
|
if(data->in == Up){
|
||||||
|
FSM_LOG(" 物理按键松开 ");
|
||||||
|
return UpDebouncing;
|
||||||
|
}
|
||||||
|
return Idle_State;
|
||||||
|
}
|
||||||
|
|
||||||
|
static State selectNextStateFcn(MultiDownDebouncing)(KeyFSMData *data){
|
||||||
|
if(data->in == Up){
|
||||||
|
FSM_LOG(" 物理按键松开 ");
|
||||||
|
return MultiDownWaiting;
|
||||||
|
}
|
||||||
|
else if(data->countDelay == 5){
|
||||||
|
return MultiDowning;
|
||||||
|
}
|
||||||
|
return Idle_State;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
/* 对应的 action, exit, during 函数 */
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
static void actionFcn(enter, Waiting)(KeyFSMData* data){
|
static void actionFcn(enter, Waiting)(KeyFSMData* data){
|
||||||
|
|
||||||
data->out = Idle;
|
data->out = Idle;
|
||||||
data->countDelay = 0;
|
data->countDelay = 0;
|
||||||
data->countMultiDown = 0;
|
data->countMultiDown = 0;
|
||||||
|
@ -117,111 +201,28 @@ static void actionFcn(during, MultiDownDebouncing)(KeyFSMData* data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
/* 转移函数 */
|
||||||
/*
|
/* -------------------------------------------------------------------------- */
|
||||||
事件和对应的转移函数
|
void transitionGeneralAction(KeyFSMData *data){
|
||||||
*/
|
|
||||||
|
|
||||||
typedef enum _Event{
|
|
||||||
Idle_Event,
|
|
||||||
PhsicalDown,
|
|
||||||
PhsicalUp,
|
|
||||||
DelayCount3,
|
|
||||||
HoldCount4,
|
|
||||||
|
|
||||||
Count_Event,
|
|
||||||
}Event;
|
|
||||||
|
|
||||||
static State transitionHandler(PhsicalDown)(KeyFSMData* data, State curState, int *isDelayExecuted)
|
|
||||||
{
|
|
||||||
FSM_LOG(" 物理按键按下 ");
|
|
||||||
data->countDelay = 0;
|
data->countDelay = 0;
|
||||||
|
|
||||||
switch (curState)
|
|
||||||
{
|
|
||||||
case Waiting:
|
|
||||||
return DownDebouncing;
|
|
||||||
|
|
||||||
case UpDebouncing:
|
|
||||||
if(data->countMultiDown)
|
|
||||||
return MultiDowning;
|
|
||||||
else
|
|
||||||
return Downing;
|
|
||||||
|
|
||||||
case HoldUpDebouncing:
|
|
||||||
return Holding;
|
|
||||||
|
|
||||||
case MultiDownWaiting:
|
|
||||||
return MultiDownDebouncing;
|
|
||||||
|
|
||||||
|
|
||||||
default:
|
|
||||||
FSM_LOG("检查状态转移表设计,不应该到这里");
|
|
||||||
assert(0);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static State transitionHandler(PhsicalUp)(KeyFSMData* data, State curState, Event *delayedEvent)
|
static State transitionHandler(DownDebouncing, Downing)(KeyFSMData* data, int *delayedIndex){
|
||||||
{
|
data->out = Down;
|
||||||
FSM_LOG(" 物理按键松开 ");
|
*delayedIndex = index(DownDebouncing, Downing);
|
||||||
data->countDelay = 0;
|
|
||||||
|
|
||||||
switch (curState)
|
|
||||||
{
|
|
||||||
case DownDebouncing:
|
|
||||||
if(data->countMultiDown){
|
|
||||||
return MultiDownWaiting;
|
|
||||||
}
|
|
||||||
return Waiting;
|
|
||||||
|
|
||||||
case Downing:
|
|
||||||
return UpDebouncing;
|
|
||||||
case Holding:
|
|
||||||
return HoldUpDebouncing;
|
|
||||||
|
|
||||||
case MultiDowning:
|
|
||||||
return UpDebouncing;
|
|
||||||
|
|
||||||
default:
|
|
||||||
FSM_LOG("检查状态转移表设计,不应该到这里");
|
|
||||||
assert(0);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void delayHanlder(DelayCount3)(KeyFSMData* data){
|
static void delayHanlder(DownDebouncing, Downing)(KeyFSMData* data){
|
||||||
data->out = Idle;
|
data->out = Idle;
|
||||||
}
|
}
|
||||||
|
|
||||||
static State transitionHandler(DelayCount3)(KeyFSMData* data, State curState, Event *delayedEvent){
|
static State transitionHandler(UpDebouncing, MultiDownWaiting)(KeyFSMData* data, int *delayedIndex){
|
||||||
FSM_LOG(" 延迟计数到3 ");
|
|
||||||
data->countDelay = 0;
|
|
||||||
|
|
||||||
switch (curState)
|
|
||||||
{
|
|
||||||
case DownDebouncing:
|
|
||||||
data->out = Down;
|
|
||||||
*delayedEvent = DelayCount3;
|
|
||||||
|
|
||||||
FSM_LOG("按键按下");
|
|
||||||
return Downing;
|
|
||||||
|
|
||||||
case UpDebouncing:
|
|
||||||
data->out = Idle;
|
data->out = Idle;
|
||||||
data->countMultiDown++;
|
data->countMultiDown++;
|
||||||
|
}
|
||||||
|
|
||||||
FSM_LOG("按键松开");
|
static State transitionHandler(MultiDownDebouncing, MultiDowning)(KeyFSMData* data, int *delayedIndex){
|
||||||
return MultiDownWaiting;
|
|
||||||
|
|
||||||
case MultiDownWaiting:
|
|
||||||
return Waiting;
|
|
||||||
|
|
||||||
case HoldUpDebouncing:
|
|
||||||
return Waiting;
|
|
||||||
|
|
||||||
case MultiDownDebouncing:
|
|
||||||
switch (data->countMultiDown + 1)
|
switch (data->countMultiDown + 1)
|
||||||
{
|
{
|
||||||
case 2:
|
case 2:
|
||||||
|
@ -236,22 +237,11 @@ static State transitionHandler(DelayCount3)(KeyFSMData* data, State curState, Ev
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
FSM_LOG(" 多击%d ", data->countMultiDown+1);
|
FSM_LOG(" 多击%d ", data->countMultiDown+1);
|
||||||
*delayedEvent = DelayCount3;
|
*delayedIndex = index(MultiDownDebouncing, MultiDowning);
|
||||||
return MultiDowning;
|
|
||||||
|
|
||||||
default:
|
|
||||||
FSM_LOG("检查状态转移表设计,不应该到这里");
|
|
||||||
assert(0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static State transitionHandler(Downing, Holding)(KeyFSMData* data, int *delayedIndex){
|
||||||
static State transitionHandler(HoldCount4)(KeyFSMData* data, State curState, int *isDelayExecuted){
|
|
||||||
FSM_LOG(" 计数到2进入长按模式 ");
|
|
||||||
data->countDelay = 0;
|
|
||||||
|
|
||||||
data->out = Hold;
|
data->out = Hold;
|
||||||
return Holding;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -272,17 +262,11 @@ const static char *stateStr[] = {
|
||||||
"HoldUpDebouncing",
|
"HoldUpDebouncing",
|
||||||
"MultiDownDebouncing",
|
"MultiDownDebouncing",
|
||||||
};
|
};
|
||||||
const static char *eventStr[] = {
|
|
||||||
"Idle",
|
|
||||||
"PhsicalDown",
|
|
||||||
"PhsicalUp",
|
|
||||||
"DelayCount3",
|
|
||||||
"HoldCount4",
|
|
||||||
};
|
|
||||||
static void printFSM(KeyFSM* pFSM){
|
static void printFSM(KeyFSM* pFSM){
|
||||||
KeyFSMData* data = pFSM->base.data;
|
KeyFSMData* data = pFSM->base.data;
|
||||||
FSM_LOG("KeyFSM: ");
|
FSM_LOG("KeyFSM: ");
|
||||||
FSM_LOG("%d, 当前状态:%s, \t当前事件:%s \t转移:", data->countDelay, stateStr[getFSMCurState((FSM *)pFSM)], eventStr[getFSMCurEvent((FSM *)pFSM)]);
|
FSM_LOG("%d, 当前状态:%s, \t当前事件:%s \t转移:", data->countDelay, stateStr[getFSMCurState((FSM *)pFSM)], stateStr[getFSMNextState((FSM *)pFSM)]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,11 @@
|
||||||
|
/*
|
||||||
|
* @Author: godcreator02 qq974980621@gmail.com
|
||||||
|
* @Date: 2024-04-20 18:52:14
|
||||||
|
* @LastEditors: godcreator02 qq974980621@gmail.com
|
||||||
|
* @LastEditTime: 2024-04-20 20:26:40
|
||||||
|
* @FilePath: \vscode\FSM_OOP\template\main.c
|
||||||
|
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
|
||||||
|
*/
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "templateFSM.h"
|
#include "templateFSM.h"
|
||||||
|
@ -19,11 +27,11 @@ int main(){
|
||||||
|
|
||||||
int ovflag = GetPreloaderOverFlag(pFSM);
|
int ovflag = GetPreloaderOverFlag(pFSM);
|
||||||
|
|
||||||
if(i == 10){
|
if(i == 3){
|
||||||
TemplateFSM_Signals(pFSM)->signalA = 1;
|
TemplateFSM_Signals(pFSM)->signalA = 1;
|
||||||
}
|
}
|
||||||
if(i == 11){
|
if(i == 4){
|
||||||
TemplateFSM_Signals(pFSM)->signalB = 1;
|
TemplateFSM_Signals(pFSM)->signalA = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("%d, " ,i);
|
printf("%d, " ,i);
|
||||||
|
|
|
@ -1,3 +1,11 @@
|
||||||
|
/*
|
||||||
|
* @Author: godcreator02 qq974980621@gmail.com
|
||||||
|
* @Date: 2024-04-20 20:08:03
|
||||||
|
* @LastEditors: godcreator02 qq974980621@gmail.com
|
||||||
|
* @LastEditTime: 2024-04-20 21:05:34
|
||||||
|
* @FilePath: \vscode\FSM_OOP\template\templateFSM.c
|
||||||
|
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
|
||||||
|
*/
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
@ -9,38 +17,11 @@
|
||||||
/*
|
/*
|
||||||
重载函数,有些是纯虚的必须重新实现,有些可以不重新实现直接用父类的
|
重载函数,有些是纯虚的必须重新实现,有些可以不重新实现直接用父类的
|
||||||
*/
|
*/
|
||||||
static Event ceventArr[20] = {
|
|
||||||
Idle_Event,
|
|
||||||
Idle_Event,
|
|
||||||
Idle2D,
|
|
||||||
Idle_Event,
|
|
||||||
Idle_Event,
|
|
||||||
D2E,
|
|
||||||
E2D,
|
|
||||||
D2E,
|
|
||||||
Idle_Event,
|
|
||||||
Idle_Event,
|
|
||||||
Idle_Event,
|
|
||||||
Idle_Event,
|
|
||||||
Idle_Event,
|
|
||||||
Idle_Event,
|
|
||||||
Idle_Event,
|
|
||||||
};
|
|
||||||
|
|
||||||
static Event selectEvent(TemplateFSMData *data, TemplateFSMSignals *signals){ // 必须重新实现
|
|
||||||
if(signals->signalA){
|
|
||||||
return E2D;
|
|
||||||
}
|
|
||||||
if(signals->signalB){
|
|
||||||
return D2E;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ceventArr[data->in.arrindex];
|
|
||||||
}
|
|
||||||
|
|
||||||
static void step(TemplateFSM* pFSM){
|
static void step(TemplateFSM* pFSM){
|
||||||
printFSM(pFSM);
|
printFSM(pFSM);
|
||||||
stepBaseFSM(BASE_FSM(pFSM));
|
stepBaseFSM(BASE_FSM(pFSM));
|
||||||
|
FSM_LOG("下次状态:%s", stateStr[getFSMNextState((FSM *)pFSM)]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void initData(TemplateFSM *pFSM){ // 必须重新实现
|
static void initData(TemplateFSM *pFSM){ // 必须重新实现
|
||||||
|
@ -84,7 +65,8 @@ static void initDataLoader(TemplateFSM *pFSM){ // 必须重新实现
|
||||||
|
|
||||||
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
||||||
/* ------------------------------- 添加下一个状态选择函数 ------------------------------ */
|
/* ------------------------------- 添加下一个状态选择函数 ------------------------------ */
|
||||||
|
addSelectNextStateFcn(D);
|
||||||
|
addSelectNextStateFcn(E);
|
||||||
|
|
||||||
|
|
||||||
/* ----------------------- 添加状态中事件,action during exit ----------------------- */
|
/* ----------------------- 添加状态中事件,action during exit ----------------------- */
|
||||||
|
@ -101,7 +83,9 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
||||||
addTransitionHandler(D, E);
|
addTransitionHandler(D, E);
|
||||||
addTransitionHandler(E, D);
|
addTransitionHandler(E, D);
|
||||||
|
|
||||||
addDelayHandler(Idle, D);
|
addDelayHandler(D, E);
|
||||||
|
|
||||||
|
fcns->transitionGeneralAction = &transitionGeneralAction;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -34,9 +34,20 @@ typedef enum _State
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
/* 下一个状态选择函数 */
|
/* 下一个状态选择函数 */
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
static void selectNextStateFcn(D)(TemplateFSMData *data, TemplateFSMSignals *signals){
|
static State selectNextStateFcn(D)(TemplateFSMData *data, TemplateFSMSignals *signals){
|
||||||
|
if(signals->signalA){
|
||||||
|
return E;
|
||||||
}
|
}
|
||||||
|
return Idle;
|
||||||
|
}
|
||||||
|
|
||||||
|
static State selectNextStateFcn(E)(TemplateFSMData *data, TemplateFSMSignals *signals){
|
||||||
|
if(signals->signalA){
|
||||||
|
return D;
|
||||||
|
}
|
||||||
|
return Idle;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
|
@ -73,13 +84,17 @@ static void actionFcn(exit, E)()
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
/* 转移函数 */
|
/* 转移函数 */
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
|
void transitionGeneralAction(TemplateFSMData *data){
|
||||||
|
FSM_LOG("general");
|
||||||
|
}
|
||||||
|
|
||||||
static void transitionHandler(Idle, D)()
|
static void transitionHandler(Idle, D)()
|
||||||
{
|
{
|
||||||
FSM_LOG(" Idle2D ");
|
FSM_LOG(" Idle2D ");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void delayHanlder(Idle, D)(TemplateFSMData *data){
|
static void delayHanlder(D, E)(TemplateFSMData *data){
|
||||||
FSM_LOG(" DelayIdle2D");
|
FSM_LOG(" DelayD2E");
|
||||||
}
|
}
|
||||||
|
|
||||||
static State transitionHandler(Idle, E)()
|
static State transitionHandler(Idle, E)()
|
||||||
|
@ -87,8 +102,9 @@ static State transitionHandler(Idle, E)()
|
||||||
FSM_LOG(" Idle2E ");
|
FSM_LOG(" Idle2E ");
|
||||||
}
|
}
|
||||||
|
|
||||||
static State transitionHandler(D, E)()
|
static State transitionHandler(D, E)(TemplateFSMData *data, int *delayedIndex)
|
||||||
{
|
{
|
||||||
|
*delayedIndex = index(D, E);
|
||||||
FSM_LOG(" D2E ");
|
FSM_LOG(" D2E ");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -111,7 +127,7 @@ const static char *stateStr[] = {
|
||||||
|
|
||||||
static void printFSM(TemplateFSM* pFSM){
|
static void printFSM(TemplateFSM* pFSM){
|
||||||
FSM_LOG(" \tTemplateFSM: ");
|
FSM_LOG(" \tTemplateFSM: ");
|
||||||
FSM_LOG("下次状态:%s, 当前状态:%s, 预装载器溢出:%d ,动作:", stateStr[getFSMNextState((FSM *)pFSM)], stateStr[getFSMCurState((FSM *)pFSM)], _getPreloaderOverFlag((FSM *)pFSM));
|
FSM_LOG("预装载器溢出:%d, 当前状态:%s, 动作:", _getPreloaderOverFlag((FSM *)pFSM), stateStr[getFSMCurState((FSM *)pFSM)]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue