use core::fmt::Debug;
use hal::i2c::I2c;
use crate::StandardExpanderInterface;
use super::{Expander, ExpanderError, Register};
#[derive(Debug)]
pub struct Pca9535Immediate<I2C>
where
I2C: I2c,
{
address: u8,
i2c: I2C,
}
impl<I2C> Pca9535Immediate<I2C>
where
I2C: I2c,
{
pub fn new(i2c: I2C, address: u8) -> Self {
assert!(address > 31 && address < 40);
Self { address, i2c }
}
pub fn destroy(self) -> I2C {
self.i2c
}
}
impl<I2C, E> Expander<I2C> for Pca9535Immediate<I2C>
where
E: Debug,
I2C: I2c<Error = E>,
{
fn write_byte(&mut self, register: Register, data: u8) -> Result<(), ExpanderError<E>> {
self.i2c
.write(self.address, &[register as u8, data])
.map_err(ExpanderError::WriteError)
}
fn read_byte(&mut self, register: Register, buffer: &mut u8) -> Result<(), ExpanderError<E>> {
let mut buf = [0_u8];
self.i2c
.write_read(self.address, &[register as u8], &mut buf)
.map_err(ExpanderError::WriteReadError)?;
*buffer = buf[0];
Ok(())
}
fn write_halfword(&mut self, register: Register, data: u16) -> Result<(), ExpanderError<E>> {
self.i2c
.write(
self.address,
&[register as u8, (data >> 8) as u8, data as u8],
)
.map_err(ExpanderError::WriteError)
}
fn read_halfword(
&mut self,
register: Register,
buffer: &mut u16,
) -> Result<(), ExpanderError<E>> {
let mut reg_val: [u8; 2] = [0x00; 2];
self.i2c
.write_read(self.address, &[register as u8], &mut reg_val)
.map_err(ExpanderError::WriteReadError)?;
*buffer = (reg_val[0] as u16) << 8 | reg_val[1] as u16;
Ok(())
}
}
impl<I2C, E> StandardExpanderInterface<I2C, E> for Pca9535Immediate<I2C>
where
E: Debug,
I2C: I2c<Error = E>,
{
}