去掉所有事件,仅用状态表示。目前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)
|
||||
|
||||
|
||||
# set(keytest 789)
|
||||
set(keytest 789)
|
||||
# set(child_parent 789)
|
||||
if(DEFINED keytest)
|
||||
include_directories(${PROJECT_SOURCE_DIR}/FSM_OOP/keytest)
|
||||
|
|
|
@ -21,7 +21,9 @@ void resetBaseFSM(FSM *pFSM)
|
|||
|
||||
static inline void setNextState(FSM* pFSM){
|
||||
int curState = pFSM->privateVars.curState;
|
||||
pFSM->privateVars.nextState = pFSM->privateVars.fcns.selectNextState[curState](pFSM->data, pFSM->signals);
|
||||
if(curState != 0){
|
||||
pFSM->privateVars.nextState = pFSM->privateVars.fcns.selectNextState[curState](pFSM->data, pFSM->signals);
|
||||
}
|
||||
|
||||
if(0 == pFSM->privateVars.numChild){
|
||||
return;
|
||||
|
@ -52,12 +54,12 @@ void stepBaseFSM(FSM *pFSM)
|
|||
int curState = pFSM->privateVars.curState;
|
||||
void *data = pFSM->data;
|
||||
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;
|
||||
|
||||
if(fcns->delayedEvent){
|
||||
fcns->transitionDelayTable[fcns->delayedEvent](data);
|
||||
fcns->delayedEvent = 0;
|
||||
if(fcns->delayedIndex){
|
||||
fcns->transitionDelayTable[fcns->delayedIndex](data);
|
||||
fcns->delayedIndex = 0;
|
||||
}
|
||||
|
||||
if (fcns->transitionTable[index] != NULL)
|
||||
|
@ -65,7 +67,9 @@ void stepBaseFSM(FSM *pFSM)
|
|||
if (fcns->exitActionTable[curState] != NULL)
|
||||
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)
|
||||
fcns->enterActionTable[nextState](data, childFSM);
|
||||
|
@ -86,10 +90,10 @@ void stepBaseFSM(FSM *pFSM)
|
|||
}
|
||||
|
||||
FSM* newBaseFSM(int numState, int defaultState){
|
||||
typedef void (*StateFuncPtr)(void *data);
|
||||
typedef void (*ChildFSMStepFuncPtr)(FSM **cFSM);
|
||||
typedef int (*TransitionFuncPtr)(void *data, int currentState);
|
||||
typedef int (*SelectNextStateFcnPtr)(void *data, void *signals);
|
||||
typedef void (*StateFuncPtr)(void *);
|
||||
typedef void (*ChildFSMStepFuncPtr)(FSM **);
|
||||
typedef int (*TransitionFuncPtr)(void *, int *);
|
||||
typedef int (*SelectNextStateFcnPtr)(void *, void *);
|
||||
|
||||
FSM *pFSM = calloc(1, sizeof(FSM));
|
||||
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.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.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)
|
||||
|
||||
|
||||
|
||||
typedef struct _FSM FSM;
|
||||
typedef struct _FSMHandler{
|
||||
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 (**duringActionTable)(void *data, FSM **cFSM);
|
||||
void (**exitActionTable)(void *data, FSM **cFSM);
|
||||
|
||||
int delayedEvent;
|
||||
int delayedIndex;
|
||||
void (**transitionDelayTable)(void *data);
|
||||
|
||||
void (**childFSMStepTable)(FSM **cFSM);
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
* @Author: godcreator02 qq974980621@gmail.com
|
||||
* @Date: 2024-04-20 19:02:11
|
||||
* @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
|
||||
* @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);
|
||||
}
|
||||
|
||||
static void initSignals(KeyFSM *pFSM){
|
||||
|
||||
}
|
||||
|
||||
static void resetSignals(KeyFSM *pFSM){
|
||||
|
||||
}
|
||||
|
||||
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
||||
addStateActionFcn(enter, Waiting);
|
||||
addStateActionFcn(during, DownDebouncing);
|
||||
|
@ -53,23 +61,16 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
|||
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 *pFSM;
|
||||
pFSM = (KeyFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE);
|
||||
pFSM = (KeyFSM *)newBaseFSM(Count_State, DEFAULT_STATE);
|
||||
|
||||
#ifndef DSP28377
|
||||
pFSM->base.vtbl.step = (Avoid_WARNING_Overrider_Fcns)step;
|
||||
#endif
|
||||
|
||||
pFSM->base.vtbl.selectNextState = (Avoid_WARNING_SelectNextState)selectEvent;
|
||||
|
||||
pFSM->base.vtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;
|
||||
pFSM->base.vtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData;
|
||||
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);
|
||||
|
||||
|
|
|
@ -26,35 +26,119 @@ typedef enum _State
|
|||
DownDebouncing,
|
||||
Downing,
|
||||
Holding,
|
||||
HoldUpDebouncing,
|
||||
UpDebouncing,
|
||||
MultiDownWaiting,
|
||||
MultiDowning,
|
||||
HoldUpDebouncing,
|
||||
MultiDownDebouncing,
|
||||
|
||||
Count_State,
|
||||
} State;
|
||||
#define DEFAULT_STATE Waiting
|
||||
|
||||
|
||||
static Event selectNextStateFcn(Waiting)(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 State selectNextStateFcn(Waiting)(KeyFSMData *data){
|
||||
if(data->in == Down){
|
||||
FSM_LOG(" 物理按键按下 ");
|
||||
return DownDebouncing;
|
||||
}
|
||||
return Idle_State;
|
||||
}
|
||||
|
||||
static State selectNextStateFcn(DownDebouncing)(KeyFSMData *data){
|
||||
if(data->in == Up){
|
||||
FSM_LOG(" 物理按键松开 ");
|
||||
return Waiting;
|
||||
}
|
||||
else if(data->countDelay == 5){
|
||||
return Downing;
|
||||
}
|
||||
return Idle_State;
|
||||
}
|
||||
|
||||
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{
|
||||
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){
|
||||
|
||||
data->out = Idle;
|
||||
data->countDelay = 0;
|
||||
data->countMultiDown = 0;
|
||||
|
@ -117,141 +201,47 @@ static void actionFcn(during, MultiDownDebouncing)(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(" 物理按键按下 ");
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* 转移函数 */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
void transitionGeneralAction(KeyFSMData *data){
|
||||
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)
|
||||
{
|
||||
FSM_LOG(" 物理按键松开 ");
|
||||
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 State transitionHandler(DownDebouncing, Downing)(KeyFSMData* data, int *delayedIndex){
|
||||
data->out = Down;
|
||||
*delayedIndex = index(DownDebouncing, Downing);
|
||||
}
|
||||
|
||||
static void delayHanlder(DelayCount3)(KeyFSMData* data){
|
||||
static void delayHanlder(DownDebouncing, Downing)(KeyFSMData* data){
|
||||
data->out = Idle;
|
||||
}
|
||||
|
||||
static State transitionHandler(DelayCount3)(KeyFSMData* data, State curState, Event *delayedEvent){
|
||||
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->countMultiDown++;
|
||||
|
||||
FSM_LOG("按键松开");
|
||||
return MultiDownWaiting;
|
||||
|
||||
case MultiDownWaiting:
|
||||
return Waiting;
|
||||
|
||||
case HoldUpDebouncing:
|
||||
return Waiting;
|
||||
|
||||
case MultiDownDebouncing:
|
||||
switch (data->countMultiDown + 1)
|
||||
{
|
||||
case 2:
|
||||
data->out = Down_2times;
|
||||
break;
|
||||
case 3:
|
||||
data->out = Down_3times;
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("reach MultiDown Limit!\n");
|
||||
break;
|
||||
}
|
||||
FSM_LOG(" 多击%d ", data->countMultiDown+1);
|
||||
*delayedEvent = DelayCount3;
|
||||
return MultiDowning;
|
||||
|
||||
default:
|
||||
FSM_LOG("检查状态转移表设计,不应该到这里");
|
||||
assert(0);
|
||||
}
|
||||
static State transitionHandler(UpDebouncing, MultiDownWaiting)(KeyFSMData* data, int *delayedIndex){
|
||||
data->out = Idle;
|
||||
data->countMultiDown++;
|
||||
}
|
||||
|
||||
static State transitionHandler(MultiDownDebouncing, MultiDowning)(KeyFSMData* data, int *delayedIndex){
|
||||
switch (data->countMultiDown + 1)
|
||||
{
|
||||
case 2:
|
||||
data->out = Down_2times;
|
||||
break;
|
||||
case 3:
|
||||
data->out = Down_3times;
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("reach MultiDown Limit!\n");
|
||||
break;
|
||||
}
|
||||
FSM_LOG(" 多击%d ", data->countMultiDown+1);
|
||||
*delayedIndex = index(MultiDownDebouncing, MultiDowning);
|
||||
}
|
||||
|
||||
static State transitionHandler(HoldCount4)(KeyFSMData* data, State curState, int *isDelayExecuted){
|
||||
FSM_LOG(" 计数到2进入长按模式 ");
|
||||
data->countDelay = 0;
|
||||
|
||||
static State transitionHandler(Downing, Holding)(KeyFSMData* data, int *delayedIndex){
|
||||
data->out = Hold;
|
||||
return Holding;
|
||||
}
|
||||
|
||||
|
||||
|
@ -272,17 +262,11 @@ const static char *stateStr[] = {
|
|||
"HoldUpDebouncing",
|
||||
"MultiDownDebouncing",
|
||||
};
|
||||
const static char *eventStr[] = {
|
||||
"Idle",
|
||||
"PhsicalDown",
|
||||
"PhsicalUp",
|
||||
"DelayCount3",
|
||||
"HoldCount4",
|
||||
};
|
||||
|
||||
static void printFSM(KeyFSM* pFSM){
|
||||
KeyFSMData* data = pFSM->base.data;
|
||||
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 "templateFSM.h"
|
||||
|
@ -19,11 +27,11 @@ int main(){
|
|||
|
||||
int ovflag = GetPreloaderOverFlag(pFSM);
|
||||
|
||||
if(i == 10){
|
||||
if(i == 3){
|
||||
TemplateFSM_Signals(pFSM)->signalA = 1;
|
||||
}
|
||||
if(i == 11){
|
||||
TemplateFSM_Signals(pFSM)->signalB = 1;
|
||||
if(i == 4){
|
||||
TemplateFSM_Signals(pFSM)->signalA = 1;
|
||||
}
|
||||
|
||||
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 <stdlib.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){
|
||||
printFSM(pFSM);
|
||||
stepBaseFSM(BASE_FSM(pFSM));
|
||||
FSM_LOG("下次状态:%s", stateStr[getFSMNextState((FSM *)pFSM)]);
|
||||
}
|
||||
|
||||
static void initData(TemplateFSM *pFSM){ // 必须重新实现
|
||||
|
@ -84,7 +65,8 @@ static void initDataLoader(TemplateFSM *pFSM){ // 必须重新实现
|
|||
|
||||
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
||||
/* ------------------------------- 添加下一个状态选择函数 ------------------------------ */
|
||||
|
||||
addSelectNextStateFcn(D);
|
||||
addSelectNextStateFcn(E);
|
||||
|
||||
|
||||
/* ----------------------- 添加状态中事件,action during exit ----------------------- */
|
||||
|
@ -101,7 +83,9 @@ static void setupHandler(FSMHandler* fcns){ // 必须重新实现
|
|||
addTransitionHandler(D, E);
|
||||
addTransitionHandler(E, D);
|
||||
|
||||
addDelayHandler(Idle, D);
|
||||
addDelayHandler(D, E);
|
||||
|
||||
fcns->transitionGeneralAction = &transitionGeneralAction;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -34,10 +34,21 @@ 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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* 对应的 action, exit, during 函数 */
|
||||
|
@ -73,13 +84,17 @@ static void actionFcn(exit, E)()
|
|||
/* -------------------------------------------------------------------------- */
|
||||
/* 转移函数 */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
void transitionGeneralAction(TemplateFSMData *data){
|
||||
FSM_LOG("general");
|
||||
}
|
||||
|
||||
static void transitionHandler(Idle, D)()
|
||||
{
|
||||
FSM_LOG(" Idle2D ");
|
||||
}
|
||||
|
||||
static void delayHanlder(Idle, D)(TemplateFSMData *data){
|
||||
FSM_LOG(" DelayIdle2D");
|
||||
static void delayHanlder(D, E)(TemplateFSMData *data){
|
||||
FSM_LOG(" DelayD2E");
|
||||
}
|
||||
|
||||
static State transitionHandler(Idle, E)()
|
||||
|
@ -87,8 +102,9 @@ static State transitionHandler(Idle, E)()
|
|||
FSM_LOG(" Idle2E ");
|
||||
}
|
||||
|
||||
static State transitionHandler(D, E)()
|
||||
static State transitionHandler(D, E)(TemplateFSMData *data, int *delayedIndex)
|
||||
{
|
||||
*delayedIndex = index(D, E);
|
||||
FSM_LOG(" D2E ");
|
||||
}
|
||||
|
||||
|
@ -111,7 +127,7 @@ const static char *stateStr[] = {
|
|||
|
||||
static void printFSM(TemplateFSM* pFSM){
|
||||
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