1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
#![no_std] extern crate embedded_hal as hal; use core::mem; use hal::blocking::i2c::{Write, WriteRead}; pub trait Register { fn addr(&self) -> u8; } pub trait SerialWrite<Mode, R> where Self : Write, R : Register { fn write_u8(&mut self, addr: u8, reg: R, data: u8) -> Result<(), Self::Error> { self.write(addr, &[reg.addr(), data]) } fn write_le_u16(&mut self, addr: u8, reg: R, data: u16) -> Result<(), Self::Error>; fn write_be_u16(&mut self, addr: u8, reg: R, data: u16) -> Result<(), Self::Error>; fn write_le_u32(&mut self, addr: u8, reg: R, data: u32) -> Result<(), Self::Error>; fn write_be_u32(&mut self, addr: u8, reg: R, data: u32) -> Result<(), Self::Error>; } pub trait SerialRead<Mode, R> where Self : WriteRead, R : Register { fn read_u8(&mut self, addr: u8, reg: R) -> Result<u8, Self::Error> { let mut buffer: [u8; 1] = unsafe { mem::uninitialized() }; self.write_read(addr, &[reg.addr()], &mut buffer)?; Ok(buffer[0]) } fn read_le_u16(&mut self, addr: u8, reg: R) -> Result<u16, Self::Error>; fn read_be_u16(&mut self, addr: u8, reg: R) -> Result<u16, Self::Error>; fn read_le_u24(&mut self, addr: u8, reg: R) -> Result<u32, Self::Error>; fn read_be_u24(&mut self, addr: u8, reg: R) -> Result<u32, Self::Error>; fn read_le_u32(&mut self, addr: u8, reg: R) -> Result<u32, Self::Error>; fn read_be_u32(&mut self, addr: u8, reg: R) -> Result<u32, Self::Error>; } pub mod autoincrement; pub mod noincrement;