定制狀態機
目前得到的狀態機已經能夠響應來自外部的各種事件,并適當地調整自己當前所處的狀態,也就是說已經實現了狀態機引擎的功能,接下來要做的就是根據應用的具體需求來進行定制,為狀態機加入與軟件系統本身相關的那些處理邏輯。在FSME中,與具體應用相關的操作稱為輸出(Output),它們實際上就是一些需要用戶給出具體實現的虛函數,自動生成的狀態機引擎負責在進入或者退出某個狀態時調用它們。
仍然以控制城門的那個狀態機為例,假設我們希望在進入每個狀態時都添加一部分處理邏輯。首在FSME界面左邊的樹形列表選擇"Outputs"項,然后按下鍵盤上的Insert鍵來添加一個新的輸出,接著在右下方的"Name"文本框中輸入相應的名稱,再單擊"Apply"按鈕,一個新的輸出就創建好了,如圖所示。用同樣的辦法可以添加狀態機所需要的所有輸出。
添加輸出
當所有的輸出都定義好之后,接下來就可以為狀態機中的每個狀態綁定相應的輸出。首先在FSME界面左側的"States"項中選擇相應的狀態,然后從右下角的"Available"列表框中選擇與該狀態對應的輸出,再單擊"<"按鈕將其添加到"In"列表中,如圖所示。用同樣的辦法可以為狀態機中的所有狀態設置相應的輸出,同一個狀態可以對應有多個輸出,其中In列表中的輸出會在進入該狀態時被調用,而Out列表中的輸出則會在退出該狀態時被調用,輸出調用的順序是與其在In或者Out列表中的順序相一致的。
圖為狀態設置輸出
由于對狀態機模型進行了修改,我們需要再次生成狀態機的框架代碼,不過這次不需要加上-d參數:
[xiaowp@linuxgam code]$ fsmc door.fsm -o DoorFSM.h
[xiaowp@linuxgam code]$ fsmc door.fsm -d -impl DoorFSM.h -o DoorFSM.cpp
我們在新的狀態機模型中添加了enterOpend、enterClosed、enterLocked和enterUnlocked四個輸出,因此生成的類DoorFSM中會包含如下幾個純虛函數:
virtual void enterOpened() = 0;
virtual void enterLocked() = 0;
virtual void enterUnlocked() = 0;
virtual void enterClosed() = 0;
顯然,此時生成的狀態機框架不能夠再被直接編譯了,我們必須從類DoorFSM派生出一個子類,并提供對這幾個純虛函數的具體實現:
/*
* DoorFSMLogic.h
* 狀態機控制邏輯的頭文件
*/
#include "DoorFSM.h"
class DoorFSMLogic : public DoorFSM
{
protected:
virtual void enterOpened();
virtual void enterLocked();
virtual void enterUnlocked();
virtual void enterClosed();
};
正如前面所提到過的,這幾個函數實際上代表的正是應用系統的處理邏輯,作為例子我們只是簡單地輸出一些提示信息:
/*
* DoorFSMLogic.cpp
* 狀態機控制邏輯的實現文件
*/
#include "DoorFSMLogic.h"
#include
void DoorFSMLogic::enterOpened()
{
std::cout << "Enter Opened state." << std::endl;
}
void DoorFSMLogic::enterClosed()
{
std::cout << "Enter Closed state." << std::endl;
}
void DoorFSMLogic::enterLocked()
{
std::cout << "Enter Locked state." << std::endl;
}
void DoorFSMLogic::enterUnlocked()
{
std::cout << "Enter Unlocked state." << std::endl;
}
同樣,為了對生成的狀態機進行驗證,我們還需要手工編寫一段測試代碼:
/*
* TestFSM.cpp
* 測試狀態機邏輯
*/
#include "DoorFSMLogic.h"
int main()
{
DoorFSMLogic door;
door.A(DoorFSM::Close);
door.A(DoorFSM::Lock);
door.A(DoorFSM::Unlock);
door.A(DoorFSM::Open);
}
使用下面的命令能夠將生成的狀態機框架和測試代碼編譯成一個可執行文件:
[xiaowp@linuxgam code]$ g++ DoorFSM.cpp DoorFSMLogic.cpp TestLogic.cpp -o logic
運行結果如下所示:
[xiaowp@linuxgam code]$ ./logic
Enter Closed state.
Enter Locked state.
Enter Unlocked state.
Enter Opened state.
-
函數
+關注
關注
3文章
4353瀏覽量
63295 -
模型
+關注
關注
1文章
3415瀏覽量
49476 -
狀態機
+關注
關注
2文章
492瀏覽量
27779
發布評論請先 登錄
相關推薦
如何設計自動駕駛系統的狀態機

Verilog狀態機+設計實例

如何寫好狀態機
什么是狀態機?狀態機5要素

狀態模式(狀態機)

狀態機自動生成工具FSME

評論