|
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_u8_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,29 @@ where
|
139 | 65 | DC: OutputPin,
|
140 | 66 | CS: OutputPin,
|
141 | 67 | {
|
142 |
| - fn send_commands(&mut self, cmds: DataFormat<'_>) -> Result<(), DisplayError> { |
143 |
| - // Assert chip select pin |
144 |
| - self.cs.set_low().map_err(|_| DisplayError::CSError)?; |
145 |
| - |
146 |
| - // 1 = data, 0 = command |
147 |
| - self.dc.set_low().map_err(|_| DisplayError::DCError)?; |
148 |
| - |
149 |
| - // Send words over SPI |
150 |
| - let err = send_u8(&mut self.spi, cmds); |
151 |
| - |
152 |
| - // Deassert chip select pin |
153 |
| - self.cs.set_high().ok(); |
154 |
| - |
155 |
| - err |
156 |
| - } |
157 |
| - |
158 |
| - fn send_data(&mut self, buf: DataFormat<'_>) -> Result<(), DisplayError> { |
| 68 | + type Word = u8; |
| 69 | + |
| 70 | + #[inline] |
| 71 | + fn send_iter<I>( |
| 72 | + &mut self, |
| 73 | + data_or_command: display_interface::DataOrCommand, |
| 74 | + iter: I, |
| 75 | + ) -> Result<(), DisplayError> |
| 76 | + where |
| 77 | + I: Iterator<Item = Self::Word>, |
| 78 | + { |
159 | 79 | // Assert chip select pin
|
160 | 80 | self.cs.set_low().map_err(|_| DisplayError::CSError)?;
|
161 | 81 |
|
162 | 82 | // 1 = data, 0 = command
|
163 |
| - self.dc.set_high().map_err(|_| DisplayError::DCError)?; |
| 83 | + match data_or_command { |
| 84 | + display_interface::DataOrCommand::Data => self.dc.set_high(), |
| 85 | + display_interface::DataOrCommand::Command => self.dc.set_low(), |
| 86 | + } |
| 87 | + .map_err(|_| DisplayError::DCError)?; |
164 | 88 |
|
165 | 89 | // Send words over SPI
|
166 |
| - let err = send_u8(&mut self.spi, buf); |
| 90 | + let err = send_u8_iter(&mut self.spi, iter); |
167 | 91 |
|
168 | 92 | // Deassert chip select pin
|
169 | 93 | self.cs.set_high().ok();
|
@@ -202,19 +126,25 @@ where
|
202 | 126 | SPI: hal::blocking::spi::Write<u8>,
|
203 | 127 | DC: OutputPin,
|
204 | 128 | {
|
205 |
| - fn send_commands(&mut self, cmds: DataFormat<'_>) -> Result<(), DisplayError> { |
| 129 | + type Word = u8; |
| 130 | + |
| 131 | + #[inline] |
| 132 | + fn send_iter<I>( |
| 133 | + &mut self, |
| 134 | + data_or_command: display_interface::DataOrCommand, |
| 135 | + iter: I, |
| 136 | + ) -> Result<(), DisplayError> |
| 137 | + where |
| 138 | + I: Iterator<Item = Self::Word>, |
| 139 | + { |
206 | 140 | // 1 = data, 0 = command
|
207 |
| - self.dc.set_low().map_err(|_| DisplayError::DCError)?; |
208 |
| - |
209 |
| - // Send words over SPI |
210 |
| - send_u8(&mut self.spi, cmds) |
211 |
| - } |
212 |
| - |
213 |
| - fn send_data(&mut self, buf: DataFormat<'_>) -> Result<(), DisplayError> { |
214 |
| - // 1 = data, 0 = command |
215 |
| - self.dc.set_high().map_err(|_| DisplayError::DCError)?; |
| 141 | + match data_or_command { |
| 142 | + display_interface::DataOrCommand::Data => self.dc.set_high(), |
| 143 | + display_interface::DataOrCommand::Command => self.dc.set_low(), |
| 144 | + } |
| 145 | + .map_err(|_| DisplayError::DCError)?; |
216 | 146 |
|
217 | 147 | // Send words over SPI
|
218 |
| - send_u8(&mut self.spi, buf) |
| 148 | + send_u8_iter(&mut self.spi, iter) |
219 | 149 | }
|
220 | 150 | }
|
0 commit comments