display_interface_i2c/
asynch.rs

1use display_interface::{AsyncWriteOnlyDataCommand, DataFormat, DisplayError};
2
3use crate::I2CInterface;
4
5impl<I2C> AsyncWriteOnlyDataCommand for I2CInterface<I2C>
6where
7    I2C: embedded_hal_async::i2c::I2c,
8{
9    async fn send_commands(&mut self, cmds: DataFormat<'_>) -> Result<(), DisplayError> {
10        // Copy over given commands to new aray to prefix with command identifier
11        match cmds {
12            DataFormat::U8(slice) => {
13                let mut writebuf: [u8; 8] = [0; 8];
14                writebuf[1..=slice.len()].copy_from_slice(&slice[0..slice.len()]);
15
16                self.i2c
17                    .write(self.addr, &writebuf[..=slice.len()])
18                    .await
19                    .map_err(|_| DisplayError::BusWriteError)
20            }
21            _ => Err(DisplayError::DataFormatNotImplemented),
22        }
23    }
24
25    async fn send_data(&mut self, buf: DataFormat<'_>) -> Result<(), DisplayError> {
26        match buf {
27            DataFormat::U8(slice) => {
28                // No-op if the data buffer is empty
29                if slice.is_empty() {
30                    return Ok(());
31                }
32
33                let mut writebuf = [0; 17];
34
35                // Data mode
36                writebuf[0] = self.data_byte;
37
38                for chunk in slice.chunks(16) {
39                    let chunk_len = chunk.len();
40
41                    // Copy over all data from buffer, leaving the data command byte intact
42                    writebuf[1..=chunk_len].copy_from_slice(chunk);
43
44                    self.i2c
45                        .write(self.addr, &writebuf[0..=chunk_len])
46                        .await
47                        .map_err(|_| DisplayError::BusWriteError)?;
48                }
49
50                Ok(())
51            }
52            DataFormat::U8Iter(iter) => {
53                let mut writebuf = [0; 17];
54                let mut i = 1;
55                let len = writebuf.len();
56
57                // Data mode
58                writebuf[0] = self.data_byte;
59
60                for byte in iter.into_iter() {
61                    writebuf[i] = byte;
62                    i += 1;
63
64                    if i == len {
65                        self.i2c
66                            .write(self.addr, &writebuf[0..=len])
67                            .await
68                            .map_err(|_| DisplayError::BusWriteError)?;
69                        i = 1;
70                    }
71                }
72
73                if i > 1 {
74                    self.i2c
75                        .write(self.addr, &writebuf[0..=i])
76                        .await
77                        .map_err(|_| DisplayError::BusWriteError)?;
78                }
79
80                Ok(())
81            }
82            _ => Err(DisplayError::DataFormatNotImplemented),
83        }
84    }
85}