1
1
use std:: io:: Read ;
2
2
3
3
use crate :: { cli:: ConnectOpts , Config , Error } ;
4
- use miette:: Context ;
4
+ use miette:: { Context , Result } ;
5
5
use serialport:: { FlowControl , SerialPort , SerialPortInfo } ;
6
6
7
7
#[ cfg( feature = "raspberry" ) ]
@@ -29,36 +29,44 @@ pub struct Interface {
29
29
30
30
#[ cfg( feature = "raspberry" ) ]
31
31
fn write_gpio ( gpio : & mut OutputPin , level : bool ) {
32
- if pin_state {
32
+ if level {
33
33
gpio. set_high ( ) ;
34
34
} else {
35
35
gpio. set_low ( ) ;
36
36
}
37
37
}
38
38
39
+ fn open_port ( port_info : & SerialPortInfo ) -> Result < Box < dyn SerialPort > > {
40
+ serialport:: new ( & port_info. port_name , 115_200 )
41
+ . flow_control ( FlowControl :: None )
42
+ . open ( )
43
+ . map_err ( Error :: from)
44
+ . wrap_err_with ( || format ! ( "Failed to open serial port {}" , port_info. port_name) )
45
+ }
46
+
39
47
impl Interface {
40
48
#[ cfg( feature = "raspberry" ) ]
41
49
pub ( crate ) fn new (
42
50
port_info : & SerialPortInfo ,
43
51
opts : & ConnectOpts ,
44
52
config : & Config ,
45
- ) -> Result < Self , Error > {
53
+ ) -> Result < Self > {
46
54
let rts_gpio = opts. rts . or ( config. rts ) ;
47
55
let dtr_gpio = opts. dtr . or ( config. dtr ) ;
48
56
49
57
if port_info. port_type == serialport:: SerialPortType :: Unknown
50
58
&& ( dtr_gpio. is_none ( ) || rts_gpio. is_none ( ) )
51
59
{
52
60
// Assume internal UART, which has no DTR pin and usually no RTS either.
53
- return Err ( Error :: from ( SerialConfigError :: MissingDtrRtsForInternalUart ) ) ;
61
+ return Err ( Error :: from ( SerialConfigError :: MissingDtrRtsForInternalUart ) . into ( ) ) ;
54
62
}
55
63
56
- let mut gpios = Gpio :: new ( ) . unwrap ( ) ;
64
+ let gpios = Gpio :: new ( ) . unwrap ( ) ;
57
65
58
66
let rts = if let Some ( gpio) = rts_gpio {
59
67
match gpios. get ( gpio) {
60
68
Ok ( pin) => Some ( pin. into_output ( ) ) ,
61
- Err ( _) => return Err ( SerialConfigError :: GpioUnavailable ) ,
69
+ Err ( _) => return Err ( Error :: from ( SerialConfigError :: GpioUnavailable ( gpio ) ) . into ( ) ) ,
62
70
}
63
71
} else {
64
72
None
@@ -67,20 +75,14 @@ impl Interface {
67
75
let dtr = if let Some ( gpio) = dtr_gpio {
68
76
match gpios. get ( gpio) {
69
77
Ok ( pin) => Some ( pin. into_output ( ) ) ,
70
- Err ( _) => return Err ( SerialConfigError :: GpioUnavailable ) ,
78
+ Err ( _) => return Err ( Error :: from ( SerialConfigError :: GpioUnavailable ( gpio ) ) . into ( ) ) ,
71
79
}
72
80
} else {
73
81
None
74
82
} ;
75
83
76
- let serial = serialport:: new ( & port_info. port_name , 115_200 )
77
- . flow_control ( FlowControl :: None )
78
- . open ( )
79
- . map_err ( Error :: from)
80
- . wrap_err_with ( || format ! ( "Failed to open serial port {}" , port_info. port_name) ) ?;
81
-
82
84
Ok ( Self {
83
- serial_port : serial ,
85
+ serial_port : open_port ( port_info ) ? ,
84
86
rts,
85
87
dtr,
86
88
} )
@@ -91,15 +93,9 @@ impl Interface {
91
93
port_info : & SerialPortInfo ,
92
94
_opts : & ConnectOpts ,
93
95
_config : & Config ,
94
- ) -> Result < Self , Error > {
95
- let serial = serialport:: new ( & port_info. port_name , 115_200 )
96
- . flow_control ( FlowControl :: None )
97
- . open ( )
98
- . map_err ( Error :: from)
99
- . wrap_err_with ( || format ! ( "Failed to open serial port {}" , port_info. port_name) ) ?;
100
-
96
+ ) -> Result < Self > {
101
97
Ok ( Self {
102
- serial_port : serial ,
98
+ serial_port : open_port ( port_info ) ? ,
103
99
} )
104
100
}
105
101
0 commit comments