• 正文
  • 相关推荐
申请入驻 产业图谱

嵌入式软件设计之美-以实际项目应用MVC框架与状态模式(下)

01/05 13:57 来源:嵌入式应用研究院
449
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

上节我们分享了MVC框架、状态模式组合在实际开发中的应用,它能够让我们的软件设计流程更加的清晰、易于维护:嵌入式软件设计之美-以实际项目应用MVC框架与状态模式(上)

那么这一节我们就直接开门见山,从接下来的这个开源项目分享开始:

项目开源仓库:

https://github.com/Yangyuanxin/IotSensorDetect

项目获取方法:

git?close?https://github.com/Yangyuanxin/IotSensorDetect

该项目会不断的添加新的示例来持续完善。

这是一个基于MVC模式+状态设计模式的物联网气体检测开源项目,目前的整体软件通信框架图(后续会根据需求继续拓展)如下所示:

如上软件通信框架图所示,腾讯连连小程序 & 腾讯云IoT Explorer物联网平台相对于设备端来说是上位机,而下位机部分则是由四个主要的任务来协作完成的,分别是ControllerTask、IotRecvTask、ModelHnadlerControolerTask以及ModelSensorHandlerTask,而Task与Task之间的通信方式是基于消息队列的形式来实现的。采用消息队列通讯是一种软件设计解耦的实现方式,线程与线程之间通过消息队列通信,能够实现业务隔离,让整个系统的可拓展性大大提高。除此之外,采用消息队列的好处是能够携带数据载体,数据格式也可以由用户自定义。例如本开源项目的自定义消息结构体如下:

struct?Msg_t
{
??uint8_t?Type;?????????//消息类型
??uint32_t?SensorValue;?//传感器数值
??char?Data[MSG_LEN];???//其它可能的数据承载
};

其中,软件通信时序分为两种模式:

1、Ctrl Mode

该模式由APP端发起,对于APP端来说,APP端可以下发三种命令,分别是检测、停止、返回,如下图所示:

当用户在APP端按下检测时,APP端会下发START命令,当Controller接收到Iot端下发的指令时会将其转发给Model模块来控制传感器进行检测,期间检测过程中的设备状态以及传感器数值会进行更新,检测过程也可以通过下发停止来打断;而返回则是根据当前的设备状态来返回到上一个检测状态;这一切是通过状态模式来维护的,其状态流程图如下:

在程序中,该状态流程图是通过一个结构体数组来定义的:

SensorStateItem_t?SensorStateTable[]?=
{
????{IDLE,???START,?CALI},??????//IDLE->START->CALI
????{CALI,???NEXT,??DETECT},????//CALI->NEXT->DETECT
????{CALI,???STOP,??IDLE},??????//CALI->STOP->IDLE
????{DETECT,?NEXT,??RESULT},????//DETECT->NEXT->RESULT
????{DETECT,?PREV,??CALI},??????//DETECT->PREV->CALI
????{DETECT,?STOP,??IDLE},??????//DETECT->STOP->IDLE
????{RESULT,?PREV,??DETECT},????//RESULT->PREV->DETECT
????{RESULT,?STOP,??IDLE},??????//RESULT->STOP->IDLE
};

切换状态的过程是由DoSensorStatus来实现的:

__IO?SensorState_t?CurState?=?IDLE;??//当前状态
__IO?SensorState_t?PrevState?=?IDLE;?//上一个状态

SensorStateItem_t?*FindCurStateAndEvent(SensorState_t?CurState,?SensorEvent_t?Event)
{
????int?Index?=?0;
????//查状态表
????for(Index?=?0;?Index?<?NR_MODEL(SensorStateTable);?Index++)
????{
????????if(SensorStateTable[Index].CurState?==?CurState?
????????????????&&?SensorStateTable[Index].Event?==?Event)??
????????????return?&SensorStateTable[Index];
????}

????return?NULL;
}
//执行状态机
int?DoSensorStatus(SensorEvent_t?Event)
{
????int?Ret?=?1;
????SensorStateItem_t?*Item;
????//根据当前的状态、事件找到状态表中的那一项,取到那一项的地址
????Item?=?FindCurStateAndEvent(CurState,?Event);

????if?(!Item)
????????return?0;
????//保存上一个状态
????PrevState?=?CurState;
????//切换到下一个状态
????CurState?=?Item->NextSate;
????return?Ret;
};

2、Auto Report Mode

该模式是由设备端主动定时上报给到APP端,如下图所示:

检测设备在没有启动检测功能时,设备端也会定时上报传感器数值以及设备状态;因此,Iot端能够定时看到数据在不断发生变化。

以上便是MCV框架与状态模式最简单的应用了。当然,从上节我们就已经知道,对于ControllerView而言,它的体现形式可以有很多种,它不局限于仅仅是Iot的形式,它也可以是由其它模块来构成;这部分待后续项目更新后上传。

参考资料

[1]https://www.runoob.com/design-pattern/mvc-pattern.html

[2]https://refactoringguru.cn/design-patterns/state

相关推荐

登录即可解锁
  • 海量技术文章
  • 设计资源下载
  • 产业链客户资源
  • 写文章/发需求
立即登录

本科毕业于华南理工大学,现美国卡罗尔工商管理硕士研究生在读,曾就职于世界名企伟易达、联发科技等,多年嵌入式产品开发经验,在智能玩具、安防产品、平板电脑、手机开发有丰富的实战开发经验,现任深圳市云之手科技有限公司副总经理、研发总工程师。