1
Fork 0

switched to postcard, 40 -> 4kb code size (limit 30)

This commit is contained in:
Andy Killorin 2025-07-12 15:28:56 -05:00
parent 5e31ad2e24
commit 77513260a6
Signed by: ank
GPG key ID: 80BA307A6BD7A7E4
3 changed files with 108 additions and 27 deletions

119
Cargo.lock generated
View file

@ -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"

View file

@ -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"

View file

@ -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<Output, PB0>, clock_pin: &mut Pin<Output, PD4>, 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())
}