Skip to content

Commit 2cb4d64

Browse files
committed
spi: Update to new api
1 parent 97859b8 commit 2cb4d64

File tree

2 files changed

+48
-103
lines changed

2 files changed

+48
-103
lines changed

spi/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,3 @@ all-features = true
2020
[dependencies]
2121
embedded-hal = "0.2.3"
2222
display-interface = "0.4"
23-
byte-slice-cast = { version = "0.3.5", default-features = false }

spi/src/lib.rs

Lines changed: 48 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -5,105 +5,31 @@
55
use embedded_hal as hal;
66
use hal::digital::v2::OutputPin;
77

8-
use display_interface::{DataFormat, DisplayError, WriteOnlyDataCommand};
8+
use display_interface::{DisplayError, WriteOnlyDataCommand};
99

10-
fn send_u8<SPI: hal::blocking::spi::Write<u8>>(
10+
fn send_iter<SPI: hal::blocking::spi::Write<u8>, I: Iterator<Item = u8>>(
1111
spi: &mut SPI,
12-
words: DataFormat<'_>,
12+
iter: I,
1313
) -> 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;
10424
}
105-
_ => Err(DisplayError::DataFormatNotImplemented),
10625
}
26+
27+
if i > 0 {
28+
spi.write(&buf[..i])
29+
.map_err(|_| DisplayError::BusWriteError)?;
30+
}
31+
32+
Ok(())
10733
}
10834

10935
/// SPI display interface.
@@ -139,31 +65,41 @@ where
13965
DC: OutputPin,
14066
CS: OutputPin,
14167
{
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+
{
14375
// Assert chip select pin
14476
self.cs.set_low().map_err(|_| DisplayError::CSError)?;
14577

14678
// 1 = data, 0 = command
14779
self.dc.set_low().map_err(|_| DisplayError::DCError)?;
14880

14981
// Send words over SPI
150-
let err = send_u8(&mut self.spi, cmds);
82+
let err = send_iter(&mut self.spi, iter);
15183

15284
// Deassert chip select pin
15385
self.cs.set_high().ok();
15486

15587
err
15688
}
15789

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+
{
15995
// Assert chip select pin
16096
self.cs.set_low().map_err(|_| DisplayError::CSError)?;
16197

16298
// 1 = data, 0 = command
16399
self.dc.set_high().map_err(|_| DisplayError::DCError)?;
164100

165101
// Send words over SPI
166-
let err = send_u8(&mut self.spi, buf);
102+
let err = send_iter(&mut self.spi, iter);
167103

168104
// Deassert chip select pin
169105
self.cs.set_high().ok();
@@ -202,19 +138,29 @@ where
202138
SPI: hal::blocking::spi::Write<u8>,
203139
DC: OutputPin,
204140
{
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+
{
206148
// 1 = data, 0 = command
207149
self.dc.set_low().map_err(|_| DisplayError::DCError)?;
208150

209151
// Send words over SPI
210-
send_u8(&mut self.spi, cmds)
152+
send_iter(&mut self.spi, iter)
211153
}
212154

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+
{
214160
// 1 = data, 0 = command
215161
self.dc.set_high().map_err(|_| DisplayError::DCError)?;
216162

217163
// Send words over SPI
218-
send_u8(&mut self.spi, buf)
164+
send_iter(&mut self.spi, iter)
219165
}
220166
}

0 commit comments

Comments
 (0)