Skip to content

Commit 55e40f8

Browse files
committed
spi: Update to new api
1 parent a8acc08 commit 55e40f8

File tree

2 files changed

+54
-125
lines changed

2 files changed

+54
-125
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: 54 additions & 124 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_u8_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,29 @@ where
13965
DC: OutputPin,
14066
CS: OutputPin,
14167
{
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+
{
15979
// Assert chip select pin
16080
self.cs.set_low().map_err(|_| DisplayError::CSError)?;
16181

16282
// 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)?;
16488

16589
// Send words over SPI
166-
let err = send_u8(&mut self.spi, buf);
90+
let err = send_u8_iter(&mut self.spi, iter);
16791

16892
// Deassert chip select pin
16993
self.cs.set_high().ok();
@@ -202,19 +126,25 @@ where
202126
SPI: hal::blocking::spi::Write<u8>,
203127
DC: OutputPin,
204128
{
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+
{
206140
// 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)?;
216146

217147
// Send words over SPI
218-
send_u8(&mut self.spi, buf)
148+
send_u8_iter(&mut self.spi, iter)
219149
}
220150
}

0 commit comments

Comments
 (0)