1use embedded_hal::{i2c as hal_i2c, spi as hal_spi};
2
3pub trait I2cBus: hal_i2c::I2c {
5 type BusError: From<<Self as hal_i2c::ErrorType>::Error>;
6}
7
8impl<T, E> I2cBus for T
9where
10 T: hal_i2c::I2c<Error = E>,
11{
12 type BusError = E;
13}
14
15pub(crate) trait I2cExt {
16 type Error;
17
18 fn write_reg<R: Into<u8>>(&mut self, addr: u8, reg: R, value: u8) -> Result<(), Self::Error>;
19 fn update_reg<R: Into<u8>>(
20 &mut self,
21 addr: u8,
22 reg: R,
23 mask_set: u8,
24 mask_clear: u8,
25 ) -> Result<(), Self::Error>;
26 fn read_reg<R: Into<u8>>(&mut self, addr: u8, reg: R) -> Result<u8, Self::Error>;
27}
28
29impl<I2C: I2cBus> I2cExt for I2C {
30 type Error = I2C::BusError;
31
32 fn write_reg<R: Into<u8>>(&mut self, addr: u8, reg: R, value: u8) -> Result<(), Self::Error> {
33 self.write(addr, &[reg.into(), value])?;
34 Ok(())
35 }
36
37 fn update_reg<R: Into<u8>>(
38 &mut self,
39 addr: u8,
40 reg: R,
41 mask_set: u8,
42 mask_clear: u8,
43 ) -> Result<(), Self::Error> {
44 let reg = reg.into();
45 let mut buf = [0x00];
46 self.write_read(addr, &[reg], &mut buf)?;
47 buf[0] |= mask_set;
48 buf[0] &= !mask_clear;
49 self.write(addr, &[reg, buf[0]])?;
50 Ok(())
51 }
52
53 fn read_reg<R: Into<u8>>(&mut self, addr: u8, reg: R) -> Result<u8, Self::Error> {
54 let mut buf = [0x00];
55 self.write_read(addr, &[reg.into()], &mut buf)?;
56 Ok(buf[0])
57 }
58}
59
60pub trait SpiBus: hal_spi::SpiDevice {
61 type BusError: From<<Self as hal_spi::ErrorType>::Error>;
62}
63
64impl<T, E> SpiBus for T
65where
66 T: hal_spi::SpiDevice<Error = E>,
67{
68 type BusError = E;
69}