chen
2025-05-15 67ca69985af9109a0603a1cde71f21b940c059ff
keil/include/components/hido/Include/HIDO_FSM.h
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,206 @@
/*******************************************************************************
 * File Name         : PointTable.h
 * Description       :
 * Created on        : 2019å¹´5月12日
 * Author            : www.hido-studio.com
 *******************************************************************************/
#ifndef _HIDO_FSM_H_
#define _HIDO_FSM_H_
/*******************************************************************************
 *                              Include Files                                  *
 *******************************************************************************/
#include "HIDO_TypeDef.h"
#include "stdarg.h"
/*******************************************************************************
 *                                  Macro                                      *
 *******************************************************************************/
#define HIDO_FSM_DECLARE(name) \
    extern HIDO_FSMStruct g_stFSM##name                                         /* å£°æ˜Žä¸€ä¸ªçŠ¶æ€æœº */
#define HIDO_FSM_STATE_EXTERN(name) \
    extern const HIDO_StateStruct g_stState##name                               /* å£°æ˜Žä¸€ä¸ªçŠ¶æ€ */
#define HIDO_FSM_DECLARE_IMPLEMENT(name) \
    HIDO_FSMStruct g_stFSM##name = { HIDO_NULL };                               /* å®žçŽ°ä¸€ä¸ªçŠ¶æ€æœº */
#define HIDO_FSM_STATE_DECLARE(name) \
    extern const HIDO_StateStruct g_stState##name; \
    HIDO_INT32 name##Proc(HIDO_FSMStruct *_pstFSM, HIDO_UINT32 _u32Event, void *_pArg);
                                                                                /* å£°æ˜ŽçŠ¶æ€æœºçš„ä¸€ä¸ªçŠ¶æ€,[name]状态的名字 */
#define HIDO_FSM_DETACHED_STATE(name) \
    extern HIDO_StateStruct g_stState##name; \
    HIDO_INT32 name##Proc(HIDO_FSMStruct *_pstFSM, HIDO_UINT32 _u32Event, void *_pArg);
                                                                                /* å£°æ˜ŽçŠ¶æ€æœºçš„ä¸€ä¸ªçŠ¶æ€,[name]状态的名字 */
#define HIDO_FSM_STATE_FULL_DECLARE(parent, name) HIDO_FSM_STATE_DECLARE(name)
#define HIDO_FSM_STATE_IMPLEMENT(name, parent, init) \
    const HIDO_StateStruct g_stState##name = { #name, parent, init, name##Proc }; \
    HIDO_INT32 name##Proc(HIDO_FSMStruct *_pstFSM, HIDO_UINT32 _u32Event, void *_pArg)
                                                                                /* å®žçŽ°ä¸€ä¸ªçŠ¶æ€ */
#define HIDO_FSM_DETACHED_STATE_IMPLEMENT(name, parent, init) \
    HIDO_StateStruct g_stState##name = { #name, parent, init, name##Proc }; \
    HIDO_INT32 name##Proc(HIDO_FSMStruct *_pstFSM, HIDO_UINT32 _u32Event, void *_pArg)
                                                                                /* å®žçŽ°ä¸€ä¸ªçŠ¶æ€ */
#define HIDO_FSM_DETACHED_STATE_SETTLE(name, parent, init) \
    g_stState##name.m_pstParent = (parent);\
    g_stState##name.m_pstInit = (init);
                                                                                /* åŠ¨æ€ä¿®æ”¹çŠ¶æ€çš„å…³è”å…³ç³»ï¼Œä¿®æ”¹å®ƒçš„å¤«çŠ¶æ€å’Œå­çŠ¶æ€ */
#define HIDO_FSM(name) (&g_stFSM##name)
#define HIDO_FSM_STATE(name) (&g_stState##name)
#define HIDO_EVENT_ENTRY                                          0             /* è¿›å…¥çŠ¶æ€çš„äº‹ä»¶ */
#define HIDO_EVENT_EXIT                                           1             /* é€€å‡ºçŠ¶æ€çš„äº‹ä»¶ */
#define HIDO_EVENT_ENTRY_NAME                                     "EVENT_ENTRY" /* è¿›å…¥çŠ¶æ€çš„äº‹ä»¶åå­— */
#define HIDO_EVENT_EXIT_NAME                                      "EVENT_EXIT"  /* é€€å‡ºçŠ¶æ€çš„äº‹ä»¶åå­— */
#define HIDO_EVENT_OK                                             0             /* äº‹ä»¶æ‰§è¡ŒOK */
#define HIDO_EVENT_NO_PROC                                        1             /* å½“前状态不能处理目标事件,需要由父状态完成 */
#define HIDO_STATE_MAX_DEPTH                                      10            /* çŠ¶æ€æœºçŠ¶æ€åµŒå¥—çš„æœ€å¤§æ·±åº¦ */
/*******************************************************************************
 *                             Type Definition                                 *
 *******************************************************************************/
