定制状态机目前得到的状态机已经能够响应来自外部的各种事件,并适当地调整自己当前所处的状态,也就是说已经实现了状态机引擎的功能,接下来要做的就是根据应用的具体需求来进行定制,为状态机加入与软件系统本身相关的那些处理逻辑。在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.
首届新加坡电子行业网络招聘会即将举行
谷歌Pixel3a现身GeekBench 芯片型号未识别
机器视觉中的摄像机标定和自标定分析
ESD替代方案(SM712)
高压变频器控制系统中的PLC如何实现远程监控和编程调试?
如何使用FSME来定制状态机
什么是广场LED显示屏
法国运营商Orange正式把NB-IoT技术纳入5G标准体系并推出LTE-M技术
利用单片机和CPLD实现延时时间精密可控的消抖动电路设计
小米电视能如小米手机一样在印度取得卓越的成绩么?
粮食重金属检测仪是什么,它的功能都有哪些
瑞昱再获急单 下半年出货有望逐季回温
Hubi全球首创VIP共识:对比火币、币安
工业互联网构建产业竞争新优势
如何简化微控制器和温度传感器之间的接口
有关环境管理物质术语和定义
Coral已部署36个市场:没有云也能加持人工智能
一加8 Pro手机最新渲染图晒出,前置双摄左右两侧为曲面设计
前、后一致性的保证以及如何影响电池系统的寿命、质保因素
一种基于四叉树的数字水印算法