FSM/vscode/FSM_OOP/template/templateFSM.c

93 lines
2.2 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include "FSM_protected.h"
#include "templateFSM.h"
#include "templateFSM_private.h"
/*
重载函数,有些是纯虚的必须重新实现,有些可以不重新实现直接用父类的
*/
static 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(TemplateFSMData *data){ // 必须重新实现
return ceventArr[data->in.arrindex];
}
static void step(TemplateFSM* pFSM){
printFSM(pFSM);
stepBaseFSM(BASE_FSM(pFSM));
}
static void initData(TemplateFSM *pFSM){ // 必须重新实现
TemplateFSMData *data = (TemplateFSMData *)malloc(sizeof(TemplateFSMData));
TemplateFSMData tempData = {
.in = {
.arrindex = 0,
.x = 0,
},
.inner1 = 0,
.y1 = 0,
};
*data = tempData;
pFSM->base.data = data;
}
static void initDataLoader(TemplateFSM *pFSM){ // 必须重新实现
pFSM->base.privateVars.preloader.in = malloc(sizeof(TemplateFSMIn));
pFSM->base.privateVars.preloader.preloadSize = sizeof(TemplateFSMIn);
}
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
addStateActionFcn(during, E);
addStateActionFcn(during, D);
addStateActionFcn(enter, E);
addStateActionFcn(enter, D);
addStateActionFcn(exit, E);
addStateActionFcn(exit, D);
addTransitionHandler(Idle, Idle2D);
addTransitionHandler(Idle, Idle2E);
addTransitionHandler(D, D2E);
addTransitionHandler(E, E2D);
addDelayHandler(Idle2D);
}
/*
唯一外界调用的函数
*/
TemplateFSM *createTemplateFSM(){
TemplateFSM *pFSM;
pFSM = (TemplateFSM *)newBaseFSM(Count_State, Count_Event, DEFAULT_STATE);
pFSM->base.vtbl.step = (Avoid_WARNING_Overrider_Fcns)step;
pFSM->base.vtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData;
pFSM->base.vtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader;
pFSM->base.vtbl.selectEvent = (Avoid_WARNING_SelectEvent)selectEvent;
pFSM->base.vtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;
constructFSM((FSM *)pFSM);
return pFSM;
}