去掉所有事件,仅用状态表示。目前template测试么问题,按键测试还有段错误,马拉松回来再搞

This commit is contained in:
godcreator02 2024-04-20 21:16:26 +08:00
parent 75ce4d1a9a
commit 60bdcfe50b
8 changed files with 219 additions and 220 deletions

View File

@ -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)

View File

@ -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));

View File

@ -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);

View File

@ -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);

View File

@ -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 Event selectNextStateFcn(Waiting)(KeyFSMData *data){ /* 下一个状态选择函数 */
/* -------------------------------------------------------------------------- */
if(data->countDelay == 10){ static State selectNextStateFcn(Waiting)(KeyFSMData *data){
return HoldCount4; if(data->in == Down){
} FSM_LOG(" 物理按键按下 ");
else if(data->countDelay == 5){ return DownDebouncing;
return DelayCount3;
}
else if(data->in == Up){
return PhsicalUp;
}
else{
return PhsicalDown;
} }
return Idle_State;
} }
static void actionFcn(enter, Waiting)(KeyFSMData* data){ 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->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)]);
} }

View File

@ -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);

View File

@ -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;
} }
/* /*

View File

@ -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 函数 */ /* 对应的 action, exit, during 函数 */
@ -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)]);
} }