文章目录

  • 1 投食型状态机
  • 2 摩尔型状态机
  • 3 多状态机

1 投食型状态机

1 有限状态机官方测试小demo, 投食型状态机

//
// Created by xhome on 2020/9/7.
// 一个简单的有限状态机测试
//#include "tinyfsm.hpp"
#include <iostream>//1. 事件的声明,可以携带参数
struct Toggle : tinyfsm::Event{};//2.定义状态机基类, 投食型状态机
struct Switch : tinyfsm::MealyMachine<Switch>
{//纯虚反射,需要在每个状态机中实现.virtual void react(Toggle const &) = 0;//转换操作,开路static void OpenCircuit(){std::cout << "开路(light goes OFF)" << std::endl;}static  void CloseCircuit(){std::cout << "关路(light goes ON)" << std::endl;}};//3.状态机申明
struct Off;struct On : Switch{void react(Toggle const &) override {transit<Off>(OpenCircuit); //有限状态机状态切换到off}
};struct Off :Switch{void react(Toggle const &) override {transit<On>(CloseCircuit);  //状态切换到on}
};//初始化状态机的状态.
FSM_INITIAL_STATE(Switch, Off)int main()
{//开启状态机Switch::start();std::cout << "> You are facing a light switch..." << std::endl;while(1){char c;std::cout << std::endl << "t=Toggle, q=Quit ? ";std::cin >> c;switch(c) {case 't':std::cout << "> Toggling switch..." << std::endl;Switch::dispatch(Toggle());break;case 'q':return 0;default:std::cout << "> Invalid input" << std::endl;};}return 0;
}

2 摩尔型状态机

2 摩尔型状态机

//
// Created by xhome on 2020/9/7.
// 摩尔类型状态机
//#include "tinyfsm.hpp"
#include <iostream>//1. 事件的声明,可以携带参数
struct Toggle : tinyfsm::Event{};//2.定义状态机基类, 投食型状态机
struct Switch : tinyfsm::MooreMachine<Switch>
{//纯虚反射,需要在每个状态机中实现.virtual void react(Toggle const &) = 0;
};//3.状态机申明
struct Off;struct On : Switch{void entry() override {std::cout << "* Closing ciruit (light goes ON)" << std::endl;};void react(Toggle const &) override {transit<Off>(); //有限状态机状态切换到off}
};struct Off :Switch{void entry() override {std::cout << "* Opening ciruit (light goes OFF)" << std::endl;};void react(Toggle const &) override {transit<On>();  //状态切换到on}
};//初始化状态机的状态.
FSM_INITIAL_STATE(Switch, Off)int main()
{Switch::start();std::cout << "> You are facing a light switch..." << std::endl;while(1){char c;std::cout << std::endl << "t=Toggle, q=Quit ? ";std::cin >> c;switch(c) {case 't':std::cout << "> Toggling switch..." << std::endl;Switch::dispatch(Toggle());break;case 'q':return 0;default:std::cout << "> Invalid input" << std::endl;};}
}

3 多状态机

//
// Created by xhome on 2020/9/7.
// 本例展示故障开关,多重次
//// DumpState  转储状态.#include "tinyfsm.hpp"
#include <iostream>
#include <stdlib.h> /* rand *///模板类申明.
template <int inum>
class Off;//状态转储
static void DumpState(int inum, const char * state, int on_counter, int defect_level){std::cout << "* Switch[" << inum << "] is " << state << " (on_counter=" << on_counter << ", defect_level=" << defect_level << ")" << std::endl;
}//1.事件定义
struct Toggle:tinyfsm::Event{};//2.状态机基类定义
template <int inum>
class DefectiveSwitch : public tinyfsm::Fsm<DefectiveSwitch<inum>>
{public:static constexpr unsigned int defect_level = (inum*2);static void reset(void ){on_counter = 0;}void react(tinyfsm::Event const &){};virtual void react(Toggle const &){};virtual void entry(void){};void exit(){};protected:static unsigned int on_counter;
};template <int inum>
unsigned int DefectiveSwitch<inum>::on_counter{0};//状态变量的定义
template <int inum>
class On : public DefectiveSwitch<inum>
{using base = DefectiveSwitch<inum>;void entry()override {base::on_counter++;DumpState(inum, "ON ", base::on_counter, base::defect_level);}void react(Toggle const &) override {base::template transit<Off<inum>>();}
};template <int inum>
class  Off : public DefectiveSwitch<inum>
{using base = DefectiveSwitch<inum>;void entry() override {DumpState(inum, "OFF", base::on_counter , base::defect_level);}void react(Toggle const &) override {if((rand()%(base::defect_level +1)) == 0){base::template transit<On<inum>>();}else{std::cout << "* Kzzz kzzzzzz" << std::endl;base::template transit< Off<inum> >();}}};FSM_INITIAL_STATE(DefectiveSwitch<0>, Off<0>)
FSM_INITIAL_STATE(DefectiveSwitch<1>, Off<1>)
FSM_INITIAL_STATE(DefectiveSwitch<2>, Off<2>)//4.状态机列表申明
using fsm_handle = tinyfsm::FsmList<DefectiveSwitch<0>, DefectiveSwitch<1>, DefectiveSwitch<2>>;template <int inum>
void ToggleSingle(){std::cout << "> Toggling switch " << inum << "..." << std::endl;DefectiveSwitch<inum>::dispatch(Toggle());
}int main()
{fsm_handle::start();while(1){char c;std::cout << std::endl << "0,1,2=Toggle single, a=Toggle all, r=Restart, q=Quit ? ";std::cin >> c;switch(c) {case '0': ToggleSingle<0>(); break;case '1': ToggleSingle<1>(); break;case '2': ToggleSingle<2>(); break;case 'a':std::cout << "> Toggling all switches..." << std::endl;fsm_handle::dispatch(Toggle());break;case 'r':fsm_handle::reset();fsm_handle::start();break;case 'q':return 0;default:std::cout << "> Invalid input" << std::endl;};}return 0;
}

5009. tinyfsm有限状态机相关推荐

  1. 5010.有限状态机-电梯事件

    有限状态机 tinyfsm 马达 motor.hpp 定义,马达有上.下.停三种事件 #include "tinyfsm.hpp"//电机马达事件定义 struct MotorUp ...

  2. JavaScript 中的有限状态机

    http://www.ibm.com/developerworks/cn/web/wa-finitemach/ JavaScript 中的有限状态机 Page navigation 系列文章 有限状态 ...

  3. 确定有限状态机和非确定有限状态机详解 包含Java实现源码(Nondeterministic finite automata)

    本文将讲解确定有限自动状态机和非确定有限自动状态机的特点和区别.将结合图片例子重点讲解什么是非确定有限自动状态机.最后讲解如何将非确定状态机转换为确定的状态机.多图预警!! 有限自动状态机可以分为确定 ...

  4. 3d 行为树编辑器_cocos creator主程入门教程——有限状态机和行为树

    本篇介绍有限状态机和行为树.有限状态机用于有限的状态下的AI,由于同时只能处于一个状态,多个状态需要多个有限状态机,一般用于简单的AI行为.行为树是基于固定行为,通过遍历树来决定采用哪种行为.行为的设 ...

  5. 《数学之美》第12章 有限状态机—地图与本地搜索的核心技术

    智能手机的定位和导航功能,其实只有三项关键技术: 第一,利用卫星定位 第二,地址的识别 第三,根据用户输入的起点和终点,在地图上规划最短路线或者最快路线 1 地址分析和有限状态机 地址的识别和分析是本 ...

  6. 关于eigrp-FSM有限状态机的资料

    关于eigrp-FSM有限状态机的资料,PDF格式 从其它论坛下过来的,分享给大家 转载于:https://blog.51cto.com/kenjoe/138964

  7. JavaScript与有限状态机

    有限状态机(Finite-state machine)是一个非常有用的模型,可以模拟世界上大部分事物. 简单说,它有三个特征: * 状态总数(state)是有限的. * 任一时刻,只处在一种状态之中. ...

  8. 「译」有限状态机在 CSS 动画中的应用

    原文地址:css-animations-with-finite-state-machines 原文作者:David Khourshid 译文出自:阿里云翻译小组 译文链接:github.com/daw ...

  9. HDLBits 系列(24)进入FSM(有限状态机)的世界入口

    目录 Fsm1 Fsm1s Fsm2 Fsm3comb Fsm1 This is a Moore state machine with two states, one input, and one o ...

最新文章

  1. leetcode--两数之和--python
  2. SDK开发日积月累(二)
  3. 摸鱼神器来了!让你用QQ、微信的时候都像是在工作
  4. php如何查找业务bug,一般从php网站找bug怎么开始
  5. gin构建包含模板的二进制文件
  6. 线段树专辑——hdu 1698 Just a Hook
  7. wxWidgets:wxAnyValueType类用法
  8. .NET开发不可错过的25款必备工具
  9. Java集合Collection与List的关系、常见用法
  10. 转载-使用 Feed4JUnit 进行数据与代码分离的 Java 单元测试
  11. python【进阶】5.一等函数(注销)
  12. 报错The sandbox is not in sync with the Podfile.lock
  13. 过Serverless技术降低微服务应用资源成本
  14. 成员变量(全局变量)和局部变量区别
  15. 建立单链表 单链表的插入_单链列表插入
  16. 获取RenderedGeometry不对的处理
  17. C++ 常量引用用法
  18. exifinterface.setattribute设置不上去_电脑自动开机怎么设置
  19. Matlab实现人脸识别
  20. HUSTOJ教程(1)——安装部署

热门文章

  1. np读取csv文件_pythonpandas读写csv数据
  2. python如何收集数据_如何从另一个文件导入列表并从中“收集”数据?(Python)...
  3. lombok依赖_公司来了个新同事不会用 Lombok,还说我代码有问题
  4. centos7 dns配置_Linux Sever简单笔记(第十三堂课)之linux下的网络管理及DHCP配置的相关操作 - 我杨晓东太难了...
  5. 服务端断开_Java多线程技术:实现多用户服务端Socket通信
  6. matplotlib 设置水平线、垂直线
  7. 微服务 数据库耦合_mysql – 与其他服务共享的微服务数据库
  8. winform 获取焦点_AutoCAD .NET 二次开发实例(13) 获取块参照坐标并输出到Excel
  9. nginx 反向代理之 proxy_redirect
  10. SQA计划和验收测试规程设计