namespace HSMUtilityDef
{
typedef uint32 t HSM_EVENT;
typedef struct HSM_STATE_T HSM_STATE;
typedef struct HSM_T HSM;
typedef HSM_EVENT(* HSM_FN)(HSM *aThis, HSM_EVENT aEvent, void *aParam);
const uint32 tHSM MAX DEPTH=5;
const HSM_EVENT HSME_NULL= 0;
const HSM_EVENT HSME_START = 1;
const HSM_EVENT HSME_INIT = ((HSM EVENT)(-3)) ConSt HSM_EVENT HSME_ENTRY=((HSM_EVENT)(-2));
const HSM_EVENT HSME_EXIT = ((HSM_EVENT)(-1));
struct HSM_STATE_T
{
HSM_STATE parent;
HSM_FN handler;
const charname;
uint8_t level;
};
struct HSM_T
{
HSM_STATE *curState;
const char *name;
};
}
这段代码定义了一个名为 HSMUtilityDef
的命名空间,其中包含了一些类型定义和常量定义,用于实现一个层次状态机(Hierarchical State Machine, HSM)。下面是对代码的详细分析:
类型定义
-
HSM_EVENT
typedef uint32_t HSM_EVENT;
这里将
uint32_t
类型重命名为HSM_EVENT
,用于表示事件的类型。通常,这些事件会有一些特定的意义和编号。 -
HSM_STATE_T
和HSM_STATE
typedef struct HSM_STATE_T HSM_STATE;
这里定义了一个结构体
HSM_STATE_T
并将其重命名为HSM_STATE
,用于表示状态机中的一个状态。 -
HSM_T
和HSM
typedef struct HSM_T HSM;
同样地,这里定义了一个结构体
HSM_T
并将其重命名为HSM
,用于表示整个层次状态机实例。 -
HSM_FN
typedef HSM_EVENT(* HSM_FN)(HSM _aThis, HSM_EVENT aEvent, void* aParam);
这是一个函数指针类型定义。具体来说:
HSM_FN
是一个指向函数的指针。- 该函数接受三个参数:
HSM _aThis
: 表示当前状态机实例的指针。HSM_EVENT aEvent
: 表示发生的事件。void* aParam
: 可以传递给处理函数的参数,类型为void*
,允许传递任意类型的参数。
- 该函数返回一个
HSM_EVENT
类型的值,表示状态转换后的下一个事件(如果有的话)。
常量定义
-
MAX_DEPTH
const uint32_t MAX_DEPTH = 5;
这个常量定义了层次状态机的最大嵌套深度为5。即状态可以最多嵌套5层。
-
HSME_NULL
const HSM_EVENT HSME_NULL = 0;
表示一个空事件或无效事件。
-
HSME_START
const HSM_EVENT HSME_START = 1;
表示启动事件,通常在状态机启动时触发。
-
HSME_INIT
const HSM_EVENT HSME_INIT = ((HSM_EVENT)(-3));
表示初始化事件。这个事件用于初始化某个状态。负数表示这是一个特殊的、内部使用的事件。
-
HSME_ENTRY
const HSM_EVENT HSME_ENTRY = ((HSM_EVENT)(-2));
表示进入事件。当状态机进入某个状态时会触发这个事件。
-
HSME_EXIT
const HSM_EVENT HSME_EXIT = ((HSM_EVENT)(-1));
表示退出事件。当状态机从某个状态退出时会触发这个事件。
结构体定义
-
HSM_STATE_T
struct HSM_STATE_T {HSM_STATE *parent; // 指向父状态的指针HSM_FN handler; // 状态处理函数指针const char* name; // 状态名称,用于调试和日志记录uint8_t level; // 状态层级深度 };
这个结构体表示一个状态机中的状态。每个状态包含以下信息:
parent
: 指向父状态的指针,用于构建层次结构。handler
: 处理该状态的函数指针,当进入此状态或在其中收到事件时会调用这个函数。name
: 状态名称,便于调试和日志记录。level
: 表示当前状态在层次结构中的层级深度。
-
HSM_T
struct HSM_T {HSM_STATE *curState; // 当前活动状态指针const char *name; // 状态机名称,用于调试和日志记录 };
这个结构体表示一个层次状态机实例。每个实例包含以下信息:
curState
: 指向当前活动状态的指针。name
: 状态机名称,便于调试和日志记录。
示例代码中的关键点
HSM_FN
的使用:
这个函数指针类型定义了状态处理函数的接口。每个状态可以有一个处理函数,该函数会根据接收到的事件决定如何响应。例如:typedef HSM_EVENT(* HSM_FN)(HSM _aThis, HSM_EVENT aEvent, void* aParam);
HSM_EVENT myStateHandler(HSM _aThis, HSM_EVENT aEvent, void* aParam) {switch (aEvent) {case HSME_ENTRY:// 处理进入状态的操作break;case HSME_EXIT:// 处理退出状态的操作break;case HSME_INIT:// 初始化操作break;default:// 其他事件处理break;}return HSME_NULL; // 返回下一个事件或HSME_NULL表示没有后续事件 }
通过这些定义,你可以构建一个灵活且强大的层次状态机系统,适用于各种复杂的状态管理需求。