From d0efb48941596899c10184c9cde16cf1813b7122 Mon Sep 17 00:00:00 2001 From: Dreaded_X Date: Sat, 16 Sep 2023 04:16:52 +0200 Subject: [PATCH] Initial version --- .cargo/config.toml | 8 + .embed.toml | 2 + .gitignore | 2 + Cargo.lock | 2284 +++++++++++++++++ Cargo.toml | 109 + build.rs | 42 + firmware/43439A0.bin | Bin 0 -> 230321 bytes firmware/43439A0_clm.bin | Bin 0 -> 4752 bytes .../LICENSE-permissive-binary-license-1.0.txt | 49 + firmware/README.md | 9 + key.pub | Bin 0 -> 32 bytes memory.x.in | 22 + release.sh | 9 + rust-toolchain.toml | 3 + src/main.rs | 470 ++++ wrapper.sh | 3 + 16 files changed, 3012 insertions(+) create mode 100644 .cargo/config.toml create mode 100644 .embed.toml create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 build.rs create mode 100644 firmware/43439A0.bin create mode 100644 firmware/43439A0_clm.bin create mode 100644 firmware/LICENSE-permissive-binary-license-1.0.txt create mode 100644 firmware/README.md create mode 100644 key.pub create mode 100644 memory.x.in create mode 100755 release.sh create mode 100644 rust-toolchain.toml create mode 100644 src/main.rs create mode 100755 wrapper.sh diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000..d2e1afb --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,8 @@ +[target.'cfg(all(target_arch = "arm", target_os = "none"))'] +runner = "./wrapper.sh" + +[build] +target = "thumbv6m-none-eabi" # Cortex-M0 and Cortex-M0+ + +[env] +DEFMT_LOG = "debug" diff --git a/.embed.toml b/.embed.toml new file mode 100644 index 0000000..c0614e5 --- /dev/null +++ b/.embed.toml @@ -0,0 +1,2 @@ +[default.general] +chip = "rp2040" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fedaa2b --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/target +.env diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..8006472 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,2284 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common", + "generic-array 0.14.7", +] + +[[package]] +name = "aes" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "aes-gcm" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "209b47e8954a928e1d72e86eca7000ebb6655fe1436d33eefc2201cad027e237" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "ghash", + "subtle", +] + +[[package]] +name = "aho-corasick" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c378d78423fdad8089616f827526ee33c19f2fddbd5de1629152c9593ba4783" +dependencies = [ + "memchr", +] + +[[package]] +name = "air_filter" +version = "0.1.0" +dependencies = [ + "cfg-if", + "const_format", + "cortex-m", + "cortex-m-rt", + "cyw43", + "cyw43-pio", + "defmt", + "defmt-rtt", + "dotenvy", + "embassy-boot", + "embassy-boot-rp", + "embassy-embedded-hal", + "embassy-executor", + "embassy-futures", + "embassy-net", + "embassy-rp", + "embassy-sync", + "embassy-time", + "git-version", + "heapless 0.7.16", + "nourl", + "panic-probe", + "rand", + "rust-mqtt", + "serde", + "serde-json-core", + "smoltcp", + "static_cell", + "updater", +] + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[package]] +name = "as-slice" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45403b49e3954a4b8428a0ac21a4b7afadccf92bfd96273f1a58cd4812496ae0" +dependencies = [ + "generic-array 0.12.4", + "generic-array 0.13.3", + "generic-array 0.14.7", + "stable_deref_trait", +] + +[[package]] +name = "as-slice" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516" +dependencies = [ + "stable_deref_trait", +] + +[[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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" +dependencies = [ + "critical-section", +] + +[[package]] +name = "atomic-pool" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58c5fc22e05ec2884db458bf307dc7b278c9428888d2b6e6fad9c0ae7804f5f6" +dependencies = [ + "as-slice 0.1.5", + "as-slice 0.2.1", + "atomic-polyfill 1.0.3", + "stable_deref_trait", +] + +[[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 = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "414dcefbc63d77c526a76b3afcf6fbb9b5e2791c19c3aa2297733208750c6e53" + +[[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 = "bitflags" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array 0.14.7", +] + +[[package]] +name = "buffered-io" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9de70b60ec8429fe379d65fbc49bdd6d53d68486ff1e3482f07ab47814912782" +dependencies = [ + "embedded-io", + "embedded-io-async", +] + +[[package]] +name = "bytemuck" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" + +[[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.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "libc", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[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 = "const-oid" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" + +[[package]] +name = "const_format" +version = "0.2.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c990efc7a285731f9a4378d81aff2f0e85a2c8781a05ef0f8baa8dac54d0ff48" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e026b6ce194a874cb9cf32cd5772d1ef9767cc8fcb5765948d74f37a9d8b2bf6" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[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 = "cpufeatures" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +dependencies = [ + "libc", +] + +[[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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7059fff8937831a9ae6f0fe4d658ffabf58f2ca96aa9dec1c889f936f705f216" + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-bigint" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "740fe28e594155f10cfc383984cbefd529d7396050557148f79cb0f621204124" +dependencies = [ + "generic-array 0.14.7", + "rand_core", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array 0.14.7", + "typenum", +] + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + +[[package]] +name = "cyw43" +version = "0.1.0" +source = "git+https://github.com/embassy-rs/embassy#af7c93abba768057f1d3299c7b4f4aa4501b3e56" +dependencies = [ + "atomic-polyfill 0.1.11", + "cortex-m", + "cortex-m-rt", + "defmt", + "embassy-futures", + "embassy-net-driver-channel", + "embassy-sync", + "embassy-time", + "embedded-hal 1.0.0-rc.1", + "futures", + "num_enum", +] + +[[package]] +name = "cyw43-pio" +version = "0.1.0" +source = "git+https://github.com/embassy-rs/embassy#af7c93abba768057f1d3299c7b4f4aa4501b3e56" +dependencies = [ + "cyw43", + "defmt", + "embassy-rp", + "fixed", + "pio", + "pio-proc", +] + +[[package]] +name = "darling" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.29", +] + +[[package]] +name = "darling_macro" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.29", +] + +[[package]] +name = "debug-helper" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f578e8e2c440e7297e008bb5486a3a8a194775224bbc23729b0dbdfaeebf162e" + +[[package]] +name = "defmt" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8a2d011b2fee29fb7d659b83c43fce9a2cb4df453e16d441a51448e448f3f98" +dependencies = [ + "bitflags 1.3.2", + "defmt-macros", +] + +[[package]] +name = "defmt-macros" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54f0216f6c5acb5ae1a47050a6645024e6edafc2ee32d421955eccfef12ef92e" +dependencies = [ + "defmt-parser", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.29", +] + +[[package]] +name = "defmt-parser" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "269924c02afd7f94bc4cecbfa5c379f6ffcf9766b3408fe63d22c728654eccd0" +dependencies = [ + "thiserror", +] + +[[package]] +name = "defmt-rtt" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "609923761264dd99ed9c7d209718cda4631c5fe84668e0f0960124cbb844c49f" +dependencies = [ + "critical-section", + "defmt", +] + +[[package]] +name = "der" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "diff" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + +[[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 = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + +[[package]] +name = "ed25519" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" +dependencies = [ + "signature", +] + +[[package]] +name = "either" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" + +[[package]] +name = "elliptic-curve" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest", + "ff", + "generic-array 0.14.7", + "group", + "hkdf", + "rand_core", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "embassy-boot" +version = "0.1.1" +source = "git+https://github.com/embassy-rs/embassy#af7c93abba768057f1d3299c7b4f4aa4501b3e56" +dependencies = [ + "defmt", + "digest", + "embassy-embedded-hal", + "embassy-sync", + "embedded-storage", + "embedded-storage-async", + "salty", + "signature", +] + +[[package]] +name = "embassy-boot-rp" +version = "0.1.0" +source = "git+https://github.com/embassy-rs/embassy#af7c93abba768057f1d3299c7b4f4aa4501b3e56" +dependencies = [ + "cfg-if", + "cortex-m", + "cortex-m-rt", + "defmt", + "embassy-boot", + "embassy-rp", + "embassy-sync", + "embassy-time", + "embedded-storage", + "embedded-storage-async", +] + +[[package]] +name = "embassy-embedded-hal" +version = "0.1.0" +source = "git+https://github.com/embassy-rs/embassy#af7c93abba768057f1d3299c7b4f4aa4501b3e56" +dependencies = [ + "defmt", + "embassy-futures", + "embassy-sync", + "embassy-time", + "embedded-hal 0.2.7", + "embedded-hal 1.0.0-rc.1", + "embedded-hal-async", + "embedded-storage", + "embedded-storage-async", + "nb 1.1.0", +] + +[[package]] +name = "embassy-executor" +version = "0.3.0" +source = "git+https://github.com/embassy-rs/embassy#af7c93abba768057f1d3299c7b4f4aa4501b3e56" +dependencies = [ + "atomic-polyfill 1.0.3", + "cortex-m", + "critical-section", + "defmt", + "embassy-macros", + "embassy-time", + "futures-util", + "static_cell", +] + +[[package]] +name = "embassy-futures" +version = "0.1.0" +source = "git+https://github.com/embassy-rs/embassy#af7c93abba768057f1d3299c7b4f4aa4501b3e56" +dependencies = [ + "defmt", +] + +[[package]] +name = "embassy-hal-internal" +version = "0.1.0" +source = "git+https://github.com/embassy-rs/embassy#af7c93abba768057f1d3299c7b4f4aa4501b3e56" +dependencies = [ + "cortex-m", + "critical-section", + "defmt", + "num-traits", +] + +[[package]] +name = "embassy-macros" +version = "0.2.1" +source = "git+https://github.com/embassy-rs/embassy#af7c93abba768057f1d3299c7b4f4aa4501b3e56" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.29", +] + +[[package]] +name = "embassy-net" +version = "0.1.0" +source = "git+https://github.com/embassy-rs/embassy#af7c93abba768057f1d3299c7b4f4aa4501b3e56" +dependencies = [ + "as-slice 0.2.1", + "atomic-polyfill 1.0.3", + "atomic-pool", + "defmt", + "embassy-net-driver", + "embassy-sync", + "embassy-time", + "embedded-io-async", + "embedded-nal-async", + "futures", + "generic-array 0.14.7", + "heapless 0.7.16", + "managed", + "smoltcp", + "stable_deref_trait", +] + +[[package]] +name = "embassy-net-driver" +version = "0.1.0" +source = "git+https://github.com/embassy-rs/embassy#af7c93abba768057f1d3299c7b4f4aa4501b3e56" +dependencies = [ + "defmt", +] + +[[package]] +name = "embassy-net-driver-channel" +version = "0.1.0" +source = "git+https://github.com/embassy-rs/embassy#af7c93abba768057f1d3299c7b4f4aa4501b3e56" +dependencies = [ + "embassy-futures", + "embassy-net-driver", + "embassy-sync", +] + +[[package]] +name = "embassy-rp" +version = "0.1.0" +source = "git+https://github.com/embassy-rs/embassy#af7c93abba768057f1d3299c7b4f4aa4501b3e56" +dependencies = [ + "atomic-polyfill 1.0.3", + "cfg-if", + "cortex-m", + "cortex-m-rt", + "critical-section", + "defmt", + "embassy-embedded-hal", + "embassy-futures", + "embassy-hal-internal", + "embassy-sync", + "embassy-time", + "embassy-usb-driver", + "embedded-hal 0.2.7", + "embedded-hal 1.0.0-rc.1", + "embedded-hal-async", + "embedded-hal-nb", + "embedded-io", + "embedded-io-async", + "embedded-storage", + "embedded-storage-async", + "fixed", + "futures", + "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#af7c93abba768057f1d3299c7b4f4aa4501b3e56" +dependencies = [ + "cfg-if", + "critical-section", + "defmt", + "futures-util", + "heapless 0.7.16", +] + +[[package]] +name = "embassy-time" +version = "0.1.3" +source = "git+https://github.com/embassy-rs/embassy#af7c93abba768057f1d3299c7b4f4aa4501b3e56" +dependencies = [ + "atomic-polyfill 1.0.3", + "cfg-if", + "critical-section", + "defmt", + "embedded-hal 0.2.7", + "embedded-hal 1.0.0-rc.1", + "embedded-hal-async", + "futures-util", + "heapless 0.7.16", +] + +[[package]] +name = "embassy-usb-driver" +version = "0.1.0" +source = "git+https://github.com/embassy-rs/embassy#af7c93abba768057f1d3299c7b4f4aa4501b3e56" +dependencies = [ + "defmt", +] + +[[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-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2894bc2f0457b8ca3d6b8ab8aad64d9337583672494013457f86c5a9146c0e22" + +[[package]] +name = "embedded-hal-async" +version = "1.0.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a8a3517745342155b3b00895a0f78417a453fb800d97a8bf4777d5720acde9" +dependencies = [ + "embedded-hal 1.0.0-rc.1", +] + +[[package]] +name = "embedded-hal-nb" +version = "1.0.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "257e3bb0163c69195acb0ebe0083b017b963235861d5ea9741626abdc55f39c9" +dependencies = [ + "embedded-hal 1.0.0-rc.1", + "nb 1.1.0", +] + +[[package]] +name = "embedded-io" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "658bbadc628dc286b9ae02f0cb0f5411c056eb7487b72f0083203f115de94060" +dependencies = [ + "defmt", +] + +[[package]] +name = "embedded-io-async" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1394754ad749a560b25a0c70dcd2b66a450824a1311fc475bb2ccbfabe7f8414" +dependencies = [ + "defmt", + "embedded-io", +] + +[[package]] +name = "embedded-nal" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "447416d161ba378782c13e82b11b267d6d2104b4913679a7c5640e7e94f96ea7" +dependencies = [ + "heapless 0.7.16", + "nb 1.1.0", + "no-std-net", +] + +[[package]] +name = "embedded-nal-async" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e706b5288eceaa582155b24d54e23385429402e4e99ae984f4a0a6a65b635f15" +dependencies = [ + "embedded-io-async", + "embedded-nal", + "heapless 0.7.16", + "no-std-net", +] + +[[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 = "embedded-tls" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0427cd46c51f67e68abe046a63f2c1d3820d9f1a99b55792869a407d981afd5" +dependencies = [ + "aes-gcm", + "atomic-polyfill 1.0.3", + "defmt", + "digest", + "embedded-io", + "embedded-io-async", + "generic-array 0.14.7", + "heapless 0.6.1", + "heapless 0.7.16", + "hkdf", + "hmac", + "p256", + "rand_core", + "sha2", + "typenum", +] + +[[package]] +name = "ena" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c533630cf40e9caa44bd91aadc88a75d75a4c3a12b4cfde353cbed41daa1e1f1" +dependencies = [ + "log", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "136526188508e25c6fef639d7927dfb3e0e3084488bf202267829cf7fc23dbdd" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys", +] + +[[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 = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "rand_core", + "subtle", +] + +[[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.29", +] + +[[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 = "generic-array" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" +dependencies = [ + "typenum", +] + +[[package]] +name = "generic-array" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f797e67af32588215eaaab8327027ee8e71b9dd0b2b26996aedf20c030fce309" +dependencies = [ + "typenum", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[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 = "ghash" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d930750de5717d2dd0b8c0d42c076c0e884c81a73e6cab859bbd2339c71e3e40" +dependencies = [ + "opaque-debug", + "polyval", +] + +[[package]] +name = "git-version" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6b0decc02f4636b9ccad390dcbe77b722a77efedfa393caf8379a51d5c61899" +dependencies = [ + "git-version-macro", + "proc-macro-hack", +] + +[[package]] +name = "git-version-macro" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe69f1cbdb6e28af2bac214e943b99ce8a0a06b447d15d3e61161b0423139f3f" +dependencies = [ + "proc-macro-hack", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core", + "subtle", +] + +[[package]] +name = "half" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc52e53916c08643f1b56ec082790d1e86a32e58dc5268f897f313fbae7b4872" +dependencies = [ + "cfg-if", + "crunchy", +] + +[[package]] +name = "hash32" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4041af86e63ac4298ce40e5cca669066e75b6f1aa3390fe2561ffa5e1d9f4cc" +dependencies = [ + "byteorder", +] + +[[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.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" + +[[package]] +name = "heapless" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634bd4d29cbf24424d0a4bfcbf80c6960129dc24424752a7d1d1390607023422" +dependencies = [ + "as-slice 0.1.5", + "generic-array 0.14.7", + "hash32 0.1.1", + "stable_deref_trait", +] + +[[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", + "defmt", + "hash32 0.2.1", + "rustc_version 0.4.0", + "serde", + "spin", + "stable_deref_trait", +] + +[[package]] +name = "hermit-abi" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hkdf" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "impl-tools" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d82c305b1081f1a99fda262883c788e50ab57d36c00830bdd7e0a82894ad965c" +dependencies = [ + "autocfg", + "impl-tools-lib", + "proc-macro-error", + "syn 2.0.29", +] + +[[package]] +name = "impl-tools-lib" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85d3946d886eaab0702fa0c6585adcced581513223fa9df7ccfabbd9fa331a88" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.29", +] + +[[package]] +name = "indexmap" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "generic-array 0.14.7", +] + +[[package]] +name = "is-terminal" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" +dependencies = [ + "hermit-abi", + "rustix", + "windows-sys", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[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 = "libc" +version = "0.2.147" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" + +[[package]] +name = "linux-raw-sys" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503" + +[[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.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" + +[[package]] +name = "managed" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ca88d725a0a943b096803bd34e73a4437208b6077654cc4ecb2947a5f91618d" + +[[package]] +name = "memchr" +version = "2.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5486aed0026218e61b8a01d5fbd5a0a134649abb71a0e53b7bc088529dced86e" + +[[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 = "no-std-net" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43794a0ace135be66a25d3ae77d41b91615fb68ae937f904090203e81f755b65" + +[[package]] +name = "nourl" +version = "0.1.1" +source = "git+https://git.huizinga.dev/Dreaded_X/nourl#52d92f804d06f9d4745bf83e4b9201cbd825b481" +dependencies = [ + "defmt", +] + +[[package]] +name = "num-traits" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" +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 = "once_cell" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "elliptic-curve", + "primeorder", +] + +[[package]] +name = "panic-probe" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa6fa5645ef5a760cd340eaa92af9c1ce131c8c09e7f8926d8a24b59d26652b9" +dependencies = [ + "cortex-m", + "defmt", +] + +[[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.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + +[[package]] +name = "petgraph" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" +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.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" + +[[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 = "polyval" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52cff9d1d4dee5fe6d03729099f4a310a41179e0a10dbf542039873f2e826fb" +dependencies = [ + "cfg-if", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "primeorder" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c2fcef82c0ec6eefcc179b978446c399b3cdf73c392c35604e399eee6df1ee3" +dependencies = [ + "elliptic-curve", +] + +[[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-macro-hack" +version = "0.5.20+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" + +[[package]] +name = "proc-macro2" +version = "1.0.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[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 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags 1.3.2", +] + +[[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.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12de2eff854e5fa4b1295edd650e227e9d8fb0c9e90b12e7f36d6a6811791a29" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax 0.7.5", +] + +[[package]] +name = "regex-automata" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49530408a136e16e5b486e883fbb6ba058e8e4e8ae6621a77b048b314336e629" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.7.5", +] + +[[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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" + +[[package]] +name = "reqwless" +version = "0.5.0" +dependencies = [ + "base64", + "buffered-io", + "defmt", + "embedded-io", + "embedded-io-async", + "embedded-nal-async", + "embedded-tls", + "heapless 0.7.16", + "hex", + "httparse", + "nourl", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rp-pac" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f30f6c4c846269293db805e9c77864ff7b923395b480550df44f0868e3765337" +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 = "rust-mqtt" +version = "0.1.5" +source = "git+https://git.huizinga.dev/Dreaded_X/rust-mqtt#a040fef484227697a7b3bfa45f990a84d2c47c61" +dependencies = [ + "defmt", + "embedded-io-async", + "heapless 0.7.16", + "rand_core", +] + +[[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.18", +] + +[[package]] +name = "rustix" +version = "0.38.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0c3dde1fc030af041adc40e79c0e7fbcf431dd24870053d187d7c66e4b87453" +dependencies = [ + "bitflags 2.4.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "rustversion" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + +[[package]] +name = "ryu" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" + +[[package]] +name = "salty" +version = "0.2.0" +source = "git+https://github.com/ycrypto/salty.git?rev=a9f17911a5024698406b75c0fac56ab5ccf6a8c7#a9f17911a5024698406b75c0fac56ab5ccf6a8c7" +dependencies = [ + "ed25519", + "subtle", + "zeroize", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array 0.14.7", + "subtle", + "zeroize", +] + +[[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.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" + +[[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.188" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-json-core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c9e1ab533c0bc414c34920ec7e5f097101d126ed5eac1a1aac711222e0bbb33" +dependencies = [ + "heapless 0.7.16", + "ryu", + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.188" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.29", +] + +[[package]] +name = "sha2" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "signature" +version = "1.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "smallvec" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" + +[[package]] +name = "smoltcp" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d2e3a36ac8fea7b94e666dfa3871063d6e0a5c9d5d4fec9a1a6b7b6760f0229" +dependencies = [ + "bitflags 1.3.2", + "byteorder", + "cfg-if", + "defmt", + "heapless 0.7.16", + "managed", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "static_cell" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49cd323fc21eb534f903ee78d781d622099f9716c5b408ed23bcf39f8f1651c0" +dependencies = [ + "atomic-polyfill 1.0.3", +] + +[[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 = "subtle" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" + +[[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.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[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 = "thiserror" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97a802ec30afc17eee47b2855fc72e0c4cd62be9b4efe6591edde0ec5bd68d8f" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bb623b56e39ab7dcd4b1b98bb6c8f8d907ed255b18de254088016b27a8ee19b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.29", +] + +[[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 = "unicode-ident" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" + +[[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 = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common", + "subtle", +] + +[[package]] +name = "updater" +version = "0.1.0" +dependencies = [ + "cortex-m", + "cortex-m-rt", + "defmt", + "defmt-rtt", + "embassy-boot", + "embassy-futures", + "embassy-net", + "embassy-time", + "embedded-io-async", + "embedded-storage", + "embedded-tls", + "heapless 0.7.16", + "impl-tools", + "nourl", + "rand_core", + "reqwless", + "rust-mqtt", + "serde", + "serde-json-core", + "static_cell", +] + +[[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.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "zeroize" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..8dddeca --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,109 @@ +[package] +name = "air_filter" +version = "0.1.0" +edition = "2021" + +[dependencies] +cortex-m = { version = "0.7", features = ["inline-asm"] } +cortex-m-rt = "0.7" +defmt = "0.3" +defmt-rtt = "0.4" +embassy-embedded-hal = { version = "0.1.0", features = ["nightly", "defmt"] } +embassy-executor = { version = "0.3", features = [ + "arch-cortex-m", + "executor-thread", + "executor-interrupt", + "defmt", + "nightly", + "integrated-timers", +] } +embassy-rp = { version = "0.1", features = [ + "defmt", + "unstable-traits", + "nightly", + "unstable-pac", + "time-driver", + "critical-section-impl", +] } +embassy-boot-rp = { version = "0.1", features = ["nightly", "defmt"] } +embassy-boot = { version = "0.1", features = ["nightly", "defmt"] } +embassy-time = { version = "0.1", features = [ + "defmt", + "unstable-traits", + "defmt-timestamp-uptime", + "nightly", +] } +embassy-net = { version = "0.1", features = [ + "tcp", + "dhcpv4", + "nightly", + "medium-ethernet", + "defmt", + "dns", +] } +embassy-sync = { version = "0.2", features = ["defmt"] } +embassy-futures = { version = "0.1", features = ["defmt"] } +panic-probe = { version = "0.3", features = ["print-defmt"] } +cfg-if = "1.0.0" +static_cell = { version = "1.1", features = ["nightly"] } +cyw43 = { git = "https://github.com/embassy-rs/embassy", features = [ + "defmt", + "firmware-logs", +] } +cyw43-pio = { git = "https://github.com/embassy-rs/embassy", features = [ + "defmt", +] } +rand = { version = "0.8.5", features = [ + "nightly", + "small_rng", + "std_rng", +], default-features = false } +rust-mqtt = { version = "0.1.5", features = [ + "defmt", + "no_std", + "tls", +], default-features = false } +const_format = "0.2.31" +git-version = "0.3.5" +serde = { version = "1.0.188", default-features = false, features = ["derive"] } +heapless = { version = "0.7.16", features = ["defmt", "serde"] } +serde-json-core = "0.5.1" +nourl = { version = "0.1.1", features = ["defmt"] } +# Embassy harfcodes a max of 6 dns servers, if there are more it crashes. This is a workaround +# Ideally embassy returns an error instead of crashing... +# Interestingly though, I only get 2 DNS servers... +smoltcp = { version = "0.10.0", default-features = false, features = [ + "dns-max-server-count-4", +] } +updater = { version = "0.1.0", path = "../iot_tools/updater" } + +[patch.crates-io] +embassy-embedded-hal = { git = "https://github.com/embassy-rs/embassy" } +embassy-executor = { git = "https://github.com/embassy-rs/embassy" } +embassy-rp = { git = "https://github.com/embassy-rs/embassy" } +embassy-time = { git = "https://github.com/embassy-rs/embassy" } +embassy-net = { git = "https://github.com/embassy-rs/embassy" } +embassy-sync = { git = "https://github.com/embassy-rs/embassy" } +embassy-futures = { git = "https://github.com/embassy-rs/embassy" } +embassy-boot-rp = { git = "https://github.com/embassy-rs/embassy" } +embassy-boot = { git = "https://github.com/embassy-rs/embassy" } + +# Updated to embedded-io 0.5.0 +rust-mqtt = { git = "https://git.huizinga.dev/Dreaded_X/rust-mqtt" } +# Make mqtt:// and mqtts:// actually work +nourl = { git = "https://git.huizinga.dev/Dreaded_X/nourl" } + +# Waiting for this to get updated to embedded-io 0.5 properly +reqwless = { path = "../reqwless" } + +[features] +include_firmwares = [] + +[profile.release] +debug = true +opt-level = 's' +codegen-units = 1 +lto = true + +[build-dependencies] +dotenvy = "0.15.7" diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..70e99b0 --- /dev/null +++ b/build.rs @@ -0,0 +1,42 @@ +use std::env; +use std::fs::File; +use std::io::Write; +use std::path::PathBuf; + +fn main() { + let out = &PathBuf::from(env::var_os("OUT_DIR").unwrap()); + + // By default cortex-m-rt expects memory.x, however this causes issues with workspaces as it + // will pick the first file that is found. + // In order to get around this we make a dummy memory.x file + File::create(out.join("memory.x")).unwrap(); + + // Use memory.x.in as a template for the actual memory.x + let memory = include_str!("memory.x.in") + .replace("{BOOTLOADER}", "BOOTLOADER") + .replace("{ACTIVE}", "FLASH"); + + // And then include it with a unique name + File::create(out.join("memory_app.x")) + .unwrap() + .write_all(memory.as_bytes()) + .unwrap(); + println!("cargo:rustc-link-search={}", out.display()); + println!("cargo:rerun-if-changed=memory.x.in"); + + // And link with that one + println!("cargo:rustc-link-arg-bins=-Tmemory_app.x"); + + println!("cargo:rustc-link-arg-bins=--nmagic"); + println!("cargo:rustc-link-arg-bins=-Tlink.x"); + println!("cargo:rustc-link-arg-bins=-Tdefmt.x"); + + if let Ok(dotenv_path) = dotenvy::dotenv() { + println!("cargo:rerun-if-changed={}", dotenv_path.display()); + + for env_var in dotenvy::dotenv_iter().unwrap() { + let (key, value) = env_var.unwrap(); + println!("cargo:rustc-env={key}={value}"); + } + } +} diff --git a/firmware/43439A0.bin b/firmware/43439A0.bin new file mode 100644 index 0000000000000000000000000000000000000000..017375277d77d10e198deb1c668e2e6bb074d869 GIT binary patch literal 230321 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 VvnMpWpc&p5Vcnm2-S2)w^e-;e=~w^& literal 0 HcmV?d00001 diff --git a/firmware/LICENSE-permissive-binary-license-1.0.txt b/firmware/LICENSE-permissive-binary-license-1.0.txt new file mode 100644 index 0000000..cbb51f9 --- /dev/null +++ b/firmware/LICENSE-permissive-binary-license-1.0.txt @@ -0,0 +1,49 @@ +Permissive Binary License + +Version 1.0, July 2019 + +Redistribution. Redistribution and use in binary form, without +modification, are permitted provided that the following conditions are +met: + +1) Redistributions must reproduce the above copyright notice and the + following disclaimer in the documentation and/or other materials + provided with the distribution. + +2) Unless to the extent explicitly permitted by law, no reverse + engineering, decompilation, or disassembly of this software is + permitted. + +3) Redistribution as part of a software development kit must include the + accompanying file named �DEPENDENCIES� and any dependencies listed in + that file. + +4) Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +Limited patent license. The copyright holders (and contributors) grant a +worldwide, non-exclusive, no-charge, royalty-free patent license to +make, have made, use, offer to sell, sell, import, and otherwise +transfer this software, where such license applies only to those patent +claims licensable by the copyright holders (and contributors) that are +necessarily infringed by this software. This patent license shall not +apply to any combinations that include this software. No hardware is +licensed hereunder. + +If you institute patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the software +itself infringes your patent(s), then your rights granted under this +license shall terminate as of the date such litigation is filed. + +DISCLAIMER. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS "AS IS." ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT +NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/firmware/README.md b/firmware/README.md new file mode 100644 index 0000000..db3d9c9 --- /dev/null +++ b/firmware/README.md @@ -0,0 +1,9 @@ +# WiFi firmware + +Firmware obtained from https://github.com/Infineon/wifi-host-driver/tree/master/WiFi_Host_Driver/resources/firmware/COMPONENT_43439 + +Licensed under the [Infineon Permissive Binary License](./LICENSE-permissive-binary-license-1.0.txt) + +## Changelog + +* 2023-07-28: synced with `ad3bad0` - Update 43439 fw from 7.95.55 ot 7.95.62 diff --git a/key.pub b/key.pub new file mode 100644 index 0000000000000000000000000000000000000000..b86a9c52e7058473ac4bb832029b32490aea8788 GIT binary patch literal 32 ocmX?dt@G+!Zb1e=JC~b@76CWDX8D?37F6DKwbjtVYEl#<0P)}rsQ>@~ literal 0 HcmV?d00001 diff --git a/memory.x.in b/memory.x.in new file mode 100644 index 0000000..9decd72 --- /dev/null +++ b/memory.x.in @@ -0,0 +1,22 @@ +MEMORY { + BOOT2 : ORIGIN = 0x10000000, LENGTH = 0x100 + {BOOTLOADER} : ORIGIN = 0x10000100, LENGTH = 24k - 0x100 + BOOTLOADER_STATE : ORIGIN = 0x10006000, LENGTH = 4k + {ACTIVE} : ORIGIN = 0x10007000, LENGTH = 876k + DFU : ORIGIN = 0x100E2000, LENGTH = 880k + FW : ORIGIN = 0x101BE000, LENGTH = 256k + CLM : ORIGIN = 0x101FE000, LENGTH = 8k + RAM : ORIGIN = 0x20000000, LENGTH = 264K +} + +__bootloader_state_start = ORIGIN(BOOTLOADER_STATE) - ORIGIN(BOOT2); +__bootloader_state_end = ORIGIN(BOOTLOADER_STATE) + LENGTH(BOOTLOADER_STATE) - ORIGIN(BOOT2); + +__bootloader_active_start = ORIGIN({ACTIVE}) - ORIGIN(BOOT2); +__bootloader_active_end = ORIGIN({ACTIVE}) + LENGTH({ACTIVE}) - ORIGIN(BOOT2); + +__bootloader_dfu_start = ORIGIN(DFU) - ORIGIN(BOOT2); +__bootloader_dfu_end = ORIGIN(DFU) + LENGTH(DFU) - ORIGIN(BOOT2); + +__fw_start = ORIGIN(FW); +__clm_start = ORIGIN(CLM); diff --git a/release.sh b/release.sh new file mode 100755 index 0000000..8f31ad0 --- /dev/null +++ b/release.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +mkdir -p target/firmware +cargo objcopy --release --features=include_firmwares -- -O binary target/firmware/firmware +shasum -a 512 -b target/firmware/firmware | dd ibs=128 count=1 | xxd -p -r > target/firmware/checksum +signify -S -m target/firmware/checksum -s ~/Projects/crypt/R0/private/keys/firmware/airfilter.sec -x target/firmware/checksum.sig +tail -n1 target/firmware/checksum.sig | base64 -d -i | dd ibs=10 skip=1 > target/firmware/signed +cat target/firmware/signed > target/firmware/firmware+signed +cat target/firmware/firmware >> target/firmware/firmware+signed diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 0000000..19d011e --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,3 @@ +[toolchain] +channel = "nightly" +targets = ["thumbv6m-none-eabi"] diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..ef31de5 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,470 @@ +#![no_std] +#![no_main] +#![feature(type_alias_impl_trait)] + +use core::{cell::RefCell, str::from_utf8}; + +use const_format::formatcp; +use cyw43::PowerManagementMode; +use cyw43_pio::PioSpi; +use defmt::{debug, error, info, warn, Display2Format, Format}; +use embassy_boot::{AlignedBuffer, BlockingFirmwareUpdater, FirmwareUpdaterConfig}; +use embassy_executor::Spawner; +use embassy_futures::{ + select::{select3, select4, Either3}, + yield_now, +}; +use embassy_net::{dns::DnsQueryType, tcp::TcpSocket, Config, Stack, StackResources}; +use embassy_rp::{ + bind_interrupts, + clocks::RoscRng, + flash::{Flash, WRITE_SIZE}, + gpio::{Flex, Input, Level, Output, Pin, Pull}, + peripherals::{DMA_CH1, PIN_23, PIN_25, PIO0}, + pio::{self, Pio}, + Peripheral, +}; +use embassy_sync::blocking_mutex::Mutex; +use embassy_time::{Duration, Ticker, Timer}; +use heapless::Vec; +use nourl::Url; +use rand::{ + rngs::{SmallRng, StdRng}, + RngCore, SeedableRng, +}; +use rust_mqtt::{ + client::{ + client::MqttClient, + client_config::{ClientConfig, MqttVersion}, + }, + packet::v5::publish_packet::QualityOfService, +}; +use serde::{Deserialize, Serialize}; +use static_cell::make_static; + +use {defmt_rtt as _, panic_probe as _}; + +bind_interrupts!(struct Irqs { + PIO0_IRQ_0 => pio::InterruptHandler; +}); + +const ID: &str = env!("ID"); +const TOPIC_BASE: &str = formatcp!("pico/{}", ID); +const TOPIC_STATUS: &str = formatcp!("{}/status", TOPIC_BASE); +const TOPIC_UPDATE: &str = formatcp!("{}/update", TOPIC_BASE); +const TOPIC_SET: &str = formatcp!("{}/set", TOPIC_BASE); +const VERSION: &str = git_version::git_version!(); +const PUBLIC_SIGNING_KEY: &[u8] = include_bytes!("../key.pub"); +const FLASH_SIZE: usize = 2 * 1024 * 1024; + +#[derive(Deserialize)] +struct SetMessage { + state: State, +} + +#[derive(Serialize)] +struct StateMessage { + state: State, + manual: bool, +} + +impl StateMessage { + pub fn new((state, manual): (State, bool)) -> Self { + Self { state, manual } + } + + pub fn vec(&self) -> Vec { + serde_json_core::to_vec(self) + .expect("The buffer should be large enough to contain all the data") + } +} + +#[derive(Format, PartialEq, Clone, Copy, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +enum State { + Off, + Low, + Medium, + High, +} + +impl SetMessage { + fn get_state(&self) -> State { + self.state + } +} + +struct Controller<'a, O: Pin, L: Pin, M: Pin, H: Pin> { + off: Input<'a, O>, + low: Flex<'a, L>, + medium: Flex<'a, M>, + high: Flex<'a, H>, +} + +impl<'a, O: Pin, L: Pin, M: Pin, H: Pin> Controller<'a, O, L, M, H> { + pub fn new( + off: impl Peripheral

