2024-01-30 15:50:34 +08:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
#include "parentFSM.h"
|
|
|
|
#include "FSM_protected.h"
|
|
|
|
|
|
|
|
#define DEFAULT_STATE Idle
|
|
|
|
|
|
|
|
typedef struct _ParentFSM
|
|
|
|
{
|
|
|
|
FSM base;
|
|
|
|
}ParentFSM;
|
|
|
|
|
|
|
|
typedef enum _State{
|
|
|
|
Idle,
|
|
|
|
A,
|
|
|
|
B,
|
|
|
|
C,
|
|
|
|
|
|
|
|
Count_State,
|
|
|
|
}State;
|
|
|
|
|
|
|
|
typedef enum _Event{
|
|
|
|
Idle_Event,
|
|
|
|
Start,
|
|
|
|
A2B,
|
|
|
|
B2A,
|
|
|
|
B2C,
|
|
|
|
C2A,
|
|
|
|
|
|
|
|
Count_Event,
|
|
|
|
}Event;
|
|
|
|
|
|
|
|
const static char *stateStr[] = {
|
|
|
|
"Idle",
|
|
|
|
"A",
|
|
|
|
"B",
|
|
|
|
"C",
|
|
|
|
};
|
|
|
|
|
|
|
|
const static char *eventStr[] = {
|
|
|
|
"Idle",
|
|
|
|
"Start",
|
|
|
|
"A2B",
|
|
|
|
"B2A",
|
|
|
|
"B2C",
|
|
|
|
"C2A",
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
State StartHandler(){
|
2024-01-30 16:06:02 +08:00
|
|
|
FSM_LOG(" start ");
|
2024-01-30 15:50:34 +08:00
|
|
|
return A;
|
|
|
|
}
|
|
|
|
|
|
|
|
State A2BHandler(){
|
2024-01-30 16:06:02 +08:00
|
|
|
FSM_LOG(" A2B ");
|
2024-01-30 15:50:34 +08:00
|
|
|
return B;
|
|
|
|
}
|
|
|
|
|
|
|
|
State B2AHandler(){
|
2024-01-30 16:06:02 +08:00
|
|
|
FSM_LOG(" B2A ");
|
2024-01-30 15:50:34 +08:00
|
|
|
return A;
|
|
|
|
}
|
|
|
|
|
|
|
|
State B2CHandler(){
|
2024-01-30 16:06:02 +08:00
|
|
|
FSM_LOG(" B2C ");
|
2024-01-30 15:50:34 +08:00
|
|
|
return C;
|
|
|
|
}
|
|
|
|
|
|
|
|
State C2AHandler(){
|
2024-01-30 16:06:02 +08:00
|
|
|
FSM_LOG(" C2A ");
|
2024-01-30 15:50:34 +08:00
|
|
|
return A;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void A_enterAction(){
|
2024-01-30 16:06:02 +08:00
|
|
|
FSM_LOG(" enterA ");
|
2024-01-30 15:50:34 +08:00
|
|
|
}
|
|
|
|
void A_duringAction(){
|
2024-01-30 16:06:02 +08:00
|
|
|
FSM_LOG(" duringA ");
|
2024-01-30 15:50:34 +08:00
|
|
|
}
|
|
|
|
void A_exitAction(){
|
2024-01-30 16:06:02 +08:00
|
|
|
FSM_LOG(" exitA ");
|
2024-01-30 15:50:34 +08:00
|
|
|
}
|
|
|
|
|
2024-01-30 16:06:02 +08:00
|
|
|
void B_enterAction(void *data, FSM **childFSM){
|
|
|
|
FSM_LOG(" enterB ");
|
2024-01-30 15:50:34 +08:00
|
|
|
|
2024-01-30 16:06:02 +08:00
|
|
|
FSM *cFSM = childFSM[0];
|
2024-01-30 15:50:34 +08:00
|
|
|
cFSM->vtbl.step(cFSM);
|
|
|
|
}
|
2024-01-30 16:06:02 +08:00
|
|
|
void B_duringAction(void *data, FSM **childFSM){
|
|
|
|
FSM_LOG(" duringB ");
|
2024-01-30 15:50:34 +08:00
|
|
|
|
2024-01-30 16:06:02 +08:00
|
|
|
FSM *cFSM = childFSM[0];
|
2024-01-30 15:50:34 +08:00
|
|
|
cFSM->vtbl.step(cFSM);
|
|
|
|
}
|
2024-01-30 16:06:02 +08:00
|
|
|
void B_exitAction(void *data, FSM **childFSM){
|
|
|
|
FSM *cFSM = childFSM[0];
|
2024-01-30 15:50:34 +08:00
|
|
|
cFSM->vtbl.reset(cFSM);
|
|
|
|
|
2024-01-30 16:06:02 +08:00
|
|
|
FSM_LOG(" exitB ");
|
2024-01-30 15:50:34 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void C_enterAction(){
|
2024-01-30 16:06:02 +08:00
|
|
|
FSM_LOG(" enterC ");
|
2024-01-30 15:50:34 +08:00
|
|
|
}
|
|
|
|
void C_duringAction(){
|
2024-01-30 16:06:02 +08:00
|
|
|
FSM_LOG(" duringC ");
|
2024-01-30 15:50:34 +08:00
|
|
|
}
|
|
|
|
void C_exitAction(){
|
2024-01-30 16:06:02 +08:00
|
|
|
FSM_LOG(" exitC ");
|
2024-01-30 15:50:34 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void setupHandler(FSMHandler* fcns){
|
|
|
|
|
2024-01-30 16:06:02 +08:00
|
|
|
addStateActionFcn(during, A);
|
|
|
|
addStateActionFcn(during, B);
|
|
|
|
addStateActionFcn(during, C);
|
|
|
|
addStateActionFcn(enter, A);
|
|
|
|
addStateActionFcn(enter, B);
|
|
|
|
addStateActionFcn(enter, C);
|
|
|
|
addStateActionFcn(exit, A);
|
|
|
|
addStateActionFcn(exit, B);
|
|
|
|
addStateActionFcn(exit, C);
|
2024-01-30 15:50:34 +08:00
|
|
|
|
2024-01-30 16:06:02 +08:00
|
|
|
addTransitionHandler(Idle, Start);
|
|
|
|
addTransitionHandler(A, A2B);
|
|
|
|
addTransitionHandler(B, B2A);
|
|
|
|
addTransitionHandler(B, B2C);
|
|
|
|
addTransitionHandler(C, C2A);
|
2024-01-30 15:50:34 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
用户自定义事件选择逻辑—————————————————begin
|
|
|
|
*/
|
|
|
|
Event peventArr[20] = {
|
|
|
|
Idle_Event,
|
|
|
|
Start,
|
|
|
|
A2B,
|
|
|
|
Idle_Event,
|
|
|
|
Idle_Event,
|
|
|
|
Idle_Event,
|
|
|
|
Idle_Event,
|
|
|
|
Idle_Event,
|
|
|
|
B2C,
|
|
|
|
C2A,
|
|
|
|
A2B,
|
|
|
|
B2A,
|
|
|
|
};
|
|
|
|
|
|
|
|
static Event selectEvent(ParentFSMData *data){
|
|
|
|
return peventArr[data->arrindex];
|
|
|
|
}
|
|
|
|
/*
|
|
|
|
用户自定义事件选择逻辑————————end
|
|
|
|
*/
|
|
|
|
|
2024-01-30 23:00:38 +08:00
|
|
|
static void printFSM(ParentFSM* pFSM){
|
2024-01-30 16:06:02 +08:00
|
|
|
FSM_LOG("\tParentFSM: ");
|
2024-01-30 15:50:34 +08:00
|
|
|
|
2024-01-30 16:06:02 +08:00
|
|
|
FSM_LOG("当前状态:%s, 当前事件:%s, 动作:", stateStr[pFSM->base.privateVars.curState], eventStr[pFSM->base.privateVars.curEvent]);
|
2024-01-30 15:50:34 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void step(ParentFSM* pFSM){
|
2024-01-30 23:00:38 +08:00
|
|
|
printFSM(pFSM);
|
2024-01-30 15:50:34 +08:00
|
|
|
stepBaseFSM(BASE_FSM(pFSM));
|
|
|
|
}
|
|
|
|
|
|
|
|
static void reset(ParentFSM* pFSM){
|
|
|
|
resetBaseFSM(BASE_FSM(pFSM));
|
2024-01-30 16:06:02 +08:00
|
|
|
FSM_LOG(" ParentFSM-reset");
|
2024-01-30 15:50:34 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void initData(ParentFSM *pFSM){
|
|
|
|
ParentFSMData *data = (ParentFSMData *)malloc(sizeof(ParentFSMData));
|
|
|
|
data->arrindex = 0;
|
|
|
|
|
|
|
|
pFSM->base.data = data;
|
|
|
|
}
|
|
|
|
|
2024-01-30 23:00:38 +08:00
|
|
|
static void initDataLoader(ParentFSM *pFSM){ // 必须重新实现
|
|
|
|
pFSM->base.privateVars.preloader.in = malloc(sizeof(ParentFSMData));
|
|
|
|
pFSM->base.privateVars.preloader.preloadSize = sizeof(ParentFSMData);
|
|
|
|
}
|
|
|
|
|
2024-01-30 15:50:34 +08:00
|
|
|
|
|
|
|
ParentFSM *createParentFSM(){
|
|
|
|
|
|
|
|
ParentFSM *pFSM;
|
|
|
|
pFSM = (ParentFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE);
|
|
|
|
|
2024-01-30 16:06:02 +08:00
|
|
|
pFSM->base.vtbl.step = step;
|
|
|
|
pFSM->base.vtbl.selectEvent = selectEvent;
|
|
|
|
pFSM->base.vtbl.initData = initData;
|
|
|
|
pFSM->base.vtbl.setupHandler = setupHandler;
|
2024-01-30 23:00:38 +08:00
|
|
|
pFSM->base.vtbl.initDataLoader = initDataLoader;
|
2024-01-30 15:50:34 +08:00
|
|
|
|
2024-01-30 23:00:38 +08:00
|
|
|
constructFSM((FSM *)pFSM);
|
2024-01-30 15:50:34 +08:00
|
|
|
return pFSM;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|