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(&mut [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(&mut [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>;
}