diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 39f1c77..f8f169e 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,3 +1,4 @@ [toolchain] -channel = "nightly-2024-03-01" +channel = "nightly-2025-01-09" +components = ["rustfmt", "clippy", "rust-analyzer"] targets = ["thumbv6m-none-eabi"] diff --git a/updater/Cargo.lock b/updater/Cargo.lock index 6ccbc21..3bcb90b 100644 --- a/updater/Cargo.lock +++ b/updater/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "aead" @@ -49,15 +49,6 @@ dependencies = [ "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 = "atomic-polyfill" version = "1.0.3" @@ -67,23 +58,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", - "stable_deref_trait", -] - [[package]] name = "autocfg" -version = "1.2.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "bare-metal" @@ -91,7 +70,7 @@ 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]] @@ -129,9 +108,9 @@ dependencies = [ [[package]] name = "buffered-io" -version = "0.5.0" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562975127ad66dbe4b9d990aaa8e9eaa13189e04e31693b5c969e31eb02b34ae" +checksum = "d5698b2eda4613b62f3aa3119805df1ca6739e00167a2600b3a234ac49b14803" dependencies = [ "embedded-io", "embedded-io-async", @@ -165,6 +144,12 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +[[package]] +name = "const-sha1" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8a42181e0652c2997ae4d217f25b63c5337a52fd2279736e97b832fa0a3cff" + [[package]] name = "cortex-m" version = "0.7.7" @@ -179,38 +164,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", + "syn", ] [[package]] name = "cpufeatures" -version = "0.2.12" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" dependencies = [ "libc", ] [[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 = "crypto-bigint" @@ -244,10 +229,16 @@ dependencies = [ ] [[package]] -name = "defmt" -version = "0.3.6" +name = "data-encoding" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3939552907426de152b3c2c6f51ed53f98f448babd26f28694c95f5906194595" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" + +[[package]] +name = "defmt" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86f6162c53f659f65d00619fe31f14556a6e9f8752ccc4a41bd177ffcf3d6130" dependencies = [ "bitflags", "defmt-macros", @@ -255,31 +246,31 @@ dependencies = [ [[package]] name = "defmt-macros" -version = "0.3.7" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18bdc7a7b92ac413e19e95240e75d3a73a8d8e78aa24a594c22cbb4d44b4bbda" +checksum = "9d135dd939bad62d7490b0002602d35b358dce5fd9233a709d3c1ef467d4bde6" dependencies = [ "defmt-parser", - "proc-macro-error", + "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.55", + "syn", ] [[package]] name = "defmt-parser" -version = "0.3.4" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff4a5fefe330e8d7f31b16a318f9ce81000d8e35e69b93eae154d16d2278f70f" +checksum = "3983b127f13995e68c1e29071e5d115cd96f215ccb5e6812e3728cd6f92653b3" dependencies = [ "thiserror", ] [[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", @@ -287,9 +278,9 @@ dependencies = [ [[package]] name = "der" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" dependencies = [ "const-oid", "zeroize", @@ -308,9 +299,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", ] @@ -345,9 +336,9 @@ dependencies = [ [[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", @@ -361,9 +352,9 @@ 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 = [ "embassy-futures", "embassy-sync", @@ -387,12 +378,10 @@ 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", @@ -400,12 +389,9 @@ dependencies = [ "embassy-time", "embedded-io-async", "embedded-nal-async", - "futures", - "generic-array 0.14.7", "heapless 0.8.0", "managed", "smoltcp", - "stable_deref_trait", ] [[package]] @@ -419,51 +405,45 @@ dependencies = [ [[package]] name = "embassy-sync" -version = "0.5.0" +version = "0.6.1" 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", ] [[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" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1177859559ebf42cd24ae7ba8fe6ee707489b01d0bf471f8827b7b12dcb0bc0" - [[package]] name = "embedded-hal" version = "0.2.7" @@ -510,23 +490,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]] @@ -577,74 +555,31 @@ dependencies = [ "subtle", ] -[[package]] -name = "futures" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" -dependencies = [ - "futures-core", - "futures-sink", -] - [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" - -[[package]] -name = "futures-io" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" - -[[package]] -name = "futures-macro" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.55", -] +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-core", - "futures-macro", - "futures-sink", "futures-task", "pin-project-lite", "pin-utils", @@ -689,6 +624,26 @@ dependencies = [ "polyval", ] +[[package]] +name = "git-version" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad568aa3db0fcbc81f2f116137f263d7304f512a1209b35b85150d3ef88ad19" +dependencies = [ + "git-version-macro", +] + +[[package]] +name = "git-version-macro" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53010ccb100b96a67bc32c0175f0ed1426b31b655d562898e57325f81c023ac0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "group" version = "0.13.0" @@ -709,15 +664,6 @@ 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" @@ -733,27 +679,12 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "634bd4d29cbf24424d0a4bfcbf80c6960129dc24424752a7d1d1390607023422" dependencies = [ - "as-slice 0.1.5", + "as-slice", "generic-array 0.14.7", "hash32 0.1.1", "stable_deref_trait", ] -[[package]] -name = "heapless" -version = "0.7.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" -dependencies = [ - "atomic-polyfill", - "defmt", - "hash32 0.2.1", - "rustc_version 0.4.0", - "serde", - "spin", - "stable_deref_trait", -] - [[package]] name = "heapless" version = "0.8.0" @@ -762,6 +693,7 @@ checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" dependencies = [ "defmt", "hash32 0.3.1", + "serde", "stable_deref_trait", ] @@ -791,32 +723,32 @@ dependencies = [ [[package]] name = "httparse" -version = "1.8.0" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" [[package]] name = "impl-tools" -version = "0.10.0" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d82c305b1081f1a99fda262883c788e50ab57d36c00830bdd7e0a82894ad965c" +checksum = "0ae95c9095c2f1126d7db785955c73cdc5fc33e7c3fa911bd4a42931672029a7" dependencies = [ "autocfg", "impl-tools-lib", - "proc-macro-error", - "syn 2.0.55", + "proc-macro-error2", + "syn", ] [[package]] name = "impl-tools-lib" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85d3946d886eaab0702fa0c6585adcced581513223fa9df7ccfabbd9fa331a88" +checksum = "2a391adcea096a89a593317881fb61ef4e68d3e7d9de9e2338e6e1557be29e10" dependencies = [ - "proc-macro-error", + "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.55", + "syn", ] [[package]] @@ -829,10 +761,16 @@ dependencies = [ ] [[package]] -name = "libc" -version = "0.2.153" +name = "lhash" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "744a4c881f502e98c2241d2e5f50040ac73b30194d64452bb6260393b53f0dc9" + +[[package]] +name = "libc" +version = "0.2.169" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "litrs" @@ -840,16 +778,6 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" -[[package]] -name = "lock_api" -version = "0.4.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" -dependencies = [ - "autocfg", - "scopeguard", -] - [[package]] name = "managed" version = "0.8.0" @@ -871,16 +799,11 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d5439c4ad607c3c23abf66de8c8bf57ba8adcd1f129e699851a6e43935d339d" -[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3c12edfda65fe16901d81d3bd93fd18ac07078b5007875a1c3b0d35f7725269" dependencies = [ "defmt", ] @@ -901,11 +824,30 @@ dependencies = [ "primeorder", ] +[[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 0.8.0", + "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" @@ -927,18 +869,21 @@ dependencies = [ [[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 = "primeorder" @@ -950,43 +895,41 @@ dependencies = [ ] [[package]] -name = "proc-macro-error" -version = "1.0.4" +name = "proc-macro-error-attr2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" dependencies = [ - "proc-macro-error-attr", "proc-macro2", "quote", - "syn 1.0.109", - "version_check", ] [[package]] -name = "proc-macro-error-attr" -version = "1.0.4" +name = "proc-macro-error2" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" dependencies = [ + "proc-macro-error-attr2", "proc-macro2", "quote", - "version_check", + "syn", ] [[package]] name = "proc-macro2" -version = "1.0.79" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.35" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] @@ -1009,9 +952,9 @@ checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" [[package]] name = "reqwless" -version = "0.11.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10f238db3a2f18fbe0aace4c28c3c673f5cfb584ffc3684d6327ed287a6c86e4" +checksum = "fb1be74cb817fa6dbda417110f575d9b9ad5488817f1eb65f2f6468fe6d5d663" dependencies = [ "base64", "buffered-io", @@ -1030,9 +973,9 @@ 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", @@ -1047,23 +990,14 @@ 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.22", + "semver", ] [[package]] name = "ryu" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "salty" @@ -1076,12 +1010,6 @@ dependencies = [ "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" @@ -1104,12 +1032,6 @@ dependencies = [ "semver-parser", ] -[[package]] -name = "semver" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" - [[package]] name = "semver-parser" version = "0.7.0" @@ -1118,33 +1040,34 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.197" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +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.17", + "defmt", + "heapless 0.8.0", "ryu", "serde", ] [[package]] name = "serde_derive" -version = "1.0.197" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn", ] [[package]] @@ -1166,9 +1089,9 @@ checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" [[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", "byteorder", @@ -1178,15 +1101,6 @@ dependencies = [ "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" @@ -1195,35 +1109,24 @@ 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", ] [[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" -version = "1.0.109" +version = "2.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.55" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "002a1b3dbf967edfafc32655d0f377ab0bb7b994aa1d32c8cc7e9b8bf3ebb8f0" +checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" dependencies = [ "proc-macro2", "quote", @@ -1232,22 +1135,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.58" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" +checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.58" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" +checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn", ] [[package]] @@ -1258,9 +1161,9 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" [[package]] name = "universal-hash" @@ -1283,13 +1186,15 @@ dependencies = [ "embassy-boot", "embassy-futures", "embassy-net", + "embassy-sync", "embassy-time", "embedded-io-async", "embedded-storage", "embedded-tls", - "heapless 0.7.17", + "git-version", + "heapless 0.8.0", "impl-tools", - "nourl", + "picoserve", "portable-atomic", "rand_core", "reqwless", @@ -1307,9 +1212,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" @@ -1327,10 +1232,31 @@ dependencies = [ ] [[package]] -name = "zeroize" -version = "1.7.0" +name = "zerocopy" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +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", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" dependencies = [ "zeroize_derive", ] @@ -1343,5 +1269,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn", ] diff --git a/updater/Cargo.toml b/updater/Cargo.toml index d474779..fd47484 100644 --- a/updater/Cargo.toml +++ b/updater/Cargo.toml @@ -8,39 +8,40 @@ cortex-m = { version = "0.7", features = ["inline-asm"] } cortex-m-rt = "0.7" defmt = "0.3" defmt-rtt = "0.4" -embassy-net = { version = "0.4", features = [ - "tcp", - "dhcpv4", - "medium-ethernet", - "defmt", - "dns", +embassy-net = { version = "0.6", features = [ + "tcp", + "dhcpv4", + "medium-ethernet", + "defmt", + "dns", ] } -embassy-boot = { version = "0.2", features = ["defmt", "ed25519-salty"] } -embassy-time = { version = "0.3", features = [ - "defmt", - "defmt-timestamp-uptime", +embassy-boot = { version = "0.4", features = ["defmt", "ed25519-salty"] } +embassy-time = { version = "0.4", features = [ + "defmt", + "defmt-timestamp-uptime", ] } embassy-futures = { version = "0.1", features = ["defmt"] } rand_core = "0.6" embedded-io-async = { version = "0.6", features = ["defmt-03"] } embedded-storage = "0.3" -rust-mqtt = { version = "0.2", features = [ - "defmt", - "no_std", - "tls", +rust-mqtt = { version = "0.3", features = [ + "defmt", + "no_std", + "tls", ], default-features = false } -nourl = { version = "0.1", features = ["defmt"] } -heapless = { version = "0.7", features = ["defmt", "serde"] } +heapless = { version = "0.8", features = ["defmt-03", "serde"] } serde = { version = "1.0", default-features = false, features = ["derive"] } -serde-json-core = "0.5" +serde-json-core = "0.6" embedded-tls = { version = "0.17", default-features = false, features = [ - "defmt", + "defmt", ] } -reqwless = { version = "0.11", features = ["defmt"] } +reqwless = { version = "0.13", features = ["defmt"] } static_cell = { version = "2", features = ["nightly"] } impl-tools = "0.10" portable-atomic = { version = "1.6", features = ["critical-section"] } +picoserve = { version = "0.13.3", features = ["defmt", "embassy"] } +embassy-sync = { version = "0.6.1", features = ["defmt"] } +git-version = "0.3.9" [patch.crates-io] -# Make mqtt:// and mqtts:// actually work -nourl = { git = "https://git.huizinga.dev/Dreaded_X/nourl" } +picoserve = { git = "https://github.com/hodasemi/picoserve" } diff --git a/updater/src/lib.rs b/updater/src/lib.rs index 0a70658..1f1438f 100644 --- a/updater/src/lib.rs +++ b/updater/src/lib.rs @@ -4,24 +4,16 @@ use defmt::*; use embassy_boot::{AlignedBuffer, BlockingFirmwareUpdater}; -use embassy_net::{dns::DnsQueryType, driver::Driver, tcp::TcpSocket, Stack}; +use embassy_sync::{blocking_mutex::raw::CriticalSectionRawMutex, mutex::Mutex}; use embassy_time::{Duration, Timer}; -use embedded_io_async::{Read, Write}; +use embedded_io_async::Read; use embedded_storage::nor_flash::NorFlash; -use embedded_tls::{Aes128GcmSha256, NoVerify, TlsConfig, TlsConnection, TlsContext}; -use heapless::Vec; -use nourl::{Url, UrlScheme}; -use rand_core::{CryptoRng, RngCore}; -use reqwless::{ - request::{Method, Request, RequestBuilder}, - response::Response, -}; -use rust_mqtt::{ - client::{client::MqttClient, client_config::ClientConfig}, - packet::v5::publish_packet::QualityOfService, +use picoserve::{ + response::{self, IntoResponse, StatusCode}, + routing::{get, put_service, PathRouter}, + Router, }; use serde::Serialize; -use static_cell::StaticCell; mod error; @@ -40,213 +32,141 @@ pub enum Status<'a> { UpdateComplete, } -impl Status<'_> { - fn json(&self) -> Vec { - serde_json_core::to_vec(self) - .expect("This buffers size should be large enough to contain the serialized status") - } -} - -/// This is a wrapper around `BlockingFirmwareUpdater` that downloads signed updates -/// from a HTTPS url. -/// It also provides the current device status over MQTT -// TODO: Make this the owner of the blocking firmware updater -// TODO: When fixed, use the async firmware updater -pub struct Updater<'a, DFU, STATE> +#[derive(Clone, Copy)] +struct UpdaterService where - DFU: NorFlash, - STATE: NorFlash, + DFU: NorFlash + 'static, + STATE: NorFlash + 'static, DFU::Error: Format, { - updater: BlockingFirmwareUpdater<'a, DFU, STATE>, - - topic_status: &'static str, - version: &'static str, + updater: &'static Mutex>, public_key: &'static [u8; 32], } -impl<'a, DFU, STATE> Updater<'a, DFU, STATE> +impl UpdaterService where DFU: NorFlash, STATE: NorFlash, DFU::Error: Format, { - /// Wrap the `BlockingFirmwareUpdater` - pub fn new( - updater: BlockingFirmwareUpdater<'a, DFU, STATE>, - topic_status: &'static str, - version: &'static str, + fn new( + updater: &'static Mutex< + CriticalSectionRawMutex, + BlockingFirmwareUpdater<'static, DFU, STATE>, + >, public_key: &'static [u8; 32], ) -> Self { Self { updater, - topic_status, - version, public_key, } } +} - /// Set MQTT connection up to notify over MQTT when the device loses connection - pub fn add_will( +impl picoserve::routing::RequestHandlerService for UpdaterService +where + DFU: NorFlash + 'static, + STATE: NorFlash + 'static, + DFU::Error: Format, +{ + async fn call_request_handler_service< + R: Read, + W: picoserve::response::ResponseWriter, + >( &self, - config: &mut ClientConfig<'_, MAX_PROPERTIES, impl RngCore>, - ) { - static MSG: StaticCell> = StaticCell::new(); - let msg = MSG.init(Status::Disconnected.json()); - config.add_will(self.topic_status, msg, true); - } - - /// Mark the device is ready and booted, will notify over MQTT that the device is connected and the - /// currently running firmware version - pub async fn ready( - &mut self, - client: &mut MqttClient<'_, impl Write + Read, MAX_PROPERTIES, impl RngCore>, - ) -> Result<(), Error> { - let status = Status::Connected { - version: self.version, - } - .json(); - - client - .send_message(self.topic_status, &status, QualityOfService::QoS1, true) - .await?; - - self.updater.mark_booted()?; - - Ok(()) - } - - /// Download signed update from specified url and notify progress over MQTT - pub async fn update( - &mut self, - url: Url<'_>, - stack: &'static Stack, - rng: &mut (impl RngCore + CryptoRng), - client: &mut MqttClient<'_, impl Write + Read, MAX_PROPERTIES, impl RngCore>, - ) -> Result> { - let result = self._update(url, stack, rng, client).await; - - if let Err(err) = &result { - let status = Status::UpdateFailed { - error: &err.string(), + _state: &S, + _path_parameters: (), + mut request: picoserve::request::Request<'_, R>, + response_writer: W, + ) -> Result { + let mut updater = self.updater.lock().await; + let writer = match updater.prepare_update() { + Ok(writer) => writer, + Err(err) => { + return response::Response::new( + StatusCode::INTERNAL_SERVER_ERROR, + format_args!("{err:?}"), + ) + .write_to(request.body_connection.finalize().await?, response_writer) + .await; } - .json(); + }; - client - .send_message(self.topic_status, &status, QualityOfService::QoS1, false) - .await?; - } + let mut reader = request.body_connection.body().reader(); - result - } - - async fn _update( - &mut self, - url: Url<'_>, - stack: &'static Stack, - rng: &mut (impl RngCore + CryptoRng), - client: &mut MqttClient<'_, impl Write + Read, MAX_PROPERTIES, impl RngCore>, - ) -> Result> { - info!("Preparing for OTA..."); - let status = Status::PreparingUpdate.json(); - client - .send_message(self.topic_status, &status, QualityOfService::QoS1, false) - .await?; - - debug!("Making sure url is HTTPS"); - if url.scheme() != UrlScheme::HTTPS { - return Err(Error::InvalidScheme); - } - - // TODO: Clear out retained update message, currently gives implementation specific error - - let ip = stack.dns_query(url.host(), DnsQueryType::A).await?[0]; - - let mut rx_buffer = [0; 1024]; - let mut tx_buffer = [0; 1024]; - - let mut socket = TcpSocket::new(stack, &mut rx_buffer, &mut tx_buffer); - - let addr = (ip, url.port_or_default()); - debug!("Addr: {}", addr); - socket.connect(addr).await?; - - let mut read_record_buffer = [0; 16384 * 2]; - let mut write_record_buffer = [0; 16384]; - let mut tls: TlsConnection = - TlsConnection::new(socket, &mut read_record_buffer, &mut write_record_buffer); - tls.open::<_, NoVerify>(TlsContext::new(&TlsConfig::new(), rng)) - .await?; - - debug!("Path: {}", url.path()); - Request::get(url.path()) - .host(url.host()) - .build() - .write(&mut tls) - .await?; - - let mut headers = [0; 1024]; - let resp = Response::read(&mut tls, Method::GET, &mut headers).await?; - - let mut body = resp.body().reader(); - - debug!("Erasing flash..."); - let status = Status::Erasing.json(); - client - .send_message(self.topic_status, &status, QualityOfService::QoS1, false) - .await?; - - let writer = self.updater.prepare_update()?; - - debug!("Writing..."); - let status = Status::Writing { progress: 0 }.json(); - client - .send_message(self.topic_status, &status, QualityOfService::QoS1, false) - .await?; - - // The first 64 bytes of the file contain the signature let mut signature = [0; 64]; - body.read_exact(&mut signature).await?; + if let Err(err) = reader.read_exact(&mut signature).await { + return response::Response::new( + StatusCode::INTERNAL_SERVER_ERROR, + format_args!("{err:?}"), + ) + .write_to(request.body_connection.finalize().await?, response_writer) + .await; + } trace!("Signature: {:?}", signature); let mut buffer = AlignedBuffer([0; 4096]); let mut size = 0; - while let Ok(read) = body.read(&mut buffer.0).await { + while let Ok(read) = reader.read(&mut buffer.0).await { if read == 0 { break; } + debug!("Writing chunk: {}", read); - writer + if let Err(err) = writer .write(size, &buffer.0[..read]) - .map_err(Error::FlashError)?; + .map_err(Error::FlashError) + { + return response::Response::new( + StatusCode::INTERNAL_SERVER_ERROR, + format_args!("{err:?}"), + ) + .write_to(request.body_connection.finalize().await?, response_writer) + .await; + } size += read as u32; - - let status = Status::Writing { progress: size }.json(); - client - .send_message(self.topic_status, &status, QualityOfService::QoS1, false) - .await?; } - debug!("Total size: {}", size); - let status = Status::Verifying.json(); - client - .send_message(self.topic_status, &status, QualityOfService::QoS1, false) + let public_key = self.public_key; + if let Err(err) = updater.verify_and_mark_updated(public_key, &signature, size) { + return response::Response::new( + StatusCode::INTERNAL_SERVER_ERROR, + format_args!("{err:?}"), + ) + .write_to(request.body_connection.finalize().await?, response_writer) + .await; + } + + "Update complete" + .write_to(request.body_connection.finalize().await?, response_writer) .await?; - self.updater - .verify_and_mark_updated(self.public_key, &signature, size)?; + Timer::after(Duration::from_secs(1)).await; - let status = Status::UpdateComplete.json(); - client - .send_message(self.topic_status, &status, QualityOfService::QoS1, false) - .await?; - - client.disconnect().await?; - - info!("Restarting in 5 seconds..."); - Timer::after(Duration::from_secs(5)).await; - - cortex_m::peripheral::SCB::sys_reset() + cortex_m::peripheral::SCB::sys_reset(); } } + +pub fn firmware_router( + version: &'static str, + updater: &'static Mutex>, + public_key: &'static [u8; 32], +) -> Router, S> +where + DFU: NorFlash + 'static, + STATE: NorFlash + 'static, + DFU::Error: Format, +{ + let updater_service = UpdaterService::new(updater, public_key); + + Router::new() + .route("/update", put_service(updater_service)) + .route("/version", get(move || async move { version })) + .route( + "/reset", + get(|| async { + cortex_m::peripheral::SCB::sys_reset(); + }), + ) +}