display_interface_i2c/
asynch.rs1use 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 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 if slice.is_empty() {
30 return Ok(());
31 }
32
33 let mut writebuf = [0; 17];
34
35 writebuf[0] = self.data_byte;
37
38 for chunk in slice.chunks(16) {
39 let chunk_len = chunk.len();
40
41 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 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}