FSM/vscode/FSM_OOP/childtest/ParentFSM.c

155 lines
4.8 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.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "FSM_protected.h"
#include "parentFSM.h"
#include "parentFSM_private.h"
/* -------------------------------------------------------------------------- */
/* 纯虚函数允许调用privateVars */
/* -------------------------------------------------------------------------- */
/**
* @brief
* @deprecated 暂时没用后续考虑data是否需要加锁再说
* @param data 主要是外部数据
*/
static void loadExternalData(ParentFSMData *data){ // 必须重新实现
}
/**
* @brief 根据条件重置信号
* @details 清除被响应信号和所有小于被响应信号优先级的信号具体可以参考notion
* @param signals 状态机接收到的信号
* @param data 状态机数据
*/
static void resetSignals(FSMSignals *signals, ParentFSMData *data){ // 必须重新实现
clearAllSignals(signals);
}
/**
* @brief 给所有内部、外部数据分配堆空间
*
* @param pFSM
*/
static void initData(ParentFSM *pFSM){ // 必须重新实现
ParentFSMData *data = (ParentFSMData *)malloc(sizeof(ParentFSMData));
ParentFSMData tempData = {
.external = {
.arrindex = 0,
.x = 0,
},
.internal = {
.inner1 = 0,
.y1 = 0,
},
};
*data = tempData;
pFSM->base.data = data;
}
/**
* @brief
* @deprecated 弃用
* @param pFSM
*/
static void initDataLoader(ParentFSM *pFSM){ // 必须重新实现
// pFSM->base.privateVars->preloader.shadowData = malloc(sizeof(ParentFSMExternalData));
// pFSM->base.privateVars->preloader.size = sizeof(ParentFSMExternalData);
}
/**
* @brief 设置状态选择函数、状态内函数和状态转移函数
*
* @param fcns 状态机函数表
*/
static void setupHandler(FSMHandler* fcns){ // 必须重新实现
/* ------------------------------- 添加下一个状态选择函数 ------------------------------ */
addSelectNextStateFcn(Idle);
addSelectNextStateFcn(A);
addSelectNextStateFcn(B);
addSelectNextStateFcn(C);
/* ----------------------- 添加状态中事件action during exit ----------------------- */
addStateActionFcn(during, A);
addStateActionFcn(during, B);
addStateActionFcn(during, C);
addStateActionFcn(enter, A);
addStateActionFcn(enter, B);
addStateActionFcn(enter, C);
addStateActionFcn(exit, A);
addStateActionFcn(exit, B);
addStateActionFcn(exit, C);
/* --------------------------- 添加转移函数和转移函数对应的Delay -------------------------- */
addTransitionHandler(Idle, A);
addTransitionHandler(A, B);
addTransitionHandler(B, A);
addTransitionHandler(B, C);
addTransitionHandler(C, A);
fcns->transitionGeneralAction = (Avoid_WARNING_General_Handlers)transitionGeneralAction;
}
/* -------------------------------------------------------------------------- */
/* 其他重新实现的函数,父类已有实现,实现多态 */
/* -------------------------------------------------------------------------- */
/**
* @brief 重新实现基类的step函数添加一些打印信息
*
* @param pFSM 子类状态机指针
*/
static void step(ParentFSM* pFSM){
printFSM(pFSM);
stepBaseFSM(BASE_FSM(pFSM));
FSM_LOG("NextState:%s", stateStr[getFSMNextState((FSM *)pFSM)]);
}
/**
* @brief 绑定子状态机,需要自己实现逻辑
*
* @param pFSM 父状态机指针
* @param B_FSM B状态对应的子状态机的指针后续按照这种命名方式写
*/
void bind_ParentFSM_ChildFSMs(ParentFSM *pFSM, FSM *B_FSM){
registerChildFSM((FSM *)pFSM, B_FSM, B);
}
/* -------------------------------------------------------------------------- */
/* 子类构造函数 */
/* -------------------------------------------------------------------------- */
/**
* @brief Create a Parent FSM object
* @details 子类状态机细节对外隐藏,外部只能访问基类的公有函数来操作子类变量
* @return ParentFSM*
*/
ParentFSM *createParentFSM(){
ParentFSM *pFSM;
pFSM = (ParentFSM *)newBaseFSM(Count_State);
// 重新实现的函数
pFSM->base.publicFcns.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 = (Avoid_WARNING_loadData_Fcns)loadExternalData;
// 调用父类构造函数
constructFSM((FSM *)pFSM);
FSM_LOG("ok\n");
return pFSM;
}