@@ -118,7 +118,7 @@ fn serial_write_thread(mut port: Box<dyn SerialPort>, receiver: mpsc::Receiver<V
118118 // This is a blocking recv so we don't have to worry about the port.
119119 while let Some ( v) = recv. blocking_recv ( ) {
120120 if let Err ( err) = port. write_all ( & v) {
121- error ! ( "Cannot write data to serial port, exiting thread: {}" , err) ;
121+ warn ! ( "Cannot write data to serial port, exiting thread: {}" , err) ;
122122 return ;
123123 }
124124 }
@@ -158,6 +158,7 @@ fn serial_read_thread(
158158 warn ! ( "Error reading from serial port: {:?}" , e) ;
159159 if e. kind ( ) == serialport:: ErrorKind :: NoDevice {
160160 info ! ( "Serial device gone, breaking out of read loop." ) ;
161+ break ;
161162 }
162163 }
163164 }
@@ -206,6 +207,8 @@ impl SerialPortHardware {
206207 */
207208 // TODO for now, assume 8/N/1. Not really sure when/if this would ever change.
208209 let port_name = port_info. port_name . clone ( ) ;
210+ let port_name_clone = port_name. clone ( ) ;
211+
209212 thread:: Builder :: new ( )
210213 . name ( "Serial Port Connection Thread" . to_string ( ) )
211214 . spawn ( move || {
@@ -232,15 +235,30 @@ impl SerialPortHardware {
232235 let ( writer_sender, writer_receiver) = mpsc:: channel ( 256 ) ;
233236 let ( reader_sender, reader_receiver) = mpsc:: channel ( 256 ) ;
234237
238+ let connected = Arc :: new ( AtomicBool :: new ( true ) ) ;
235239 let token = CancellationToken :: new ( ) ;
236240 let read_token = token. child_token ( ) ;
237241 let read_port = ( * port)
238242 . try_clone ( )
239243 . expect ( "Should always be able to clone port" ) ;
244+ let connected_clone = connected. clone ( ) ;
245+ let event_stream_clone = device_event_sender. clone ( ) ;
240246 let read_thread = thread:: Builder :: new ( )
241247 . name ( "Serial Reader Thread" . to_string ( ) )
242248 . spawn ( move || {
243249 serial_read_thread ( read_port, reader_sender, read_token) ;
250+ connected_clone. store ( false , Ordering :: Relaxed ) ;
251+ if event_stream_clone. receiver_count ( ) != 0 {
252+ if let Err ( err) = event_stream_clone
253+ . send ( HardwareEvent :: Disconnected (
254+ format ! ( "{:?}" , & port_name_clone)
255+ ) ) {
256+ error ! (
257+ "Cannot send notification, device object disappeared: {:?}" ,
258+ err
259+ ) ;
260+ }
261+ }
244262 } )
245263 . expect ( "Should always be able to create thread" ) ;
246264
@@ -263,7 +281,7 @@ impl SerialPortHardware {
263281 port_receiver : Arc :: new ( Mutex :: new ( reader_receiver) ) ,
264282 port_sender : writer_sender,
265283 _port : Arc :: new ( Mutex :: new ( port) ) ,
266- connected : Arc :: new ( AtomicBool :: new ( true ) ) ,
284+ connected,
267285 device_event_sender,
268286 thread_cancellation_token : token,
269287 } )
0 commit comments