如何处理检索i2c缓冲区和设置模型/实体属性?

时间:2018-07-10 13:33:04

标签: c# wpf mvvm domain-driven-design i2c

我一直在学习设计模式,以便在我的项目中创建一些更易于管理的代码。但是,在确定最佳的实现方式以从i2c接口到我的实体获取字节数组缓冲区数据时遇到了一些麻烦。这是一个类似于仪表板的简单应用程序,可以查询智能电池的状态和大约12个不同的寄存器值。然后,它会在一个小窗口小部件或一个较大的“详细信息”窗口中向用户显示数据。我试图避免创建更多的贫血模型,因为我发现自己从早期使用MVVM模式开发时就陷入了困境,并试图打破这种习惯。

程序功能
通过FTDI电缆通过SMBUS(i2c)从SmartBattery电池中检索数据,并将其显示在WPF应用程序中。

当前结构
FTDI

  • IFtdiService-定义特定于Ftdi电缆的i2c功能的接口
  • FtdiService-使用外部Ftdi库(.dll)实现IFtdiService
  • FtdiController-通过FtdiCable管理电池的初始化,配置以及与电池之间的命令传输和接收

电池
从电池获取的数据为字节数组格式,长度在2到32个字节之间,大小从小到大(请相信我,我知道这很奇怪)。基本上,必须向设备地址(0x0b)发送写命令,并将“命令”作为寄存器(例如,电压为0x09)。使用传递的缓冲区执行读取命令后,缓冲区包含来自电池的数据。

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

我应该将电池寄存器的知识放在哪一层?
每个寄存器都有一个地址,长度,单位类型和格式。即

电压
地址:0x09
长度:2个字节
单位/格式:mV

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

  • 公制-用于安培,伏特等
  • 温度-寄存器以0.1K为单位存储温度,因此需要偏移才能正确以摄氏度为单位。
  • 整数-用于收费状态(单位为%)和运行时间(单位为分钟)
  • ASCII-用于序列号,设备名称等

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

  • 贫血模型+电池服务:创建能够管理电池并将字节数组数据转换为该模型的正确数据类型的服务。然后,我将有一个BatteryManager(思想控制器),它将包含定时循环,以使用FtdiController查询电池,该FtdiController具有服务实例来正确处理电池并发出通知以供ViewModels接收
  • 丰富的模型:这感觉很错误,但这可能是因为我没有很多经验。如果电池模型/实体要具有更多的功能,它可能有能力自己执行这些转换?但是,似乎该功能应该处于较低级别。

我认为第一种方法会更容易,但是我想将此应用程序作为将来项目的“模型”,并希望在第一时间就将其正确设置。

感谢您的帮助,对史诗般的小说表示歉意。

1 个答案:

答案 0 :(得分:0)

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

通过这种方式,您可以通过DI正确地对服务层进行单元测试,并且如前所述,可以使用不同的服务来服务于不同的硬件类型。

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