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

QP(状态机事件驱动型框架)

1 QP框架为什么简称QP

QP 这个简称可以理解为:

1)Quantum(量子) +  Platform(平台) = QP

2)量子跃迁是指微观粒子(如原子或分子)从一个量子态突然转变到另一个量子态的过程,伴随能量的吸收或释放。

3)一个借鉴了“量子跃迁”理念的、用于构建基于层次式状态机事件驱动型应用程序的完整开发平台

 

2 QP框架概述

image

3 层次式状态机是什么

       层次状态机即HFSM。在开发过程中,角色和系统的行为复杂性不断增加。传统状态机在处理复杂逻辑时,可能导致状态间的逻辑层次混乱。尤其是当一个状态需要包含多个子状态时,维护这些状态变得非常困难。引入层次状态机HFSM可以很好地解决这些问题。
  层次状态机的核心思想是,将一个状态机也作为状态,这样就能够在状态机内部嵌套多个子状态机,实现更复杂的状态切换逻辑,特别是互斥状态间的隔离,与包含状态间的共存。例如,角色可以有一个 移动状态 ,但这个状态下还可以细分为 行走 和 奔跑 子状态,明显的移动状态与行走和奔跑状态属于包含关系。角色还可以有一个 闲置状态 ,明显的闲置状态与移动状态属于互斥关系。
  层次状态机可以帮助我们清晰地管理这种复杂逻辑,使代码的组织结构更加合理,满足更多更复杂的需求

 

4 UML状态机

UML状态机,即是Unified Modeling Language State Machine。更详细的说是:用统一的建模语言,更加可视化、更加简洁、更加清晰的建立状态机。

 

 

5.1构造状态机的步骤

/*************************步骤1:定义状态机结构体*************************/
typedef struct {QHsm super;      /* 必须作为第一个成员 - 继承来自QHsm的必要属性 *//* 状态机特定属性 */uint32_t pressCount;uint32_t holdTime;
} ButtonStateMachine;//按键状态机结构体/*************************步骤2:声明状态处理函数*************************/
/*          按键状态机初始伪状态函数 */
QState ButtonStateMachine_initial(ButtonStateMachine * const me, QEvt const * const e);
/* idle     按键状态机空闲状态处理函数 */
QState ButtonStateMachine_idle(ButtonStateMachine * const me, QEvt const * const e);
/* pressed  按键状态机按压状态处理函数 */
QState ButtonStateMachine_pressed(ButtonStateMachine * const me, QEvt const * const e);
/* held     按键状态机按住状态处理函数 */
QState ButtonStateMachine_held(ButtonStateMachine * const me, QEvt const * const e);/*************************步骤3:实现状态机构造函数*************************/
void ButtonStateMachine_ctor(ButtonStateMachine * const me) {/* 调用QHsm_ctor()构造状态机me,并指定伪状态函数 */QHsm_ctor(&me->super, Q_STATE_CAST(&ButtonStateMachine_initial));/* 初始化状态机属性 */me->pressCount = 0;me->holdTime = 0;printf("ButtonStateMachine constructed\n");
}/* 初始伪状态函数 */
QState ButtonStateMachine_initial(ButtonStateMachine * const me, QEvt const * const e) {(void)e; /* 避免未使用参数警告 *//* 执行初始转换到idle状态 */return Q_TRAN(&ButtonStateMachine_idle);
}/* idle状态处理函数 */
QState ButtonStateMachine_idle(ButtonStateMachine * const me, QEvt const * const e) {switch (e->sig) {case Q_ENTRY_SIG: {printf("Entering IDLE state\n");return Q_HANDLED();}case BUTTON_PRESSED_SIG: {me->pressCount++;printf("Button pressed, count: %lu\n", me->pressCount);return Q_TRAN(&ButtonStateMachine_pressed);}}return Q_SUPER(&QHsm_top);
}/* pressed状态处理函数 */
QState ButtonStateMachine_pressed(ButtonStateMachine * const me, QEvt const * const e) {switch (e->sig) {case Q_ENTRY_SIG: {printf("Entering PRESSED state\n");me->holdTime = 0;return Q_HANDLED();}case BUTTON_RELEASED_SIG: {printf("Button released after %lu ms\n", me->holdTime);return Q_TRAN(&ButtonStateMachine_idle);}case TIMEOUT_SIG: {me->holdTime += 100; /* 假设100ms超时 */if (me->holdTime >= 1000) { /* 按住1秒进入held状态 */return Q_TRAN(&ButtonStateMachine_held);}return Q_HANDLED();}}return Q_SUPER(&QHsm_top);
}/* held状态处理函数 */
QState ButtonStateMachine_held(ButtonStateMachine * const me, QEvt const * const e) {switch (e->sig) {case Q_ENTRY_SIG: {printf("Entering HELD state - long press detected!\n");return Q_HANDLED();}case BUTTON_RELEASED_SIG: {printf("Long press released\n");return Q_TRAN(&ButtonStateMachine_idle);}}return Q_SUPER(&QHsm_top);
}

 

5.2状态处理函数如何被QP调用

- 1)在QP中,首先调用状态机构造函数QHsm_ctor(),用于构建状态机的静态结构;然后调用状态机初始化 QHsm_init(),启动状态机并执行初始转换;最后调用事件分发qhsm_dispatch(),向已初始化的状态机分发事件。

 

http://www.jsqmd.com/news/30992/

相关文章:

  • 深圳市德恺检测有限公司:您的CNAS/CMA实验室认证咨询专业伙伴
  • 2025 最新智能食堂秤厂家/推荐排行榜:溯源 / 验收 / 留样秤品牌权威盘点及选购指南食堂验收智能秤/生鲜分拣智能秤/留样智能秤公司推荐
  • 基于GMP的质量管理信息系统 开发概览(功能)
  • 贪心题目小结
  • 贪心题目小结
  • faust-一个可以切换合成器音色的lfo demo
  • AGC052 VP
  • 2025 年液位计厂家最新推荐榜单:涵盖投入式 / 磁致伸缩 / 防爆 / 防水 / 浮球等类型,全面解析行业领先品牌技术与市场优势
  • 2025学习机黑马登场!松鼠AI S20实测两个月——孩子主动刷题、精准提分不是梦
  • 【URP】Unity[后处理]颜色查询ColorLookup
  • 2025年11月常州光伏公司排名:前十强企业综合评估与选择指南
  • 11/4
  • 网站地址
  • 2025年吸烟亭公司排名前十:合肥荣东智能环保科技有限公司领跑行业
  • 2025年吸烟亭厂家综合排名:合肥荣东智能环保领衔行业标杆
  • jmx接口
  • 实用指南:【金仓数据库】ksql 指南(二) —— 创建与管理本地数据库
  • 2025年移动厕所厂家推荐:荣东智能环保领跑行业
  • CF1780E Josuke and Complete Graph
  • 线程组查看结果树与聚合报告
  • 详细介绍:Oracle OCP认证考试题目详解082系列第46题
  • 2025年香菇品牌推荐与源头厂家排行权威指南
  • 集采压境,数字化转型如何成为国产医疗器械厂商的突围利器?
  • 2025年香菇品牌推荐排行榜前十强
  • C++中的 std::call_once() - Hello
  • jemter接口测试1、2、3
  • 2025年11月洗地机产品推荐:前吸后拖对比榜与促销价排行
  • 单个线程提交
  • 2025年人气正宗地道粤菜餐厅新排行榜推荐
  • 2025.11.04