# HSM_Creater
**Repository Path**: code_killer_luke/hsm_creater
## Basic Information
- **Project Name**: HSM_Creater
- **Description**: No description available
- **Primary Language**: C
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 4
- **Forks**: 0
- **Created**: 2021-03-28
- **Last Updated**: 2024-03-21
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 层次状态机(HSM)的使用方法
### 1、 建立Enterprise Architect工程
##### (1) 新建工程
打开Enterprise Architect,新建工程
##### (2) 创建状态机
点击Browser里面第二个图标
,创建新package(选择Create Diagram)
,在New Diagram界面Type栏选择UML-Behavior
,出现的Diagram选择State Machine
##### (3) 绘制状态图
在Toolbox里选择用到的元素
双击某个状态,选择Design-Editors-Features可以添加事件
双击转换箭头可以添加触发事件,监护条件和动作等
##### (4) 导出
完成状态图后选择Publish-Publish-Other Formats

选择UML 2.1 (XMI 2.1)
点击导出,得到XMI文件
### 2、生成状态机的代码
##### (1) 载入
打开StateMachineGenerator软件,load刚才的XMI文件

##### (2)生成
点击generate,自己命名,生成对应的.c和.h文件
### 3、使用方法
##### (1) 开始HSM
```
TestStateMachine_HSM_Create();
TestStateMachine_HSM_Start();
```
##### (2)填写相应的监护条件和动作等
在StateMachineGenerator生成的.c文件中有各个事件对应的动作以及监护条件等,加入自己的动作和条件即可
```c
//监护条件
int battery_is_good(int id)
{
(void)id;
if(battery == 1)
{
uprintf("HSM_RESULT_OK\n\r");
return HSM_RESULT_OK;
}
else
{
uprintf("HSM_RESULT_NOK\n\r");
return HSM_RESULT_NOK;
}
}
//entry动作
void welcom(int id)
{
(void)id;
uprintf("welcom\n\r");
}
```
##### (3)事件转换
在有事件触发的地方使用:
```
TestStateMachine_HSM_onEvent(event);
```
##### (4)查询状态
使用
```
TestStateMachine_hsm_getCurrentState(void)
```
来查询当前所处的状态,返回int型
### 4、注意
##### (1)重复定义问题
①在EventIDList和statelist里,MAX_EVENTS和MAX_STATEID会与别的文件重复定义,推荐加上下标_XXX(XXX为状态机名字)
②有些guard和动作的函数的定义和声明会重复,只留下一个,其余注释掉就行