diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..c76618a --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,1398 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aho-corasick" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +dependencies = [ + "memchr", +] + +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi", +] + +[[package]] +name = "anyhow" +version = "1.0.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f9b8508dccb7687a1d6c4ce66b2b0ecef467c94667de27d8d7fe1f8d2a9cdc" +dependencies = [ + "backtrace", +] + +[[package]] +name = "async-trait" +version = "0.1.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed6aa3524a2dfcf9fe180c51eae2b58738348d819517ceadf95789c51fff7600" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "backtrace" +version = "0.3.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11a17d453482a265fd5f8479f2a3f405566e6ca627837aaddb85af8b1ab8ef61" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base64" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" + +[[package]] +name = "bindgen" +version = "0.59.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bd2a9a458e8f4304c52c43ebb0cfbd520289f8379a52e329a38afda99bf8eb8" +dependencies = [ + "bitflags", + "cexpr", + "clang-sys", + "clap", + "env_logger", + "lazy_static", + "lazycell", + "log", + "peeking_take_while", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "which", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bstr" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" +dependencies = [ + "memchr", +] + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "cc" +version = "1.0.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "clang-sys" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cc00842eed744b858222c4c9faf7243aafc6d33f92f96935263ef4d8a41ce21" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "clap" +version = "2.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" +dependencies = [ + "ansi_term", + "atty", + "bitflags", + "strsim", + "textwrap", + "unicode-width", + "vec_map", +] + +[[package]] +name = "cmake" +version = "0.1.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8ad8cef104ac57b68b89df3208164d228503abbdce70f6880ffa3d970e7443a" +dependencies = [ + "cc", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aaa7bd5fb665c6864b5f963dd9097905c54125909c7aa94c9e18507cdbe6c53" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1145cf131a2c6ba0615079ab6a638f7e1973ac9c2634fcbeaaad6114246efe8c" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils", + "lazy_static", + "memoffset", + "scopeguard", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf124c720b7686e3c2663cf54062ab0f68a88af2fb6a030e87e30bf721fcb38" +dependencies = [ + "cfg-if", + "lazy_static", +] + +[[package]] +name = "cstr_core" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "644828c273c063ab0d39486ba42a5d1f3a499d35529c759e763a9c6cb8a0fb08" +dependencies = [ + "cty", + "memchr", +] + +[[package]] +name = "cty" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" + +[[package]] +name = "darling" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" +dependencies = [ + "darling_core", + "quote", + "syn", +] + +[[package]] +name = "dirs" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "either" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" +dependencies = [ + "serde", +] + +[[package]] +name = "embedded-hal" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35949884794ad573cf46071e41c9b60efb0cb311e3ca01f7af807af1debc66ff" +dependencies = [ + "nb 0.1.3", + "void", +] + +[[package]] +name = "embedded-hal" +version = "1.0.0-alpha.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3babfc7fd332142a0b11aebf592992f211f4e01b6222fb04b03aba1bd80018d" +dependencies = [ + "nb 1.0.0", +] + +[[package]] +name = "embedded-svc" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dade128a58c28921dda933a5040ff4da2564c70eb40398526d820c5744b184f0" +dependencies = [ + "anyhow", + "async-trait", + "either", + "enumset", + "http-auth-basic", + "log", + "no-std-net", + "num_enum", + "serde", + "serde_json", + "strum 0.21.0", + "strum_macros 0.21.1", + "url", +] + +[[package]] +name = "embedded-svc" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e99ddc8bfda2f42942abb4198cab65e57b7aa92f35356bf3609e67957815728" +dependencies = [ + "anyhow", + "enumset", + "http-auth-basic", + "log", + "no-std-net", + "num_enum", + "serde", + "serde_json", + "strum 0.23.0", +] + +[[package]] +name = "embuild" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bc16ec3ed3e8c7bfa3d03dd02c5db29a7bc2ed906f3c34cb986778c3f969248" +dependencies = [ + "anyhow", + "bindgen", + "bitflags", + "cmake", + "dirs", + "globwalk", + "log", + "remove_dir_all 0.7.0", + "serde", + "serde_json", + "shlex", + "strum 0.24.0", + "tempfile", + "thiserror", + "toml", + "which", + "xmas-elf", +] + +[[package]] +name = "enumset" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4799cdb24d48f1f8a7a98d06b7fde65a85a2d1e42b25a889f5406aa1fbefe074" +dependencies = [ + "enumset_derive", + "serde", +] + +[[package]] +name = "enumset_derive" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea83a3fbdc1d999ccfbcbee717eab36f8edf2d71693a23ce0d7cca19e085304c" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "env_logger" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b2cf0344971ee6c64c31be0d530793fba457d322dfec2810c453d0ef228f9c3" +dependencies = [ + "atty", + "humantime", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "esp-idf-hal" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c4590e9cc91a22315166a30d83e2c70ab6a317342efe2642950827fdc231ad" +dependencies = [ + "anyhow", + "embedded-hal 0.2.7", + "embedded-hal 1.0.0-alpha.8", + "embedded-svc 0.21.1", + "embuild", + "esp-idf-sys", + "nb 0.1.3", +] + +[[package]] +name = "esp-idf-svc" +version = "0.41.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0c10e378cba07d91d1ab4ed0f71e774ca3c82986c36f92edaa2ac2bc864fb8d" +dependencies = [ + "anyhow", + "cstr_core", + "embedded-svc 0.21.1", + "embuild", + "enumset", + "esp-idf-hal", + "esp-idf-sys", + "log", +] + +[[package]] +name = "esp-idf-sys" +version = "0.31.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b239e46fe930f21ed36a25de1b6d29a0e22b65166f3a8e44624095a671f2f56c" +dependencies = [ + "anyhow", + "bindgen", + "embuild", + "paste", + "regex", + "strum 0.24.0", +] + +[[package]] +name = "fastrand" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf" +dependencies = [ + "instant", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +dependencies = [ + "matches", + "percent-encoding", +] + +[[package]] +name = "getrandom" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "gimli" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4" + +[[package]] +name = "glob" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" + +[[package]] +name = "globset" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10463d9ff00a2a068db14231982f5132edebad0d7660cd956a1c30292dbcbfbd" +dependencies = [ + "aho-corasick", + "bstr", + "fnv", + "log", + "regex", +] + +[[package]] +name = "globwalk" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93e3af942408868f6934a7b85134a3230832b9977cf66125df2f9edcfce4ddcc" +dependencies = [ + "bitflags", + "ignore", + "walkdir", +] + +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "heck" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "http-auth-basic" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df69b6a68474b935f436fb9c84139f32de4f7759810090d1a3a5e592553f7ee0" +dependencies = [ + "base64", +] + +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "ignore" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "713f1b139373f96a2e0ce3ac931cd01ee973c3c5dd7c40c0c2efe96ad2b6751d" +dependencies = [ + "crossbeam-utils", + "globset", + "lazy_static", + "log", + "memchr", + "regex", + "same-file", + "thread_local", + "walkdir", + "winapi-util", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "itoa" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + +[[package]] +name = "libc" +version = "0.2.125" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5916d2ae698f6de9bfb891ad7a8d65c09d232dc58cc4ac433c7da3b2fd84bc2b" + +[[package]] +name = "libloading" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efbc0f03f9a775e9f6aed295c6a1ba2253c5757a9e03d55c6caa46a681abcddd" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "log" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "matches" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" + +[[package]] +name = "maud" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59d449907de7d1ae5b290cbaf9ea34a8a7df3fa5db027664bb55bb2b0fc1407c" +dependencies = [ + "maud_htmlescape", + "maud_macros", +] + +[[package]] +name = "maud_htmlescape" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0555daa37f94b5ebb206faf8cdc7b260c2aa371b509e929de9a1e37416d97fa6" + +[[package]] +name = "maud_macros" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6896f8e8cdcea80b99ac0f1f7a233708e640737a8517448f50500e401bb8d76" +dependencies = [ + "maud_htmlescape", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2b29bd4bc3f33391105ebee3589c19197c4271e3e5a9ec9bfe8127eeff8f082" +dependencies = [ + "adler", +] + +[[package]] +name = "nb" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "801d31da0513b6ec5214e9bf433a77966320625a37860f910be265be6e18d06f" +dependencies = [ + "nb 1.0.0", +] + +[[package]] +name = "nb" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "546c37ac5d9e56f55e73b677106873d9d9f5190605e41a856503623648488cae" + +[[package]] +name = "no-std-net" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bcece43b12349917e096cddfa66107277f123e6c96a5aea78711dc601a47152" +dependencies = [ + "serde", +] + +[[package]] +name = "nom" +version = "7.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "num_cpus" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf5395665662ef45796a4ff5486c5d41d29e0c09640af4c5f17fd94ee2c119c9" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0498641e53dd6ac1a4f22547548caa6864cc4933784319cd1775271c5a46ce" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "num_threads" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +dependencies = [ + "libc", +] + +[[package]] +name = "object" +version = "0.28.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40bec70ba014595f99f7aa110b84331ffe1ee9aece7fe6f387cc7e3ecda4d456" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" + +[[package]] +name = "paste" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c520e05135d6e763148b6426a837e239041653ba7becd2e538c076c738025fc" + +[[package]] +name = "peeking_take_while" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" + +[[package]] +name = "percent-encoding" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" + +[[package]] +name = "proc-macro-crate" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17d47ce914bf4de440332250b0edd23ce48c005f59fab39d3335866b114f11a" +dependencies = [ + "thiserror", + "toml", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec757218438d5fda206afc041538b2f6d889286160d649a86a24d37e1235afd1" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quick-protobuf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ca6639207ac869e31cca06b8adbc7676278f22b321e51115766009b4f192dbb" +dependencies = [ + "byteorder", +] + +[[package]] +name = "quote" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rayon" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd249e82c21598a9a426a4e00dd7adc1d640b22445ec8545feef801d1a74c221" +dependencies = [ + "autocfg", + "crossbeam-deque", + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f51245e1e62e1f1629cbfec37b5793bbabcaeb90f30e94d2ba03564687353e4" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-utils", + "num_cpus", +] + +[[package]] +name = "redox_syscall" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_users" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +dependencies = [ + "getrandom", + "redox_syscall", + "thiserror", +] + +[[package]] +name = "regex" +version = "1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" + +[[package]] +name = "remove_dir_all" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +dependencies = [ + "winapi", +] + +[[package]] +name = "remove_dir_all" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "882f368737489ea543bc5c340e6f3d34a28c39980bd9a979e47322b26f60ac40" +dependencies = [ + "libc", + "log", + "num_cpus", + "rayon", + "winapi", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustversion" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2cc38e8fa666e2de3c4aba7edeb5ffc5246c1c2ed0e3d17e560aeeba736b23f" + +[[package]] +name = "rusty-espresso" +version = "0.1.0" +dependencies = [ + "anyhow", + "embedded-svc 0.14.0", + "embuild", + "esp-idf-hal", + "esp-idf-svc", + "esp-idf-sys", + "log", + "maud", + "quick-protobuf", + "time", +] + +[[package]] +name = "ryu" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "serde" +version = "1.0.137" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.137" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "shlex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" + +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + +[[package]] +name = "strum" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aaf86bbcfd1fa9670b7a129f64fc0c9fcbbfe4f1bc4210e9e98fe71ffc12cde2" + +[[package]] +name = "strum" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cae14b91c7d11c9a851d3fbc80a963198998c2a64eec840477fa92d8ce9b70bb" +dependencies = [ + "strum_macros 0.23.1", +] + +[[package]] +name = "strum" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e96acfc1b70604b8b2f1ffa4c57e59176c7dbb05d556c71ecd2f5498a1dee7f8" +dependencies = [ + "strum_macros 0.24.0", +] + +[[package]] +name = "strum_macros" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d06aaeeee809dbc59eb4556183dd927df67db1540de5be8d3ec0b6636358a5ec" +dependencies = [ + "heck 0.3.3", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "strum_macros" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bb0dc7ee9c15cea6199cde9a127fa16a4c5819af85395457ad72d68edc85a38" +dependencies = [ + "heck 0.3.3", + "proc-macro2", + "quote", + "rustversion", + "syn", +] + +[[package]] +name = "strum_macros" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6878079b17446e4d3eba6192bb0a2950d5b14f0ed8424b852310e5a94345d0ef" +dependencies = [ + "heck 0.4.0", + "proc-macro2", + "quote", + "rustversion", + "syn", +] + +[[package]] +name = "syn" +version = "1.0.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ff7c592601f11445996a06f8ad0c27f094a58857c2f89e97974ab9235b92c52" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "tempfile" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +dependencies = [ + "cfg-if", + "fastrand", + "libc", + "redox_syscall", + "remove_dir_all 0.5.3", + "winapi", +] + +[[package]] +name = "termcolor" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "thiserror" +version = "1.0.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread_local" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180" +dependencies = [ + "once_cell", +] + +[[package]] +name = "time" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2702e08a7a860f005826c6815dcac101b19b5eb330c27fe4a5928fec1d20ddd" +dependencies = [ + "itoa", + "libc", + "num_threads", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" + +[[package]] +name = "toml" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" +dependencies = [ + "serde", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" + +[[package]] +name = "unicode-normalization" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" + +[[package]] +name = "unicode-width" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" + +[[package]] +name = "unicode-xid" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04" + +[[package]] +name = "url" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +dependencies = [ + "form_urlencoded", + "idna", + "matches", + "percent-encoding", +] + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[package]] +name = "walkdir" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" +dependencies = [ + "same-file", + "winapi", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" + +[[package]] +name = "which" +version = "4.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c4fb54e6113b6a8772ee41c3404fb0301ac79604489467e0a9ce1f3e97c24ae" +dependencies = [ + "either", + "lazy_static", + "libc", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "xmas-elf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d29b4d8e7beaceb4e77447ba941a7600d23d0319ab52da0461abea214832d5a" +dependencies = [ + "zero", +] + +[[package]] +name = "zero" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f1bc8a6b2005884962297587045002d8cfb8dcec9db332f4ca216ddc5de82c5" diff --git a/nvs.csv b/nvs.csv new file mode 100644 index 0000000..c2ae83b --- /dev/null +++ b/nvs.csv @@ -0,0 +1,5 @@ +key,type,encoding,value +data,namespace,,data +ssid,data,hex2bin,776c616e41 +password,data,hex2bin,537570657253696c656e6365 +authmethod,data,hex2bin,57504132506572736f6e616c diff --git a/partition.csv b/partition.csv new file mode 100644 index 0000000..439d983 --- /dev/null +++ b/partition.csv @@ -0,0 +1,5 @@ +# ESP-IDF Partition Table +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 0x6000, +phy_init, data, phy, 0xf000, 0x1000, +factory, app, factory, 0x10000, 1M, diff --git a/rerun.sh b/rerun.sh new file mode 100644 index 0000000..ab9b50b --- /dev/null +++ b/rerun.sh @@ -0,0 +1,4 @@ +cargo clean --release -p esp-idf-svc +cargo build --release --example nvs-example +espflash --partition-table partition.csv /dev/ttyUSB0 target/xtensa-esp32-espidf/release/examples/nvs-example +parttool.py --partition-table-file partition.csv --port /dev/ttyUSB0 write_partition --partition-name=nvs --input "nvs.bin" diff --git a/run.sh b/run.sh new file mode 100644 index 0000000..521a6eb --- /dev/null +++ b/run.sh @@ -0,0 +1,3 @@ +espflash --partition-table partition.csv /dev/ttyUSB0 target/xtensa-esp32-espidf/release/rusty-espresso +parttool.py --partition-table-file partition.csv --port /dev/ttyUSB0 write_partition --partition-name=nvs --input "nvs.bin" +espmonitor --speed 115200 /dev/ttyUSB0 --bin target/xtensa-esp32-espidf/release/rusty-espresso diff --git a/src/api_pid_get.json b/src/api_pid_get.json new file mode 100644 index 0000000..6377baf --- /dev/null +++ b/src/api_pid_get.json @@ -0,0 +1,5 @@ +{ + "target" : 96.2, + "current": 92.4, + "enabled": false +} diff --git a/src/api_pid_post.json b/src/api_pid_post.json new file mode 100644 index 0000000..cae8568 --- /dev/null +++ b/src/api_pid_post.json @@ -0,0 +1,5 @@ +{ + "target": 96.2, + "enabled": false +} + diff --git a/src/backup_manager.rs b/src/backup_manager.rs new file mode 100644 index 0000000..17e159c --- /dev/null +++ b/src/backup_manager.rs @@ -0,0 +1,73 @@ +use std::cmp; +use std::sync::mpsc::{channel, Receiver, Sender}; +use std::sync::Arc; +use std::thread; +use std::vec::Vec; + +use esp_idf_svc::nvs::EspDefaultNvs; +use esp_idf_svc::nvs_storage::EspNvsStorage; +use embedded_svc::storage::Storage; + +pub type BackupManagerTx = Sender; + +pub struct BackupManager { + pub tx: BackupManagerTx, + join_handle: thread::JoinHandle<()>, +} + +struct BackupManagerInner { +} + +pub enum BackupManagerMessage { + Save(String, Vec, Sender), + Load(String, Sender>>), + GetNvs(Sender>), +} + +impl BackupManager { + pub fn new() -> Self { + let (tx, rx) = channel(); + let mut inner = BackupManagerInner { + }; + let jh = thread::spawn(move || inner.serve(rx)); + + BackupManager { + tx: tx, + join_handle: jh, + } + } + + pub fn get_sender(&self) -> BackupManagerTx { + self.tx.clone() + } +} + +impl BackupManagerInner { + fn serve(&mut self, rx: Receiver) { + let mut nvs = Arc::new(EspDefaultNvs::new().unwrap()); + let mut nvs_store = EspNvsStorage::new_default(Arc::clone(&nvs), "data", true).unwrap(); + + loop { + match rx.recv() { + Err(x) => { + // some error reading from the channel, bail + break; + } + Ok(msg) => match msg { + BackupManagerMessage::Save(key, value, resp) => { + let result = nvs_store.put_raw(key, value).unwrap(); + resp.send(result).unwrap_or(()); + }, + BackupManagerMessage::Load(key, resp) => { + let value = nvs_store.get_raw(key).unwrap(); + resp.send(value).unwrap_or(()); + }, + BackupManagerMessage::GetNvs(resp) => { + resp.send(Arc::clone(&nvs)).unwrap_or(()) + }, + } + } // match rx.recv() + } // loop + () // exit + } +} diff --git a/src/index.html b/src/index.html new file mode 100644 index 0000000..1d7d306 --- /dev/null +++ b/src/index.html @@ -0,0 +1,24 @@ + + + + + Rusty Espresso Controller + + +

Rusty Espresso Controller

+

© 2021 Jakob Dalsgaard

+

Check the official homepage for more information: https://rusty-espresso.dalsgaard.net/.

+ diff --git a/src/mod.rs b/src/mod.rs new file mode 100644 index 0000000..3598bf9 --- /dev/null +++ b/src/mod.rs @@ -0,0 +1 @@ +pub mod s11n; diff --git a/src/pid_manager.rs b/src/pid_manager.rs new file mode 100644 index 0000000..5427a7a --- /dev/null +++ b/src/pid_manager.rs @@ -0,0 +1,209 @@ +use std::cmp; +use std::sync::mpsc::{channel, Receiver, Sender}; +use std::sync::Arc; +use std::thread; +use std::vec::Vec; + +use std::collections::HashMap; + +use quick_protobuf::{Writer, MessageWrite}; +use std::borrow::Cow; +use std::convert::Into; + +use crate::s11n::converter; +use crate::s11n::pb::pid1; +use crate::backup_manager::BackupManagerTx; + + +pub type PidManagerTx = Sender; + +pub struct PidManager { + pub tx: PidManagerTx, + join_handle: thread::JoinHandle<()>, +} + +struct PidManagerInner { + library: PidDataLibrary, + current_pid_data: Option, + nvs_store: BackupManagerTx, +} + +#[derive(Clone)] +struct PidData { + p: f64, + i: f64, + d: f64, +} + +#[derive(Clone)] +struct PidDataLibraryItem { + item_name: String, + data: PidData, +} + +#[derive(Clone)] +struct PidDataLibrary { + items: HashMap, +} + +pub enum PidManagerMessage { + CreatePidData(String, Sender>), + DeletePidData(u16), + UpdatePidDataName(u16, String), + UpdatePidData(u16, PidData), + SetActivePidData(u16), + GetLibraryItemsList(Sender>), + GetLibraryItem(u16, Sender>), +} + +impl PidManager { + pub fn new(nvs: &BackupManagerTx) -> Self { + let (tx, rx) = channel(); + let mut inner = PidManagerInner { + library: PidDataLibrary { + items: HashMap::new(), + }, + current_pid_data: None, + nvs_store: nvs.clone(), + }; + let jh = thread::spawn(move || inner.serve(rx)); + + PidManager { + tx: tx, + join_handle: jh, + } + } + + pub fn get_sender(&self) -> PidManagerTx { + self.tx.clone() + } +} + +impl PidManagerInner { + fn serve(&mut self, rx: Receiver) { + loop { + match rx.recv() { + Err(x) => { + // some error reading from the channel, bail + break; + } + Ok(msg) => match msg { + PidManagerMessage::CreatePidData(name, resp) => { + // we only allow 16 sets of piddata + if self.library.items.len() >= 16 { + resp.send(None).unwrap_or(()); + } else { + // get current max item_id and increment by 1 + let new_id = self.library.items.keys().max().unwrap_or(&0) + 1; + let item = PidDataLibraryItem { + item_name: name.clone(), + data: PidData { + p: 0.0f64, + i: 0.0f64, + d: 0.0f64, + }, + }; + self.library.items.insert(new_id.clone(), item); + resp.send(Some(new_id.clone())).unwrap_or(()); + } + }, + PidManagerMessage::DeletePidData(id) => { + self.library.items.remove(&id); + }, + PidManagerMessage::UpdatePidDataName(id, name) => { + if let Some(item) = self.library.items.get_mut(&id) { + item.item_name = name; + } + }, + PidManagerMessage::UpdatePidData(id, data) => { + if let Some(library_item) = self.library.items.get_mut(&id) { + library_item.data = data; + } + }, + PidManagerMessage::SetActivePidData(id) => { + if let Some(pid_data) = self.library.items.get(&id) { + self.current_pid_data = Some(pid_data.data.clone()); + } + }, + PidManagerMessage::GetLibraryItemsList(sender) => { + let res = self + .library + .items + .iter() + .map(|(k, v)| (*k, v.item_name.clone())) + .collect(); + sender.send(res).unwrap_or(()); + }, + PidManagerMessage::GetLibraryItem(id, sender) => { + if let Some(item) = self.library.items.get(&id) { + sender.send(Some(item.clone())).unwrap_or(()); + } else { + sender.send(None).unwrap_or(()); + } + }, + }, // end of enum match + } // end of Err/Some match + } // end of loop + () // exit + } + + fn backup(&mut self) { + let v: pid1::PidDataLibrary = self.library.to_owned().into(); + let mut vb = Vec::new(); + vb.extend([0x00, 0x01]); + vb.extend(converter::serialise(v)); + // sender.send(vb); + } + + fn restore(&mut self, bytesv: &Vec) { + if let converter::Input::Pid1(pb) = converter::parse(&bytesv) { + self.library = PidDataLibrary::from(pb); + } else { + // do nothing + } + } + } + +impl<'a> From> for PidDataLibraryItem { + fn from(v: pid1::PidData<'a>) -> Self { + PidDataLibraryItem { + item_name: v.name.to_string(), + data: PidData { + p: v.p, + i: v.i, + d: v.d, + } + } + } +} + +impl<'a> From> for PidDataLibrary { + fn from(v: pid1::PidDataLibrary<'a>) -> Self { + PidDataLibrary { + items: v.items.iter().fold(HashMap::new(), |mut acc, (k, v)| { acc.insert(*k as u16, PidDataLibraryItem::from(v.to_owned())); acc }), + } + } +} + +impl<'a> Into> for PidDataLibraryItem { + fn into(self) -> pid1::PidData<'a> { + pid1::PidData { + name: Cow::Owned(self.item_name), + p: self.data.p, + i: self.data.i, + d: self.data.d, + created: 0, + modified: 0, + } + } +} + +impl<'a> Into> for PidDataLibrary { + fn into(self) -> pid1::PidDataLibrary<'a> { + pid1::PidDataLibrary { + items: self.items.iter().fold(HashMap::new(), |mut acc, (k, v)| { acc.insert(*k as u32, v.to_owned().into()); acc }), + } + } +} + + diff --git a/src/s11n/converter.rs b/src/s11n/converter.rs new file mode 100644 index 0000000..f941e21 --- /dev/null +++ b/src/s11n/converter.rs @@ -0,0 +1,43 @@ +use crate::s11n::pb; +use quick_protobuf::{deserialize_from_slice, serialize_into_vec, Reader, Writer, MessageWrite}; + +pub enum Input<'a> { + Wifi1(pb::wifi1::WifiData<'a>), + Pid1(pb::pid1::PidDataLibrary<'a>), + Empty, +} + +pub fn parse<'a>(b: &'a Vec) -> Input<'a> { + if b.len() < 2 { + return Input::Empty; + } + + let header: u16 = (b[0] as u16) << 8 | (b[0] as u16); + + match header { + 1 => { // this is a PidLibrary version 1 + if let Ok(v) = deserialize_from_slice(&b[2..]) { + Input::Pid1(v) + } else { + Input::Empty + } + }, + 2 => { // this is a WifiLibrary version 1 + if let Ok(v) = deserialize_from_slice(&b[2..]) { + Input::Wifi1(v) + } + else { + Input::Empty + } + }, + _ => { // everything else... + Input::Empty + } + } + +} + +pub fn serialise (p: T) -> Vec { + serialize_into_vec(&p).unwrap() +} + diff --git a/src/s11n/mod.rs b/src/s11n/mod.rs new file mode 100644 index 0000000..2e35489 --- /dev/null +++ b/src/s11n/mod.rs @@ -0,0 +1,3 @@ +pub mod converter; +// Automatically generated mod.rs +pub mod pb; diff --git a/src/s11n/pb/mod.rs b/src/s11n/pb/mod.rs new file mode 100644 index 0000000..545d901 --- /dev/null +++ b/src/s11n/pb/mod.rs @@ -0,0 +1,3 @@ +// Automatically generated mod.rs +pub mod pid1; +pub mod wifi1; diff --git a/src/s11n/pb/pid1.rs b/src/s11n/pb/pid1.rs new file mode 100644 index 0000000..e45b516 --- /dev/null +++ b/src/s11n/pb/pid1.rs @@ -0,0 +1,103 @@ +// Automatically generated rust module for 'pid1.proto' file + +#![allow(non_snake_case)] +#![allow(non_upper_case_globals)] +#![allow(non_camel_case_types)] +#![allow(unused_imports)] +#![allow(unknown_lints)] +#![allow(clippy::all)] +#![cfg_attr(rustfmt, rustfmt_skip)] + + +use std::borrow::Cow; +use std::collections::HashMap; +type KVMap = HashMap; +use quick_protobuf::{MessageRead, MessageWrite, BytesReader, Writer, WriterBackend, Result}; +use quick_protobuf::sizeofs::*; +use super::super::*; + +#[derive(Debug, Default, PartialEq, Clone)] +pub struct PidData<'a> { + pub name: Cow<'a, str>, + pub created: u64, + pub modified: u64, + pub p: f64, + pub i: f64, + pub d: f64, +} + +impl<'a> MessageRead<'a> for PidData<'a> { + fn from_reader(r: &mut BytesReader, bytes: &'a [u8]) -> Result { + let mut msg = Self::default(); + while !r.is_eof() { + match r.next_tag(bytes) { + Ok(34) => msg.name = r.read_string(bytes).map(Cow::Borrowed)?, + Ok(40) => msg.created = r.read_uint64(bytes)?, + Ok(48) => msg.modified = r.read_uint64(bytes)?, + Ok(81) => msg.p = r.read_double(bytes)?, + Ok(89) => msg.i = r.read_double(bytes)?, + Ok(97) => msg.d = r.read_double(bytes)?, + Ok(t) => { r.read_unknown(bytes, t)?; } + Err(e) => return Err(e), + } + } + Ok(msg) + } +} + +impl<'a> MessageWrite for PidData<'a> { + fn get_size(&self) -> usize { + 0 + + if self.name == "" { 0 } else { 1 + sizeof_len((&self.name).len()) } + + if self.created == 0u64 { 0 } else { 1 + sizeof_varint(*(&self.created) as u64) } + + if self.modified == 0u64 { 0 } else { 1 + sizeof_varint(*(&self.modified) as u64) } + + if self.p == 0f64 { 0 } else { 1 + 8 } + + if self.i == 0f64 { 0 } else { 1 + 8 } + + if self.d == 0f64 { 0 } else { 1 + 8 } + } + + fn write_message(&self, w: &mut Writer) -> Result<()> { + if self.name != "" { w.write_with_tag(34, |w| w.write_string(&**&self.name))?; } + if self.created != 0u64 { w.write_with_tag(40, |w| w.write_uint64(*&self.created))?; } + if self.modified != 0u64 { w.write_with_tag(48, |w| w.write_uint64(*&self.modified))?; } + if self.p != 0f64 { w.write_with_tag(81, |w| w.write_double(*&self.p))?; } + if self.i != 0f64 { w.write_with_tag(89, |w| w.write_double(*&self.i))?; } + if self.d != 0f64 { w.write_with_tag(97, |w| w.write_double(*&self.d))?; } + Ok(()) + } +} + +#[derive(Debug, Default, PartialEq, Clone)] +pub struct PidDataLibrary<'a> { + pub items: KVMap>, +} + +impl<'a> MessageRead<'a> for PidDataLibrary<'a> { + fn from_reader(r: &mut BytesReader, bytes: &'a [u8]) -> Result { + let mut msg = Self::default(); + while !r.is_eof() { + match r.next_tag(bytes) { + Ok(34) => { + let (key, value) = r.read_map(bytes, |r, bytes| Ok(r.read_uint32(bytes)?), |r, bytes| Ok(r.read_message::(bytes)?))?; + msg.items.insert(key, value); + } + Ok(t) => { r.read_unknown(bytes, t)?; } + Err(e) => return Err(e), + } + } + Ok(msg) + } +} + +impl<'a> MessageWrite for PidDataLibrary<'a> { + fn get_size(&self) -> usize { + 0 + + self.items.iter().map(|(k, v)| 1 + sizeof_len(2 + sizeof_varint(*(k) as u64) + sizeof_len((v).get_size()))).sum::() + } + + fn write_message(&self, w: &mut Writer) -> Result<()> { + for (k, v) in self.items.iter() { w.write_with_tag(34, |w| w.write_map(2 + sizeof_varint(*(k) as u64) + sizeof_len((v).get_size()), 8, |w| w.write_uint32(*k), 18, |w| w.write_message(v)))?; } + Ok(()) + } +} + diff --git a/src/s11n/pb/wifi1.rs b/src/s11n/pb/wifi1.rs new file mode 100644 index 0000000..aeece40 --- /dev/null +++ b/src/s11n/pb/wifi1.rs @@ -0,0 +1,148 @@ +// Automatically generated rust module for 'wifi1.proto' file + +#![allow(non_snake_case)] +#![allow(non_upper_case_globals)] +#![allow(non_camel_case_types)] +#![allow(unused_imports)] +#![allow(unknown_lints)] +#![allow(clippy::all)] +#![cfg_attr(rustfmt, rustfmt_skip)] + + +use std::borrow::Cow; +use quick_protobuf::{MessageRead, MessageWrite, BytesReader, Writer, WriterBackend, Result}; +use quick_protobuf::sizeofs::*; +use super::super::*; + +#[derive(Debug, Default, PartialEq, Clone)] +pub struct WifiData<'a> { + pub ssid: Cow<'a, str>, + pub password: Cow<'a, str>, + pub auth: pb::wifi1::mod_WifiData::AuthMethod, +} + +impl<'a> MessageRead<'a> for WifiData<'a> { + fn from_reader(r: &mut BytesReader, bytes: &'a [u8]) -> Result { + let mut msg = Self::default(); + while !r.is_eof() { + match r.next_tag(bytes) { + Ok(34) => msg.ssid = r.read_string(bytes).map(Cow::Borrowed)?, + Ok(42) => msg.password = r.read_string(bytes).map(Cow::Borrowed)?, + Ok(48) => msg.auth = r.read_enum(bytes)?, + Ok(t) => { r.read_unknown(bytes, t)?; } + Err(e) => return Err(e), + } + } + Ok(msg) + } +} + +impl<'a> MessageWrite for WifiData<'a> { + fn get_size(&self) -> usize { + 0 + + if self.ssid == "" { 0 } else { 1 + sizeof_len((&self.ssid).len()) } + + if self.password == "" { 0 } else { 1 + sizeof_len((&self.password).len()) } + + if self.auth == pb::wifi1::mod_WifiData::AuthMethod::PLAIN { 0 } else { 1 + sizeof_varint(*(&self.auth) as u64) } + } + + fn write_message(&self, w: &mut Writer) -> Result<()> { + if self.ssid != "" { w.write_with_tag(34, |w| w.write_string(&**&self.ssid))?; } + if self.password != "" { w.write_with_tag(42, |w| w.write_string(&**&self.password))?; } + if self.auth != pb::wifi1::mod_WifiData::AuthMethod::PLAIN { w.write_with_tag(48, |w| w.write_enum(*&self.auth as i32))?; } + Ok(()) + } +} + +pub mod mod_WifiData { + + +#[derive(Debug, PartialEq, Eq, Clone, Copy)] +pub enum AuthMethod { + PLAIN = 1, + WEP = 2, + WPA = 3, + WPA2Personal = 4, + WPAWPA2Personal = 5, + WPA2Enterprise = 6, + WPA3Personal = 7, + WPA2WPA3Personal = 8, + WAPIPersonal = 9, +} + +impl Default for AuthMethod { + fn default() -> Self { + AuthMethod::PLAIN + } +} + +impl From for AuthMethod { + fn from(i: i32) -> Self { + match i { + 1 => AuthMethod::PLAIN, + 2 => AuthMethod::WEP, + 3 => AuthMethod::WPA, + 4 => AuthMethod::WPA2Personal, + 5 => AuthMethod::WPAWPA2Personal, + 6 => AuthMethod::WPA2Enterprise, + 7 => AuthMethod::WPA3Personal, + 8 => AuthMethod::WPA2WPA3Personal, + 9 => AuthMethod::WAPIPersonal, + _ => Self::default(), + } + } +} + +impl<'a> From<&'a str> for AuthMethod { + fn from(s: &'a str) -> Self { + match s { + "PLAIN" => AuthMethod::PLAIN, + "WEP" => AuthMethod::WEP, + "WPA" => AuthMethod::WPA, + "WPA2Personal" => AuthMethod::WPA2Personal, + "WPAWPA2Personal" => AuthMethod::WPAWPA2Personal, + "WPA2Enterprise" => AuthMethod::WPA2Enterprise, + "WPA3Personal" => AuthMethod::WPA3Personal, + "WPA2WPA3Personal" => AuthMethod::WPA2WPA3Personal, + "WAPIPersonal" => AuthMethod::WAPIPersonal, + _ => Self::default(), + } + } +} + +} + +#[derive(Debug, Default, PartialEq, Clone)] +pub struct WifiDataLibrary<'a> { + pub version: u32, + pub data: Vec>, +} + +impl<'a> MessageRead<'a> for WifiDataLibrary<'a> { + fn from_reader(r: &mut BytesReader, bytes: &'a [u8]) -> Result { + let mut msg = Self::default(); + while !r.is_eof() { + match r.next_tag(bytes) { + Ok(8) => msg.version = r.read_uint32(bytes)?, + Ok(34) => msg.data.push(r.read_message::(bytes)?), + Ok(t) => { r.read_unknown(bytes, t)?; } + Err(e) => return Err(e), + } + } + Ok(msg) + } +} + +impl<'a> MessageWrite for WifiDataLibrary<'a> { + fn get_size(&self) -> usize { + 0 + + if self.version == 0u32 { 0 } else { 1 + sizeof_varint(*(&self.version) as u64) } + + self.data.iter().map(|s| 1 + sizeof_len((s).get_size())).sum::() + } + + fn write_message(&self, w: &mut Writer) -> Result<()> { + if self.version != 0u32 { w.write_with_tag(8, |w| w.write_uint32(*&self.version))?; } + for s in &self.data { w.write_with_tag(34, |w| w.write_message(s))?; } + Ok(()) + } +} + diff --git a/src/s11n/pid1.proto b/src/s11n/pid1.proto new file mode 100644 index 0000000..3ecffd1 --- /dev/null +++ b/src/s11n/pid1.proto @@ -0,0 +1,17 @@ +syntax = "proto3"; + +package pb.pid1; + +message PidData { + string name = 4; + uint64 created = 5; + uint64 modified = 6; + + double p = 10; + double i = 11; + double d = 12; +} + +message PidDataLibrary { + map items = 4; +} diff --git a/src/s11n/wifi1.proto b/src/s11n/wifi1.proto new file mode 100644 index 0000000..626c9d1 --- /dev/null +++ b/src/s11n/wifi1.proto @@ -0,0 +1,25 @@ +syntax = "proto3"; + +package pb.wifi1; + +message WifiData { + string ssid = 4; + string password = 5; + enum AuthMethod { + PLAIN = 1; + WEP = 2; + WPA = 3; + WPA2Personal = 4; + WPAWPA2Personal = 5; + WPA2Enterprise = 6; + WPA3Personal = 7; + WPA2WPA3Personal = 8; + WAPIPersonal = 9; + } + AuthMethod auth = 6; +} + +message WifiDataLibrary { + uint32 version = 1; + repeated WifiData data = 4; +} diff --git a/src/static/favicon.png b/src/static/favicon.png new file mode 100644 index 0000000..6c4c5c7 Binary files /dev/null and b/src/static/favicon.png differ diff --git a/src/static/styles.css b/src/static/styles.css new file mode 100644 index 0000000..6db30d1 --- /dev/null +++ b/src/static/styles.css @@ -0,0 +1,12 @@ +body { + font-family: serif; + text-align: center; + color: #321C0B; + background-color: #D5E4F6; +} +h1 { + color: #B15C1B; +} +h4 { + color: #2969B2; +} diff --git a/src/static/styles.css.gz b/src/static/styles.css.gz new file mode 100644 index 0000000..f67e00b Binary files /dev/null and b/src/static/styles.css.gz differ diff --git a/src/web_pid_get.html b/src/web_pid_get.html new file mode 100644 index 0000000..f3f14e3 --- /dev/null +++ b/src/web_pid_get.html @@ -0,0 +1,7 @@ + + +

Heureka!

+

Counter is: {{ counter }}

+ + +