FSM/vscode/FSM_OOP/template/templateFSM.c

111 lines
3.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* @Author: godcreator02 qq974980621@gmail.com
* @Date: 2024-04-20 20:08:03
* @LastEditors: godcreator02 qq974980621@gmail.com
* @LastEditTime: 2024-04-20 21:05:34
* @FilePath: \vscode\FSM_OOP\template\templateFSM.c
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "FSM_protected.h"
#include "templateFSM.h"
#include "templateFSM_private.h"
/*
重载函数,有些是纯虚的必须重新实现,有些可以不重新实现直接用父类的
*/
static void step(TemplateFSM* pFSM){
printFSM(pFSM);
stepBaseFSM(BASE_FSM(pFSM));
FSM_LOG("下次状态:%s", stateStr[getFSMNextState((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 initSignals(TemplateFSM *pFSM){
TemplateFSMSignals *signals = (TemplateFSMSignals *)malloc(sizeof(TemplateFSMSignals));
TemplateFSMSignals tempSignals = {
.signalA = 0,
.signalB = 0,
};
*signals = tempSignals;
pFSM->base.signals = signals;
}
static void resetSignals(TemplateFSM *pFSM){
memset(pFSM->base.signals, 0, sizeof(TemplateFSMSignals));
}
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){ // 必须重新实现
/* ------------------------------- 添加下一个状态选择函数 ------------------------------ */
addSelectNextStateFcn(D);
addSelectNextStateFcn(E);
/* ----------------------- 添加状态中事件action during exit ----------------------- */
addStateActionFcn(during, E);
addStateActionFcn(during, D);
addStateActionFcn(enter, E);
addStateActionFcn(enter, D);
addStateActionFcn(exit, E);
addStateActionFcn(exit, D);
/* --------------------------- 添加转移函数和转移函数对应的Delay -------------------------- */
addTransitionHandler(Idle, D);
addTransitionHandler(Idle, E);
addTransitionHandler(D, E);
addTransitionHandler(E, D);
addDelayHandler(D, E);
fcns->transitionGeneralAction = &transitionGeneralAction;
}
/*
唯一外界调用的函数
*/
TemplateFSM *createTemplateFSM(){
TemplateFSM *pFSM;
pFSM = (TemplateFSM *)newBaseFSM(Count_State, 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.initSignals = (Avoid_WARNING_Overrider_Fcns)initSignals;
pFSM->base.vtbl.resetSignals = (Avoid_WARNING_Overrider_Fcns)resetSignals;
pFSM->base.vtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;
constructFSM((FSM *)pFSM);
return pFSM;
}