+ 'a, + low: impl Peripheral

+ 'a, + medium: impl Peripheral

+ 'a, + high: impl Peripheral

+ 'a, + ) -> Self { + let off = Input::new(off, Pull::None); + + let mut low = Flex::new(low); + low.set_low(); + low.set_as_input(); + + let mut medium = Flex::new(medium); + medium.set_low(); + medium.set_as_input(); + + let mut high = Flex::new(high); + high.set_low(); + high.set_as_input(); + + Self { + off, + low, + medium, + high, + } + } + + pub fn get_state(&mut self) -> (State, bool) { + let manual = self.off.is_high(); + let state = match (self.low.is_low(), self.medium.is_low(), self.high.is_low()) { + (false, false, false) => State::Off, + (true, false, false) => State::Low, + (false, true, false) => State::Medium, + (false, false, true) => State::High, + (a, b, c) => { + // This happens if the user turns the knob, in this case we should turn off remote + // control + debug!("Unknown state: ({}, {}, {})", a, b, c); + self.set_state(State::Off); + State::Off + } + }; + + (state, manual) + } + + pub fn set_state(&mut self, state: State) { + let manual = self.off.is_high(); + + if manual && state != State::Off { + warn!("Filter is manual controlled, cannot control remotely"); + return; + } + + debug!("Setting state: {}", state); + + match state { + State::Off => { + self.low.set_as_input(); + self.medium.set_as_input(); + self.high.set_as_input(); + } + State::Low => { + self.low.set_as_output(); + self.low.set_drive_strength(embassy_rp::gpio::Drive::_12mA); + self.medium.set_as_input(); + self.high.set_as_input(); + } + State::Medium => { + self.low.set_as_input(); + self.medium.set_as_output(); + self.medium + .set_drive_strength(embassy_rp::gpio::Drive::_12mA); + self.high.set_as_input(); + } + State::High => { + self.low.set_as_input(); + self.medium.set_as_input(); + self.high.set_as_output(); + self.high.set_drive_strength(embassy_rp::gpio::Drive::_12mA); + } + } + } + + pub async fn watch(&mut self) -> (State, bool) { + // Wait for change on any of the pins + select4( + self.off.wait_for_any_edge(), + self.low.wait_for_any_edge(), + self.medium.wait_for_any_edge(), + self.high.wait_for_any_edge(), + ) + .await; + + // Give it some time to stabilze + Timer::after(Duration::from_millis(500)).await; + + if self.off.is_high() { + // If the filter is in manual mode, set the pico outputs to off + self.set_state(State::Off); + } + + // Get the current state + self.get_state() + } +} + +/// Get the cyw43 firmware blobs +/// +/// # Safety +/// When building without `include_firmwares` make sure to flash the firmwares using the following +/// commands: +/// ```bash +/// probe-rs download firmware/43439A0.bin --format bin --chip RP2040 --base-address 0x101BE000 +/// probe-rs download firmware/43439A0_clm.bin --format bin --chip RP2040 --base-address 0x101FE000 +/// ``` +unsafe fn get_firmware() -> (&'static [u8], &'static [u8]) { + cfg_if::cfg_if! { + if #[cfg(feature = "include_firmwares")] { + let fw = include_bytes!("../firmware/43439A0.bin"); + let clm = include_bytes!("../firmware/43439A0_clm.bin"); + + (fw, clm) + } else { + // TODO: It would be nice if it could automatically get the correct size + extern "C" { + #[link_name = "__fw_start"] + static fw: [u8; 230321]; + #[link_name = "__clm_start"] + static clm: [u8; 4752]; + } + + (&fw, &clm) + } + } +} + +async fn wait_for_config( + stack: &'static Stack>, +) -> embassy_net::StaticConfigV4 { + loop { + // We are essentially busy looping here since there is no Async API for this + if let Some(config) = stack.config_v4() { + return config; + } + + yield_now().await; + } +} + +#[embassy_executor::task] +async fn wifi_task( + runner: cyw43::Runner< + 'static, + Output<'static, PIN_23>, + PioSpi<'static, PIN_25, PIO0, 0, DMA_CH1>, + >, +) -> ! { + runner.run().await +} + +#[embassy_executor::task] +async fn net_task(stack: &'static Stack>) -> ! { + stack.run().await +} + +#[embassy_executor::main] +async fn main(spawner: Spawner) { + info!("Starting..."); + let p = embassy_rp::init(Default::default()); + + // TODO: Ideally we use async flash + // This has issues with alignment right now + let flash = Flash::<_, _, FLASH_SIZE>::new_blocking(p.FLASH); + let flash = Mutex::new(RefCell::new(flash)); + + let config = FirmwareUpdaterConfig::from_linkerfile_blocking(&flash); + let mut aligned = AlignedBuffer([0; WRITE_SIZE]); + let updater = BlockingFirmwareUpdater::new(config, &mut aligned.0); + + let mut updater = updater::Updater::new(updater, TOPIC_STATUS, VERSION, PUBLIC_SIGNING_KEY); + + let mut controller = Controller::new(p.PIN_28, p.PIN_27, p.PIN_26, p.PIN_22); + + let pwr = Output::new(p.PIN_23, Level::Low); + let cs = Output::new(p.PIN_25, Level::High); + + let mut pio = Pio::new(p.PIO0, Irqs); + let spi = PioSpi::new( + &mut pio.common, + pio.sm0, + pio.irq0, + cs, + p.PIN_24, + p.PIN_29, + p.DMA_CH1, + ); + + let (fw, clm) = unsafe { get_firmware() }; + + let state = make_static!(cyw43::State::new()); + let (net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await; + spawner.spawn(wifi_task(runner)).unwrap(); + + control.init(clm).await; + control + .set_power_management(PowerManagementMode::PowerSave) + .await; + + // Turn LED on while trying to connect + control.gpio_set(0, true).await; + + let config = Config::dhcpv4(Default::default()); + + // Use the Ring Oscillator of the RP2040 as a source of true randomness to seed the + // cryptographically secure PRNG + let mut rng = StdRng::from_rng(&mut RoscRng).unwrap(); + + let stack = make_static!(Stack::new( + net_device, + config, + make_static!(StackResources::<6>::new()), + rng.next_u64(), + )); + + spawner.spawn(net_task(stack)).unwrap(); + + // Connect to wifi + loop { + match control + .join_wpa2(env!("WIFI_NETWORK"), env!("WIFI_PASSWORD")) + .await + { + Ok(_) => break, + Err(err) => { + info!("Failed to join with status = {}", err.status) + } + } + } + + info!("Waiting for DHCP..."); + let cfg = wait_for_config(stack).await; + info!("IP Address: {}", cfg.address.address()); + + let mut rx_buffer = [0; 1024]; + let mut tx_buffer = [0; 1024]; + + let mut socket = TcpSocket::new(stack, &mut rx_buffer, &mut tx_buffer); + // socket.set_timeout(Some(Duration::from_secs(10))); + let url = Url::parse(env!("MQTT_ADDRESS")).unwrap(); + debug!("MQTT URL: {}", url); + let ip = stack.dns_query(url.host(), DnsQueryType::A).await.unwrap()[0]; + let addr = (ip, url.port_or_default()); + debug!("MQTT ADDR: {}", addr); + + while let Err(e) = socket.connect(addr).await { + warn!("Connect error: {:?}", e); + Timer::after(Duration::from_secs(1)).await; + } + info!("TCP Connected!"); + + let mut config = ClientConfig::new( + MqttVersion::MQTTv5, + // Use fast and simple PRNG to generate packet identifiers, there is no need for this to be + // cryptographically secure + SmallRng::from_rng(&mut RoscRng).unwrap(), + ); + + config.add_username(env!("MQTT_USERNAME")); + config.add_password(env!("MQTT_PASSWORD")); + config.add_max_subscribe_qos(QualityOfService::QoS1); + config.add_client_id(ID); + updater.add_will(&mut config); + + let mut recv_buffer = [0; 1024]; + let mut write_buffer = [0; 1024]; + + let mut client = + MqttClient::<_, 5, _>::new(socket, &mut write_buffer, &mut recv_buffer, config); + + info!("Connecting to MQTT..."); + client.connect_to_broker().await.unwrap(); + info!("MQTT Connected!"); + + // We wait with marking as booted until everything is connected + client.subscribe_to_topic(TOPIC_UPDATE).await.unwrap(); + client.subscribe_to_topic(TOPIC_SET).await.unwrap(); + updater.ready(&mut client).await.unwrap(); + + // Turn LED off when connected + control.gpio_set(0, false).await; + + let mut keep_alive = Ticker::every(Duration::from_secs(30)); + loop { + let message = match select3( + keep_alive.next(), + client.receive_message(), + controller.watch(), + ) + .await + { + Either3::First(_) => { + client.send_ping().await.unwrap(); + None + } + Either3::Second(message) => match message { + Ok((TOPIC_UPDATE, url)) => { + let url: Vec<_, 256> = match Vec::from_slice(url) { + Ok(url) => url, + Err(_) => { + error!("URL is longer then buffer size"); + continue; + } + }; + let url = match from_utf8(&url) { + Ok(url) => url, + Err(err) => { + error!("Url is not valid utf-8 string: {}", Display2Format(&err)); + continue; + } + }; + let url = match Url::parse(url) { + Ok(url) => url, + Err(err) => { + error!("Failed to parse url: {}", err); + continue; + } + }; + + if let Err(err) = updater.update(url, stack, &mut rng, &mut client).await { + error!("Update failed: {}", err); + } + + None + } + Ok((TOPIC_SET, message)) => { + let message: SetMessage = match serde_json_core::from_slice(message) { + Ok((message, _)) => message, + Err(_) => { + error!("Unable to parse set message"); + continue; + } + }; + + controller.set_state(message.get_state()); + + Some(StateMessage::new(controller.get_state())) + } + Ok(_) => None, + Err(err) => { + error!("{}", err); + None + } + }, + Either3::Third(state) => Some(StateMessage::new(state)), + }; + + if let Some(message) = message { + client + .send_message(TOPIC_BASE, &message.vec(), QualityOfService::QoS1, true) + .await + .unwrap(); + } + } +} diff --git a/wrapper.sh b/wrapper.sh new file mode 100755 index 0000000..370f144 --- /dev/null +++ b/wrapper.sh @@ -0,0 +1,3 @@ +#!/bin/bash +probe-run --chip RP2040 --log-format="{L} {s} +└─ [{t}] {m} @ {F}:{l}" $@