1use device_driver::RegisterInterfaceBase;
4use embedded_hal::spi::{Operation, SpiDevice};
5
6use crate::dd::DeviceError;
7
8#[derive(Debug)]
10pub struct DeviceInterface<Spi> {
11 pub spi: Spi,
13}
14
15impl<Spi> DeviceInterface<Spi> {
16 pub const fn new(spi: Spi) -> Self {
20 Self { spi }
21 }
22}
23
24impl<Spi: SpiDevice> RegisterInterfaceBase for DeviceInterface<Spi> {
25 type Error = DeviceError<Spi::Error>;
26 type AddressType = u8;
27}
28
29impl<Spi: SpiDevice> device_driver::RegisterInterface for DeviceInterface<Spi> {
30 fn write_register(
31 &mut self,
32 address: Self::AddressType,
33 data: &mut [u8],
34 _metadata: &device_driver::FieldsetMetadata,
35 ) -> Result<(), Self::Error> {
36 Ok(SpiDevice::transaction(
37 &mut self.spi,
38 &mut [Operation::Write(&[address]), Operation::Write(data)],
39 )?)
40 }
41
42 fn read_register(
43 &mut self,
44 address: Self::AddressType,
45 data: &mut [u8],
46 _metadata: &device_driver::FieldsetMetadata,
47 ) -> Result<(), Self::Error> {
48 SpiDevice::transaction(
49 &mut self.spi,
50 &mut [Operation::Write(&[0x80 | address]), Operation::Read(data)],
51 )?;
52
53 Ok(())
54 }
55}