FSM/vscode/FSM_OOP/childtest/ParentFSM_private.h

167 lines
4.1 KiB
C
Raw Normal View History

2024-06-26 20:21:14 +08:00
#ifdef __PARENTFSM_PRIVATE_FSM_H_
#error This file can only be included once!!!
#else
#define __PARENTFSM_PRIVATE_FSM_H_
#endif
#include "FSM_protected.h"
#include "parentFSM.h"
#include <stdio.h>
/* -------------------------------------------------------------------------- */
/* 继承基类 */
/* -------------------------------------------------------------------------- */
typedef struct ParentFSM
{
FSM base;
}ParentFSM;
/* -------------------------------------------------------------------------- */
/* 状态定义 */
/* -------------------------------------------------------------------------- */
/**
* @brief Idle和Count_State必须占据开头和结尾两个位置
*
*/
typedef enum _State
{
Idle, /**< 必须在开头,并且枚举值=0 */
A,
B,
C,
Count_State, /**< 必须在结尾,用来统计状态数量 */
} State;
#define DEFAULT_STATE A /**< 默认状态Idle状态会先跳转到默认状态 */
/* -------------------------------------------------------------------------- */
/* 下一个状态选择函数 */
/* -------------------------------------------------------------------------- */
static State selectNextStateFcn(A)(ParentFSM *data, FSMSignals *signals){
if(getSignal(signals, Signal_toB)){
signals->lastTriggeredSignal = Signal_toB;
return B;
}
return Idle;
}
static State selectNextStateFcn(B)(ParentFSM *data, FSMSignals *signals){
if(getSignal(signals, Signal_toA)){
signals->lastTriggeredSignal = Signal_toA;
return A;
}
else if(getSignal(signals, Signal_toC)){
signals->lastTriggeredSignal = Signal_toC;
return C;
}
return Idle;
}
static State selectNextStateFcn(C)(ParentFSM *data, FSMSignals *signals){
if(getSignal(signals, Signal_toA)){
signals->lastTriggeredSignal = Signal_toA;
return A;
}
return Idle;
}
/* -------------------------------------------------------------------------- */
/* 对应的 action, exit, during 函数 */
/* -------------------------------------------------------------------------- */
static void actionFcn(enter, A)()
{
FSM_LOG(" enterA ");
}
static void actionFcn(during, A)()
{
FSM_LOG(" duringA ");
}
static void actionFcn(exit, A)()
{
FSM_LOG(" exitA ");
}
static void actionFcn(enter, B)()
{
FSM_LOG(" enterB ");
}
static void actionFcn(during, B)()
{
FSM_LOG(" duringB ");
}
static void actionFcn(exit, B)()
{
FSM_LOG(" exitB ");
}
static void actionFcn(enter, C)()
{
FSM_LOG(" enterC ");
}
static void actionFcn(during, C)()
{
FSM_LOG(" duringC ");
}
static void actionFcn(exit, C)()
{
FSM_LOG(" exitC");
}
/* -------------------------------------------------------------------------- */
/* 转移函数 */
/* -------------------------------------------------------------------------- */
static void transitionGeneralAction(FSM pFSM){
// FSM_LOG("general");
}
// static void transitionGeneralAction(TemplateFSMData *data){
// FSM_LOG("general");
// }
static void transitionHandler(Idle, A)()
{
FSM_LOG(" Idle2A ");
}
static void transitionHandler(A, B)()
{
FSM_LOG(" A2B ");
}
static void transitionHandler(B, A)()
{
FSM_LOG(" B2A ");
}
static void transitionHandler(B, C)()
{
FSM_LOG(" B2C ");
}
static void transitionHandler(C, A)()
{
FSM_LOG(" C2A ");
}
/* -------------------------------------------------------------------------- */
/* 打印调试 */
/* -------------------------------------------------------------------------- */
const static char *stateStr[] = {
"Idle",
"A",
"B",
"C",
};
static void printFSM(ParentFSM* pFSM){
FSM_LOG(" \tParent: ");
FSM_LOG("当前状态:%s, 动作:", stateStr[getFSMCurState((FSM *)pFSM)]);
}