typedef struct HIDO_StateStruct HIDO_StateStruct;
typedef struct HIDO_StateListStruct HIDO_StateListStruct;
typedef struct HIDO_FSMStruct HIDO_FSMStruct;
typedef struct HIDO_FSMQueueStruct HIDO_FSMQueueStruct;
typedef struct HIDO_FSMQueueDataStruct HIDO_FSMQueueDataStruct;
/* çŠ¶æ€å‚æ•° */
typedef struct
{
    HIDO_VOID *m_pArg;                                                          /* ç”¨æˆ·å‚数指针 */
    const HIDO_StateStruct *m_pstAfterState;                                    /* äº‹ä»¶æ‰§è¡Œå®Œè¿›å…¥çš„下一个状态 */
} HIDO_StateArgStruct;
/* çŠ¶æ€çš„å®žçŽ° */
typedef HIDO_INT32 (* HIDO_DebugFunc)(HIDO_FSMStruct *_pstStateMachine, HIDO_INT32 _i32Level, HIDO_CHAR *_pcFmt, va_list _ap);
typedef HIDO_INT32 (* HIDO_StateFunc)(HIDO_FSMStruct *, HIDO_UINT32, void *);
struct HIDO_StateStruct
{
    const char *m_pcName;
    const HIDO_StateStruct *m_pstParent;
    const HIDO_StateStruct *m_pstInit;
    HIDO_StateFunc m_fnProc;
};
/* æœªä½¿ç”¨ */
struct HIDO_FSMQueueDataStruct
{
    HIDO_UINT32 m_u32Event;
    void *m_pArg;
};
/* æœªä½¿ç”¨ */
struct HIDO_FSMQueueStruct
{
    HIDO_UINT32 m_u32Cnt;
    HIDO_UINT32 m_u32Rear;
    HIDO_UINT32 m_u32Front;
    HIDO_UINT32 m_u32Size;
    HIDO_FSMQueueDataStruct *m_pstBuff;
};
/* çŠ¶æ€æœºçš„å®žçŽ°ç»“æž„ä½“ */
struct HIDO_FSMStruct
{
#define HIDO_FSM_DBG_FLAG_OFF      0                                            /* å¼€æ—¥å¿— */
#define HIDO_FSM_DBG_FLAG_ON       1                                            /* å…³æ—¥å¿— */
    HIDO_UINT16 m_u16ID;                                                        /* çŠ¶æ€æœºID æœªä½¿ç”¨ */
    HIDO_UINT16 m_u16DbgFlag;                                                   /* çŠ¶æ€æœºè°ƒè¯•æ‰“å°å¼€å…³ */
    const HIDO_StateStruct *m_pstCurrentState;                                  /* çŠ¶æ€æœºå½“å‰çš„çŠ¶æ€ */
    void *m_pPrivateData;                                                       /* çŠ¶æ€æœºç§æœ‰æ•°æ® */
    const char *m_pcName;                                                       /* çŠ¶æ€æœºåå­— */
    const char * const*m_ppcEventName;                                          /* çŠ¶æ€æœºäº‹ä»¶åå­—åå­— */
    HIDO_FSMStruct *m_pstNext;                                                  /* æœªä½¿ç”¨ */
    HIDO_FSMQueueStruct m_stEventQueue;                                         /* æœªä½¿ç”¨ */
    HIDO_DebugFunc m_fnDebugFunc;
};
/* æœªä½¿ç”¨ */
struct HIDO_StateListStruct
{
    const HIDO_StateStruct *m_pstState;
    HIDO_StateListStruct *m_pstNext;
};
/*******************************************************************************
 *                             Global Function                                 *
 *******************************************************************************/
