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 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
use embedded_hal::blocking::i2c; use futures::prelude::*; use crate::common::*; use crate::error::Error; use super::{Mux, Requester}; #[derive(Clone)] pub struct I2c { device: String, mux: Mux, } impl I2c { pub (crate) fn new(device: String, mux: Mux) -> Self { I2c{device, mux} } } impl Drop for I2c { fn drop(&mut self) { self.mux.do_request(&self.device, RequestKind::I2cDisconnect).wait().unwrap(); } } impl i2c::Read for I2c { type Error = Error; fn read(&mut self, addr: u8, buff: &mut [u8]) -> Result<(), Error> { let resp = self.mux.do_request(&self.device, RequestKind::I2cRead(I2cRead{addr, read_len: buff.len() as u16})).wait()?; match resp { ResponseKind::I2cRead(d) => { buff.clone_from_slice(&d); Ok(()) }, _ => Err(Error::InvalidResponse(resp)), } } } impl i2c::Write for I2c { type Error = Error; fn write(&mut self, addr: u8, data: &[u8]) -> Result<(), Error> { let resp = self.mux.do_request(&self.device, RequestKind::I2cWrite(I2cWrite{addr, write_data: Data{data: data.to_vec()}})).wait()?; match resp { ResponseKind::Ok => Ok(()), _ => Err(Error::InvalidResponse(resp)), } } } impl i2c::WriteRead for I2c { type Error = Error; fn write_read(&mut self, addr: u8, data: &[u8], buff: &mut [u8]) -> Result<(), Error> { let resp = self.mux.do_request(&self.device, RequestKind::I2cWriteRead(I2cWriteRead{addr, write_data: Data{data: data.to_vec()}, read_len: buff.len() as u16})).wait()?; match resp { ResponseKind::I2cRead(d) => { buff.clone_from_slice(&d); Ok(()) }, _ => Err(Error::InvalidResponse(resp)), } } }