如何处理检索 i2c 缓冲区和设置 model/entity 属性?
How to handle retrieving i2c buffer and setting model/entity properties?
我一直在学习设计模式,以便在我的项目中创建一些更易于管理的代码。但是,我在确定从 i2c 接口到我的实体的 byte-array 缓冲区数据的最佳实现时遇到了一些麻烦。这是一个简单的 dashboard-like 应用程序,它查询 smart-battery 的状态和大约 12 个不同的寄存器值。然后,它会在小部件或较大的 "details" window 中将数据呈现给用户。我试图避免创建更多的贫血模型,因为我发现自己从早期使用 MVVM 模式开发时就陷入了那个坑,我正在努力改掉这个习惯。
程序功能
通过 FTDI 电缆通过 SMBUS(i2c) 从 SmartBattery 检索数据并将其显示在 WPF 应用程序中。
当前结构
FTDI
- IFtdiService - 定义特定于 Ftdi 电缆的 i2c 功能的接口
- FtdiService - 使用外部 Ftdi 库 (.dll) 实现 IFtdiService
- FtdiController - 通过 FtdiCable
管理初始化、配置以及与电池之间的命令传输和接收
电池
从电池中检索的数据采用字节数组格式,长度在 2 到 32 字节之间,从小端到大端不等(相信我,我知道这很奇怪)。基本上,您必须将 "command" 作为寄存器(例如电压为 0x09)的写入命令发送到设备地址 (0x0b)。在使用传递的缓冲区执行 read-command 后,缓冲区包含来自电池的数据。
让 Ftdi 通信层与应用程序的功能无关对我来说很有意义,因为我可以用 i2c 代替 SPI 等等(甚至可以与电池以外的东西通信)。因此,我已确保该层对与其通信的设备类型一无所知。但是,这给我留下了一个问题:
我把电池寄存器的知识放在哪一层?
每个寄存器都有地址、长度、单元类型和格式。即
电压
地址:0x09
长度:2字节
unit/format: 毫伏
在寄存器中,我想到了以下转换器:
- 公制 - 用于安培、伏特等
- 温度 - 寄存器以 0.1K 为单位存储温度,因此需要偏移量才能正确使用摄氏度。
- 整数 - 用于充电状态(单位为 %)和 运行 时间(单位为分钟)
- ASCII - 用于序列号、设备名称等
那么,考虑到这一点,我应该怎么做呢?我目前的想法是:
- 贫血模型 + 电池服务:创建一个能够管理电池并将字节数组数据转换为模型正确数据类型的服务。然后我将有一个 BatteryManager(想想控制器),它将包含定时循环以使用 FtdiController 查询电池,该 FtdiController 具有一个服务实例以正确处理电池并发出 ViewModel 接收的通知
- Rich-Model:这个感觉不对,但可能是因为我没有太多的经验。如果电池 model/entity 多 feature-rich,它可能有能力自行执行这些转换?但是,该功能似乎应该处于较低级别。
我认为第一种方法会更简单,但我想让这个应用程序成为未来项目的 "model",并希望第一次就成功。
感谢您的帮助,对于史诗小说感到抱歉。
使用贫血模型 + 电池服务。
这样您就可以通过 DI 正确地对服务层进行单元测试,并且正如您所说,可以使用不同的服务来为不同的硬件类型提供服务。
更难的问题是将所需的转换放在哪里。部分问题是字节数组本身与硬件耦合。我也会考虑将其抽象出来。然后你的服务可以 return 你的模型会知道并且可以使用的抽象数据类型,而不用担心它来自哪里或它真正包含什么。
我一直在学习设计模式,以便在我的项目中创建一些更易于管理的代码。但是,我在确定从 i2c 接口到我的实体的 byte-array 缓冲区数据的最佳实现时遇到了一些麻烦。这是一个简单的 dashboard-like 应用程序,它查询 smart-battery 的状态和大约 12 个不同的寄存器值。然后,它会在小部件或较大的 "details" window 中将数据呈现给用户。我试图避免创建更多的贫血模型,因为我发现自己从早期使用 MVVM 模式开发时就陷入了那个坑,我正在努力改掉这个习惯。
程序功能
通过 FTDI 电缆通过 SMBUS(i2c) 从 SmartBattery 检索数据并将其显示在 WPF 应用程序中。
当前结构
FTDI
- IFtdiService - 定义特定于 Ftdi 电缆的 i2c 功能的接口
- FtdiService - 使用外部 Ftdi 库 (.dll) 实现 IFtdiService
- FtdiController - 通过 FtdiCable 管理初始化、配置以及与电池之间的命令传输和接收
电池
从电池中检索的数据采用字节数组格式,长度在 2 到 32 字节之间,从小端到大端不等(相信我,我知道这很奇怪)。基本上,您必须将 "command" 作为寄存器(例如电压为 0x09)的写入命令发送到设备地址 (0x0b)。在使用传递的缓冲区执行 read-command 后,缓冲区包含来自电池的数据。
让 Ftdi 通信层与应用程序的功能无关对我来说很有意义,因为我可以用 i2c 代替 SPI 等等(甚至可以与电池以外的东西通信)。因此,我已确保该层对与其通信的设备类型一无所知。但是,这给我留下了一个问题:
我把电池寄存器的知识放在哪一层?
每个寄存器都有地址、长度、单元类型和格式。即
电压
地址:0x09
长度:2字节
unit/format: 毫伏
在寄存器中,我想到了以下转换器:
- 公制 - 用于安培、伏特等
- 温度 - 寄存器以 0.1K 为单位存储温度,因此需要偏移量才能正确使用摄氏度。
- 整数 - 用于充电状态(单位为 %)和 运行 时间(单位为分钟)
- ASCII - 用于序列号、设备名称等
那么,考虑到这一点,我应该怎么做呢?我目前的想法是:
- 贫血模型 + 电池服务:创建一个能够管理电池并将字节数组数据转换为模型正确数据类型的服务。然后我将有一个 BatteryManager(想想控制器),它将包含定时循环以使用 FtdiController 查询电池,该 FtdiController 具有一个服务实例以正确处理电池并发出 ViewModel 接收的通知
- Rich-Model:这个感觉不对,但可能是因为我没有太多的经验。如果电池 model/entity 多 feature-rich,它可能有能力自行执行这些转换?但是,该功能似乎应该处于较低级别。
我认为第一种方法会更简单,但我想让这个应用程序成为未来项目的 "model",并希望第一次就成功。
感谢您的帮助,对于史诗小说感到抱歉。
使用贫血模型 + 电池服务。
这样您就可以通过 DI 正确地对服务层进行单元测试,并且正如您所说,可以使用不同的服务来为不同的硬件类型提供服务。
更难的问题是将所需的转换放在哪里。部分问题是字节数组本身与硬件耦合。我也会考虑将其抽象出来。然后你的服务可以 return 你的模型会知道并且可以使用的抽象数据类型,而不用担心它来自哪里或它真正包含什么。