diff --git a/Cargo.lock b/Cargo.lock index 36d2eff..f5302f4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -24,6 +24,21 @@ dependencies = [ "avr-hal-generic", ] +[[package]] +name = "atomic-polyfill" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" +dependencies = [ + "critical-section", +] + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + [[package]] name = "avr-device" version = "0.7.0" @@ -81,6 +96,15 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" +[[package]] +name = "cobs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" +dependencies = [ + "thiserror", +] + [[package]] name = "critical-section" version = "1.2.0" @@ -121,24 +145,37 @@ checksum = "723dce4e9f25b6e6c5f35628e144794e5b459216ed7da97b7c4b66cdb3fa82ca" [[package]] name = "hash32" -version = "0.3.1" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" dependencies = [ "byteorder", ] [[package]] name = "heapless" -version = "0.8.0" +version = "0.7.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" +checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" dependencies = [ + "atomic-polyfill", "hash32", + "rustc_version", "serde", + "spin", "stable_deref_trait", ] +[[package]] +name = "lock_api" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +dependencies = [ + "autocfg", + "scopeguard", +] + [[package]] name = "nb" version = "0.1.3" @@ -166,6 +203,17 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "postcard" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c1de96e20f51df24ca73cafcc4690e044854d803259db27a00a461cb3b9d17a" +dependencies = [ + "cobs", + "heapless", + "serde", +] + [[package]] name = "proc-macro2" version = "1.0.95" @@ -193,16 +241,31 @@ dependencies = [ "embedded-hal 1.0.0", "nb 1.1.0", "panic-halt", + "postcard", "serde", - "serde-json-core", "ufmt", ] [[package]] -name = "ryu" -version = "1.0.20" +name = "rustc_version" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" [[package]] name = "serde" @@ -213,17 +276,6 @@ dependencies = [ "serde_derive", ] -[[package]] -name = "serde-json-core" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b81787e655bd59cecadc91f7b6b8651330b2be6c33246039a65e5cd6f4e0828" -dependencies = [ - "heapless", - "ryu", - "serde", -] - [[package]] name = "serde_derive" version = "1.0.219" @@ -235,6 +287,15 @@ dependencies = [ "syn 2.0.104", ] +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -263,6 +324,26 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + [[package]] name = "ufmt" version = "0.2.0" diff --git a/Cargo.toml b/Cargo.toml index 8a90070..6c2bb1c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,8 +16,8 @@ ufmt = "0.2.0" nb = "1.1.0" embedded-hal = "1.0" avr-device = "0.7.0" -serde-json-core = "0.6.0" serde = { version = "1.0.219", default-features = false, features = ["serde_derive", "derive"] } +postcard = "1.1.2" [dependencies.arduino-hal] git = "https://github.com/rahix/avr-hal" @@ -35,4 +35,4 @@ panic = "abort" codegen-units = 1 debug = true lto = true -opt-level = "s" +opt-level = "z" diff --git a/src/main.rs b/src/main.rs index bca5f27..509b889 100644 --- a/src/main.rs +++ b/src/main.rs @@ -14,7 +14,6 @@ use arduino_hal::prelude::*; use avr_device::interrupt::{self, Mutex}; use panic_halt as _; use serde::Deserialize; -use serde_json_core::from_str; fn shift_out(data_pin: &mut Pin, clock_pin: &mut Pin, data: &u8) { for i in 0..8 { @@ -56,7 +55,7 @@ unsafe fn USART_RX() { static mut N: usize = 0; // index into line if let Ok(val) = rx.read() { - if val == b'\n' { + if val == b'\0' { interrupt::free(|cs| { let mut line = INPUT_LINE.borrow(cs).borrow_mut(); @@ -68,6 +67,9 @@ unsafe fn USART_RX() { } else { BUF[N] = val; N += 1; + if N == 20 { + N = 0; + } } } } @@ -162,13 +164,11 @@ struct Command { } fn decode_command() -> Command { - let input = interrupt::free(|cs| { + let mut input = interrupt::free(|cs| { INPUT_LINE.borrow(cs).borrow().clone() }); let Some(length) = input.iter().position(|n| *n == 0) else { return Default::default() }; - let Ok(input) = str::from_utf8(&input[..length]) else { return Default::default() }; - - from_str(input.trim()).unwrap_or((Default::default(),0)).0 + postcard::from_bytes_cobs(&mut input[..length]).unwrap_or(Default::default()) }