138 lines
3.6 KiB
C
138 lines
3.6 KiB
C
#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)]);
|
||
}
|