当前位置: 首页 > backend >正文

基于 tinyfsm 的状态机

基于tinyfsm 框架的状态机,来对软件架构进行重构。

一,地址

框架地址如下,这是一个单文件项目,只需要include进去即可。

https://github.com/digint/tinyfsm


 

二,关于状态机的 知识  可以参考这篇文章

万物皆可状态机:解密状态机 (FSM),轻松驾驭复杂系统

三,tinyfsm 实践

#pragma once
#include <iostream>
#include "tinyfsm.hpp"#include <base/MqttClient.hpp>
#include <base/GstreamerEncoder.h>
#include <base/esdk/ESDKManager.h>using namespace Base;// --------- 事件定义 ----------
struct EvExit : tinyfsm::Event
{
};//--------- 上下文 用于不用状态传递指针 ----------
struct FsmContext
{// MQTT 客户端std::shared_ptr<MqttClient> mqttClientPtr;// 编码std::shared_ptr<Encoder> encoderPtr;// 解码std::shared_ptr<ESDKManager> decoderPtr;
};// 状态机
class Controller : public tinyfsm::Fsm<Controller>
{
public:void react(tinyfsm::Event const &) {};void react(EvExit const &);virtual void entry(void) = 0;void exit(void) {};static void set_context(FsmContext *ctx){context = ctx;}protected:static FsmContext *context;
};
#include "Controller.hpp"
#include <Util/logger.h>
#include <iostream>using namespace toolkit;class IdleState;
class InitState;
class RunState;
class ExitState;FsmContext* Controller::context = nullptr;//空闲状态
class IdleState : public Controller
{void entry() override{// 日志Logger::Instance().add(std::make_shared<ConsoleChannel>());auto fileChannel = std::make_shared<FileChannel>("FileChannel", exeDir() + "/logs/");fileChannel->setMaxDay(7);Logger::Instance().add(fileChannel);Logger::Instance().setWriter(std::make_shared<AsyncLogWriter>());// gstreamergst_init(nullptr, nullptr);gst_debug_set_default_threshold(GST_LEVEL_ERROR);transit<InitState>();};
};//初始状态
class InitState : public Controller
{void entry() override{InfoL << "[初始状态]----------------------------开始初始化";bool ret{false};context->mqttClientPtr = std::make_shared<MqttClient>();context->encoderPtr = std::make_shared<Encoder>();context->decoderPtr = std::make_shared<ESDKManager>();ret = context->encoderPtr->Init();if (!ret){return;}ret = context->decoderPtr->Init();if (!ret){return;}ret = context->mqttClientPtr->Init();if (!ret){return;}InfoL << "[初始状态]----------------------------初始化完成";transit<RunState>();};
};//运行状态
class RunState : public Controller
{void entry() override{InfoL << "[运行状态]----------------------------开始运行";context->encoderPtr->Start();};
};//退出状态
class ExitState : public Controller
{void entry() override{InfoL << "[退出状态]----------------------------开始清理资源";context->mqttClientPtr->DeInit();context->encoderPtr->DeInit();context->decoderPtr->DeInit();};
};void Controller::react(EvExit const &)
{transit<ExitState>();
}// 初始状态定义
FSM_INITIAL_STATE(Controller, IdleState)

四,main 函数里调用

#include <iostream>
#include <Thread/semaphore.h>
#include <signal.h>
#include "core/Controller.hpp"
#include <opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>
#include <iostream>
#include <base/ImageProcessor.h>using namespace toolkit;
using namespace cv;
using namespace std;int main()
{FsmContext ctx;Controller::set_context(&ctx);Controller::start();static semaphore sem;signal(SIGINT, [](int){signal(SIGINT, SIG_IGN);  sem.post(); });sem.wait();Controller::dispatch(EvExit());
}

http://www.xdnf.cn/news/13608.html

相关文章:

  • 未来智能设备的三大核心能力:自检测、自修复与自决策
  • 套接字类型与协议设置
  • 微信小程序之页面跳转(路由),navigateTo redirectTo reLaunch
  • 大型语言模型的中毒攻击的系统评价
  • 一款自制的OpenMV4模块
  • 网络原理8 - HTTP协议1
  • QDialog的show()方法与exec_()方法的区别详解
  • C#.Net 使用NPOI库导出Excel(含列宽度自适应) 及 根据Excel文件生成DataTable
  • 【多智能体】基于嵌套进化算法的多代理工作流
  • 硬件学习笔记--67 接线端子压缩比相关要求
  • Python实战:高效连接与操作Elasticsearch的完整指南
  • 知名开源项目被收购,用户发现项目被“投毒”
  • 【自考】《计算机信息管理课程实验(课程代码:11393)》华师自考实践考核题型解析说明:C++ 与 mysql 实践题型与工具实践题分析
  • 火山引擎 veFuser:面向扩散模型的图像与视频生成推理服务框架
  • 机器学习四剑客:Numpy、Pandas、PIL、Matplotlib 完全指南
  • 【大模型训练】allgatherEP 过程及reduce-scatter的具体例子
  • 使用Docker申请Let‘s Encrypt证书
  • xilinx的GT配置说明(二)
  • 【HTTP重定向与缓存机制详解】
  • 芯伯乐XBLW GT712选型及应用设计指南
  • Spring Cloud业务相关问题
  • 姜伟生《统计至简》
  • 宏基因测序宿主污染太严重,无解?
  • 御微半导体面试总结
  • UE5.2像素流实现公网访问
  • 40.第二阶段x64游戏实战-封包-添加发包功能
  • 13.react与next.js的特性和原理
  • LangChain MCP Adapters Quickstart
  • 无人机避障——感知篇(基于ZED2实现Vins Fusion)
  • [原创](现代Delphi 12指南):[macOS 64bit App开发]: SameText, SameStr, 比较字符串更简单