From 148943ff42783161677b95789811e3be1db7c0e6 Mon Sep 17 00:00:00 2001 From: Dreaded_X Date: Sat, 11 Jan 2025 02:51:38 +0100 Subject: [PATCH] Reworked code to host API using picoserve --- Cargo.lock | 1330 ++++++++++++++++--------------------------- Cargo.toml | 86 +-- release.sh | 2 +- rust-toolchain.toml | 4 +- src/lib.rs | 57 ++ src/main.rs | 509 +++++++---------- 6 files changed, 814 insertions(+), 1174 deletions(-) create mode 100644 src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 640f35d..7fbe4ce 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,47 +1,12 @@ # 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", -] +version = 4 [[package]] name = "aho-corasick" -version = "1.0.5" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c378d78423fdad8089616f827526ee33c19f2fddbd5de1629152c9593ba4783" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] @@ -67,17 +32,18 @@ dependencies = [ "embassy-futures", "embassy-net", "embassy-rp", - "embassy-sync 0.5.0", + "embassy-sync", "embassy-time", + "embedded-storage", "git-version", - "heapless 0.7.16", + "heapless", "nourl", "panic-probe", + "picoserve", "portable-atomic", "rand", "rust-mqtt", "serde", - "serde-json-core", "smoltcp", "static_cell", "updater", @@ -85,30 +51,9 @@ dependencies = [ [[package]] name = "arrayvec" -version = "0.7.4" +version = "0.7.6" 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", -] +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "ascii-canvas" @@ -119,15 +64,6 @@ 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" @@ -137,23 +73,11 @@ 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" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "az" @@ -167,21 +91,9 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5deb64efa5bd81e31fcd1938615a6d98c82eafcbcd787162b6f63b91d6bac5b3" dependencies = [ - "rustc_version 0.2.3", + "rustc_version", ] -[[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" @@ -211,9 +123,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" +checksum = "1be3f42a67d6d345ecd59f675f3f012d6974981560836e938c22b424b85ce1be" [[package]] name = "block-buffer" @@ -221,13 +133,14 @@ version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ - "generic-array 0.14.7", + "generic-array", ] [[package]] name = "bme280" -version = "0.5.0" -source = "git+https://github.com/Remmirad/bme280-rs/?branch=fix_reset_setup_time#67700603706fccd5ffab8c465cf38d04058b7f48" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "169ac81b9123f316fde5b0e00175294dcdcdd800c1a6c92a4b58caf42a14cf1f" dependencies = [ "defmt", "embedded-hal 1.0.0", @@ -236,35 +149,30 @@ dependencies = [ ] [[package]] -name = "buffered-io" -version = "0.5.0" +name = "bt-hci" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562975127ad66dbe4b9d990aaa8e9eaa13189e04e31693b5c969e31eb02b34ae" +checksum = "d69c6b9d78fe4db539449fc8782dd2554fd4baee27f6e6dbf2e4757fcbc36139" dependencies = [ + "defmt", + "embassy-sync", "embedded-io", "embedded-io-async", + "futures-intrusive", + "heapless", ] [[package]] name = "bytemuck" -version = "1.13.1" +version = "1.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" +checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" 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", -] +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "cfg-if" @@ -272,16 +180,6 @@ 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" @@ -293,25 +191,25 @@ dependencies = [ ] [[package]] -name = "const-oid" -version = "0.9.5" +name = "const-sha1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" +checksum = "0d8a42181e0652c2997ae4d217f25b63c5337a52fd2279736e97b832fa0a3cff" [[package]] name = "const_format" -version = "0.2.31" +version = "0.2.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c990efc7a285731f9a4378d81aff2f0e85a2c8781a05ef0f8baa8dac54d0ff48" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" dependencies = [ "const_format_proc_macros", ] [[package]] name = "const_format_proc_macros" -version = "0.2.31" +version = "0.2.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e026b6ce194a874cb9cf32cd5772d1ef9767cc8fcb5765948d74f37a9d8b2bf6" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" dependencies = [ "proc-macro2", "quote", @@ -332,47 +230,38 @@ dependencies = [ [[package]] name = "cortex-m-rt" -version = "0.7.3" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee84e813d593101b1723e13ec38b6ab6abbdbaaa4546553f5395ed274079ddb1" +checksum = "801d4dec46b34c299ccf6b036717ae0fce602faa4f4fe816d9013b9a7c9f5ba6" dependencies = [ "cortex-m-rt-macros", ] [[package]] name = "cortex-m-rt-macros" -version = "0.7.0" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f6f3e36f203cfedbc78b357fb28730aa2c6dc1ab060ee5c2405e843988d3c7" +checksum = "e37549a379a9e0e6e576fd208ee60394ccb8be963889eebba3ffe0980364f472" 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", + "syn 2.0.96", ] [[package]] name = "crc-any" -version = "2.4.3" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "774646b687f63643eb0f4bf13dc263cb581c8c9e57973b6ddf78bda3994d88df" +checksum = "a62ec9ff5f7965e4d7280bd5482acd20aadb50d632cf6c1d74493856b011fa73" dependencies = [ "debug-helper", ] [[package]] name = "critical-section" -version = "1.1.2" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7059fff8937831a9ae6f0fe4d658ffabf58f2ca96aa9dec1c889f936f705f216" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" [[package]] name = "crunchy" @@ -380,60 +269,42 @@ 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", + "generic-array", "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" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59d6ec798758febb089bd969109385b48dd0fb966193fe97a5f0f8b2d622145e" +checksum = "2c998ad980bbdc3947db4951bc763d14738ab873e20b5e2d87bb683011d7f9e8" dependencies = [ + "bt-hci", "cortex-m", "cortex-m-rt", "defmt", "embassy-futures", "embassy-net-driver-channel", - "embassy-sync 0.5.0", + "embassy-sync", "embassy-time", "embedded-hal 1.0.0", + "embedded-io-async", "futures", + "heapless", "num_enum", ] [[package]] name = "cyw43-pio" -version = "0.1.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f429446fe9420ee0a8743fdffb1d08a90f9332116635bbc819f63649264e480c" +checksum = "09b87692b83201141715b0222ecffebd99a5fb4c663ebb3d21298c11462fabb2" dependencies = [ "cyw43", "defmt", @@ -445,9 +316,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.3" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" dependencies = [ "darling_core", "darling_macro", @@ -455,29 +326,35 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.3" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 2.0.29", + "syn 2.0.96", ] [[package]] name = "darling_macro" -version = "0.20.3" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.29", + "syn 2.0.96", ] +[[package]] +name = "data-encoding" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" + [[package]] name = "debug-helper" version = "0.3.13" @@ -486,9 +363,9 @@ checksum = "f578e8e2c440e7297e008bb5486a3a8a194775224bbc23729b0dbdfaeebf162e" [[package]] name = "defmt" -version = "0.3.5" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8a2d011b2fee29fb7d659b83c43fce9a2cb4df453e16d441a51448e448f3f98" +checksum = "86f6162c53f659f65d00619fe31f14556a6e9f8752ccc4a41bd177ffcf3d6130" dependencies = [ "bitflags 1.3.2", "defmt-macros", @@ -496,46 +373,36 @@ dependencies = [ [[package]] name = "defmt-macros" -version = "0.3.6" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54f0216f6c5acb5ae1a47050a6645024e6edafc2ee32d421955eccfef12ef92e" +checksum = "9d135dd939bad62d7490b0002602d35b358dce5fd9233a709d3c1ef467d4bde6" dependencies = [ "defmt-parser", - "proc-macro-error", + "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.96", ] [[package]] name = "defmt-parser" -version = "0.3.3" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "269924c02afd7f94bc4cecbfa5c379f6ffcf9766b3408fe63d22c728654eccd0" +checksum = "3983b127f13995e68c1e29071e5d115cd96f215ccb5e6812e3728cd6f92653b3" dependencies = [ - "thiserror", + "thiserror 2.0.11", ] [[package]] name = "defmt-rtt" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "609923761264dd99ed9c7d209718cda4631c5fe84668e0f0960124cbb844c49f" +checksum = "bab697b3dbbc1750b7c8b821aa6f6e7f2480b47a99bc057a2ed7b170ebef0c51" 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" @@ -550,7 +417,6 @@ checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", - "subtle", ] [[package]] @@ -576,9 +442,9 @@ dependencies = [ [[package]] name = "document-features" -version = "0.2.8" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef5282ad69563b5fc40319526ba27e0e7363d552a896f0297d54f767717f9b95" +checksum = "cb6969eaabd2421f8a2775cfd2471a2b634372b4a25d41e3bd647b79912850a0" dependencies = [ "litrs", ] @@ -600,39 +466,20 @@ dependencies = [ [[package]] name = "either" -version = "1.9.0" +version = "1.13.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", -] +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "embassy-boot" -version = "0.2.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e917a2dba10553ab6188fdafd81e971b0441953c663842285709eaf2a5de5e5b" +checksum = "b166522e46b13593c19e089f5455b2cb086cebd57b8274377edd306967881a1b" dependencies = [ "defmt", "digest", "embassy-embedded-hal", - "embassy-sync 0.5.0", + "embassy-sync", "embedded-storage", "embedded-storage-async", "salty", @@ -641,9 +488,9 @@ dependencies = [ [[package]] name = "embassy-boot-rp" -version = "0.2.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d8a53abc2a101dd352794666370ec0a13c53715dbec788f9aafde799ec1f2c2" +checksum = "56e9b1da96b0a76945d5c8ec5c1aebed9ec5c8bbdb79ea73a9141a46a2d8f4ab" dependencies = [ "cfg-if", "cortex-m", @@ -651,7 +498,7 @@ dependencies = [ "defmt", "embassy-boot", "embassy-rp", - "embassy-sync 0.5.0", + "embassy-sync", "embassy-time", "embedded-storage", "embedded-storage-async", @@ -659,13 +506,13 @@ dependencies = [ [[package]] name = "embassy-embedded-hal" -version = "0.1.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca4a9380d03e61063067b8239f67d2fa9f108ede7c46b4273804f6b79e59a1d" +checksum = "41fea5ef5bed4d3468dfd44f5c9fa4cda8f54c86d4fb4ae683eacf9d39e2ea12" dependencies = [ "defmt", "embassy-futures", - "embassy-sync 0.5.0", + "embassy-sync", "embassy-time", "embedded-hal 0.2.7", "embedded-hal 1.0.0", @@ -677,29 +524,27 @@ dependencies = [ [[package]] name = "embassy-executor" -version = "0.5.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec648daedd2143466eff4b3e8002024f9f6c1de4ab7666bb679688752624c925" +checksum = "90327bcc66333a507f89ecc4e2d911b265c45f5c9bc241f98eee076752d35ac6" dependencies = [ "cortex-m", "critical-section", "defmt", "document-features", "embassy-executor-macros", - "embassy-time-driver", - "embassy-time-queue-driver", ] [[package]] name = "embassy-executor-macros" -version = "0.4.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad454accf80050e9cf7a51e994132ba0e56286b31f9317b68703897c328c59b5" +checksum = "3577b1e9446f61381179a330fc5324b01d511624c55f25e3c66c9e3c626dbecf" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.96", ] [[package]] @@ -713,9 +558,9 @@ dependencies = [ [[package]] name = "embassy-hal-internal" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0ec47cf8bab914018d4bd2b4f0aaeb46e4f52ab1e7985df88aeef2c6eda5aed" +checksum = "0ef3bac31ec146321248a169e9c7b5799f1e0b3829c7a9b324cb4600a7438f59" dependencies = [ "cortex-m", "critical-section", @@ -725,25 +570,20 @@ dependencies = [ [[package]] name = "embassy-net" -version = "0.4.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cf91dd36dfd623de32242af711fd294d41159f02130052fc93c5c5ba93febe" +checksum = "ed041cc19a603d657124fddefdcbe5ef8bd60e77d972793ebb57de93394f5949" dependencies = [ - "as-slice 0.2.1", - "atomic-pool", "defmt", "document-features", "embassy-net-driver", - "embassy-sync 0.5.0", + "embassy-sync", "embassy-time", "embedded-io-async", "embedded-nal-async", - "futures", - "generic-array 0.14.7", - "heapless 0.8.0", + "heapless", "managed", "smoltcp", - "stable_deref_trait", ] [[package]] @@ -757,22 +597,22 @@ dependencies = [ [[package]] name = "embassy-net-driver-channel" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "584ab4da7e5612efaa7d55ee76161d9549adf788eab48d49362eddbf322f9933" +checksum = "4818c32afec43e3cae234f324bad9a976c9aa7501022d26ff60a4017a1a006b7" dependencies = [ "embassy-futures", "embassy-net-driver", - "embassy-sync 0.3.0", + "embassy-sync", ] [[package]] name = "embassy-rp" -version = "0.1.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "438f170cbd97d4a870e8d57e1738ee815255028ad31dd409d891e2bf797dc531" +checksum = "8cfe90d82ebbfed9de96d9edc6d63b6619c0977b570a3ab1724f76023e72773b" dependencies = [ - "atomic-polyfill 1.0.3", + "atomic-polyfill", "cfg-if", "cortex-m", "cortex-m-rt", @@ -782,9 +622,10 @@ dependencies = [ "embassy-embedded-hal", "embassy-futures", "embassy-hal-internal", - "embassy-sync 0.5.0", + "embassy-sync", "embassy-time", "embassy-time-driver", + "embassy-time-queue-utils", "embassy-usb-driver", "embedded-hal 0.2.7", "embedded-hal 1.0.0", @@ -795,74 +636,66 @@ dependencies = [ "embedded-storage", "embedded-storage-async", "fixed", - "futures", "nb 1.1.0", "pio", "pio-proc", "rand_core", "rp-pac", "rp2040-boot2", + "sha2-const-stable", + "smart-leds", ] [[package]] name = "embassy-sync" -version = "0.3.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0525b466ca3ace30b57f2db868a35215dfaecd038d8668cb2db03feb7c069a0" -dependencies = [ - "cfg-if", - "critical-section", - "futures-util", - "heapless 0.7.16", -] - -[[package]] -name = "embassy-sync" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd938f25c0798db4280fcd8026bf4c2f48789aebf8f77b6e5cf8a7693ba114ec" +checksum = "3899a6e39fa3f54bf8aaf00979f9f9c0145a522f7244810533abbb748be6ce82" dependencies = [ "cfg-if", "critical-section", "defmt", "embedded-io-async", + "futures-sink", "futures-util", - "heapless 0.8.0", + "heapless", ] [[package]] name = "embassy-time" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c844070d9f80dc66ee739299183312baee2e1cdeb6e90b4ea2af44f4676da5" +checksum = "f820157f198ada183ad62e0a66f554c610cdcd1a9f27d4b316358103ced7a1f8" dependencies = [ "cfg-if", "critical-section", "defmt", "document-features", "embassy-time-driver", - "embassy-time-queue-driver", "embedded-hal 0.2.7", "embedded-hal 1.0.0", "embedded-hal-async", "futures-util", - "heapless 0.8.0", ] [[package]] name = "embassy-time-driver" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e0c214077aaa9206958b16411c157961fb7990d4ea628120a78d1a5a28aed24" +checksum = "8d45f5d833b6d98bd2aab0c2de70b18bfaa10faf661a1578fd8e5dfb15eb7eba" dependencies = [ "document-features", ] [[package]] -name = "embassy-time-queue-driver" +name = "embassy-time-queue-utils" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1177859559ebf42cd24ae7ba8fe6ee707489b01d0bf471f8827b7b12dcb0bc0" +checksum = "dc55c748d16908a65b166d09ce976575fb8852cf60ccd06174092b41064d8f83" +dependencies = [ + "embassy-executor", + "heapless", +] [[package]] name = "embassy-usb-driver" @@ -929,23 +762,21 @@ dependencies = [ [[package]] name = "embedded-nal" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a943fad5ed3d3f8a00f1e80f6bba371f1e7f0df28ec38477535eb318dc19cc" +checksum = "c56a28be191a992f28f178ec338a0bf02f63d7803244add736d026a471e6ed77" dependencies = [ "nb 1.1.0", - "no-std-net", ] [[package]] name = "embedded-nal-async" -version = "0.7.1" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72229137a4fc12d239b0b7f50f04b30790678da6d782a0f3f1909bf57ec4b759" +checksum = "76959917cd2b86f40a98c28dd5624eddd1fa69d746241c8257eac428d83cb211" dependencies = [ "embedded-io-async", "embedded-nal", - "no-std-net", ] [[package]] @@ -963,34 +794,11 @@ dependencies = [ "embedded-storage", ] -[[package]] -name = "embedded-tls" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6efb76fdd004a4ef787640177237b83449e6c5847765ea50bf15900061fd601" -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.8.0", - "hkdf", - "hmac", - "p256", - "rand_core", - "sha2", - "typenum", -] - [[package]] name = "ena" -version = "0.14.2" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c533630cf40e9caa44bd91aadc88a75d75a4c3a12b4cfde353cbed41daa1e1f1" +checksum = "3d248bdd43ce613d87415282f69b9bb99d947d290b10962dd6c56233312c2ad5" dependencies = [ "log", ] @@ -1001,42 +809,11 @@ 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" +version = "1.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79386fdcec5e0fde91b1a6a5bcd89677d1f9304f7f986b154a1b9109038854d9" +checksum = "85c6e0b89bf864acd20590dbdbad56f69aeb898abfc9443008fd7bd48b2cc85a" dependencies = [ "az", "bytemuck", @@ -1058,9 +835,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "futures" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -1072,9 +849,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -1082,44 +859,54 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-intrusive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" +dependencies = [ + "futures-core", + "lock_api", +] [[package]] name = "futures-io" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-macro" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.96", ] [[package]] name = "futures-sink" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-core", "futures-macro", @@ -1129,24 +916,6 @@ dependencies = [ "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" @@ -1155,91 +924,49 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", - "zeroize", ] [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 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" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6b0decc02f4636b9ccad390dcbe77b722a77efedfa393caf8379a51d5c61899" +checksum = "1ad568aa3db0fcbc81f2f116137f263d7304f512a1209b35b85150d3ef88ad19" dependencies = [ "git-version-macro", - "proc-macro-hack", ] [[package]] name = "git-version-macro" -version = "0.3.5" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe69f1cbdb6e28af2bac214e943b99ce8a0a06b447d15d3e61161b0423139f3f" +checksum = "53010ccb100b96a67bc32c0175f0ed1426b31b655d562898e57325f81c023ac0" 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", + "syn 2.0.96", ] [[package]] name = "half" -version = "2.3.1" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc52e53916c08643f1b56ec082790d1e86a32e58dc5268f897f313fbae7b4872" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" 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 = "hash32" version = "0.3.1" @@ -1251,36 +978,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.0" +version = "0.15.2" 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", -] +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" [[package]] name = "heapless" @@ -1289,45 +989,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" dependencies = [ "defmt", - "hash32 0.3.1", + "hash32", + "serde", "stable_deref_trait", ] [[package]] name = "hermit-abi" -version = "0.3.2" +version = "0.4.0" 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" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" [[package]] name = "ident_case" @@ -1335,58 +1006,25 @@ 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" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" 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" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" +checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" dependencies = [ "hermit-abi", - "rustix", - "windows-sys", + "libc", + "windows-sys 0.52.0", ] [[package]] @@ -1430,16 +1068,26 @@ dependencies = [ ] [[package]] -name = "libc" -version = "0.2.147" +name = "lhash" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +checksum = "744a4c881f502e98c2241d2e5f50040ac73b30194d64452bb6260393b53f0dc9" [[package]] -name = "linux-raw-sys" -version = "0.4.5" +name = "libc" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.7.0", + "libc", +] [[package]] name = "litrs" @@ -1449,9 +1097,9 @@ checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" [[package]] name = "lock_api" -version = "0.4.10" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -1459,9 +1107,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.20" +version = "0.4.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "3d6ea2a48c204030ee31a7d7fc72c93294c92fe87ecb1789881c9543516e1a0d" [[package]] name = "managed" @@ -1470,12 +1118,36 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ca88d725a0a943b096803bd34e73a4437208b6077654cc4ecb2947a5f91618d" [[package]] -name = "maybe-async-cfg" -version = "0.2.3" +name = "manyhow" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21fb8fac02158b9b529eb692491895d8459dbac939f3bc6e32159969646ffe55" +checksum = "b33efb3ca6d3b07393750d4030418d594ab1139cee518f0dc88db70fec873587" dependencies = [ - "proc-macro-error", + "manyhow-macros", + "proc-macro2", + "quote", + "syn 1.0.109", + "syn 2.0.96", +] + +[[package]] +name = "manyhow-macros" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46fce34d199b78b6e6073abf984c9cf5fd3e9330145a93ee0738a7443e371495" +dependencies = [ + "proc-macro-utils", + "proc-macro2", + "quote", +] + +[[package]] +name = "maybe-async-cfg" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8dbfaa67a76e2623580df07d6bb5e7956c0a4bae4b418314083a9c619bd66627" +dependencies = [ + "manyhow", "proc-macro2", "pulldown-cmark", "quote", @@ -1484,9 +1156,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.6.2" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5486aed0026218e61b8a01d5fbd5a0a134649abb71a0e53b7bc088529dced86e" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "nb" @@ -1505,15 +1177,9 @@ checksum = "8d5439c4ad607c3c23abf66de8c8bf57ba8adcd1f129e699851a6e43935d339d" [[package]] name = "new_debug_unreachable" -version = "1.0.4" +version = "1.0.6" 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" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" [[package]] name = "nourl" @@ -1525,9 +1191,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.16" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] @@ -1554,31 +1220,15 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.18.0" +version = "1.20.2" 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", -] +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "panic-probe" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa6fa5645ef5a760cd340eaa92af9c1ce131c8c09e7f8926d8a24b59d26652b9" +checksum = "4047d9235d1423d66cc97da7d07eddb54d4f154d6c13805c6d0793956f4f25b0" dependencies = [ "cortex-m", "defmt", @@ -1586,9 +1236,9 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core", @@ -1596,28 +1246,28 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.8" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.3.5", + "redox_syscall", "smallvec", "windows-targets", ] [[package]] name = "paste" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "petgraph" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", "indexmap", @@ -1632,11 +1282,30 @@ dependencies = [ "siphasher", ] +[[package]] +name = "picoserve" +version = "0.13.3" +source = "git+https://github.com/hodasemi/picoserve#c4fe40eccfcd1188f117d4b7c689f6dc48c94d44" +dependencies = [ + "const-sha1", + "data-encoding", + "defmt", + "embassy-net", + "embassy-time", + "embedded-io-async", + "futures-util", + "heapless", + "lhash", + "ryu", + "serde", + "serde-json-core", +] + [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -1684,32 +1353,23 @@ dependencies = [ "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 = "portable-atomic" -version = "1.6.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" +checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6" dependencies = [ "critical-section", ] [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] [[package]] name = "precomputed-hash" @@ -1717,15 +1377,6 @@ 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" @@ -1751,36 +1402,63 @@ dependencies = [ ] [[package]] -name = "proc-macro-hack" -version = "0.5.20+deprecated" +name = "proc-macro-error-attr2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "proc-macro-utils" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeaf08a13de400bc215877b5bdc088f241b12eb42f0a548d3390dc1c56bb7071" +dependencies = [ + "proc-macro2", + "quote", + "smallvec", +] [[package]] name = "proc-macro2" -version = "1.0.66" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] [[package]] name = "pulldown-cmark" -version = "0.9.6" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57206b407293d2bcd3af849ce869d52068623f19e1b5ff8e8778e3309439682b" +checksum = "679341d22c78c6c649893cbd6c3278dcbe9fc4faa62fea3a9296ae2b50c14625" dependencies = [ - "bitflags 2.4.0", + "bitflags 2.7.0", "memchr", "unicase", ] [[package]] name = "quote" -version = "1.0.33" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] @@ -1813,54 +1491,45 @@ checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" [[package]] name = "redox_syscall" -version = "0.2.16" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" 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", + "bitflags 2.7.0", ] [[package]] name = "redox_users" -version = "0.4.3" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ "getrandom", - "redox_syscall 0.2.16", - "thiserror", + "libredox", + "thiserror 1.0.69", ] [[package]] name = "regex" -version = "1.9.4" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12de2eff854e5fa4b1295edd650e227e9d8fb0c9e90b12e7f36d6a6811791a29" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", "regex-automata", - "regex-syntax 0.7.5", + "regex-syntax 0.8.5", ] [[package]] name = "regex-automata" -version = "0.3.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49530408a136e16e5b486e883fbb6ba058e8e4e8ae6621a77b048b314336e629" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.7.5", + "regex-syntax 0.8.5", ] [[package]] @@ -1871,36 +1540,24 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.7.5" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] -name = "reqwless" -version = "0.11.0" +name = "rgb" +version = "0.8.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10f238db3a2f18fbe0aace4c28c3c673f5cfb584ffc3684d6327ed287a6c86e4" +checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" dependencies = [ - "base64", - "buffered-io", - "defmt", - "embedded-io", - "embedded-io-async", - "embedded-nal-async", - "embedded-tls", - "heapless 0.8.0", - "hex", - "httparse", - "nourl", - "rand_chacha", - "rand_core", + "bytemuck", ] [[package]] name = "rp-pac" -version = "6.0.0" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30f6c4c846269293db805e9c77864ff7b923395b480550df44f0868e3765337" +checksum = "8af65855c40b2c35079514c5489abffc0429347fef25d8467ff98ad84b4322d3" dependencies = [ "cortex-m", "cortex-m-rt", @@ -1917,14 +1574,14 @@ dependencies = [ [[package]] name = "rust-mqtt" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85c4b1fbe2ff726d3309ab119029b939ac8d5dd96a2aa8c82603dc15f3b8546f" +checksum = "8f71160765f368fd9a84e0955e2ddb6d64ac9018fee1c5323354d6d08c816b40" dependencies = [ "defmt", "embedded-io", "embedded-io-async", - "heapless 0.8.0", + "heapless", "rand_core", ] @@ -1934,42 +1591,20 @@ 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", + "semver", ] [[package]] name = "rustversion" -version = "1.0.14" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" [[package]] name = "ryu" -version = "1.0.15" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "salty" @@ -1988,19 +1623,6 @@ 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" @@ -2010,12 +1632,6 @@ 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" @@ -2024,45 +1640,41 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.188" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" dependencies = [ "serde_derive", ] [[package]] name = "serde-json-core" -version = "0.5.1" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c9e1ab533c0bc414c34920ec7e5f097101d126ed5eac1a1aac711222e0bbb33" +checksum = "5b81787e655bd59cecadc91f7b6b8651330b2be6c33246039a65e5cd6f4e0828" dependencies = [ - "heapless 0.7.16", + "defmt", + "heapless", "ryu", "serde", ] [[package]] name = "serde_derive" -version = "1.0.188" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.96", ] [[package]] -name = "sha2" -version = "0.10.7" +name = "sha2-const-stable" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] +checksum = "5f179d4e11094a893b82fff208f74d448a7512f99f5a0acbd5c679b705f83ed9" [[package]] name = "signature" @@ -2078,33 +1690,42 @@ checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" [[package]] name = "smallvec" -version = "1.11.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "smart-leds" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66df34e571fa9993fa6f99131a374d58ca3d694b75f9baac93458fe0d6057bf0" +dependencies = [ + "smart-leds-trait", +] + +[[package]] +name = "smart-leds-trait" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bc64ee02bbbf469603016df746c0ed224f263280b6ebb49b7ebadbff375c572" +dependencies = [ + "rgb", +] [[package]] name = "smoltcp" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a1a996951e50b5971a2c8c0fa05a381480d70a933064245c4a223ddc87ccc97" +checksum = "dad095989c1533c1c266d9b1e8d70a1329dd3723c3edac6d03bbd67e7bf6f4bb" dependencies = [ "bitflags 1.3.2", "byteorder", "cfg-if", "defmt", - "heapless 0.8.0", + "heapless", "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" @@ -2113,9 +1734,9 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "static_cell" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa6ba4cf83bf80d3eb25f098ea5e790a0a1fcb5e357442259b231e412c2d3ca0" +checksum = "d89b0684884a883431282db1e4343f34afc2ff6996fe1f4a1664519b66e14c1e" dependencies = [ "portable-atomic", ] @@ -2135,15 +1756,15 @@ dependencies = [ [[package]] name = "strsim" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "subtle" -version = "2.5.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" @@ -2158,9 +1779,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.29" +version = "2.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" +checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" dependencies = [ "proc-macro2", "quote", @@ -2180,31 +1801,51 @@ dependencies = [ [[package]] name = "termcolor" -version = "1.2.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" dependencies = [ "winapi-util", ] [[package]] name = "thiserror" -version = "1.0.47" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97a802ec30afc17eee47b2855fc72e0c4cd62be9b4efe6591edde0ec5bd68d8f" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" +dependencies = [ + "thiserror-impl 2.0.11", ] [[package]] name = "thiserror-impl" -version = "1.0.47" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bb623b56e39ab7dcd4b1b98bb6c8f8d907ed255b18de254088016b27a8ee19b" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.96", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", ] [[package]] @@ -2218,72 +1859,50 @@ dependencies = [ [[package]] name = "typenum" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicase" -version = "2.7.0" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" -dependencies = [ - "version_check", -] +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-ident" -version = "1.0.11" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" [[package]] name = "unicode-width" -version = "0.1.10" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] name = "unicode-xid" -version = "0.2.4" +version = "0.2.6" 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", -] +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "updater" version = "0.1.0" dependencies = [ "cortex-m", - "cortex-m-rt", "defmt", - "defmt-rtt", "embassy-boot", "embassy-futures", "embassy-net", + "embassy-sync", "embassy-time", "embedded-io-async", "embedded-storage", - "embedded-tls", - "heapless 0.7.16", - "impl-tools", - "nourl", - "portable-atomic", - "rand_core", - "reqwless", - "rust-mqtt", + "heapless", + "picoserve", "serde", - "serde-json-core", - "static_cell", ] [[package]] @@ -2294,9 +1913,9 @@ checksum = "77439c1b53d2303b20d9459b1ade71a83c716e3f9c34f3228c00e6f185d6c002" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "void" @@ -2306,9 +1925,9 @@ checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" [[package]] name = "volatile-register" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ee8f19f9d74293faf70901bc20ad067dc1ad390d2cbf1e3f75f721ffee908b6" +checksum = "de437e2a6208b014ab52972a27e59b33fa2920d3e00fe05026167a1c509d19cc" dependencies = [ "vcell", ] @@ -2337,11 +1956,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.5" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "winapi", + "windows-sys 0.59.0", ] [[package]] @@ -2352,22 +1971,32 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-sys" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ "windows-targets", ] [[package]] name = "windows-targets" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", "windows_i686_gnu", + "windows_i686_gnullvm", "windows_i686_msvc", "windows_x86_64_gnu", "windows_x86_64_gnullvm", @@ -2376,51 +2005,78 @@ dependencies = [ [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] [[package]] name = "zeroize" -version = "1.6.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" dependencies = [ "zeroize_derive", ] @@ -2433,5 +2089,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.96", ] diff --git a/Cargo.toml b/Cargo.toml index 4cbe3ab..f10645a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,73 +8,75 @@ 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 = ["defmt"] } -embassy-executor = { version = "0.5", features = [ - "nightly", - "arch-cortex-m", - "executor-thread", - "executor-interrupt", - "defmt", - "integrated-timers", +embassy-embedded-hal = { version = "0.3.0", features = ["defmt"] } +embassy-executor = { version = "0.7", features = [ + "nightly", + "arch-cortex-m", + "executor-thread", + "executor-interrupt", + "defmt", ] } -embassy-rp = { version = "0.1", features = [ - "defmt", - "unstable-pac", - "time-driver", - "critical-section-impl", - "intrinsics", - "rom-v2-intrinsics", +embassy-rp = { version = "0.3", features = [ + "rp2040", + "defmt", + "unstable-pac", + "time-driver", + "critical-section-impl", + "intrinsics", + "rom-v2-intrinsics", ] } -embassy-boot-rp = { version = "0.2", features = ["defmt"] } -embassy-boot = { version = "0.2", features = ["defmt"] } -embassy-time = { version = "0.3", features = [ - "defmt", - "defmt-timestamp-uptime", +embassy-boot-rp = { version = "0.4", features = ["defmt"] } +embassy-boot = { version = "0.4", features = ["defmt"] } +embassy-time = { version = "0.4", features = [ + "defmt", + "defmt-timestamp-uptime", ] } -embassy-net = { version = "0.4", features = [ - "tcp", - "dhcpv4", - "medium-ethernet", - "defmt", - "dns", +embassy-net = { version = "0.6", features = [ + "tcp", + "dhcpv4", + "dhcpv4-hostname", + "medium-ethernet", + "defmt", + "dns", ] } -embassy-sync = { version = "0.5", features = ["defmt"] } +embassy-sync = { version = "0.6", features = ["defmt"] } embassy-futures = { version = "0.1", features = ["defmt"] } panic-probe = { version = "0.3", features = ["print-defmt"] } cfg-if = "1.0" static_cell = { version = "2", features = ["nightly"] } -cyw43 = { version = "0.1", features = ["defmt", "firmware-logs"] } -cyw43-pio = { version = "0.1", features = ["defmt"] } +cyw43 = { version = "0.3", features = ["defmt", "firmware-logs"] } +cyw43-pio = { version = "0.3", features = ["defmt"] } rand = { version = "0.8", features = [ - "nightly", - "small_rng", - "std_rng", + "nightly", + "small_rng", + "std_rng", ], default-features = false } -rust-mqtt = { version = "0.2", features = [ - "defmt", - "no_std", - "tls", +rust-mqtt = { version = "0.3", features = [ + "defmt", + "no_std", + "tls", ], default-features = false } const_format = "0.2" git-version = "0.3" serde = { version = "1.0", default-features = false, features = ["derive"] } -heapless = { version = "0.7", features = ["defmt", "serde"] } -serde-json-core = "0.5" +heapless = { version = "0.8", features = ["defmt-03", "serde"] } nourl = { version = "0.1", features = ["defmt"] } -# Embassy harfcodes a max of 6 dns servers, if there are more it crashes. This is a workaround +# Embassy hardcodes 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.11", default-features = false, features = [ - "dns-max-server-count-4", +smoltcp = { version = "0.12", default-features = false, features = [ + "dns-max-server-count-4", ] } updater = { version = "0.1.0", path = "../iot_tools/updater" } portable-atomic = { version = "1.6", features = ["critical-section"] } bme280 = { version = "0.5.0", features = ["async", "defmt"] } +picoserve = { version = "0.13.3", features = ["defmt", "embassy"] } +embedded-storage = "0.3" [patch.crates-io] # Make mqtt:// and mqtts:// actually work nourl = { git = "https://git.huizinga.dev/Dreaded_X/nourl" } -bme280 = { git = "https://github.com/Remmirad/bme280-rs/", branch = "fix_reset_setup_time" } +picoserve = { git = "https://github.com/hodasemi/picoserve" } [features] include_firmwares = [] diff --git a/release.sh b/release.sh index 8f31ad0..e037f73 100755 --- a/release.sh +++ b/release.sh @@ -1,7 +1,7 @@ #!/bin/bash mkdir -p target/firmware -cargo objcopy --release --features=include_firmwares -- -O binary target/firmware/firmware +cargo objcopy --release -- -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 diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 0f27538..3c7bdea 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,4 +1,4 @@ [toolchain] -channel = "nightly-2024-03-01" +channel = "nightly-2025-01-09" targets = ["thumbv6m-none-eabi"] -components = ["rustfmt", "clippy", "llvm-tools"] +components = ["rustfmt", "clippy", "rust-analyzer", "llvm-tools"] diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..4f58f22 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,57 @@ +#![no_std] + +use core::fmt::Debug; + +use bme280::Measurements; +use defmt::Format; +use serde::{Deserialize, Serialize}; + +#[derive(Format, PartialEq, Clone, Copy, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum FanSpeed { + Off, + Low, + Medium, + High, +} + +#[derive(Serialize)] +#[serde(rename_all = "snake_case")] +pub struct FanState { + pub speed: FanSpeed, + pub manual: bool, +} + +impl FanState { + pub fn new(speed: FanSpeed, manual: bool) -> Self { + Self { speed, manual } + } +} + +#[derive(Deserialize)] +pub struct SetFanSpeed { + speed: FanSpeed, +} + +impl SetFanSpeed { + pub fn speed(&self) -> FanSpeed { + self.speed + } +} + +#[derive(Serialize)] +pub struct SensorData { + temperature: f32, + humidity: f32, + pressure: f32, +} + +impl SensorData { + pub fn new(measurements: Measurements) -> Self { + Self { + temperature: measurements.temperature, + humidity: measurements.humidity, + pressure: measurements.pressure, + } + } +} diff --git a/src/main.rs b/src/main.rs index b98a12a..fea7337 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,118 +1,67 @@ #![no_std] #![no_main] -#![feature(type_alias_impl_trait)] +#![feature(impl_trait_in_assoc_type)] -use core::fmt::Debug; -use core::{cell::RefCell, str::from_utf8}; +use core::{cell::RefCell, str::FromStr}; -use bme280::{i2c::AsyncBME280, Measurements}; -use const_format::formatcp; -use cyw43::PowerManagementMode; -use cyw43_pio::PioSpi; -use defmt::{debug, error, info, warn, Display2Format, Format}; +use bme280::i2c::AsyncBME280; +use cyw43::{JoinOptions, PowerManagementMode}; +use cyw43_pio::{PioSpi, DEFAULT_CLOCK_DIVIDER}; +use defmt::{debug, info, warn}; use embassy_boot::{AlignedBuffer, BlockingFirmwareUpdater, FirmwareUpdaterConfig}; +use embassy_embedded_hal::flash::partition::BlockingPartition; use embassy_executor::Spawner; -use embassy_futures::select::{select3, select4, Either3}; -use embassy_net::{dns::DnsQueryType, tcp::TcpSocket, Config, Stack, StackResources}; +use embassy_net::{Config, DhcpConfig, StackResources}; use embassy_rp::{ bind_interrupts, clocks::RoscRng, flash::{Flash, WRITE_SIZE}, gpio::{Flex, Input, Level, Output, Pin, Pull}, - i2c, - peripherals::{DMA_CH1, I2C0, PIN_23, PIN_25, PIO0}, + i2c::{self, Async}, + peripherals::{DMA_CH1, FLASH, I2C0, PIO0}, pio::{self, Pio}, Peripheral, }; -use embassy_sync::blocking_mutex::Mutex; -use embassy_time::{Delay, 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}, +use embassy_sync::{ + blocking_mutex::{ + self, + raw::{CriticalSectionRawMutex, NoopRawMutex}, }, - packet::v5::publish_packet::QualityOfService, + mutex::Mutex, }; -use serde::{Deserialize, Serialize}; -use static_cell::make_static; +use embassy_time::{Delay, Duration, Timer}; +use heapless::String; +use picoserve::{ + extract, make_static, + routing::{get, PathRouter}, + Router, +}; +use rand::{rngs::StdRng, RngCore, SeedableRng}; +use static_cell::StaticCell; +use updater::firmware_router; use {defmt_rtt as _, panic_probe as _}; +use air_filter::{FanSpeed, FanState, SensorData, SetFanSpeed}; + bind_interrupts!(struct Irqs { PIO0_IRQ_0 => pio::InterruptHandler; I2C0_IRQ => i2c::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; 32] = include_bytes!("../key.pub"); const FLASH_SIZE: usize = 2 * 1024 * 1024; -#[derive(Deserialize)] -struct SetMessage { - state: State, +struct Controller<'a> { + off: Input<'a>, + low: Flex<'a>, + medium: Flex<'a>, + high: Flex<'a>, } -#[derive(Serialize)] -struct StateMessage { - state: State, - manual: bool, - temperature: f32, - humidity: f32, - pressure: f32, -} - -impl StateMessage { - pub fn new((state, manual): (State, bool), measurements: Measurements) -> Self { - Self { - state, - manual, - temperature: measurements.temperature, - humidity: measurements.humidity, - pressure: measurements.pressure, - } - } - - 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( +impl<'a> Controller<'a> { + pub fn new( off: impl Peripheral

