11use std:: io:: Read ;
22
33use crate :: { cli:: ConnectOpts , Config , Error } ;
4- use miette:: Context ;
4+ use miette:: { Context , Result } ;
55use serialport:: { FlowControl , SerialPort , SerialPortInfo } ;
66
77#[ cfg( feature = "raspberry" ) ]
@@ -29,36 +29,44 @@ pub struct Interface {
2929
3030#[ cfg( feature = "raspberry" ) ]
3131fn write_gpio ( gpio : & mut OutputPin , level : bool ) {
32- if pin_state {
32+ if level {
3333 gpio. set_high ( ) ;
3434 } else {
3535 gpio. set_low ( ) ;
3636 }
3737}
3838
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+
3947impl Interface {
4048 #[ cfg( feature = "raspberry" ) ]
4149 pub ( crate ) fn new (
4250 port_info : & SerialPortInfo ,
4351 opts : & ConnectOpts ,
4452 config : & Config ,
45- ) -> Result < Self , Error > {
53+ ) -> Result < Self > {
4654 let rts_gpio = opts. rts . or ( config. rts ) ;
4755 let dtr_gpio = opts. dtr . or ( config. dtr ) ;
4856
4957 if port_info. port_type == serialport:: SerialPortType :: Unknown
5058 && ( dtr_gpio. is_none ( ) || rts_gpio. is_none ( ) )
5159 {
5260 // 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 ( ) ) ;
5462 }
5563
56- let mut gpios = Gpio :: new ( ) . unwrap ( ) ;
64+ let gpios = Gpio :: new ( ) . unwrap ( ) ;
5765
5866 let rts = if let Some ( gpio) = rts_gpio {
5967 match gpios. get ( gpio) {
6068 Ok ( pin) => Some ( pin. into_output ( ) ) ,
61- Err ( _) => return Err ( SerialConfigError :: GpioUnavailable ) ,
69+ Err ( _) => return Err ( Error :: from ( SerialConfigError :: GpioUnavailable ( gpio ) ) . into ( ) ) ,
6270 }
6371 } else {
6472 None
@@ -67,20 +75,14 @@ impl Interface {
6775 let dtr = if let Some ( gpio) = dtr_gpio {
6876 match gpios. get ( gpio) {
6977 Ok ( pin) => Some ( pin. into_output ( ) ) ,
70- Err ( _) => return Err ( SerialConfigError :: GpioUnavailable ) ,
78+ Err ( _) => return Err ( Error :: from ( SerialConfigError :: GpioUnavailable ( gpio ) ) . into ( ) ) ,
7179 }
7280 } else {
7381 None
7482 } ;
7583
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-
8284 Ok ( Self {
83- serial_port : serial ,
85+ serial_port : open_port ( port_info ) ? ,
8486 rts,
8587 dtr,
8688 } )
@@ -91,15 +93,9 @@ impl Interface {
9193 port_info : & SerialPortInfo ,
9294 _opts : & ConnectOpts ,
9395 _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 > {
10197 Ok ( Self {
102- serial_port : serial ,
98+ serial_port : open_port ( port_info ) ? ,
10399 } )
104100 }
105101
0 commit comments