Skip to main content

ic_md/dd/
dd_blocking.rs

1//! The blocking interface.
2
3use device_driver::RegisterInterfaceBase;
4use embedded_hal::spi::{Operation, SpiDevice};
5
6use crate::dd::DeviceError;
7
8/// The SPI Device wrapper interface to the driver
9#[derive(Debug)]
10pub struct DeviceInterface<Spi> {
11    /// The SPI device used to communicate with the iC-MD device.
12    pub spi: Spi,
13}
14
15impl<Spi> DeviceInterface<Spi> {
16    /// Construct a new instance of the device.
17    ///
18    /// Spi mode 0, max 10 MHz according to the datasheet.
19    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}