+ 'a, low: impl Peripheral

+ 'a, medium: impl Peripheral

+ 'a, @@ -140,86 +89,143 @@ impl<'a, O: Pin, L: Pin, M: Pin, H: Pin> Controller<'a, O, L, M, H> { } } - pub fn get_state(&mut self) -> (State, bool) { + pub fn get_state(&mut self) -> FanState { 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, + let speed = match (self.low.is_low(), self.medium.is_low(), self.high.is_low()) { + (false, false, false) => FanSpeed::Off, + (true, false, false) => FanSpeed::Low, + (false, true, false) => FanSpeed::Medium, + (false, false, true) => FanSpeed::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 + self.set_speed(FanSpeed::Off); + FanSpeed::Off } }; - (state, manual) + FanState { speed, manual } } - pub fn set_state(&mut self, state: State) { + pub fn set_speed(&mut self, speed: FanSpeed) -> bool { let manual = self.off.is_high(); - if manual && state != State::Off { + if manual && speed != FanSpeed::Off { warn!("Filter is manual controlled, cannot control remotely"); - return; + return false; } - debug!("Setting state: {}", state); + debug!("Setting state: {}", speed); - match state { - State::Off => { + match speed { + FanSpeed::Off => { self.low.set_as_input(); self.medium.set_as_input(); self.high.set_as_input(); } - State::Low => { + FanSpeed::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 => { + FanSpeed::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 => { + FanSpeed::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); } } + + true } - 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; - + pub fn check_for_manual(&mut self) { + // If off is high, that means that the knob is used to override the state if self.off.is_high() { - // If the filter is in manual mode, set the pico outputs to off - self.set_state(State::Off); + self.set_speed(FanSpeed::Off); } - - // Get the current state - self.get_state() } } +#[derive(Clone, Copy)] +struct SharedController(&'static Mutex>); + +#[derive(Clone, Copy)] +struct SharedBME280( + &'static Mutex>>, +); + +struct AppState { + shared_controller: SharedController, + shared_bme280: SharedBME280, +} + +impl picoserve::extract::FromRef for SharedController { + fn from_ref(state: &AppState) -> Self { + state.shared_controller + } +} + +impl picoserve::extract::FromRef for SharedBME280 { + fn from_ref(state: &AppState) -> Self { + state.shared_bme280 + } +} + +fn state_router() -> Router, AppState> { + Router::new() + .route( + "/fan", + get( + |extract::State(SharedController(controller)): extract::State< + SharedController, + >| async { + let state = controller.lock().await.get_state(); + picoserve::response::Json(state) + }, + ) + .put( + |extract::State(SharedController(controller)): extract::State< + SharedController, + >, + extract::Json(message): extract::Json| async move { + let success = controller.lock().await.set_speed(message.speed()); + + if success { + picoserve::response::StatusCode::OK + } else { + picoserve::response::StatusCode::SERVICE_UNAVAILABLE + } + }, + ), + ) + .route( + "/sensor", + get( + |extract::State(SharedBME280(bme280)): extract::State| async { + let measurement = bme280 + .lock() + .await + .measure(&mut Delay {}) + .await + .expect("Measurement should work"); + let sensor_data = SensorData::new(measurement); + + picoserve::response::Json(sensor_data) + }, + ), + ) +} + /// Get the cyw43 firmware blobs /// /// # Safety @@ -250,36 +256,30 @@ unsafe fn get_firmware() -> (&'static [u8], &'static [u8]) { } } -async fn wait_for_config( - stack: &'static Stack>, -) -> embassy_net::StaticConfigV4 { - for _ in 0..120 { - // We are essentially busy looping here since there is no Async API for this - if let Some(config) = stack.config_v4() { - return config; - } - - Timer::after_secs(1).await; - } - - info!("Restarting..."); - cortex_m::peripheral::SCB::sys_reset(); -} - #[embassy_executor::task] -async fn wifi_task( - runner: cyw43::Runner< - 'static, - Output<'static, PIN_23>, - PioSpi<'static, PIN_25, PIO0, 0, DMA_CH1>, - >, +async fn cyw43_task( + runner: cyw43::Runner<'static, Output<'static>, PioSpi<'static, PIO0, 0, DMA_CH1>>, ) -> ! { runner.run().await } #[embassy_executor::task] -async fn net_task(stack: &'static Stack>) -> ! { - stack.run().await +async fn net_task(mut runner: embassy_net::Runner<'static, cyw43::NetDriver<'static>>) -> ! { + runner.run().await +} + +type Thingy = BlockingPartition< + 'static, + NoopRawMutex, + Flash<'static, FLASH, embassy_rp::flash::Blocking, FLASH_SIZE>, +>; + +#[embassy_executor::task] +async fn fan_task(shared_controller: SharedController) -> ! { + loop { + shared_controller.0.lock().await.check_for_manual(); + Timer::after(Duration::from_millis(500)).await; + } } #[embassy_executor::main] @@ -287,18 +287,15 @@ 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 flash = make_static!(blocking_mutex::Mutex>>, blocking_mutex::Mutex::new(RefCell::new(flash))); - let config = FirmwareUpdaterConfig::from_linkerfile_blocking(&flash); - let mut aligned = AlignedBuffer([0; WRITE_SIZE]); + let config = FirmwareUpdaterConfig::from_linkerfile_blocking(flash, flash); + let aligned = make_static!(AlignedBuffer, AlignedBuffer([0; WRITE_SIZE])); let updater = BlockingFirmwareUpdater::new(config, &mut aligned.0); + let updater = make_static!(Mutex>, Mutex::new(updater)); - 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 controller = Controller::new(p.PIN_28, p.PIN_27, p.PIN_26, p.PIN_22); let i2c = i2c::I2c::new_async(p.I2C0, p.PIN_9, p.PIN_8, Irqs, i2c::Config::default()); let mut bme280 = AsyncBME280::new_primary(i2c); @@ -312,6 +309,7 @@ async fn main(spawner: Spawner) { let spi = PioSpi::new( &mut pio.common, pio.sm0, + DEFAULT_CLOCK_DIVIDER, pio.irq0, cs, p.PIN_24, @@ -321,9 +319,10 @@ async fn main(spawner: Spawner) { let (fw, clm) = unsafe { get_firmware() }; - let state = make_static!(cyw43::State::new()); + static STATE: StaticCell = StaticCell::new(); + let state = STATE.init(cyw43::State::new()); let (net_device, mut control, runner) = cyw43::new(state, pwr, spi, fw).await; - spawner.spawn(wifi_task(runner)).unwrap(); + spawner.spawn(cyw43_task(runner)).unwrap(); control.init(clm).await; control @@ -333,25 +332,30 @@ async fn main(spawner: Spawner) { // Turn LED on while trying to connect control.gpio_set(0, true).await; - let config = Config::dhcpv4(Default::default()); + let mut config: DhcpConfig = Default::default(); + config.hostname = Some(String::from_str("airfilter").expect("Is valid")); + let config = Config::dhcpv4(config); // 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( + static RESOURCES: StaticCell> = StaticCell::new(); + let (stack, runner) = embassy_net::new( net_device, config, - make_static!(StackResources::<6>::new()), + RESOURCES.init(StackResources::new()), rng.next_u64(), - )); - - spawner.spawn(net_task(stack)).unwrap(); + ); + spawner.spawn(net_task(runner)).unwrap(); // Connect to wifi loop { match control - .join_wpa2(env!("WIFI_NETWORK"), env!("WIFI_PASSWORD")) + .join( + env!("WIFI_NETWORK"), + JoinOptions::new(env!("WIFI_PASSWORD").as_bytes()), + ) .await { Ok(_) => break, @@ -361,145 +365,66 @@ async fn main(spawner: Spawner) { } } - info!("Waiting for DHCP..."); - let cfg = wait_for_config(stack).await; - info!("IP Address: {}", cfg.address.address()); + // Mark the update as successful after connecting to the wifi + updater.lock().await.mark_booted().unwrap(); - let mut rx_buffer = [0; 1024]; - let mut tx_buffer = [0; 1024]; + info!("Waiting for link up..."); + stack.wait_link_up().await; + info!("Link is up!"); - 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, - 1024, - &mut recv_buffer, - 1024, - config, - ); - - info!("Connecting to MQTT..."); - if client.connect_to_broker().await.is_err() { - cortex_m::peripheral::SCB::sys_reset(); - }; - 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(); + info!("Waiting for stack to be up..."); + stack.wait_config_up().await; + info!("Stack is up!"); // 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(_) => Some(StateMessage::new( - controller.get_state(), - bme280.measure(&mut delay).await.unwrap(), - )), - 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; - } - }; + let cfg = stack.config_v4().expect("Config is up"); + info!("IP Address: {}", cfg.address.address()); - if let Err(err) = updater.update(url, stack, &mut rng, &mut client).await { - error!("Update failed: {}", err); - } + let config = make_static!( + picoserve::Config, + picoserve::Config::new(picoserve::Timeouts { + start_read_request: Some(Duration::from_secs(5)), + read_request: Some(Duration::from_secs(1)), + write: Some(Duration::from_secs(1)), + }) + .keep_connection_alive() + ); - 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; - } - }; + let app = Router::new().nest("/state", state_router()).nest( + "/firmware", + firmware_router(VERSION, updater, PUBLIC_SIGNING_KEY), + ); - controller.set_state(message.get_state()); + let shared_controller = SharedController( + make_static!(Mutex>, Mutex::new(controller)), + ); + let shared_bme280 = SharedBME280( + make_static!(Mutex>>, Mutex::new(bme280)), + ); - Some(StateMessage::new( - controller.get_state(), - bme280.measure(&mut delay).await.unwrap(), - )) - } - Ok(_) => None, - Err(err) => { - error!("{}", err); - info!("Restarting in 5s..."); - Timer::after(Duration::from_secs(5)).await; - info!("Restarting..."); - cortex_m::peripheral::SCB::sys_reset(); - } - }, - Either3::Third(state) => Some(StateMessage::new( - state, - bme280.measure(&mut delay).await.unwrap(), - )), - }; + let port = 80; + let mut tcp_rx_buffer = [0; 1024]; + let mut tcp_tx_buffer = [0; 1024]; + let mut http_buffer = [0; 2048]; - if let Some(message) = message { - client - .send_message(TOPIC_BASE, &message.vec(), QualityOfService::QoS1, true) - .await - .unwrap(); - } - } + spawner.must_spawn(fan_task(shared_controller)); + + // We can only handle one request at a time + picoserve::listen_and_serve_with_state( + 0, + &app, + config, + stack, + port, + &mut tcp_rx_buffer, + &mut tcp_tx_buffer, + &mut http_buffer, + &AppState { + shared_controller, + shared_bme280, + }, + ) + .await; }