c# - 如何处理检索 i2c 缓冲区和设置模型/实体属性?
问题描述
我一直在学习设计模式,以便在我的项目中创建一些更易于管理的代码。但是,我在确定从 i2c 接口获取字节数组缓冲区数据到我的实体的最佳实现时遇到了一些麻烦。这是一个简单的类似仪表板的应用程序,可以查询智能电池的状态和大约 12 个不同的寄存器值。然后,它将数据以小部件或较大的“详细信息”窗口呈现给用户。我试图避免创建更多贫血模型,因为我发现自己从早期使用 MVVM 模式开发时就掉进了那个坑,并试图打破这个习惯。
程序功能
通过 FTDI 电缆通过 SMBUS(i2c) 从 SmartBattery 检索数据,并将其显示在 WPF 应用程序中。
当前结构
FTDI
- IFtdiService - 定义特定于 Ftdi 电缆的 i2c 功能的接口
- FtdiService - 使用外部 Ftdi 库 (.dll) 实现 IFtdiService
- FtdiController - 通过 FtdiCable 管理初始化、配置以及与电池之间的命令传输和接收
从电池中检索到的电池
数据采用字节数组格式,长度在 2 到 32 个字节之间,并且从小端到大端不等(相信我,我知道这很奇怪)。基本上,您必须将“命令”作为寄存器(例如电压为 0x09)发送到设备地址(0x0b)的写入命令。在使用传递的缓冲区执行读取命令后,缓冲区包含来自电池的数据。
让 Ftdi 通信层与应用程序的功能无关,这对我来说是有意义的,因为我可能会用 i2c 代替 SPI 等等(甚至可以与电池以外的东西进行通信)。因此,我确保该层对与之通信的设备类型一无所知。但是,这给我留下了一个问题:
我将电池寄存器的知识放在哪一层?
每个寄存器都有地址、长度、单元类型和格式。IE
电压
地址:0x09
长度:2字节
单位/格式:mV
在寄存器中,我想到了以下转换器:
- 公制 - 用于安培、伏特等。
- 温度 - 寄存器以 0.1K 为单位存储温度,因此它需要偏移量才能正确地以摄氏度为单位。
- 整数 - 用于充电状态(单位为 %)和运行时间(单位为分钟)
- ASCII - 用于序列号、设备名称等。
那么,考虑到这一点,我应该怎么做呢?我目前的想法是:
- Anemic Model + Battery Service:创建一个能够管理电池的服务,并将字节数组数据转换为模型的正确数据类型。然后,我将有一个 BatteryManager(想想控制器),它将包含定时循环来使用 FtdiController 查询电池,该 FtdiController 有一个服务实例来正确处理电池并发出通知让 ViewModel 接收
- Rich-Model:这感觉不对,但可能是因为我没有太多经验。如果电池模型/实体的功能更丰富,它可能有能力自己执行这些转换吗?但是,似乎该功能应该处于较低级别。
我认为第一种方法会更容易,但我想让这个应用程序成为未来项目的“模型”,并希望在第一时间把它做好。
感谢您的帮助,并为史诗小说感到抱歉。
解决方案
使用贫血模型 + 电池服务。
这样,您可以通过 DI 正确地对服务层进行单元测试,并且正如您所说,可以使用不同的服务来服务不同的硬件类型。
更难的问题是把你需要的转换放在哪里。部分问题是字节数组本身与硬件耦合。我也会考虑将其抽象出来。然后,您的服务可以返回您的模型将知道并可以使用的抽象数据类型,而不用担心它来自哪里或它真正包含什么。
推荐阅读
- python - 将数据框的行保存到单独的 txt 文件中
- java - 无法理解如何在下面的课程中完成自动接线
- python - 如何解析两个粘在一起的元素?
- jasper-reports - 基于另一个字段的字段求和
- java - 将 Apache HttpClient 响应拦截器与请求匹配
- date - 我在 JSON 中保存了一个日期,当我重新加载它时,它看起来几乎一样......那是什么 `m=+2.58`?
- vue.js - Vuetify 删除 v-data-table 上的分页
- c# - 如何将 wacom 数位板集成到 WPF
- amazon-web-services - 嵌套前缀时无法在 s3 存储桶上应用生命周期策略
- python - python注册表Tensorflow中缺少图形操作