文章目录

  • 使用环境介绍
  • 使用策略模式-区分使用哪种方法
  • 使用命令模式-区分哪种命令动作

使用环境介绍

当主设备和从设备使用串口信息交互通讯,根据串口协议,实现对从设备的控制访问。
使用情况1:当主设备发送板卡信息获取、读取数据命令时,希望获取从设备的数据信息,从设备应答操作。
使用情况2:当主设备发送采集命令时,从设备收到但不进行回复,不应答操作。

使用策略模式-区分使用哪种方法

  1. 首先识别命令,对需要进行应答的命令进行判断,区分命令,以下命令都是从设备进行应答的命令。
const rz_sensor_cmd_type_t support_send_cmd_reply[] = {CMD_READ_DATA,CMD_READ_INFO,CMD_READ_PARAMETERS,CMD_PREPARE_UPDATE,CMD_SEGMENT_UPDATE,
};
  1. 再动作函数区分:
  • rz_subassembly_uart_send_without_reply (发送数据包,从机不进行响应应答)
  • rz_subassembly_uart_send (发送数据包,从机进行响应应答)
/** Strategy mode* The strategy mode is to use a unified method interface to access different types of data separately.*/
uint32_t rz_sensor_uart_send(SubAssembly_Data_Type *t,uint8_t sensorType,uint8_t addr,uint8_t cmd,uint16_t len,uint8_t *buf)
{uint8_t  cmd_type = sizeof(support_send_cmd_reply)/sizeof(rz_sensor_cmd_type_t);uint32_t (*pfunc)(SubAssembly_Data_Type *t,uint8_t sensorType,uint8_t addr,uint8_t cmd,uint16_t len,uint8_t *buf);for (uint8_t i=0; i < cmd_type; i++) {/* If the interface function cannot be found, the default interface function is used */pfunc = rz_subassembly_uart_send_without_reply;if (cmd == support_send_cmd_reply[i]) {/* if matched, call the reload interface */pfunc = rz_subassembly_uart_send;break;}}/* Call interface function for processing */if (1 != pfunc(t,sensorType,addr,cmd,len,buf)) {rt_kprintf("rz_sensor_uart_send failed, sensorType=0x%02x, addr=0x%02x, cmd=0x%02x\r\n",sensorType, addr,cmd);return 0;}return 1;}

使用命令模式-区分哪种命令动作

  1. 串口接收数据,可根据不同的功能码进行不同的响应执行,这样整体的解析函数不需要改动。
    使用参数结构体进行统一的参数管理,命令和函数动作区分
typedef struct sensor_cmd_param_def {SubAssembly_Data_Type *pAssembly;uint8_t sendCmd;uint8_t cmd;uint16_t dataLength;uint8_t *dataBuf;
} sensor_cmd_param_t;typedef struct sensor_cmd_msg_def {uint8_t  type;uint32_t ( *do_process_cmd ) ( sensor_cmd_param_t *param );
} sensor_cmd_msg_t;
  1. 统一的命令接口解析,后期即使业务需求改动,只需要改动子模块即可。
static const sensor_cmd_msg_t bolt_cmd_process_table[] = {{READ_DATA, bolt_cmd_process_read_data},{READ_INFO, bolt_cmd_process_read_info},{READ_PARAMETERS, bolt_cmd_process_read_param},{PREPARE_UPDATE,bolt_cmd_process_read_update_info},{SEGMENT_UPDATE,bolt_cmd_process_send_data_packet},
};
uint32_t bolt_cmd_process (SubAssembly_Data_Type *pAssembly, uint8_t sendCmd,uint8_t cmd, uint16_t dataLength, uint8_t *dataBuf)
{uint8_t num_items = sizeof (bolt_cmd_process_table) /sizeof(bolt_cmd_process_table[0]);uint8_t ret = 0;sensor_cmd_param_t *param = (sensor_cmd_param_t *)calloc(1,sizeof ( sensor_cmd_param_t ));if (CHECK_PTR_OBJECT(param)) {rt_kprintf ( "%s(),line %d, malloc failed\r\n", __FUNCTION__, __LINE__ );return 0;}param->pAssembly = pAssembly;param->sendCmd = sendCmd;param->cmd = cmd;param->dataLength = dataLength;param->dataBuf = dataBuf;for (uint8_t target = 0; target < num_items; target++) {if (bolt_cmd_process_table[target].type == cmd) {ret = bolt_cmd_process_table[target].do_process_cmd ( param );break;}}if (param != NULL) {free (param);param = NULL;}return ret;
}

