From 9854e0c0a84c03d5e07dda0586002ff3d354303c Mon Sep 17 00:00:00 2001 From: Joakim Hulthe Date: Mon, 12 Jun 2023 17:39:07 +0200 Subject: [PATCH] stuff --- .cargo/{config => config.toml} | 0 .gitignore | 2 +- left/Cargo.lock | 1798 +++++++++++++++++++++++ left/Cargo.toml | 29 + build.rs => left/build.rs | 7 +- layers-left.ron => left/layers.ron | 6 +- left/src/layers.pc | Bin 0 -> 109 bytes src/bin/left.rs => left/src/main.rs | 19 +- lib/Cargo.lock | 1781 ++++++++++++++++++++++ Cargo.toml => lib/Cargo.toml | 20 +- lib/memory.x | 15 + {src => lib/src}/.gitignore | 0 {src => lib/src}/allocator.rs | 0 {src => lib/src}/board.rs | 0 {src => lib/src}/defmt.rs | 0 lib/src/event.rs | 60 + lib/src/interrupts.rs | 11 + {src => lib/src}/keyboard.rs | 142 +- {src => lib/src}/keyboard/lights.rs | 100 +- lib/src/keypress_handler.rs | 397 +++++ {src => lib/src}/led.rs | 0 lib/src/lib.rs | 32 + {src => lib/src}/lights.rs | 2 +- {src => lib/src}/logger.rs | 6 +- {src => lib/src}/neopixel.pio | 0 {src => lib/src}/neopixel.rs | 0 {src => lib/src}/neopixel2.pio | 0 {src => lib/src}/panic_handler.rs | 0 lib/src/rgb.rs | 58 + {src => lib/src}/rtt.rs | 0 {src => lib/src}/uart.rs | 7 +- {src => lib/src}/usb.rs | 2 +- {src => lib/src}/usb/keyboard.rs | 139 +- {src => lib/src}/usb/keyboard/report.rs | 41 +- {src => lib/src}/usb/logger.rs | 24 +- {src => lib/src}/util.rs | 2 +- {src => lib/src}/ws2812.rs | 47 +- Cargo.lock => right/Cargo.lock | 218 ++- right/Cargo.toml | 29 + right/build.rs | 59 + layers-right.ron => right/layers.ron | 6 +- right/src/layers.pc | Bin 0 -> 105 bytes src/bin/right.rs => right/src/main.rs | 18 +- src/bin/.gitignore | 1 - src/lib.rs | 30 - 45 files changed, 4708 insertions(+), 400 deletions(-) rename .cargo/{config => config.toml} (100%) create mode 100644 left/Cargo.lock create mode 100644 left/Cargo.toml rename build.rs => left/build.rs (89%) rename layers-left.ron => left/layers.ron (95%) create mode 100644 left/src/layers.pc rename src/bin/left.rs => left/src/main.rs (90%) create mode 100644 lib/Cargo.lock rename Cargo.toml => lib/Cargo.toml (73%) create mode 100644 lib/memory.x rename {src => lib/src}/.gitignore (100%) rename {src => lib/src}/allocator.rs (100%) rename {src => lib/src}/board.rs (100%) rename {src => lib/src}/defmt.rs (100%) create mode 100644 lib/src/event.rs create mode 100644 lib/src/interrupts.rs rename {src => lib/src}/keyboard.rs (67%) rename {src => lib/src}/keyboard/lights.rs (68%) create mode 100644 lib/src/keypress_handler.rs rename {src => lib/src}/led.rs (100%) create mode 100644 lib/src/lib.rs rename {src => lib/src}/lights.rs (96%) rename {src => lib/src}/logger.rs (91%) rename {src => lib/src}/neopixel.pio (100%) rename {src => lib/src}/neopixel.rs (100%) rename {src => lib/src}/neopixel2.pio (100%) rename {src => lib/src}/panic_handler.rs (100%) create mode 100644 lib/src/rgb.rs rename {src => lib/src}/rtt.rs (100%) rename {src => lib/src}/uart.rs (97%) rename {src => lib/src}/usb.rs (97%) rename {src => lib/src}/usb/keyboard.rs (55%) rename {src => lib/src}/usb/keyboard/report.rs (78%) rename {src => lib/src}/usb/logger.rs (67%) rename {src => lib/src}/util.rs (96%) rename {src => lib/src}/ws2812.rs (73%) rename Cargo.lock => right/Cargo.lock (88%) create mode 100644 right/Cargo.toml create mode 100644 right/build.rs rename layers-right.ron => right/layers.ron (94%) create mode 100644 right/src/layers.pc rename src/bin/right.rs => right/src/main.rs (90%) delete mode 100644 src/bin/.gitignore delete mode 100644 src/lib.rs diff --git a/.cargo/config b/.cargo/config.toml similarity index 100% rename from .cargo/config rename to .cargo/config.toml diff --git a/.gitignore b/.gitignore index ea8c4bf..eb5a316 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -/target +target diff --git a/left/Cargo.lock b/left/Cargo.lock new file mode 100644 index 0000000..dd71daf --- /dev/null +++ b/left/Cargo.lock @@ -0,0 +1,1798 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "aho-corasick" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +dependencies = [ + "memchr", +] + +[[package]] +name = "arrayvec" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" + +[[package]] +name = "ascii-canvas" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6" +dependencies = [ + "term", +] + +[[package]] +name = "atomic-polyfill" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ff7eb3f316534d83a8a2c3d1674ace8a5a71198eba31e2e2b597833f699b28" +dependencies = [ + "critical-section", +] + +[[package]] +name = "atomic-polyfill" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c314e70d181aa6053b26e3f7fbf86d1dfff84f816a6175b967666b3506ef7289" +dependencies = [ + "critical-section", +] + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi 0.1.19", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "az" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973" + +[[package]] +name = "bare-metal" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5deb64efa5bd81e31fcd1938615a6d98c82eafcbcd787162b6f63b91d6bac5b3" +dependencies = [ + "rustc_version 0.2.3", +] + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + +[[package]] +name = "bitfield" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46afbd2983a5d5a7bd740ccb198caf5b82f45c40c09c0eed36052d91cb92e719" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bytemuck" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdde5c9cd29ebd706ce1b35600920a33550e402fc998a2e53ad3b42c3c47a192" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.18", +] + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cobs" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" + +[[package]] +name = "codespan-reporting" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +dependencies = [ + "termcolor", + "unicode-width", +] + +[[package]] +name = "colored" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3616f750b84d8f0de8a58bda93e08e2a81ad3f523089b05f1dffecab48c6cbd" +dependencies = [ + "atty", + "lazy_static", + "winapi", +] + +[[package]] +name = "cortex-m" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ec610d8f49840a5b376c69663b6369e71f4b34484b9b2eb29fb918d92516cb9" +dependencies = [ + "bare-metal", + "bitfield", + "embedded-hal 0.2.7", + "volatile-register", +] + +[[package]] +name = "cortex-m-rt" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee84e813d593101b1723e13ec38b6ab6abbdbaaa4546553f5395ed274079ddb1" +dependencies = [ + "cortex-m-rt-macros", +] + +[[package]] +name = "cortex-m-rt-macros" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f6f3e36f203cfedbc78b357fb28730aa2c6dc1ab060ee5c2405e843988d3c7" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "crc-any" +version = "2.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "774646b687f63643eb0f4bf13dc263cb581c8c9e57973b6ddf78bda3994d88df" +dependencies = [ + "debug-helper", +] + +[[package]] +name = "critical-section" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6548a0ad5d2549e111e1f6a11a6c2e2d00ce6a3dafe22948d67c2b443f775e52" + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "darling" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 1.0.109", +] + +[[package]] +name = "darling_macro" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" +dependencies = [ + "darling_core", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "debug-helper" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f578e8e2c440e7297e008bb5486a3a8a194775224bbc23729b0dbdfaeebf162e" + +[[package]] +name = "diff" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" + +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "either" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" + +[[package]] +name = "embassy-embedded-hal" +version = "0.1.0" +source = "git+https://github.com/embassy-rs/embassy.git#ab86b060500ceda1c80e39f35af69cb08a7b63a2" +dependencies = [ + "embassy-futures", + "embassy-sync", + "embedded-hal 0.2.7", + "embedded-hal 1.0.0-alpha.10", + "embedded-hal-async", + "embedded-storage", + "embedded-storage-async", + "nb 1.1.0", +] + +[[package]] +name = "embassy-executor" +version = "0.2.0" +source = "git+https://github.com/embassy-rs/embassy.git#ab86b060500ceda1c80e39f35af69cb08a7b63a2" +dependencies = [ + "atomic-polyfill 1.0.2", + "cortex-m", + "critical-section", + "embassy-macros", + "embassy-time", + "futures-util", + "log", + "static_cell", +] + +[[package]] +name = "embassy-futures" +version = "0.1.0" +source = "git+https://github.com/embassy-rs/embassy.git#ab86b060500ceda1c80e39f35af69cb08a7b63a2" +dependencies = [ + "log", +] + +[[package]] +name = "embassy-hal-common" +version = "0.1.0" +source = "git+https://github.com/embassy-rs/embassy.git#ab86b060500ceda1c80e39f35af69cb08a7b63a2" +dependencies = [ + "cortex-m", + "critical-section", + "num-traits", +] + +[[package]] +name = "embassy-macros" +version = "0.2.0" +source = "git+https://github.com/embassy-rs/embassy.git#ab86b060500ceda1c80e39f35af69cb08a7b63a2" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "embassy-net-driver" +version = "0.1.0" +source = "git+https://github.com/embassy-rs/embassy.git#ab86b060500ceda1c80e39f35af69cb08a7b63a2" + +[[package]] +name = "embassy-net-driver-channel" +version = "0.1.0" +source = "git+https://github.com/embassy-rs/embassy.git#ab86b060500ceda1c80e39f35af69cb08a7b63a2" +dependencies = [ + "embassy-futures", + "embassy-net-driver", + "embassy-sync", +] + +[[package]] +name = "embassy-rp" +version = "0.1.0" +source = "git+https://github.com/embassy-rs/embassy.git#ab86b060500ceda1c80e39f35af69cb08a7b63a2" +dependencies = [ + "atomic-polyfill 1.0.2", + "cfg-if", + "cortex-m", + "cortex-m-rt", + "critical-section", + "embassy-embedded-hal", + "embassy-futures", + "embassy-hal-common", + "embassy-sync", + "embassy-time", + "embassy-usb-driver", + "embedded-hal 0.2.7", + "embedded-hal 1.0.0-alpha.10", + "embedded-hal-async", + "embedded-hal-nb", + "embedded-io", + "embedded-storage", + "fixed", + "futures", + "log", + "nb 1.1.0", + "paste", + "pio", + "pio-proc", + "rand_core", + "rp-pac", + "rp2040-boot2", +] + +[[package]] +name = "embassy-sync" +version = "0.2.0" +source = "git+https://github.com/embassy-rs/embassy.git#ab86b060500ceda1c80e39f35af69cb08a7b63a2" +dependencies = [ + "cfg-if", + "critical-section", + "embedded-io", + "futures-util", + "heapless", + "log", +] + +[[package]] +name = "embassy-time" +version = "0.1.1" +source = "git+https://github.com/embassy-rs/embassy.git#ab86b060500ceda1c80e39f35af69cb08a7b63a2" +dependencies = [ + "atomic-polyfill 1.0.2", + "cfg-if", + "critical-section", + "embedded-hal 0.2.7", + "futures-util", + "heapless", + "log", +] + +[[package]] +name = "embassy-usb" +version = "0.1.0" +source = "git+https://github.com/embassy-rs/embassy.git#ab86b060500ceda1c80e39f35af69cb08a7b63a2" +dependencies = [ + "embassy-futures", + "embassy-net-driver-channel", + "embassy-sync", + "embassy-usb-driver", + "heapless", + "ssmarshal", + "usbd-hid", +] + +[[package]] +name = "embassy-usb-driver" +version = "0.1.0" +source = "git+https://github.com/embassy-rs/embassy.git#ab86b060500ceda1c80e39f35af69cb08a7b63a2" + +[[package]] +name = "embassy-usb-logger" +version = "0.1.0" +source = "git+https://github.com/embassy-rs/embassy.git#ab86b060500ceda1c80e39f35af69cb08a7b63a2" +dependencies = [ + "embassy-futures", + "embassy-sync", + "embassy-usb", + "futures", + "log", + "static_cell", + "usbd-hid", +] + +[[package]] +name = "embedded-alloc" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8931e47e33c5d3194fbcf9cc82df0919193bd2fa40008f388eb1d28fd9c9ea6b" +dependencies = [ + "critical-section", + "linked_list_allocator", +] + +[[package]] +name = "embedded-hal" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35949884794ad573cf46071e41c9b60efb0cb311e3ca01f7af807af1debc66ff" +dependencies = [ + "nb 0.1.3", + "void", +] + +[[package]] +name = "embedded-hal" +version = "1.0.0-alpha.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f65c4d073f5d91c66e629b216818a4c9747eeda0debedf2deda9a0a947e4e93b" + +[[package]] +name = "embedded-hal-async" +version = "0.2.0-alpha.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8042370aa7af48de36d5312cda14c18ed8ca6b7ce64f5a07832fedc9dc83063f" +dependencies = [ + "embedded-hal 1.0.0-alpha.10", +] + +[[package]] +name = "embedded-hal-nb" +version = "1.0.0-alpha.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465fffd56a95bbc105c17965bca1c1d5815027b1cc6bb183bc05d04563d065c" +dependencies = [ + "embedded-hal 1.0.0-alpha.10", + "nb 1.1.0", +] + +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + +[[package]] +name = "embedded-storage" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "156d7a2fdd98ebbf9ae579cbceca3058cff946e13f8e17b90e3511db0508c723" + +[[package]] +name = "embedded-storage-async" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "052997a894670d0cde873faa7405bc98e2fd29f569d2acd568561bc1c396b35a" +dependencies = [ + "embedded-storage", +] + +[[package]] +name = "ena" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c533630cf40e9caa44bd91aadc88a75d75a4c3a12b4cfde353cbed41daa1e1f1" +dependencies = [ + "log", +] + +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + +[[package]] +name = "errno" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "fixed" +version = "1.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79386fdcec5e0fde91b1a6a5bcd89677d1f9304f7f986b154a1b9109038854d9" +dependencies = [ + "az", + "bytemuck", + "half", + "typenum", +] + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "futures" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" + +[[package]] +name = "futures-io" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" + +[[package]] +name = "futures-macro" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.18", +] + +[[package]] +name = "futures-sink" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" + +[[package]] +name = "futures-task" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" + +[[package]] +name = "futures-util" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +dependencies = [ + "futures-core", + "futures-macro", + "futures-sink", + "futures-task", + "pin-project-lite", + "pin-utils", +] + +[[package]] +name = "getrandom" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "half" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b4af3693f1b705df946e9fe5631932443781d0aabb423b62fcd4d73f6d2fd0" +dependencies = [ + "crunchy", +] + +[[package]] +name = "hash32" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +dependencies = [ + "byteorder", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "heapless" +version = "0.7.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db04bc24a18b9ea980628ecf00e6c0264f3c1426dac36c00cb49b6fbad8b0743" +dependencies = [ + "atomic-polyfill 0.1.11", + "hash32", + "rustc_version 0.4.0", + "serde", + "spin", + "stable_deref_trait", +] + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi 0.3.1", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "is-terminal" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" +dependencies = [ + "hermit-abi 0.3.1", + "io-lifetimes", + "rustix", + "windows-sys 0.48.0", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" + +[[package]] +name = "lalrpop" +version = "0.19.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a1cbf952127589f2851ab2046af368fd20645491bb4b376f04b7f94d7a9837b" +dependencies = [ + "ascii-canvas", + "bit-set", + "diff", + "ena", + "is-terminal", + "itertools", + "lalrpop-util", + "petgraph", + "regex", + "regex-syntax 0.6.29", + "string_cache", + "term", + "tiny-keccak", + "unicode-xid", +] + +[[package]] +name = "lalrpop-util" +version = "0.19.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3c48237b9604c5a4702de6b824e02006c3214327564636aef27c1028a8fa0ed" +dependencies = [ + "regex", +] + +[[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.146" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f92be4933c13fd498862a9e02a3055f8a8d9c039ce33db97306fd5a6caa7f29b" + +[[package]] +name = "linked_list_allocator" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afa463f5405ee81cdb9cc2baf37e08ec7e4c8209442b5d72c04cfb2cd6e6286" + +[[package]] +name = "linux-raw-sys" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" + +[[package]] +name = "lock_api" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "nb" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "801d31da0513b6ec5214e9bf433a77966320625a37860f910be265be6e18d06f" +dependencies = [ + "nb 1.1.0", +] + +[[package]] +name = "nb" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d5439c4ad607c3c23abf66de8c8bf57ba8adcd1f129e699851a6e43935d339d" + +[[package]] +name = "new_debug_unreachable" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "num_threads" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +dependencies = [ + "libc", +] + +[[package]] +name = "once_cell" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.3.5", + "smallvec", + "windows-targets", +] + +[[package]] +name = "paste" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79" + +[[package]] +name = "petgraph" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dd7d28ee937e54fe3080c91faa1c3a46c06de6252988a7f4592ba2310ef22a4" +dependencies = [ + "fixedbitset", + "indexmap", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pio" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76e09694b50f89f302ed531c1f2a7569f0be5867aee4ab4f8f729bbeec0078e3" +dependencies = [ + "arrayvec", + "num_enum", + "paste", +] + +[[package]] +name = "pio-parser" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77532c2b8279aef98dfc7207ef15298a5a3d6b6cc76ccc8b65913d69f3a8dd6b" +dependencies = [ + "lalrpop", + "lalrpop-util", + "pio", + "regex-syntax 0.6.29", +] + +[[package]] +name = "pio-proc" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b04dc870fb3a4fd8b3e4ca8c61b53bc8ac4eb78b66805d2b3c2e5c4829e0d7a" +dependencies = [ + "codespan-reporting", + "lalrpop-util", + "pio", + "pio-parser", + "proc-macro-error", + "proc-macro2", + "quote", + "regex-syntax 0.6.29", + "syn 1.0.109", +] + +[[package]] +name = "postcard" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfa512cd0d087cc9f99ad30a1bf64795b67871edbead083ffc3a4dfafa59aa00" +dependencies = [ + "cobs", + "heapless", + "serde", +] + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dec2b086b7a862cf4de201096214fa870344cf922b2b30c167badb3af3195406" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_users" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +dependencies = [ + "getrandom", + "redox_syscall 0.2.16", + "thiserror", +] + +[[package]] +name = "regex" +version = "1.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0ab3ca65655bb1e41f2a8c8cd662eb4fb035e67c3f78da1d61dffe89d07300f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.7.2", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78" + +[[package]] +name = "rgb" +version = "0.8.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20ec2d3e3fc7a92ced357df9cebd5a10b6fb2aa1ee797bf7e9ce2f17dffc8f59" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "ron" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300a51053b1cb55c80b7a9fde4120726ddf25ca241a1cbb926626f62fb136bff" +dependencies = [ + "base64", + "bitflags", + "serde", +] + +[[package]] +name = "rp-pac" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a76e426cd8377db668fba1fe885028788b126b7cef91059cd478de8b076c2915" +dependencies = [ + "cortex-m", + "cortex-m-rt", +] + +[[package]] +name = "rp2040-boot2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c92f344f63f950ee36cf4080050e4dce850839b9175da38f9d2ffb69b4dbb21" +dependencies = [ + "crc-any", +] + +[[package]] +name = "rtt-target" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3afa12c77ba1b9bf560e4039a9b9a08bb9cde0e9e6923955eeb917dd8d5cf303" +dependencies = [ + "critical-section", + "ufmt-write", +] + +[[package]] +name = "rustc_version" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +dependencies = [ + "semver 0.9.0", +] + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver 1.0.17", +] + +[[package]] +name = "rustix" +version = "0.37.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b96e891d04aa506a6d1f318d2771bcb1c7dfda84e126660ace067c9b474bb2c0" +dependencies = [ + "bitflags", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustversion" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06" + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "semver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" + +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" + +[[package]] +name = "serde" +version = "1.0.164" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.164" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.18", +] + +[[package]] +name = "simple_logger" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e78beb34673091ccf96a8816fce8bfd30d1292c7621ca2bcb5f2ba0fae4f558d" +dependencies = [ + "atty", + "colored", + "log", + "time", + "windows-sys 0.42.0", +] + +[[package]] +name = "siphasher" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" + +[[package]] +name = "smallvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" + +[[package]] +name = "smart-leds" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38dd45fa275f70b4110eac5f5182611ad384f88bb22b68b9a9c3cafd7015290b" +dependencies = [ + "smart-leds-trait", +] + +[[package]] +name = "smart-leds-trait" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebf6d833fa93f16a1c1874e62c2aebe8567e5bdd436d59bf543ed258b6f7a8e3" +dependencies = [ + "rgb", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3e6ad23b128192ed337dfa4f1b8099ced0c2bf30d61e551b65fda5916dbb850" +dependencies = [ + "encode_unicode", + "serde", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "static_cell" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed6a851e9c00ce152b2bad24e8545a6db0b8646988267a6ea966d95c6932e8a2" +dependencies = [ + "atomic-polyfill 1.0.2", +] + +[[package]] +name = "string_cache" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" +dependencies = [ + "new_debug_unreachable", + "once_cell", + "parking_lot", + "phf_shared", + "precomputed-hash", +] + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32d41677bcbe24c20c52e7c70b0d8db04134c5d1066bf98662e2871ad200ea3e" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tangentbord1-left" +version = "0.1.0" +dependencies = [ + "cortex-m-rt", + "embassy-executor", + "embassy-futures", + "embassy-rp", + "embassy-sync", + "embassy-time", + "log", + "postcard", + "ron", + "tangentbord1-lib", + "tgnt", +] + +[[package]] +name = "tangentbord1-lib" +version = "0.1.0" +dependencies = [ + "atomic-polyfill 1.0.2", + "bytemuck", + "cortex-m", + "cortex-m-rt", + "crc-any", + "critical-section", + "embassy-executor", + "embassy-futures", + "embassy-rp", + "embassy-sync", + "embassy-time", + "embassy-usb", + "embassy-usb-driver", + "embassy-usb-logger", + "embedded-alloc", + "embedded-hal 0.2.7", + "embedded-io", + "fixed", + "futures", + "heapless", + "log", + "once_cell", + "pio", + "pio-proc", + "postcard", + "ron", + "rtt-target", + "serde", + "simple_logger", + "smart-leds", + "static_cell", + "tgnt", + "usb-device", + "usbd-hid", +] + +[[package]] +name = "term" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +dependencies = [ + "dirs-next", + "rustversion", + "winapi", +] + +[[package]] +name = "termcolor" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "tgnt" +version = "0.1.0" +dependencies = [ + "serde", +] + +[[package]] +name = "thiserror" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.18", +] + +[[package]] +name = "time" +version = "0.3.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea9e1b3cf1243ae005d9e74085d4d542f3125458f3a81af210d901dcd7411efd" +dependencies = [ + "itoa", + "libc", + "num_threads", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" + +[[package]] +name = "time-macros" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "372950940a5f07bf38dbe211d7283c9e6d7327df53794992d293e534c733d09b" +dependencies = [ + "time-core", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "typenum" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" + +[[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.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" + +[[package]] +name = "unicode-width" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" + +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + +[[package]] +name = "usb-device" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f6cc3adc849b5292b4075fc0d5fdcf2f24866e88e336dd27a8943090a520508" + +[[package]] +name = "usbd-hid" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "975bd411f4a939986751ea09992a24fa47c4d25c6ed108d04b4c2999a4fd0132" +dependencies = [ + "serde", + "ssmarshal", + "usb-device", + "usbd-hid-macros", +] + +[[package]] +name = "usbd-hid-descriptors" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbee8c6735e90894fba04770bc41e11fd3c5256018856e15dc4dd1e6c8a3dd1" +dependencies = [ + "bitfield", +] + +[[package]] +name = "usbd-hid-macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "261079a9ada015fa1acac7cc73c98559f3a92585e15f508034beccf6a2ab75a2" +dependencies = [ + "byteorder", + "proc-macro2", + "quote", + "serde", + "syn 1.0.109", + "usbd-hid-descriptors", +] + +[[package]] +name = "vcell" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77439c1b53d2303b20d9459b1ade71a83c716e3f9c34f3228c00e6f185d6c002" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[package]] +name = "volatile-register" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ee8f19f9d74293faf70901bc20ad067dc1ad390d2cbf1e3f75f721ffee908b6" +dependencies = [ + "vcell", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +dependencies = [ + "windows_aarch64_gnullvm 0.48.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" diff --git a/left/Cargo.toml b/left/Cargo.toml new file mode 100644 index 0000000..979397f --- /dev/null +++ b/left/Cargo.toml @@ -0,0 +1,29 @@ +[package] +name = "tangentbord1-left" +version = "0.1.0" +authors = ["Joakim Hulthe "] +description = "Keyboard firmware" +edition = "2021" + +[dependencies.tangentbord1] +path = "../lib" +package = "tangentbord1-lib" + +[dependencies] +tgnt = { git = "https://git.nubo.sh/hulthe/tgnt.git", default-features = false } +cortex-m-rt = "0.7" +embassy-rp = { git = "https://github.com/embassy-rs/embassy.git", features = ["log", "nightly", "unstable-traits", "unstable-pac", "time-driver", "critical-section-impl"] } +embassy-executor = { git = "https://github.com/embassy-rs/embassy.git", features = ["arch-cortex-m", "log", "executor-thread", "nightly", "integrated-timers" ] } +embassy-sync = { git = "https://github.com/embassy-rs/embassy.git", features = ["log", "nightly"] } +embassy-time = { git = "https://github.com/embassy-rs/embassy.git", features = ["log"] } +embassy-futures = { git = "https://github.com/embassy-rs/embassy.git", features = ["log"] } +log = "0.4.17" +postcard = { version = "1.0.4", features = ["alloc"] } + +[patch."https://git.nubo.sh/hulthe/tgnt.git"] +tgnt = { path = "../../tgnt" } + +[build-dependencies] +tgnt = { git = "https://git.nubo.sh/hulthe/tgnt.git", default-features = false } +ron = "0.8.0" +postcard = { version = "1", features = ["use-std"] } diff --git a/build.rs b/left/build.rs similarity index 89% rename from build.rs rename to left/build.rs index e72cd13..43337e4 100644 --- a/build.rs +++ b/left/build.rs @@ -17,8 +17,7 @@ use tgnt::layer::Layer; fn main() { memory(); - serialize_layout("./layers-left.ron", "./src/bin/layers-left.pc"); - serialize_layout("./layers-right.ron", "./src/bin/layers-right.pc"); + serialize_layout("./layers.ron", "./src/layers.pc"); } fn memory() { @@ -27,7 +26,7 @@ fn memory() { let out = &PathBuf::from(env::var_os("OUT_DIR").unwrap()); File::create(out.join("memory.x")) .unwrap() - .write_all(include_bytes!("memory.x")) + .write_all(include_bytes!("../memory.x")) .unwrap(); println!("cargo:rustc-link-search={}", out.display()); @@ -35,7 +34,7 @@ fn memory() { // any file in the project changes. By specifying `memory.x` // here, we ensure the build script is only re-run when // `memory.x` is changed. - println!("cargo:rerun-if-changed=memory.x"); + println!("cargo:rerun-if-changed=../memory.x"); // --nmagic turns off page alignment of sections (which saves flash space) println!("cargo:rustc-link-arg-bins=--nmagic"); diff --git a/layers-left.ron b/left/layers.ron similarity index 95% rename from layers-left.ron rename to left/layers.ron index 8819ba8..c28fca1 100644 --- a/layers-left.ron +++ b/left/layers.ron @@ -25,7 +25,7 @@ // Thumbpad Key(Backspace), Key(Space), - NextLayer, + HoldLayer(1), ], ), Layer( @@ -54,7 +54,7 @@ // Thumbpad Key(Backspace), Key(Space), - NextLayer, + HoldLayer(1), ], ), Layer( @@ -83,7 +83,7 @@ // Thumbpad Key(Backspace), Key(Space), - NextLayer, + HoldLayer(1), ], ), ] diff --git a/left/src/layers.pc b/left/src/layers.pc new file mode 100644 index 0000000000000000000000000000000000000000..5f297699771721e14fe6613a39653104a51a6290 GIT binary patch literal 109 zcmYMsOAdli5Cze$+lE#LVh9OtKtaXu-5s)bc}^JDNqNDYk%^p}%yp3ts5FjrTsd*3 k;z5&<;LMAGNgvl!dZX5;BZ5A5w6O9GbCY4V)dc>FA5NDBkN^Mx literal 0 HcmV?d00001 diff --git a/src/bin/left.rs b/left/src/main.rs similarity index 90% rename from src/bin/left.rs rename to left/src/main.rs index bbbe2ad..6c820fc 100644 --- a/src/bin/left.rs +++ b/left/src/main.rs @@ -3,6 +3,7 @@ #![no_std] #![no_main] #![feature(type_alias_impl_trait)] +#![cfg(target_arch = "arm")] extern crate alloc; extern crate cortex_m_rt; @@ -12,12 +13,16 @@ use embassy_executor::Spawner; use embassy_rp::gpio::{Level, Output, Pin}; use embassy_time::{Duration, Timer}; use log::error; -use tangentbord1::board::Board; -use tangentbord1::keyboard::{Half, KeyboardConfig}; -use tangentbord1::logger::Logger; -use tangentbord1::util::{stall, wheel}; -use tangentbord1::ws2812::{Rgb, Ws2812}; -use tangentbord1::{allocator, rtt, uart, usb}; +use tangentbord1::{ + board::Board, + event::Half, + keyboard::KeyboardConfig, + logger::Logger, + rgb::Rgb, + util::{stall, wheel}, + ws2812::Ws2812, + {allocator, rtt, uart, usb}, +}; use tgnt::layer::Layer; #[embassy_executor::main] @@ -48,7 +53,7 @@ async fn main(_spawner: Spawner) { neopixel.write(&[Rgb::new(0xFF, 0x00, 0x00)]).await; - let layers = include_bytes!("layers-left.pc"); + let layers = include_bytes!("layers.pc"); let Ok(layers): Result, _> = postcard::from_bytes(layers) else { log::error!("Failed to deserialize layer config"); stall().await diff --git a/lib/Cargo.lock b/lib/Cargo.lock new file mode 100644 index 0000000..87fdc17 --- /dev/null +++ b/lib/Cargo.lock @@ -0,0 +1,1781 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "aho-corasick" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +dependencies = [ + "memchr", +] + +[[package]] +name = "arrayvec" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" + +[[package]] +name = "ascii-canvas" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6" +dependencies = [ + "term", +] + +[[package]] +name = "atomic-polyfill" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ff7eb3f316534d83a8a2c3d1674ace8a5a71198eba31e2e2b597833f699b28" +dependencies = [ + "critical-section", +] + +[[package]] +name = "atomic-polyfill" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c314e70d181aa6053b26e3f7fbf86d1dfff84f816a6175b967666b3506ef7289" +dependencies = [ + "critical-section", +] + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi 0.1.19", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "az" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973" + +[[package]] +name = "bare-metal" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5deb64efa5bd81e31fcd1938615a6d98c82eafcbcd787162b6f63b91d6bac5b3" +dependencies = [ + "rustc_version 0.2.3", +] + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + +[[package]] +name = "bitfield" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46afbd2983a5d5a7bd740ccb198caf5b82f45c40c09c0eed36052d91cb92e719" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bytemuck" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdde5c9cd29ebd706ce1b35600920a33550e402fc998a2e53ad3b42c3c47a192" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.18", +] + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cobs" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" + +[[package]] +name = "codespan-reporting" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +dependencies = [ + "termcolor", + "unicode-width", +] + +[[package]] +name = "colored" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3616f750b84d8f0de8a58bda93e08e2a81ad3f523089b05f1dffecab48c6cbd" +dependencies = [ + "atty", + "lazy_static", + "winapi", +] + +[[package]] +name = "cortex-m" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ec610d8f49840a5b376c69663b6369e71f4b34484b9b2eb29fb918d92516cb9" +dependencies = [ + "bare-metal", + "bitfield", + "embedded-hal 0.2.7", + "volatile-register", +] + +[[package]] +name = "cortex-m-rt" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee84e813d593101b1723e13ec38b6ab6abbdbaaa4546553f5395ed274079ddb1" +dependencies = [ + "cortex-m-rt-macros", +] + +[[package]] +name = "cortex-m-rt-macros" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f6f3e36f203cfedbc78b357fb28730aa2c6dc1ab060ee5c2405e843988d3c7" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "crc-any" +version = "2.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "774646b687f63643eb0f4bf13dc263cb581c8c9e57973b6ddf78bda3994d88df" +dependencies = [ + "debug-helper", +] + +[[package]] +name = "critical-section" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6548a0ad5d2549e111e1f6a11a6c2e2d00ce6a3dafe22948d67c2b443f775e52" + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "darling" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 1.0.109", +] + +[[package]] +name = "darling_macro" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" +dependencies = [ + "darling_core", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "debug-helper" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f578e8e2c440e7297e008bb5486a3a8a194775224bbc23729b0dbdfaeebf162e" + +[[package]] +name = "diff" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" + +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "either" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" + +[[package]] +name = "embassy-embedded-hal" +version = "0.1.0" +source = "git+https://github.com/embassy-rs/embassy.git#ab86b060500ceda1c80e39f35af69cb08a7b63a2" +dependencies = [ + "embassy-futures", + "embassy-sync", + "embedded-hal 0.2.7", + "embedded-hal 1.0.0-alpha.10", + "embedded-hal-async", + "embedded-storage", + "embedded-storage-async", + "nb 1.1.0", +] + +[[package]] +name = "embassy-executor" +version = "0.2.0" +source = "git+https://github.com/embassy-rs/embassy.git#ab86b060500ceda1c80e39f35af69cb08a7b63a2" +dependencies = [ + "atomic-polyfill 1.0.2", + "cortex-m", + "critical-section", + "embassy-macros", + "embassy-time", + "futures-util", + "log", + "static_cell", +] + +[[package]] +name = "embassy-futures" +version = "0.1.0" +source = "git+https://github.com/embassy-rs/embassy.git#ab86b060500ceda1c80e39f35af69cb08a7b63a2" +dependencies = [ + "log", +] + +[[package]] +name = "embassy-hal-common" +version = "0.1.0" +source = "git+https://github.com/embassy-rs/embassy.git#ab86b060500ceda1c80e39f35af69cb08a7b63a2" +dependencies = [ + "cortex-m", + "critical-section", + "num-traits", +] + +[[package]] +name = "embassy-macros" +version = "0.2.0" +source = "git+https://github.com/embassy-rs/embassy.git#ab86b060500ceda1c80e39f35af69cb08a7b63a2" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "embassy-net-driver" +version = "0.1.0" +source = "git+https://github.com/embassy-rs/embassy.git#ab86b060500ceda1c80e39f35af69cb08a7b63a2" + +[[package]] +name = "embassy-net-driver-channel" +version = "0.1.0" +source = "git+https://github.com/embassy-rs/embassy.git#ab86b060500ceda1c80e39f35af69cb08a7b63a2" +dependencies = [ + "embassy-futures", + "embassy-net-driver", + "embassy-sync", +] + +[[package]] +name = "embassy-rp" +version = "0.1.0" +source = "git+https://github.com/embassy-rs/embassy.git#ab86b060500ceda1c80e39f35af69cb08a7b63a2" +dependencies = [ + "atomic-polyfill 1.0.2", + "cfg-if", + "cortex-m", + "cortex-m-rt", + "critical-section", + "embassy-embedded-hal", + "embassy-futures", + "embassy-hal-common", + "embassy-sync", + "embassy-time", + "embassy-usb-driver", + "embedded-hal 0.2.7", + "embedded-hal 1.0.0-alpha.10", + "embedded-hal-async", + "embedded-hal-nb", + "embedded-io", + "embedded-storage", + "fixed", + "futures", + "log", + "nb 1.1.0", + "paste", + "pio", + "pio-proc", + "rand_core", + "rp-pac", + "rp2040-boot2", +] + +[[package]] +name = "embassy-sync" +version = "0.2.0" +source = "git+https://github.com/embassy-rs/embassy.git#ab86b060500ceda1c80e39f35af69cb08a7b63a2" +dependencies = [ + "cfg-if", + "critical-section", + "embedded-io", + "futures-util", + "heapless", + "log", +] + +[[package]] +name = "embassy-time" +version = "0.1.1" +source = "git+https://github.com/embassy-rs/embassy.git#ab86b060500ceda1c80e39f35af69cb08a7b63a2" +dependencies = [ + "atomic-polyfill 1.0.2", + "cfg-if", + "critical-section", + "embedded-hal 0.2.7", + "futures-util", + "heapless", + "log", +] + +[[package]] +name = "embassy-usb" +version = "0.1.0" +source = "git+https://github.com/embassy-rs/embassy.git#ab86b060500ceda1c80e39f35af69cb08a7b63a2" +dependencies = [ + "embassy-futures", + "embassy-net-driver-channel", + "embassy-sync", + "embassy-usb-driver", + "heapless", + "ssmarshal", + "usbd-hid", +] + +[[package]] +name = "embassy-usb-driver" +version = "0.1.0" +source = "git+https://github.com/embassy-rs/embassy.git#ab86b060500ceda1c80e39f35af69cb08a7b63a2" + +[[package]] +name = "embassy-usb-logger" +version = "0.1.0" +source = "git+https://github.com/embassy-rs/embassy.git#ab86b060500ceda1c80e39f35af69cb08a7b63a2" +dependencies = [ + "embassy-futures", + "embassy-sync", + "embassy-usb", + "futures", + "log", + "static_cell", + "usbd-hid", +] + +[[package]] +name = "embedded-alloc" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8931e47e33c5d3194fbcf9cc82df0919193bd2fa40008f388eb1d28fd9c9ea6b" +dependencies = [ + "critical-section", + "linked_list_allocator", +] + +[[package]] +name = "embedded-hal" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35949884794ad573cf46071e41c9b60efb0cb311e3ca01f7af807af1debc66ff" +dependencies = [ + "nb 0.1.3", + "void", +] + +[[package]] +name = "embedded-hal" +version = "1.0.0-alpha.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f65c4d073f5d91c66e629b216818a4c9747eeda0debedf2deda9a0a947e4e93b" + +[[package]] +name = "embedded-hal-async" +version = "0.2.0-alpha.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8042370aa7af48de36d5312cda14c18ed8ca6b7ce64f5a07832fedc9dc83063f" +dependencies = [ + "embedded-hal 1.0.0-alpha.10", +] + +[[package]] +name = "embedded-hal-nb" +version = "1.0.0-alpha.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465fffd56a95bbc105c17965bca1c1d5815027b1cc6bb183bc05d04563d065c" +dependencies = [ + "embedded-hal 1.0.0-alpha.10", + "nb 1.1.0", +] + +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + +[[package]] +name = "embedded-storage" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "156d7a2fdd98ebbf9ae579cbceca3058cff946e13f8e17b90e3511db0508c723" + +[[package]] +name = "embedded-storage-async" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "052997a894670d0cde873faa7405bc98e2fd29f569d2acd568561bc1c396b35a" +dependencies = [ + "embedded-storage", +] + +[[package]] +name = "ena" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c533630cf40e9caa44bd91aadc88a75d75a4c3a12b4cfde353cbed41daa1e1f1" +dependencies = [ + "log", +] + +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + +[[package]] +name = "errno" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "fixed" +version = "1.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79386fdcec5e0fde91b1a6a5bcd89677d1f9304f7f986b154a1b9109038854d9" +dependencies = [ + "az", + "bytemuck", + "half", + "typenum", +] + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "futures" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" + +[[package]] +name = "futures-io" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" + +[[package]] +name = "futures-macro" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.18", +] + +[[package]] +name = "futures-sink" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" + +[[package]] +name = "futures-task" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" + +[[package]] +name = "futures-util" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +dependencies = [ + "futures-core", + "futures-macro", + "futures-sink", + "futures-task", + "pin-project-lite", + "pin-utils", +] + +[[package]] +name = "getrandom" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "half" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b4af3693f1b705df946e9fe5631932443781d0aabb423b62fcd4d73f6d2fd0" +dependencies = [ + "crunchy", +] + +[[package]] +name = "hash32" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +dependencies = [ + "byteorder", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "heapless" +version = "0.7.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db04bc24a18b9ea980628ecf00e6c0264f3c1426dac36c00cb49b6fbad8b0743" +dependencies = [ + "atomic-polyfill 0.1.11", + "hash32", + "rustc_version 0.4.0", + "serde", + "spin", + "stable_deref_trait", +] + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi 0.3.1", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "is-terminal" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" +dependencies = [ + "hermit-abi 0.3.1", + "io-lifetimes", + "rustix", + "windows-sys 0.48.0", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" + +[[package]] +name = "lalrpop" +version = "0.19.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a1cbf952127589f2851ab2046af368fd20645491bb4b376f04b7f94d7a9837b" +dependencies = [ + "ascii-canvas", + "bit-set", + "diff", + "ena", + "is-terminal", + "itertools", + "lalrpop-util", + "petgraph", + "regex", + "regex-syntax 0.6.29", + "string_cache", + "term", + "tiny-keccak", + "unicode-xid", +] + +[[package]] +name = "lalrpop-util" +version = "0.19.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3c48237b9604c5a4702de6b824e02006c3214327564636aef27c1028a8fa0ed" +dependencies = [ + "regex", +] + +[[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.146" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f92be4933c13fd498862a9e02a3055f8a8d9c039ce33db97306fd5a6caa7f29b" + +[[package]] +name = "linked_list_allocator" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afa463f5405ee81cdb9cc2baf37e08ec7e4c8209442b5d72c04cfb2cd6e6286" + +[[package]] +name = "linux-raw-sys" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" + +[[package]] +name = "lock_api" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "nb" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "801d31da0513b6ec5214e9bf433a77966320625a37860f910be265be6e18d06f" +dependencies = [ + "nb 1.1.0", +] + +[[package]] +name = "nb" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d5439c4ad607c3c23abf66de8c8bf57ba8adcd1f129e699851a6e43935d339d" + +[[package]] +name = "new_debug_unreachable" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "num_threads" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +dependencies = [ + "libc", +] + +[[package]] +name = "once_cell" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.3.5", + "smallvec", + "windows-targets", +] + +[[package]] +name = "paste" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79" + +[[package]] +name = "petgraph" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dd7d28ee937e54fe3080c91faa1c3a46c06de6252988a7f4592ba2310ef22a4" +dependencies = [ + "fixedbitset", + "indexmap", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pio" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76e09694b50f89f302ed531c1f2a7569f0be5867aee4ab4f8f729bbeec0078e3" +dependencies = [ + "arrayvec", + "num_enum", + "paste", +] + +[[package]] +name = "pio-parser" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77532c2b8279aef98dfc7207ef15298a5a3d6b6cc76ccc8b65913d69f3a8dd6b" +dependencies = [ + "lalrpop", + "lalrpop-util", + "pio", + "regex-syntax 0.6.29", +] + +[[package]] +name = "pio-proc" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b04dc870fb3a4fd8b3e4ca8c61b53bc8ac4eb78b66805d2b3c2e5c4829e0d7a" +dependencies = [ + "codespan-reporting", + "lalrpop-util", + "pio", + "pio-parser", + "proc-macro-error", + "proc-macro2", + "quote", + "regex-syntax 0.6.29", + "syn 1.0.109", +] + +[[package]] +name = "postcard" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfa512cd0d087cc9f99ad30a1bf64795b67871edbead083ffc3a4dfafa59aa00" +dependencies = [ + "cobs", + "heapless", + "serde", +] + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dec2b086b7a862cf4de201096214fa870344cf922b2b30c167badb3af3195406" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_users" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +dependencies = [ + "getrandom", + "redox_syscall 0.2.16", + "thiserror", +] + +[[package]] +name = "regex" +version = "1.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0ab3ca65655bb1e41f2a8c8cd662eb4fb035e67c3f78da1d61dffe89d07300f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.7.2", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78" + +[[package]] +name = "rgb" +version = "0.8.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20ec2d3e3fc7a92ced357df9cebd5a10b6fb2aa1ee797bf7e9ce2f17dffc8f59" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "ron" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300a51053b1cb55c80b7a9fde4120726ddf25ca241a1cbb926626f62fb136bff" +dependencies = [ + "base64", + "bitflags", + "serde", +] + +[[package]] +name = "rp-pac" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a76e426cd8377db668fba1fe885028788b126b7cef91059cd478de8b076c2915" +dependencies = [ + "cortex-m", + "cortex-m-rt", +] + +[[package]] +name = "rp2040-boot2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c92f344f63f950ee36cf4080050e4dce850839b9175da38f9d2ffb69b4dbb21" +dependencies = [ + "crc-any", +] + +[[package]] +name = "rtt-target" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3afa12c77ba1b9bf560e4039a9b9a08bb9cde0e9e6923955eeb917dd8d5cf303" +dependencies = [ + "critical-section", + "ufmt-write", +] + +[[package]] +name = "rustc_version" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +dependencies = [ + "semver 0.9.0", +] + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver 1.0.17", +] + +[[package]] +name = "rustix" +version = "0.37.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b96e891d04aa506a6d1f318d2771bcb1c7dfda84e126660ace067c9b474bb2c0" +dependencies = [ + "bitflags", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustversion" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06" + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "semver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" + +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" + +[[package]] +name = "serde" +version = "1.0.164" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.164" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.18", +] + +[[package]] +name = "simple_logger" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e78beb34673091ccf96a8816fce8bfd30d1292c7621ca2bcb5f2ba0fae4f558d" +dependencies = [ + "atty", + "colored", + "log", + "time", + "windows-sys 0.42.0", +] + +[[package]] +name = "siphasher" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" + +[[package]] +name = "smallvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" + +[[package]] +name = "smart-leds" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38dd45fa275f70b4110eac5f5182611ad384f88bb22b68b9a9c3cafd7015290b" +dependencies = [ + "smart-leds-trait", +] + +[[package]] +name = "smart-leds-trait" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebf6d833fa93f16a1c1874e62c2aebe8567e5bdd436d59bf543ed258b6f7a8e3" +dependencies = [ + "rgb", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3e6ad23b128192ed337dfa4f1b8099ced0c2bf30d61e551b65fda5916dbb850" +dependencies = [ + "encode_unicode", + "serde", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "static_cell" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed6a851e9c00ce152b2bad24e8545a6db0b8646988267a6ea966d95c6932e8a2" +dependencies = [ + "atomic-polyfill 1.0.2", +] + +[[package]] +name = "string_cache" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" +dependencies = [ + "new_debug_unreachable", + "once_cell", + "parking_lot", + "phf_shared", + "precomputed-hash", +] + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32d41677bcbe24c20c52e7c70b0d8db04134c5d1066bf98662e2871ad200ea3e" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tangentbord1-lib" +version = "0.1.0" +dependencies = [ + "atomic-polyfill 1.0.2", + "bytemuck", + "cortex-m", + "cortex-m-rt", + "crc-any", + "critical-section", + "embassy-executor", + "embassy-futures", + "embassy-rp", + "embassy-sync", + "embassy-time", + "embassy-usb", + "embassy-usb-driver", + "embassy-usb-logger", + "embedded-alloc", + "embedded-hal 0.2.7", + "embedded-io", + "fixed", + "futures", + "heapless", + "log", + "once_cell", + "pio", + "pio-proc", + "postcard", + "ron", + "rtt-target", + "serde", + "simple_logger", + "smart-leds", + "static_cell", + "tgnt", + "usb-device", + "usbd-hid", +] + +[[package]] +name = "term" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +dependencies = [ + "dirs-next", + "rustversion", + "winapi", +] + +[[package]] +name = "termcolor" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "tgnt" +version = "0.1.0" +dependencies = [ + "serde", +] + +[[package]] +name = "thiserror" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.18", +] + +[[package]] +name = "time" +version = "0.3.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea9e1b3cf1243ae005d9e74085d4d542f3125458f3a81af210d901dcd7411efd" +dependencies = [ + "itoa", + "libc", + "num_threads", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" + +[[package]] +name = "time-macros" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "372950940a5f07bf38dbe211d7283c9e6d7327df53794992d293e534c733d09b" +dependencies = [ + "time-core", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "typenum" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" + +[[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.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" + +[[package]] +name = "unicode-width" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" + +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + +[[package]] +name = "usb-device" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f6cc3adc849b5292b4075fc0d5fdcf2f24866e88e336dd27a8943090a520508" + +[[package]] +name = "usbd-hid" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "975bd411f4a939986751ea09992a24fa47c4d25c6ed108d04b4c2999a4fd0132" +dependencies = [ + "serde", + "ssmarshal", + "usb-device", + "usbd-hid-macros", +] + +[[package]] +name = "usbd-hid-descriptors" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbee8c6735e90894fba04770bc41e11fd3c5256018856e15dc4dd1e6c8a3dd1" +dependencies = [ + "bitfield", +] + +[[package]] +name = "usbd-hid-macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "261079a9ada015fa1acac7cc73c98559f3a92585e15f508034beccf6a2ab75a2" +dependencies = [ + "byteorder", + "proc-macro2", + "quote", + "serde", + "syn 1.0.109", + "usbd-hid-descriptors", +] + +[[package]] +name = "vcell" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77439c1b53d2303b20d9459b1ade71a83c716e3f9c34f3228c00e6f185d6c002" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[package]] +name = "volatile-register" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ee8f19f9d74293faf70901bc20ad067dc1ad390d2cbf1e3f75f721ffee908b6" +dependencies = [ + "vcell", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +dependencies = [ + "windows_aarch64_gnullvm 0.48.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" diff --git a/Cargo.toml b/lib/Cargo.toml similarity index 73% rename from Cargo.toml rename to lib/Cargo.toml index 70adf60..3877a7c 100644 --- a/Cargo.toml +++ b/lib/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "tangentbord1" +name = "tangentbord1-lib" version = "0.1.0" authors = ["Joakim Hulthe "] description = "Keyboard firmware" @@ -14,15 +14,14 @@ usb-device = "0.2.9" usbd-hid = "0.6.1" static_cell = "1.0.0" embedded-io = { version = "*", features = ["async"] } -futures = { version = "0.3", default-features = false } -embassy-executor = { git = "https://github.com/embassy-rs/embassy.git", features = ["log", "arch-cortex-m", "executor-thread", "nightly", "integrated-timers" ] } +futures = { version = "0.3", default-features = false, features = ["async-await"] } +embassy-executor = { git = "https://github.com/embassy-rs/embassy.git", features = ["log", "executor-thread", "nightly", "integrated-timers" ] } embassy-sync = { git = "https://github.com/embassy-rs/embassy.git", features = ["log", "nightly"] } embassy-time = { git = "https://github.com/embassy-rs/embassy.git", features = ["log"] } embassy-futures = { git = "https://github.com/embassy-rs/embassy.git", features = ["log"] } embassy-usb = { git = "https://github.com/embassy-rs/embassy.git", features = ["usbd-hid"] } embassy-usb-logger = { git = "https://github.com/embassy-rs/embassy.git", features = [] } embassy-usb-driver = { git = "https://github.com/embassy-rs/embassy.git", features = [] } -embassy-rp = { git = "https://github.com/embassy-rs/embassy.git", features = ["log", "nightly", "unstable-traits", "unstable-pac", "time-driver", "critical-section-impl"] } log = "0.4.17" pio = "0.2.1" pio-proc = "0.2.1" @@ -39,8 +38,17 @@ crc-any = "2.4.3" serde = { version = "1.0.163", default-features = false, features = ["derive"] } bytemuck = { version = "1.13.1", features = ["derive"] } -#[patch."https://git.nubo.sh/hulthe/tgnt.git"] -#tgnt = { path = "../tgnt" } +[target.'cfg(target_arch = "x86_64")'.dependencies] +embassy-executor = { git = "https://github.com/embassy-rs/embassy.git", features = ["arch-std"] } +embassy-time = { git = "https://github.com/embassy-rs/embassy.git", features = ["std", "generic-queue"] } +simple_logger = "4" + +[target.thumbv6m-none-eabi.dependencies] +embassy-rp = { git = "https://github.com/embassy-rs/embassy.git", features = ["log", "nightly", "unstable-traits", "unstable-pac", "time-driver", "critical-section-impl"] } +embassy-executor = { git = "https://github.com/embassy-rs/embassy.git", features = ["arch-cortex-m"] } + +[patch."https://git.nubo.sh/hulthe/tgnt.git"] +tgnt = { path = "../../tgnt" } [build-dependencies] tgnt = { git = "https://git.nubo.sh/hulthe/tgnt.git", default-features = false } diff --git a/lib/memory.x b/lib/memory.x new file mode 100644 index 0000000..4077aab --- /dev/null +++ b/lib/memory.x @@ -0,0 +1,15 @@ +MEMORY { + BOOT2 : ORIGIN = 0x10000000, LENGTH = 0x100 + FLASH : ORIGIN = 0x10000100, LENGTH = 2048K - 0x100 + RAM : ORIGIN = 0x20000000, LENGTH = 256K +} + +EXTERN(BOOT2_FIRMWARE) + +SECTIONS { + /* ### Boot loader */ + .boot2 ORIGIN(BOOT2) : + { + KEEP(*(.boot2)); + } > BOOT2 +} INSERT BEFORE .text; diff --git a/src/.gitignore b/lib/src/.gitignore similarity index 100% rename from src/.gitignore rename to lib/src/.gitignore diff --git a/src/allocator.rs b/lib/src/allocator.rs similarity index 100% rename from src/allocator.rs rename to lib/src/allocator.rs diff --git a/src/board.rs b/lib/src/board.rs similarity index 100% rename from src/board.rs rename to lib/src/board.rs diff --git a/src/defmt.rs b/lib/src/defmt.rs similarity index 100% rename from src/defmt.rs rename to lib/src/defmt.rs diff --git a/lib/src/event.rs b/lib/src/event.rs new file mode 100644 index 0000000..9483cc0 --- /dev/null +++ b/lib/src/event.rs @@ -0,0 +1,60 @@ +use core::time::Duration; + +use serde::{Deserialize, Serialize}; +use tgnt::{button::Button, keys::Key}; + +pub mod switch { + use super::*; + + #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] + /// A switch was pressed or released + /// + /// This event is triggered by tasks that monitor switches. + pub struct Event { + /// The keyboard half that triggered the event. + pub source: Half, + + /// The index of the button that triggered the event. + pub source_button: usize, + + pub kind: EventKind, + } + + #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] + pub enum EventKind { + Press { + button: Button, + }, + Release { + button: Button, + + /// The duration that the button was held down for + after: Duration, + }, + } +} + +pub mod button { + use tgnt::button::Modifier; + + use super::*; + + /// A usb keyboard button was pressed or released. + /// + /// This is a lower-level event than a [SwitchEvent], as things like ModTap and Compose are + /// converted to Presses and Releases. + #[derive(Clone, Debug, PartialEq, Eq)] + pub enum Event { + PressKey(Key), + ReleaseKey(Key), + PressMod(Modifier), + ReleaseMod(Modifier), + } +} + +/// A keyboard half. +#[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub enum Half { + Left, + Right, +} diff --git a/lib/src/interrupts.rs b/lib/src/interrupts.rs new file mode 100644 index 0000000..3f004cb --- /dev/null +++ b/lib/src/interrupts.rs @@ -0,0 +1,11 @@ +use embassy_rp::{ + bind_interrupts, + peripherals::{UART0, USB}, +}; + +bind_interrupts! { + pub struct Irqs { + UART0_IRQ => embassy_rp::uart::BufferedInterruptHandler; + USBCTRL_IRQ => embassy_rp::usb::InterruptHandler; + } +} diff --git a/src/keyboard.rs b/lib/src/keyboard.rs similarity index 67% rename from src/keyboard.rs rename to lib/src/keyboard.rs index 87ff0fb..36bc84e 100644 --- a/src/keyboard.rs +++ b/lib/src/keyboard.rs @@ -9,18 +9,20 @@ use embassy_rp::{ peripherals::PIO1, }; use embassy_sync::pubsub::{ImmediatePublisher, PubSubChannel, Subscriber}; -use embassy_time::{Duration, Timer}; -use futures::{select_biased, FutureExt}; +use embassy_time::{Duration, Instant}; use log::{debug, error, info, warn}; -use serde::{Deserialize, Serialize}; use static_cell::StaticCell; -use tgnt::{ - button::{Button, Modifier}, - keys::Key, - layer::Layer, -}; +use tgnt::{button::Button, layer::Layer}; -use crate::{lights::Lights, util::CS, ws2812::Ws2812}; +use crate::{ + event::{ + switch::{Event, EventKind}, + Half, + }, + lights::Lights, + util::CS, + ws2812::Ws2812, +}; pub struct KeyboardConfig { /// Which board is this. @@ -43,41 +45,14 @@ struct State { lights: Lights, } -/// A keyboard half. -#[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] -pub enum Half { - Left, - Right, -} - -#[derive(Clone, Debug, Serialize, Deserialize)] -pub struct Event { - /// The keyboard half that triggered the event. - pub source: Half, - - /// The index of the button that triggered the event. - pub source_button: usize, - - pub kind: EventKind, -} - -#[derive(Clone, Debug, Serialize, Deserialize)] -pub enum EventKind { - PressKey(Key), - ReleaseKey(Key), - PressModifier(Modifier), - ReleaseModifier(Modifier), - SetLayer(u16), -} - pub const KB_SUBSCRIBERS: usize = 2; const ACTUAL_KB_SUBSCRIBERS: usize = KB_SUBSCRIBERS + 2; const KB_EVENT_CAP: usize = 128; static KB_EVENTS: PubSubChannel = PubSubChannel::new(); pub struct KbEvents { - subscriber: Subscriber<'static, CS, Event, KB_EVENT_CAP, ACTUAL_KB_SUBSCRIBERS, 0>, - publisher: ImmediatePublisher<'static, CS, Event, KB_EVENT_CAP, ACTUAL_KB_SUBSCRIBERS, 0>, + pub subscriber: Subscriber<'static, CS, Event, KB_EVENT_CAP, ACTUAL_KB_SUBSCRIBERS, 0>, + pub publisher: ImmediatePublisher<'static, CS, Event, KB_EVENT_CAP, ACTUAL_KB_SUBSCRIBERS, 0>, } pub struct KbEventsTx<'a> { @@ -183,8 +158,8 @@ impl KbEventsTx<'_> { } } -const MOD_TAP_TIME: Duration = Duration::from_millis(150); -const SWITCH_COUNT: usize = 18; +pub const MOD_TAP_TIME: Duration = Duration::from_millis(150); +pub const SWITCH_COUNT: usize = 18; /// Task for monitoring a single switch pin, and handling button presses. #[embassy_executor::task(pool_size = 18)] @@ -195,6 +170,7 @@ async fn switch_task(switch_num: usize, pin: AnyPin, state: &'static State) -> ! loop { // pins are pull-up, so when the switch is pressed they are brought low. pin.wait_for_low().await; + let pressed_at = Instant::now(); // TODO: do we need debouncing? @@ -219,72 +195,54 @@ async fn switch_task(switch_num: usize, pin: AnyPin, state: &'static State) -> ! debug!("switch {switch_num} button {button:?} pressed"); - let wait_for_release = async { - pin.wait_for_high().await; - debug!("switch {switch_num} button {button:?} released"); - }; - let ev = |kind| Event { source: state.half, source_button: switch_num, kind, }; - use EventKind::*; - match button { - &Button::Key(key) => { - events.publish_immediate(ev(PressKey(key))); - wait_for_release.await; - events.publish_immediate(ev(ReleaseKey(key))); - continue; - } - &Button::Mod(modifier) => { - events.publish_immediate(ev(PressModifier(modifier))); - wait_for_release.await; - events.publish_immediate(ev(ReleaseModifier(modifier))); - continue; - } - &Button::ModTap(key, modifier) => { - select_biased! { - _ = Timer::after(MOD_TAP_TIME).fuse() => { - events.publish_immediate(ev(PressModifier(modifier))); - pin.wait_for_high().await; - events.publish_immediate(ev(ReleaseModifier(modifier))); - debug!("switch {switch_num} button {button:?} released"); - continue; - } - _ = wait_for_release.fuse() => { - events.publish_immediate(ev(PressKey(key))); - Timer::after(Duration::from_millis(20)).await; - events.publish_immediate(ev(ReleaseKey(key))); - continue; - } - } - } - Button::NextLayer => { - let next_layer = (current_layer + 1) % layer_count; - events.publish_immediate(ev(SetLayer(next_layer))); - debug!("switched to layer {next_layer}"); - } - Button::PrevLayer => { - let prev_layer = current_layer.checked_sub(1).unwrap_or(layer_count - 1); - events.publish_immediate(ev(SetLayer(prev_layer))); - debug!("switched to layer {prev_layer}"); - } - Button::None => {} - } + events.publish_immediate(ev(EventKind::Press { + button: button.clone(), + })); - wait_for_release.await; + pin.wait_for_high().await; + let released_after = pressed_at.elapsed(); + + debug!("switch {switch_num} button {button:?} released"); + + events.publish_immediate(ev(EventKind::Release { + button: button.clone(), + after: released_after.into(), + })); } } #[embassy_executor::task] async fn layer_switch_task(mut events: KbEvents, state: &'static State) { + let layer_count = state.layers.len() as u16; + let Some(last_layer) = layer_count.checked_sub(1) else { + error!("no layers specified"); + return; + }; + loop { let event = events.recv().await; - if let EventKind::SetLayer(new_layer) = event.kind { - state.current_layer.store(new_layer, Ordering::Relaxed); - } + let layer = state.current_layer.load(Ordering::Relaxed); + let new_layer = match event.kind { + EventKind::Press { button } => match button { + Button::NextLayer => layer.wrapping_add(1) % layer_count, + Button::PrevLayer => layer.checked_sub(1).unwrap_or(last_layer), + Button::HoldLayer(l) => layer.wrapping_add(l) % layer_count, + _ => continue, + }, + EventKind::Release { button, .. } => match button { + Button::HoldLayer(l) => layer.checked_sub(l).unwrap_or(last_layer), + _ => continue, + }, + }; + + state.current_layer.store(new_layer, Ordering::Relaxed); + debug!("switched to layer {new_layer}"); } } diff --git a/src/keyboard/lights.rs b/lib/src/keyboard/lights.rs similarity index 68% rename from src/keyboard/lights.rs rename to lib/src/keyboard/lights.rs index dd019c7..3a0f9e9 100644 --- a/src/keyboard/lights.rs +++ b/lib/src/keyboard/lights.rs @@ -1,9 +1,12 @@ use core::cmp::min; +use atomic_polyfill::Ordering; +use embassy_futures::yield_now; use embassy_time::{Duration, Instant, Timer}; use futures::{select_biased, FutureExt}; +use tgnt::button::Button; -use crate::{util::wheel, ws2812::Rgb}; +use crate::{rgb::Rgb, util::wheel}; use super::{Event, EventKind, KbEvents, State, SWITCH_COUNT}; @@ -140,57 +143,54 @@ async fn handle_event( state: &'static State, lights: &mut [LightState; SWITCH_COUNT], ) { - match event.kind { - EventKind::PressKey(_) => { - if state.half != event.source { - return; - } - let Some(light) = lights.get_mut(event.source_button) else { return; }; - *light = LightState::Solid(Rgb::new(0, 150, 0)); - } - EventKind::PressModifier(_) => { - if state.half != event.source { - return; - } - let Some(light) = lights.get_mut(event.source_button) else { return; }; - *light = LightState::Solid(Rgb::new(0, 0, 150)); - } - EventKind::ReleaseKey(_) | EventKind::ReleaseModifier(_) => { - if state.half != event.source { - return; - } - let Some(light) = lights.get_mut(event.source_button) else { return; }; - *light = LightState::FadeBy(0.85); - } - EventKind::SetLayer(layer) => { - let layer = min(layer, state.layers.len().saturating_sub(1) as u16); - let buttons_to_light_up = if state.layers.len() <= 3 { - match layer { - 0 => [0, 1, 2, 3, 4].as_ref(), - 1 => &[5, 6, 7, 8, 9], - 2 => &[10, 11, 12, 13, 14], - _ => &[], - } - } else { - match layer { - 0 => [0, 5, 10].as_ref(), - 1 => &[1, 6, 11], - 2 => &[2, 7, 12], - 3 => &[3, 8, 13], - 4 => &[4, 9, 14], - _ => &[], - } - }; + let rgb = match event.kind { + EventKind::Press { button } => match button { + Button::Key(..) => LightState::Solid(Rgb::new(0, 150, 0)), + Button::Mod(..) => LightState::Solid(Rgb::new(0, 0, 150)), + Button::ModTap(..) => LightState::Solid(Rgb::new(0, 0, 150)), + Button::Compose(..) => LightState::Solid(Rgb::new(0, 100, 100)), + Button::NextLayer | Button::PrevLayer => { + yield_now().await; // dirty hack to make sure layer_switch_task gets to run first + let layer = state.current_layer.load(Ordering::Relaxed); + let layer = min(layer, state.layers.len().saturating_sub(1) as u16); + let buttons_to_light_up = if state.layers.len() <= 3 { + match layer { + 0 => [0, 1, 2, 3, 4].as_ref(), + 1 => &[5, 6, 7, 8, 9], + 2 => &[10, 11, 12, 13, 14], + _ => &[], + } + } else { + match layer { + 0 => [0, 5, 10].as_ref(), + 1 => &[1, 6, 11], + 2 => &[2, 7, 12], + 3 => &[3, 8, 13], + 4 => &[4, 9, 14], + _ => &[], + } + }; - let solid_until = Instant::now() + Duration::from_millis(200); - for &button in buttons_to_light_up { - let Some(light) = lights.get_mut(button) else { continue; }; - *light = LightState::SolidThenFade { - color: Rgb::new(120, 0, 120), - solid_until, - fade_by: 0.85, + let solid_until = Instant::now() + Duration::from_millis(200); + for &button in buttons_to_light_up { + let Some(light) = lights.get_mut(button) else { continue; }; + *light = LightState::SolidThenFade { + color: Rgb::new(120, 0, 120), + solid_until, + fade_by: 0.85, + } } + LightState::Solid(Rgb::new(100, 0, 100)) } - } + _ => LightState::Solid(Rgb::new(150, 0, 0)), + }, + EventKind::Release { .. } => LightState::FadeBy(0.85), + }; + + if event.source != state.half { + return; } + + let Some(light) = lights.get_mut(event.source_button) else { return; }; + *light = rgb; } diff --git a/lib/src/keypress_handler.rs b/lib/src/keypress_handler.rs new file mode 100644 index 0000000..8dd4312 --- /dev/null +++ b/lib/src/keypress_handler.rs @@ -0,0 +1,397 @@ +use core::future::pending; + +use embassy_sync::pubsub::{publisher::Pub, subscriber::Sub, PubSubBehavior, WaitResult}; +use embassy_time::{Duration, Instant, Timer}; +use futures::FutureExt; +use heapless::Deque; +use log::{debug, error}; +use tgnt::button::Button; + +use crate::event::{button, switch, Half}; + +// TODO +const MOD_TAP_TIME: Duration = Duration::from_millis(150); +const SWITCH_COUNT: usize = 18; + +/// This function perpetually converts between [switch::Event]s and [button::Event]s. +/// +/// Call it from a dedicated task. +pub async fn keypress_handler( + input: &mut Sub<'_, impl PubSubBehavior, switch::Event>, + output: &mut Pub<'_, impl PubSubBehavior, button::Event>, +) -> ! { + type SwitchIndex = usize; + #[derive(Debug)] + struct PressEvent { + source_button: SwitchIndex, + source_half: Half, + button: Button, + time: Instant, + } + + async fn slow_press( + output: &mut Pub<'_, impl PubSubBehavior, button::Event>, + button: &Button, + ) { + let event = match button { + &Button::Mod(m) | &Button::ModTap(_, m) => button::Event::PressMod(m), + &Button::Key(k) => button::Event::PressKey(k), + _ => return, + }; + output.publish_immediate(event); + } + + async fn slow_release( + output: &mut Pub<'_, impl PubSubBehavior, button::Event>, + button: &Button, + ) { + let event = match button { + &Button::Mod(m) | &Button::ModTap(_, m) => button::Event::ReleaseMod(m), + &Button::Key(k) => button::Event::ReleaseKey(k), + _ => return, + }; + output.publish_immediate(event); + } + + // queue of button presses that are waiting for ModTap + let mut queue = Deque::::new(); + let queue = &mut queue; + + loop { + // create a future that waits for the next ModTap to time out + let modtap_timeout = async { + loop { + if let Some(event) = queue.front() { + let Button::ModTap(..) = event.button else { + error!("first element in queue wasn't a modtap, wtf?"); + let _ = queue.pop_front(); + continue; + }; + + let timeout = event.time + MOD_TAP_TIME; + Timer::at(timeout).await; + return queue.pop_front().unwrap(); + } else { + // if the queue is empty, never return. + return pending().await; + } + } + }; + + let event = futures::select_biased! { + event = input.next_message().fuse() => event, + event = modtap_timeout.fuse() => { + // first element in queue timed out, and will be treated as a Mod + let &Button::ModTap(..) = &event.button else { + error!("first element in queue wasn't a modtap, wtf?"); + continue; + }; + slow_press(output, &event.button).await; + + loop { + let Some(event) = queue.pop_front() else { break }; + + // resolve events until we encounter another ModTap, + // then put it back in the queue and stop + if let Button::ModTap(..) = &event.button { + queue.push_front(event).expect("we just popped, the queue can't be full"); + break; + } + slow_press(output, &event.button).await; + } + + continue; + }, + }; + + let WaitResult::Message(event) = event else { + error!("lagged"); + continue; + }; + + let time = Instant::now(); + debug!("event: {:?}", event.kind); + match event.kind { + switch::EventKind::Press { button } => { + let insert = |queue: &mut Deque<_, 36>, button| { + if let Some(_queued) = queue + .iter() + .find(|queued: &&PressEvent| queued.source_button == event.source_button) + .filter(|queued| queued.source_half == event.source) + { + error!("tried to add PressEvent to queue twice"); + } else if queue + .push_back(PressEvent { + source_half: event.source, + source_button: event.source_button, + button, + time, + }) + .is_err() + { + error!("button queue full. this shouldn't happen."); + } + }; + + match button { + Button::ModTap(_, _) => { + debug!("adding modtap to queue"); + // add event to queue + insert(queue, button); + } + Button::Mod(m) => { + // if events in queue, also add to queue maybe? + // TODO + } + Button::Key(_) => { + if queue.is_empty() { + debug!("sending key now"); + // otherwise, send immediately + slow_press(output, &button).await; + } else { + debug!("adding key to queue"); + // if events in queue, also add to queue + insert(queue, button); + } + } + Button::Compose(..) => { + if queue.is_empty() { + // otherwise, send immediately + // TODO + } else { + // if events in queue, also add to queue + insert(queue, button); + } + } + _ => {} + } + } + switch::EventKind::Release { button, .. } => { + let position_in_queue = queue + .iter() + .enumerate() + .find(|(_, queued)| queued.source_button == event.source_button) + .map(|(i, _)| i); + + match button { + Button::ModTap(k, _) => { + // check if modtap in queue + if let Some(position_in_queue) = position_in_queue { + // If the modtap was still in the queue, it hasn't been resolved as a mod + // yet. Therefore, it is a Tap. Resolve all ModTaps before this one as Mods + debug!("modtap was still in queue"); + for _ in 0..position_in_queue { + let prev_event = queue.pop_front().unwrap(); + debug!("pressing earlier event {:?}", prev_event); + slow_press(output, &prev_event.button).await; + } + let _ = queue.pop_front(); + debug!("pressing modtap as key"); + slow_press(output, &Button::Key(k)).await; + slow_release(output, &Button::Key(k)).await; + } else { + // If the ModTap wasn't in the queue, it has already been resolved as a Mod. + debug!("modtap wasn't in queue, releasing"); + slow_release(output, &button).await; + }; + } + Button::Mod(m) => { + debug!("mod not implemented yet"); + // TODO + } + Button::Key(_) => { + // if this press event was in queue, resolve all ModTaps before in queue as Mods + // otherwise, just resolve this + if let Some(position_in_queue) = position_in_queue { + debug!( + "key was in queue, pressing all events up to and including this" + ); + for _ in 0..=position_in_queue { + let prev_event = queue.pop_front().unwrap(); + debug!("pressing {prev_event:?}"); + slow_press(output, &prev_event.button).await; + } + } + debug!("releasing key {button:?}"); + slow_release(output, &button).await; + } + Button::Compose(..) => { + // if this press event was in queue, resolve all ModTaps before in queue as Mods + // otherwise, just resolve this + // TODO + } + _ => {} + } + } + } + } +} + +#[cfg(test)] +mod tests { + use core::time; + + use super::*; + + use alloc::vec; + use alloc::vec::Vec; + use embassy_futures::{ + join::join, + select::{select, Either}, + }; + use embassy_sync::{blocking_mutex::raw::NoopRawMutex, pubsub::PubSubChannel}; + use embassy_time::with_timeout; + use log::info; + use tgnt::{button::Modifier, keys::Key}; + + #[test] + fn test_modtap_timings() { + simple_logger::SimpleLogger::new().init().unwrap(); + + let switch_events = PubSubChannel::::new(); + let button_events = PubSubChannel::::new(); + let mut button_sub = button_events.subscriber().unwrap(); + + let buttons = [ + Button::ModTap(Key::A, Modifier::LShift), + Button::ModTap(Key::B, Modifier::LCtrl), + Button::Key(Key::C), + ]; + + struct Test { + description: &'static str, + // button index, pressed, delay + input: Vec<(usize, bool, Duration)>, + expected: Vec, + } + + let modtap_mod = Test { + description: "modtap mod", + input: vec![ + (0, true, Duration::from_millis(25)), + (1, true, Duration::from_millis(25)), + (1, false, Duration::from_millis(25)), + (0, false, Duration::from_millis(25)), + ], + expected: vec![ + button::Event::PressMod(Modifier::LShift), + button::Event::PressKey(Key::B), + button::Event::ReleaseKey(Key::B), + button::Event::ReleaseMod(Modifier::LShift), + ], + }; + + let modtap_tap = Test { + description: "modtap tap", + input: vec![ + (0, true, Duration::from_millis(25)), + (1, true, Duration::from_millis(25)), + (0, false, Duration::from_millis(25)), + (1, false, Duration::from_millis(25)), + ], + expected: vec![ + button::Event::PressKey(Key::A), + button::Event::ReleaseKey(Key::A), + button::Event::PressKey(Key::B), + button::Event::ReleaseKey(Key::B), + ], + }; + + let modtap_tap_2x = Test { + description: "2x modtap tap", + input: vec![ + (0, true, Duration::from_millis(25)), + (2, true, Duration::from_millis(25)), + (2, false, Duration::from_millis(25)), + (0, false, Duration::from_millis(25)), + (0, true, Duration::from_millis(25)), + (2, true, Duration::from_millis(25)), + (2, false, Duration::from_millis(25)), + (0, false, Duration::from_millis(25)), + ], + expected: vec![ + button::Event::PressMod(Modifier::LShift), + button::Event::PressKey(Key::C), + button::Event::ReleaseKey(Key::C), + button::Event::ReleaseMod(Modifier::LShift), + button::Event::PressMod(Modifier::LShift), + button::Event::PressKey(Key::C), + button::Event::ReleaseKey(Key::C), + button::Event::ReleaseMod(Modifier::LShift), + ], + }; + + for test in [modtap_tap, modtap_mod, modtap_tap_2x] { + info!("running timing test test {:?}", test.description); + embassy_futures::block_on(async { + let r = select( + join( + async { + for &(i, pressed, delay) in &test.input { + let kind = if pressed { + switch::EventKind::Press { + button: buttons[i].clone(), + } + } else { + switch::EventKind::Release { + button: buttons[i].clone(), + after: time::Duration::ZERO, // ignore + } + }; + + let event = switch::Event { + source: Half::Left, + source_button: i, + kind, + }; + + switch_events.publish_immediate(event); + + Timer::after(delay).await; + } + }, + async { + let mut got = Vec::new(); + for _expected in &test.expected { + let event = match with_timeout( + Duration::from_millis(200), + button_sub.next_message(), + ) + .await + { + Ok(WaitResult::Message(event)) => event, + Ok(WaitResult::Lagged(_)) => return Err(("lagged", got)), + Err(_) => return Err(("timeout", got)), + }; + + got.push(event.clone()); + } + + for (event, expected) in got.iter().zip(test.expected.iter()) { + if event != expected { + return Err(("unexpected event", got)); + } + } + + Ok(()) + }, + ), + convert_events( + &mut *switch_events.subscriber().unwrap(), + &mut *button_events.publisher().unwrap(), + ), + ) + .await; + + match r { + Either::First(((), Ok(()))) => {} + Either::First(((), Err((msg, got)))) => panic!( + "timing test {:?} failed due to {msg}.\nexpected={:#?} got={:#?}", + test.description, test.expected, got + ), + Either::Second(never) => never, + } + }); + } + } +} diff --git a/src/led.rs b/lib/src/led.rs similarity index 100% rename from src/led.rs rename to lib/src/led.rs diff --git a/lib/src/lib.rs b/lib/src/lib.rs new file mode 100644 index 0000000..0dcb571 --- /dev/null +++ b/lib/src/lib.rs @@ -0,0 +1,32 @@ +#![no_std] +#![feature(type_alias_impl_trait)] +#![feature(split_array)] + +extern crate alloc; + +#[cfg(target_arch = "arm")] +pub mod allocator; +#[cfg(target_arch = "arm")] +pub mod board; +#[cfg(target_arch = "arm")] +pub mod interrupts; +#[cfg(target_arch = "arm")] +pub mod keyboard; +#[cfg(target_arch = "arm")] +pub mod lights; +#[cfg(target_arch = "arm")] +pub mod panic_handler; +#[cfg(target_arch = "arm")] +pub mod uart; +#[cfg(target_arch = "arm")] +pub mod usb; +#[cfg(target_arch = "arm")] +pub mod ws2812; + +pub mod event; +pub mod logger; +pub mod neopixel; +pub mod rgb; +pub mod rtt; +pub mod util; +pub mod keypress_handler; diff --git a/src/lights.rs b/lib/src/lights.rs similarity index 96% rename from src/lights.rs rename to lib/src/lights.rs index dd5d9b3..d20544a 100644 --- a/src/lights.rs +++ b/lib/src/lights.rs @@ -2,7 +2,7 @@ use crate::ws2812::Ws2812; use embassy_rp::pio; use embassy_sync::mutex::Mutex; -use crate::{util::CS, ws2812::Rgb}; +use crate::{rgb::Rgb, util::CS}; pub struct Lights { state: Mutex>, diff --git a/src/logger.rs b/lib/src/logger.rs similarity index 91% rename from src/logger.rs rename to lib/src/logger.rs index 260d6a5..c626239 100644 --- a/src/logger.rs +++ b/lib/src/logger.rs @@ -24,8 +24,10 @@ impl Logger { static LOGGER: StaticCell = StaticCell::new(); let logger = LOGGER.init(self); - unsafe { log::set_logger_racy(logger).unwrap() }; - log::set_max_level(log::LevelFilter::Debug); + unsafe { + log::set_logger_racy(logger).unwrap(); + log::set_max_level_racy(log::LevelFilter::Debug); + } } } diff --git a/src/neopixel.pio b/lib/src/neopixel.pio similarity index 100% rename from src/neopixel.pio rename to lib/src/neopixel.pio diff --git a/src/neopixel.rs b/lib/src/neopixel.rs similarity index 100% rename from src/neopixel.rs rename to lib/src/neopixel.rs diff --git a/src/neopixel2.pio b/lib/src/neopixel2.pio similarity index 100% rename from src/neopixel2.pio rename to lib/src/neopixel2.pio diff --git a/src/panic_handler.rs b/lib/src/panic_handler.rs similarity index 100% rename from src/panic_handler.rs rename to lib/src/panic_handler.rs diff --git a/lib/src/rgb.rs b/lib/src/rgb.rs new file mode 100644 index 0000000..a545e16 --- /dev/null +++ b/lib/src/rgb.rs @@ -0,0 +1,58 @@ +use bytemuck::{cast_slice, Pod, Zeroable}; +use core::{ + fmt::{self, Debug}, + ops::Div, +}; + +/// An Rgb value that can be safely transmuted to u32 for use with Ws2812. +#[repr(transparent)] +#[derive(Clone, Copy, PartialEq, Eq, Pod, Zeroable)] +pub struct Rgb(u32); + +impl Rgb { + #[inline(always)] + pub const fn new(r: u8, g: u8, b: u8) -> Self { + Self(u32::from_be_bytes([g, r, b, 0])) + } + + /// Get the red, green, and blue components of this Rgb. + #[inline(always)] + pub const fn components(&self) -> [u8; 3] { + let [g, r, b, _] = self.0.to_be_bytes(); + [r, g, b] + } + + #[inline(always)] + pub fn slice_as_u32s(rgbs: &[Rgb]) -> &[u32] { + cast_slice(rgbs) + } +} + +impl Debug for Rgb { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let [r, g, b] = self.components(); + f.debug_tuple("Rgb").field(&r).field(&g).field(&b).finish() + } +} + +impl Div for Rgb { + type Output = Rgb; + + fn div(self, d: u8) -> Self::Output { + let [r, g, b] = self.components(); + Rgb::new(r / d, g / d, b / d) + } +} + +#[cfg(all(target_arch = "x86_64", test))] +mod tests { + use super::*; + use bytemuck::cast; + + #[test] + fn test_rgb_as_u32() { + let rgb = Rgb::new(0x11, 0x22, 0xCC); + let rgb_u32: u32 = cast(rgb); + assert_eq!(rgb_u32, 0x2211CC00); + } +} diff --git a/src/rtt.rs b/lib/src/rtt.rs similarity index 100% rename from src/rtt.rs rename to lib/src/rtt.rs diff --git a/src/uart.rs b/lib/src/uart.rs similarity index 97% rename from src/uart.rs rename to lib/src/uart.rs index f4895a8..14aa159 100644 --- a/src/uart.rs +++ b/lib/src/uart.rs @@ -11,12 +11,13 @@ use heapless::Vec; use serde::{Deserialize, Serialize}; use static_cell::StaticCell; -use crate::keyboard::{self, Half, KbEvents}; -use crate::Irqs; +use crate::event::{switch, Half}; +use crate::interrupts::Irqs; +use crate::keyboard::KbEvents; #[derive(Clone, Debug, Serialize, Deserialize)] enum Message { - KeyboardEvent(keyboard::Event), + KeyboardEvent(switch::Event), } pub async fn start(tx: PIN_0, rx: PIN_1, uart: UART0, board: Half, events: KbEvents) { diff --git a/src/usb.rs b/lib/src/usb.rs similarity index 97% rename from src/usb.rs rename to lib/src/usb.rs index 3297d2c..3e6b51c 100644 --- a/src/usb.rs +++ b/lib/src/usb.rs @@ -3,7 +3,7 @@ use embassy_rp::{peripherals::USB, usb::Driver}; use embassy_usb::{Builder, Config, UsbDevice}; use static_cell::StaticCell; -use crate::{keyboard::KbEvents, Irqs}; +use crate::{interrupts::Irqs, keyboard::KbEvents}; pub mod keyboard; pub mod logger; diff --git a/src/usb/keyboard.rs b/lib/src/usb/keyboard.rs similarity index 55% rename from src/usb/keyboard.rs rename to lib/src/usb/keyboard.rs index 2830984..f17d28d 100644 --- a/src/usb/keyboard.rs +++ b/lib/src/usb/keyboard.rs @@ -1,8 +1,13 @@ pub mod report; use embassy_executor::Spawner; +use embassy_futures::select::select; use embassy_rp::{peripherals::USB, usb::Driver}; -use embassy_sync::mutex::Mutex; +use embassy_sync::{ + blocking_mutex::raw::NoopRawMutex, + mutex::Mutex, + pubsub::{PubSubChannel, WaitResult}, +}; use embassy_time::{Duration, Timer}; use embassy_usb::{ class::hid::{self, HidReaderWriter, ReadError, ReportId, RequestHandler}, @@ -10,13 +15,15 @@ use embassy_usb::{ Builder, }; use embassy_usb_driver::EndpointError; +use log::error; use static_cell::StaticCell; -use usbd_hid::descriptor::{MouseReport, SerializedDescriptor}; +use usbd_hid::descriptor::SerializedDescriptor; use crate::{ - keyboard::{Event, EventKind, KbEvents}, + event::button, + keyboard::KbEvents, usb::keyboard::report::{KeyboardReport, EMPTY_KEYBOARD_REPORT}, - util::CS, + util::CS, keypress_handler::keypress_handler, }; use super::MAX_PACKET_SIZE; @@ -25,7 +32,18 @@ struct Handler; static CONTEXT: StaticCell = StaticCell::new(); -pub static KB_REPORT: Mutex = Mutex::new(EMPTY_KEYBOARD_REPORT); +static KB_REPORT: Mutex = Mutex::new(Reports { + actual: EMPTY_KEYBOARD_REPORT, + unsent: EMPTY_KEYBOARD_REPORT, +}); + +struct Reports { + /// The report to be sent to the host machine. + actual: KeyboardReport, + + /// Key presses which hasn't been sent yet. + unsent: KeyboardReport, +} struct Context { handler: Handler, @@ -86,20 +104,53 @@ type HidStream = HidReaderWriter<'static, Driver<'static, USB>, 256, 256>; #[embassy_executor::task] async fn listen_to_events(mut events: KbEvents) { - loop { - let event = events.recv().await; - report_event(event).await; - } -} + let button_events = PubSubChannel::::new(); + let mut button_pub = button_events.publisher().unwrap(); + let mut button_sub = button_events.subscriber().unwrap(); -pub async fn report_event(event: Event) { - match event.kind { - EventKind::PressKey(key) => KB_REPORT.lock().await.press_key(key), - EventKind::ReleaseKey(key) => KB_REPORT.lock().await.release_key(key), - EventKind::PressModifier(modifier) => KB_REPORT.lock().await.press_modifier(modifier), - EventKind::ReleaseModifier(modifier) => KB_REPORT.lock().await.release_modifier(modifier), - EventKind::SetLayer(_) => {} - } + select( + async { + loop { + let WaitResult::Message(event) = button_sub.next_message().await else { + error!("lagged"); + continue; + }; + + loop { + let mut r = KB_REPORT.lock().await; + match event { + button::Event::PressKey(k) => { + r.actual.press_key(k); + r.unsent.press_key(k); + } + button::Event::PressMod(m) => { + r.actual.press_modifier(m); + r.unsent.press_modifier(m); + } + + // we got a key release, but if the key press hasn't been sent yet, we + // wait for a bit until it has. + button::Event::ReleaseKey(k) if r.unsent.key_pressed(k) => { + drop(r); + Timer::after(Duration::from_millis(1)).await; + continue; + } + button::Event::ReleaseMod(m) if r.unsent.modifier_pressed(m) => { + drop(r); + Timer::after(Duration::from_millis(1)).await; + continue; + } + + button::Event::ReleaseKey(k) => r.actual.release_key(k), + button::Event::ReleaseMod(m) => r.actual.release_modifier(m), + } + break; + } + } + }, + keypress_handler(&mut *events.subscriber, &mut *button_pub), + ) + .await; } #[embassy_executor::task] @@ -107,9 +158,6 @@ async fn task(stream: HidStream, handler: &'static Handler) { if let Err(e) = keyboard_report(stream, handler).await { log::error!("keyboard error: {e:?}"); } - //if let Err(e) = mouse_wiggler(stream).await { - // log::error!("mouse wiggler: {e:?}"); - //} } async fn keyboard_report(mut stream: HidStream, _handler: &'static Handler) -> Result<(), Error> { @@ -117,7 +165,12 @@ async fn keyboard_report(mut stream: HidStream, _handler: &'static Handler) -> R loop { Timer::after(Duration::from_millis(2)).await; - let report = KB_REPORT.lock().await.clone(); + let report = { + let mut reports = KB_REPORT.lock().await; + reports.unsent = EMPTY_KEYBOARD_REPORT; + reports.actual.clone() + }; + if report.keycodes != EMPTY_KEYBOARD_REPORT.keycodes { log::trace!("keys: {:x?}", report.keycodes); } @@ -130,48 +183,6 @@ async fn keyboard_report(mut stream: HidStream, _handler: &'static Handler) -> R } } -#[allow(dead_code)] -async fn mouse_wiggler(mut stream: HidStream) -> Result<(), Error> { - stream.ready().await; - - let (_r, mut w) = stream.split(); - - let write_fut = async move { - let mut x = 1; - loop { - for _ in 0..100 { - Timer::after(Duration::from_millis(10)).await; - log::info!("sending mouse report"); - //w.ready().await; - w.write_serialize(&MouseReport { - x, - y: 0, - buttons: 0, - wheel: 0, - pan: 0, - }) - .await?; - } - x = -x; - } - }; - - //let read_fut = async move { - // let mut buf = [0u8; MAX_PACKET_SIZE as usize]; - // loop { - // Timer::after(Duration::from_millis(30)).await; - // let n = r.read(&mut buf).await?; - // log::info!("got packet: {:?}", &buf[..n]); - // } - //}; - - //let r: Result<((), ()), Error> = try_join(write_fut, read_fut).await; - let r: Result<(), Error> = write_fut.await; - r?; - - Ok(()) -} - #[derive(Debug)] enum Error { Read(ReadError), diff --git a/src/usb/keyboard/report.rs b/lib/src/usb/keyboard/report.rs similarity index 78% rename from src/usb/keyboard/report.rs rename to lib/src/usb/keyboard/report.rs index ce25a75..f09a3a8 100644 --- a/src/usb/keyboard/report.rs +++ b/lib/src/usb/keyboard/report.rs @@ -5,7 +5,7 @@ /// keyboard LEDs. /// /// Unlike usbd_hids KeyboardReport, this one supports N-key rollover. -#[derive(Clone, PartialEq, Eq)] +#[derive(Clone, Copy, PartialEq, Eq, Zeroable, Pod)] #[cfg(feature = "n-key-rollover")] #[repr(C, packed)] pub struct KeyboardReport { @@ -15,7 +15,8 @@ pub struct KeyboardReport { pub keycodes: [u8; 27], } -use core::mem::{size_of, transmute}; +use bytemuck::{cast_ref, Pod, Zeroable}; +use core::mem::size_of; use tgnt::{button::Modifier, keys::Key}; #[cfg(not(feature = "n-key-rollover"))] @@ -35,14 +36,21 @@ pub const EMPTY_KEYBOARD_REPORT: KeyboardReport = KeyboardReport { keycodes: [0; 6], }; +/// Get the byte index, and the mask for that byte, in the keycode bitmap. +fn key_to_byte_mask(key: Key) -> (usize, u8) { + let keycode = u8::from(key); + let byte = keycode >> 3; + let bit = keycode & 0b111; + let mask = 1 << bit; + + (usize::from(byte), mask) +} + #[cfg(feature = "n-key-rollover")] impl KeyboardReport { #[inline(always)] pub fn set_key(&mut self, key: Key, pressed: bool) { - let keycode = u8::from(key); - let byte = keycode >> 3; - let bit = keycode & 0b111; - let mask = 1 << bit; + let (byte, mask) = key_to_byte_mask(key); if let Some(k) = self.keycodes.get_mut(byte as usize) { if pressed { @@ -51,7 +59,7 @@ impl KeyboardReport { *k &= !mask; } } else { - log::warn!("Tried to set out-of-range keycode: 0x{keycode:x}"); + log::warn!("Tried to set out-of-range keycode: 0x{:x}", u8::from(key)); } } @@ -65,6 +73,17 @@ impl KeyboardReport { self.set_key(key, false) } + #[inline(always)] + pub fn key_pressed(&mut self, key: Key) -> bool { + let (byte, mask) = key_to_byte_mask(key); + if let Some(k) = self.keycodes.get_mut(byte as usize) { + (*k & mask) != 0 + } else { + log::warn!("Tried to get out-of-range keycode: 0x{:x}", u8::from(key)); + false + } + } + #[inline(always)] pub fn set_modifier(&mut self, modifier: Modifier, pressed: bool) { if pressed { @@ -84,10 +103,14 @@ impl KeyboardReport { self.set_modifier(modifier, false) } + #[inline(always)] + pub fn modifier_pressed(&mut self, modifier: Modifier) -> bool { + (self.modifier & u8::from(modifier)) != 0 + } + #[inline(always)] pub fn as_bytes(&self) -> &[u8; size_of::()] { - // SAFETY: KeyboardReport is repr(C, packed) and contains only u8s. - unsafe { transmute(self) } + cast_ref(self) } } diff --git a/src/usb/logger.rs b/lib/src/usb/logger.rs similarity index 67% rename from src/usb/logger.rs rename to lib/src/usb/logger.rs index 0da393f..e5e4df3 100644 --- a/src/usb/logger.rs +++ b/lib/src/usb/logger.rs @@ -2,39 +2,17 @@ use crate::util::CS; use super::MAX_PACKET_SIZE; use core::fmt::Write as WriteFmt; -use embassy_executor::Spawner; use embassy_rp::{peripherals::USB, usb::Driver}; use embassy_sync::pipe::Pipe; use embassy_time::Instant; -use embassy_usb::{ - class::cdc_acm::{self, CdcAcmClass}, - Builder, -}; +use embassy_usb::class::cdc_acm::CdcAcmClass; use log::{Metadata, Record}; -use static_cell::StaticCell; pub const BUFFER_SIZE: usize = 16 * 1024; static BUFFER: Pipe = Pipe::new(); struct UsbLogger; -pub async fn setup(usb_builder: &mut Builder<'static, Driver<'static, USB>>) { - unsafe { - static LOGGER: UsbLogger = UsbLogger; - log::set_logger_racy(&LOGGER).unwrap(); - } - log::set_max_level(log::LevelFilter::Debug); - - let spawner = Spawner::for_current_executor().await; - - static STATE: StaticCell> = StaticCell::new(); - let state = STATE.init(cdc_acm::State::new()); - - let class = CdcAcmClass::new(usb_builder, state, MAX_PACKET_SIZE as u16); - - spawner.must_spawn(log_task(class)); -} - #[embassy_executor::task] async fn log_task(mut class: CdcAcmClass<'static, Driver<'static, USB>>) { let mut buf = [0u8; MAX_PACKET_SIZE as usize]; diff --git a/src/util.rs b/lib/src/util.rs similarity index 96% rename from src/util.rs rename to lib/src/util.rs index efe5987..641c805 100644 --- a/src/util.rs +++ b/lib/src/util.rs @@ -1,7 +1,7 @@ use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex; use embassy_time::{Duration, Timer}; -use crate::ws2812::Rgb; +use crate::rgb::Rgb; pub type CS = CriticalSectionRawMutex; diff --git a/src/ws2812.rs b/lib/src/ws2812.rs similarity index 73% rename from src/ws2812.rs rename to lib/src/ws2812.rs index d1b819f..02672ae 100644 --- a/src/ws2812.rs +++ b/lib/src/ws2812.rs @@ -1,23 +1,16 @@ -use core::fmt::{self, Debug}; -use core::mem::transmute; -use core::ops::Div; - use embassy_rp::dma::{self, AnyChannel}; use embassy_rp::pio::{self, FifoJoin, Instance, Pio, PioPin, ShiftConfig, ShiftDirection}; use embassy_rp::relocate::RelocatedProgram; use embassy_rp::{Peripheral, PeripheralRef}; use fixed::FixedU32; +use crate::rgb::Rgb; + pub struct Ws2812 { sm: pio::StateMachine<'static, P, 0>, dma: PeripheralRef<'static, AnyChannel>, } -/// An Rgb value that can be safely transmuted to u32 for use with Ws2812. -#[repr(transparent)] -#[derive(Clone, Copy, PartialEq, Eq)] -pub struct Rgb(u32); - impl Ws2812

{ pub fn new( pio: impl Peripheral

+ 'static, @@ -96,39 +89,3 @@ impl Ws2812

{ self.sm.tx().dma_push(self.dma.reborrow(), colors).await; } } - -impl Rgb { - #[inline(always)] - pub const fn new(r: u8, g: u8, b: u8) -> Self { - Self(u32::from_be_bytes([g, r, b, 0])) - } - - /// Get the red, green, and blue components of this Rgb. - #[inline(always)] - pub const fn components(&self) -> [u8; 3] { - let [g, r, b, _] = self.0.to_be_bytes(); - [r, g, b] - } - - #[inline(always)] - pub fn slice_as_u32s(rgbs: &[Rgb]) -> &[u32] { - // SAFETY: Rgb contains only a u32, and is #[repr(transparent)] - unsafe { transmute(rgbs) } - } -} - -impl Debug for Rgb { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let [r, g, b] = self.components(); - f.debug_tuple("Rgb").field(&r).field(&g).field(&b).finish() - } -} - -impl Div for Rgb { - type Output = Rgb; - - fn div(self, d: u8) -> Self::Output { - let [r, g, b] = self.components(); - Rgb::new(r / d, g / d, b / d) - } -} diff --git a/Cargo.lock b/right/Cargo.lock similarity index 88% rename from Cargo.lock rename to right/Cargo.lock index bd4279d..e4f886f 100644 --- a/Cargo.lock +++ b/right/Cargo.lock @@ -44,6 +44,17 @@ dependencies = [ "critical-section", ] +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi 0.1.19", + "libc", + "winapi", +] + [[package]] name = "autocfg" version = "1.1.0" @@ -115,7 +126,7 @@ checksum = "fdde5c9cd29ebd706ce1b35600920a33550e402fc998a2e53ad3b42c3c47a192" dependencies = [ "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.18", ] [[package]] @@ -152,6 +163,17 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "colored" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3616f750b84d8f0de8a58bda93e08e2a81ad3f523089b05f1dffecab48c6cbd" +dependencies = [ + "atty", + "lazy_static", + "winapi", +] + [[package]] name = "cortex-m" version = "0.7.7" @@ -282,7 +304,7 @@ checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" [[package]] name = "embassy-cortex-m" version = "0.1.0" -source = "git+https://github.com/embassy-rs/embassy.git#d55b9bc6e2de528e1351b992bb30f54ec6f76b6d" +source = "git+https://github.com/embassy-rs/embassy.git#d414f4e4f7f243b4e52e6550ca616c180d731774" dependencies = [ "atomic-polyfill 1.0.2", "cfg-if", @@ -297,8 +319,9 @@ dependencies = [ [[package]] name = "embassy-embedded-hal" version = "0.1.0" -source = "git+https://github.com/embassy-rs/embassy.git#d55b9bc6e2de528e1351b992bb30f54ec6f76b6d" +source = "git+https://github.com/embassy-rs/embassy.git#d414f4e4f7f243b4e52e6550ca616c180d731774" dependencies = [ + "embassy-futures", "embassy-sync", "embedded-hal 0.2.7", "embedded-hal 1.0.0-alpha.10", @@ -311,7 +334,7 @@ dependencies = [ [[package]] name = "embassy-executor" version = "0.2.0" -source = "git+https://github.com/embassy-rs/embassy.git#d55b9bc6e2de528e1351b992bb30f54ec6f76b6d" +source = "git+https://github.com/embassy-rs/embassy.git#d414f4e4f7f243b4e52e6550ca616c180d731774" dependencies = [ "atomic-polyfill 1.0.2", "cortex-m", @@ -326,7 +349,7 @@ dependencies = [ [[package]] name = "embassy-futures" version = "0.1.0" -source = "git+https://github.com/embassy-rs/embassy.git#d55b9bc6e2de528e1351b992bb30f54ec6f76b6d" +source = "git+https://github.com/embassy-rs/embassy.git#d414f4e4f7f243b4e52e6550ca616c180d731774" dependencies = [ "log", ] @@ -334,7 +357,7 @@ dependencies = [ [[package]] name = "embassy-hal-common" version = "0.1.0" -source = "git+https://github.com/embassy-rs/embassy.git#d55b9bc6e2de528e1351b992bb30f54ec6f76b6d" +source = "git+https://github.com/embassy-rs/embassy.git#d414f4e4f7f243b4e52e6550ca616c180d731774" dependencies = [ "num-traits", ] @@ -342,7 +365,7 @@ dependencies = [ [[package]] name = "embassy-macros" version = "0.2.0" -source = "git+https://github.com/embassy-rs/embassy.git#d55b9bc6e2de528e1351b992bb30f54ec6f76b6d" +source = "git+https://github.com/embassy-rs/embassy.git#d414f4e4f7f243b4e52e6550ca616c180d731774" dependencies = [ "darling", "proc-macro2", @@ -353,12 +376,12 @@ dependencies = [ [[package]] name = "embassy-net-driver" version = "0.1.0" -source = "git+https://github.com/embassy-rs/embassy.git#d55b9bc6e2de528e1351b992bb30f54ec6f76b6d" +source = "git+https://github.com/embassy-rs/embassy.git#d414f4e4f7f243b4e52e6550ca616c180d731774" [[package]] name = "embassy-net-driver-channel" version = "0.1.0" -source = "git+https://github.com/embassy-rs/embassy.git#d55b9bc6e2de528e1351b992bb30f54ec6f76b6d" +source = "git+https://github.com/embassy-rs/embassy.git#d414f4e4f7f243b4e52e6550ca616c180d731774" dependencies = [ "embassy-futures", "embassy-net-driver", @@ -368,7 +391,7 @@ dependencies = [ [[package]] name = "embassy-rp" version = "0.1.0" -source = "git+https://github.com/embassy-rs/embassy.git#d55b9bc6e2de528e1351b992bb30f54ec6f76b6d" +source = "git+https://github.com/embassy-rs/embassy.git#d414f4e4f7f243b4e52e6550ca616c180d731774" dependencies = [ "atomic-polyfill 1.0.2", "cfg-if", @@ -404,7 +427,7 @@ dependencies = [ [[package]] name = "embassy-sync" version = "0.2.0" -source = "git+https://github.com/embassy-rs/embassy.git#d55b9bc6e2de528e1351b992bb30f54ec6f76b6d" +source = "git+https://github.com/embassy-rs/embassy.git#d414f4e4f7f243b4e52e6550ca616c180d731774" dependencies = [ "cfg-if", "critical-section", @@ -417,7 +440,7 @@ dependencies = [ [[package]] name = "embassy-time" version = "0.1.1" -source = "git+https://github.com/embassy-rs/embassy.git#d55b9bc6e2de528e1351b992bb30f54ec6f76b6d" +source = "git+https://github.com/embassy-rs/embassy.git#d414f4e4f7f243b4e52e6550ca616c180d731774" dependencies = [ "atomic-polyfill 1.0.2", "cfg-if", @@ -431,7 +454,7 @@ dependencies = [ [[package]] name = "embassy-usb" version = "0.1.0" -source = "git+https://github.com/embassy-rs/embassy.git#d55b9bc6e2de528e1351b992bb30f54ec6f76b6d" +source = "git+https://github.com/embassy-rs/embassy.git#d414f4e4f7f243b4e52e6550ca616c180d731774" dependencies = [ "embassy-futures", "embassy-net-driver-channel", @@ -445,12 +468,12 @@ dependencies = [ [[package]] name = "embassy-usb-driver" version = "0.1.0" -source = "git+https://github.com/embassy-rs/embassy.git#d55b9bc6e2de528e1351b992bb30f54ec6f76b6d" +source = "git+https://github.com/embassy-rs/embassy.git#d414f4e4f7f243b4e52e6550ca616c180d731774" [[package]] name = "embassy-usb-logger" version = "0.1.0" -source = "git+https://github.com/embassy-rs/embassy.git#d55b9bc6e2de528e1351b992bb30f54ec6f76b6d" +source = "git+https://github.com/embassy-rs/embassy.git#d414f4e4f7f243b4e52e6550ca616c180d731774" dependencies = [ "embassy-futures", "embassy-sync", @@ -631,7 +654,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.18", ] [[package]] @@ -709,6 +732,15 @@ dependencies = [ "stable_deref_trait", ] +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + [[package]] name = "hermit-abi" version = "0.3.1" @@ -733,11 +765,11 @@ dependencies = [ [[package]] name = "io-lifetimes" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ - "hermit-abi", + "hermit-abi 0.3.1", "libc", "windows-sys 0.48.0", ] @@ -748,7 +780,7 @@ version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" dependencies = [ - "hermit-abi", + "hermit-abi 0.3.1", "io-lifetimes", "rustix", "windows-sys 0.48.0", @@ -763,6 +795,12 @@ dependencies = [ "either", ] +[[package]] +name = "itoa" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" + [[package]] name = "lalrpop" version = "0.19.12" @@ -794,6 +832,12 @@ dependencies = [ "regex", ] +[[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.144" @@ -824,12 +868,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.17" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] +checksum = "518ef76f2f87365916b142844c16d8fefd85039bc5699050210a7778ee1cd1de" [[package]] name = "memchr" @@ -888,10 +929,19 @@ dependencies = [ ] [[package]] -name = "once_cell" -version = "1.17.1" +name = "num_threads" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +dependencies = [ + "libc", +] + +[[package]] +name = "once_cell" +version = "1.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9670a07f94779e00908f3e686eab508878ebb390ba6e604d3a284c00e8d0487b" [[package]] name = "parking_lot" @@ -1036,18 +1086,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.58" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa1fb82fc0c281dd9671101b66b771ebbe1eaf967b96ac8740dcba4b70005ca8" +checksum = "6aeca18b86b413c660b781aa319e4e2648a3e6f9eadc9b47e9038e6fe9f3451b" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.27" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f4f29d145265ec1c483c7c654450edde0bfe043d3938d6972630663356d9500" +checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488" dependencies = [ "proc-macro2", ] @@ -1080,13 +1130,13 @@ dependencies = [ [[package]] name = "regex" -version = "1.8.1" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" +checksum = "81ca098a9821bd52d6b24fd8b10bd081f47d39c22778cafaa75a2857a62c6390" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.7.1", + "regex-syntax 0.7.2", ] [[package]] @@ -1097,9 +1147,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c" +checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78" [[package]] name = "rgb" @@ -1232,7 +1282,20 @@ checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.18", +] + +[[package]] +name = "simple_logger" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e78beb34673091ccf96a8816fce8bfd30d1292c7621ca2bcb5f2ba0fae4f558d" +dependencies = [ + "atty", + "colored", + "log", + "time", + "windows-sys 0.42.0", ] [[package]] @@ -1292,9 +1355,9 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "static_cell" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4c37c250d21f53fa7165e76e5401d7e6539c211a8d2cf449e3962956a5cc2ce" +checksum = "ed6a851e9c00ce152b2bad24e8545a6db0b8646988267a6ea966d95c6932e8a2" dependencies = [ "atomic-polyfill 1.0.2", ] @@ -1331,9 +1394,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.16" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6f671d4b5ffdb8eadec19c0ae67fe2639df8684bd7bc4b83d986b8db549cf01" +checksum = "32d41677bcbe24c20c52e7c70b0d8db04134c5d1066bf98662e2871ad200ea3e" dependencies = [ "proc-macro2", "quote", @@ -1341,7 +1404,7 @@ dependencies = [ ] [[package]] -name = "tangentbord1" +name = "tangentbord1-lib" version = "0.1.0" dependencies = [ "atomic-polyfill 1.0.2", @@ -1372,6 +1435,7 @@ dependencies = [ "ron", "rtt-target", "serde", + "simple_logger", "smart-leds", "static_cell", "tgnt", @@ -1379,6 +1443,23 @@ dependencies = [ "usbd-hid", ] +[[package]] +name = "tangentbord1-right" +version = "0.1.0" +dependencies = [ + "cortex-m-rt", + "embassy-executor", + "embassy-futures", + "embassy-rp", + "embassy-sync", + "embassy-time", + "log", + "postcard", + "ron", + "tangentbord1-lib", + "tgnt", +] + [[package]] name = "term" version = "0.7.0" @@ -1402,7 +1483,6 @@ dependencies = [ [[package]] name = "tgnt" version = "0.1.0" -source = "git+https://git.nubo.sh/hulthe/tgnt.git#643f75cf0a33208ec18c38ea7d9ccf06f344ff35" dependencies = [ "serde", ] @@ -1424,7 +1504,36 @@ checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.18", +] + +[[package]] +name = "time" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f3403384eaacbca9923fa06940178ac13e4edb725486d70e8e15881d0c836cc" +dependencies = [ + "itoa", + "libc", + "num_threads", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" + +[[package]] +name = "time-macros" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "372950940a5f07bf38dbe211d7283c9e6d7327df53794992d293e534c733d09b" +dependencies = [ + "time-core", ] [[package]] @@ -1450,9 +1559,9 @@ checksum = "e87a2ed6b42ec5e28cc3b94c09982969e9227600b2e3dcbc1db927a84c06bd69" [[package]] name = "unicode-ident" -version = "1.0.8" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" [[package]] name = "unicode-width" @@ -1571,6 +1680,21 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-sys" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + [[package]] name = "windows-sys" version = "0.45.0" diff --git a/right/Cargo.toml b/right/Cargo.toml new file mode 100644 index 0000000..a527416 --- /dev/null +++ b/right/Cargo.toml @@ -0,0 +1,29 @@ +[package] +name = "tangentbord1-right" +version = "0.1.0" +authors = ["Joakim Hulthe "] +description = "Keyboard firmware" +edition = "2021" + +[dependencies.tangentbord1] +path = "../lib" +package = "tangentbord1-lib" + +[dependencies] +tgnt = { git = "https://git.nubo.sh/hulthe/tgnt.git", default-features = false } +cortex-m-rt = "0.7" +embassy-rp = { git = "https://github.com/embassy-rs/embassy.git", features = ["log", "nightly", "unstable-traits", "unstable-pac", "time-driver", "critical-section-impl"] } +embassy-executor = { git = "https://github.com/embassy-rs/embassy.git", features = ["arch-cortex-m", "log", "executor-thread", "nightly", "integrated-timers" ] } +embassy-sync = { git = "https://github.com/embassy-rs/embassy.git", features = ["log", "nightly"] } +embassy-time = { git = "https://github.com/embassy-rs/embassy.git", features = ["log"] } +embassy-futures = { git = "https://github.com/embassy-rs/embassy.git", features = ["log"] } +log = "0.4.17" +postcard = { version = "1.0.4", features = ["alloc"] } + +[patch."https://git.nubo.sh/hulthe/tgnt.git"] +tgnt = { path = "../../tgnt" } + +[build-dependencies] +tgnt = { git = "https://git.nubo.sh/hulthe/tgnt.git", default-features = false } +ron = "0.8.0" +postcard = { version = "1", features = ["use-std"] } diff --git a/right/build.rs b/right/build.rs new file mode 100644 index 0000000..43337e4 --- /dev/null +++ b/right/build.rs @@ -0,0 +1,59 @@ +//! This build script copies the `memory.x` file from the crate root into +//! a directory where the linker can always find it at build time. +//! For many projects this is optional, as the linker always searches the +//! project root directory -- wherever `Cargo.toml` is. However, if you +//! are using a workspace or have a more complicated build setup, this +//! build script becomes required. Additionally, by requesting that +//! Cargo re-run the build script whenever `memory.x` is changed, +//! updating `memory.x` ensures a rebuild of the application with the +//! new memory settings. + +use std::fs::File; +use std::io::Write; +use std::path::PathBuf; +use std::{env, fs}; + +use tgnt::layer::Layer; + +fn main() { + memory(); + serialize_layout("./layers.ron", "./src/layers.pc"); +} + +fn memory() { + // Put `memory.x` in our output directory and ensure it's + // on the linker search path. + let out = &PathBuf::from(env::var_os("OUT_DIR").unwrap()); + File::create(out.join("memory.x")) + .unwrap() + .write_all(include_bytes!("../memory.x")) + .unwrap(); + println!("cargo:rustc-link-search={}", out.display()); + + // By default, Cargo will re-run a build script whenever + // any file in the project changes. By specifying `memory.x` + // here, we ensure the build script is only re-run when + // `memory.x` is changed. + println!("cargo:rerun-if-changed=../memory.x"); + + // --nmagic turns off page alignment of sections (which saves flash space) + println!("cargo:rustc-link-arg-bins=--nmagic"); + + println!("cargo:rustc-link-arg-bins=-Tlink.x"); + println!("cargo:rustc-link-arg-bins=-Tlink-rp.x"); + //println!("cargo:rustc-link-arg-bins=-Tdefmt.x"); +} + +fn serialize_layout(ron_path: &str, postcard_path: &str) { + println!("cargo:rerun-if-changed={ron_path}"); + + let layers = fs::read_to_string(ron_path).expect("Failed to read .ron"); + let layers: Vec = ron::from_str(&layers).expect("Failed to deserialize .ron"); + + let serialized = postcard::to_stdvec(&layers).expect("Failed to serialize layers"); + + File::create(postcard_path) + .expect("Failed to create .pc") + .write_all(&serialized) + .expect("Failed to write .pc"); +} diff --git a/layers-right.ron b/right/layers.ron similarity index 94% rename from layers-right.ron rename to right/layers.ron index 01ab85e..3407648 100644 --- a/layers-right.ron +++ b/right/layers.ron @@ -23,7 +23,7 @@ Key(Z), // Thumbpad - PrevLayer, + HoldLayer(1), Key(Return), Key(Delete), ], @@ -53,7 +53,7 @@ None, // Thumbpad - PrevLayer, + HoldLayer(1), Key(Return), Key(Delete), ], @@ -82,7 +82,7 @@ None, // Thumbpad - PrevLayer, + HoldLayer(1), Key(Return), Key(Delete), ], diff --git a/right/src/layers.pc b/right/src/layers.pc new file mode 100644 index 0000000000000000000000000000000000000000..9238c3868f1826fb6db72e0a95c60f79cec6e76c GIT binary patch literal 105 zcmXZSxeb6Y5CB2%*}e;a03(q2-%5z+zaqr5>8wvg6rm);iv_8o6e`JpoQ9fK;owS~ dEUawoCS#B(%B;?ej-J8($=+OW(LMO|$qn0^1cv|s literal 0 HcmV?d00001 diff --git a/src/bin/right.rs b/right/src/main.rs similarity index 90% rename from src/bin/right.rs rename to right/src/main.rs index 2a46015..02489a7 100644 --- a/src/bin/right.rs +++ b/right/src/main.rs @@ -12,12 +12,16 @@ use embassy_executor::Spawner; use embassy_rp::gpio::{Level, Output, Pin}; use embassy_time::{Duration, Timer}; use log::error; -use tangentbord1::board::Board; -use tangentbord1::keyboard::{Half, KeyboardConfig}; -use tangentbord1::logger::Logger; -use tangentbord1::util::{stall, wheel}; -use tangentbord1::ws2812::{Rgb, Ws2812}; -use tangentbord1::{allocator, rtt, uart, usb}; +use tangentbord1::{ + board::Board, + event::Half, + keyboard::KeyboardConfig, + logger::Logger, + rgb::Rgb, + util::{stall, wheel}, + ws2812::Ws2812, + {allocator, rtt, uart, usb}, +}; use tgnt::layer::Layer; #[embassy_executor::main] @@ -50,7 +54,7 @@ async fn main(_spawner: Spawner) { //Timer::after(Duration::from_millis(3000)).await; - let layers = include_bytes!("layers-right.pc"); + let layers = include_bytes!("layers.pc"); let Ok(layers): Result, _> = postcard::from_bytes(layers) else { log::error!("Failed to deserialize layer config"); stall().await diff --git a/src/bin/.gitignore b/src/bin/.gitignore deleted file mode 100644 index 6fd0ef0..0000000 --- a/src/bin/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.pc diff --git a/src/lib.rs b/src/lib.rs deleted file mode 100644 index dc2ea6d..0000000 --- a/src/lib.rs +++ /dev/null @@ -1,30 +0,0 @@ -#![no_std] -#![feature(type_alias_impl_trait)] -#![feature(split_array)] - -use embassy_rp::{ - bind_interrupts, - peripherals::{UART0, USB}, -}; - -extern crate alloc; - -pub mod allocator; -pub mod board; -pub mod keyboard; -pub mod lights; -pub mod logger; -pub mod neopixel; -pub mod panic_handler; -pub mod rtt; -pub mod uart; -pub mod usb; -pub mod util; -pub mod ws2812; - -bind_interrupts! { - pub struct Irqs { - UART0_IRQ => embassy_rp::uart::BufferedInterruptHandler; - USBCTRL_IRQ => embassy_rp::usb::InterruptHandler; - } -}