FSM/vscode/FSM_OOP/template/templateFSM_private.h

164 lines
4.3 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.

/**
* @file templateFSM_private.h
* @author 天神 (dalaoshi@stu.xjtu.edu.cn)
* @brief 用来声明状态、状态函数等。这个文件只能被templateFSM.c引用一次
* @version 2.1
* @date 2024-05-07
*
* @copyright 天神创意无限公司 2024
*
*/
#ifdef __TEMPLATE_PRIVATE_FSM_H_
#error This file can only be included once!!!
#else
#define __TEMPLATE_PRIVATE_FSM_H_
#include "FSM_protected.h"
#include "templateFSM.h"
#include <stdio.h>
/* -------------------------------------------------------------------------- */
/* 用到的外部变量 */
/* -------------------------------------------------------------------------- */
extern int arrindex;
extern int x;
/* -------------------------------------------------------------------------- */
/* 继承基类 */
/* -------------------------------------------------------------------------- */
typedef struct TemplateFSM
{
FSM base;
}TemplateFSM;
/* -------------------------------------------------------------------------- */
/* 状态定义 */
/* -------------------------------------------------------------------------- */
/**
* @brief 状态机内状态定义Idle和Count_State必须占据开头和结尾两个位置
*
*/
typedef enum _State
{
Idle, /**< 必须在开头,并且枚举值=0 */
D,
E,
Count_State, /**< 必须在结尾,用来统计状态数量 */
} State;
#define DEFAULT_STATE E /**< 默认状态Idle状态会先跳转到默认状态 */
/* -------------------------------------------------------------------------- */
/* 下一个状态选择函数 */
/* -------------------------------------------------------------------------- */
static State selectNextStateFcn(D)(TemplateFSMData *data, FSMSignals *signals){
if(getSignal(signals, Signal_A)){
signals->lastTriggeredSignal = Signal_A;
return E;
}
else if(arrindex == 0){
return E;
}
return Idle;
}
static State selectNextStateFcn(E)(TemplateFSMData *data, FSMSignals *signals){
if(getSignal(signals, Signal_A)){
signals->lastTriggeredSignal = Signal_A;
return D;
}
else if(x == 0){
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)(TemplateFSMData *data, int *delayedIndex)
{
*delayedIndex = index(D, E);
FSM_LOG(" D2E ");
}
static void transitionHandler(E, D)()
{
FSM_LOG(" E2D ");
}
/* -------------------------------------------------------------------------- */
/* 打印调试 */
/* -------------------------------------------------------------------------- */
const static char *stateStr[] = {
"Idle",
"D",
"E",
};
static void printFSM(TemplateFSM* pFSM){
FSM_LOG(" \tTemplateFSM: ");
FSM_LOG("预装载器溢出:%d, 当前状态:%s, 动作:", _getPreloaderOverFlag((FSM *)pFSM), stateStr[getFSMCurState((FSM *)pFSM)]);
}
#endif