2024-05-07 16:45:57 +08:00
|
|
|
|
/**
|
|
|
|
|
* @file templateFSM_private.h
|
|
|
|
|
* @author 天神 (dalaoshi@stu.xjtu.edu.cn)
|
|
|
|
|
* @brief 用来声明状态、状态函数等。这个文件只能被templateFSM.c引用一次!
|
|
|
|
|
* @version 2.1
|
|
|
|
|
* @date 2024-05-07
|
|
|
|
|
*
|
|
|
|
|
* @copyright 天神创意无限公司 2024
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
|
2024-04-24 13:18:59 +08:00
|
|
|
|
#ifdef __TEMPLATE_PRIVATE_FSM_H_
|
2024-05-07 15:46:51 +08:00
|
|
|
|
#error This file can only be included once!!!
|
2024-04-24 13:18:59 +08:00
|
|
|
|
|
|
|
|
|
#else
|
2024-01-23 20:05:30 +08:00
|
|
|
|
#define __TEMPLATE_PRIVATE_FSM_H_
|
|
|
|
|
|
|
|
|
|
#include "FSM_protected.h"
|
|
|
|
|
#include "templateFSM.h"
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
2024-04-24 13:18:59 +08:00
|
|
|
|
/* -------------------------------------------------------------------------- */
|
|
|
|
|
/* 用到的外部变量 */
|
|
|
|
|
/* -------------------------------------------------------------------------- */
|
|
|
|
|
extern int arrindex;
|
|
|
|
|
extern int x;
|
2024-01-23 20:05:30 +08:00
|
|
|
|
|
2024-04-23 19:35:16 +08:00
|
|
|
|
|
|
|
|
|
/* -------------------------------------------------------------------------- */
|
|
|
|
|
/* 继承基类 */
|
|
|
|
|
/* -------------------------------------------------------------------------- */
|
2024-05-07 15:58:38 +08:00
|
|
|
|
typedef struct TemplateFSM
|
2024-01-23 20:05:30 +08:00
|
|
|
|
{
|
|
|
|
|
FSM base;
|
|
|
|
|
}TemplateFSM;
|
|
|
|
|
|
2024-04-20 20:05:33 +08:00
|
|
|
|
/* -------------------------------------------------------------------------- */
|
2024-04-23 19:35:16 +08:00
|
|
|
|
/* 状态定义 */
|
2024-04-20 20:05:33 +08:00
|
|
|
|
/* -------------------------------------------------------------------------- */
|
2024-05-07 16:45:57 +08:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 状态机内状态定义,Idle和Count_State必须占据开头和结尾两个位置
|
|
|
|
|
*
|
|
|
|
|
*/
|
2024-01-23 20:05:30 +08:00
|
|
|
|
typedef enum _State
|
|
|
|
|
{
|
2024-05-07 16:45:57 +08:00
|
|
|
|
Idle, /**< 必须在开头,并且枚举值=0 */
|
2024-01-23 20:05:30 +08:00
|
|
|
|
D,
|
|
|
|
|
E,
|
|
|
|
|
|
2024-05-07 16:45:57 +08:00
|
|
|
|
Count_State, /**< 必须在结尾,用来统计状态数量 */
|
2024-01-23 20:05:30 +08:00
|
|
|
|
} State;
|
2024-06-28 17:43:17 +08:00
|
|
|
|
|
2024-01-23 20:05:30 +08:00
|
|
|
|
|
2024-04-20 20:05:33 +08:00
|
|
|
|
/* -------------------------------------------------------------------------- */
|
|
|
|
|
/* 下一个状态选择函数 */
|
|
|
|
|
/* -------------------------------------------------------------------------- */
|
2024-05-07 15:46:51 +08:00
|
|
|
|
|
2024-06-28 17:43:17 +08:00
|
|
|
|
static State selectNextStateFcn(Idle)(TemplateFSMData *data, FSMSignals *signals){
|
|
|
|
|
return E;
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-07 15:46:51 +08:00
|
|
|
|
|
2024-04-23 22:09:53 +08:00
|
|
|
|
static State selectNextStateFcn(D)(TemplateFSMData *data, FSMSignals *signals){
|
|
|
|
|
if(getSignal(signals, Signal_A)){
|
|
|
|
|
signals->lastTriggeredSignal = Signal_A;
|
2024-04-20 21:16:26 +08:00
|
|
|
|
return E;
|
|
|
|
|
}
|
2024-04-24 13:18:59 +08:00
|
|
|
|
else if(arrindex == 0){
|
|
|
|
|
return E;
|
|
|
|
|
}
|
2024-04-20 21:16:26 +08:00
|
|
|
|
return Idle;
|
2024-04-20 20:05:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-04-23 22:09:53 +08:00
|
|
|
|
static State selectNextStateFcn(E)(TemplateFSMData *data, FSMSignals *signals){
|
|
|
|
|
if(getSignal(signals, Signal_A)){
|
|
|
|
|
signals->lastTriggeredSignal = Signal_A;
|
2024-04-20 21:16:26 +08:00
|
|
|
|
return D;
|
|
|
|
|
}
|
2024-04-24 13:18:59 +08:00
|
|
|
|
else if(x == 0){
|
|
|
|
|
return D;
|
|
|
|
|
}
|
2024-04-20 21:16:26 +08:00
|
|
|
|
return Idle;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2024-04-20 20:05:33 +08:00
|
|
|
|
|
|
|
|
|
/* -------------------------------------------------------------------------- */
|
|
|
|
|
/* 对应的 action, exit, during 函数 */
|
|
|
|
|
/* -------------------------------------------------------------------------- */
|
2024-01-23 20:05:30 +08:00
|
|
|
|
static void actionFcn(enter, D)()
|
|
|
|
|
{
|
2024-01-30 23:00:38 +08:00
|
|
|
|
FSM_LOG(" enterD ");
|
2024-01-23 20:05:30 +08:00
|
|
|
|
}
|
|
|
|
|
static void actionFcn(during, D)()
|
|
|
|
|
{
|
2024-01-30 23:00:38 +08:00
|
|
|
|
FSM_LOG(" duringD ");
|
2024-01-23 20:05:30 +08:00
|
|
|
|
}
|
|
|
|
|
static void actionFcn(exit, D)()
|
|
|
|
|
{
|
2024-01-30 23:00:38 +08:00
|
|
|
|
FSM_LOG(" exitD ");
|
2024-01-23 20:05:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void actionFcn(enter, E)()
|
|
|
|
|
{
|
2024-01-30 23:00:38 +08:00
|
|
|
|
FSM_LOG(" enterE ");
|
2024-01-23 20:05:30 +08:00
|
|
|
|
}
|
|
|
|
|
static void actionFcn(during, E)()
|
|
|
|
|
{
|
2024-01-30 23:00:38 +08:00
|
|
|
|
FSM_LOG(" duringE ");
|
2024-01-23 20:05:30 +08:00
|
|
|
|
}
|
|
|
|
|
static void actionFcn(exit, E)()
|
|
|
|
|
{
|
2024-01-30 23:00:38 +08:00
|
|
|
|
FSM_LOG(" exitE ");
|
2024-01-23 20:05:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-04-20 20:05:33 +08:00
|
|
|
|
/* -------------------------------------------------------------------------- */
|
|
|
|
|
/* 转移函数 */
|
|
|
|
|
/* -------------------------------------------------------------------------- */
|
2024-05-07 15:46:51 +08:00
|
|
|
|
static void transitionGeneralAction(FSM pFSM){
|
2024-04-20 21:16:26 +08:00
|
|
|
|
FSM_LOG("general");
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-07 15:46:51 +08:00
|
|
|
|
// static void transitionGeneralAction(TemplateFSMData *data){
|
|
|
|
|
// FSM_LOG("general");
|
|
|
|
|
// }
|
|
|
|
|
|
2024-04-20 20:05:33 +08:00
|
|
|
|
static void transitionHandler(Idle, D)()
|
2024-01-23 20:05:30 +08:00
|
|
|
|
{
|
2024-01-30 23:00:38 +08:00
|
|
|
|
FSM_LOG(" Idle2D ");
|
2024-01-23 20:05:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-05-07 15:46:51 +08:00
|
|
|
|
static void transitionHandler(Idle, E)()
|
2024-01-23 20:05:30 +08:00
|
|
|
|
{
|
2024-01-30 23:00:38 +08:00
|
|
|
|
FSM_LOG(" Idle2E ");
|
2024-01-23 20:05:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-05-07 15:46:51 +08:00
|
|
|
|
static void transitionHandler(D, E)(TemplateFSMData *data, int *delayedIndex)
|
2024-01-23 20:05:30 +08:00
|
|
|
|
{
|
2024-04-20 21:16:26 +08:00
|
|
|
|
*delayedIndex = index(D, E);
|
2024-01-30 23:00:38 +08:00
|
|
|
|
FSM_LOG(" D2E ");
|
2024-01-23 20:05:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-05-07 15:46:51 +08:00
|
|
|
|
static void transitionHandler(E, D)()
|
2024-01-23 20:05:30 +08:00
|
|
|
|
{
|
2024-01-30 23:00:38 +08:00
|
|
|
|
FSM_LOG(" E2D ");
|
2024-01-23 20:05:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2024-04-23 19:35:16 +08:00
|
|
|
|
/* -------------------------------------------------------------------------- */
|
|
|
|
|
/* 打印调试 */
|
|
|
|
|
/* -------------------------------------------------------------------------- */
|
2024-01-23 20:05:30 +08:00
|
|
|
|
const static char *stateStr[] = {
|
|
|
|
|
"Idle",
|
|
|
|
|
"D",
|
|
|
|
|
"E",
|
|
|
|
|
};
|
2024-04-20 20:05:33 +08:00
|
|
|
|
|
2024-01-23 20:05:30 +08:00
|
|
|
|
static void printFSM(TemplateFSM* pFSM){
|
2024-04-19 13:07:09 +08:00
|
|
|
|
FSM_LOG(" \tTemplateFSM: ");
|
2024-04-20 21:16:26 +08:00
|
|
|
|
FSM_LOG("预装载器溢出:%d, 当前状态:%s, 动作:", _getPreloaderOverFlag((FSM *)pFSM), stateStr[getFSMCurState((FSM *)pFSM)]);
|
2024-01-23 20:05:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|