serial_thread/
lib.rs

1pub use tokio;
2pub use serial;
3use serial::{BaudRate, CharSize, FlowControl, Parity, SerialPort, StopBits, SystemPort};
4use serialport::available_ports;
5use std::io::{Read, Write};
6use std::time::{Duration, Instant};
7use tokio::time::sleep;
8
9#[cfg(feature = "async-channel")]
10pub use async_channel;
11#[cfg(feature = "async-channel")]
12use async_channel::{Receiver, Sender};
13#[cfg(not(feature = "async-channel"))]
14use std::sync::mpsc::{Receiver, Sender};
15
16
17#[derive(Debug, Clone)]
18pub enum SerialInterfaceError {
19    CannotListPorts,
20    StopToChangeSettings,
21    DisconnectToChangeSettings,
22    CannotReadPort(Option<String>),
23    WrongReadArguments,
24    CannotOpenPort(String),
25    PortNotOpened,
26    SlaveModeNeedModbusID,
27    PortAlreadyOpen,
28    PortNeededToOpenPort,
29    SilenceMissing,
30    PathMissing,
31    NoPortToClose,
32    CannotSendMessage,
33    WrongMode,
34    CannotWritePort,
35    StopModeBeforeChange,
36    WaitingForResponse,
37    CannotSetTimeout,
38}
39
40/// Represents the status of the SerialInterface, indicating its current operation or state.
41#[derive(Debug, Clone)]
42pub enum Status {
43    Read,
44    Receipt,
45    Write,
46    WaitingResponse,
47    None,
48}
49
50/// Defines the operating modes of the SerialInterface.
51#[derive(Debug, Clone, PartialEq)]
52pub enum Mode {
53    /// Operating as a master in a master-slave configuration.
54    Master,
55    /// Operating as a slave in a master-slave configuration.
56    Slave,
57    /// Listening on the serial line without interfering.
58    Sniff,
59    /// Stopped or inactive state.
60    Stop,
61}
62
63#[derive(Debug, Clone)]
64pub enum SerialMessage {
65    // Settings / Flow control (handled when Mode = Stop)
66
67    /// Request: Lists available serial ports.
68    /// Handled in 'Stop' mode. Response: Triggers `AvailablePorts` message with port list.
69    ListPorts,
70
71    /// Response: Provides a list of available serial ports.
72    /// Type: Vec<String> representing port names.
73    AvailablePorts(Vec<String>),
74
75    /// Request: Sets the serial port to be used.
76    /// Type: String representing the port path.
77    /// Handled in 'Stop' mode. Affects settings for subsequent `Connect` commands.
78    SetPort(String),
79
80    /// Request: Sets the baud rate for the serial communication.
81    /// Type: BaudRate.
82    /// Handled in 'Stop' mode. Updates baud rate settings for the serial interface.
83    SetBauds(BaudRate),
84
85    /// Request: Sets the character size for the serial communication.
86    /// Type: CharSize.
87    /// Handled in 'Stop' mode. Updates character size settings for the serial interface.
88    SetCharSize(CharSize),
89
90    /// Request: Sets the parity for the serial communication.
91    /// Type: Parity.
92    /// Handled in 'Stop' mode. Updates parity settings for the serial interface.
93    SetParity(Parity),
94    /// Request: Sets the stop bits for the serial communication.
95    /// Type: StopBits.
96    /// Handled in 'Stop' mode. Updates stop bits settings for the serial interface.
97    SetStopBits(StopBits),
98
99    /// Request: Sets the flow control for the serial communication.
100    /// Type: FlowControl.
101    /// Handled in 'Stop' mode. Updates flow control settings for the serial interface.
102    SetFlowControl(FlowControl),
103
104    /// Request: Sets the timeout for the serial communication.
105    /// Type: Duration.
106    /// Handled in all modes. Updates timeout settings for the serial interface.
107    SetTimeout(Duration),
108
109    /// Request: Establishes a connection using the current serial port settings.
110    /// Handled in 'Stop' mode. Response: `Connected(true)` on success, or an `Error` message on failure.
111    Connect,
112
113    /// Request: Disconnects the current serial connection.
114    /// Handled in all modes. Response: `Connected(false)` after disconnection.
115    Disconnect,
116
117    // Data messages (handled when mode != Stop)
118
119    /// Request: Sends data over the serial connection.
120    /// Type: Vec<u8> representing the data to be sent.
121    /// Handled when mode is not 'Stop'. Response: `DataSent` with the sent data upon successful transmission.
122    Send(Vec<u8>),
123
124    /// Response: Indicates that data has been sent over the serial connection.
125    /// Type: Vec<u8> representing the sent data.
126    DataSent(Vec<u8>),
127
128    /// Response: Indicates received data over the serial connection.
129    /// Type: Vec<u8> representing the received data.
130    Receive(Vec<u8>),
131
132    /// Response: Indicates that data has been sent over the serial connection but no response 
133    /// from the peer.
134    NoResponse,
135
136    // General messages (always handled)
137
138    /// Request: Retrieves the current status of the serial interface.
139    /// Response: `Status` with the current status of the interface.
140    GetStatus,
141
142    /// Response: Indicates the current status of the serial interface.
143    /// Type: Status enum.
144    Status(Status),
145
146    /// Request: Retrieves the current connection status of the serial interface.
147    /// Response: `Connected` indicating whether the interface is connected.
148    GetConnectionStatus,
149
150    /// Response: Indicates the current connection status of the serial interface.
151    /// Type: bool indicating connection status.
152    Connected(bool),
153
154    /// Request: Sets the operating mode of the SerialInterface.
155    /// Type: Mode enum.
156    /// Changes the operating mode of the interface.
157    SetMode(Mode),
158
159    /// Response: Indicates the current operating mode of the SerialInterface.
160    /// Type: Mode enum.
161    Mode(Mode),
162
163    /// Response: Represents an error within the SerialInterface.
164    /// Type: SIError enum.
165    Error(SIError),
166
167    /// Request: Ping message for connection testing.
168    /// Response: Generates a `Pong` message in response.
169    Ping,
170
171    /// Response: Pong message as a response to a Ping.
172    Pong,
173}
174
175type SIError = SerialInterfaceError;
176
177/// Represents a serial interface with various modes and functionalities.
178/// It handles serial communication, including reading, writing, and managing port settings.
179/// It operates in different modes such as Master, Slave, and Sniff.
180pub struct SerialInterface {
181    path: Option<String>,
182    mode: Mode,
183    status: Status,
184    modbus_id: Option<u8>,
185    baud_rate: BaudRate,
186    char_size: CharSize,
187    parity: Parity,
188    stop_bits: StopBits,
189    flow_control: FlowControl,
190    port: Option<SystemPort>,
191    silence: Option<Duration>,
192    timeout: Duration,
193    receiver: Option<Receiver<SerialMessage>>,
194    sender: Option<Sender<SerialMessage>>,
195    last_byte_time: Option<Instant>,
196}
197
198impl SerialInterface {
199    /// Creates a new instance of the SerialInterface with default settings.
200    /// Returns a SerialInterface object encapsulated in a Result, with an error if initialization fails.
201    pub fn new() -> Result<Self, SIError> {
202        Ok(SerialInterface {
203            path: None,
204            mode: Mode::Stop,
205            status: Status::None,
206            modbus_id: None,
207            baud_rate: BaudRate::Baud115200,
208            char_size: CharSize::Bits8,
209            parity: Parity::ParityNone,
210            stop_bits: StopBits::Stop2,
211            flow_control: FlowControl::FlowNone,
212            port: None,
213            silence: Some(Duration::from_nanos(800)), // FIXME: what policy for init silence here?
214            timeout: Duration::from_nanos(10000),     // FIXME: what policy for init timeout here?
215            receiver: None,
216            sender: None,
217            last_byte_time: None,
218        })
219    }
220
221    /// Sets the path for the serial interface.
222    /// Returns the modified instance of the SerialInterface for method chaining.
223    pub fn path(mut self, path: String) -> Self {
224        self.path = Some(path);
225        self
226    }
227
228    /// Sets the baud rate for the serial interface.
229    /// Returns the modified instance of the SerialInterface for method chaining.
230    pub fn bauds(mut self, bauds: BaudRate) -> Self {
231        self.baud_rate = bauds;
232        // TODO: if self.silence is none => automatic choice
233        self
234    }
235
236    /// Sets the character size for the serial interface.
237    /// Returns the modified instance of the SerialInterface for method chaining.
238    pub fn char_size(mut self, size: CharSize) -> Self {
239        self.char_size = size;
240        self
241    }
242
243    /// Sets the parity for the serial interface.
244    /// Returns the modified instance of the SerialInterface for method chaining.
245    pub fn parity(mut self, parity: Parity) -> Self {
246        self.parity = parity;
247        self
248    }
249
250    /// Sets the parity for the serial interface.
251    /// Returns the modified instance of the SerialInterface for method chaining.
252    pub fn stop_bits(mut self, stop_bits: StopBits) -> Self {
253        self.stop_bits = stop_bits;
254        self
255    }
256
257    /// Sets the flow control for the serial interface.
258    /// Returns the modified instance of the SerialInterface for method chaining.
259    pub fn flow_control(mut self, flow_control: FlowControl) -> Self {
260        self.flow_control = flow_control;
261        self
262    }
263
264    // /// Sets the operating mode of the SerialInterface.
265    // /// The mode can be changed only when the current mode is 'Stop'.
266    // /// Returns a Result with the modified instance or an error if the mode cannot be changed.
267    // pub fn mode(mut self, mode: Mode) -> Result<Self, SIError> {
268    //     if let Mode::Stop = &self.mode {
269    //         self.mode = mode;
270    //         Ok(self)
271    //     } else {
272    //         Err(SIError::StopToChangeSettings)
273    //     }
274    // }
275
276    /// Sets the Modbus ID for the serial interface.
277    /// Returns the modified instance of the SerialInterface for method chaining.
278    pub fn modbus_id(mut self, modbus_id: u8) -> Self {
279        self.modbus_id = Some(modbus_id);
280        self
281    }
282
283    /// Sets the silence interval for the serial interface. Silence interval used to detect
284    /// end of modbus frame.
285    /// Returns the modified instance of the SerialInterface for method chaining.
286    pub fn silence(mut self, silence: Duration) -> Self {
287        self.silence = Some(silence);
288        self
289    }
290
291    /// Sets the receiver channel for the serial interface.
292    /// Returns the modified instance of the SerialInterface for method chaining.
293    pub fn receiver(mut self, receiver: Receiver<SerialMessage>) -> Self {
294        self.receiver = Some(receiver);
295        self
296    }
297
298    /// Sets the sender channel for the serial interface.
299    /// Returns the modified instance of the SerialInterface for method chaining.
300    pub fn sender(mut self, sender: Sender<SerialMessage>) -> Self {
301        self.sender = Some(sender);
302        self
303    }
304
305    /// Sets the operating mode of the SerialInterface.
306    /// Can only be set when the current mode is 'Stop'.
307    /// Returns a Result with () or an error if the mode cannot be changed.
308    pub fn set_mode(&mut self, m: Mode) -> Result<(), SIError> {
309        if let Mode::Stop = &self.mode {
310            if self.modbus_id.is_none() {
311                if let Mode::Slave = m {
312                    return Err(SIError::SlaveModeNeedModbusID);
313                }
314            } else if self.port.is_some() {
315                return Err(SIError::DisconnectToChangeSettings);
316            }
317            self.mode = m;
318            log::info!("SerialInterface::switch mode to {:?}", &self.mode);
319            Ok(())
320        } else {
321            Err(SIError::StopToChangeSettings)
322        }
323    }
324
325    /// Retrieves the current operating mode of the SerialInterface.
326    pub fn get_mode(&self) -> &Mode {
327        &self.mode
328    }
329
330    /// Retrieves the current status of the SerialInterface.
331    pub fn get_state(&self) -> &Status {
332        &self.status
333    }
334
335    /// Lists available serial ports.
336    /// Returns a Result containing a list of port names or an error if ports cannot be listed.
337    pub fn list_ports() -> Result<Vec<String>, SIError> {
338        // TODO: get rid of serialport crate dependency
339        if let Ok(ports) = available_ports() {
340            Ok(ports.iter().map(|p| p.port_name.clone()).collect())
341        } else {
342            Err(SerialInterfaceError::CannotListPorts)
343        }
344        // Ok(vec!["/dev/ttyXR0".to_string(), "/dev/ttyXR1".to_string()])
345    }
346
347    /// CLear data from the read buffer.
348    fn clear_read_buffer(&mut self) -> Result<(), SIError> {
349        let port_open = self.port.is_some();
350        if port_open {
351            let mut buffer = [0u8; 24];
352            loop {
353                let read = self.port.as_mut().unwrap().read(&mut buffer);
354                let ret = match read {
355                    Ok(r) => {
356                        log::info!("SerialInterface::buffer clear {:?}", buffer.to_vec());
357                        r
358                    }
359                    Err(e) => {
360                        let str_err = e.to_string();
361                        if str_err == *"Operation timed out" {
362                            0
363                        } else {
364                            return Err(SIError::CannotReadPort(Some(str_err)));
365                        }
366                    }
367                };
368                if ret == 0 {
369                    break;
370                };
371            }
372            Ok(())
373        } else {
374            Err(SIError::PortNotOpened)
375        }
376    }
377
378    /// Read 1 bytes of data, return None if no data in buffer.
379    fn read_byte(&mut self) -> Result<Option<u8>, SIError> {
380        let port_open = self.port.is_some();
381        if port_open {
382            let mut buffer = [0u8; 1];
383            let read = self.port.as_mut().unwrap().read(&mut buffer);
384            let l = match read {
385                Ok(r) => r,
386                Err(e) => {
387                    let str_err = e.to_string();
388                    if str_err == *"Operation timed out" {
389                        0
390                    } else {
391                        return Err(SIError::CannotReadPort(Some(str_err)));
392                    }
393                }
394            };
395            if l > 0 {
396                let rcv_time = Instant::now();
397                let from_last = self
398                    .last_byte_time
399                    .map(|last_byte| rcv_time.duration_since(last_byte));
400                log::debug!(
401                    "SerialInterface::read_byte({:?}, from last: {:?})",
402                    buffer,
403                    from_last
404                );
405                self.last_byte_time = Some(rcv_time);
406                Ok(Some(buffer[0]))
407            } else {
408                Ok(None)
409            }
410        } else {
411            Err(SIError::PortNotOpened)
412        }
413    }
414
415    
416    
417    /// Generalist read() implementation, polling serial buffer, while not data been received on serial buffer,
418    /// checking received messages on self.receiver , if Send() received, return.
419    /// Error if none of size/silence/timeout passed.
420    #[cfg(not(feature = "async-channel"))]
421    #[allow(unused)]
422    fn read_until_size_or_silence_or_timeout_or_message(
423        &mut self,
424        size: Option<usize>,
425        silence: Option<&Duration>,
426        timeout: Option<&Duration>,
427    ) -> Result<Option<SerialMessage>, SIError> {
428        self.clear_read_buffer()?;
429        let mut buffer: Vec<u8> = Vec::new();
430        let start = Instant::now();
431        let mut last_data = Instant::now();
432
433        if !(size.is_some() || timeout.is_some() || silence.is_some()) {
434            return Err(SIError::WrongReadArguments);
435        }
436
437        loop {
438            let result = self.read_byte()?;
439            // receive data
440            if let Some(data) = result {
441                // log::debug!("Start receive data: {}", data);
442                self.status = Status::Receipt;
443                buffer.push(data);
444                // reset the silence counter
445                last_data = Instant::now();
446
447                // check for size reach
448                if let Some(size) = &size {
449                    if &buffer.len() == size {
450                        let result = self
451                            .send_message(SerialMessage::Receive(buffer.clone()));
452                        self.status = Status::None;
453                        return if let Err(e) = result {
454                            Err(e)
455                        } else {
456                            Ok(None)
457                        };
458                    }
459                }
460            } else if let Some(silence) = silence {
461                // we not yet start receive
462                if buffer.is_empty() {
463                    // Wait to receive first data
464                    if let Some(msg) = self.read_message()? {
465                        return Ok(Some(msg));
466                    }
467                    last_data = Instant::now();
468                } else {
469                    // receiving and waiting for silence
470                    let from_last_data = &Instant::now().duration_since(last_data);
471                    // log::debug!("Duration from last data: {:?}", from_last_data);
472                    if from_last_data > silence {
473                        log::debug!("silence reached, data received: {:?}", buffer.to_vec());
474                        let result = self
475                            .send_message(SerialMessage::Receive(buffer.clone()));
476                        self.status = Status::None;
477                        return if let Err(e) = result {
478                            Err(e)
479                        } else {
480                            Ok(None)
481                        };
482                    }
483                }
484            }
485            // check timeout
486            if let Some(timeout) = timeout {
487                if &Instant::now().duration_since(start) > timeout {
488                    return if !buffer.is_empty() {
489                        let result = self
490                            .send_message(SerialMessage::Receive(buffer.clone()));
491                        self.status = Status::None;
492                        if let Err(e) = result {
493                            Err(e)
494                        } else {
495                            Ok(None)
496                        }
497                    } else {
498                        let result = self
499                            .send_message(SerialMessage::NoResponse);
500                        self.status = Status::None;
501                        if let Err(e) = result {
502                            Err(e)
503                        } else {
504                            Ok(None)
505                        }
506                    }
507                }
508            }
509        }
510    }
511
512    /// Generalist read() implementation, polling serial buffer, while not data been received on serial buffer,
513    /// checking received messages on self.receiver , if Send() received, return.
514    /// Error if none of size/silence/timeout passed.
515    #[cfg(feature = "async-channel")]
516    #[allow(unused)]
517    async fn read_until_size_or_silence_or_timeout_or_message(
518        &mut self,
519        size: Option<usize>,
520        silence: Option<&Duration>,
521        timeout: Option<&Duration>,
522    ) -> Result<Option<SerialMessage>, SIError> {
523        self.clear_read_buffer()?;
524        let mut buffer: Vec<u8> = Vec::new();
525        let start = Instant::now();
526        let mut last_data = Instant::now();
527
528        if !(size.is_some() || timeout.is_some() || silence.is_some()) {
529            return Err(SIError::WrongReadArguments);
530        }
531
532        loop {
533            let result = self.read_byte()?;
534            // receive data
535            if let Some(data) = result {
536                // log::debug!("Start receive data: {}", data);
537                self.status = Status::Receipt;
538                buffer.push(data);
539                // reset the silence counter
540                last_data = Instant::now();
541
542                // check for size reach
543                if let Some(size) = &size {
544                    if &buffer.len() == size {
545                        let result = self
546                            .send_message(SerialMessage::Receive(buffer.clone()))
547                            .await;
548                        self.status = Status::None;
549                        return if let Err(e) = result {
550                            Err(e)
551                        } else {
552                            Ok(None)
553                        };
554                    }
555                }
556            } else if let Some(silence) = silence {
557                // we not yet start receive
558                if buffer.is_empty() {
559                    // Wait to receive first data
560                    if let Some(msg) = self.read_message().await? {
561                        return Ok(Some(msg));
562                    }
563                    last_data = Instant::now();
564                } else {
565                    // receiving and waiting for silence
566                    let from_last_data = &Instant::now().duration_since(last_data);
567                    // log::debug!("Duration from last data: {:?}", from_last_data);
568                    if from_last_data > silence {
569                        log::debug!("silence reached, data received: {:?}", buffer.to_vec());
570                        let result = self
571                            .send_message(SerialMessage::Receive(buffer.clone()))
572                            .await;
573                        self.status = Status::None;
574                        return if let Err(e) = result {
575                            Err(e)
576                        } else {
577                            Ok(None)
578                        };
579                    }
580                }
581            }
582            // check timeout
583            if let Some(timeout) = timeout {
584                if &Instant::now().duration_since(start) > timeout {
585                    return if !buffer.is_empty() {
586                        let result = self
587                            .send_message(SerialMessage::Receive(buffer.clone()))
588                            .await;
589                        self.status = Status::None;
590                        if let Err(e) = result {
591                            Err(e)
592                        } else {
593                            Ok(None)
594                        }
595                    } else {
596                        let result = self
597                            .send_message(SerialMessage::NoResponse)
598                            .await;
599                        self.status = Status::None;
600                        if let Err(e) = result {
601                            Err(e)
602                        } else {
603                            Ok(None)
604                        }
605                    }
606                }
607            }
608        }
609    }
610
611    
612    
613    /// Read <s> bytes of data, blocking until get the <s> number of bytes.
614    #[cfg(not(feature = "async-channel"))]
615    #[allow(unused)]
616    fn read_size(&mut self, s: usize) -> Result<Option<SerialMessage>, SIError> {
617        self.read_until_size_or_silence_or_timeout_or_message(Some(s), None, None)
618    }
619
620    /// Read <s> bytes of data, blocking until get the <s> number of bytes.
621    #[cfg(feature = "async-channel")]
622    #[allow(unused)]
623    async fn read_size(&mut self, s: usize) -> Result<Option<SerialMessage>, SIError> {
624        self.read_until_size_or_silence_or_timeout_or_message(Some(s), None, None)
625            .await
626    }
627
628    
629    
630    /// Should be use to listen to a Request response in Master.
631    #[cfg(not(feature = "async-channel"))]
632    #[allow(unused)]
633    fn read_until_size_or_silence(
634        &mut self,
635        size: usize,
636        silence: &Duration,
637    ) -> Result<Option<SerialMessage>, SIError> {
638        self.read_until_size_or_silence_or_timeout_or_message(Some(size), Some(silence), None)
639    }
640
641    /// Should be use to listen to a Request response in Master.
642    #[cfg(feature = "async-channel")]
643    #[allow(unused)]
644    async fn read_until_size_or_silence(
645        &mut self,
646        size: usize,
647        silence: &Duration,
648    ) -> Result<Option<SerialMessage>, SIError> {
649        self.read_until_size_or_silence_or_timeout_or_message(Some(size), Some(silence), None)
650            .await
651    }
652    
653    
654    /// Should be use to listen in Slave/Sniffing , when you don't know the size of the incoming Request.
655    #[cfg(not(feature = "async-channel"))]
656    #[allow(unused)]
657    fn read_until_silence(
658        &mut self,
659        silence: &Duration,
660    ) -> Result<Option<SerialMessage>, SIError> {
661        self.read_until_size_or_silence_or_timeout_or_message(None, Some(silence), None)
662    }
663
664    /// Should be use to listen in Slave/Sniffing , when you don't know the size of the incoming Request.
665    #[cfg(feature = "async-channel")]
666    #[allow(unused)]
667    async fn read_until_silence(
668        &mut self,
669        silence: &Duration,
670    ) -> Result<Option<SerialMessage>, SIError> {
671        self.read_until_size_or_silence_or_timeout_or_message(None, Some(silence), None)
672            .await
673    }
674
675    
676    #[cfg(not(feature = "async-channel"))]
677    #[allow(unused)]
678    fn read_until_silence_or_timeout(
679        &mut self,
680        silence: &Duration,
681        timeout: &Duration,
682    ) -> Result<Option<SerialMessage>, SIError> {
683        self.read_until_size_or_silence_or_timeout_or_message(None, Some(silence), Some(timeout))
684    }
685
686    #[cfg(feature = "async-channel")]
687    #[allow(unused)]
688    async fn read_until_silence_or_timeout(
689        &mut self,
690        silence: &Duration,
691        timeout: &Duration,
692    ) -> Result<Option<SerialMessage>, SIError> {
693        self.read_until_size_or_silence_or_timeout_or_message(None, Some(silence), Some(timeout))
694            .await
695    }
696
697    
698    /// Open the serial port.
699    pub fn open(&mut self) -> Result<(), SIError> {
700        if self.port.is_some() || self.mode != Mode::Stop {
701            Err(SIError::PortAlreadyOpen)
702            // TODO => SlaveModeNeedModbusID move this Mode::Slave
703            // } else if self.modbus_id.is_none() {
704            //     Err(SIError::SlaveModeNeedModbusID)
705            // } else if self.mode != Mode::Master && self.silence.is_none() {
706            //     Err(SIError::SilenceMissing)
707        } else if self.path.is_none() {
708            Err(SIError::PathMissing)
709        } else {
710            let mut port = serial::open(&self.path.as_ref().unwrap())
711                .map_err(|e| SIError::CannotOpenPort(e.to_string()))?;
712            let settings = serial::PortSettings {
713                baud_rate: self.baud_rate,
714                char_size: self.char_size,
715                parity: self.parity,
716                stop_bits: self.stop_bits,
717                flow_control: self.flow_control,
718            };
719            port.configure(&settings).unwrap();
720            port.set_timeout(Duration::from_nanos(10))
721                .map_err(|_| SIError::CannotSetTimeout)?;
722            self.port = Some(port);
723            Ok(())
724        }
725    }
726
727    /// Close the serial port.
728    pub fn close(&mut self) -> Result<(), SIError> {
729        if let Some(port) = self.port.take() {
730            drop(port);
731            Ok(())
732        } else {
733            Err(SIError::NoPortToClose)
734        }
735    }
736    
737
738    /// Try to send a message trough self.sender
739    #[cfg(not(feature = "async-channel"))]
740    fn send_message(&mut self, msg: SerialMessage) -> Result<(), SIError> {
741        log::debug!("SerialInterface.send_message({:?})", msg);
742        if let Some(sender) = self.sender.clone() {
743            log::debug!("SerialInterface::Send {:?}", &msg);
744            sender
745                .send(msg)
746                .map_err(|_| SIError::CannotSendMessage)?;
747            Ok(())
748        } else {
749            log::debug!("SerialInterface::SIError::CannotSendMessage");
750            Err(SIError::CannotSendMessage)
751        }
752    }
753
754    /// Try to send a message trough self.sender
755    #[cfg(feature = "async-channel")]
756    async fn send_message(&mut self, msg: SerialMessage) -> Result<(), SIError> {
757        if let Some(sender) = self.sender.clone() {
758            log::debug!("SerialInterface::Send {:?}", &msg);
759            sender
760                .send(msg)
761                .await
762                .map_err(|_| SIError::CannotSendMessage)?;
763            Ok(())
764        } else {
765            log::debug!("SerialInterface::SIError::CannotSendMessage");
766            Err(SIError::CannotSendMessage)
767        }
768    }
769    
770
771    /// Poll self.receiver channel and handle if there is one message. Return the message if it should be
772    /// handled externally. Two kind messages can be returned:
773    /// - SerialMessage::SetMode()
774    /// - SerialMessage::Send()
775    #[cfg(not(feature = "async-channel"))]
776    fn read_message(&mut self) -> Result<Option<SerialMessage>, SIError> {
777        if let Some(receiver) = &mut self.receiver {
778            if let Ok(message) = receiver.try_recv() {
779                log::debug!("SerialInterface::read_message({:?})", &message);
780                // general case, message to handle in any situation
781                match &message {
782                    SerialMessage::GetConnectionStatus => {
783                        if let Some(_port) = &self.port {
784                            self.send_message(SerialMessage::Connected(true))?;
785                        } else {
786                            self.send_message(SerialMessage::Connected(false))?;
787                        }
788                        return Ok(None);
789                    }
790                    SerialMessage::GetStatus => {
791                        self.send_message(SerialMessage::Status(self.status.clone()))?;
792                        return Ok(None);
793                    }
794                    // If ask for change mode, we return message to caller in order it can handle it.
795                    SerialMessage::SetMode(mode) => {
796                        return Ok(Some(SerialMessage::SetMode(mode.clone())));
797                    }
798                    SerialMessage::SetTimeout(timeout) => {
799                        self.timeout = *timeout;
800                        return Ok(None);
801                    }
802                    SerialMessage::Ping => {
803                        self.send_message(SerialMessage::Pong)?;
804                        return Ok(None);
805                    }
806                    _ => {}
807                }
808
809                // Stop case: Settings / Flow control
810                if self.mode == Mode::Stop {
811                    match message {
812                        SerialMessage::ListPorts => {
813                            self.send_message(SerialMessage::AvailablePorts(
814                                SerialInterface::list_ports()?,
815                            ))?;
816                            return Ok(None);
817                        }
818                        SerialMessage::SetPort(port) => {
819                            self.path = Some(port);
820                            return Ok(None);
821                        }
822                        SerialMessage::SetBauds(bauds) => {
823                            self.baud_rate = bauds;
824                            // TODO: update silence?
825                            return Ok(None);
826                        }
827                        SerialMessage::SetCharSize(char_size) => {
828                            self.char_size = char_size;
829                            return Ok(None);
830                        }
831                        SerialMessage::SetParity(parity) => {
832                            self.parity = parity;
833                            return Ok(None);
834                        }
835                        SerialMessage::SetStopBits(stop_bits) => {
836                            self.stop_bits = stop_bits;
837                            return Ok(None);
838                        }
839                        SerialMessage::SetFlowControl(flow_control) => {
840                            self.flow_control = flow_control;
841                            return Ok(None);
842                        }
843                        SerialMessage::Connect => {
844                            if let Err(e) = self.open() {
845                                log::debug!("Connect::{:?}", e);
846                                self.send_message(SerialMessage::Connected(false))?;
847                                self.send_message(SerialMessage::Error(e))?;
848                            } else {
849                                self.send_message(SerialMessage::Connected(true))?;
850                            }
851                            return Ok(None);
852                        }
853                        SerialMessage::Disconnect => {
854                            let result = self.close();
855                            self.send_message(SerialMessage::Connected(false))?;
856                            if let Err(e) = result {
857                                self.send_message(SerialMessage::Error(e))?;
858                            }
859                        }
860                        _ => {}
861                    }
862                } else if let SerialMessage::Send(data) = message {
863                    return Ok(Some(SerialMessage::Send(data)));
864                }
865            }
866        } else {
867            log::debug!("No receiver!");
868        }
869        Ok(None)
870    }
871
872    /// Poll self.receiver channel and handle if there is one message. Return the message if it should be
873    /// handled externally. Two kind messages can be returned:
874    /// - SerialMessage::SetMode()
875    /// - SerialMessage::Send()
876    #[cfg(feature = "async-channel")]
877    async fn read_message(&mut self) -> Result<Option<SerialMessage>, SIError> {
878        if let Some(receiver) = self.receiver.clone() {
879            if let Ok(message) = receiver.try_recv() {
880                log::info!("SerialInterface::Receive !!! {:?}", &message);
881                // general case, message to handle in any situation
882                match &message {
883                    SerialMessage::GetConnectionStatus => {
884                        if let Some(_port) = &self.port {
885                            self.send_message(SerialMessage::Connected(true)).await?;
886                        } else {
887                            self.send_message(SerialMessage::Connected(false)).await?;
888                        }
889                        return Ok(None);
890                    }
891                    SerialMessage::GetStatus => {
892                        self.send_message(SerialMessage::Status(self.status.clone()))
893                            .await?;
894                        return Ok(None);
895                    }
896                    // If ask for change mode, we return message to caller in order it can handle it.
897                    SerialMessage::SetMode(mode) => {
898                        return Ok(Some(SerialMessage::SetMode(mode.clone())));
899                    }
900                    SerialMessage::SetTimeout(timeout) => {
901                        self.timeout = *timeout;
902                        return Ok(None);
903                    }
904                    SerialMessage::Ping => {
905                        self.send_message(SerialMessage::Pong).await?;
906                        return Ok(None);
907                    }
908                    _ => {}
909                }
910
911                // Stop case: Settings / Flow control
912                if self.mode == Mode::Stop {
913                    match message {
914                        SerialMessage::ListPorts => {
915                            self.send_message(SerialMessage::AvailablePorts(
916                                SerialInterface::list_ports()?,
917                            ))
918                                .await?;
919                            return Ok(None);
920                        }
921                        SerialMessage::SetPort(port) => {
922                            self.path = Some(port);
923                            return Ok(None);
924                        }
925                        SerialMessage::SetBauds(bauds) => {
926                            self.baud_rate = bauds;
927                            // TODO: update silence?
928                            return Ok(None);
929                        }
930                        SerialMessage::SetCharSize(char_size) => {
931                            self.char_size = char_size;
932                            return Ok(None);
933                        }
934                        SerialMessage::SetParity(parity) => {
935                            self.parity = parity;
936                            return Ok(None);
937                        }
938                        SerialMessage::SetStopBits(stop_bits) => {
939                            self.stop_bits = stop_bits;
940                            return Ok(None);
941                        }
942                        SerialMessage::SetFlowControl(flow_control) => {
943                            self.flow_control = flow_control;
944                            return Ok(None);
945                        }
946                        SerialMessage::Connect => {
947                            if let Err(e) = self.open() {
948                                log::debug!("Connect::{:?}", e);
949                                self.send_message(SerialMessage::Connected(false)).await?;
950                                self.send_message(SerialMessage::Error(e)).await?;
951                            } else {
952                                self.send_message(SerialMessage::Connected(true)).await?;
953                            }
954                            return Ok(None);
955                        }
956                        SerialMessage::Disconnect => {
957                            let result = self.close();
958                            self.send_message(SerialMessage::Connected(false)).await?;
959                            if let Err(e) = result {
960                                self.send_message(SerialMessage::Error(e)).await?;
961                            }
962                        }
963                        _ => {}
964                    }
965                } else if let SerialMessage::Send(data) = message {
966                    return Ok(Some(SerialMessage::Send(data)));
967                }
968            }
969        }  else {
970            log::debug!("No receiver!");
971        }
972        Ok(None)
973    }
974
975    
976    /// Write data to the serial line.
977    #[cfg(not(feature = "async-channel"))]
978    #[allow(unused)]
979    fn write(&mut self, data: Vec<u8>) -> Result<(), SIError> {
980        log::debug!("write({:?})", data.clone());
981        let port_open = self.port.is_some();
982        if port_open {
983            let buffer = &data[0..data.len()];
984            self.port
985                .as_mut()
986                .unwrap()
987                .write(buffer)
988                .map_err(|_| SIError::CannotWritePort)?;
989            self.send_message(SerialMessage::DataSent(data))?;
990            Ok(())
991        } else {
992            Err(SIError::PortNotOpened)
993        }
994    }
995
996    /// Write data to the serial line.
997    #[cfg(feature = "async-channel")]
998    #[allow(unused)]
999    async fn write(&mut self, data: Vec<u8>) -> Result<(), SIError> {
1000        log::info!("write({:?})", data.clone());
1001        let port_open = self.port.is_some();
1002        if port_open {
1003            let buffer = &data[0..data.len()];
1004            self.port
1005                .as_mut()
1006                .unwrap()
1007                .write(buffer)
1008                .map_err(|_| SIError::CannotWritePort)?;
1009            self.send_message(SerialMessage::DataSent(data)).await?;
1010            Ok(())
1011        } else {
1012            Err(SIError::PortNotOpened)
1013        }
1014    }
1015    
1016    
1017    /// Sniffing feature: listen on serial line and send a SerialMessage::Receive() via mpsc channel for every serial
1018    /// request received, for every loop iteration, check if a SerialMessage is arrived via mpsc channel.
1019    /// If receive a SerialMessage::Send(), pause listen in order to send message then resume listening.
1020    /// Stop listening if receive SerialMessage::SetMode(Stop). Almost SerialMessage are handled silently by self.read_message().
1021    #[cfg(not(feature = "async-channel"))]
1022    #[allow(unused)]
1023    pub fn listen(&mut self) -> Result<Option<Mode>, SIError> {
1024        loop {
1025            if let Some(silence) = &self.silence.clone() {
1026                // log::debug!("silence={:?}", silence);
1027                self.status = Status::Read;
1028                if let Some(msg) = self.read_until_silence(silence)? {
1029                    match msg {
1030                        SerialMessage::Send(data) => {
1031                            self.status = Status::Write;
1032                            let write = self.write(data);
1033                            self.status = Status::None;
1034                            if let Err(e) = write {
1035                                self.send_message(SerialMessage::Error(e))?;
1036                            }
1037                        }
1038                        SerialMessage::SetMode(mode) => {
1039                            if mode != Mode::Stop && mode != Mode::Sniff {
1040                                self.send_message(SerialMessage::Error(
1041                                    SIError::StopModeBeforeChange,
1042                                ))?;
1043                            } else if let Mode::Stop = mode {
1044                                self.status = Status::None;
1045                                return Ok(Some(mode));
1046                            }
1047                        }
1048                        _ => {}
1049                    }
1050                } else {
1051                    self.status = Status::None;
1052                    return Ok(None);
1053                }
1054            } else {
1055                return Err(SIError::SilenceMissing);
1056            }
1057        }
1058    }
1059
1060    /// Sniffing feature: listen on serial line and send a SerialMessage::Receive() via mpsc channel for every serial
1061    /// request received, for every loop iteration, check if a SerialMessage is arrived via mpsc channel.
1062    /// If receive a SerialMessage::Send(), pause listen in order to send message then resume listening.
1063    /// Stop listening if receive SerialMessage::SetMode(Stop). Almost SerialMessage are handled silently by self.read_message().
1064    #[cfg(feature = "async-channel")]
1065    #[allow(unused)]
1066    pub async fn listen(&mut self) -> Result<Option<Mode>, SIError> {
1067        loop {
1068            if let Some(silence) = &self.silence.clone() {
1069                log::debug!("silence={:?}", silence);
1070                self.status = Status::Read;
1071                if let Some(msg) = self.read_until_silence(silence).await? {
1072                    match msg {
1073                        SerialMessage::Send(data) => {
1074                            self.status = Status::Write;
1075                            let write = self.write(data).await;
1076                            self.status = Status::None;
1077                            if let Err(e) = write {
1078                                self.send_message(SerialMessage::Error(e)).await?;
1079                            }
1080                        }
1081                        SerialMessage::SetMode(mode) => {
1082                            if mode != Mode::Stop && mode != Mode::Sniff {
1083                                self.send_message(SerialMessage::Error(
1084                                    SIError::StopModeBeforeChange,
1085                                ))
1086                                    .await?;
1087                            } else if let Mode::Stop = mode {
1088                                self.status = Status::None;
1089                                return Ok(Some(mode));
1090                            }
1091                        }
1092                        _ => {}
1093                    }
1094                } else {
1095                    self.status = Status::None;
1096                    return Ok(None);
1097                }
1098            } else {
1099                return Err(SIError::SilenceMissing);
1100            }
1101        }
1102    }
1103
1104    
1105    /// Master feature: write a request, then wait for response, when response received, stop listening.
1106    /// Returns early if receive SerialMessage::SetMode(Mode::Stop)). Does not accept SerialMessage::Send() as
1107    /// we already waiting for a response. Almost SerialMessage are handled silently by self.read_message().
1108    #[cfg(not(feature = "async-channel"))]
1109    #[allow(unused)]
1110    pub fn write_read(
1111        &mut self,
1112        data: Vec<u8>,
1113        timeout: &Duration,
1114    ) -> Result<Option<SerialMessage>, SIError> {
1115        if let Some(silence) = &self.silence.clone() {
1116            self.status = Status::Write;
1117            if let Err(e) = self.write(data) {
1118                self.status = Status::None;
1119                return Err(e);
1120            } else {
1121                self.status = Status::WaitingResponse;
1122            }
1123
1124            loop {
1125                if let Some(msg) = self.read_until_silence_or_timeout(silence, timeout)? {
1126                    match msg {
1127                        SerialMessage::Send(_data) => {
1128                            // we already waiting for response cannot send request now.
1129                            self.send_message(SerialMessage::Error(SIError::WaitingForResponse))?;
1130                            continue;
1131                        }
1132                        SerialMessage::SetMode(mode) => {
1133                            if mode == Mode::Stop {
1134                                self.status = Status::None;
1135                                return Ok(Some(SerialMessage::SetMode(Mode::Stop)));
1136                            } else if mode == Mode::Slave || mode == Mode::Sniff {
1137                                self.send_message(SerialMessage::Error(
1138                                    SIError::StopModeBeforeChange,
1139                                ))?;
1140                                continue;
1141                            }
1142                        }
1143                        _ => {
1144                            continue;
1145                        }
1146                    }
1147                } else {
1148                    // Stop after silence or timeout, return
1149                    self.status = Status::None;
1150                    return Ok(None);
1151                }
1152            }
1153        } else {
1154            Err(SIError::SilenceMissing)
1155        }
1156    }
1157
1158    /// Master feature: write a request, then wait for response, when response received, stop listening.
1159    /// Returns early if receive SerialMessage::SetMode(Mode::Stop)). Does not accept SerialMessage::Send() as
1160    /// we already waiting for a response. Almost SerialMessage are handled silently by self.read_message().
1161    #[cfg(feature = "async-channel")]
1162    #[allow(unused)]
1163    pub async fn write_read(
1164        &mut self,
1165        data: Vec<u8>,
1166        timeout: &Duration,
1167    ) -> Result<Option<SerialMessage>, SIError> {
1168        if let Some(silence) = &self.silence.clone() {
1169            self.status = Status::Write;
1170            if let Err(e) = self.write(data).await {
1171                self.status = Status::None;
1172                return Err(e);
1173            } else {
1174                self.status = Status::WaitingResponse;
1175            }
1176
1177            loop {
1178                if let Some(msg) = self.read_until_silence_or_timeout(silence, timeout).await? {
1179                    match msg {
1180                        SerialMessage::Send(_data) => {
1181                            // we already waiting for response cannot send request now.
1182                            self.send_message(SerialMessage::Error(SIError::WaitingForResponse))
1183                                .await?;
1184                            continue;
1185                        }
1186                        SerialMessage::SetMode(mode) => {
1187                            if mode == Mode::Stop {
1188                                self.status = Status::None;
1189                                return Ok(Some(SerialMessage::SetMode(Mode::Stop)));
1190                            } else if mode == Mode::Slave || mode == Mode::Sniff {
1191                                self.send_message(SerialMessage::Error(
1192                                    SIError::StopModeBeforeChange,
1193                                ))
1194                                    .await?;
1195                                continue;
1196                            }
1197                        }
1198                        _ => {
1199                            continue;
1200                        }
1201                    }
1202                } else {
1203                    // Stop after silence or timeout, return
1204                    self.status = Status::None;
1205                    return Ok(None);
1206                }
1207            }
1208        } else {
1209            Err(SIError::SilenceMissing)
1210        }
1211    }
1212    
1213
1214    
1215    #[cfg(not(feature = "async-channel"))]
1216    /// Slave feature: listen the line until request receive, then stop listening. Returns early if receive
1217    /// SerialMessage::SetMode(Mode::Stop) or SerialMessage::Send(). Almost SerialMessage are handled silently
1218    /// by self.read_message().
1219    #[allow(unused)]
1220    pub fn wait_for_request(&mut self) -> Result<Option<SerialMessage>, SIError> {
1221        if let Some(silence) = self.silence {
1222            loop {
1223                self.status = Status::Read;
1224                let result = self.read_until_silence(&silence);
1225                self.status = Status::None;
1226                let read: Option<SerialMessage> = match result {
1227                    Ok(r) => r,
1228                    Err(e) => {
1229                        return Err(e);
1230                    }
1231                };
1232                if let Some(msg) = read {
1233                    match msg {
1234                        SerialMessage::Send(data) => {
1235                            return Ok(Some(SerialMessage::Send(data.clone())));
1236                        }
1237                        SerialMessage::SetMode(mode) => {
1238                            if mode == Mode::Stop {
1239                                return Ok(Some(SerialMessage::SetMode(Mode::Stop)));
1240                            } else {
1241                                self.send_message(SerialMessage::Error(
1242                                    SIError::StopModeBeforeChange,
1243                                ))?;
1244                                continue;
1245                            }
1246                        }
1247                        _ => {
1248                            continue;
1249                        }
1250                    }
1251                } else {
1252                    return Ok(None);
1253                }
1254            }
1255        } else {
1256            Err(SIError::SilenceMissing)
1257        }
1258    }
1259
1260    /// Slave feature: listen the line until request receive, then stop listening. Returns early if receive
1261    /// SerialMessage::SetMode(Mode::Stop) or SerialMessage::Send(). Almost SerialMessage are handled silently
1262    /// by self.read_message().
1263    #[cfg(feature = "async-channel")]
1264    #[allow(unused)]
1265    pub async fn wait_for_request(&mut self) -> Result<Option<SerialMessage>, SIError> {
1266        if let Some(silence) = self.silence {
1267            loop {
1268                self.status = Status::Read;
1269                let result = self.read_until_silence(&silence).await;
1270                self.status = Status::None;
1271                let read: Option<SerialMessage> = match result {
1272                    Ok(r) => r,
1273                    Err(e) => {
1274                        return Err(e);
1275                    }
1276                };
1277                if let Some(msg) = read {
1278                    match msg {
1279                        SerialMessage::Send(data) => {
1280                            return Ok(Some(SerialMessage::Send(data.clone())));
1281                        }
1282                        SerialMessage::SetMode(mode) => {
1283                            if mode == Mode::Stop {
1284                                return Ok(Some(SerialMessage::SetMode(Mode::Stop)));
1285                            } else {
1286                                self.send_message(SerialMessage::Error(
1287                                    SIError::StopModeBeforeChange,
1288                                ))
1289                                    .await?;
1290                                continue;
1291                            }
1292                        }
1293                        _ => {
1294                            continue;
1295                        }
1296                    }
1297                } else {
1298                    return Ok(None);
1299                }
1300            }
1301        } else {
1302            Err(SIError::SilenceMissing)
1303        }
1304    }
1305
1306    
1307    /// Master loop
1308    #[cfg(not(feature = "async-channel"))]
1309    #[allow(unused)]
1310    fn run_master(&mut self) -> Result<Option<Mode>, SIError> {
1311        log::debug!("SerialInterface::run_master()");
1312        loop {
1313            match self.read_message() {
1314                Ok(msg) => {
1315                    if let Some(msg) = msg {
1316                        match msg {
1317                            SerialMessage::SetMode(mode) => {
1318                                if mode == Mode::Stop {
1319                                    return Ok(Some(Mode::Stop));
1320                                }
1321                            }
1322                            SerialMessage::Send(data) => {
1323                                match self.write_read(data, &self.timeout.clone()) {
1324                                    Ok(msg) => {
1325                                        if let Some(SerialMessage::SetMode(Mode::Stop)) = msg {
1326                                            return Ok(Some(Mode::Stop));
1327                                        }
1328                                    }
1329                                    Err(e) => {
1330                                        log::error!("{:?}", e);
1331                                    }
1332                                }
1333                            }
1334                            _ => {
1335                                continue;
1336                            }
1337                        }
1338                    }
1339                }
1340                Err(e) => {
1341                    log::error!("{:?}", e);
1342                }
1343            }
1344        }
1345    }
1346
1347    /// Master loop
1348    #[cfg(feature = "async-channel")]
1349    #[allow(unused)]
1350    async fn run_master(&mut self) -> Result<Option<Mode>, SIError> {
1351        log::debug!("SerialInterface::run_master()");
1352        loop {
1353            match self.read_message().await {
1354                Ok(msg) => {
1355                    if let Some(msg) = msg {
1356                        match msg {
1357                            SerialMessage::SetMode(mode) => {
1358                                if mode == Mode::Stop {
1359                                    return Ok(Some(Mode::Stop));
1360                                }
1361                            }
1362                            SerialMessage::Send(data) => {
1363                                match self.write_read(data, &self.timeout.clone()).await {
1364                                    Ok(msg) => {
1365                                        if let Some(SerialMessage::SetMode(Mode::Stop)) = msg {
1366                                            return Ok(Some(Mode::Stop));
1367                                        }
1368                                    }
1369                                    Err(e) => {
1370                                        log::error!("{:?}", e);
1371                                    }
1372                                }
1373                            }
1374                            _ => {
1375                                continue;
1376                            }
1377                        }
1378                    }
1379                }
1380                Err(e) => {
1381                    log::error!("{:?}", e);
1382                }
1383            }
1384        }
1385    }
1386    
1387    
1388    /// Slave loop
1389    #[cfg(not(feature = "async-channel"))]
1390    #[allow(unused)]
1391    fn run_slave(&mut self) -> Result<Option<Mode>, SIError> {
1392        log::debug!("SerialInterface::run_slave()");
1393        loop {
1394            match self.wait_for_request() {
1395                Ok(msg) => {
1396                    if let Some(SerialMessage::SetMode(Mode::Stop)) = msg {
1397                        return Ok(Some(Mode::Stop));
1398                    }
1399                }
1400                Err(e) => {
1401                    log::error!("{:?}", e);
1402                }
1403            }
1404        }
1405    }
1406
1407    /// Slave loop
1408    #[cfg(feature = "async-channel")]
1409    #[allow(unused)]
1410    async fn run_slave(&mut self) -> Result<Option<Mode>, SIError> {
1411        log::debug!("SerialInterface::run_slave()");
1412        loop {
1413            match self.wait_for_request().await {
1414                Ok(msg) => {
1415                    if let Some(SerialMessage::SetMode(Mode::Stop)) = msg {
1416                        return Ok(Some(Mode::Stop));
1417                    }
1418                }
1419                Err(e) => {
1420                    log::error!("{:?}", e);
1421                }
1422            }
1423        }
1424    }
1425    
1426    
1427    /// Sniff loop
1428    #[cfg(not(feature = "async-channel"))]
1429    #[allow(unused)]
1430    fn run_sniff(&mut self) -> Result<Option<Mode>, SIError> {
1431        log::debug!("SerialInterface::run_sniff()");
1432        loop {
1433            match self.listen() {
1434                Ok(msg) => {
1435                    if let Some(Mode::Stop) = msg {
1436                        return Ok(Some(Mode::Stop));
1437                    }
1438                }
1439                Err(e) => {
1440                    log::error!("SerialInterface::run_sniff():{:?}", e.clone());
1441                    return Err(e);
1442                }
1443            }
1444        }
1445    }
1446
1447    /// Sniff loop
1448    #[cfg(feature = "async-channel")]
1449    #[allow(unused)]
1450    async fn run_sniff(&mut self) -> Result<Option<Mode>, SIError> {
1451        log::debug!("SerialInterface::run_sniff()");
1452        loop {
1453            match self.listen().await {
1454                Ok(msg) => {
1455                    if let Some(Mode::Stop) = msg {
1456                        return Ok(Some(Mode::Stop));
1457                    }
1458                }
1459                Err(e) => {
1460                    log::error!("SerialInterface::run_sniff():{:?}", e.clone());
1461                    return Err(e);
1462                }
1463            }
1464        }
1465    }
1466
1467    
1468    
1469    
1470    /// Main loop
1471    #[cfg(not(feature = "async-channel"))]
1472    #[allow(unused)]
1473    pub async fn start(&mut self) {
1474        log::debug!("SerialInterface::run()");
1475        loop {
1476            sleep(Duration::from_nanos(1)).await;
1477            match &self.mode {
1478                Mode::Stop => {
1479                    let result = self.read_message();
1480                    match result {
1481                        Ok(msg) => {
1482                            if let Some(SerialMessage::SetMode(mode)) = msg {
1483                                log::info!("SerialInterface::switch mode to {:?}", &mode);
1484                                self.mode = mode;
1485                            }
1486                        }
1487                        Err(e) => {
1488                            log::error!("Mode Stop: {:?}", e);
1489                        }
1490                    }
1491                }
1492                Mode::Master => {
1493                    let result = self.run_master();
1494                    match result {
1495                        Ok(msg) => {
1496                            if let Some(Mode::Stop) = msg {
1497                                log::info!("SerialInterface::switch mode to Mode::Stop");
1498                                self.mode = Mode::Stop;
1499                            }
1500                        }
1501                        Err(e) => {
1502                            log::error!("{:?}", e);
1503                            log::info!("SerialInterface::switch mode to Mode::Stop");
1504                            self.mode = Mode::Stop;
1505                        }
1506                    }
1507                }
1508                Mode::Slave => {
1509                    let result = self.run_slave();
1510                    match result {
1511                        Ok(msg) => {
1512                            if let Some(Mode::Stop) = msg {
1513                                log::info!("SerialInterface::switch mode to Mode::Stop");
1514                                self.mode = Mode::Stop;
1515                            }
1516                        }
1517                        Err(e) => {
1518                            log::error!("{:?}", e);
1519                            log::info!("SerialInterface::switch mode to Mode::Stop");
1520                            self.mode = Mode::Stop;
1521                        }
1522                    }
1523                }
1524                Mode::Sniff => {
1525                    let result = self.run_sniff();
1526                    match result {
1527                        Ok(msg) => {
1528                            if let Some(Mode::Stop) = msg {
1529                                log::info!("SerialInterface::switch mode to Mode::Stop");
1530                                self.mode = Mode::Stop;
1531                            }
1532                        }
1533                        Err(e) => {
1534                            log::error!("{:?}", e);
1535                            log::info!("SerialInterface::switch mode to Mode::Stop");
1536                            self.mode = Mode::Stop;
1537                        }
1538                    }
1539                }
1540            }
1541        }
1542    }
1543
1544    /// Main loop
1545    #[cfg(feature = "async-channel")]
1546    #[allow(unused)]
1547    pub async fn start(&mut self) {
1548        log::debug!("SerialInterface::run()");
1549        loop {
1550            sleep(Duration::from_nanos(1)).await;
1551            match &self.mode {
1552                Mode::Stop => {
1553                    let result = self.read_message().await;
1554                    match result {
1555                        Ok(msg) => {
1556                            if let Some(SerialMessage::SetMode(mode)) = msg {
1557                                log::info!("SerialInterface::switch mode to {:?}", &mode);
1558                                self.mode = mode;
1559                            }
1560                        }
1561                        Err(e) => {
1562                            log::error!("Mode Stop: {:?}", e);
1563                        }
1564                    }
1565                }
1566                Mode::Master => {
1567                    let result = self.run_master().await;
1568                    match result {
1569                        Ok(msg) => {
1570                            if let Some(Mode::Stop) = msg {
1571                                log::info!("SerialInterface::switch mode to Mode::Stop");
1572                                self.mode = Mode::Stop;
1573                            }
1574                        }
1575                        Err(e) => {
1576                            log::error!("{:?}", e);
1577                            log::info!("SerialInterface::switch mode to Mode::Stop");
1578                            self.mode = Mode::Stop;
1579                        }
1580                    }
1581                }
1582                Mode::Slave => {
1583                    let result = self.run_slave().await;
1584                    match result {
1585                        Ok(msg) => {
1586                            if let Some(Mode::Stop) = msg {
1587                                log::info!("SerialInterface::switch mode to Mode::Stop");
1588                                self.mode = Mode::Stop;
1589                            }
1590                        }
1591                        Err(e) => {
1592                            log::error!("{:?}", e);
1593                            log::info!("SerialInterface::switch mode to Mode::Stop");
1594                            self.mode = Mode::Stop;
1595                        }
1596                    }
1597                }
1598                Mode::Sniff => {
1599                    let result = self.run_sniff().await;
1600                    match result {
1601                        Ok(msg) => {
1602                            if let Some(Mode::Stop) = msg {
1603                                log::info!("SerialInterface::switch mode to Mode::Stop");
1604                                self.mode = Mode::Stop;
1605                            }
1606                        }
1607                        Err(e) => {
1608                            log::error!("{:?}", e);
1609                            log::info!("SerialInterface::switch mode to Mode::Stop");
1610                            self.mode = Mode::Stop;
1611                        }
1612                    }
1613                }
1614            }
1615        }
1616    }
1617}