diff --git a/Cargo.lock b/Cargo.lock index 75ab83a91..263feda7a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -149,9 +149,9 @@ checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" [[package]] name = "bytemuck" -version = "1.14.0" +version = "1.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" +checksum = "a2ef034f05691a48569bd920a96c81b9d91bbad1ab5ac7c4616c1f6ef36cb79f" [[package]] name = "byteorder" @@ -192,9 +192,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.31" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b" dependencies = [ "num-traits", ] @@ -297,9 +297,9 @@ dependencies = [ [[package]] name = "crc-any" -version = "2.4.3" +version = "2.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "774646b687f63643eb0f4bf13dc263cb581c8c9e57973b6ddf78bda3994d88df" +checksum = "c01a5e1f881f6fb6099a7bdf949e946719fd4f1fefa56264890574febf0eb6d0" dependencies = [ "debug-helper", ] @@ -348,9 +348,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.3" +version = "0.20.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" +checksum = "c376d08ea6aa96aafe61237c7200d1241cb177b7d3a542d791f2d118e9cbb955" dependencies = [ "darling_core", "darling_macro", @@ -358,27 +358,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.3" +version = "0.20.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" +checksum = "33043dcd19068b8192064c704b3f83eb464f91f1ff527b44a4e2b08d9cdb8855" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] name = "darling_macro" -version = "0.20.3" +version = "0.20.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" +checksum = "c5a91391accf613803c2a9bf9abccdbaa07c54b4244a5b64883f9c3c137c86be" dependencies = [ "darling_core", "quote", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] @@ -441,9 +441,9 @@ dependencies = [ [[package]] name = "either" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" [[package]] name = "embassy" @@ -495,7 +495,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] @@ -519,7 +519,6 @@ name = "embassy-http-server" version = "0.1.0" dependencies = [ "embassy-executor", - "embassy-net", "embassy-nrf", "embassy-sync 0.5.0", "embassy-time", @@ -855,6 +854,26 @@ dependencies = [ "log", ] +[[package]] +name = "enum-iterator" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fd242f399be1da0a5354aa462d57b4ab2b4ee0683cc552f7c007d2d12d36e94" +dependencies = [ + "enum-iterator-derive", +] + +[[package]] +name = "enum-iterator-derive" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03cdc46ec28bd728e67540c528013c6a10eb69a02eb31078a1bda695438cbfb8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.50", +] + [[package]] name = "equivalent" version = "1.0.1" @@ -868,7 +887,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys", ] [[package]] @@ -879,9 +898,9 @@ checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" [[package]] name = "fixed" -version = "1.24.0" +version = "1.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02c69ce7e7c0f17aa18fdd9d0de39727adb9c6281f2ad12f57cbe54ae6e76e7d" +checksum = "e29e5681dc8556fb9df1409e95eae050e12e8776394313da3546dcb8cf390c73" dependencies = [ "az", "bytemuck", @@ -912,9 +931,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" dependencies = [ "futures-channel", "futures-core", @@ -926,9 +945,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", "futures-sink", @@ -936,44 +955,44 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-io" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-macro" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] name = "futures-sink" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[package]] name = "futures-task" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-util" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-core", "futures-macro", @@ -1019,9 +1038,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if", "libc", @@ -1117,9 +1136,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.3" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd" [[package]] name = "httparse" @@ -1145,9 +1164,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.1.0" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" dependencies = [ "equivalent", "hashbrown 0.14.3", @@ -1155,13 +1174,13 @@ dependencies = [ [[package]] name = "is-terminal" -version = "0.4.9" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" dependencies = [ - "hermit-abi 0.3.3", - "rustix", - "windows-sys 0.48.0", + "hermit-abi 0.3.6", + "libc", + "windows-sys", ] [[package]] @@ -1244,9 +1263,9 @@ checksum = "744a4c881f502e98c2241d2e5f50040ac73b30194d64452bb6260393b53f0dc9" [[package]] name = "libc" -version = "0.2.151" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "libredox" @@ -1261,29 +1280,29 @@ dependencies = [ [[package]] name = "linkme" -version = "0.3.21" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "437a510b7d9717b70720ff35a13bbe203f985235dedd6473c72ac51d8312be23" +checksum = "1a78816ac097580aa7fd9d2e9cc7395dda34367c07267a8657516d4ad5e2e3d3" dependencies = [ "linkme-impl", ] [[package]] name = "linkme-impl" -version = "0.3.21" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de09dc283fb2f502fd8173d200675ea5ac0559f37c67b77166d75a67565c0e3d" +checksum = "ee9023a564f8bf7fe3da285a50c3e70de0df3e2bf277ff7c4e76d66008ef93b0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] name = "linux-raw-sys" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" [[package]] name = "litrs" @@ -1322,9 +1341,9 @@ checksum = "0ca88d725a0a943b096803bd34e73a4437208b6077654cc4ecb2947a5f91618d" [[package]] name = "memchr" -version = "2.6.4" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" [[package]] name = "microbit" @@ -1559,9 +1578,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.17" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" dependencies = [ "autocfg", ] @@ -1644,7 +1663,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" dependencies = [ "fixedbitset", - "indexmap 2.1.0", + "indexmap 2.2.3", ] [[package]] @@ -1825,29 +1844,29 @@ dependencies = [ [[package]] name = "ref-cast" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53313ec9f12686aeeffb43462c3ac77aa25f590a5f630eb2cde0de59417b29c7" +checksum = "c4846d4c50d1721b1a3bef8af76924eef20d5e723647333798c1b519b3a9473f" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2566c4bf6845f2c2e83b27043c3f5dfcd5ba8f2937d6c00dc009bfb51a079dc4" +checksum = "5fddb4f8d99b0a2ebafc65a87a69a7b9875e4b1ae1f00db265d300ef7f28bccc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] name = "regex" -version = "1.10.2" +version = "1.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" dependencies = [ "aho-corasick", "memchr", @@ -1857,9 +1876,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" dependencies = [ "aho-corasick", "memchr", @@ -1968,9 +1987,10 @@ dependencies = [ name = "riot-rs-macros" version = "0.1.0" dependencies = [ + "enum-iterator", "proc-macro-crate", "quote", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] @@ -2091,20 +2111,20 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.20", + "semver 1.0.22", ] [[package]] name = "rustix" -version = "0.38.28" +version = "0.38.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316" +checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" dependencies = [ "bitflags 2.4.2", "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys", ] [[package]] @@ -2115,9 +2135,9 @@ checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" [[package]] name = "ryu" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" [[package]] name = "scopeguard" @@ -2136,9 +2156,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.20" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" [[package]] name = "semver-parser" @@ -2148,29 +2168,29 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.193" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.193" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] name = "serde_json" -version = "1.0.108" +version = "1.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" dependencies = [ "itoa", "ryu", @@ -2185,9 +2205,9 @@ checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" [[package]] name = "smallvec" -version = "1.11.2" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" +checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" [[package]] name = "smoltcp" @@ -2299,9 +2319,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.49" +version = "2.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915aea9e586f80826ee59f8453c1101f9d1c4b3964cd2460185ee8e299ada496" +checksum = "74f1bdc9872430ce9b75da68329d1c1746faf50ffac5f19e02b71e37ff881ffb" dependencies = [ "proc-macro2", "quote", @@ -2310,15 +2330,14 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.8.1" +version = "3.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" +checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67" dependencies = [ "cfg-if", "fastrand", - "redox_syscall", "rustix", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] @@ -2334,37 +2353,37 @@ dependencies = [ [[package]] name = "termcolor" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff1bc3d3f05aff0403e8ac0d92ced918ec05b666a43f83297ccef5bea8a3d449" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" dependencies = [ "winapi-util", ] [[package]] name = "textwrap" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" +checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" [[package]] name = "thiserror" -version = "1.0.51" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f11c217e1416d6f036b870f14e0413d480dbf28edbee1f877abaf0206af43bb7" +checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.51" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01742297787513b79cf8e29d1056ede1313e2420b7b3b15d0a768b4921f549df" +checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.50", ] [[package]] @@ -2405,7 +2424,7 @@ version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.2.3", "toml_datetime", "winnow", ] @@ -2519,15 +2538,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - [[package]] name = "windows-sys" version = "0.52.0" diff --git a/examples/embassy-http-server/Cargo.toml b/examples/embassy-http-server/Cargo.toml index 6c103f57e..beaecbb12 100644 --- a/examples/embassy-http-server/Cargo.toml +++ b/examples/embassy-http-server/Cargo.toml @@ -6,12 +6,11 @@ edition.workspace = true publish = false [dependencies] -riot-rs = { path = "../../src/riot-rs", features = ["time", "override-network-config"] } +riot-rs = { path = "../../src/riot-rs", features = ["time", "override-network-config", "override-usb-config"] } riot-rs-boards = { path = "../../src/riot-rs-boards" } embassy-executor = { workspace = true, default-features = false } embassy-sync = { workspace = true } embassy-time = { workspace = true, default-features = false } -embassy-net = { workspace = true, features = ["tcp"] } embedded-io-async = "0.6.0" heapless = { workspace = true } httparse = { version = "1.8.0", default-features = false } diff --git a/examples/embassy-http-server/src/main.rs b/examples/embassy-http-server/src/main.rs index 994b7c9a5..5b027fcb4 100644 --- a/examples/embassy-http-server/src/main.rs +++ b/examples/embassy-http-server/src/main.rs @@ -8,7 +8,7 @@ mod routes; use riot_rs as _; -use riot_rs::embassy::network; +use riot_rs::embassy::{embassy_net, embassy_usb, network}; use riot_rs::rt::debug::println; use embassy_net::tcp::TcpSocket; @@ -128,8 +128,8 @@ fn web_server_init(spawner: &Spawner, peripherals: &mut OptionalPeripherals) { } } -#[no_mangle] -fn riot_rs_network_config() -> embassy_net::Config { +#[riot_rs::config(network)] +fn network_config() -> embassy_net::Config { use embassy_net::Ipv4Address; embassy_net::Config::ipv4_static(embassy_net::StaticConfigV4 { @@ -138,3 +138,20 @@ fn riot_rs_network_config() -> embassy_net::Config { gateway: Some(Ipv4Address::new(10, 42, 0, 1)), }) } + +#[riot_rs::config(usb)] +fn usb_config() -> embassy_usb::Config<'static> { + let mut config = embassy_usb::Config::new(0xc0de, 0xcafe); + config.manufacturer = Some("Embassy"); + config.product = Some("HTTP-over-USB-Ethernet example"); + config.serial_number = Some("12345678"); + config.max_power = 100; + config.max_packet_size_0 = 64; + + // Required for Windows support. + config.composite_with_iads = true; + config.device_class = 0xEF; + config.device_sub_class = 0x02; + config.device_protocol = 0x01; + config +} diff --git a/examples/embassy-net-tcp/src/main.rs b/examples/embassy-net-tcp/src/main.rs index 49533b90a..539707578 100644 --- a/examples/embassy-net-tcp/src/main.rs +++ b/examples/embassy-net-tcp/src/main.rs @@ -63,8 +63,8 @@ fn __init_tcp_echo(spawner: &Spawner, _peripherals: &mut OptionalPeripherals) { spawner.spawn(tcp_echo()).unwrap(); } -#[no_mangle] -fn riot_rs_network_config() -> embassy_net::Config { +#[riot_rs::config(network)] +fn network_config() -> embassy_net::Config { use embassy_net::Ipv4Address; embassy_net::Config::ipv4_static(embassy_net::StaticConfigV4 { diff --git a/examples/embassy-net-udp/src/main.rs b/examples/embassy-net-udp/src/main.rs index 1c213ae89..628752a8b 100644 --- a/examples/embassy-net-udp/src/main.rs +++ b/examples/embassy-net-udp/src/main.rs @@ -68,8 +68,8 @@ fn __init_udp_echo(spawner: &Spawner, _peripherals: &mut OptionalPeripherals) { spawner.spawn(udp_echo()).unwrap(); } -#[no_mangle] -fn riot_rs_network_config() -> embassy_net::Config { +#[riot_rs::config(network)] +fn network_config() -> embassy_net::Config { use embassy_net::Ipv4Address; embassy_net::Config::ipv4_static(embassy_net::StaticConfigV4 { diff --git a/src/riot-rs-embassy/src/lib.rs b/src/riot-rs-embassy/src/lib.rs index 9c4fd2bac..c4523e21c 100644 --- a/src/riot-rs-embassy/src/lib.rs +++ b/src/riot-rs-embassy/src/lib.rs @@ -32,6 +32,12 @@ pub use static_cell::make_static; pub use embassy_executor::Spawner; +// Crates used in driver configuration functions +#[cfg(feature = "net")] +pub use embassy_net; +#[cfg(feature = "usb")] +pub use embassy_usb; + #[cfg(feature = "usb")] use usb::ethernet::NetworkDevice; diff --git a/src/riot-rs-macros/Cargo.toml b/src/riot-rs-macros/Cargo.toml index f9f0ebcf3..2497cc60a 100644 --- a/src/riot-rs-macros/Cargo.toml +++ b/src/riot-rs-macros/Cargo.toml @@ -8,6 +8,7 @@ repository.workspace = true # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +enum-iterator = "1.5.0" proc-macro-crate = "3.1.0" quote = "1.0.35" syn = { version = "2.0.47", features = ["full"] } diff --git a/src/riot-rs-macros/src/config.rs b/src/riot-rs-macros/src/config.rs new file mode 100644 index 000000000..9b67b0ccc --- /dev/null +++ b/src/riot-rs-macros/src/config.rs @@ -0,0 +1,127 @@ +/// Register the function this attribute macro is applied on to provide the configuration for the +/// associated driver during initial system configuration. +/// +/// The name of the function does not matter as it will be renamed by the macro. +/// +/// # Parameters +/// +/// - The name of the driver the function provides configuration for. +/// +/// | Driver | Expected return type | +/// | --------- | ------------------------------ | +/// | `network` | `embassy_net::Config` | +/// | `usb` | `embassy_usb::Config<'static>` | +/// +/// # Note +/// +/// The `riot_rs` crate provides re-exports for the relevant Embassy crates. +/// +/// # Examples +/// +/// The following function provides configuration for the network stack: +/// +/// ```ignore +/// use riot_rs::embassy_net; +/// +/// #[riot_rs::config(network)] +/// fn network_config() -> embassy_net::Config { +/// use embassy_net::Ipv4Address; +/// +/// embassy_net::Config::ipv4_static(embassy_net::StaticConfigV4 { +/// address: embassy_net::Ipv4Cidr::new(Ipv4Address::new(10, 42, 0, 61), 24), +/// dns_servers: heapless::Vec::new(), +/// gateway: Some(Ipv4Address::new(10, 42, 0, 1)), +/// }) +/// } +/// ``` +#[allow(clippy::missing_panics_doc)] +#[proc_macro_attribute] +pub fn config(args: TokenStream, item: TokenStream) -> TokenStream { + use quote::{format_ident, quote}; + + let mut attrs = ConfigAttributes::default(); + let thread_parser = syn::meta::parser(|meta| attrs.parse(&meta)); + syn::parse_macro_input!(args with thread_parser); + + let config_function = syn::parse_macro_input!(item as syn::ItemFn); + let config_function_name = &config_function.sig.ident; + + let riot_rs_crate = utils::riot_rs_crate(); + + let (config_fn_name, return_type) = match attrs.kind { + Some(ConfigKind::Network) => ( + format_ident!("riot_rs_network_config"), + quote! {#riot_rs_crate::embassy::embassy_net::Config}, + ), + Some(ConfigKind::Usb) => ( + format_ident!("riot_rs_usb_config"), + quote! {#riot_rs_crate::embassy::embassy_usb::Config<'static>}, + ), + None => { + panic!("a configuration kind must be specified"); + } + }; + + // Place the provided function into another function whose type signature we enforce. + // This is important as that function will be called unsafely via FFI. + let expanded = quote! { + #[no_mangle] + fn #config_fn_name() -> #return_type { + #[inline(always)] + #config_function + + #config_function_name() + } + }; + + TokenStream::from(expanded) +} + +#[derive(Default)] +struct ConfigAttributes { + kind: Option, +} + +impl ConfigAttributes { + fn parse(&mut self, meta: &syn::meta::ParseNestedMeta) -> syn::Result<()> { + use enum_iterator::all; + + for (config_name, kind) in all::().map(|c| (c.as_name(), c)) { + if meta.path.is_ident(config_name) { + self.check_only_one_kind(config_name); + self.kind = Some(kind); + return Ok(()); + } + } + + let supported_params = all::() + .map(|c| format!("`{}`", c.as_name())) + .collect::>() + .join(", "); + Err(meta.error(format!( + "unsupported parameter ({supported_params} are supported)", + ))) + } + + fn check_only_one_kind(&self, param: &str) { + assert!( + self.kind.is_none(), + "a separate function is required for `{param}` configuration", + ); + } +} + +#[derive(Debug, enum_iterator::Sequence)] +enum ConfigKind { + Network, + Usb, +} + +impl ConfigKind { + fn as_name(&self) -> &'static str { + match self { + Self::Network => "network", + Self::Usb => "usb", + } + } +} diff --git a/src/riot-rs-macros/src/lib.rs b/src/riot-rs-macros/src/lib.rs index 9357f4e08..7d7b10f05 100644 --- a/src/riot-rs-macros/src/lib.rs +++ b/src/riot-rs-macros/src/lib.rs @@ -1,3 +1,8 @@ #![deny(clippy::pedantic)] +mod utils; + +use proc_macro::TokenStream; + +include!("config.rs"); include!("thread.rs"); diff --git a/src/riot-rs-macros/src/thread.rs b/src/riot-rs-macros/src/thread.rs index 63fb4671f..675c5c42f 100644 --- a/src/riot-rs-macros/src/thread.rs +++ b/src/riot-rs-macros/src/thread.rs @@ -1,9 +1,3 @@ -use proc_macro::TokenStream; -use quote::{format_ident, quote}; -use syn::{meta::ParseNestedMeta, ItemFn, LitInt}; - -const RIOT_RS_CRATE_NAME: &str = "riot-rs"; - // TODO: document default values (which may be platform-dependent) // TODO: document valid values /// Runs the function decorated with this attribute macro as a separate thread. @@ -39,11 +33,13 @@ const RIOT_RS_CRATE_NAME: &str = "riot-rs"; /// this macro is used. #[proc_macro_attribute] pub fn thread(args: TokenStream, item: TokenStream) -> TokenStream { + use quote::{format_ident, quote}; + let mut attrs = ThreadAttributes::default(); let thread_parser = syn::meta::parser(|meta| attrs.parse(&meta)); syn::parse_macro_input!(args with thread_parser); - let thread_function = syn::parse_macro_input!(item as ItemFn); + let thread_function = syn::parse_macro_input!(item as syn::ItemFn); let no_mangle_attr = if attrs.no_mangle { quote! {#[no_mangle]} @@ -58,31 +54,21 @@ pub fn thread(args: TokenStream, item: TokenStream) -> TokenStream { priority, } = ThreadParameters::from(attrs); - let this_crate = proc_macro_crate::crate_name(RIOT_RS_CRATE_NAME) - .unwrap_or_else(|_| panic!("{RIOT_RS_CRATE_NAME} should be present in `Cargo.toml`")); - let this_crate = match this_crate { - proc_macro_crate::FoundCrate::Itself => { - panic!( - "{} cannot be used as a dependency of itself", - env!("CARGO_CRATE_NAME"), - ); - } - proc_macro_crate::FoundCrate::Name(this_crate) => format_ident!("{}", this_crate), - }; + let riot_rs_crate = utils::riot_rs_crate(); let expanded = quote! { #no_mangle_attr #[inline(always)] #thread_function - #[#this_crate::linkme::distributed_slice(#this_crate::thread::THREAD_FNS)] - #[linkme(crate = #this_crate::linkme)] + #[#riot_rs_crate::linkme::distributed_slice(#riot_rs_crate::thread::THREAD_FNS)] + #[linkme(crate = #riot_rs_crate::linkme)] fn #slice_fn_name_ident() { fn trampoline(_arg: ()) { #fn_name(); } - let stack = #this_crate::static_cell::make_static!([0u8; #stack_size as usize]); - #this_crate::thread::thread_create(trampoline, (), stack, #priority); + let stack = #riot_rs_crate::static_cell::make_static!([0u8; #stack_size as usize]); + #riot_rs_crate::thread::thread_create(trampoline, (), stack, #priority); } }; @@ -123,7 +109,7 @@ impl From for ThreadParameters { } } -fn parse_base10_or_panic(lit_int: &LitInt, attr: &str) -> I +fn parse_base10_or_panic(lit_int: &syn::LitInt, attr: &str) -> I where I: core::str::FromStr, ::Err: std::fmt::Display, @@ -141,13 +127,13 @@ where #[derive(Default)] struct ThreadAttributes { - stack_size: Option, - priority: Option, + stack_size: Option, + priority: Option, no_mangle: bool, } impl ThreadAttributes { - fn parse(&mut self, meta: &ParseNestedMeta) -> syn::Result<()> { + fn parse(&mut self, meta: &syn::meta::ParseNestedMeta) -> syn::Result<()> { if meta.path.is_ident("stacksize") { self.stack_size = Some(meta.value()?.parse()?); Ok(()) diff --git a/src/riot-rs-macros/src/utils.rs b/src/riot-rs-macros/src/utils.rs new file mode 100644 index 000000000..996dfdf37 --- /dev/null +++ b/src/riot-rs-macros/src/utils.rs @@ -0,0 +1,18 @@ +use quote::format_ident; + +const RIOT_RS_CRATE_NAME: &str = "riot-rs"; + +pub fn riot_rs_crate() -> syn::Ident { + let riot_rs_crate = proc_macro_crate::crate_name(RIOT_RS_CRATE_NAME) + .unwrap_or_else(|_| panic!("{RIOT_RS_CRATE_NAME} should be present in `Cargo.toml`")); + + match riot_rs_crate { + proc_macro_crate::FoundCrate::Itself => { + panic!( + "{} cannot be used as a dependency of itself", + env!("CARGO_CRATE_NAME"), + ); + } + proc_macro_crate::FoundCrate::Name(riot_rs_crate) => format_ident!("{}", riot_rs_crate), + } +} diff --git a/src/riot-rs/src/lib.rs b/src/riot-rs/src/lib.rs index 9b893d907..ec0b7c007 100644 --- a/src/riot-rs/src/lib.rs +++ b/src/riot-rs/src/lib.rs @@ -8,8 +8,11 @@ pub use riot_rs_buildinfo as buildinfo; pub use riot_rs_embassy::{self as embassy, define_peripherals}; pub use riot_rs_rt as rt; +// Attribute macros +pub use riot_rs_macros::config; #[cfg(feature = "threading")] pub use riot_rs_macros::thread; + #[cfg(feature = "threading")] pub use riot_rs_threads as thread;