diff --git a/.gitignore b/.gitignore index ddd332caa9b10e61b13423fd5709f581df6680d6..07b3ea4f9db2f99c85037cc9c0abf42a9eeba6a3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ /target - documentation.pdf functions.pdf -libserial_bridge.mexmaci64 \ No newline at end of file +serialbridge.mexmaci64 + +.cargo/config.toml \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index b8968721b63349c17156adfdf72cc9eab60a78c2..2a274e62b772fcfeb6774c9a31437b42fffa2f48 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -61,6 +61,12 @@ dependencies = [ "mach2", ] +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + [[package]] name = "libc" version = "0.2.153" @@ -295,6 +301,7 @@ name = "serial-bridge" version = "0.1.0" dependencies = [ "cstr", + "lazy_static", "rustmex", "serialport", "thiserror", diff --git a/Cargo.toml b/Cargo.toml index 4ae0e27cb8548dd2bdd57b8ebc30153fa445314c..943c4091b48139beb861848a6c00d27732b82eeb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,6 +8,7 @@ crate-type = ["cdylib"] [dependencies] cstr = "0.2.11" +lazy_static = "1.4.0" rustmex = { path = "../rustmex/rustmex", features = ["matlab800"] } serialport = "4.3.0" thiserror = "1.0.57" diff --git a/justfile b/justfile index 202eee782a035af4579336401091cef3e6e45081..b6337501d7df41ddfb0faf93a5c0f60068fa6d57 100644 --- a/justfile +++ b/justfile @@ -12,11 +12,11 @@ default: build: cargo build --release - mv target/release/libserial_bridge.dylib libserial_bridge.mexmaci64 + mv target/release/libserial_bridge.dylib serialbridge.mexmaci64 clean: cargo clean - rm libserial_bridge.mexmaci64 + rm serialbridge.mexmaci64 docs: typst watch {{source}} {{dest}} --open diff --git a/src/lib.rs b/src/lib.rs index de878c356a0f630911a813c8fdda68a2c68409ed..fb660aa60150f3865da63179b56b2da4e24351de 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,13 +1,24 @@ mod error; mod types; -use rustmex::{char::CharArray, prelude::*, MatlabClass}; +use std::sync::RwLock; + +use rustmex::{char::CharArray, convert::ToMatlab, prelude::*, MatlabClass}; use error::{Error, MapMexError}; use types::Mode; +lazy_static::lazy_static! { + static ref TEST: RwLock<i32> = RwLock::new(42); +} + #[rustmex::entrypoint] fn serialbridge(lhs: Lhs, rhs: Rhs) -> rustmex::Result<()> { + if let Some(r) = lhs.get_mut(0) { + let res = TEST.read().unwrap().to_matlab(); + r.replace(res); + }; + let arg0 = rhs.first().mexerr(Error::MissingSerialMode)?; // Get the mode argument ("Open", "Close", "Read", "Write") @@ -15,8 +26,8 @@ fn serialbridge(lhs: Lhs, rhs: Rhs) -> rustmex::Result<()> { // Dispatch to the appropriate function match mode { - Mode::Open => open_serial(rhs)?, - Mode::Close => todo!(), + Mode::Open => open_serial(lhs, rhs)?, + Mode::Close => {} Mode::Read => todo!(), Mode::Write => todo!(), } @@ -31,14 +42,22 @@ fn get_mode(arg: &mxArray) -> Result<Mode, Error> { .parse() } -fn open_serial(rhs: Rhs) -> Result<(), Error> { - let port = rhs.get(1).mexerr(Error::MissingPortName)?; - let baudrate = rhs.get(2).mexerr(Error::MissingBaudrate)?; +fn open_serial(lhs: Lhs, rhs: Rhs) -> Result<(), Error> { + let nw = *TEST.read().unwrap() + 1; + *TEST.write().unwrap() = nw; + + if let Some(r) = lhs.get_mut(0) { + let res = TEST.read().unwrap().to_matlab(); + r.replace(res); + }; + + // let port = rhs.get(1).mexerr(Error::MissingPortName)?; + // let baudrate = rhs.get(2).mexerr(Error::MissingBaudrate)?; // let port = CharArray::from_mx_array(port)?.get_cstring().into_string()?; // let baudrate = CharArray::from_mx_array(baudrate)?.get_cstring().into_string()?; - todo!(); + // todo!(); Ok(()) }