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#[derive(Debug, Clone)]
42pub enum Status {
43 Read,
44 Receipt,
45 Write,
46 WaitingResponse,
47 None,
48}
49
50#[derive(Debug, Clone, PartialEq)]
52pub enum Mode {
53 Master,
55 Slave,
57 Sniff,
59 Stop,
61}
62
63#[derive(Debug, Clone)]
64pub enum SerialMessage {
65 ListPorts,
70
71 AvailablePorts(Vec<String>),
74
75 SetPort(String),
79
80 SetBauds(BaudRate),
84
85 SetCharSize(CharSize),
89
90 SetParity(Parity),
94 SetStopBits(StopBits),
98
99 SetFlowControl(FlowControl),
103
104 SetTimeout(Duration),
108
109 Connect,
112
113 Disconnect,
116
117 Send(Vec<u8>),
123
124 DataSent(Vec<u8>),
127
128 Receive(Vec<u8>),
131
132 NoResponse,
135
136 GetStatus,
141
142 Status(Status),
145
146 GetConnectionStatus,
149
150 Connected(bool),
153
154 SetMode(Mode),
158
159 Mode(Mode),
162
163 Error(SIError),
166
167 Ping,
170
171 Pong,
173}
174
175type SIError = SerialInterfaceError;
176
177pub 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 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)), timeout: Duration::from_nanos(10000), receiver: None,
216 sender: None,
217 last_byte_time: None,
218 })
219 }
220
221 pub fn path(mut self, path: String) -> Self {
224 self.path = Some(path);
225 self
226 }
227
228 pub fn bauds(mut self, bauds: BaudRate) -> Self {
231 self.baud_rate = bauds;
232 self
234 }
235
236 pub fn char_size(mut self, size: CharSize) -> Self {
239 self.char_size = size;
240 self
241 }
242
243 pub fn parity(mut self, parity: Parity) -> Self {
246 self.parity = parity;
247 self
248 }
249
250 pub fn stop_bits(mut self, stop_bits: StopBits) -> Self {
253 self.stop_bits = stop_bits;
254 self
255 }
256
257 pub fn flow_control(mut self, flow_control: FlowControl) -> Self {
260 self.flow_control = flow_control;
261 self
262 }
263
264 pub fn modbus_id(mut self, modbus_id: u8) -> Self {
279 self.modbus_id = Some(modbus_id);
280 self
281 }
282
283 pub fn silence(mut self, silence: Duration) -> Self {
287 self.silence = Some(silence);
288 self
289 }
290
291 pub fn receiver(mut self, receiver: Receiver<SerialMessage>) -> Self {
294 self.receiver = Some(receiver);
295 self
296 }
297
298 pub fn sender(mut self, sender: Sender<SerialMessage>) -> Self {
301 self.sender = Some(sender);
302 self
303 }
304
305 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 pub fn get_mode(&self) -> &Mode {
327 &self.mode
328 }
329
330 pub fn get_state(&self) -> &Status {
332 &self.status
333 }
334
335 pub fn list_ports() -> Result<Vec<String>, SIError> {
338 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 }
346
347 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 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 #[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 if let Some(data) = result {
441 self.status = Status::Receipt;
443 buffer.push(data);
444 last_data = Instant::now();
446
447 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 if buffer.is_empty() {
463 if let Some(msg) = self.read_message()? {
465 return Ok(Some(msg));
466 }
467 last_data = Instant::now();
468 } else {
469 let from_last_data = &Instant::now().duration_since(last_data);
471 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 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 #[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 if let Some(data) = result {
536 self.status = Status::Receipt;
538 buffer.push(data);
539 last_data = Instant::now();
541
542 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 if buffer.is_empty() {
559 if let Some(msg) = self.read_message().await? {
561 return Ok(Some(msg));
562 }
563 last_data = Instant::now();
564 } else {
565 let from_last_data = &Instant::now().duration_since(last_data);
567 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 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 #[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 #[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 #[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 #[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 #[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 #[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 pub fn open(&mut self) -> Result<(), SIError> {
700 if self.port.is_some() || self.mode != Mode::Stop {
701 Err(SIError::PortAlreadyOpen)
702 } 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 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 #[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 #[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 #[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 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 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 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 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 #[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 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 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 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 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 #[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 #[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 #[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 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 #[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 #[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 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 self.status = Status::None;
1150 return Ok(None);
1151 }
1152 }
1153 } else {
1154 Err(SIError::SilenceMissing)
1155 }
1156 }
1157
1158 #[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 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 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 #[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 #[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 #[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 #[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 #[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 #[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 #[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 #[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 #[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 #[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}