From 110f2f09eef881df247e7d7a9b3e15b2e71602db Mon Sep 17 00:00:00 2001
From: Federico Lolli <federico.lolli@skywarder.eu>
Date: Tue, 23 Apr 2024 18:51:06 +0200
Subject: [PATCH] Add ClearBuffer

---
 src/lib.rs    |  9 +++++++++
 src/serial.rs | 19 +++++++++++++++++++
 src/types.rs  |  2 ++
 3 files changed, 30 insertions(+)

diff --git a/src/lib.rs b/src/lib.rs
index ee10f14..10bf81d 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -81,6 +81,7 @@ fn serialbridge(lhs: Lhs, rhs: Rhs) -> rustmex::Result<()> {
         Mode::CloseAll => close_all_serials(args)?,
         Mode::Read => read_from_serial(out, args)?,
         Mode::Write => write_to_serial(args)?,
+        Mode::ClearBuffer => clear_buffer(args)?,
     }
 
     Ok(())
@@ -190,6 +191,14 @@ fn write_to_serial(args: Args<'_>) -> SResult<()> {
     Ok(())
 }
 
+fn clear_buffer(args: Args<'_>) -> SResult<()> {
+    args.assert_params_max_len(1)?;
+    let port = get_port_name(1, &args)?;
+    SERIAL.read().clear_buffer(&port)?;
+    warn_debug!("Cleared buffer of serial port {}", port);
+    Ok(())
+}
+
 /// Get the mode from the input argument (Open, Close, Read, Write)
 fn get_mode(arg: MxArray) -> SResult<Mode> {
     IntoRustType::<String>::into_rust(arg)?.parse()
diff --git a/src/serial.rs b/src/serial.rs
index fdb7df3..f816341 100644
--- a/src/serial.rs
+++ b/src/serial.rs
@@ -102,6 +102,13 @@ impl SerialManager {
             .ok_or(Error::SerialNotOpen)?
             .enqueue_bytes(data)
     }
+
+    /// Clear the buffer of the serial port
+    pub fn clear_buffer(&self, name: &str) -> SResult<()> {
+        let map = self.serial_map.read();
+        let port = map.get(name).ok_or(Error::SerialNotOpen)?;
+        port.clear_buffer()
+    }
 }
 
 impl Deref for SerialQueue {
@@ -166,6 +173,18 @@ impl SerialQueue {
         self.writer_ch.as_ref().unwrap().send(data.to_vec())?;
         Ok(())
     }
+
+    /// Clear the buffer of the serial port
+    fn clear_buffer(&self) -> SResult<()> {
+        while self
+            .reader_ch
+            .as_ref()
+            .unwrap()
+            .recv_timeout(Duration::from_millis(50))
+            .is_ok()
+        {}
+        Ok(())
+    }
 }
 
 impl Drop for SerialQueue {
diff --git a/src/types.rs b/src/types.rs
index e177f8d..329502d 100644
--- a/src/types.rs
+++ b/src/types.rs
@@ -113,6 +113,7 @@ pub enum Mode {
     CloseAll,
     Read,
     Write,
+    ClearBuffer,
 }
 
 impl FromStr for Mode {
@@ -125,6 +126,7 @@ impl FromStr for Mode {
             "CloseAll" => Ok(Mode::CloseAll),
             "Read" => Ok(Mode::Read),
             "Write" => Ok(Mode::Write),
+            "ClearBuffer" => Ok(Mode::ClearBuffer),
             _ => Err(Error::InvalidMode),
         }
     }
-- 
GitLab