暂存以下,回去看一眼原来的状态图结构
This commit is contained in:
parent
44a434f39b
commit
23a07ea75e
|
@ -1,4 +1,23 @@
|
||||||
{
|
{
|
||||||
|
"terminal.integrated.profiles.windows": {
|
||||||
|
"PowerShell": {
|
||||||
|
"source": "PowerShell",
|
||||||
|
"icon": "terminal-powershell",
|
||||||
|
"args": ["-NoExit","chcp 65001"]
|
||||||
|
},
|
||||||
|
"Command Prompt": {
|
||||||
|
"path": [
|
||||||
|
"${env:windir}\\Sysnative\\cmd.exe",
|
||||||
|
"${env:windir}\\System32\\cmd.exe"
|
||||||
|
],
|
||||||
|
"args": ["/K","chcp 65001"],
|
||||||
|
"icon": "terminal-cmd"
|
||||||
|
},
|
||||||
|
"Git Bash": {
|
||||||
|
"source": "Git Bash"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
"files.associations": {
|
"files.associations": {
|
||||||
"filter.h": "c",
|
"filter.h": "c",
|
||||||
"fsm_protected.h": "c",
|
"fsm_protected.h": "c",
|
||||||
|
@ -7,5 +26,10 @@
|
||||||
"stdio.h": "c",
|
"stdio.h": "c",
|
||||||
"assert.h": "c"
|
"assert.h": "c"
|
||||||
},
|
},
|
||||||
"files.encoding": "utf8"
|
|
||||||
|
|
||||||
|
"files.encoding": "utf8",
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,16 +13,15 @@
|
||||||
|
|
||||||
void resetBaseFSM(FSM *pFSM)
|
void resetBaseFSM(FSM *pFSM)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (pFSM->privateVars.fcns.exitActionTable[pFSM->privateVars.curState] != NULL)
|
if (pFSM->privateVars.fcns.exitActionTable[pFSM->privateVars.curState] != NULL)
|
||||||
pFSM->privateVars.fcns.exitActionTable[pFSM->privateVars.curState](pFSM->data, pFSM->privateVars.childFSM);
|
pFSM->privateVars.fcns.exitActionTable[pFSM->privateVars.curState](pFSM->data, pFSM->privateVars.childFSM);
|
||||||
|
|
||||||
pFSM->privateVars.curState = 0;
|
pFSM->privateVars.curState = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void setEvent(FSM* pFSM){
|
static inline void setNextState(FSM* pFSM){
|
||||||
assert(pFSM->vtbl.selectEvent);
|
int curState = pFSM->privateVars.curState;
|
||||||
pFSM->privateVars.curEvent = pFSM->vtbl.selectEvent(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;
|
||||||
|
@ -31,7 +30,7 @@ static inline void setEvent(FSM* pFSM){
|
||||||
for (int i = 0; i < pFSM->privateVars.numChild; i++)
|
for (int i = 0; i < pFSM->privateVars.numChild; i++)
|
||||||
{
|
{
|
||||||
FSM *cFSM = pFSM->privateVars.childFSM[i];
|
FSM *cFSM = pFSM->privateVars.childFSM[i];
|
||||||
setEvent(cFSM);
|
setNextState(cFSM);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,15 +45,15 @@ static inline void preload(FSM* pFSM){
|
||||||
void stepBaseFSM(FSM *pFSM)
|
void stepBaseFSM(FSM *pFSM)
|
||||||
{
|
{
|
||||||
preload(pFSM);
|
preload(pFSM);
|
||||||
setEvent(pFSM);
|
setNextState(pFSM);
|
||||||
pFSM->vtbl.resetSignals(pFSM);
|
pFSM->vtbl.resetSignals(pFSM);
|
||||||
|
|
||||||
FSMHandler *fcns = &pFSM->privateVars.fcns;
|
FSMHandler *fcns = &pFSM->privateVars.fcns;
|
||||||
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.numEvent + pFSM->privateVars.curEvent;
|
int index = pFSM->privateVars.curState * pFSM->privateVars.numState + pFSM->privateVars.numState;
|
||||||
int nextState;
|
int nextState = pFSM->privateVars.nextState;
|
||||||
|
|
||||||
if(fcns->delayedEvent){
|
if(fcns->delayedEvent){
|
||||||
fcns->transitionDelayTable[fcns->delayedEvent](data);
|
fcns->transitionDelayTable[fcns->delayedEvent](data);
|
||||||
|
@ -66,36 +65,37 @@ void stepBaseFSM(FSM *pFSM)
|
||||||
if (fcns->exitActionTable[curState] != NULL)
|
if (fcns->exitActionTable[curState] != NULL)
|
||||||
fcns->exitActionTable[curState](data, childFSM);
|
fcns->exitActionTable[curState](data, childFSM);
|
||||||
|
|
||||||
nextState = (*fcns->transitionTable[index])(data, curState, &fcns->delayedEvent);
|
(*fcns->transitionTable[index])(data, curState, &fcns->delayedEvent);
|
||||||
|
|
||||||
if (fcns->enterActionTable[nextState] != NULL)
|
if (fcns->enterActionTable[nextState] != NULL)
|
||||||
fcns->enterActionTable[nextState](data, childFSM);
|
fcns->enterActionTable[nextState](data, childFSM);
|
||||||
|
|
||||||
pFSM->privateVars.curState = nextState;
|
pFSM->privateVars.curState = nextState;
|
||||||
}
|
}
|
||||||
else if(curState == 0){
|
else if(curState == 0){ // 处理刚运行进入的默认状态
|
||||||
nextState = pFSM->privateVars.defaultState;
|
nextState = pFSM->privateVars.defaultState;
|
||||||
if (fcns->enterActionTable[nextState] != NULL)
|
if (fcns->enterActionTable[nextState] != NULL)
|
||||||
fcns->enterActionTable[nextState](data, childFSM);
|
fcns->enterActionTable[nextState](data, childFSM);
|
||||||
pFSM->privateVars.curState = nextState;
|
pFSM->privateVars.curState = nextState;
|
||||||
}
|
}
|
||||||
else
|
else // 状态机没动
|
||||||
{
|
{
|
||||||
if (fcns->duringActionTable[curState] != NULL)
|
if (fcns->duringActionTable[curState] != NULL)
|
||||||
fcns->duringActionTable[curState](data, childFSM);
|
fcns->duringActionTable[curState](data, childFSM);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FSM* newBaseFSM(int numState, int numEvent, int defaultState){
|
FSM* newBaseFSM(int numState, int defaultState){
|
||||||
typedef void (*StateFuncPtr)(void *data);
|
typedef void (*StateFuncPtr)(void *data);
|
||||||
typedef void (*ChildFSMStepFuncPtr)(FSM **cFSM);
|
typedef void (*ChildFSMStepFuncPtr)(FSM **cFSM);
|
||||||
typedef int (*TransitionFuncPtr)(void *data, int currentState);
|
typedef int (*TransitionFuncPtr)(void *data, int currentState);
|
||||||
|
typedef int (*SelectNextStateFcnPtr)(void *data, void *signals);
|
||||||
|
|
||||||
FSM *pFSM = calloc(1, sizeof(FSM));
|
FSM *pFSM = calloc(1, sizeof(FSM));
|
||||||
pFSM->privateVars.curEvent = 0;
|
pFSM->privateVars.numState = numState;
|
||||||
pFSM->privateVars.curState = 0;
|
|
||||||
pFSM->privateVars.numEvent = numEvent;
|
|
||||||
pFSM->privateVars.defaultState = defaultState;
|
pFSM->privateVars.defaultState = defaultState;
|
||||||
|
pFSM->privateVars.curState = 0;
|
||||||
|
pFSM->privateVars.nextState = 0;
|
||||||
pFSM->privateVars.numChild = 0;
|
pFSM->privateVars.numChild = 0;
|
||||||
|
|
||||||
pFSM->privateVars.preloader.isReady = 0;
|
pFSM->privateVars.preloader.isReady = 0;
|
||||||
|
@ -104,14 +104,15 @@ FSM* newBaseFSM(int numState, int numEvent, int defaultState){
|
||||||
pFSM->privateVars.fcns.enterActionTable = calloc(numState, sizeof(StateFuncPtr));
|
pFSM->privateVars.fcns.enterActionTable = calloc(numState, sizeof(StateFuncPtr));
|
||||||
pFSM->privateVars.fcns.exitActionTable = calloc(numState, sizeof(StateFuncPtr));
|
pFSM->privateVars.fcns.exitActionTable = calloc(numState, sizeof(StateFuncPtr));
|
||||||
|
|
||||||
pFSM->privateVars.fcns.transitionTable = calloc(numState * numEvent, sizeof(TransitionFuncPtr));
|
pFSM->privateVars.fcns.selectNextState = calloc(numState, sizeof(SelectNextStateFcnPtr));
|
||||||
pFSM->privateVars.fcns.childFSMStepTable = calloc(numState * numEvent, sizeof(ChildFSMStepFuncPtr));
|
pFSM->privateVars.fcns.transitionTable = calloc(numState * numState, sizeof(TransitionFuncPtr));
|
||||||
pFSM->privateVars.fcns.transitionDelayTable = calloc(numEvent, sizeof(StateFuncPtr));
|
pFSM->privateVars.fcns.transitionDelayTable = calloc(numState * numState, sizeof(StateFuncPtr));
|
||||||
|
|
||||||
|
pFSM->privateVars.fcns.childFSMStepTable = calloc(numState * numState, sizeof(ChildFSMStepFuncPtr));
|
||||||
|
|
||||||
FSMVtbl vtbl = {
|
FSMVtbl vtbl = {
|
||||||
.reset = resetBaseFSM,
|
.reset = resetBaseFSM,
|
||||||
.step = stepBaseFSM,
|
.step = stepBaseFSM,
|
||||||
.selectEvent = NULL,
|
|
||||||
.setupHandler = NULL,
|
.setupHandler = NULL,
|
||||||
.initData = NULL,
|
.initData = NULL,
|
||||||
.initDataLoader = NULL,
|
.initDataLoader = NULL,
|
||||||
|
@ -142,13 +143,11 @@ void constructFSM(FSM* pFSM){
|
||||||
int getFSMCurState(FSM *pFSM){
|
int getFSMCurState(FSM *pFSM){
|
||||||
return pFSM->privateVars.curState;
|
return pFSM->privateVars.curState;
|
||||||
}
|
}
|
||||||
int getFSMCurEvent(FSM *pFSM){
|
int getFSMNextState(FSM *pFSM){
|
||||||
return pFSM->privateVars.curEvent;
|
return pFSM->privateVars.nextState;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void setChildNum(FSM *pFSM, int num){
|
void setChildNum(FSM *pFSM, int num){
|
||||||
pFSM->privateVars.numChild = num;
|
pFSM->privateVars.numChild = num;
|
||||||
pFSM->privateVars.childFSM = (FSM **)calloc(num, sizeof(FSM *));
|
pFSM->privateVars.childFSM = (FSM **)calloc(num, sizeof(FSM *));
|
||||||
|
|
|
@ -22,29 +22,35 @@
|
||||||
#define enter enter
|
#define enter enter
|
||||||
#define exit exit
|
#define exit exit
|
||||||
|
|
||||||
#define transitionHandler(event) event##Handler
|
|
||||||
#define delayHanlder(event) event##DelayHandler
|
#define selectNextStateFcn(curstate) curstate##_##selectNextState
|
||||||
#define actionFcn(action, state) state##_##action##Action
|
#define transitionHandler(curstate, nextstate) curstate##2##nextstate##Handler
|
||||||
#define index(state, event) (state*Count_Event + event)
|
#define delayHanlder(curstate, nextstate) curstate##2##nextstate##DelayHandler
|
||||||
|
#define actionFcn(action, curstate) curstate##_##action##Action
|
||||||
|
#define index(curstate, nextstate) (curstate*Count_State + nextstate)
|
||||||
|
|
||||||
|
|
||||||
typedef struct _FSMHandler FSMHandler;
|
typedef struct _FSMHandler FSMHandler;
|
||||||
typedef void (*Avoid_WARNING_State_Fcns)(void *data, FSM **childFSM);
|
typedef void (*Avoid_WARNING_State_Fcns)(void *data, FSM **childFSM);
|
||||||
typedef void (*Avoid_WARNING_Delay_Handlers)(void *data);
|
typedef void (*Avoid_WARNING_Delay_Handlers)(void *data);
|
||||||
typedef int (*Avoid_WARNING_Transition_Handler)(void *data, int curState, int *);
|
typedef void (*Avoid_WARNING_Transition_Handler)(void *data, int curState, int *);
|
||||||
typedef void (*Avoid_WARNING_Overrider_Fcns)(FSM *pFsm);
|
typedef void (*Avoid_WARNING_Overrider_Fcns)(FSM *pFsm);
|
||||||
typedef int (*Avoid_WARNING_SelectEvent)(void *data, void *signals);
|
typedef int (*Avoid_WARNING_SelectNextState)(void *data, void *signals);
|
||||||
typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns);
|
typedef void (*Avoid_WARNING_void_fcns)(FSMHandler *fcns);
|
||||||
|
|
||||||
|
|
||||||
#define addStateActionFcn(type, state) fcns->type##ActionTable[state] = (Avoid_WARNING_State_Fcns)actionFcn(type, state)
|
#define addSelectNextStateFcn(curstate) fcns->selectNextState[curstate] = (Avoid_WARNING_SelectNextState)selectNextStateFcn(curstate)
|
||||||
#define addTransitionHandler(state, event) fcns->transitionTable[index(state, event)] = (Avoid_WARNING_Transition_Handler)transitionHandler(event)
|
#define addStateActionFcn(type, state) fcns->type##ActionTable[state] = (Avoid_WARNING_State_Fcns)actionFcn(type, state)
|
||||||
#define addDelayHandler(event) fcns->transitionDelayTable[event] = (Avoid_WARNING_Delay_Handlers)delayHanlder(event)
|
#define addTransitionHandler(curstate, nextstate) fcns->transitionTable[index(curstate, nextstate)] = (Avoid_WARNING_Transition_Handler)transitionHandler(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 (**transitionTable)(void *data, int currentState, int *);
|
int (**selectNextState)(void *data, void *signals);
|
||||||
|
|
||||||
|
void (**transitionTable)(void *data, int currentState, int *);
|
||||||
|
|
||||||
void (**enterActionTable)(void *data, FSM **cFSM);
|
void (**enterActionTable)(void *data, FSM **cFSM);
|
||||||
void (**duringActionTable)(void *data, FSM **cFSM);
|
void (**duringActionTable)(void *data, FSM **cFSM);
|
||||||
|
@ -67,11 +73,11 @@ typedef struct _FSMDataLoader
|
||||||
|
|
||||||
typedef struct _FSMPrivateVars
|
typedef struct _FSMPrivateVars
|
||||||
{
|
{
|
||||||
int curState;
|
int numState;
|
||||||
int defaultState; // Idle状态不能停留,必须指定一个初始状态
|
int defaultState; // Idle状态不能停留,必须指定一个初始状态
|
||||||
|
|
||||||
int curEvent;
|
int curState;
|
||||||
int numEvent;
|
int nextState;
|
||||||
|
|
||||||
FSMDataLoader preloader;
|
FSMDataLoader preloader;
|
||||||
|
|
||||||
|
@ -102,7 +108,7 @@ typedef struct _FSM
|
||||||
void constructFSM(FSM* pFSM);
|
void constructFSM(FSM* pFSM);
|
||||||
|
|
||||||
// 继承的函数
|
// 继承的函数
|
||||||
FSM *newBaseFSM(int numState, int numEvent, int defaultState);
|
FSM* newBaseFSM(int numState, int defaultState);
|
||||||
void stepBaseFSM(FSM *pFSM);
|
void stepBaseFSM(FSM *pFSM);
|
||||||
void resetBaseFSM(FSM *pFSM);
|
void resetBaseFSM(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 19:12:55
|
||||||
|
* @FilePath: \vscode\FSM_OOP\baseFSM\FSM_public.h
|
||||||
|
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
|
||||||
|
*/
|
||||||
#ifndef __FSM_PUBLIC_H_
|
#ifndef __FSM_PUBLIC_H_
|
||||||
#define __FSM_PUBLIC_H_
|
#define __FSM_PUBLIC_H_
|
||||||
|
|
||||||
|
@ -17,9 +25,9 @@ typedef struct _FSMHandler FSMHandler;
|
||||||
// 这几个函数可认为是虚函数, 构造函数里不会初始化FSMVtbl, 必须由子类重新实现
|
// 这几个函数可认为是虚函数, 构造函数里不会初始化FSMVtbl, 必须由子类重新实现
|
||||||
typedef struct _FSMVtbl {
|
typedef struct _FSMVtbl {
|
||||||
// 状态机控制
|
// 状态机控制
|
||||||
int (*selectEvent)(void *data, void *signals); // 可以认为是纯虚函数, 子类必须重新实现
|
|
||||||
void (*reset)(FSM *pFSM); // 子类重新实现可以添加一些打印信息
|
void (*reset)(FSM *pFSM); // 子类重新实现可以添加一些打印信息
|
||||||
void (*step)(FSM *pFSM); // 子类重新实现可以添加一些打印信息
|
void (*step)(FSM *pFSM); // 子类重新实现可以添加一些打印信息
|
||||||
|
|
||||||
void (*initData)(FSM *pFSM); // 子类必须重新实现
|
void (*initData)(FSM *pFSM); // 子类必须重新实现
|
||||||
void (*initSignals)(FSM *pFSM); // 子类必须重新实现
|
void (*initSignals)(FSM *pFSM); // 子类必须重新实现
|
||||||
void (*resetSignals)(FSM *pFSM); // 子类必须重新实现
|
void (*resetSignals)(FSM *pFSM); // 子类必须重新实现
|
||||||
|
@ -29,7 +37,7 @@ typedef struct _FSMVtbl {
|
||||||
|
|
||||||
/* --------------------------------- 状态机信息获取 -------------------------------- */
|
/* --------------------------------- 状态机信息获取 -------------------------------- */
|
||||||
int getFSMCurState(FSM *pFSM);
|
int getFSMCurState(FSM *pFSM);
|
||||||
int getFSMCurEvent(FSM *pFSM);
|
int getFSMNextState(FSM *pFSM);
|
||||||
void setChildNum(FSM *pFSM, int num);
|
void setChildNum(FSM *pFSM, int num);
|
||||||
void registerChildFSM(FSM *parent, FSM *child, int index);
|
void registerChildFSM(FSM *parent, FSM *child, int index);
|
||||||
|
|
||||||
|
@ -43,6 +51,7 @@ void _preloaderGetReady(FSM *pFSM);
|
||||||
int _getPreloaderOverFlag(FSM *pFSM);
|
int _getPreloaderOverFlag(FSM *pFSM);
|
||||||
void _clearPreloaderOverFlag(FSM *pFSM);
|
void _clearPreloaderOverFlag(FSM *pFSM);
|
||||||
|
|
||||||
|
/* ---------------------------------- 虚函数表 ---------------------------------- */
|
||||||
FSMVtbl *_vptrFSM(FSM* pFSM);
|
FSMVtbl *_vptrFSM(FSM* pFSM);
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -198,7 +198,7 @@ ParentFSM *createParentFSM(){
|
||||||
pFSM = (ParentFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE);
|
pFSM = (ParentFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE);
|
||||||
|
|
||||||
pFSM->base.vtbl.step = step;
|
pFSM->base.vtbl.step = step;
|
||||||
pFSM->base.vtbl.selectEvent = selectEvent;
|
pFSM->base.vtbl.selectNextState = selectEvent;
|
||||||
pFSM->base.vtbl.initData = initData;
|
pFSM->base.vtbl.initData = initData;
|
||||||
pFSM->base.vtbl.setupHandler = setupHandler;
|
pFSM->base.vtbl.setupHandler = setupHandler;
|
||||||
pFSM->base.vtbl.initDataLoader = initDataLoader;
|
pFSM->base.vtbl.initDataLoader = initDataLoader;
|
||||||
|
|
|
@ -71,7 +71,7 @@ ChildFSM *createChildFSM(){
|
||||||
pFSM = (ChildFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE);
|
pFSM = (ChildFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE);
|
||||||
|
|
||||||
pFSM->base.vtbl.step = step;
|
pFSM->base.vtbl.step = step;
|
||||||
pFSM->base.vtbl.selectEvent = selectEvent;
|
pFSM->base.vtbl.selectNextState = selectEvent;
|
||||||
pFSM->base.vtbl.initData = initData;
|
pFSM->base.vtbl.initData = initData;
|
||||||
pFSM->base.vtbl.setupHandler = setupHandler;
|
pFSM->base.vtbl.setupHandler = setupHandler;
|
||||||
pFSM->base.vtbl.initDataLoader = initDataLoader;
|
pFSM->base.vtbl.initDataLoader = initDataLoader;
|
||||||
|
|
|
@ -1,3 +1,11 @@
|
||||||
|
/*
|
||||||
|
* @Author: godcreator02 qq974980621@gmail.com
|
||||||
|
* @Date: 2024-04-20 19:02:11
|
||||||
|
* @LastEditors: godcreator02 qq974980621@gmail.com
|
||||||
|
* @LastEditTime: 2024-04-20 19:44:58
|
||||||
|
* @FilePath: \vscode\FSM_OOP\keytest\keyFSM.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>
|
||||||
|
|
||||||
|
@ -9,22 +17,6 @@
|
||||||
重载函数,有些是纯虚的必须重新实现,有些可以不重新实现直接用父类的
|
重载函数,有些是纯虚的必须重新实现,有些可以不重新实现直接用父类的
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static Event selectEvent(KeyFSMData *data){ // 必须重新实现
|
|
||||||
|
|
||||||
if(data->countDelay == 10){
|
|
||||||
return HoldCount4;
|
|
||||||
}
|
|
||||||
else if(data->countDelay == 5){
|
|
||||||
return DelayCount3;
|
|
||||||
}
|
|
||||||
else if(data->in == Up){
|
|
||||||
return PhsicalUp;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
return PhsicalDown;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void step(KeyFSM* pFSM){
|
static void step(KeyFSM* pFSM){
|
||||||
printFSM(pFSM);
|
printFSM(pFSM);
|
||||||
stepBaseFSM((FSM *)pFSM);
|
stepBaseFSM((FSM *)pFSM);
|
||||||
|
@ -93,7 +85,7 @@ KeyFSM *createKeyFSM(){
|
||||||
pFSM->base.vtbl.step = (Avoid_WARNING_Overrider_Fcns)step;
|
pFSM->base.vtbl.step = (Avoid_WARNING_Overrider_Fcns)step;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
pFSM->base.vtbl.selectEvent = (Avoid_WARNING_SelectEvent)selectEvent;
|
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;
|
||||||
|
|
|
@ -83,7 +83,11 @@ static void initDataLoader(TemplateFSM *pFSM){ // 必须重新实现
|
||||||
|
|
||||||
|
|
||||||
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
||||||
|
/* ------------------------------- 添加下一个状态选择函数 ------------------------------ */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* ----------------------- 添加状态中事件,action during exit ----------------------- */
|
||||||
addStateActionFcn(during, E);
|
addStateActionFcn(during, E);
|
||||||
addStateActionFcn(during, D);
|
addStateActionFcn(during, D);
|
||||||
addStateActionFcn(enter, E);
|
addStateActionFcn(enter, E);
|
||||||
|
@ -91,12 +95,13 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
||||||
addStateActionFcn(exit, E);
|
addStateActionFcn(exit, E);
|
||||||
addStateActionFcn(exit, D);
|
addStateActionFcn(exit, D);
|
||||||
|
|
||||||
addTransitionHandler(Idle, Idle2D);
|
/* --------------------------- 添加转移函数和转移函数对应的Delay -------------------------- */
|
||||||
addTransitionHandler(Idle, Idle2E);
|
addTransitionHandler(Idle, D);
|
||||||
addTransitionHandler(D, D2E);
|
addTransitionHandler(Idle, E);
|
||||||
addTransitionHandler(E, E2D);
|
addTransitionHandler(D, E);
|
||||||
|
addTransitionHandler(E, D);
|
||||||
|
|
||||||
addDelayHandler(Idle2D);
|
addDelayHandler(Idle, D);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -105,7 +110,7 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
||||||
|
|
||||||
TemplateFSM *createTemplateFSM(){
|
TemplateFSM *createTemplateFSM(){
|
||||||
TemplateFSM *pFSM;
|
TemplateFSM *pFSM;
|
||||||
pFSM = (TemplateFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE);
|
pFSM = (TemplateFSM *)newBaseFSM(Count_State, DEFAULT_STATE);
|
||||||
|
|
||||||
pFSM->base.vtbl.step = (Avoid_WARNING_Overrider_Fcns)step;
|
pFSM->base.vtbl.step = (Avoid_WARNING_Overrider_Fcns)step;
|
||||||
pFSM->base.vtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData;
|
pFSM->base.vtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData;
|
||||||
|
@ -113,7 +118,6 @@ TemplateFSM *createTemplateFSM(){
|
||||||
pFSM->base.vtbl.initSignals = (Avoid_WARNING_Overrider_Fcns)initSignals;
|
pFSM->base.vtbl.initSignals = (Avoid_WARNING_Overrider_Fcns)initSignals;
|
||||||
pFSM->base.vtbl.resetSignals = (Avoid_WARNING_Overrider_Fcns)resetSignals;
|
pFSM->base.vtbl.resetSignals = (Avoid_WARNING_Overrider_Fcns)resetSignals;
|
||||||
|
|
||||||
pFSM->base.vtbl.selectEvent = (Avoid_WARNING_SelectEvent)selectEvent;
|
|
||||||
pFSM->base.vtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;
|
pFSM->base.vtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;
|
||||||
|
|
||||||
constructFSM((FSM *)pFSM);
|
constructFSM((FSM *)pFSM);
|
||||||
|
|
Loading…
Reference in New Issue