From 0e9315280b8bf2e3ea8af58cfa09dd7e592252ca Mon Sep 17 00:00:00 2001 From: Stephen Waits Date: Thu, 26 Mar 2026 15:29:49 -0600 Subject: [PATCH] refactor: drop Heltec V3, enforce standard toolchain, remove dead code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Heltec V3 (ESP32-S3) requires the espup Xtensa toolchain fork, which violates the standard-toolchain-only principle. Removed until upstream Rust supports Xtensa targets via stock rustup. Also removes all #[allow(dead_code)] band-aids — unused items are deleted rather than suppressed. DESIGN.md updated with standard toolchain principle (#10) and peripheral model (input/telemetry slots). --- Cargo.lock | 729 +---------------------------------------- Cargo.toml | 12 - DESIGN.md | 27 +- Justfile | 9 +- src/board/heltec_v3.rs | 70 ---- src/board/rak_4631.rs | 4 - src/display/render.rs | 12 +- src/error.rs | 16 - src/main.rs | 3 - src/protocol.rs | 4 - 10 files changed, 36 insertions(+), 850 deletions(-) delete mode 100644 src/board/heltec_v3.rs delete mode 100644 src/error.rs diff --git a/Cargo.lock b/Cargo.lock index 49c64828..0114f563 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14,12 +14,6 @@ dependencies = [ "zerocopy", ] -[[package]] -name = "anyhow" -version = "1.0.102" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" - [[package]] name = "autocfg" version = "1.5.0" @@ -41,21 +35,6 @@ dependencies = [ "rustc_version", ] -[[package]] -name = "bare-metal" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8fe8f5a8a398345e52358e18ff07cc17a568fbca5c6f73873d3a62056309603" - -[[package]] -name = "basic-toml" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba62675e8242a4c4e806d12f11d136e626e6c8361d6b829310732241652a178a" -dependencies = [ - "serde", -] - [[package]] name = "bitfield" version = "0.13.2" @@ -68,12 +47,6 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d7e60934ceec538daadb9d8432424ed043a904d8e0243f3c6446bce549a46ac" -[[package]] -name = "bitfield" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f798d2d157e547aa99aab0967df39edd0b70307312b6f8bd2848e6abe40896e0" - [[package]] name = "bitflags" version = "1.3.2" @@ -104,15 +77,6 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" -[[package]] -name = "chrono" -version = "0.4.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" -dependencies = [ - "num-traits", -] - [[package]] name = "cobs" version = "0.3.0" @@ -128,7 +92,7 @@ version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ec610d8f49840a5b376c69663b6369e71f4b34484b9b2eb29fb918d92516cb9" dependencies = [ - "bare-metal 0.2.5", + "bare-metal", "bitfield 0.13.2", "embedded-hal 0.2.7", "volatile-register", @@ -172,18 +136,8 @@ version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ - "darling_core 0.20.11", - "darling_macro 0.20.11", -] - -[[package]] -name = "darling" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" -dependencies = [ - "darling_core 0.21.3", - "darling_macro 0.21.3", + "darling_core", + "darling_macro", ] [[package]] @@ -200,37 +154,13 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "darling_core" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "syn 2.0.117", -] - [[package]] name = "darling_macro" version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ - "darling_core 0.20.11", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "darling_macro" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" -dependencies = [ - "darling_core 0.21.3", + "darling_core", "quote", "syn 2.0.117", ] @@ -276,24 +206,13 @@ dependencies = [ "thiserror", ] -[[package]] -name = "delegate" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "780eb241654bf097afb00fc5f054a09b687dad862e485fdcf8399bb056565370" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - [[package]] name = "document-features" version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" dependencies = [ - "litrs 1.0.0", + "litrs", ] [[package]] @@ -332,7 +251,7 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3577b1e9446f61381179a330fc5324b01d511624c55f25e3c66c9e3c626dbecf" dependencies = [ - "darling 0.20.11", + "darling", "proc-macro2", "quote", "syn 2.0.117", @@ -414,19 +333,6 @@ dependencies = [ "rand_core", ] -[[package]] -name = "embassy-sync" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd938f25c0798db4280fcd8026bf4c2f48789aebf8f77b6e5cf8a7693ba114ec" -dependencies = [ - "cfg-if", - "critical-section", - "embedded-io-async", - "futures-util", - "heapless", -] - [[package]] name = "embassy-sync" version = "0.6.2" @@ -515,26 +421,6 @@ dependencies = [ "embedded-io-async", ] -[[package]] -name = "embassy-usb-synopsys-otg" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d46be92e72bcf39e623ff74d739a8ab29b02f4909a9b05986ca81c2157ac254a" -dependencies = [ - "critical-section", - "embassy-sync 0.5.0", - "embassy-usb-driver", -] - -[[package]] -name = "embedded-can" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9d2e857f87ac832df68fa498d18ddc679175cf3d2e4aa893988e5601baf9438" -dependencies = [ - "nb 1.1.0", -] - [[package]] name = "embedded-hal" version = "0.2.7" @@ -560,16 +446,6 @@ dependencies = [ "embedded-hal 1.0.0", ] -[[package]] -name = "embedded-hal-nb" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fba4268c14288c828995299e59b12babdbe170f6c6d73731af1b4648142e8605" -dependencies = [ - "embedded-hal 1.0.0", - "nb 1.1.0", -] - [[package]] name = "embedded-io" version = "0.6.1" @@ -606,221 +482,6 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" -[[package]] -name = "enum-as-inner" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "enumset" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25b07a8dfbbbfc0064c0a6bdf9edcf966de6b1c33ce344bdeca3b41615452634" -dependencies = [ - "enumset_derive", -] - -[[package]] -name = "enumset_derive" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43e744e4ea338060faee68ed933e46e722fb7f3617e722a5772d7e856d8b3ce" -dependencies = [ - "darling 0.21.3", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "esp-backtrace" -version = "0.14.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7660d85e3e7b0e113aaeeffb1a155e64a09a5035d4104031875acdba4cb68e" -dependencies = [ - "defmt 0.3.100", - "esp-build", - "esp-println", - "semihosting", -] - -[[package]] -name = "esp-build" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b94a4b8d74e7cc7baabcca5b2277b41877e039ad9cd49959d48ef94dac7eab4b" -dependencies = [ - "quote", - "syn 2.0.117", - "termcolor", -] - -[[package]] -name = "esp-config" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7584e4cd1dac06201fd92fff1c84b396be5458ac4d93e9457e7a89b1b42c60e" -dependencies = [ - "document-features", -] - -[[package]] -name = "esp-hal" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5605e1518d63f7bf9fbd9885e61d2896060d2e4f28954736bdd74da911b676" -dependencies = [ - "basic-toml", - "bitfield 0.17.0", - "bitflags 2.11.0", - "bytemuck", - "cfg-if", - "chrono", - "critical-section", - "delegate", - "document-features", - "embassy-embedded-hal", - "embassy-futures", - "embassy-sync 0.6.2", - "embassy-usb-driver", - "embassy-usb-synopsys-otg", - "embedded-can", - "embedded-hal 0.2.7", - "embedded-hal 1.0.0", - "embedded-hal-async", - "embedded-hal-nb", - "embedded-io", - "embedded-io-async", - "enumset", - "esp-build", - "esp-config", - "esp-hal-procmacros", - "esp-metadata", - "esp-riscv-rt", - "esp-synopsys-usb-otg", - "esp32s3", - "fugit", - "nb 1.1.0", - "paste", - "portable-atomic", - "rand_core", - "serde", - "strum", - "ufmt-write", - "usb-device", - "void", - "xtensa-lx", - "xtensa-lx-rt", -] - -[[package]] -name = "esp-hal-embassy" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7d0f2537ea2ff9bea26a1c8bfe43ad580d4c89febf27189653a9cf95f1f7961" -dependencies = [ - "critical-section", - "document-features", - "embassy-executor", - "embassy-time-driver", - "esp-build", - "esp-config", - "esp-hal", - "esp-hal-procmacros", - "esp-metadata", - "portable-atomic", - "static_cell", -] - -[[package]] -name = "esp-hal-procmacros" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69a9a8706b7d1182b56335d196e70eeb04e2b70f4b8db96432898bd3c2bdb91e" -dependencies = [ - "darling 0.20.11", - "document-features", - "litrs 0.4.2", - "object", - "proc-macro-crate", - "proc-macro-error2", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "esp-metadata" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9972bbb21dcafe430b87f92efc7a788978a2d17cf8f572d104beeb48602482a" -dependencies = [ - "anyhow", - "basic-toml", - "serde", - "strum", -] - -[[package]] -name = "esp-println" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee38e87bc7e303c299047c0e9bcd0f8ccca7c7e70d1fd78bbb565db14f33beb6" -dependencies = [ - "critical-section", - "defmt 0.3.100", - "esp-build", - "log", - "portable-atomic", -] - -[[package]] -name = "esp-riscv-rt" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94aca65db6157aa5f42d9df6595b21462f28207ca4230b799aa3620352ef6a72" -dependencies = [ - "document-features", - "riscv", - "riscv-rt-macros", -] - -[[package]] -name = "esp-synopsys-usb-otg" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8938451cb19032f13365328ea66ab38c8d16deecdf322067442297110eb74468" -dependencies = [ - "critical-section", - "embedded-hal 0.2.7", - "ral-registers", - "usb-device", - "vcell", -] - -[[package]] -name = "esp32s3" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe69dca8db0ed37d222555f12dfaf99232592e84f54e56dd81e450a4769718bf" -dependencies = [ - "critical-section", - "vcell", -] - [[package]] name = "fixed" version = "1.31.0" @@ -839,15 +500,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "fugit" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e639847d312d9a82d2e75b0edcc1e934efcc64e6cb7aa94f0b1fbec0bc231d6" -dependencies = [ - "gcd", -] - [[package]] name = "futures-core" version = "0.3.32" @@ -877,12 +529,6 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "gcd" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d758ba1b47b00caf47f24925c0074ecb20d6dfcffe7f6d53395c0465674841a" - [[package]] name = "half" version = "2.7.1" @@ -912,12 +558,6 @@ dependencies = [ "ahash", ] -[[package]] -name = "hashbrown" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" - [[package]] name = "heapless" version = "0.8.0" @@ -929,52 +569,18 @@ dependencies = [ "stable_deref_trait", ] -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - [[package]] name = "ident_case" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" -[[package]] -name = "indexmap" -version = "2.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" -dependencies = [ - "equivalent", - "hashbrown 0.16.1", -] - -[[package]] -name = "litrs" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5e54036fe321fd421e10d732f155734c4e4afd610dd556d9a82833ab3ee0bed" -dependencies = [ - "proc-macro2", -] - [[package]] name = "litrs" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" -[[package]] -name = "lock_api" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" -dependencies = [ - "scopeguard", -] - [[package]] name = "log" version = "0.4.29" @@ -995,10 +601,6 @@ dependencies = [ "embassy-sync 0.6.2", "embassy-time", "embassy-usb", - "esp-backtrace", - "esp-hal", - "esp-hal-embassy", - "esp-println", "heapless", "lora-phy", "minijinja", @@ -1028,12 +630,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "memchr" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" - [[package]] name = "memo-map" version = "0.3.3" @@ -1050,12 +646,6 @@ dependencies = [ "serde", ] -[[package]] -name = "mutex-trait" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4bb1638d419e12f8b1c43d9e639abd0d1424285bdea2f76aa231e233c63cd3a" - [[package]] name = "nb" version = "0.1.3" @@ -1212,15 +802,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "object" -version = "0.36.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" -dependencies = [ - "memchr", -] - [[package]] name = "once_cell" version = "1.21.4" @@ -1243,12 +824,6 @@ dependencies = [ "defmt 0.3.100", ] -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - [[package]] name = "pin-project-lite" version = "0.2.17" @@ -1271,15 +846,6 @@ dependencies = [ "serde", ] -[[package]] -name = "proc-macro-crate" -version = "3.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" -dependencies = [ - "toml_edit 0.25.8+spec-1.1.0", -] - [[package]] name = "proc-macro-error-attr2" version = "2.0.0" @@ -1320,65 +886,12 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "r0" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd7a31eed1591dcbc95d92ad7161908e72f4677f8fabf2a32ca49b4237cbf211" - -[[package]] -name = "ral-registers" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46b71a9d9206e8b46714c74255adcaea8b11e0350c1d8456165073c3f75fc81a" - [[package]] name = "rand_core" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -[[package]] -name = "riscv" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ea8ff73d3720bdd0a97925f0bf79ad2744b6da8ff36be3840c48ac81191d7a7" -dependencies = [ - "critical-section", - "embedded-hal 1.0.0", - "paste", - "riscv-macros", - "riscv-pac", -] - -[[package]] -name = "riscv-macros" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f265be5d634272320a7de94cea15c22a3bfdd4eb42eb43edc528415f066a1f25" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "riscv-pac" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8188909339ccc0c68cfb5a04648313f09621e8b87dc03095454f1a11f6c5d436" - -[[package]] -name = "riscv-rt-macros" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30f19a85fe107b65031e0ba8ec60c34c2494069fe910d6c297f5e7cb5a6f76d0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - [[package]] name = "rustc_version" version = "0.2.3" @@ -1388,24 +901,6 @@ dependencies = [ "semver", ] -[[package]] -name = "rustversion" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "semihosting" -version = "0.1.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8e4abf97879f4e80db69a9fba7bd64998e9bdad25f58ef045a778e191172fd4" - [[package]] name = "semver" version = "0.9.0" @@ -1451,24 +946,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "serde_spanned" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" -dependencies = [ - "serde", -] - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", -] - [[package]] name = "ssmarshal" version = "1.0.0" @@ -1500,28 +977,6 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" -[[package]] -name = "strum" -version = "0.26.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.117", -] - [[package]] name = "syn" version = "1.0.109" @@ -1544,15 +999,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "termcolor" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" -dependencies = [ - "winapi-util", -] - [[package]] name = "thiserror" version = "2.0.18" @@ -1573,89 +1019,12 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "toml" -version = "0.8.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime 0.6.11", - "toml_edit 0.22.27", -] - -[[package]] -name = "toml_datetime" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_datetime" -version = "1.1.0+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97251a7c317e03ad83774a8752a7e81fb6067740609f75ea2b585b569a59198f" -dependencies = [ - "serde_core", -] - -[[package]] -name = "toml_edit" -version = "0.22.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" -dependencies = [ - "indexmap", - "serde", - "serde_spanned", - "toml_datetime 0.6.11", - "toml_write", - "winnow 0.7.15", -] - -[[package]] -name = "toml_edit" -version = "0.25.8+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16bff38f1d86c47f9ff0647e6838d7bb362522bdf44006c7068c2b1e606f1f3c" -dependencies = [ - "indexmap", - "toml_datetime 1.1.0+spec-1.1.0", - "toml_parser", - "winnow 1.0.0", -] - -[[package]] -name = "toml_parser" -version = "1.1.0+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2334f11ee363607eb04df9b8fc8a13ca1715a72ba8662a26ac285c98aabb4011" -dependencies = [ - "winnow 1.0.0", -] - -[[package]] -name = "toml_write" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" - [[package]] name = "typenum" version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" -[[package]] -name = "ufmt-write" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e87a2ed6b42ec5e28cc3b94c09982969e9227600b2e3dcbc1db927a84c06bd69" - [[package]] name = "unicode-ident" version = "1.0.24" @@ -1700,7 +1069,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb573c76e7884035ac5e1ab4a81234c187a82b6100140af0ab45757650ccda38" dependencies = [ "byteorder", - "hashbrown 0.13.2", + "hashbrown", "log", "proc-macro2", "quote", @@ -1736,90 +1105,6 @@ dependencies = [ "vcell", ] -[[package]] -name = "winapi-util" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" -dependencies = [ - "windows-sys", -] - -[[package]] -name = "windows-link" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" - -[[package]] -name = "windows-sys" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" -dependencies = [ - "windows-link", -] - -[[package]] -name = "winnow" -version = "0.7.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" -dependencies = [ - "memchr", -] - -[[package]] -name = "winnow" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a90e88e4667264a994d34e6d1ab2d26d398dcdca8b7f52bec8668957517fc7d8" -dependencies = [ - "memchr", -] - -[[package]] -name = "xtensa-lx" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e758f94e1a1f71758f94052a2766dcb12604998eb372b8b2e30576e3ab1ba1e6" -dependencies = [ - "bare-metal 1.0.0", - "mutex-trait", - "spin", -] - -[[package]] -name = "xtensa-lx-rt" -version = "0.17.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c0307d03dadbf95633942e13901984f2059df4c963367348168cbd21c962669" -dependencies = [ - "anyhow", - "bare-metal 1.0.0", - "document-features", - "enum-as-inner", - "minijinja", - "r0", - "serde", - "strum", - "toml", - "xtensa-lx", - "xtensa-lx-rt-proc-macros", -] - -[[package]] -name = "xtensa-lx-rt-proc-macros" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11277b1e4cbb7ffe44678c668518b249c843c81df249b8f096701757bc50d7ee" -dependencies = [ - "darling 0.20.11", - "proc-macro2", - "quote", - "syn 2.0.117", -] - [[package]] name = "zerocopy" version = "0.8.47" diff --git a/Cargo.toml b/Cargo.toml index 092000c5..c7dcfc20 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,12 +19,6 @@ postcard = { version = "1.0", default-features = false } serde = { version = "1.0", default-features = false, features = ["derive"] } static_cell = "2.1" -# ESP32-S3 (Heltec V3) -esp-backtrace = { version = "0.14", optional = true, features = ["esp32s3", "panic-handler", "defmt"] } -esp-hal = { version = "0.22", optional = true, features = ["esp32s3"] } -esp-hal-embassy = { version = "0.5", optional = true, features = ["esp32s3"] } -esp-println = { version = "0.12", optional = true, features = ["esp32s3", "defmt-espflash"] } - # nRF52840 (RAK 4631) cortex-m-rt = { version = "0.7", optional = true } embassy-nrf = { version = "0.2", optional = true, features = ["nrf52840", "gpiote", "time-driver-rtc1", "defmt"] } @@ -35,12 +29,6 @@ minijinja = "2.0" owo-colors = "4.0" [features] -heltec_v3 = [ - "dep:esp-backtrace", - "dep:esp-hal", - "dep:esp-hal-embassy", - "dep:esp-println", -] rak_4631 = [ "dep:cortex-m-rt", "dep:embassy-nrf", diff --git a/DESIGN.md b/DESIGN.md index 0b46f712..86ef8771 100644 --- a/DESIGN.md +++ b/DESIGN.md @@ -37,8 +37,8 @@ radio — it just gives you clean access to it. 6. **Minimal footprint.** Avoid heavy dependencies. Keep the binary small. Every dependency must justify its inclusion. -7. **Auto-detect peripherals.** If the board has a display, use it. No user - configuration required. +7. **Auto-detect peripherals.** If the board has a display, keyboard, or sensors, + use them. No user configuration required. 8. **World-class Rust.** Fully leverage the type system for safety. Strict `no_std`. Always clippy-clean. Thoughtfully designed — everything has an obvious home. @@ -47,6 +47,11 @@ radio — it just gives you clean access to it. 9. **Easy board support.** Adding a new board means dropping a `.rs` file and adding a Cargo feature. Nothing else changes. +10. **Standard toolchain only.** No custom Rust forks, no `espup`, no special SDKs. + If a board can't build with stock `rustup`, it doesn't ship. This rules out + Xtensa-based ESP32 chips (S2, S3) until upstream Rust fully supports them. + RISC-V ESP32 variants (C3, C6, H2) are fine. + ## Architecture ``` @@ -63,6 +68,23 @@ usb_task ──Command──► radio_task ──► SX1262 Each task exclusively owns its peripheral. No shared state except typed channels and a watch signal. Pure actor model. +## Peripheral Model + +Boards can have optional peripherals beyond the radio and USB. The board's +`into_parts()` returns `Option` slots for each, and the corresponding task is +only spawned when present. + +| Peripheral | Slot | Task | Examples | +|---|---|---|---| +| Display | `Option` | `display_task` | SSD1306 OLED, ST7789 TFT | +| Input | `Option` | `input_task` | T-Deck keyboard, buttons | +| Telemetry | `Option` | `telemetry_task` | Battery voltage, temperature | + +**Board files are always separate.** A T-Deck is `t_deck.rs`, not a variant of +Heltec V3. Each board owns its own init code and pin mappings. Shared logic between +boards that use the same MCU can be factored into helper modules if it earns its +keep, but never prematurely. + ## Technical Decisions | Decision | Choice | Why | @@ -74,3 +96,4 @@ a watch signal. Pure actor model. | Boot behavior | Idle until host commands | Host-driven principle | | Persistence | None | Always start fresh, true dumb pipe | | Board codegen | Jinja2 via build.rs | Auto-discovers boards from filesystem | +| Rust toolchain | Standard `rustup` only | No forks, no espup, no special SDKs | diff --git a/Justfile b/Justfile index bba6c6e3..c9e5e482 100644 --- a/Justfile +++ b/Justfile @@ -1,10 +1,8 @@ set shell := ["bash", "-c"] -heltec_v3 := "heltec_v3 xtensa-esp32s3-none-elf esp32s3" -rak_4631 := "rak_4631 thumbv7em-none-eabihf nRF52840_xxAA" +rak_4631 := "rak_4631 thumbv7em-none-eabihf nRF52840_xxAA" # Check all boards compile cleanly check-all: - just check heltec_v3 just check rak_4631 # Check a single board compiles @@ -30,6 +28,5 @@ size board: [private] _info name: - @if [ "{{name}}" == "heltec_v3" ]; then echo "{{heltec_v3}}"; \ - elif [ "{{name}}" == "rak_4631" ]; then echo "{{rak_4631}}"; \ - else echo "Unknown board" >&2; exit 1; fi + @if [ "{{name}}" == "rak_4631" ]; then echo "{{rak_4631}}"; \ + else echo "Unknown board: {{name}}" >&2; exit 1; fi diff --git a/src/board/heltec_v3.rs b/src/board/heltec_v3.rs deleted file mode 100644 index f1c4d088..00000000 --- a/src/board/heltec_v3.rs +++ /dev/null @@ -1,70 +0,0 @@ -use esp_hal::gpio::{GpioPin, Input, Output, PullDown, PushPull}; -use esp_hal::peripherals::SPI2; -use esp_hal::spi::master::Spi; -use esp_hal::spi::SpiMode; -use esp_hal::i2c::I2c; -use esp_hal::peripherals::I2C0; -use esp_hal::Delay; - -use lora_phy::iv::GenericSx126xInterfaceVariant; -use lora_phy::sx126x::{self, Sx1262, Sx126x}; -use lora_phy::LoRa; - -/// Board name shown on the display dashboard. -pub const BOARD_NAME: &str = "Heltec V3"; - -// ── Concrete peripheral types ──────────────────────────────────────── - -type Iv = GenericSx126xInterfaceVariant>, Input<'static, GpioPin<14>>>; -type RadioSpi = Spi<'static, SPI2>; -type RadioDriver = Sx126x; - -/// Fully-constructed LoRa radio driver. -pub type Radio = LoRa; - -/// USB driver for CDC-ACM. -// TODO: define concrete USB OTG type once esp-hal USB support is wired up -pub type UsbDriver = (); - -/// I2C bus for the built-in SSD1306 OLED. -pub type DisplayI2c = I2c<'static, I2C0>; - -// ── Peripheral bundles ─────────────────────────────────────────────── - -pub struct RadioParts { - pub radio: Radio, -} - -pub struct UsbParts { - pub driver: UsbDriver, -} - -pub struct DisplayParts { - pub i2c: DisplayI2c, -} - -// ── Board init ─────────────────────────────────────────────────────── - -pub struct Board { - p: esp_hal::peripherals::Peripherals, -} - -impl Board { - pub fn init() -> Self { - let p = esp_hal::init(esp_hal::Config::default()); - Self { p } - } - - pub fn into_parts(self) -> (RadioParts, UsbParts, Option) { - let _p = self.p; - - // TODO: implement Heltec V3 peripheral init - // - SPI2 for SX1262 (SCK=9, MOSI=10, MISO=11, NSS=8) - // - GPIO for radio control (RST=12, DIO1=14, BUSY=13) - // - Vext pin (GPIO21) LOW to power OLED - // - I2C0 for SSD1306 (SDA=17, SCL=18) - // - USB OTG for CDC-ACM - - todo!("Heltec V3 peripheral init — requires espup toolchain to develop") - } -} diff --git a/src/board/rak_4631.rs b/src/board/rak_4631.rs index a56d2ecc..e8f9fef7 100644 --- a/src/board/rak_4631.rs +++ b/src/board/rak_4631.rs @@ -18,10 +18,6 @@ bind_interrupts!(struct Irqs { SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0 => embassy_nrf::twim::InterruptHandler; }); -/// Board name shown on the display dashboard. -#[allow(dead_code)] -pub const BOARD_NAME: &str = "RAK 4631"; - // ── Concrete peripheral types ──────────────────────────────────────── type SpiBus = Spim<'static, embassy_nrf::peripherals::SPI3>; diff --git a/src/display/render.rs b/src/display/render.rs index bb8082c5..dc30a024 100644 --- a/src/display/render.rs +++ b/src/display/render.rs @@ -1,4 +1,4 @@ -use crate::channel::{RadioState, RadioStatus}; +use crate::channel::RadioStatus; /// Render the status dashboard to a framebuffer. /// @@ -13,13 +13,3 @@ pub fn dashboard(status: &RadioStatus) { // Line 5: last RSSI / SNR let _ = status; } - -/// Format radio state as a short display string. -#[allow(dead_code)] -pub fn state_label(state: RadioState) -> &'static str { - match state { - RadioState::Idle => "IDLE", - RadioState::Receiving => "RX", - RadioState::Transmitting => "TX", - } -} diff --git a/src/error.rs b/src/error.rs deleted file mode 100644 index 6d19e74b..00000000 --- a/src/error.rs +++ /dev/null @@ -1,16 +0,0 @@ -/// Radio hardware errors. -#[allow(dead_code)] -#[derive(Debug, defmt::Format)] -pub enum RadioError { - InitFailed, - TxTimeout, - InvalidConfig, -} - -/// USB protocol framing errors. -#[allow(dead_code)] -#[derive(Debug, defmt::Format)] -pub enum ProtocolError { - DeserializeFailed, - BufferOverflow, -} diff --git a/src/main.rs b/src/main.rs index 8feca9aa..d15362c8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,7 +4,6 @@ mod board; mod channel; mod display; -mod error; mod protocol; mod radio; mod usb; @@ -16,8 +15,6 @@ use crate::channel::{CommandChannel, ResponseChannel, StatusWatch}; cfg_if::cfg_if! { if #[cfg(feature = "rak_4631")] { use panic_probe as _; - } else if #[cfg(feature = "heltec_v3")] { - use esp_backtrace as _; } } diff --git a/src/protocol.rs b/src/protocol.rs index e84fb1ca..c1b11767 100644 --- a/src/protocol.rs +++ b/src/protocol.rs @@ -4,10 +4,6 @@ use serde::{Deserialize, Serialize}; /// Maximum LoRa payload size in bytes. pub const MAX_PAYLOAD: usize = 256; -/// Protocol version for host compatibility checks. -#[allow(dead_code)] -pub const PROTOCOL_VERSION: u8 = 1; - /// LoRa signal bandwidth. #[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq, defmt::Format)] #[repr(u8)]