diff --git a/firmware2/Cargo.lock b/firmware2/Cargo.lock index 7710415..70980ea 100644 --- a/firmware2/Cargo.lock +++ b/firmware2/Cargo.lock @@ -6,6 +6,7 @@ version = 4 name = "acid-firmware" version = "0.1.0" dependencies = [ + "backtrace", "bitflags 2.10.0", "bt-hci", "bytemuck", @@ -26,6 +27,7 @@ dependencies = [ "esp-radio", "esp-rtos", "esp-storage", + "gix", "itertools 0.14.0", "json", "lazy_static", @@ -33,13 +35,21 @@ dependencies = [ "paste", "rand_core 0.6.4", "rmk", - "shadow-rs", "slint", "slint-build", "static_cell", "xz2", ] +[[package]] +name = "addr2line" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" +dependencies = [ + "gimli", +] + [[package]] name = "adler2" version = "2.0.1" @@ -156,6 +166,15 @@ version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" +[[package]] +name = "arc-swap" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d03449bb8ca2cc2ef70869af31463d1ae5ccc8fa3e334b307203fbf815207e" +dependencies = [ + "rustversion", +] + [[package]] name = "arg_enum_proc_macro" version = "0.3.4" @@ -401,6 +420,21 @@ dependencies = [ "arrayvec", ] +[[package]] +name = "backtrace" +version = "0.3.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-link", +] + [[package]] name = "bare-metal" version = "0.2.5" @@ -580,6 +614,17 @@ dependencies = [ "cfg_aliases", ] +[[package]] +name = "bstr" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" +dependencies = [ + "memchr", + "regex-automata", + "serde", +] + [[package]] name = "bt-hci" version = "0.6.0" @@ -947,26 +992,6 @@ dependencies = [ "tiny-keccak", ] -[[package]] -name = "const_format" -version = "0.2.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7faa7469a93a566e9ccc1c73fe783b4a65c274c5ace346038dca9c39fe0030ad" -dependencies = [ - "const_format_proc_macros", -] - -[[package]] -name = "const_format_proc_macros" -version = "0.2.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] - [[package]] name = "convert_case" version = "0.6.0" @@ -1243,6 +1268,20 @@ dependencies = [ "syn 2.0.111", ] +[[package]] +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "data-url" version = "0.3.2" @@ -1279,15 +1318,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "deranged" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" -dependencies = [ - "powerfmt", -] - [[package]] name = "derive_more" version = "2.1.1" @@ -1433,6 +1463,12 @@ dependencies = [ "linux-raw-sys 0.6.5", ] +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + [[package]] name = "either" version = "1.15.0" @@ -2289,6 +2325,16 @@ dependencies = [ "zune-inflate", ] +[[package]] +name = "faster-hex" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7223ae2d2f179b803433d9c830478527e92b8117eab39460edae7f1614d9fb73" +dependencies = [ + "heapless 0.8.0", + "serde", +] + [[package]] name = "fastrand" version = "2.3.0" @@ -2390,6 +2436,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + [[package]] name = "font-types" version = "0.10.1" @@ -2663,16 +2715,744 @@ dependencies = [ ] [[package]] -name = "git2" -version = "0.20.3" +name = "gimli" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e2b37e2f62729cdada11f0e6b3b6fe383c69c29fc619e391223e12856af308c" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" + +[[package]] +name = "gix" +version = "0.76.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0da205378175c7e08c1d9357be8e6056c541d5907c29842d025b2a732ce06d52" +dependencies = [ + "gix-actor", + "gix-attributes", + "gix-command", + "gix-commitgraph", + "gix-config", + "gix-date", + "gix-diff", + "gix-dir", + "gix-discover", + "gix-features", + "gix-filter", + "gix-fs", + "gix-glob", + "gix-hash", + "gix-hashtable", + "gix-ignore", + "gix-index", + "gix-lock", + "gix-object", + "gix-odb", + "gix-pack", + "gix-path", + "gix-pathspec", + "gix-protocol", + "gix-ref", + "gix-refspec", + "gix-revision", + "gix-revwalk", + "gix-sec", + "gix-shallow", + "gix-status", + "gix-submodule", + "gix-tempfile", + "gix-trace", + "gix-traverse", + "gix-url", + "gix-utils", + "gix-validate", + "gix-worktree", + "smallvec", + "thiserror 2.0.17", +] + +[[package]] +name = "gix-actor" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "636ca0d7bf8f7ad8ba84a5dda8312c8944b275be09d88b072e08f57d3e47c1e8" +dependencies = [ + "bstr", + "gix-date", + "gix-utils", + "itoa", + "thiserror 2.0.17", + "winnow", +] + +[[package]] +name = "gix-attributes" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f47dabf8a50f1558c3a55d978440c7c4f22f87ac897bef03b4edbc96f6115966" +dependencies = [ + "bstr", + "gix-glob", + "gix-path", + "gix-quote", + "gix-trace", + "kstring", + "smallvec", + "thiserror 2.0.17", + "unicode-bom", +] + +[[package]] +name = "gix-bitmap" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e150161b8a75b5860521cb876b506879a3376d3adc857ec7a9d35e7c6a5e531" +dependencies = [ + "thiserror 2.0.17", +] + +[[package]] +name = "gix-chunk" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c356b3825677cb6ff579551bb8311a81821e184453cbd105e2fc5311b288eeb" +dependencies = [ + "thiserror 2.0.17", +] + +[[package]] +name = "gix-command" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "095c8367c9dc4872a7706fbc39c7f34271b88b541120a4365ff0e36366f66e62" +dependencies = [ + "bstr", + "gix-path", + "gix-quote", + "gix-trace", + "shell-words", +] + +[[package]] +name = "gix-commitgraph" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efdcba8048045baf15225daf949d597c3e6183d130245e22a7fbd27084abe63a" +dependencies = [ + "bstr", + "gix-chunk", + "gix-hash", + "memmap2", + "thiserror 2.0.17", +] + +[[package]] +name = "gix-config" +version = "0.49.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f15f96a354d296b505575870c4ebe279552a67132b61223869181d11894859d" +dependencies = [ + "bstr", + "gix-config-value", + "gix-features", + "gix-glob", + "gix-path", + "gix-ref", + "gix-sec", + "memchr", + "smallvec", + "thiserror 2.0.17", + "unicode-bom", + "winnow", +] + +[[package]] +name = "gix-config-value" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2409cffa4fe8b303847d5b6ba8df9da9ba65d302fc5ee474ea0cac5afde79840" dependencies = [ "bitflags 2.10.0", + "bstr", + "gix-path", "libc", - "libgit2-sys", - "log", - "url", + "thiserror 2.0.17", +] + +[[package]] +name = "gix-date" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0a1259955c76335c9d1a8c511811b10dbc800ffeeca3daea1e0aadd0c98f6b7" +dependencies = [ + "bstr", + "itoa", + "jiff", + "smallvec", + "thiserror 2.0.17", +] + +[[package]] +name = "gix-diff" +version = "0.56.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ebc8f56f3300d3c5f98d927b11762ef98e35ddbf9ebf3bdbdb53dbc6d9cbb7e" +dependencies = [ + "bstr", + "gix-attributes", + "gix-command", + "gix-filter", + "gix-fs", + "gix-hash", + "gix-index", + "gix-object", + "gix-path", + "gix-pathspec", + "gix-tempfile", + "gix-trace", + "gix-traverse", + "gix-worktree", + "imara-diff", + "thiserror 2.0.17", +] + +[[package]] +name = "gix-dir" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40d285a847a95b3c76c0f7b17143bdc68c917d3f9f772bfd4c83fbadb7497067" +dependencies = [ + "bstr", + "gix-discover", + "gix-fs", + "gix-ignore", + "gix-index", + "gix-object", + "gix-path", + "gix-pathspec", + "gix-trace", + "gix-utils", + "gix-worktree", + "thiserror 2.0.17", +] + +[[package]] +name = "gix-discover" +version = "0.44.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f2fe2922c3358a93f5e5b62c1c6d856f59ed863f5fd2da1929f66567d3b0e12" +dependencies = [ + "bstr", + "dunce", + "gix-fs", + "gix-hash", + "gix-path", + "gix-ref", + "gix-sec", + "thiserror 2.0.17", +] + +[[package]] +name = "gix-features" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba0ba40b1ca17f2cb3987c8d54e596aba924201cd8e5947098b441067e6686a0" +dependencies = [ + "crc32fast", + "crossbeam-channel", + "gix-path", + "gix-trace", + "gix-utils", + "libc", + "once_cell", + "parking_lot", + "prodash", + "thiserror 2.0.17", + "walkdir", + "zlib-rs", +] + +[[package]] +name = "gix-filter" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22c005832d42de07bacdef53d3b87f6067e765b9753f85788655a1b4a20fc2b6" +dependencies = [ + "bstr", + "encoding_rs", + "gix-attributes", + "gix-command", + "gix-hash", + "gix-object", + "gix-packetline", + "gix-path", + "gix-quote", + "gix-trace", + "gix-utils", + "smallvec", + "thiserror 2.0.17", +] + +[[package]] +name = "gix-fs" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95b160a13547a64d67a02d894e4f5502a2a5f98635c89931f6bb9c7a4c80c7db" +dependencies = [ + "bstr", + "fastrand", + "gix-features", + "gix-path", + "gix-utils", + "thiserror 2.0.17", +] + +[[package]] +name = "gix-glob" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8546300aee4c65c5862c22a3e321124a69b654a61a8b60de546a9284812b7e2" +dependencies = [ + "bitflags 2.10.0", + "bstr", + "gix-features", + "gix-path", +] + +[[package]] +name = "gix-hash" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0799db4b114b97da340a3acd6b65f4ef4d325a590acef867ab0e51729b8b761c" +dependencies = [ + "faster-hex", + "gix-features", + "sha1-checked", + "thiserror 2.0.17", +] + +[[package]] +name = "gix-hashtable" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "222f7428636020bef272a87ed833ea48bf5fb3193f99852ae16fbb5a602bd2f0" +dependencies = [ + "gix-hash", + "hashbrown 0.16.1", + "parking_lot", +] + +[[package]] +name = "gix-ignore" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfa727fdf54fd9fb53fa3fbb1a5c17172d3073e8e336bf155f3cac3e25b81b21" +dependencies = [ + "bstr", + "gix-glob", + "gix-path", + "gix-trace", + "unicode-bom", +] + +[[package]] +name = "gix-index" +version = "0.44.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "015374c00aff762bb21dafbb73a2267583392b320cb4aef156805838752a4152" +dependencies = [ + "bitflags 2.10.0", + "bstr", + "filetime", + "fnv", + "gix-bitmap", + "gix-features", + "gix-fs", + "gix-hash", + "gix-lock", + "gix-object", + "gix-traverse", + "gix-utils", + "gix-validate", + "hashbrown 0.16.1", + "itoa", + "libc", + "memmap2", + "rustix 1.1.3", + "smallvec", + "thiserror 2.0.17", +] + +[[package]] +name = "gix-lock" +version = "20.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "beefa8f90ef048ab98375217777c6e74c53c9639b0c2978ea1886c41e7005322" +dependencies = [ + "gix-tempfile", + "gix-utils", + "thiserror 2.0.17", +] + +[[package]] +name = "gix-object" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ec9557a30ab9abfec4d67975413e3099509ed5da599c901ea40f7da52755128" +dependencies = [ + "bstr", + "gix-actor", + "gix-date", + "gix-features", + "gix-hash", + "gix-hashtable", + "gix-path", + "gix-utils", + "gix-validate", + "itoa", + "smallvec", + "thiserror 2.0.17", + "winnow", +] + +[[package]] +name = "gix-odb" +version = "0.73.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a7eb6f7017bf94ce8cf00da03a8a32d4199fcbee6940c5bba213ca98d01d78f" +dependencies = [ + "arc-swap", + "gix-date", + "gix-features", + "gix-fs", + "gix-hash", + "gix-hashtable", + "gix-object", + "gix-pack", + "gix-path", + "gix-quote", + "parking_lot", + "tempfile", + "thiserror 2.0.17", +] + +[[package]] +name = "gix-pack" +version = "0.63.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0811847c93e98e1694ae0f519fb52af62da1cebeaf0a764840e392c6e41b38" +dependencies = [ + "clru", + "gix-chunk", + "gix-features", + "gix-hash", + "gix-hashtable", + "gix-object", + "gix-path", + "memmap2", + "smallvec", + "thiserror 2.0.17", + "uluru", +] + +[[package]] +name = "gix-packetline" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fad0ffb982a289888087a165d3e849cbac724f2aa5431236b050dd2cb9c7de31" +dependencies = [ + "bstr", + "faster-hex", + "gix-trace", + "thiserror 2.0.17", +] + +[[package]] +name = "gix-path" +version = "0.10.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cb06c3e4f8eed6e24fd915fa93145e28a511f4ea0e768bae16673e05ed3f366" +dependencies = [ + "bstr", + "gix-trace", + "gix-validate", + "thiserror 2.0.17", +] + +[[package]] +name = "gix-pathspec" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed9e0c881933c37a7ef45288d6c5779c4a7b3ad240b4c37657e1d9829eb90085" +dependencies = [ + "bitflags 2.10.0", + "bstr", + "gix-attributes", + "gix-config-value", + "gix-glob", + "gix-path", + "thiserror 2.0.17", +] + +[[package]] +name = "gix-protocol" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21348ce0b01fb5e3850e9014733d5ddf6bfeebb100967246572e6b02a29a4fef" +dependencies = [ + "bstr", + "gix-date", + "gix-features", + "gix-hash", + "gix-ref", + "gix-shallow", + "gix-transport", + "gix-utils", + "maybe-async", + "thiserror 2.0.17", + "winnow", +] + +[[package]] +name = "gix-quote" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e912ec04b7b1566a85ad486db0cab6b9955e3e32bcd3c3a734542ab3af084c5b" +dependencies = [ + "bstr", + "gix-utils", + "thiserror 2.0.17", +] + +[[package]] +name = "gix-ref" +version = "0.56.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16f21c66e188cb95207d30c9b2d21b0d234f570dbb97d8fd493081b6990dcb9d" +dependencies = [ + "gix-actor", + "gix-features", + "gix-fs", + "gix-hash", + "gix-lock", + "gix-object", + "gix-path", + "gix-tempfile", + "gix-utils", + "gix-validate", + "memmap2", + "thiserror 2.0.17", + "winnow", +] + +[[package]] +name = "gix-refspec" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "853157fd71394f7f382af2e28a7cd78c5c7bd28b7c5d7de7272e1ec97a869159" +dependencies = [ + "bstr", + "gix-glob", + "gix-hash", + "gix-revision", + "gix-validate", + "smallvec", + "thiserror 2.0.17", +] + +[[package]] +name = "gix-revision" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63c1956637d13fe273178f425c04b0458ea678c150cb8ed325957a63cb1136f6" +dependencies = [ + "bstr", + "gix-commitgraph", + "gix-date", + "gix-hash", + "gix-object", + "gix-revwalk", + "thiserror 2.0.17", +] + +[[package]] +name = "gix-revwalk" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "276d6ce81e71c18e6c9c3de2c5015e85a7495d1bf33e0a7587e997b8bd040715" +dependencies = [ + "gix-commitgraph", + "gix-date", + "gix-hash", + "gix-hashtable", + "gix-object", + "smallvec", + "thiserror 2.0.17", +] + +[[package]] +name = "gix-sec" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea9962ed6d9114f7f100efe038752f41283c225bb507a2888903ac593dffa6be" +dependencies = [ + "bitflags 2.10.0", + "gix-path", + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "gix-shallow" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c1c467fb9f7ec1d33613c2ea5482de514bcb84b8222a793cdc4c71955832356" +dependencies = [ + "bstr", + "gix-hash", + "gix-lock", + "thiserror 2.0.17", +] + +[[package]] +name = "gix-status" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1084eb17030ddbda1705c94ff6f79678dd7f15762deda74edf0f38e33711079c" +dependencies = [ + "bstr", + "filetime", + "gix-diff", + "gix-dir", + "gix-features", + "gix-filter", + "gix-fs", + "gix-hash", + "gix-index", + "gix-object", + "gix-path", + "gix-pathspec", + "gix-worktree", + "portable-atomic", + "thiserror 2.0.17", +] + +[[package]] +name = "gix-submodule" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe0b0d02a3c5968a2d86de2a56ab28c3b50aa28d8324d49383b7bd71d26e6d84" +dependencies = [ + "bstr", + "gix-config", + "gix-path", + "gix-pathspec", + "gix-refspec", + "gix-url", + "thiserror 2.0.17", +] + +[[package]] +name = "gix-tempfile" +version = "20.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "816bbb99bbf8cd329e38342594528506f224c4937a6341dbd1d16ee4082f621c" +dependencies = [ + "dashmap", + "gix-fs", + "libc", + "parking_lot", + "tempfile", +] + +[[package]] +name = "gix-trace" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd971cd6961fb1ebb29a0052a4ab04d8498dbf363c122e137b04753a3bbb5c3" + +[[package]] +name = "gix-transport" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c5445af84383b949856a36accfde9f90bdfc10bb1f640f105917f9d5419509" +dependencies = [ + "bstr", + "gix-command", + "gix-features", + "gix-packetline", + "gix-quote", + "gix-sec", + "gix-url", + "thiserror 2.0.17", +] + +[[package]] +name = "gix-traverse" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1f7582730a236aba16b4c9a5e9ac64bcbe7f155a38ae5938320de96760beb23" +dependencies = [ + "bitflags 2.10.0", + "gix-commitgraph", + "gix-date", + "gix-hash", + "gix-hashtable", + "gix-object", + "gix-revwalk", + "smallvec", + "thiserror 2.0.17", +] + +[[package]] +name = "gix-url" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff1996dfb9430b3699d89224c674169c1ae355eacc52bf30a03c0b8bffe73d9" +dependencies = [ + "bstr", + "gix-features", + "gix-path", + "percent-encoding", + "thiserror 2.0.17", +] + +[[package]] +name = "gix-utils" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "befcdbdfb1238d2854591f760a48711bed85e72d80a10e8f2f93f656746ef7c5" +dependencies = [ + "bstr", + "fastrand", + "unicode-normalization", +] + +[[package]] +name = "gix-validate" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b1e63a5b516e970a594f870ed4571a8fdcb8a344e7bd407a20db8bd61dbfde4" +dependencies = [ + "bstr", + "thiserror 2.0.17", +] + +[[package]] +name = "gix-worktree" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0ac49293df83b81da60ad8313f0376a5a7d6b11739ea7e97c0e1ba17b63d2a6" +dependencies = [ + "bstr", + "gix-attributes", + "gix-features", + "gix-fs", + "gix-glob", + "gix-hash", + "gix-ignore", + "gix-index", + "gix-object", + "gix-path", + "gix-validate", ] [[package]] @@ -2821,7 +3601,7 @@ checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ "allocator-api2 0.2.21", "equivalent", - "foldhash", + "foldhash 0.1.5", "rayon", ] @@ -2830,6 +3610,11 @@ name = "hashbrown" version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "allocator-api2 0.2.21", + "equivalent", + "foldhash 0.2.0", +] [[package]] name = "hashlink" @@ -3290,6 +4075,15 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285" +[[package]] +name = "imara-diff" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17d34b7d42178945f775e84bc4c36dde7c1c6cdfea656d3354d009056f2bb3d2" +dependencies = [ + "hashbrown 0.15.5", +] + [[package]] name = "imgref" version = "1.12.0" @@ -3387,12 +4181,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "is_debug" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fe266d2e243c931d8190177f20bf7f24eed45e96f39e87dc49a27b32d12d407" - [[package]] name = "itertools" version = "0.13.0" @@ -3424,10 +4212,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a87d9b8105c23642f50cbbae03d1f75d8422c5cb98ce7ee9271f7ff7505be6b8" dependencies = [ "jiff-static", + "jiff-tzdb-platform", "log", "portable-atomic", "portable-atomic-util", "serde_core", + "windows-sys 0.61.2", ] [[package]] @@ -3441,6 +4231,21 @@ dependencies = [ "syn 2.0.111", ] +[[package]] +name = "jiff-tzdb" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68971ebff725b9e2ca27a601c5eb38a4c5d64422c4cbab0c535f248087eda5c2" + +[[package]] +name = "jiff-tzdb-platform" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "875a5a69ac2bab1a891711cf5eccbec1ce0341ea805560dcd90b7a2e925132e8" +dependencies = [ + "jiff-tzdb", +] + [[package]] name = "jni" version = "0.21.1" @@ -3517,6 +4322,15 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" +[[package]] +name = "kstring" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "558bf9508a558512042d3095138b1f7b8fe90c5467d94f9f1da28b3731c5dbd1" +dependencies = [ + "static_assertions", +] + [[package]] name = "kurbo" version = "0.11.3" @@ -3570,18 +4384,6 @@ dependencies = [ "cc", ] -[[package]] -name = "libgit2-sys" -version = "0.18.3+1.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9b3acc4b91781bb0b3386669d325163746af5f6e4f73e6d2d630e09a35f3487" -dependencies = [ - "cc", - "libc", - "libz-sys", - "pkg-config", -] - [[package]] name = "libloading" version = "0.8.9" @@ -3619,18 +4421,6 @@ dependencies = [ "pkg-config", ] -[[package]] -name = "libz-sys" -version = "1.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15d118bbf3771060e7311cc7bb0545b01d08a8b4a7de949198dec1fa0ca1c0f7" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - [[package]] name = "linebender_resource_handle" version = "0.1.1" @@ -3773,6 +4563,17 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "maybe-async" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cf92c10c7e361d6b99666ec1c6f9805b0bea2c3bd8c78dc6fe98ac5bd78db11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + [[package]] name = "maybe-rayon" version = "0.1.1" @@ -3951,12 +4752,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - [[package]] name = "num-derive" version = "0.4.2" @@ -4020,15 +4815,6 @@ dependencies = [ "syn 2.0.111", ] -[[package]] -name = "num_threads" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" -dependencies = [ - "libc", -] - [[package]] name = "objc-sys" version = "0.3.5" @@ -4453,6 +5239,29 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.18", + "smallvec", + "windows-link", +] + [[package]] name = "parley" version = "0.6.0" @@ -4715,12 +5524,6 @@ dependencies = [ "zerovec", ] -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - [[package]] name = "ppv-lite86" version = "0.2.21" @@ -4767,6 +5570,15 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "prodash" +version = "30.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6efc566849d3d9d737c5cb06cc50e48950ebe3d3f9d70631490fff3a07b139" +dependencies = [ + "parking_lot", +] + [[package]] name = "profiling" version = "1.0.17" @@ -5276,6 +6088,12 @@ dependencies = [ "ordered-multimap", ] +[[package]] +name = "rustc-demangle" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" + [[package]] name = "rustc-hash" version = "1.1.0" @@ -5531,6 +6349,27 @@ dependencies = [ "unsafe-libyaml", ] +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha1-checked" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89f599ac0c323ebb1c6082821a54962b839832b03984598375bff3975b804423" +dependencies = [ + "digest", + "sha1", +] + [[package]] name = "sha2" version = "0.10.9" @@ -5543,17 +6382,10 @@ dependencies = [ ] [[package]] -name = "shadow-rs" -version = "1.5.0" +name = "shell-words" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff351910f271e7065781b6b4f0f43cb515d474d812f31176a0246d9058e47d5d" -dependencies = [ - "const_format", - "git2", - "is_debug", - "time", - "tzdb", -] +checksum = "dc6fe69c597f9c37bfeeeeeb33da3530379845f10be461a66d16d03eca2ded77" [[package]] name = "shlex" @@ -6019,39 +6851,6 @@ dependencies = [ "zune-jpeg 0.4.21", ] -[[package]] -name = "time" -version = "0.3.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" -dependencies = [ - "deranged", - "itoa", - "libc", - "num-conv", - "num_threads", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" - -[[package]] -name = "time-macros" -version = "0.2.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" -dependencies = [ - "num-conv", - "time-core", -] - [[package]] name = "tiny-keccak" version = "2.0.2" @@ -6273,32 +7072,6 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" -[[package]] -name = "tz-rs" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14eff19b8dc1ace5bf7e4d920b2628ae3837f422ff42210cb1567cbf68b5accf" - -[[package]] -name = "tzdb" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56d4e985b6dda743ae7fd4140c28105316ffd75bc58258ee6cc12934e3eb7a0c" -dependencies = [ - "iana-time-zone", - "tz-rs", - "tzdb_data", -] - -[[package]] -name = "tzdb_data" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42302a846dea7ab786f42dc5f519387069045acff793e1178d9368414168fe95" -dependencies = [ - "tz-rs", -] - [[package]] name = "ucd-trie" version = "0.1.7" @@ -6355,6 +7128,15 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e87a2ed6b42ec5e28cc3b94c09982969e9227600b2e3dcbc1db927a84c06bd69" +[[package]] +name = "uluru" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c8a2469e56e6e5095c82ccd3afb98dad95f7af7929aab6d8ba8d6e0f73657da" +dependencies = [ + "arrayvec", +] + [[package]] name = "unicode-bidi" version = "0.3.18" @@ -6367,6 +7149,12 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5dfa6e8c60bb66d49db113e0125ee8711b7647b5579dc7f5f19c42357ed039fe" +[[package]] +name = "unicode-bom" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7eec5d1121208364f6793f7d2e222bf75a915c19557537745b195b253dd64217" + [[package]] name = "unicode-ccc" version = "0.4.0" @@ -6385,6 +7173,15 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" +[[package]] +name = "unicode-normalization" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" +dependencies = [ + "tinyvec", +] + [[package]] name = "unicode-properties" version = "0.1.4" @@ -6590,12 +7387,6 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77439c1b53d2303b20d9459b1ade71a83c716e3f9c34f3228c00e6f185d6c002" -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - [[package]] name = "version_check" version = "0.9.5" @@ -7622,6 +8413,12 @@ dependencies = [ "syn 2.0.111", ] +[[package]] +name = "zlib-rs" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40990edd51aae2c2b6907af74ffb635029d5788228222c4bb811e9351c0caad3" + [[package]] name = "zmij" version = "1.0.2" diff --git a/firmware2/Cargo.toml b/firmware2/Cargo.toml index afdceeb..caa1c7d 100644 --- a/firmware2/Cargo.toml +++ b/firmware2/Cargo.toml @@ -49,7 +49,7 @@ itertools = { version = "0.14.0", default-features = false } bytemuck = "1.24.0" slint = { version = "1.14.1", default-features = false, features = ["compat-1-2", "libm", "log", "unsafe-single-threaded", "renderer-software"]} critical-section = "1.2.0" -shadow-rs = { version = "1.5.0", default-features = false } +backtrace = { version = "0.3.76", default-features = false } # Crates for serial UART CLI embedded-cli = { version = "0.2.1", default-features = false, features = ["help", "macros"] } @@ -62,7 +62,7 @@ const-gen = "1.6" embuild = "0.33" cc = "1.2.9" slint-build = "1.14.1" -shadow-rs = { version = "1.5.0", features = ["no_std"]} +gix = { version = "0.76.0", default-features = false, features = ["max-performance", "status"] } [[bin]] name = "acid-firmware" diff --git a/firmware2/build.rs b/firmware2/build.rs index 7cc70be..62f0a88 100644 --- a/firmware2/build.rs +++ b/firmware2/build.rs @@ -6,13 +6,24 @@ use std::{env, fs}; use const_gen::*; use slint_build::{CompilerConfiguration, EmbedResourcesKind}; use xz2::read::XzEncoder; -use shadow_rs::ShadowBuilder; +// use shadow_rs::{BuildPattern, ShadowBuilder}; fn main() { - ShadowBuilder::builder() - .deny_const(Default::default()) - .build() - .unwrap(); + if let Ok(repo) = gix::discover(env::var_os("CARGO_MANIFEST_DIR").unwrap().into_string().unwrap()) { + let commit_hash = repo.head_commit().unwrap().short_id().unwrap(); + println!("cargo:rustc-env=GIT_COMMIT_HASH={}", commit_hash); + println!("cargo:rustc-env=GIT_COMMIT={}", + repo.find_tag(repo.head_id().unwrap()) + .ok() + .map(|tag| format!("{} ({})", tag.decode().unwrap().name, commit_hash)) + .unwrap_or_else(|| commit_hash.to_string()) + ); + } + // ShadowBuilder::builder() + // .build_pattern(BuildPattern::Lazy) + // .deny_const(Default::default()) + // .build() + // .unwrap(); // Generate vial config at the root of project println!("cargo:rerun-if-changed=vial.json"); @@ -24,6 +35,8 @@ fn main() { // println!("cargo:rustc-link-arg=-Tdefmt.x"); let slint_config = CompilerConfiguration::new() + // .with_scale_factor(4.0) + .with_style("cosmic-dark".to_string()) .embed_resources(EmbedResourcesKind::EmbedForSoftwareRenderer); slint_build::compile_with_config("ui/main.slint", slint_config).expect("Slint build failed"); slint_build::print_rustc_flags().unwrap() diff --git a/firmware2/src/console.rs b/firmware2/src/console.rs index 4fa7af4..edf79f2 100644 --- a/firmware2/src/console.rs +++ b/firmware2/src/console.rs @@ -1,4 +1,6 @@ +use core::fmt::Write; + use embedded_cli::cli::CliBuilder; use embedded_cli::Command; use esp_hal::{Async, uart::{TxError, UartRx}}; @@ -71,7 +73,7 @@ pub async fn run_console(mut uart_rx: UartRx<'_, Async>) { // write!(cli.writer(), "Hello, {}", name.unwrap_or("World"))?; // } Base::Version => { - cli.writer().write_str(crate::build::CLAP_LONG_VERSION).unwrap(); + cli.writer().write_fmt(format_args!("{} - {} - {}", env!("CARGO_PKG_NAME"), env!("CARGO_PKG_VERSION"), env!("GIT_COMMIT"))).unwrap(); } Base::Reset => { cli.writer().write_str("Performing software reset.").unwrap(); diff --git a/firmware2/src/logging.rs b/firmware2/src/logging.rs index c1eaf3b..e602df8 100644 --- a/firmware2/src/logging.rs +++ b/firmware2/src/logging.rs @@ -1,6 +1,8 @@ use core::cell::RefCell; use core::fmt::Write; +use alloc::{string::String, vec::Vec}; +use backtrace::{BytesOrWideString, Symbol, SymbolName}; use critical_section::{CriticalSection, Mutex}; use esp_hal::uart::UartTx; use esp_hal::Blocking; @@ -83,7 +85,7 @@ fn panic_handler(info: &core::panic::PanicInfo) -> ! { use esp_backtrace::Backtrace; println!("{RED}"); - println!("====================== PANIC ======================"); + println!("=============== CUSTOM PANIC HANDLER =============="); println!("{info}{RESET}"); println!(""); println!("Backtrace:"); @@ -93,11 +95,39 @@ fn panic_handler(info: &core::panic::PanicInfo) -> ! { for frame in backtrace.frames() { println!("0x{:x}", frame.program_counter()); + print_resolved_symbol(frame.program_counter()); } loop {} } +#[cfg(not(feature = "usb-log"))] +fn print_resolved_symbol(address: usize) { + unsafe { + backtrace::resolve_unsynchronized(address as _, |sym| { + println!("? {:x?}\n{}\n\n", sym.addr().map(|addr| addr as usize), sym.name().unwrap_or(SymbolName::new(b"(unknown)"))); + // sym.filename_raw().unwrap_or(BytesOrWideString::Bytes(&[])); + // let segments: Vec = vec![ + // sym.addr().map(|a| format!("{:x?}", a as isize)), + // sym.name().map(|n| n.to_string()), + // sym.filename().map(|p| { + // format!( + // "{}{}", + // p.to_string_lossy(), + // sym.lineno() + // .map(|n| format!(" (line {})", n)) + // .unwrap_or_else(|| "".to_string()) + // ) + // }), + // ] + // .into_iter() + // .flatten() + // .collect(); + // segments.join("\n") + }); + } +} + pub fn setup_alternative_logging(alt_uart: UartTx<'static, Blocking>, level_filter: LevelFilter) { critical_section::with(|cs| { diff --git a/firmware2/src/main.rs b/firmware2/src/main.rs index 75f30c0..5511d44 100644 --- a/firmware2/src/main.rs +++ b/firmware2/src/main.rs @@ -11,7 +11,6 @@ use core::time::Duration; use alloc::boxed::Box; use alloc::rc::Rc; use alloc::vec; -use shadow_rs::shadow; use bt_hci::controller::ExternalController; use embassy_executor::Spawner; use esp_alloc::{HeapRegion, MemoryCapability}; @@ -26,7 +25,7 @@ use esp_hal::lcd_cam::lcd::dpi::Dpi; use esp_hal::mcpwm::{McPwm, PeripheralClockConfig}; use esp_hal::psram::{FlashFreq, PsramConfig, PsramSize, SpiRamFreq, SpiTimingConfigCoreClock}; use esp_hal::rng::TrngSource; -use esp_hal::system::Stack; +use esp_hal::system::{CpuControl, Stack}; use esp_hal::time::Instant; use esp_hal::timer::timg::TimerGroup; use esp_hal::{Blocking, ram}; @@ -44,14 +43,17 @@ use rmk::{join_all}; use rmk::keyboard::Keyboard; use rmk::storage::async_flash_wrapper; use rmk::{initialize_keymap_and_storage, run_devices, run_rmk}; -use slint::platform::software_renderer::Rgb565Pixel; +use slint::platform::WindowAdapter; +use slint::platform::software_renderer::{MinimalSoftwareWindow, RenderingRotation, RepaintBufferType, Rgb565Pixel, SoftwareRenderer}; use slint::{ComponentHandle, PhysicalSize, WindowSize}; use static_cell::StaticCell; use ui::AppWindow; +use ui::window_adapter::SoftwareWindowAdapter; use {esp_alloc as _, esp_backtrace as _}; use crate::matrix::IoeMatrix; use crate::peripherals::st7701s::St7701s; +use crate::ui::backend::{FramebufferPtr, SlintBackend}; use crate::vial::{VIAL_KEYBOARD_DEF, VIAL_KEYBOARD_ID}; mod keymap; @@ -64,8 +66,6 @@ mod logging; #[cfg(feature = "alt-log")] mod console; -shadow!(build); - // This creates a default app-descriptor required by the esp-idf bootloader. // For more information see: esp_bootloader_esp_idf::esp_app_desc!(); @@ -267,10 +267,11 @@ async fn main(_spawner: Spawner) { 960, )); - let window_size = [framebuffer.width, framebuffer.height]; + // let window_size = [framebuffer.width, framebuffer.height]; + let window_size = [framebuffer.height, framebuffer.width]; let framebuffer_ptr = FramebufferPtr(framebuffer.as_target_pixels() as _); - static SECOND_CORE_STACK: StaticCell> = StaticCell::new(); + static SECOND_CORE_STACK: StaticCell> = StaticCell::new(); let second_core_stack = SECOND_CORE_STACK.init(Stack::new()); esp_rtos::start_second_core( peripherals.CPU_CTRL, @@ -381,50 +382,6 @@ impl Framebuffer { } } -struct SlintBackend { - window_size: [u32; 2], - window: RefCell>>, - framebuffer: FramebufferPtr, - // peripherals: RefCell>, -} - -struct FramebufferPtr(*mut [Rgb565Pixel]); - -unsafe impl Send for FramebufferPtr {} - -impl slint::platform::Platform for SlintBackend { - fn create_window_adapter(&self) -> Result, slint::PlatformError> { - let window = slint::platform::software_renderer::MinimalSoftwareWindow::new( - slint::platform::software_renderer::RepaintBufferType::ReusedBuffer, - ); - window.set_size(WindowSize::Physical(PhysicalSize::new(self.window_size[0], self.window_size[1]))); - self.window.replace(Some(window.clone())); - Ok(window) - } - - fn duration_since_start(&self) -> Duration { - Duration::from_millis(Instant::now().duration_since_epoch().as_millis()) - } - - fn run_event_loop(&self) -> Result<(), slint::PlatformError> { - loop { - slint::platform::update_timers_and_animations(); - - if let Some(window) = self.window.borrow().clone() { - // window.try_dispatch_event(todo!())?; - - window.draw_if_needed(|renderer| { - // TODO: Proper synchronization. - let framebuffer = unsafe { &mut *self.framebuffer.0 }; - // TODO: Try using height to see if it rotates the screen correctly. Might need - // to swap dimensions elsewhere. - renderer.render(framebuffer, self.window_size[0] as usize); - }); - } - } - } -} - // impl DrawTarget for Framebuffer { // type Color = Rgb565; // type Error = (); diff --git a/firmware2/src/ui/backend.rs b/firmware2/src/ui/backend.rs new file mode 100644 index 0000000..dcfc764 --- /dev/null +++ b/firmware2/src/ui/backend.rs @@ -0,0 +1,56 @@ +use core::{cell::RefCell, time::Duration}; + +use alloc::rc::Rc; +use esp_hal::time::Instant; +use log::info; +use slint::{PhysicalSize, WindowSize, platform::software_renderer::{RenderingRotation, RepaintBufferType, Rgb565Pixel, SoftwareRenderer}}; + +use super::window_adapter::SoftwareWindowAdapter; + +pub struct FramebufferPtr(pub *mut [Rgb565Pixel]); + +unsafe impl Send for FramebufferPtr {} + +pub struct SlintBackend { + pub window_size: [u32; 2], + pub window: RefCell>>, + pub framebuffer: FramebufferPtr, + // pub peripherals: RefCell>, +} + +impl slint::platform::Platform for SlintBackend { + fn create_window_adapter(&self) -> Result, slint::PlatformError> { + // TODO: Custom window adapter impl needs to be implemented, so we can change `rotation` on + // `SoftwareRenderer`. + let renderer = SoftwareRenderer::new_with_repaint_buffer_type(RepaintBufferType::ReusedBuffer /* TODO: Implement a swapchain */); + renderer.set_rendering_rotation(RenderingRotation::Rotate270); + let window = SoftwareWindowAdapter::new(renderer); + // window.set_scale_factor(4.0); + window.set_size(WindowSize::Physical(PhysicalSize::new(self.window_size[0], self.window_size[1]))); + self.window.replace(Some(window.clone())); + Ok(window) + } + + fn duration_since_start(&self) -> Duration { + Duration::from_millis(Instant::now().duration_since_epoch().as_millis()) + } + + fn run_event_loop(&self) -> Result<(), slint::PlatformError> { + loop { + slint::platform::update_timers_and_animations(); + + if let Some(window) = self.window.borrow().clone() { + // window.try_dispatch_event(todo!())?; + + window.draw_if_needed(|renderer| { + // TODO: Proper synchronization. + let framebuffer = unsafe { &mut *self.framebuffer.0 }; + // TODO: Try using height to see if it rotates the screen correctly. Might need + // to swap dimensions elsewhere. + renderer.render(framebuffer, self.window_size[1] as usize); + info!("UI rendered."); + }); + } + } + } +} diff --git a/firmware2/src/ui/mod.rs b/firmware2/src/ui/mod.rs index 10ab428..06ad418 100644 --- a/firmware2/src/ui/mod.rs +++ b/firmware2/src/ui/mod.rs @@ -1,3 +1,6 @@ // #![cfg_attr(not(feature = "simulator"), no_main)] +pub mod window_adapter; +pub mod backend; + slint::include_modules!(); diff --git a/firmware2/src/ui/window_adapter.rs b/firmware2/src/ui/window_adapter.rs new file mode 100644 index 0000000..e11609a --- /dev/null +++ b/firmware2/src/ui/window_adapter.rs @@ -0,0 +1,86 @@ +use core::{cell::Cell, ops::{Deref, DerefMut}}; + +use alloc::rc::{Rc, Weak}; +use slint::{PhysicalSize, Window, WindowSize, platform::{Renderer, WindowAdapter, WindowEvent, software_renderer::{RepaintBufferType, SoftwareRenderer}}}; + +/// This is a minimal adapter for a Window that doesn't have any other feature than rendering +/// using the software renderer. +pub struct SoftwareWindowAdapter { + pub window: Window, + pub renderer: SoftwareRenderer, + needs_redraw: Cell, + size: Cell, +} + +impl SoftwareWindowAdapter { + /// Instantiate a new MinimalWindowAdaptor + /// + /// The `repaint_buffer_type` parameter specify what kind of buffer are passed to the [`SoftwareRenderer`] + pub fn new(renderer: SoftwareRenderer) -> Rc { + Rc::new_cyclic(|w: &Weak| Self { + window: Window::new(w.clone()), + renderer, + needs_redraw: Cell::new(true), + size: Default::default(), + }) + } + + /// If the window needs to be redrawn, the callback will be called with the + /// [renderer](SoftwareRenderer) that should be used to do the drawing. + /// + /// [`SoftwareRenderer::render()`] or [`SoftwareRenderer::render_by_line()`] should be called + /// in that callback. + /// + /// Return true if something was redrawn. + pub fn draw_if_needed(&self, render_callback: impl FnOnce(&SoftwareRenderer)) -> bool { + if self.needs_redraw.replace(false) /*|| self.renderer.rendering_metrics_collector.is_some()*/ { + render_callback(&self.renderer); + true + } else { + false + } + } + + pub fn set_scale_factor(&self, scale_factor: f32) { + self.window.dispatch_event(WindowEvent::ScaleFactorChanged { scale_factor }); + } +} + +impl WindowAdapter for SoftwareWindowAdapter { + fn window(&self) -> &Window { + &self.window + } + + fn renderer(&self) -> &dyn Renderer { + &self.renderer + } + + fn size(&self) -> PhysicalSize { + self.size.get() + } + + fn set_size(&self, size: WindowSize) { + let sf = self.window.scale_factor(); + self.size.set(size.to_physical(sf)); + self.window + .dispatch_event(WindowEvent::Resized { size: size.to_logical(sf) }) + } + + fn request_redraw(&self) { + self.needs_redraw.set(true); + } +} + +impl Deref for SoftwareWindowAdapter { + type Target = Window; + + fn deref(&self) -> &Self::Target { + &self.window + } +} + +impl DerefMut for SoftwareWindowAdapter { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.window + } +} diff --git a/firmware2/ui/main.slint b/firmware2/ui/main.slint index 2d5522c..0ae7253 100644 --- a/firmware2/ui/main.slint +++ b/firmware2/ui/main.slint @@ -1,18 +1,40 @@ -import { Button, VerticalBox } from "std-widgets.slint"; +import { Button, VerticalBox, LineEdit, GridBox } from "std-widgets.slint"; export component AppWindow inherits Window { + y: 0px; in-out property counter: 42; + default-font-family: "IBM Plex Sans"; + default-font-size: 16pt; callback request-increase-value(); - VerticalBox { - Text { - text: "Counter: \{root.counter}"; + GridBox { + height: 240px; + padding: 0px; + padding-top: 8px; + width: 960px; + VerticalBox { + Text { + text: "Counter: \{root.counter}"; + } + + Button { + text: "Increase value"; + clicked => { + root.request-increase-value(); + } + } + + LineEdit { + input-type: InputType.password; + text: "LineEdit"; + } } Button { - text: "Increase value"; - clicked => { - root.request-increase-value(); - } + text: "Button"; + } + + Button { + text: "Button"; } } }