use byteorder::{ByteOrder, LittleEndian};
use std::error::Error;
pub trait I2CDevice {
type Error: Error;
fn read(&mut self, data: &mut [u8]) -> Result<(), Self::Error>;
fn write(&mut self, data: &[u8]) -> Result<(), Self::Error>;
fn smbus_write_quick(&mut self, bit: bool) -> Result<(), Self::Error>;
fn smbus_read_byte(&mut self) -> Result<u8, Self::Error> {
let mut buf = [0_u8];
self.read(&mut buf)?;
Ok(buf[0])
}
fn smbus_write_byte(&mut self, value: u8) -> Result<(), Self::Error> {
self.write(&[value])
}
fn smbus_read_byte_data(&mut self, register: u8) -> Result<u8, Self::Error> {
self.smbus_write_byte(register)?;
self.smbus_read_byte()
}
fn smbus_write_byte_data(&mut self, register: u8, value: u8) -> Result<(), Self::Error> {
self.write(&[register, value])
}
fn smbus_read_word_data(&mut self, register: u8) -> Result<u16, Self::Error> {
let mut buf: [u8; 2] = [0x00; 2];
self.smbus_write_byte(register)?;
self.read(&mut buf)?;
Ok(LittleEndian::read_u16(&buf))
}
fn smbus_write_word_data(&mut self, register: u8, value: u16) -> Result<(), Self::Error> {
let mut buf: [u8; 3] = [register, 0, 0];
LittleEndian::write_u16(&mut buf[1..], value);
self.write(&buf)
}
fn smbus_process_word(&mut self, register: u8, value: u16) -> Result<u16, Self::Error> {
let mut buf: [u8; 2] = [0x00; 2];
self.smbus_write_word_data(register, value)?;
self.read(&mut buf)?;
Ok(LittleEndian::read_u16(&buf))
}
fn smbus_read_block_data(&mut self, register: u8) -> Result<Vec<u8>, Self::Error>;
fn smbus_read_i2c_block_data(&mut self, register: u8, len: u8) -> Result<Vec<u8>, Self::Error>;
fn smbus_write_block_data(&mut self, register: u8, values: &[u8]) -> Result<(), Self::Error>;
fn smbus_write_i2c_block_data(
&mut self,
register: u8,
values: &[u8],
) -> Result<(), Self::Error>;
fn smbus_process_block(&mut self, register: u8, values: &[u8]) -> Result<Vec<u8>, Self::Error>;
}
pub trait I2CTransfer<'a> {
type Error: Error;
type Message: I2CMessage<'a>;
fn transfer(&mut self, msgs: &'a mut [Self::Message]) -> Result<u32, Self::Error>;
}
pub trait I2CMessage<'a> {
fn read(data: &'a mut [u8]) -> Self;
fn write(data: &'a [u8]) -> Self;
}