生成狀態機框架
使用FSME不僅能夠進行可視化的狀態機建模,更重要的是它還可以根據得到的模型自動生成用C++或者Python實現的狀態機框架。首先在FSME界面左邊的樹形列表中選擇"Root"項,然后在右下角的"Name"文本框中輸入狀態機的名字"DoorFSM",再從"Initial State"下拉列表中選擇狀態"Opened"作為狀態機的初始化狀態,如圖6所示。
設置初始屬性
在將狀態機模型保存為door.fsm文件之后,使用下面的命令可以生成包含有狀態機定義的頭文件:
[xiaowp@linuxgam code]$ fsmc door.fsm -d -o DoorFSM.h
進一步還可以生成包含有狀態機實現的框架代碼:
[xiaowp@linuxgam code]$ fsmc door.fsm -d -impl DoorFSM.h -o DoorFSM.cpp
如果想對生成的狀態機進行驗證,只需要再手工編寫一段用于測試的代碼就可以了:
/*
* TestFSM.cpp
* 測試生成的狀態機框架
*/
#include "DoorFSM.h"
int main()
{
DoorFSM door;
door.A(DoorFSM::Close);
door.A(DoorFSM::Lock);
door.A(DoorFSM::Unlock);
door.A(DoorFSM::Open);
}
有限狀態機是由事件來進行驅動的,在FSME生成的狀態機框架代碼中,方法A()可以被用來向狀態機發送相應的事件,從而提供狀態機正常運轉所需要的"動力"。狀態機負責在其內部維護一個事件隊列,所有到達的事件都會先被放到事件隊列中進行等候,從而能夠保證它們將按照到達的先后順序被依次處理。在處理每一個到達的事件時,狀態機都會根據自己當前所處的狀態,檢查與該狀態對應的轉換條件是否已經被滿足,如果滿足的話則激活相應的狀態轉換過程。
使用下面的命令能夠將生成的狀態機框架和測試代碼編譯成一個可執行文件:
[xiaowp@linuxgam code]$ g++ DoorFSM.cpp TestFSM.cpp -o fsm
由于之前在用fsmc命令生成狀態機代碼時使用了-d選項,生成的狀態機框架中會包含一定的調試信息,包括狀態機中每次狀態轉換時的激活事件、轉換前的狀態、所經歷的轉換、轉換后的狀態等,如下所示:
[xiaowp@linuxgam code]$ ./fsm
DoorFSM:event:'Close'
DoorFSM:state:'Opened'
DoorFSM:transition:'closeDoor'
DoorFSM:new state:'Closed'
DoorFSM:event:'Lock'
DoorFSM:state:'Closed'
DoorFSM:transition:'lockDoor'
DoorFSM:new state:'Locked'
DoorFSM:event:'Unlock'
DoorFSM:state:'Locked'
DoorFSM:transition:'unlockDoor'
DoorFSM:new state:'Unlocked'
DoorFSM:event:'Open'
DoorFSM:state:'Unlocked'
DoorFSM:transition:'openDoor'
DoorFSM:new state:'Opened'
-
框架
+關注
關注
0文章
403瀏覽量
17475 -
狀態機
+關注
關注
2文章
492瀏覽量
27529 -
python
+關注
關注
56文章
4792瀏覽量
84628
發布評論請先 登錄
相關推薦
評論