use crate::{
BMA400, BMA400Error, Config, I2CInterface,
blocking::{ReadFromRegister, WriteToRegister},
embedded_hal::i2c::{I2c, SevenBitAddress},
registers::{ChipId, ConfigReg, ReadReg},
};
impl<I2C> WriteToRegister for I2CInterface<I2C>
where
I2C: I2c<SevenBitAddress>,
{
type Error = BMA400Error<I2C::Error>;
fn write_register<T: ConfigReg>(&mut self, register: T) -> Result<(), Self::Error> {
self.i2c
.write(self.addr, &[register.addr(), register.to_byte()])
.map_err(BMA400Error::IOError)
}
}
impl<I2C> ReadFromRegister for I2CInterface<I2C>
where
I2C: I2c<SevenBitAddress>,
{
type Error = BMA400Error<I2C::Error>;
fn read_register<T: ReadReg>(
&mut self,
register: T,
buffer: &mut [u8],
) -> Result<(), Self::Error> {
self.i2c
.write_read(self.addr, &[register.addr()], buffer)
.map_err(BMA400Error::IOError)
}
}
impl<I2C> BMA400<I2CInterface<I2C>>
where
I2C: I2c<SevenBitAddress>,
{
pub fn new_i2c(i2c: I2C) -> Result<BMA400<I2CInterface<I2C>>, BMA400Error<I2C::Error>> {
let mut interface = I2CInterface { addr: 0b10100, i2c };
let config = Config::default();
let mut chip_id = [0u8; 1];
interface.read_register(ChipId, &mut chip_id)?;
if chip_id[0] != 0x90 {
Err(BMA400Error::ChipIdReadFailed)
} else {
Ok(BMA400 { interface, config })
}
}
pub fn new_i2c_alt(i2c: I2C) -> Result<BMA400<I2CInterface<I2C>>, BMA400Error<I2C::Error>> {
let mut interface = I2CInterface { addr: 0b10101, i2c };
let config = Config::default();
let mut chip_id = [0u8; 1];
interface.read_register(ChipId, &mut chip_id)?;
if chip_id[0] != 0x90 {
Err(BMA400Error::ChipIdReadFailed)
} else {
Ok(BMA400 { interface, config })
}
}
}