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

Verilog狀態(tài)機(jī)+設(shè)計(jì)實(shí)例

如何寫(xiě)好狀態(tài)機(jī)
狀態(tài)機(jī)舉例
狀態(tài)機(jī)代碼生成工具
FPGA:狀態(tài)機(jī)簡(jiǎn)述

什么是狀態(tài)機(jī)?狀態(tài)機(jī)5要素

狀態(tài)模式(狀態(tài)機(jī))

狀態(tài)機(jī)自動(dòng)生成工具FSME

自動(dòng)生成程序狀態(tài)機(jī)代碼狀態(tài)機(jī)建模方法

如何生成狀態(tài)機(jī)框架

評(píng)論