diff --git a/Cargo.lock b/Cargo.lock index ad00eba..a6c9148 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -20,15 +20,15 @@ checksum = "b2187590a23ab1e3df8681afdf0987c48504d80291f002fcdb651f0ef5e25169" [[package]] name = "accesskit" -version = "0.19.0" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e25ae84c0260bdf5df07796d7cc4882460de26a2b406ec0e6c42461a723b271b" +checksum = "cf203f9d3bd8f29f98833d1fbef628df18f759248a547e7e01cfbf63cda36a99" [[package]] name = "accesskit_atspi_common" -version = "0.12.0" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29bd41de2e54451a8ca0dd95ebf45b54d349d29ebceb7f20be264eee14e3d477" +checksum = "890d241cf51fc784f0ac5ac34dfc847421f8d39da6c7c91a0fcc987db62a8267" dependencies = [ "accesskit", "accesskit_consumer", @@ -40,23 +40,23 @@ dependencies = [ [[package]] name = "accesskit_consumer" -version = "0.28.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bfae7c152994a31dc7d99b8eeac7784a919f71d1b306f4b83217e110fd3824c" +checksum = "db81010a6895d8707f9072e6ce98070579b43b717193d2614014abd5cb17dd43" dependencies = [ "accesskit", - "hashbrown", + "hashbrown 0.15.4", ] [[package]] name = "accesskit_macos" -version = "0.20.0" +version = "0.22.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692dd318ff8a7a0ffda67271c4bd10cf32249656f4e49390db0b26ca92b095f2" +checksum = "a0089e5c0ac0ca281e13ea374773898d9354cc28d15af9f0f7394d44a495b575" dependencies = [ "accesskit", "accesskit_consumer", - "hashbrown", + "hashbrown 0.15.4", "objc2 0.5.2", "objc2-app-kit 0.2.2", "objc2-foundation 0.2.2", @@ -64,9 +64,9 @@ dependencies = [ [[package]] name = "accesskit_unix" -version = "0.15.0" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f7474c36606d0fe4f438291d667bae7042ea2760f506650ad2366926358fc8" +checksum = "301e55b39cfc15d9c48943ce5f572204a551646700d0e8efa424585f94fec528" dependencies = [ "accesskit", "accesskit_atspi_common", @@ -82,13 +82,13 @@ dependencies = [ [[package]] name = "accesskit_windows" -version = "0.27.0" +version = "0.29.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a042b62c9c05bf7b616f015515c17d2813f3ba89978d6f4fc369735d60700a" +checksum = "d2d63dd5041e49c363d83f5419a896ecb074d309c414036f616dc0b04faca971" dependencies = [ "accesskit", "accesskit_consumer", - "hashbrown", + "hashbrown 0.15.4", "static_assertions", "windows 0.61.3", "windows-core 0.61.2", @@ -96,9 +96,9 @@ dependencies = [ [[package]] name = "accesskit_winit" -version = "0.27.0" +version = "0.29.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c1f0d3d13113d8857542a4f8d1a1c24d1dc1527b77aee8426127f4901588708" +checksum = "c8cfabe59d0eaca7412bfb1f70198dd31e3b0496fee7e15b066f9c36a1a140a0" dependencies = [ "accesskit", "accesskit_macos", @@ -108,15 +108,6 @@ dependencies = [ "winit", ] -[[package]] -name = "addr2line" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" -dependencies = [ - "gimli", -] - [[package]] name = "adler2" version = "2.0.1" @@ -161,7 +152,7 @@ dependencies = [ "log", "ndk", "ndk-context", - "ndk-sys 0.6.0+11769913", + "ndk-sys", "num_enum", "thiserror 1.0.69", ] @@ -228,29 +219,6 @@ dependencies = [ "libloading", ] -[[package]] -name = "ashpd" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cbdf310d77fd3aaee6ea2093db7011dc2d35d2eb3481e5607f1f8d942ed99df" -dependencies = [ - "async-fs", - "async-net", - "enumflags2", - "futures-channel", - "futures-util", - "rand 0.9.2", - "raw-window-handle", - "serde", - "serde_repr", - "tokio", - "url", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "zbus", -] - [[package]] name = "async-broadcast" version = "0.7.2" @@ -289,17 +257,6 @@ dependencies = [ "slab", ] -[[package]] -name = "async-fs" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8034a681df4aed8b8edbd7fbe472401ecf009251c8b40556b304567052e294c5" -dependencies = [ - "async-lock", - "blocking", - "futures-lite", -] - [[package]] name = "async-io" version = "2.5.0" @@ -329,17 +286,6 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "async-net" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b948000fad4873c1c9339d60f2623323a0cfd3816e5181033c6a5cb68b2accf7" -dependencies = [ - "async-io", - "blocking", - "futures-lite", -] - [[package]] name = "async-process" version = "2.4.0" @@ -481,21 +427,6 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" -[[package]] -name = "backtrace" -version = "0.3.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-targets 0.52.6", -] - [[package]] name = "bioz-host-rs" version = "0.1.0" @@ -553,9 +484,6 @@ name = "bitflags" version = "2.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" -dependencies = [ - "serde", -] [[package]] name = "block" @@ -704,9 +632,9 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.42" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" +checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" dependencies = [ "iana-time-zone", "js-sys", @@ -825,7 +753,7 @@ checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" dependencies = [ "bitflags 1.3.2", "core-foundation 0.9.4", - "core-graphics-types", + "core-graphics-types 0.1.3", "foreign-types", "libc", ] @@ -841,6 +769,17 @@ dependencies = [ "libc", ] +[[package]] +name = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags 2.9.4", + "core-foundation 0.10.1", + "libc", +] + [[package]] name = "crc32fast" version = "1.5.0" @@ -987,9 +926,9 @@ dependencies = [ [[package]] name = "ecolor" -version = "0.32.3" +version = "0.33.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94bdf37f8d5bd9aa7f753573fdda9cf7343afa73dd28d7bfe9593bd9798fc07e" +checksum = "71ddb8ac7643d1dba1bb02110e804406dd459a838efcb14011ced10556711a8e" dependencies = [ "bytemuck", "emath", @@ -997,9 +936,9 @@ dependencies = [ [[package]] name = "eframe" -version = "0.32.3" +version = "0.33.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14d1c15e7bd136b309bd3487e6ffe5f668b354cd9768636a836dd738ac90eb0b" +checksum = "457481173e6db5ca9fa2be93a58df8f4c7be639587aeb4853b526c6cf87db4e6" dependencies = [ "ahash", "bytemuck", @@ -1026,16 +965,15 @@ dependencies = [ "wasm-bindgen-futures", "web-sys", "web-time", - "winapi", - "windows-sys 0.59.0", + "windows-sys 0.61.2", "winit", ] [[package]] name = "egui" -version = "0.32.3" +version = "0.33.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d5d0306cd61ca75e29682926d71f2390160247f135965242e904a636f51c0dc" +checksum = "6a9b567d356674e9a5121ed3fedfb0a7c31e059fe71f6972b691bcd0bfc284e3" dependencies = [ "accesskit", "ahash", @@ -1051,9 +989,9 @@ dependencies = [ [[package]] name = "egui-wgpu" -version = "0.32.3" +version = "0.33.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c12eca13293f8eba27a32aaaa1c765bfbf31acd43e8d30d5881dcbe5e99ca0c7" +checksum = "5e4d209971c84b2352a06174abdba701af1e552ce56b144d96f2bd50a3c91236" dependencies = [ "ahash", "bytemuck", @@ -1062,7 +1000,7 @@ dependencies = [ "epaint", "log", "profiling", - "thiserror 1.0.69", + "thiserror 2.0.17", "type-map", "web-time", "wgpu", @@ -1071,16 +1009,18 @@ dependencies = [ [[package]] name = "egui-winit" -version = "0.32.3" +version = "0.33.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f95d0a91f9cb0dc2e732d49c2d521ac8948e1f0b758f306fb7b14d6f5db3927f" +checksum = "ec6687e5bb551702f4ad10ac428bab12acf9d53047ebb1082d4a0ed8c6251a29" dependencies = [ "accesskit_winit", - "ahash", "arboard", "bytemuck", "egui", "log", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-ui-kit", "profiling", "raw-window-handle", "smithay-clipboard", @@ -1091,9 +1031,9 @@ dependencies = [ [[package]] name = "egui_dock" -version = "0.17.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baa7ef4e24fccd35639705ba68a58a5713c19b15a2cd426c0a26901b5954882c" +checksum = "2fd0f689738efbd4afb811433b873379c6a8f3af48f2d296d9849fe70ee021d6" dependencies = [ "duplicate", "egui", @@ -1102,9 +1042,9 @@ dependencies = [ [[package]] name = "egui_extras" -version = "0.32.3" +version = "0.33.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dddbceddf39805fc6c62b1f7f9c05e23590b40844dc9ed89c6dc6dbc886e3e3b" +checksum = "d01d34e845f01c62e3fded726961092e70417d66570c499b9817ab24674ca4ed" dependencies = [ "ahash", "egui", @@ -1116,11 +1056,10 @@ dependencies = [ [[package]] name = "egui_glow" -version = "0.32.3" +version = "0.33.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7037813341727937f9e22f78d912f3e29bc3c46e2f40a9e82bb51cbf5e4cfb" +checksum = "6420863ea1d90e750f75075231a260030ad8a9f30a7cef82cdc966492dc4c4eb" dependencies = [ - "ahash", "bytemuck", "egui", "glow", @@ -1134,9 +1073,9 @@ dependencies = [ [[package]] name = "egui_plot" -version = "0.33.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524318041a8ea90c81c738e8985f8ad9e3f9bed636b03c2ff37b218113ed5121" +checksum = "33233ffc010fd450381805bbbebecbbb82f077de7712ddc439f0b20effd42db7" dependencies = [ "ahash", "egui", @@ -1145,9 +1084,9 @@ dependencies = [ [[package]] name = "emath" -version = "0.32.3" +version = "0.33.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45fd7bc25f769a3c198fe1cf183124bf4de3bd62ef7b4f1eaf6b08711a3af8db" +checksum = "491bdf728bf25ddd9ad60d4cf1c48588fa82c013a2440b91aa7fc43e34a07c32" dependencies = [ "bytemuck", ] @@ -1219,9 +1158,9 @@ dependencies = [ [[package]] name = "epaint" -version = "0.32.3" +version = "0.33.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63adcea970b7a13094fe97a36ab9307c35a750f9e24bf00bb7ef3de573e0fddb" +checksum = "009d0dd3c2163823a0abdb899451ecbc78798dec545ee91b43aff1fa790bab62" dependencies = [ "ab_glyph", "ahash", @@ -1237,9 +1176,9 @@ dependencies = [ [[package]] name = "epaint_default_fonts" -version = "0.32.3" +version = "0.33.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1537accc50c9cab5a272c39300bdd0dd5dca210f6e5e8d70be048df9596e7ca2" +checksum = "5c4fbe202b6578d3d56428fa185cdf114a05e49da05f477b3c7f0fbb221f1862" [[package]] name = "equivalent" @@ -1315,6 +1254,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 = "foreign-types" version = "0.5.0" @@ -1489,12 +1434,6 @@ dependencies = [ "wasi 0.14.2+wasi-0.2.4", ] -[[package]] -name = "gimli" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" - [[package]] name = "gl_generator" version = "0.14.0" @@ -1623,7 +1562,7 @@ checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" dependencies = [ "bitflags 2.9.4", "gpu-descriptor-types", - "hashbrown", + "hashbrown 0.15.4", ] [[package]] @@ -1670,7 +1609,16 @@ version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" dependencies = [ - "foldhash", + "foldhash 0.1.5", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "foldhash 0.2.0", ] [[package]] @@ -1883,7 +1831,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.15.4", ] [[package]] @@ -1896,17 +1844,6 @@ dependencies = [ "mach2", ] -[[package]] -name = "io-uring" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" -dependencies = [ - "bitflags 2.9.4", - "cfg-if", - "libc", -] - [[package]] name = "itoa" version = "1.0.15" @@ -2052,9 +1989,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.28" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] name = "loom" @@ -2080,15 +2017,17 @@ dependencies = [ [[package]] name = "maitake-sync" -version = "0.1.2" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6816ab14147f80234c675b80ed6dc4f440d8a1cefc158e766067aedb84c0bcd5" +checksum = "748f86d9befd480b602c3bebc9ef30dbf2f3dfc8acc4a73d07b90f0117e6de3f" dependencies = [ "cordyceps", "loom", + "mutex-traits", "mycelium-bitfield", "pin-project", "portable-atomic", + "tracing", ] [[package]] @@ -2135,13 +2074,13 @@ dependencies = [ [[package]] name = "metal" -version = "0.31.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f569fb946490b5743ad69813cb19629130ce9374034abe31614a36402d18f99e" +checksum = "00c15a6f673ff72ddcc22394663290f870fb224c1bfce55734a75c414150e605" dependencies = [ "bitflags 2.9.4", "block", - "core-graphics-types", + "core-graphics-types 0.2.0", "foreign-types", "log", "objc", @@ -2201,6 +2140,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "mutex-traits" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3929f2b5633d29cf7b6624992e5f3c1e9334f1193423e12d17be4faf678cde3f" + [[package]] name = "mycelium-bitfield" version = "0.1.5" @@ -2209,25 +2154,26 @@ checksum = "24e0cc5e2c585acbd15c5ce911dff71e1f4d5313f43345873311c4f5efd741cc" [[package]] name = "naga" -version = "25.0.1" +version = "27.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b977c445f26e49757f9aca3631c3b8b836942cb278d69a92e7b80d3b24da632" +checksum = "066cf25f0e8b11ee0df221219010f213ad429855f57c494f995590c861a9a7d8" dependencies = [ "arrayvec", "bit-set", "bitflags 2.9.4", + "cfg-if", "cfg_aliases", "codespan-reporting", "half", - "hashbrown", + "hashbrown 0.16.1", "hexf-parse", "indexmap", + "libm", "log", "num-traits", "once_cell", "rustc-hash 1.1.0", "spirv", - "strum", "thiserror 2.0.17", "unicode-ident", ] @@ -2241,7 +2187,7 @@ dependencies = [ "bitflags 2.9.4", "jni-sys", "log", - "ndk-sys 0.6.0+11769913", + "ndk-sys", "num_enum", "raw-window-handle", "thiserror 1.0.69", @@ -2253,15 +2199,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" -[[package]] -name = "ndk-sys" -version = "0.5.0+25.2.9519653" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" -dependencies = [ - "jni-sys", -] - [[package]] name = "ndk-sys" version = "0.6.0+11769913" @@ -2670,15 +2607,6 @@ dependencies = [ "objc2-foundation 0.2.2", ] -[[package]] -name = "object" -version = "0.36.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" -dependencies = [ - "memchr", -] - [[package]] name = "once_cell" version = "1.21.3" @@ -2786,7 +2714,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" dependencies = [ "phf_shared", - "rand 0.8.5", + "rand", ] [[package]] @@ -2901,6 +2829,15 @@ version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" +[[package]] +name = "portable-atomic-util" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +dependencies = [ + "portable-atomic", +] + [[package]] name = "postcard" version = "1.1.3" @@ -2927,12 +2864,12 @@ dependencies = [ [[package]] name = "postcard-rpc" -version = "0.11.15" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7e1944dfb9859e440511700c442edce3eacd5862f90f5a9997d004bd3553f3b" +checksum = "d1b0f9cc8bd8f38f5893fb7f07626b1c8722b3166ead66cfb14b5c5d5352822c" dependencies = [ "cobs 0.4.0", - "heapless 0.8.0", + "heapless 0.9.1", "maitake-sync", "nusb", "portable-atomic", @@ -2974,15 +2911,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" -[[package]] -name = "ppv-lite86" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] - [[package]] name = "presser" version = "0.3.1" @@ -3088,27 +3016,7 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ - "rand_core 0.6.4", -] - -[[package]] -name = "rand" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" -dependencies = [ - "rand_chacha", - "rand_core 0.9.3", -] - -[[package]] -name = "rand_chacha" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" -dependencies = [ - "ppv-lite86", - "rand_core 0.9.3", + "rand_core", ] [[package]] @@ -3117,15 +3025,6 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -[[package]] -name = "rand_core" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" -dependencies = [ - "getrandom", -] - [[package]] name = "range-alloc" version = "0.1.4" @@ -3208,34 +3107,31 @@ checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" [[package]] name = "rfd" -version = "0.16.0" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15ad77d9e70a92437d8f74c35d99b4e4691128df018833e99f90bcd36152672" +checksum = "20dafead71c16a34e1ff357ddefc8afc11e7d51d6d2b9fbd07eaa48e3e540220" dependencies = [ - "ashpd", "block2 0.6.2", "dispatch2", "js-sys", + "libc", "log", "objc2 0.6.3", "objc2-app-kit 0.3.1", "objc2-core-foundation", "objc2-foundation 0.3.1", + "percent-encoding", "pollster", "raw-window-handle", - "urlencoding", "wasm-bindgen", "wasm-bindgen-futures", + "wayland-backend", + "wayland-client", + "wayland-protocols", "web-sys", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] -[[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" @@ -3558,28 +3454,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" -[[package]] -name = "strum" -version = "0.26.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn", -] - [[package]] name = "syn" version = "2.0.104" @@ -3754,29 +3628,24 @@ dependencies = [ [[package]] name = "tokio" -version = "1.47.1" +version = "1.49.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" +checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" dependencies = [ - "backtrace", "bytes", - "io-uring", "libc", "mio", "pin-project-lite", - "signal-hook-registry", - "slab", "socket2", "tokio-macros", - "tracing", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "tokio-macros" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", @@ -3954,15 +3823,8 @@ dependencies = [ "form_urlencoded", "idna", "percent-encoding", - "serde", ] -[[package]] -name = "urlencoding" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" - [[package]] name = "utf8_iter" version = "1.0.4" @@ -4230,15 +4092,16 @@ checksum = "a751b3277700db47d3e574514de2eced5e54dc8a5436a3bf7a0b248b2cee16f3" [[package]] name = "wgpu" -version = "25.0.2" +version = "27.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec8fb398f119472be4d80bc3647339f56eb63b2a331f6a3d16e25d8144197dd9" +checksum = "bfe68bac7cde125de7a731c3400723cadaaf1703795ad3f4805f187459cd7a77" dependencies = [ "arrayvec", "bitflags 2.9.4", + "cfg-if", "cfg_aliases", "document-features", - "hashbrown", + "hashbrown 0.16.1", "js-sys", "log", "naga", @@ -4258,17 +4121,18 @@ dependencies = [ [[package]] name = "wgpu-core" -version = "25.0.2" +version = "27.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7b882196f8368511d613c6aeec80655160db6646aebddf8328879a88d54e500" +checksum = "27a75de515543b1897b26119f93731b385a19aea165a1ec5f0e3acecc229cae7" dependencies = [ "arrayvec", "bit-set", "bit-vec", "bitflags 2.9.4", + "bytemuck", "cfg_aliases", "document-features", - "hashbrown", + "hashbrown 0.16.1", "indexmap", "log", "naga", @@ -4289,36 +4153,36 @@ dependencies = [ [[package]] name = "wgpu-core-deps-apple" -version = "25.0.0" +version = "27.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfd488b3239b6b7b185c3b045c39ca6bf8af34467a4c5de4e0b1a564135d093d" +checksum = "0772ae958e9be0c729561d5e3fd9a19679bcdfb945b8b1a1969d9bfe8056d233" dependencies = [ "wgpu-hal", ] [[package]] name = "wgpu-core-deps-emscripten" -version = "25.0.0" +version = "27.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f09ad7aceb3818e52539acc679f049d3475775586f3f4e311c30165cf2c00445" +checksum = "b06ac3444a95b0813ecfd81ddb2774b66220b264b3e2031152a4a29fda4da6b5" dependencies = [ "wgpu-hal", ] [[package]] name = "wgpu-core-deps-windows-linux-android" -version = "25.0.0" +version = "27.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cba5fb5f7f9c98baa7c889d444f63ace25574833df56f5b817985f641af58e46" +checksum = "71197027d61a71748e4120f05a9242b2ad142e3c01f8c1b47707945a879a03c3" dependencies = [ "wgpu-hal", ] [[package]] name = "wgpu-hal" -version = "25.0.2" +version = "27.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f968767fe4d3d33747bbd1473ccd55bf0f6451f55d733b5597e67b5deab4ad17" +checksum = "5b21cb61c57ee198bc4aff71aeadff4cbb80b927beb912506af9c780d64313ce" dependencies = [ "android_system_properties", "arrayvec", @@ -4329,13 +4193,13 @@ dependencies = [ "bytemuck", "cfg-if", "cfg_aliases", - "core-graphics-types", + "core-graphics-types 0.2.0", "glow", "glutin_wgl_sys", "gpu-alloc", "gpu-allocator", "gpu-descriptor", - "hashbrown", + "hashbrown 0.16.1", "js-sys", "khronos-egl", "libc", @@ -4343,11 +4207,13 @@ dependencies = [ "log", "metal", "naga", - "ndk-sys 0.5.0+25.2.9519653", + "ndk-sys", "objc", + "once_cell", "ordered-float", "parking_lot", "portable-atomic", + "portable-atomic-util", "profiling", "range-alloc", "raw-window-handle", @@ -4363,9 +4229,9 @@ dependencies = [ [[package]] name = "wgpu-types" -version = "25.0.0" +version = "27.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aa49460c2a8ee8edba3fca54325540d904dd85b2e086ada762767e17d06e8bc" +checksum = "afdcf84c395990db737f2dd91628706cb31e86d72e53482320d368e52b5da5eb" dependencies = [ "bitflags 2.9.4", "bytemuck", @@ -5077,7 +4943,6 @@ dependencies = [ "ordered-stream", "serde", "serde_repr", - "tokio", "tracing", "uds_windows", "windows-sys 0.59.0", @@ -5234,7 +5099,6 @@ dependencies = [ "endi", "enumflags2", "serde", - "url", "winnow", "zvariant_derive", "zvariant_utils", diff --git a/Cargo.toml b/Cargo.toml index 612805a..e03a353 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,22 +5,22 @@ edition = "2024" [dependencies] defmt = { version = "1.0.1" } -eframe = { version = "0.32.0"} -egui_plot = "0.33.0" -egui_dock = "0.17.0" -egui_extras = "0.32.3" -log = "0.4.27" +eframe = { version = "0.33.3"} +egui_plot = "0.34.0" +egui_dock = "0.18.0" +egui_extras = "0.33.3" +log = "0.4.29" simple_logger = "5.0.0" atomic_float = "1.1.0" -chrono = { version = "0.4.42" } -rfd = { version = "0.16.0", features = ["tokio"] } +chrono = { version = "0.4.43" } +rfd = { version = "0.17.2" } [dependencies.bioz-icd-rs] path = "../bioz-icd-rs" features = ["use-std"] [dependencies.postcard-rpc] -version = "0.11.15" +version = "0.12.1" features = [ "use-std", "raw-nusb", @@ -32,7 +32,7 @@ version = "0.2.5" features = ["derive", "heapless_v0_8"] [dependencies.tokio] -version = "1.37.0" +version = "1.49.0" features = [ "rt-multi-thread", "macros", @@ -47,7 +47,7 @@ version = "5.4.4" name = "Bio-Z App" identifier = "bioz-host-rs" icon = ["bundle/bio-z.icns"] -version = "0.1.0" +version = "0.1.1" copyright = "Hubald Verzijl" category = "Developer Tool" long_description = "App belonging to the Bio-Z setup." \ No newline at end of file diff --git a/readme.md b/readme.md index 2e309c8..9f6c7dc 100644 --- a/readme.md +++ b/readme.md @@ -7,6 +7,7 @@ This repository contains Rust-based software for communicating with a custom-bui - Data logging to `.csv` files - Day and night display modes - Control via on-screen buttons or keyboard shortcuts +- Adding custom markers at specific timepoints ## How to Use This Software 1. Install the Rust toolchain and run the software using: diff --git a/src/app.rs b/src/app.rs index 9b2fa03..9b09422 100644 --- a/src/app.rs +++ b/src/app.rs @@ -12,7 +12,7 @@ use chrono::Local; use atomic_float::AtomicF32; use tokio::{sync::mpsc::{Sender}}; -use eframe::egui::{self, Button, CollapsingHeader, Color32, ComboBox, DragValue, Id, Key, Label, Layout, Modifiers, RichText, TextEdit, Widget}; +use eframe::egui::{self, Button, CollapsingHeader, Color32, ComboBox, DragValue, Id, Key, Label, Layout, Modal, Modifiers, RichText, TextEdit, Widget}; use egui_plot::{Corner, GridInput, GridMark, Legend, Line, Plot, PlotPoint, Points}; use egui_dock::{DockArea, DockState, Style}; use egui_extras::{TableBuilder, Column}; @@ -70,6 +70,8 @@ pub struct App { pub periods_per_dft_sweep: Arc, Option>)>>, pub gui_logging_state: Arc>, log_filename: String, + log_marker_modal: bool, + log_marker: String, } struct TabViewer { @@ -123,6 +125,12 @@ impl TabViewer { *lead_mode = LEAD_MODES[index]; info!("Lead Mode setting changed!"); } + + // Show lead configuration + match *lead_mode { + BioImpedanceLeadMode::TwoLead => ui.label("Drive/sense: Electrode+ (CE0), Electrode- (AIN1)"), + BioImpedanceLeadMode::FourLead => ui.label("Drive: I+ (CE0), I- (AIN1) | Sense: V+ (AIN2), V- (AIN3)"), + } }); }); ui.add_enabled_ui(!*on, |ui| { @@ -251,6 +259,12 @@ impl TabViewer { *lead_mode = LEAD_MODES[index]; info!("Lead Mode setting changed!"); } + + // Show lead configuration + match *lead_mode { + BioImpedanceLeadMode::TwoLead => ui.label("Drive/sense: Electrode+ (CE0), Electrode- (AIN1)"), + BioImpedanceLeadMode::FourLead => ui.label("Drive: I+ (CE0), I- (AIN1) | Sense: V+ (AIN2), V- (AIN3)"), + } }); }); ui.add_enabled_ui(!*on, |ui| { @@ -404,6 +418,7 @@ impl TabViewer { ui.label("R: Reset view/plots"); ui.label("S: Toggle settings"); ui.label("L: Toggle logging"); + ui.label("A: Add marker (when logging)"); ui.label("CMD-W: Close window"); } } @@ -542,7 +557,9 @@ impl App { periods_per_dft, periods_per_dft_sweep, gui_logging_state: Arc::new(Mutex::new(LoggingStates::Idle)), - log_filename: format!("log_{}.csv", Local::now().format("%Y%m%d")) + log_filename: format!("log_{}_single.csv", Local::now().format("%Y%m%d")), + log_marker_modal: false, + log_marker: String::new(), }; // For testing purposes, populate the Bode plot with a sample low-pass filter response @@ -608,10 +625,27 @@ impl eframe::App for App { ui.separator(); - if ui.add_enabled(connected, toggle_start_stop(&mut *self.on.lock().unwrap())).changed() { - self.update_start_stop(); + let on = *self.on.lock().unwrap(); + + let (color, text) = match on { + true => (Color32::DARK_RED, "Stop"), + false => (Color32::DARK_GREEN, "Start"), }; + let start_stop_button = Button::new( + RichText::new(text) + .strong() + .color(Color32::WHITE) + ).fill(color) + .corner_radius(5.0) + .min_size(egui::vec2(45.0, 0.0)) + .frame(true); + + if ui.add_enabled(connected, start_stop_button).clicked() { + *self.on.lock().unwrap() = !on; + self.update_start_stop(); + } + ui.separator(); if ui.add_enabled(connected, Button::new("Reset view")).clicked() { @@ -620,33 +654,83 @@ impl eframe::App for App { ui.separator(); + ui.add_enabled(connected, Label::new("Logging:")); + let gui_logging_state = *self.gui_logging_state.lock().unwrap(); - let (color, signal) = match gui_logging_state { - LoggingStates::Idle => (Color32::DARK_RED, LoggingSignal::StartFileLogging(self.log_filename.clone())), - LoggingStates::Starting => (Color32::from_rgb(204, 153, 0), LoggingSignal::StopFileLogging), - LoggingStates::Logging => (Color32::DARK_GREEN, LoggingSignal::StopFileLogging), - }; + let mut logging_enabled = !matches!(gui_logging_state, LoggingStates::Idle); - let button = Button::new( - RichText::new("Logging") - .strong() - .color(Color32::WHITE) - ).fill(color) - .corner_radius(5.0) - .frame(true); + if ui.add_enabled(connected, toggle_start_stop(&mut logging_enabled)).changed() { + let signal = match gui_logging_state { + LoggingStates::Idle => LoggingSignal::StartFileLogging(self.log_filename.clone()), + LoggingStates::Starting | LoggingStates::Logging => LoggingSignal::StopFileLogging, + }; - if ui.add(button).clicked() { self.log_tx.try_send(signal).unwrap_or_else(|e| { error!("Failed to send logging toggle signal: {:?}", e); }); + }; + + ui.separator(); + + ui.add_enabled_ui(on && logging_enabled, |ui| { + if Button::new("Add marker").corner_radius(5.0).min_size(egui::vec2(20.0, 0.0)).ui(ui).on_hover_text("Add a marker to the current time series plots").clicked() { + self.log_marker_modal = true; + } + }); + + if self.log_marker_modal { + if Modal::new(Id::new("modal_marker")) + .show(ctx, |ui| { + ui.vertical_centered(|ui| { + ui.heading("Add marker"); + + ui.add_space(16.0); + + // Input field for marker + let text_edit_response = TextEdit::singleline(&mut self.log_marker) + .desired_width(100.0) + .id(Id::new("marker_field")) + .hint_text("Marker name") + .ui(ui); + + ui.add_space(16.0); + + // Centered Add button + let add_clicked = Button::new("Add") + .corner_radius(5.0) + .min_size(egui::vec2(80.0, 30.0)) + .ui(ui) + .clicked(); + + // Check for Enter key in the TextEdit + let enter_pressed = text_edit_response.lost_focus() && ui.input(|i| i.key_pressed(egui::Key::Enter)); + + if add_clicked || enter_pressed { + info!("Adding marker: {}", self.log_marker); + self.log_tx.try_send(LoggingSignal::AddMarker(self.log_marker.clone())).unwrap_or_else(|e| { + error!("Failed to send logging marker signal: {:?}", e); + }); + self.log_marker = String::new(); + ui.close(); + } + + // Request focus on the text edit when the modal opens + text_edit_response.request_focus(); + }); + }) + .should_close() + { + self.log_marker_modal = false; + self.log_marker = String::new(); + } } ui.separator(); ui.add_enabled_ui(gui_logging_state == LoggingStates::Idle, |ui| { ui.label("Log filename:"); - TextEdit::singleline(&mut self.log_filename).desired_width(125.0).id(Id::new("file_name_field")).ui(ui); + TextEdit::singleline(&mut self.log_filename).desired_width(150.0).id(Id::new("file_name_field")).ui(ui); }); // Spacer to push the LED to the right @@ -691,6 +775,12 @@ impl eframe::App for App { self.tab_active = TabActive::Single; *self.on.lock().unwrap() = false; self.update_start_stop(); + if *self.gui_logging_state.lock().unwrap() == LoggingStates::Logging { + self.log_tx.try_send(LoggingSignal::StopFileLogging).unwrap_or_else(|e| { + error!("Failed to send logging logging signal: {:?}", e); + }); + } + self.log_filename = format!("log_{}_single.csv", Local::now().format("%Y%m%d")); info!("Switched to Single tab"); } } @@ -699,6 +789,12 @@ impl eframe::App for App { self.tab_active = TabActive::Sweep; *self.on.lock().unwrap() = false; self.update_start_stop(); + if *self.gui_logging_state.lock().unwrap() == LoggingStates::Logging { + self.log_tx.try_send(LoggingSignal::StopFileLogging).unwrap_or_else(|e| { + error!("Failed to send logging logging signal: {:?}", e); + }); + } + self.log_filename = format!("log_{}_sweep.csv", Local::now().format("%Y%m%d")); info!("Switched to Sweep tab"); } } @@ -725,7 +821,8 @@ impl eframe::App for App { // Check if the file name field is focused // If it is, we don't want to trigger shortcuts let file_name_field_is_focused = ctx.memory(|memory| memory.has_focus(Id::new("file_name_field"))); - if !file_name_field_is_focused { + let marker_field_is_focused = ctx.memory(|memory| memory.has_focus(Id::new("marker_field"))); + if !file_name_field_is_focused && !marker_field_is_focused { // Space to start/stop measurement if ctx.input(|i| i.key_pressed(Key::Space)) @@ -746,6 +843,11 @@ impl eframe::App for App { self.reset_view(); } + // Toggle marker modal + if ctx.input(|i| i.key_pressed(egui::Key::A)) && *self.gui_logging_state.lock().unwrap() == LoggingStates::Logging { + self.log_marker_modal = !self.log_marker_modal; + } + // Enable/disable GUI logging if ctx.input(|i| i.key_pressed(egui::Key::L)) { let gui_logging_enabled = *self.gui_logging_state.lock().unwrap(); diff --git a/src/bin/main_gui.rs b/src/bin/main_gui.rs index ed6a352..87eace2 100644 --- a/src/bin/main_gui.rs +++ b/src/bin/main_gui.rs @@ -1,3 +1,6 @@ +use eframe::NativeOptions; +use eframe::egui::Vec2; + use simple_logger::SimpleLogger; use log::info; use tokio::runtime::Runtime; @@ -69,9 +72,11 @@ async fn main() { }); // Run the GUI in the main thread. + let mut native_options = NativeOptions::default(); + native_options.viewport.inner_size = Some(Vec2::new(850.0, 600.0)); let _ = eframe::run_native( "Impedance Visualizer [egui + tokio] - Hubald Verzijl - 2025", - eframe::NativeOptions::default(), + native_options, Box::new(|_cc| Ok(Box::new(app))), ); } \ No newline at end of file diff --git a/src/logging.rs b/src/logging.rs index a2662b8..979d706 100644 --- a/src/logging.rs +++ b/src/logging.rs @@ -23,6 +23,7 @@ pub async fn log_data( gui_logging_state: Arc>, ) { let mut file: Option = None; + let mut logging_marker = String::new(); loop { match data.recv().await { @@ -30,25 +31,40 @@ pub async fn log_data( match signal { LoggingSignal::SingleImpedance(timestamp, frequency, magnitude, phase) => { if let Some(f) = file.as_mut() { - let _ = f - .write_all(format!("{},{},{:.3},{:.3}\n", timestamp.duration_since(UNIX_EPOCH).unwrap().as_millis(), frequency, magnitude, phase).as_bytes()) - .await; + let _ = f.write_all(format!("{},{},{},{},{}\n", + timestamp.duration_since(UNIX_EPOCH).unwrap().as_millis(), + frequency, + magnitude, + phase, + logging_marker) + .as_bytes()) + .await; + } + if logging_marker.len() > 0 { + logging_marker.clear(); } } LoggingSignal::SweepImpedance(timestamp, frequencies, magnitudes, phases) => { if let Some(f) = file.as_mut() { for i in 0..frequencies.len() { let _ = f.write_all( - format!("{},{},{},{},{}\n", + format!("{},{},{},{},{},{}\n", timestamp.duration_since(UNIX_EPOCH).unwrap().as_millis(), frequencies[i], magnitudes[i], phases[i], - i // optional index + i, // optional index + logging_marker ).as_bytes() ).await; } } + if logging_marker.len() > 0 { + logging_marker.clear(); + } + } + LoggingSignal::AddMarker(marker) => { + logging_marker = marker; } LoggingSignal::StartFileLogging(filename) => { // Update global logging state diff --git a/src/signals.rs b/src/signals.rs index b6238cf..28d5e94 100644 --- a/src/signals.rs +++ b/src/signals.rs @@ -14,4 +14,5 @@ pub enum LoggingSignal { SweepImpedance(SystemTime, Vec, Vec, Vec), // frequency, magnitude, phase StartFileLogging(String), // e.g. filename StopFileLogging, + AddMarker(String), } \ No newline at end of file