@@ -20,10 +20,7 @@ use crate::{read_versioned_msg_signed, write_versioned_msg_signed, SigningConfig
2020use super :: Connectable ;
2121
2222pub struct SerialConnection {
23- // Separate ports for reading and writing as it's safe to use concurrently.
24- // See the official ref: https://github.com/serialport/serialport-rs/blob/321f85e1886eaa1302aef8a600a631bc1c88703a/examples/duplex.rs
25- read_port : Mutex < PeekReader < Box < dyn SerialPort > > > ,
26- write_port : Mutex < Box < dyn SerialPort > > ,
23+ port : Mutex < PeekReader < Box < dyn SerialPort > > > ,
2724 sequence : AtomicU8 ,
2825 protocol_version : MavlinkVersion ,
2926 recv_any_version : bool ,
@@ -33,7 +30,7 @@ pub struct SerialConnection {
3330
3431impl < M : Message > MavConnection < M > for SerialConnection {
3532 fn recv ( & self ) -> Result < ( MavHeader , M ) , MessageReadError > {
36- let mut port = self . read_port . lock ( ) . unwrap ( ) ;
33+ let mut port = self . port . lock ( ) . unwrap ( ) ;
3734 loop {
3835 let version = ReadVersion :: from_conn_cfg :: < _ , M > ( self ) ;
3936 #[ cfg( not( feature = "signing" ) ) ]
@@ -70,20 +67,20 @@ impl<M: Message> MavConnection<M> for SerialConnection {
7067 }
7168
7269 fn send ( & self , header : & MavHeader , data : & M ) -> Result < usize , MessageWriteError > {
73- let mut port = self . write_port . lock ( ) . unwrap ( ) ;
70+ let mut port = self . port . lock ( ) . unwrap ( ) ;
7471
7572 let sequence = self . sequence . fetch_add (
7673 1 ,
7774 // Safety:
7875 //
7976 // We are using `Ordering::Relaxed` here because:
8077 // - We only need a unique sequence number per message
81- // - `Mutex` on `self.write_port ` already makes sure the rest of the code is synchronized
78+ // - `Mutex` on `self.port ` already makes sure the rest of the code is synchronized
8279 // - No other thread reads or writes `self.sequence` without going through this `Mutex`
8380 //
8481 // Warning:
8582 //
86- // If we later change this code to access `self.sequence` without locking `self.write_port ` with the `Mutex`,
83+ // If we later change this code to access `self.sequence` without locking `self.port ` with the `Mutex`,
8784 // then we should upgrade this ordering to `Ordering::SeqCst`.
8885 atomic:: Ordering :: Relaxed ,
8986 ) ;
@@ -95,10 +92,10 @@ impl<M: Message> MavConnection<M> for SerialConnection {
9592 } ;
9693
9794 #[ cfg( not( feature = "signing" ) ) ]
98- let result = write_versioned_msg ( port. deref_mut ( ) , self . protocol_version , header, data) ;
95+ let result = write_versioned_msg ( port. reader_mut ( ) , self . protocol_version , header, data) ;
9996 #[ cfg( feature = "signing" ) ]
10097 let result = write_versioned_msg_signed (
101- port. deref_mut ( ) ,
98+ port. reader_mut ( ) ,
10299 self . protocol_version ,
103100 header,
104101 data,
@@ -131,18 +128,15 @@ impl<M: Message> MavConnection<M> for SerialConnection {
131128
132129impl Connectable for SerialConnectable {
133130 fn connect < M : Message > ( & self ) -> io:: Result < Box < dyn MavConnection < M > + Sync + Send > > {
134- let read_port = serialport:: new ( & self . port_name , self . baud_rate )
131+ let port = serialport:: new ( & self . port_name , self . baud_rate )
135132 . data_bits ( DataBits :: Eight )
136133 . parity ( Parity :: None )
137134 . stop_bits ( StopBits :: One )
138135 . flow_control ( FlowControl :: None )
139136 . open ( ) ?;
140137
141- let write_port = read_port. try_clone ( ) ?;
142-
143138 Ok ( Box :: new ( SerialConnection {
144- read_port : Mutex :: new ( PeekReader :: new ( read_port) ) ,
145- write_port : Mutex :: new ( write_port) ,
139+ port : Mutex :: new ( PeekReader :: new ( port) ) ,
146140 sequence : AtomicU8 :: new ( 0 ) ,
147141 protocol_version : MavlinkVersion :: V2 ,
148142 #[ cfg( feature = "signing" ) ]
0 commit comments