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