|
5 | 5 | use embedded_hal as hal;
|
6 | 6 | use hal::digital::v2::OutputPin;
|
7 | 7 |
|
8 |
| -use display_interface::{DataFormat, DisplayError, WriteOnlyDataCommand}; |
| 8 | +use display_interface::{DisplayError, WriteOnlyDataCommand}; |
9 | 9 |
|
10 |
| -fn send_u8<SPI: hal::blocking::spi::Write<u8>>( |
| 10 | +fn send_iter<SPI: hal::blocking::spi::Write<u8>, I: Iterator<Item = u8>>( |
11 | 11 | spi: &mut SPI,
|
12 |
| - words: DataFormat<'_>, |
| 12 | + iter: I, |
13 | 13 | ) -> Result<(), DisplayError> {
|
14 |
| - match words { |
15 |
| - DataFormat::U8(slice) => spi.write(slice).map_err(|_| DisplayError::BusWriteError), |
16 |
| - DataFormat::U16(slice) => { |
17 |
| - use byte_slice_cast::*; |
18 |
| - spi.write(slice.as_byte_slice()) |
19 |
| - .map_err(|_| DisplayError::BusWriteError) |
20 |
| - } |
21 |
| - DataFormat::U16LE(slice) => { |
22 |
| - use byte_slice_cast::*; |
23 |
| - for v in slice.as_mut() { |
24 |
| - *v = v.to_le(); |
25 |
| - } |
26 |
| - spi.write(slice.as_byte_slice()) |
27 |
| - .map_err(|_| DisplayError::BusWriteError) |
28 |
| - } |
29 |
| - DataFormat::U16BE(slice) => { |
30 |
| - use byte_slice_cast::*; |
31 |
| - for v in slice.as_mut() { |
32 |
| - *v = v.to_be(); |
33 |
| - } |
34 |
| - spi.write(slice.as_byte_slice()) |
35 |
| - .map_err(|_| DisplayError::BusWriteError) |
36 |
| - } |
37 |
| - DataFormat::U8Iter(iter) => { |
38 |
| - let mut buf = [0; 32]; |
39 |
| - let mut i = 0; |
40 |
| - |
41 |
| - for v in iter.into_iter() { |
42 |
| - buf[i] = v; |
43 |
| - i += 1; |
44 |
| - |
45 |
| - if i == buf.len() { |
46 |
| - spi.write(&buf).map_err(|_| DisplayError::BusWriteError)?; |
47 |
| - i = 0; |
48 |
| - } |
49 |
| - } |
50 |
| - |
51 |
| - if i > 0 { |
52 |
| - spi.write(&buf[..i]) |
53 |
| - .map_err(|_| DisplayError::BusWriteError)?; |
54 |
| - } |
55 |
| - |
56 |
| - Ok(()) |
57 |
| - } |
58 |
| - DataFormat::U16LEIter(iter) => { |
59 |
| - use byte_slice_cast::*; |
60 |
| - let mut buf = [0; 32]; |
61 |
| - let mut i = 0; |
62 |
| - |
63 |
| - for v in iter.map(u16::to_le) { |
64 |
| - buf[i] = v; |
65 |
| - i += 1; |
66 |
| - |
67 |
| - if i == buf.len() { |
68 |
| - spi.write(&buf.as_byte_slice()) |
69 |
| - .map_err(|_| DisplayError::BusWriteError)?; |
70 |
| - i = 0; |
71 |
| - } |
72 |
| - } |
73 |
| - |
74 |
| - if i > 0 { |
75 |
| - spi.write(&buf[..i].as_byte_slice()) |
76 |
| - .map_err(|_| DisplayError::BusWriteError)?; |
77 |
| - } |
78 |
| - |
79 |
| - Ok(()) |
80 |
| - } |
81 |
| - DataFormat::U16BEIter(iter) => { |
82 |
| - use byte_slice_cast::*; |
83 |
| - let mut buf = [0; 64]; |
84 |
| - let mut i = 0; |
85 |
| - let len = buf.len(); |
86 |
| - |
87 |
| - for v in iter.map(u16::to_be) { |
88 |
| - buf[i] = v; |
89 |
| - i += 1; |
90 |
| - |
91 |
| - if i == len { |
92 |
| - spi.write(&buf.as_byte_slice()) |
93 |
| - .map_err(|_| DisplayError::BusWriteError)?; |
94 |
| - i = 0; |
95 |
| - } |
96 |
| - } |
97 |
| - |
98 |
| - if i > 0 { |
99 |
| - spi.write(&buf[..i].as_byte_slice()) |
100 |
| - .map_err(|_| DisplayError::BusWriteError)?; |
101 |
| - } |
102 |
| - |
103 |
| - Ok(()) |
| 14 | + let mut buf = [0; 32]; |
| 15 | + let mut i = 0; |
| 16 | + |
| 17 | + for v in iter { |
| 18 | + buf[i] = v; |
| 19 | + i += 1; |
| 20 | + |
| 21 | + if i == buf.len() { |
| 22 | + spi.write(&buf).map_err(|_| DisplayError::BusWriteError)?; |
| 23 | + i = 0; |
104 | 24 | }
|
105 |
| - _ => Err(DisplayError::DataFormatNotImplemented), |
106 | 25 | }
|
| 26 | + |
| 27 | + if i > 0 { |
| 28 | + spi.write(&buf[..i]) |
| 29 | + .map_err(|_| DisplayError::BusWriteError)?; |
| 30 | + } |
| 31 | + |
| 32 | + Ok(()) |
107 | 33 | }
|
108 | 34 |
|
109 | 35 | /// SPI display interface.
|
@@ -139,31 +65,41 @@ where
|
139 | 65 | DC: OutputPin,
|
140 | 66 | CS: OutputPin,
|
141 | 67 | {
|
142 |
| - fn send_commands(&mut self, cmds: DataFormat<'_>) -> Result<(), DisplayError> { |
| 68 | + type Word = u8; |
| 69 | + |
| 70 | + #[inline] |
| 71 | + fn send_command_iter<I>(&mut self, iter: I) -> Result<(), DisplayError> |
| 72 | + where |
| 73 | + I: Iterator<Item = Self::Word>, |
| 74 | + { |
143 | 75 | // Assert chip select pin
|
144 | 76 | self.cs.set_low().map_err(|_| DisplayError::CSError)?;
|
145 | 77 |
|
146 | 78 | // 1 = data, 0 = command
|
147 | 79 | self.dc.set_low().map_err(|_| DisplayError::DCError)?;
|
148 | 80 |
|
149 | 81 | // Send words over SPI
|
150 |
| - let err = send_u8(&mut self.spi, cmds); |
| 82 | + let err = send_iter(&mut self.spi, iter); |
151 | 83 |
|
152 | 84 | // Deassert chip select pin
|
153 | 85 | self.cs.set_high().ok();
|
154 | 86 |
|
155 | 87 | err
|
156 | 88 | }
|
157 | 89 |
|
158 |
| - fn send_data(&mut self, buf: DataFormat<'_>) -> Result<(), DisplayError> { |
| 90 | + #[inline] |
| 91 | + fn send_data_iter<I>(&mut self, iter: I) -> Result<(), DisplayError> |
| 92 | + where |
| 93 | + I: Iterator<Item = Self::Word>, |
| 94 | + { |
159 | 95 | // Assert chip select pin
|
160 | 96 | self.cs.set_low().map_err(|_| DisplayError::CSError)?;
|
161 | 97 |
|
162 | 98 | // 1 = data, 0 = command
|
163 | 99 | self.dc.set_high().map_err(|_| DisplayError::DCError)?;
|
164 | 100 |
|
165 | 101 | // Send words over SPI
|
166 |
| - let err = send_u8(&mut self.spi, buf); |
| 102 | + let err = send_iter(&mut self.spi, iter); |
167 | 103 |
|
168 | 104 | // Deassert chip select pin
|
169 | 105 | self.cs.set_high().ok();
|
@@ -202,19 +138,29 @@ where
|
202 | 138 | SPI: hal::blocking::spi::Write<u8>,
|
203 | 139 | DC: OutputPin,
|
204 | 140 | {
|
205 |
| - fn send_commands(&mut self, cmds: DataFormat<'_>) -> Result<(), DisplayError> { |
| 141 | + type Word = u8; |
| 142 | + |
| 143 | + #[inline] |
| 144 | + fn send_command_iter<I>(&mut self, iter: I) -> Result<(), DisplayError> |
| 145 | + where |
| 146 | + I: Iterator<Item = Self::Word>, |
| 147 | + { |
206 | 148 | // 1 = data, 0 = command
|
207 | 149 | self.dc.set_low().map_err(|_| DisplayError::DCError)?;
|
208 | 150 |
|
209 | 151 | // Send words over SPI
|
210 |
| - send_u8(&mut self.spi, cmds) |
| 152 | + send_iter(&mut self.spi, iter) |
211 | 153 | }
|
212 | 154 |
|
213 |
| - fn send_data(&mut self, buf: DataFormat<'_>) -> Result<(), DisplayError> { |
| 155 | + #[inline] |
| 156 | + fn send_data_iter<I>(&mut self, iter: I) -> Result<(), DisplayError> |
| 157 | + where |
| 158 | + I: Iterator<Item = Self::Word>, |
| 159 | + { |
214 | 160 | // 1 = data, 0 = command
|
215 | 161 | self.dc.set_high().map_err(|_| DisplayError::DCError)?;
|
216 | 162 |
|
217 | 163 | // Send words over SPI
|
218 |
| - send_u8(&mut self.spi, buf) |
| 164 | + send_iter(&mut self.spi, iter) |
219 | 165 | }
|
220 | 166 | }
|
0 commit comments