diff --git a/Cargo.lock b/Cargo.lock index b534c4b..7d0923d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -128,9 +128,9 @@ dependencies = [ [[package]] name = "borsh" -version = "1.5.7" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad8646f98db542e39fc66e68a20b2144f6a732636df7c2354e74645faaa433ce" +checksum = "d1da5ab77c1437701eeff7c88d968729e7766172279eab0676857b3d63af7a6f" dependencies = [ "borsh-derive", "cfg_aliases", @@ -138,15 +138,15 @@ dependencies = [ [[package]] name = "borsh-derive" -version = "1.5.7" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdd1d3c0c2f5833f22386f252fe8ed005c7f59fdcddeef025c01b4c3b9fd9ac3" +checksum = "0686c856aa6aac0c4498f936d7d6a02df690f614c03e4d906d1018062b5c5e2c" dependencies = [ "once_cell", "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.111", ] [[package]] @@ -226,7 +226,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.111", ] [[package]] @@ -751,7 +751,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.111", ] [[package]] @@ -847,9 +847,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.110" +version = "2.0.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea" +checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" dependencies = [ "proc-macro2", "quote", @@ -997,7 +997,7 @@ dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.111", "wasm-bindgen-shared", ] @@ -1071,20 +1071,20 @@ checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" [[package]] name = "zerocopy" -version = "0.8.28" +version = "0.8.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43fa6694ed34d6e57407afbccdeecfa268c470a7d2a5b0cf49ce9fcc345afb90" +checksum = "4ea879c944afe8a2b25fef16bb4ba234f47c694565e97383b36f3a878219065c" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.28" +version = "0.8.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c640b22cd9817fae95be82f0d2f90b11f7605f6c319d16705c459b27ac2cbc26" +checksum = "cf955aa904d6040f70dc8e9384444cb1030aed272ba3cb09bbc4ab9e7c1f34f5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.110", + "syn 2.0.111", ] diff --git a/libs/compiler/src/test/syscall.rs b/libs/compiler/src/test/syscall.rs index 46eb7dd..03f4f57 100644 --- a/libs/compiler/src/test/syscall.rs +++ b/libs/compiler/src/test/syscall.rs @@ -3,7 +3,7 @@ use indoc::indoc; use pretty_assertions::assert_eq; #[test] -fn test_yield_syscall() -> anyhow::Result<()> { +fn test_yield() -> anyhow::Result<()> { let compiled = compile! { debug " @@ -26,7 +26,7 @@ fn test_yield_syscall() -> anyhow::Result<()> { } #[test] -fn test_sleep_syscall() -> anyhow::Result<()> { +fn test_sleep() -> anyhow::Result<()> { let compiled = compile! { debug " @@ -51,3 +51,33 @@ fn test_sleep_syscall() -> anyhow::Result<()> { Ok(()) } + +#[test] +fn test_set_on_device() -> anyhow::Result<()> { + let compiled = compile! { + debug + r#" + device airConditioner = "d0"; + let internalTemp = 20c; + + let shouldToggleOn = internalTemp > 25c; + setOnDevice(airConditioner, "On", shouldToggleOn); + "# + }; + + assert_eq!( + compiled, + indoc! { + " + j main + main: + move r8 293.15 #internalTemp + sgt r1 r8 298.15 + move r9 r1 #shouldToggleOn + s d0 On r9 + " + } + ); + + Ok(()) +} diff --git a/libs/compiler/src/v1.rs b/libs/compiler/src/v1.rs index 59475be..dd93cfd 100644 --- a/libs/compiler/src/v1.rs +++ b/libs/compiler/src/v1.rs @@ -1017,6 +1017,34 @@ impl<'a, W: std::io::Write> Compiler<'a, W> { Ok(None) } + System::SetOnDevice(device, logic_type, variable) => { + let (variable, var_cleanup) = self.compile_literal_or_variable(variable, scope)?; + + let LiteralOrVariable::Variable(device) = device else { + return Err(Error::AgrumentMismatch( + "Arg1 expected to be a variable".into(), + )); + }; + + let Some(device) = self.devices.get(&device) else { + return Err(Error::InvalidDevice(device)); + }; + + let Literal::String(logic_type) = logic_type else { + return Err(Error::AgrumentMismatch( + "Arg2 expected to be a string".into(), + )); + }; + + self.write_output(format!("s {} {} {}", device, logic_type, variable))?; + + if let Some(temp_var) = var_cleanup { + scope.free_temp(temp_var)?; + } + + Ok(None) + } + _ => { todo!() }