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
|
|
|
|
|
{
|
2024-06-28 21:44:33 +08:00
|
|
|
|
Idle, /**< 必须在开头,并且枚举值=0,表示空状态 */
|
2024-06-26 20:21:14 +08:00
|
|
|
|
A,
|
|
|
|
|
B,
|
|
|
|
|
C,
|
|
|
|
|
|
|
|
|
|
Count_State, /**< 必须在结尾,用来统计状态数量 */
|
|
|
|
|
} State;
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------------------------------------- */
|
|
|
|
|
/* 下一个状态选择函数 */
|
|
|
|
|
/* -------------------------------------------------------------------------- */
|
|
|
|
|
|
|
|
|
|
|
2024-06-28 19:13:27 +08:00
|
|
|
|
static State selectNextStateFcn(Idle)(ParentFSMData *data, FSMSignals *signals){
|
|
|
|
|
return A;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static State selectNextStateFcn(A)(ParentFSMData *data, FSMSignals *signals){
|
2024-06-26 20:21:14 +08:00
|
|
|
|
if(getSignal(signals, Signal_toB)){
|
|
|
|
|
signals->lastTriggeredSignal = Signal_toB;
|
|
|
|
|
return B;
|
|
|
|
|
}
|
|
|
|
|
return Idle;
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-28 19:13:27 +08:00
|
|
|
|
static State selectNextStateFcn(B)(ParentFSMData *data, FSMSignals *signals){
|
2024-06-26 20:21:14 +08:00
|
|
|
|
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");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------------------------------------- */
|
|
|
|
|
/* 转移函数 */
|
|
|
|
|
/* -------------------------------------------------------------------------- */
|
2024-06-28 21:44:33 +08:00
|
|
|
|
static void transitionGeneralAction(ParentFSMData *data){
|
|
|
|
|
FSM_LOG("general");
|
2024-06-26 20:21:14 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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)]);
|
|
|
|
|
}
|