FSM/vscode/FSM_OOP/childtest/ParentFSM.c

213 lines
3.7 KiB
C
Raw Normal View History

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
*/
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){
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;
}
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.selectNextState = selectEvent;
2024-01-30 16:06:02 +08:00
pFSM->base.vtbl.initData = initData;
pFSM->base.vtbl.setupHandler = setupHandler;
pFSM->base.vtbl.initDataLoader = initDataLoader;
2024-01-30 15:50:34 +08:00
constructFSM((FSM *)pFSM);
2024-01-30 15:50:34 +08:00
return pFSM;
}