C语言实现设计模式-策略模式+命令模式组合使用相关推荐

  1. 【白话设计模式八】命令模式(Command)

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二] ...

  2. 《设计模式详解》行为型模式 - 命令模式

    命令模式 6.3 命令模式 6.3.1 概述 6.3.2 结构 6.3.3 案例实现 6.3.4 优缺点 6.3.5 使用场景 6.3.6 JDK 源码 - Runnable 完整的笔记目录:< ...

  3. 备忘录模式 命令模式_备忘录设计模式示例

    备忘录模式 命令模式 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重 ...

  4. Head First 设计模式中的命令模式 的一个错误

    最近在看Head First 设计模式,其中命令模式中有讲到实现撤销功能,并且作者还出了一道题, 下面的是书中习题: public class MarcoCommand implements Comm ...

  5. 设计模式-行为型模式-命令模式

    设计模式-行为型模式-命令模式 基础 以一个MIS系统为栗子 MIS 管理信息系统(Management Information System,MIS)是一个以人为主导的,利用计算机硬件.软件和网络设 ...

  6. Head First 设计模式总结(六) 命令模式

    本文总结了<Head First 设计模式>中的命令模式 命令模式--将请求封装成"对象",以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持撤销操作. ...

  7. 【设计模式】从命令模式到录像(replay)系统

    引言 这几天看到<游戏编程模式>中的到命令模式一章,这个模式说起来并不是很熟,想着大概也像观察者模式,单例之类的,被用了很多次却不自知吧,没想到还真的对我有所启发. 命令模式 命令模式,将 ...

  8. 设计模式 — 行为型模式 — 命令模式

    目录 文章目录 目录 命令模式 应用场景 代码示例 命令模式 命令模式的目的是解耦调用操作的对象(调用者)和提供实现的对象(接收者). 命令模式的思路是在调用者和接收者之间插入一个命令类(Comman ...

  9. 我学的是设计模式的视频教程——命令模式vs策略模式,唠嗑

    课程视频 命令模式vs策略模式 唠嗑 课程笔记 课程笔记 课程代码 课程代码 新课程火热报名中 课程介绍 版权声明:本文博主原创文章,博客,未经同意不得转载.

最新文章

  1. Apache Kylin v2.5.0正式发布,开源分布式分析引擎
  2. linux使用lftp文件自动认证上传下载
  3. mysql学习笔记06分组语句的使用
  4. React开发(106):方法定义 不然弹出框报错
  5. 微信小程序按钮Button使用详解
  6. 11-8 热点key的重建优化
  7. xshell5免费版本下载
  8. iOS 如何找到或生成 .dSYM 文件
  9. 计算机网络 | 思科网络 | 什么是DHCPv4
  10. 永恒之蓝病毒补丁+封445端口
  11. [BJDCTF2020]Mark loves cat 1
  12. ES6语法笔记(ES6~ES11)
  13. 初识ecshop小京东(2)—— 分页功能
  14. 时间字段加一秒_Mysql自动加1秒的问题
  15. Pytorch nn.Parameter()
  16. 为你揭露2018微信公开课pro的12个重点
  17. Python 绘制中国地图并标上国家名
  18. 【汇正财经】除权和除息是什么?
  19. 已知两点坐标,求直线方程、距离其中一点距离为L的某点
  20. 电脑上计算机中的文档怎么变成格子样,电脑有的软件文字显示小方格是怎么回事?怎样解决?...

热门文章

  1. el-radio-group change事件获取老值
  2. 第八章 交互技术,8.1 VR电商购物(作者:宋五)
  3. 天翼云联想云坚果云我应该选择哪一个呢?
  4. 【NFS】CFS文件管理
  5. 计算机自带的配置检测,Win10如何使用系统自带的硬件设备检测工具?
  6. 八段锦的运动特点及养生原理
  7. 写一些生活的琐事(纯属发泄)
  8. android手机电视互动,手机APP控制电视 长虹智能机多屏互动体验(组图)
  9. ibatis学习以及与mybatis的不同
  10. android 克隆攻击原理,通过CTF学习Android漏洞(炸弹引爆+dex修复)2015 RCTF / 攻防世界高手区 where...