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
use crate::{Ds1307, Error, Register, ADDR};
use embedded_hal::blocking::i2c::{Write, WriteRead};
const RAM_BYTE_COUNT: usize = (Register::RAM_END - Register::RAM_BEGIN + 1) as usize;
impl<I2C, E> Ds1307<I2C>
where
I2C: Write<Error = E> + WriteRead<Error = E>,
{
pub fn read_ram(&mut self, address_offset: u8, data: &mut [u8]) -> Result<(), Error<E>> {
if data.is_empty() {
return Ok(());
}
self.check_ram_parameters(address_offset, data)?;
self.i2c
.write_read(ADDR, &[Register::RAM_BEGIN + address_offset], &mut data[..])
.map_err(Error::I2C)
}
pub fn write_ram(&mut self, address_offset: u8, data: &[u8]) -> Result<(), Error<E>> {
if data.is_empty() {
return Ok(());
}
self.check_ram_parameters(address_offset, data)?;
let mut payload = [0; RAM_BYTE_COUNT + 1];
payload[0] = Register::RAM_BEGIN + address_offset;
payload[1..=data.len()].copy_from_slice(data);
self.i2c
.write(ADDR, &payload[..=data.len()])
.map_err(Error::I2C)
}
fn check_ram_parameters(&self, address_offset: u8, data: &[u8]) -> Result<(), Error<E>> {
if address_offset >= RAM_BYTE_COUNT as u8
|| (address_offset as usize + data.len()) > RAM_BYTE_COUNT
{
return Err(Error::InvalidInputData);
}
Ok(())
}
}