FSM/vscode/FSM_OOP/childtest/childFSM.c

83 lines
2.0 KiB
C
Raw Normal View History

2024-01-30 15:50:34 +08:00
#include <stdio.h>
#include <stdlib.h>
#include "FSM_protected.h"
#include "childFSM.h"
#include "childFSM_private.h"
/*
*/
Event ceventArr[20] = {
Idle_Event,
Idle_Event,
Idle2D,
Idle_Event,
Idle_Event,
D2E,
E2D,
D2E,
Idle_Event,
Idle_Event,
Idle_Event,
Idle_Event,
};
static Event selectEvent(ChildFSMData *data){ // 必须重新实现
return ceventArr[data->arrindex];
}
static void step(ChildFSM* pFSM){
printFSM(pFSM);
_stepFSM(BASE_FSM(pFSM));
2024-01-30 15:50:34 +08:00
}
static void initData(ChildFSM *pFSM){ // 必须重新实现
ChildFSMData *data = (ChildFSMData *)malloc(sizeof(ChildFSMData));
data->arrindex = 0;
2024-01-30 16:06:02 +08:00
pFSM->base.privateVars.preloader.in = malloc(sizeof(ChildFSMData));
pFSM->base.privateVars.preloader.preloadSize = sizeof(ChildFSMData);
2024-01-30 15:50:34 +08:00
pFSM->base.data = data;
}
static void initDataLoader(ChildFSM *pFSM){ // 必须重新实现
pFSM->base.privateVars.preloader.in = malloc(sizeof(ChildFSMData));
pFSM->base.privateVars.preloader.preloadSize = sizeof(ChildFSMData);
}
2024-01-30 15:50:34 +08:00
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
2024-01-30 16:06:02 +08:00
addStateActionFcn(during, E);
addStateActionFcn(during, D);
addStateActionFcn(enter, D);
addStateActionFcn(exit, D);
addStateActionFcn(enter, E);
addStateActionFcn(exit, E);
2024-01-30 15:50:34 +08:00
2024-01-30 16:06:02 +08:00
addTransitionHandler(Idle, Idle2D);
addTransitionHandler(Idle, Idle2E);
addTransitionHandler(D, D2E);
addTransitionHandler(E, E2D);
2024-01-30 15:50:34 +08:00
}
/*
*/
ChildFSM *createChildFSM(){
ChildFSM *pFSM;
pFSM = (ChildFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE);
pFSM->base.pureVtbl.step = step;
pFSM->base.pureVtbl.selectNextState = selectEvent;
pFSM->base.pureVtbl.initData = initData;
pFSM->base.pureVtbl.setupHandler = setupHandler;
pFSM->base.pureVtbl.initDataLoader = initDataLoader;
2024-01-30 15:50:34 +08:00
constructFSM((FSM *)pFSM);
2024-01-30 15:50:34 +08:00
return pFSM;
}