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" ) ]
@@ -36,27 +36,35 @@ fn write_gpio(gpio: &mut OutputPin, level: bool) {
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 && dtr_gpio. is_none ( ) {
50
58
// Assume internal UART, which has no DTR pin.
51
- return Err ( SerialConfigError :: MissingDtrForInternalUart ) ;
59
+ return Err ( Error :: from ( SerialConfigError :: MissingDtrForInternalUart ) ) ;
52
60
}
53
61
54
62
let mut gpios = Gpio :: new ( ) . unwrap ( ) ;
55
63
56
64
let rts = if let Some ( gpio) = rts_gpio {
57
65
match gpios. get ( gpio) {
58
66
Ok ( pin) => Some ( pin. into_output ( ) ) ,
59
- Err ( _) => return Err ( SerialConfigError :: GpioUnavailable ) ,
67
+ Err ( _) => return Err ( Error :: from ( SerialConfigError :: GpioUnavailable ) ) ,
60
68
}
61
69
} else {
62
70
None
@@ -65,20 +73,14 @@ impl Interface {
65
73
let dtr = if let Some ( gpio) = dtr_gpio {
66
74
match gpios. get ( gpio) {
67
75
Ok ( pin) => Some ( pin. into_output ( ) ) ,
68
- Err ( _) => return Err ( SerialConfigError :: GpioUnavailable ) ,
76
+ Err ( _) => return Err ( Error :: from ( SerialConfigError :: GpioUnavailable ) ) ,
69
77
}
70
78
} else {
71
79
None
72
80
} ;
73
81
74
- let serial = serialport:: new ( & port_info. port_name , 115_200 )
75
- . flow_control ( FlowControl :: None )
76
- . open ( )
77
- . map_err ( Error :: from)
78
- . wrap_err_with ( || format ! ( "Failed to open serial port {}" , port_info. port_name) ) ?;
79
-
80
82
Ok ( Self {
81
- serial_port : serial ,
83
+ serial_port : open_port ( port_info ) ? ,
82
84
rts,
83
85
dtr,
84
86
} )
@@ -89,15 +91,9 @@ impl Interface {
89
91
port_info : & SerialPortInfo ,
90
92
_opts : & ConnectOpts ,
91
93
_config : & Config ,
92
- ) -> Result < Self , Error > {
93
- let serial = serialport:: new ( & port_info. port_name , 115_200 )
94
- . flow_control ( FlowControl :: None )
95
- . open ( )
96
- . map_err ( Error :: from)
97
- . wrap_err_with ( || format ! ( "Failed to open serial port {}" , port_info. port_name) ) ?;
98
-
94
+ ) -> Result < Self > {
99
95
Ok ( Self {
100
- serial_port : serial ,
96
+ serial_port : open_port ( port_info ) ? ,
101
97
} )
102
98
}
103
99
0 commit comments