FSM/vscode/FSM_OOP/template/templateFSM.c

119 lines
4.0 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-24 13:15:26
* @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"
/* -------------------------------------------------------------------------- */
/* 纯虚函数允许调用privateVars */
/* -------------------------------------------------------------------------- */
static void loadExternalData(TemplateFSMExternalData *extData){ // 必须重新实现
extData->arrindex = arrindex;
extData->x = x;
}
static void resetSignals(FSMSignals *signals){ // 必须重新实现
switch (signals->lastTriggeredSignal)
{
case Signal_A:
clearSignal(signals, Signal_A);
break;
default:
break;
}
}
static void initData(TemplateFSM *pFSM){ // 必须重新实现
TemplateFSMData *data = (TemplateFSMData *)malloc(sizeof(TemplateFSMData));
TemplateFSMData tempData = {
.external = {
.arrindex = 0,
.x = 0,
},
.internal = {
.inner1 = 0,
.y1 = 0,
},
};
*data = tempData;
pFSM->base.data = data;
}
static void initDataLoader(TemplateFSM *pFSM){ // 必须重新实现
pFSM->base.privateVars.preloader.shadowData = malloc(sizeof(TemplateFSMExternalData));
pFSM->base.privateVars.preloader.size = sizeof(TemplateFSMExternalData);
}
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);
fcns->transitionGeneralAction = (Avoid_WARNING_General_Handlers)transitionGeneralAction;
}
/* -------------------------------------------------------------------------- */
/* 其他重新实现的函数,父类已有实现,实现多态 */
/* -------------------------------------------------------------------------- */
static void step(TemplateFSM* pFSM){
printFSM(pFSM);
stepBaseFSM(BASE_FSM(pFSM));
FSM_LOG("下次状态:%s", stateStr[getFSMNextState((FSM *)pFSM)]);
}
/* -------------------------------------------------------------------------- */
/* 子类构造函数 */
/* -------------------------------------------------------------------------- */
TemplateFSM *createTemplateFSM(){
TemplateFSM *pFSM;
pFSM = (TemplateFSM *)newBaseFSM(Count_State, DEFAULT_STATE);
// 重新实现的函数
pFSM->base.step = (Avoid_WARNING_Overrider_Fcns)step;
pFSM->base.pureVtbl.initData = (Avoid_WARNING_Overrider_Fcns)initData;
pFSM->base.pureVtbl.initDataLoader = (Avoid_WARNING_Overrider_Fcns)initDataLoader;
pFSM->base.pureVtbl.setupHandler = (Avoid_WARNING_void_fcns)setupHandler;
pFSM->base.pureVtbl.resetSignals = (Avoid_WARNING_ResetSignals_Fcns)resetSignals;
pFSM->base.pureVtbl.loadExternalData = loadExternalData;
// 调用父类构造函数
constructFSM((FSM *)pFSM);
return pFSM;
}