有限状态机 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.有限状态机-电梯事件相关推荐

  1. 数据结构电梯模拟 100梯1000层 不限梯数

    电梯模拟 不限电梯数 不限楼层数 100梯1000层!源码见文末 电梯模拟 实验要求 设计思路 设计要求 设计实现 类和对象 模拟方法 有限状态机 电梯调度优化 综合 输出展示 源码 电梯模拟 实验要 ...

  2. YARN的服务库和事件库

    一 服务库 对于生命周期较长的对象,YARN采用基于服务的对象管理模型对其管理,特点如下: >每一个被服务化的对象分为四个状态:NOTINITED(被创建,还未初始化),INITED(已初始化) ...

  3. java如何写电梯代码_JAVA编写的一个简易的电梯模型,完成电梯如何满足乘客上下楼需求(ElevatorTest)...

    [实例简介] [实例截图] [核心代码] package ele; import java.util.LinkedList; import java.util.Queue; public class ...

  4. javascript的有限状态机

    JavaScript 中的有限状态机,第 1 部分: 设计一个小部件 使用 JavaScript 和有限状态机开发浏览器应用程序 文档选项 打印本页 将此页作为电子邮件发送 级别: 初级 Edward ...

  5. 基于Erlang语言的视频相似推荐系统 | 深度

    作者丨gongyouliu 来源 | 转载自大数据与人工智能(ID:ai-big-data) [导语]:作者在上一篇文章<基于内容的推荐算法>中介绍了基于内容的推荐算法的实现原理.在本篇文 ...

  6. 机器人体验营笔记(二)基础

    全文内容来源于国外权威资料汇总整理,具体信息请查阅文末参考文献. For specific information, please refer to the reference at the end ...

  7. 写给 -- Arrow.L

    还记得那个代码片段吗? "情不知所起,一往情深..."for (int day = SOMEDAY; day < FOEVER; day++) {love++; }反之亦如现 ...

  8. C++项目实战-实际应用

    目录 典型IO的两个阶段(网络IO) Linux上的五种IO模型 1.阻塞 blocking 2.非阻塞 3.IO复用 4.信号驱动 5.异步 Web Server HTTP协议(应用层的协议) 简介 ...

  9. 网络素养公开课笔记(四)

       网络素养公开课笔记(四) 网络素养公开课地址:http://www.icourse163.org/course/sysu-136001#/info 信息管理与信息系统 1122班20121167 ...

最新文章

  1. nvm卸载node_nvm-node版本管理工具
  2. 将Mongodb部分数据导入mysql数据库
  3. Photoshop图层学习总结
  4. 网络协议:TCP/IP、SOCKET、HTTP
  5. 开发的必杀技:Git 的分支管理
  6. 干的漂亮!一夜之间GPS在南海信号全无,美军只能干瞪眼
  7. mac电脑bash_profile创建,打开,编辑,保存
  8. python生成器_Python生成器
  9. 熔断与降级 搜索和学习 了解不深
  10. windows禅道官网地址及环境搭建
  11. 如何制定目标 (转自我学网)
  12. greenplum数据迁移gpcopy
  13. 乘法计算机公式,Excel表格乘法函数公式
  14. 软件测试的术语SRS,HLD,LLD,BD,FD,DD意义
  15. Kotlin 开发Android app(十九):文件读写和SharedPreferences内容存储
  16. css中zoom的用法
  17. 基金从业考试各科目难度特点?
  18. 玩吃鸡台式计算机配置,玩吃鸡的电脑配置推荐_玩吃鸡的电脑配置最低要多少...
  19. python面试题(六)——数据库mysql、redis篇
  20. 鸿蒙系统如何恢复安卓系统

热门文章

  1. python爬取天天基金网_天天基金网精选基金组合年度报告20201231
  2. Java 设计模式之Facade门面模式
  3. Java 算法 入学考试
  4. 鸿蒙硬件HI3861-MQTT
  5. Pytorch 配置 Tensorboard 可视化学习(一)
  6. python获得距离指定(x,y)固定距离的全部坐标点
  7. 启动efi_efi启动模式对比bios启动模式有哪些优势【详细介绍】
  8. 深度学习中的正则化技术详解
  9. 网页Object标签 遮盖DIV标签解决方法
  10. 阅读《大型网站技术架构》前两章心得体会及总结