/*******************************************************************************
 * Function Name     : HIDO_FSMEventExecute
 * Description       : çŠ¶æ€æœºæ‰§è¡Œä¸€ä¸ªäº‹ä»¶
 * Input             : _ptStatMachine         çŠ¶æ€æœºç»“æž„ä½“æŒ‡é’ˆ
 *                     _uEvent                çŠ¶æ€æœºçš„äº‹ä»¶
 *                     _pArg                  çŠ¶æ€æœºæ‰§è¡Œäº‹ä»¶æ—¶ä¼ é€’çš„å‚æ•°
 * Output            : None
 * Return            : None
 * Author            : www.hido-studio.com
 * Modified Date:    : 2019å¹´07月15日
 *******************************************************************************/
void HIDO_FSMEventExecute(HIDO_FSMStruct *_ptStateMachine, HIDO_UINT32 _uEvent, void *_pArg);
/*******************************************************************************
 * Function Name     : HIDO_FSMRegister
 * Description       : çŠ¶æ€æœºæ³¨å†Œ
 * Input             : _ptStatMachine         çŠ¶æ€æœºç»“æž„ä½“æŒ‡é’ˆ
 *                     _ptInitState           çŠ¶æ€æœºçš„åˆå§‹çŠ¶æ€
 *                     _pcName                çŠ¶æ€æœºçš„åå­—(用于调试打印)
 *                     _ppcEventName          çŠ¶æ€æœºæ—¶é—´çš„åå­—(用于调试打印)
 *                     _pPrivateData          çŠ¶æ€æœºç§æœ‰æ•°æ®,可以给状态机关联一个私有数据
 *                     _u16DbgFlag            è°ƒè¯•开关 HIDO_FSM_DBG_FLAG_OFF=关 HIDO_FSM_DBG_FLAG_ON=开
 * Output            : None
 * Return            : None
 * Author            : www.hido-studio.com
 * Modified Date:    : 2019å¹´07月15日
 *******************************************************************************/
void HIDO_FSMRegister(HIDO_FSMStruct *_ptStatMachine, const HIDO_StateStruct *_ptInitState, const char *_pcName, const char * const*_ppcEventName,
        void *_pPrivateData, HIDO_UINT16 _u16DbgFlag);
/*******************************************************************************
 * Function Name     : DB_FSMRegisterDebugFunc
 * Description       :
 * Input             :
 * Output            :
 * Return            :
 * Author            : DuJian
 * Modified Date:    : 2019å¹´11月18日
 *******************************************************************************/
HIDO_INT32 HIDO_FSMRegisterDebugFunc(HIDO_FSMStruct *_pstStatMachine, HIDO_DebugFunc _fnDebugFunc);
/*******************************************************************************
 * Function Name     : HIDO_FSMStateChange
 * Description       : çŠ¶æ€æœºçŠ¶æ€è¿ç§»æŽ¥å£
 * Input             : _ptStateMachine        çŠ¶æ€æœºç»“æž„ä½“æŒ‡é’ˆ
 *                     _ptNewState            æ–°çš„状态(状态迁移的目标状态)
 *                     _pData                 çŠ¶æ€è¿ç§»æ—¶æºå¸¦çš„æ•°æ®
 * Output            : None
 * Return            : None
 * Author            : www.hido-studio.com
 * Modified Date:    : 2019å¹´07月15日
 *******************************************************************************/
void HIDO_FSMStateChange(HIDO_FSMStruct *_ptStateMachine, const HIDO_StateStruct *_ptNewState, void *_pData);
/*******************************************************************************
 * Function Name     : HIDO_FSMStartTimer
 * Description       : çŠ¶æ€æœºå¯åŠ¨å®šæ—¶å™¨æŽ¥å£
 * Input             : _eTimerID              å®šæ—¶å™¨çš„ID
 *                     _u8Type                å®šæ—¶å™¨çš„类型(同HIDO_Timer。h中的类型)
 *                     _uTick                 å®šæ—¶å™¨çš„定时tick(单位ms)
 *                     _ptStatMachine         çŠ¶æ€æœºç»“æž„ä½“æŒ‡é’ˆ
 *                     _uEvent                å®šæ—¶å™¨è¶…时后,向状态机发送的事件
 * Output            : None
 * Return            : None
 * Author            : www.hido-studio.com
 * Modified Date:    : 2019å¹´07月15日
 *******************************************************************************/
void HIDO_FSMStartTimer(HIDO_UINT32 _eTimerID, HIDO_UINT8 _u8Type, HIDO_UINT32 _uTick, HIDO_FSMStruct *_ptStatMachine, HIDO_UINT32 _uEvent);
#endif