@@ -8,25 +8,20 @@ use std::io;
88use std:: ops;
99use std:: path:: Path ;
1010
11- use crate :: Delay ;
12- use spidev:: SpidevTransfer ;
13-
1411/// Newtype around [`spidev::Spidev`] that implements the `embedded-hal` traits
1512///
16- /// [`spidev::Spidev`]: https://docs.rs/spidev/0.5.spidev /spidev/struct.Spidev.html
17- pub struct Spidev ( pub spidev:: Spidev , Delay ) ;
13+ /// [`spidev::Spidev`]: https://docs.rs/spidev/0.5.2 /spidev/struct.Spidev.html
14+ pub struct Spidev ( pub spidev:: Spidev ) ;
1815
1916impl Spidev {
2017 /// See [`spidev::Spidev::open`][0] for details.
2118 ///
22- /// [0]: https://docs.rs/spidev/0.5.spidev /spidev/struct.Spidev.html#method.open
19+ /// [0]: https://docs.rs/spidev/0.5.2 /spidev/struct.Spidev.html#method.open
2320 pub fn open < P > ( path : P ) -> Result < Self , SPIError >
2421 where
2522 P : AsRef < Path > ,
2623 {
27- spidev:: Spidev :: open ( path)
28- . map ( |spidev| Spidev ( spidev, Delay { } ) )
29- . map_err ( |e| e. into ( ) )
24+ spidev:: Spidev :: open ( path) . map ( Spidev ) . map_err ( |e| e. into ( ) )
3025 }
3126}
3227
@@ -46,10 +41,10 @@ impl ops::DerefMut for Spidev {
4641
4742mod embedded_hal_impl {
4843 use super :: * ;
49- use embedded_hal:: delay:: DelayUs ;
5044 use embedded_hal:: spi:: ErrorType ;
5145 use embedded_hal:: spi:: { Operation as SpiOperation , SpiBus , SpiDevice } ;
5246 use spidev:: SpidevTransfer ;
47+ use std:: convert:: TryInto ;
5348 use std:: io:: { Read , Write } ;
5449
5550 impl ErrorType for Spidev {
@@ -88,62 +83,33 @@ mod embedded_hal_impl {
8883 & mut self ,
8984 operations : & mut [ SpiOperation < ' _ , u8 > ] ,
9085 ) -> Result < ( ) , Self :: Error > {
91- let mut spidev_ops: Vec < Operation > = vec ! [ ] ;
92- let mut spidev_transfers: Vec < SpidevTransfer > = vec ! [ ] ;
93-
94- for op in operations {
95- match op {
96- SpiOperation :: Read ( buf) => spidev_transfers. push ( SpidevTransfer :: read ( buf) ) ,
97- SpiOperation :: Write ( buf) => spidev_transfers. push ( SpidevTransfer :: write ( buf) ) ,
98- SpiOperation :: Transfer ( read, write) => {
99- spidev_transfers. push ( SpidevTransfer :: read_write ( write, read) )
100- }
86+ let mut transfers: Vec < _ > = operations
87+ . iter_mut ( )
88+ . map ( |op| match op {
89+ SpiOperation :: Read ( buf) => SpidevTransfer :: read ( buf) ,
90+ SpiOperation :: Write ( buf) => SpidevTransfer :: write ( buf) ,
91+ SpiOperation :: Transfer ( read, write) => SpidevTransfer :: read_write ( write, read) ,
10192 SpiOperation :: TransferInPlace ( buf) => {
10293 let tx = unsafe {
10394 let p = buf. as_ptr ( ) ;
10495 std:: slice:: from_raw_parts ( p, buf. len ( ) )
10596 } ;
106- spidev_transfers . push ( SpidevTransfer :: read_write ( tx, buf) )
97+ SpidevTransfer :: read_write ( tx, buf)
10798 }
10899 SpiOperation :: DelayUs ( us) => {
109- if !spidev_transfers. is_empty ( ) {
110- let mut transfers: Vec < SpidevTransfer > = vec ! [ ] ;
111- std:: mem:: swap ( & mut transfers, & mut spidev_transfers) ;
112- spidev_ops. push ( Operation :: Transfers ( transfers) ) ;
113- }
114- spidev_ops. push ( Operation :: Delay ( us. to_owned ( ) ) ) ;
115- }
116- }
117- }
118-
119- if !spidev_transfers. is_empty ( ) {
120- spidev_ops. push ( Operation :: Transfers ( spidev_transfers) ) ;
121- }
122-
123- for op in spidev_ops {
124- match op {
125- Operation :: Transfers ( mut transfers) => {
126- self . 0
127- . transfer_multiple ( & mut transfers)
128- . map_err ( |err| SPIError { err } ) ?;
129- self . flush ( ) ?;
130- }
131- Operation :: Delay ( us) => {
132- self . 1 . delay_us ( us) ;
100+ SpidevTransfer :: delay ( ( * us) . try_into ( ) . unwrap_or ( u16:: MAX ) )
133101 }
134- }
135- }
136-
102+ } )
103+ . collect ( ) ;
104+ self . 0
105+ . transfer_multiple ( & mut transfers)
106+ . map_err ( |err| SPIError { err } ) ?;
107+ self . flush ( ) ?;
137108 Ok ( ( ) )
138109 }
139110 }
140111}
141112
142- enum Operation < ' a , ' b > {
143- Transfers ( Vec < SpidevTransfer < ' a , ' b > > ) ,
144- Delay ( u32 ) ,
145- }
146-
147113/// Error type wrapping [io::Error](io::Error) to implement [embedded_hal::spi::ErrorKind]
148114#[ derive( Debug ) ]
149115pub struct SPIError {
0 commit comments