如何处理检索 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

电池
从电池中检索的数据采用字节数组格式,长度在 2 到 32 字节之间,从小端到大端不等(相信我,我知道这很奇怪)。基本上,您必须将 "command" 作为寄存器(例如电压为 0x09)的写入命令发送到设备地址 (0x0b)。在使用传递的缓冲区执行 read-command 后,缓冲区包含来自电池的数据。

让 Ftdi 通信层与应用程序的功能无关对我来说很有意义,因为我可以用 i2c 代替 SPI 等等(甚至可以与电池以外的东西通信)。因此,我已确保该层对与其通信的设备类型一无所知。但是,这给我留下了一个问题:

我把电池寄存器的知识放在哪一层?
每个寄存器都有地址、长度、单元类型和格式。即

电压
地址:0x09
长度:2字节
unit/format: 毫伏

在寄存器中,我想到了以下转换器:

那么,考虑到这一点,我应该怎么做呢?我目前的想法是:

我认为第一种方法会更简单,但我想让这个应用程序成为未来项目的 "model",并希望第一次就成功。

感谢您的帮助,对于史诗小说感到抱歉。

使用贫血模型 + 电池服务。

这样您就可以通过 DI 正确地对服务层进行单元测试,并且正如您所说,可以使用不同的服务来为不同的硬件类型提供服务。

更难的问题是将所需的转换放在哪里。部分问题是字节数​​组本身与硬件耦合。我也会考虑将其抽象出来。然后你的服务可以 return 你的模型会知道并且可以使用的抽象数据类型,而不用担心它来自哪里或它真正包含什么。