diff --git a/src/ds323x/datetime.rs b/src/ds323x/datetime.rs index 71d8a1e..0bca5d1 100644 --- a/src/ds323x/datetime.rs +++ b/src/ds323x/datetime.rs @@ -66,10 +66,11 @@ where /// Read the year [2000-2100]. pub fn get_year(&mut self) -> Result> { - let mut data = [0; 2]; - self.iface.read_two_registers(Register::MONTH, &mut data)?; - let century = data[0] & BitFlags::CENTURY; - let year = packed_bcd_to_decimal(data[1]); + let mut data = [0; 3]; + data[0] = Register::MONTH; + self.iface.read_data(&mut data)?; + let century = data[1] & BitFlags::CENTURY; + let year = packed_bcd_to_decimal(data[2]); if century != 0 { Ok(2100 + (year as u16)) } @@ -167,13 +168,15 @@ where let data = self.iface.read_register(Register::MONTH)?; let month_bcd = data & !BitFlags::CENTURY; if year > 2099 { - let data = [ BitFlags::CENTURY | month_bcd, - decimal_to_packed_bcd((year - 2100) as u8) ]; - self.iface.write_two_registers(Register::MONTH, &data) + let mut data = [ Register::MONTH, + BitFlags::CENTURY | month_bcd, + decimal_to_packed_bcd((year - 2100) as u8) ]; + self.iface.write_data(&mut data) } else { - let data = [ month_bcd, decimal_to_packed_bcd((year - 2000) as u8) ]; - self.iface.write_two_registers(Register::MONTH, &data) + let mut data = [ Register::MONTH, month_bcd, + decimal_to_packed_bcd((year - 2000) as u8) ]; + self.iface.write_data(&mut data) } } diff --git a/src/interface.rs b/src/interface.rs index 9d5ccb5..8d6b76d 100644 --- a/src/interface.rs +++ b/src/interface.rs @@ -25,8 +25,8 @@ pub trait WriteData { type Error; /// Write to an u8 register fn write_register(&mut self, register: u8, data: u8) -> Result<(), Error>; - /// Write to two consecutive u8 registers - fn write_two_registers(&mut self, first_register: u8, data: &[u8; 2]) -> Result<(), Error>; + /// Write data. The first element corresponds to the starting address. + fn write_data(&mut self, payload: &mut [u8]) -> Result<(), Error>; } impl WriteData for I2cInterface @@ -41,8 +41,7 @@ where .map_err(Error::Comm) } - fn write_two_registers(&mut self, first_register: u8, data: &[u8; 2]) -> Result<(), Error> { - let payload: [u8; 3] = [first_register, data[0], data[1]]; + fn write_data(&mut self, payload: &mut [u8]) -> Result<(), Error> { self.i2c .write(DEVICE_ADDRESS, &payload) .map_err(Error::Comm) @@ -67,10 +66,9 @@ where result } - fn write_two_registers(&mut self, first_register: u8, data: &[u8; 2]) -> Result<(), Error> { + fn write_data(&mut self, payload: &mut [u8]) -> Result<(), Error> { self.cs.set_low(); - - let payload: [u8; 3] = [first_register + 0x80, data[0], data[1]]; + payload[0] += 0x80; let result = self.spi .write(&payload) .map_err(Error::Comm); @@ -87,8 +85,8 @@ pub trait ReadData { type Error; /// Read an u8 register fn read_register(&mut self, register: u8) -> Result>; - /// Read two u8 registers - fn read_two_registers(&mut self, register: u8, data: &mut [u8; 2]) -> Result<(), Error>; + /// Read some data. The first element corresponds to the starting address. + fn read_data(&mut self, payload: &mut [u8]) -> Result<(), Error>; } impl ReadData for I2cInterface @@ -104,9 +102,10 @@ where .and(Ok(data[0])) } - fn read_two_registers(&mut self, register: u8, data: &mut [u8; 2]) -> Result<(), Error> { + fn read_data(&mut self, payload: &mut [u8]) -> Result<(), Error> { + let len = payload.len(); self.i2c - .write_read(DEVICE_ADDRESS, &[register], &mut data[..]) + .write_read(DEVICE_ADDRESS, &[payload[0]], &mut payload[1..=(len-1)]) .map_err(Error::Comm) } } @@ -130,19 +129,13 @@ where } } - fn read_two_registers(&mut self, register: u8, data: &mut [u8; 2]) -> Result<(), Error> { + fn read_data(&mut self, mut payload: &mut [u8]) -> Result<(), Error> { self.cs.set_low(); - let mut payload = [register, 0, 0]; let result = self.spi .transfer(&mut payload) .map_err(Error::Comm); self.cs.set_high(); - match result { - Ok(result) => { data[0] = result[1]; - data[1] = result[2]; - Ok(()) - }, - Err(e) => Err(e) - } + result?; + Ok(()) } }