@@ -8,25 +8,20 @@ use std::io;
8
8
use std:: ops;
9
9
use std:: path:: Path ;
10
10
11
- use crate :: Delay ;
12
- use spidev:: SpidevTransfer ;
13
-
14
11
/// Newtype around [`spidev::Spidev`] that implements the `embedded-hal` traits
15
12
///
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 ) ;
18
15
19
16
impl Spidev {
20
17
/// See [`spidev::Spidev::open`][0] for details.
21
18
///
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
23
20
pub fn open < P > ( path : P ) -> Result < Self , SPIError >
24
21
where
25
22
P : AsRef < Path > ,
26
23
{
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 ( ) )
30
25
}
31
26
}
32
27
@@ -46,10 +41,10 @@ impl ops::DerefMut for Spidev {
46
41
47
42
mod embedded_hal_impl {
48
43
use super :: * ;
49
- use embedded_hal:: delay:: DelayUs ;
50
44
use embedded_hal:: spi:: ErrorType ;
51
45
use embedded_hal:: spi:: { Operation as SpiOperation , SpiBus , SpiDevice } ;
52
46
use spidev:: SpidevTransfer ;
47
+ use std:: convert:: TryInto ;
53
48
use std:: io:: { Read , Write } ;
54
49
55
50
impl ErrorType for Spidev {
@@ -88,62 +83,33 @@ mod embedded_hal_impl {
88
83
& mut self ,
89
84
operations : & mut [ SpiOperation < ' _ , u8 > ] ,
90
85
) -> 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) ,
101
92
SpiOperation :: TransferInPlace ( buf) => {
102
93
let tx = unsafe {
103
94
let p = buf. as_ptr ( ) ;
104
95
std:: slice:: from_raw_parts ( p, buf. len ( ) )
105
96
} ;
106
- spidev_transfers . push ( SpidevTransfer :: read_write ( tx, buf) )
97
+ SpidevTransfer :: read_write ( tx, buf)
107
98
}
108
99
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 ) )
133
101
}
134
- }
135
- }
136
-
102
+ } )
103
+ . collect ( ) ;
104
+ self . 0
105
+ . transfer_multiple ( & mut transfers)
106
+ . map_err ( |err| SPIError { err } ) ?;
107
+ self . flush ( ) ?;
137
108
Ok ( ( ) )
138
109
}
139
110
}
140
111
}
141
112
142
- enum Operation < ' a , ' b > {
143
- Transfers ( Vec < SpidevTransfer < ' a , ' b > > ) ,
144
- Delay ( u32 ) ,
145
- }
146
-
147
113
/// Error type wrapping [io::Error](io::Error) to implement [embedded_hal::spi::ErrorKind]
148
114
#[ derive( Debug ) ]
149
115
pub struct SPIError {
0 commit comments