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);
|
|
|
|
|
stepBaseFSM(BASE_FSM(pFSM));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
2024-01-30 23:00:38 +08:00
|
|
|
|
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);
|
|
|
|
|
|
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;
|
|
|
|
|
}
|