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

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

参考资料
[1]https://www.runoob.com/design-pattern/mvc-pattern.html
[2]https://refactoringguru.cn/design-patterns/state

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
嵌入式系统-硬件与软件架构架构之美》这本书是一本介绍嵌入式系统架构的精彩之作。嵌入式系统是指被嵌入到其他设备或系统中的计算机系统,它具有特定的功能和任务。硬件与软件架构嵌入式系统实现的基础,它关系到系统的性能、资源利用率和稳定性。 首先,嵌入式系统的硬件架构是指系统硬件部分的设计和组织。硬件架构要考虑到系统的实时性、功耗和成本等因素。一种好的硬件架构可以提高系统的运行效率和响应速度,减少功耗,提高系统的可靠性和稳定性。而本书通过对硬件设计和组织的全面介绍,分析了各种硬件架构的优劣,帮助读者了解如何选择和设计适合嵌入式系统的硬件架构。 其次,嵌入式系统的软件架构是指系统中软件组件的设计和组织。软件架构要考虑到系统的可扩展性、可维护性和可重用性等方面。一个好的软件架构可以提高系统的灵活性和可靠性,降低软件开发的难度和成本。本书通过对软件设计原理和各种软件架构模式的深入讲解,帮助读者掌握嵌入式系统的软件设计和组织方法。 通过硬件与软件架构的完美结合,嵌入式系统可以充分发挥其特定的功能和任务。硬件架构提供了系统运行的基础,而软件架构则实现了系统的各种功能和任务。本书深入浅出地介绍了硬件与软件架构的原理和技术,结合实际案例分析,让读者能够理解嵌入式系统架构的美妙之处。 总之,《嵌入式系统-硬件与软件架构架构之美》这本书通过对硬件与软件架构的详细介绍,帮助读者深入了解嵌入式系统的组成和工作原理,掌握嵌入式系统的设计和开发方法。无论是从理论还是实践的角度,都能够让读者对嵌入式系统的架构有更深入的了解,并且能够应用实际项目中。这本书是嵌入式系统开发者和学习者的重要参考资料。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Engineer-Bruce_Yang

谢谢您

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值