1
1
use core:: fmt;
2
- use embedded_hal:: blocking:: serial as bserial;
3
- use embedded_hal:: serial;
4
- use microbit:: hal:: uarte:: { Error , Instance , Uarte , UarteRx , UarteTx } ;
2
+ use core:: ptr:: addr_of_mut;
3
+ use embedded_hal_nb:: nb;
4
+ use embedded_hal_nb:: serial:: { Error as SerialError , ErrorType , Read , Write } ;
5
+ use embedded_io:: { Read as EmbeddedIoRead , Write as EmbeddedIoWrite } ;
6
+ use microbit:: hal:: uarte:: { Instance , Uarte , UarteRx , UarteTx } ;
5
7
6
8
static mut TX_BUF : [ u8 ; 1 ] = [ 0 ; 1 ] ;
7
9
static mut RX_BUF : [ u8 ; 1 ] = [ 0 ; 1 ] ;
@@ -11,36 +13,58 @@ pub struct UartePort<T: Instance>(UarteTx<T>, UarteRx<T>);
11
13
impl < T : Instance > UartePort < T > {
12
14
pub fn new ( serial : Uarte < T > ) -> UartePort < T > {
13
15
let ( tx, rx) = serial
14
- . split ( unsafe { & mut TX_BUF } , unsafe { & mut RX_BUF } )
16
+ . split ( unsafe { & mut * addr_of_mut ! ( TX_BUF ) } , unsafe {
17
+ & mut * addr_of_mut ! ( RX_BUF )
18
+ } )
15
19
. unwrap ( ) ;
16
20
UartePort ( tx, rx)
17
21
}
18
22
}
19
23
20
- impl < T : Instance > fmt:: Write for UartePort < T > {
21
- fn write_str ( & mut self , s : & str ) -> fmt:: Result {
22
- self . 0 . write_str ( s)
24
+ #[ derive( Debug ) ]
25
+ pub enum Error {
26
+ Other ,
27
+ }
28
+
29
+ impl SerialError for Error {
30
+ fn kind ( & self ) -> embedded_hal_nb:: serial:: ErrorKind {
31
+ embedded_hal_nb:: serial:: ErrorKind :: Other
23
32
}
24
33
}
25
34
26
- impl < T : Instance > serial :: Write < u8 > for UartePort < T > {
35
+ impl < T : Instance > ErrorType for UartePort < T > {
27
36
type Error = Error ;
37
+ }
28
38
29
- fn write ( & mut self , b : u8 ) -> nb:: Result < ( ) , Self :: Error > {
30
- self . 0 . write ( b)
39
+ impl < T : Instance > fmt:: Write for UartePort < T > {
40
+ fn write_str ( & mut self , s : & str ) -> fmt:: Result {
41
+ for byte in s. bytes ( ) {
42
+ nb:: block!( self . write( byte) ) . map_err ( |_| fmt:: Error ) ?;
43
+ }
44
+ Ok ( ( ) )
45
+ }
46
+ }
47
+
48
+ impl < T : Instance > Write < u8 > for UartePort < T > {
49
+ fn write ( & mut self , word : u8 ) -> nb:: Result < ( ) , Self :: Error > {
50
+ self . 0
51
+ . write ( & [ word] )
52
+ . map_err ( |_| nb:: Error :: Other ( Error :: Other ) ) ?;
53
+ Ok ( ( ) )
31
54
}
32
55
33
56
fn flush ( & mut self ) -> nb:: Result < ( ) , Self :: Error > {
34
- self . 0 . flush ( )
57
+ self . 0 . flush ( ) . map_err ( |_| nb :: Error :: Other ( Error :: Other ) )
35
58
}
36
59
}
37
60
38
- impl < T : Instance > bserial:: write:: Default < u8 > for UartePort < T > { }
39
-
40
- impl < T : Instance > serial:: Read < u8 > for UartePort < T > {
41
- type Error = Error ;
42
-
61
+ impl < T : Instance > Read < u8 > for UartePort < T > {
43
62
fn read ( & mut self ) -> nb:: Result < u8 , Self :: Error > {
44
- self . 1 . read ( )
63
+ let mut buffer = [ 0u8 ; 1 ] ;
64
+ match self . 1 . read ( & mut buffer) {
65
+ Ok ( 1 ) => Ok ( buffer[ 0 ] ) ,
66
+ Ok ( _) => Err ( nb:: Error :: WouldBlock ) ,
67
+ Err ( _) => Err ( nb:: Error :: Other ( Error :: Other ) ) ,
68
+ }
45
69
}
46
70
}
0 commit comments