diff --git a/src/lib.rs b/src/lib.rs index cae93d4d6ba6b4063ab9ddfde6cd78294ac11351..ee10f14ed84d4ab58705d8604b9b8652b87d2970 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -78,6 +78,7 @@ fn serialbridge(lhs: Lhs, rhs: Rhs) -> rustmex::Result<()> { match mode { Mode::Open => open_serial(args)?, Mode::Close => close_serial(args)?, + Mode::CloseAll => close_all_serials(args)?, Mode::Read => read_from_serial(out, args)?, Mode::Write => write_to_serial(args)?, } @@ -121,7 +122,7 @@ fn open_serial(args: Args<'_>) -> SResult<()> { Ok(()) } -/// Close the serial port if it is open (didn't expect any arguments) +/// Close the serial port specified by the first argument, if it is open fn close_serial(args: Args<'_>) -> SResult<()> { args.assert_params_max_len(1)?; let port = get_port_name(1, &args)?; @@ -130,6 +131,13 @@ fn close_serial(args: Args<'_>) -> SResult<()> { Ok(()) } +/// Close all serial ports that are open (didn't expect any arguments) +fn close_all_serials(args: Args<'_>) -> SResult<()> { + args.assert_params_max_len(0)?; + SERIAL.write().close_all(); + Ok(()) +} + /// Read `n` doubles from the serial port and return them as a vector fn read_from_serial(mut outputs: Output<'_>, args: Args<'_>) -> SResult<()> { args.assert_params_max_len(2)?; diff --git a/src/serial.rs b/src/serial.rs index f6e107fa8f67aff657205fddd2d1ee72804799c1..4011d74d0a25b33b8aed28c28dee9545ef8e21f4 100644 --- a/src/serial.rs +++ b/src/serial.rs @@ -56,6 +56,11 @@ impl SerialManager { } } + /// Close all serial that are open + pub fn close_all(&mut self) { + self.serial_map.write().clear(); + } + /// Read `n` bytes from the serial port pub fn read_n_bytes(&self, name: &str, n: usize) -> SResult<Vec<u8>> { let map = self.serial_map.read(); diff --git a/src/types.rs b/src/types.rs index 97fca4f661d40606d0e9bac8636660938060a5dc..e177f8db83d6c471aed89c4c513575fab7cb965c 100644 --- a/src/types.rs +++ b/src/types.rs @@ -110,6 +110,7 @@ impl IntoMatlabType for Vec<f32> { pub enum Mode { Open, Close, + CloseAll, Read, Write, } @@ -121,6 +122,7 @@ impl FromStr for Mode { match s { "Open" => Ok(Mode::Open), "Close" => Ok(Mode::Close), + "CloseAll" => Ok(Mode::CloseAll), "Read" => Ok(Mode::Read), "Write" => Ok(Mode::Write), _ => Err(Error::InvalidMode),