5010.有限状态机-电梯事件
有限状态机 tinyfsm
马达 motor.hpp 定义,马达有上、下、停三种事件
#include "tinyfsm.hpp"//电机马达事件定义
struct MotorUp :tinyfsm::Event{};
struct MotorDown :tinyfsm::Event{};
struct MotorStop : tinyfsm::Event{};//马达状态机基类定义
class Motor : public tinyfsm::Fsm<Motor>
{public:void react(tinyfsm::Event const &){};void react(MotorUp const &);void react(MotorDown const &);void react(MotorStop const &);virtual void entry(void) = 0; //纯虚函数,需要被强制实现.void exit(void) {};protected:static int direction;public:static int getDirection(){return direction;}};
Motor.cpp 对应 马达有三个不同的状态 上、停、下状态。
#include "tinyfsm.hpp"
#include "motor.hpp"
#include <iostream>using namespace std;//电动马达状态机
class Stoped : public Motor {void entry() override {cout << "Motor: stoped." << endl;direction = 0;}
};class Up : public Motor {void entry() override {cout << "Motor: moving up." << endl;direction = 1;}
};class Down : public Motor {void entry() override {cout << "Motor: moving down." << endl;direction = -1;}
};
马达react 响应 上、下、停 事件
//基类马达状态机的虚函数实现
void Motor::react(const MotorUp &) {transit<Up>(); //切换到上升状态
}void Motor::react(const MotorDown &) {transit<Down>(); //切换到下降状态
}void Motor::react(const MotorStop &) {transit<Stoped>(); //切换到停止状态.
}int Motor::direction{0}; // 花括号,’{}’声明,又称为初始化列表//状态机定义
FSM_INITIAL_STATE(Motor, Stoped)
人操作电梯,由传感器来控制马达,那么定义电梯的状态机如下, elevator.hpp
#include "tinyfsm.hpp"//事件定义. 楼层事件基类
struct FloorEvent : tinyfsm::Event{int floor;
};//
struct Call : FloorEvent {}; //楼层呼叫
struct FloorSenor : FloorEvent{}; //楼层传感器
struct Alarm : tinyfsm::Event{}; //警报事件//定义电梯状态机基类
class Elevator : public tinyfsm::Fsm<Elevator>
{public:void react(tinyfsm::Event const &){};virtual void react(Call const &);virtual void react(FloorSenor const &);virtual void react(Alarm const &);virtual void entry(void){}; /* entry actions in some states */void exit(void) {}; /* no exit actions at all */protected:static constexpr int initial_floor = 0;static int current_floor;static int dest_floor;
};
给电梯定义状态机,空闲状态机,恐慌状态机,移动状态机
#include "elevator.hpp"
#include <iostream>
#include "fsmlist.hpp"using namespace std;//空闲类
class Idle;//呼叫主体
static void CallMaintenance()
{cout << "*** 打电话给维护员 ***" << endl;
}
//呼叫消防
static void CallFireFlighters()
{cout << "*** 打电话给消防员 ***" << endl;
}//恐慌状态机
class Panic : public Elevator{void entry() override {cout << "Panic Motorstop 事件.";send_event(MotorStop()); //发送马达暂停事件}
};//移动状态机
class Moving : public Elevator
{void react(FloorSenor const & e) override {cout << "Moving Floor Floor.sensor: " << e.floor << ")" << endl;int floor_expected = current_floor + Motor::getDirection();if(floor_expected != e.floor){cout << "Floor sensor defect (expected " << floor_expected << ", got " << e.floor << ")" << endl;transit<Panic>(CallMaintenance);}else{cout << "Reached floor " << e.floor << endl;current_floor = e.floor;if(e.floor == dest_floor){transit<Idle>();}}}
};//空闲状态机
class Idle :public Elevator{public:void entry() override {cout << "进入空闲状态. --> 发送电梯停止事件." << endl;send_event(MotorStop());}void react(Call const & e) override {dest_floor = e.floor;cout << "空闲状态Call --> dest_floor:" << dest_floor << " current_floor:" << current_floor << endl;if(dest_floor == current_floor){return;}auto action =[] {if(dest_floor > current_floor){send_event(MotorUp());}else if(dest_floor < current_floor) {send_event(MotorDown());}};transit<Moving>(action);}};
5010.有限状态机-电梯事件相关推荐
- 数据结构电梯模拟 100梯1000层 不限梯数
电梯模拟 不限电梯数 不限楼层数 100梯1000层!源码见文末 电梯模拟 实验要求 设计思路 设计要求 设计实现 类和对象 模拟方法 有限状态机 电梯调度优化 综合 输出展示 源码 电梯模拟 实验要 ...
- YARN的服务库和事件库
一 服务库 对于生命周期较长的对象,YARN采用基于服务的对象管理模型对其管理,特点如下: >每一个被服务化的对象分为四个状态:NOTINITED(被创建,还未初始化),INITED(已初始化) ...
- java如何写电梯代码_JAVA编写的一个简易的电梯模型,完成电梯如何满足乘客上下楼需求(ElevatorTest)...
[实例简介] [实例截图] [核心代码] package ele; import java.util.LinkedList; import java.util.Queue; public class ...
- javascript的有限状态机
JavaScript 中的有限状态机,第 1 部分: 设计一个小部件 使用 JavaScript 和有限状态机开发浏览器应用程序 文档选项 打印本页 将此页作为电子邮件发送 级别: 初级 Edward ...
- 基于Erlang语言的视频相似推荐系统 | 深度
作者丨gongyouliu 来源 | 转载自大数据与人工智能(ID:ai-big-data) [导语]:作者在上一篇文章<基于内容的推荐算法>中介绍了基于内容的推荐算法的实现原理.在本篇文 ...
- 机器人体验营笔记(二)基础
全文内容来源于国外权威资料汇总整理,具体信息请查阅文末参考文献. For specific information, please refer to the reference at the end ...
- 写给 -- Arrow.L
还记得那个代码片段吗? "情不知所起,一往情深..."for (int day = SOMEDAY; day < FOEVER; day++) {love++; }反之亦如现 ...
- C++项目实战-实际应用
目录 典型IO的两个阶段(网络IO) Linux上的五种IO模型 1.阻塞 blocking 2.非阻塞 3.IO复用 4.信号驱动 5.异步 Web Server HTTP协议(应用层的协议) 简介 ...
- 网络素养公开课笔记(四)
网络素养公开课笔记(四) 网络素养公开课地址:http://www.icourse163.org/course/sysu-136001#/info 信息管理与信息系统 1122班20121167 ...
最新文章
- nvm卸载node_nvm-node版本管理工具
- 将Mongodb部分数据导入mysql数据库
- Photoshop图层学习总结
- 网络协议:TCP/IP、SOCKET、HTTP
- 开发的必杀技:Git 的分支管理
- 干的漂亮!一夜之间GPS在南海信号全无,美军只能干瞪眼
- mac电脑bash_profile创建,打开,编辑,保存
- python生成器_Python生成器
- 熔断与降级 搜索和学习 了解不深
- windows禅道官网地址及环境搭建
- 如何制定目标 (转自我学网)
- greenplum数据迁移gpcopy
- 乘法计算机公式,Excel表格乘法函数公式
- 软件测试的术语SRS,HLD,LLD,BD,FD,DD意义
- Kotlin 开发Android app(十九):文件读写和SharedPreferences内容存储
- css中zoom的用法
- 基金从业考试各科目难度特点?
- 玩吃鸡台式计算机配置,玩吃鸡的电脑配置推荐_玩吃鸡的电脑配置最低要多少...
- python面试题(六)——数据库mysql、redis篇
- 鸿蒙系统如何恢复安卓系统