FSM/vscode/FSM_OOP/childtest/childFSM_private.h

138 lines
3.6 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.

#ifdef __CHILDFSM_PRIVATE_FSM_H_
#error This file can only be included once!!!
#else
#define __CHILDFSM_PRIVATE_FSM_H_
#endif
#include "FSM_protected.h"
#include "childFSM.h"
#include <stdio.h>
/* -------------------------------------------------------------------------- */
/* 继承基类 */
/* -------------------------------------------------------------------------- */
typedef struct ChildFSM
{
FSM base;
}ChildFSM;
/* -------------------------------------------------------------------------- */
/* 状态定义 */
/* -------------------------------------------------------------------------- */
/**
* @brief 状态机内状态定义Idle和Count_State必须占据开头和结尾两个位置
*
*/
typedef enum _State
{
Idle, /**< 必须在开头,并且枚举值=0 */
D,
E,
Count_State, /**< 必须在结尾,用来统计状态数量 */
} State;
/* -------------------------------------------------------------------------- */
/* 下一个状态选择函数 */
/* -------------------------------------------------------------------------- */
static State selectNextStateFcn(Idle)(ChildFSMData *data, FSMSignals *signals){
if(data->external.x == 1)
return D;
else
return E;
}
static State selectNextStateFcn(D)(ChildFSMData *data, FSMSignals *signals){
if(getSignal(signals, Signal_toE)){
signals->lastTriggeredSignal = Signal_toE;
return E;
}
return Idle;
}
static State selectNextStateFcn(E)(ChildFSMData *data, FSMSignals *signals){
if(getSignal(signals, Signal_toD)){
signals->lastTriggeredSignal = Signal_toD;
return D;
}
return Idle;
}
/* -------------------------------------------------------------------------- */
/* 对应的 action, exit, during 函数 */
/* -------------------------------------------------------------------------- */
static void actionFcn(enter, D)()
{
FSM_LOG(" enterD ");
}
static void actionFcn(during, D)()
{
FSM_LOG(" duringD ");
}
static void actionFcn(exit, D)()
{
FSM_LOG(" exitD ");
}
static void actionFcn(enter, E)()
{
FSM_LOG(" enterE ");
}
static void actionFcn(during, E)()
{
FSM_LOG(" duringE ");
}
static void actionFcn(exit, E)()
{
FSM_LOG(" exitE ");
}
/* -------------------------------------------------------------------------- */
/* 转移函数 */
/* -------------------------------------------------------------------------- */
static void transitionGeneralAction(FSM pFSM){
// FSM_LOG("general");
}
// static void transitionGeneralAction(TemplateFSMData *data){
// FSM_LOG("general");
// }
static void transitionHandler(Idle, D)()
{
FSM_LOG(" Idle2D ");
}
static void transitionHandler(Idle, E)()
{
FSM_LOG(" Idle2E ");
}
static void transitionHandler(D, E)()
{
FSM_LOG(" D2E ");
}
static void transitionHandler(E, D)()
{
FSM_LOG(" E2D ");
}
/* -------------------------------------------------------------------------- */
/* 打印调试 */
/* -------------------------------------------------------------------------- */
const static char *stateStr[] = {
"Idle",
"D",
"E",
};
static void printFSM(ChildFSM* pFSM){
FSM_LOG(" \tChild: ");
FSM_LOG("CurrentState:%s, Action", stateStr[getFSMCurState((FSM *)pFSM)]);
}