diff --git a/firmware2/.cargo/config.toml b/firmware2/.cargo/config.toml index a2cc239..390834f 100644 --- a/firmware2/.cargo/config.toml +++ b/firmware2/.cargo/config.toml @@ -18,6 +18,9 @@ ESP_LOG = "info" [unstable] build-std = ["alloc", "core"] +[patch.crates-io] +rmk = { path = "../../../rust/rmk/rmk" } + # [patch.crates-io] # esp-backtrace = { path = "../../../rust/esp-hal/esp-backtrace" } # esp-hal = { path = "../../../rust/esp-hal/esp-hal" } diff --git a/firmware2/Cargo.lock b/firmware2/Cargo.lock index be80e14..30eabe1 100644 --- a/firmware2/Cargo.lock +++ b/firmware2/Cargo.lock @@ -174,7 +174,7 @@ checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -297,7 +297,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -332,7 +332,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -359,7 +359,7 @@ dependencies = [ "derive_utils", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -465,7 +465,7 @@ dependencies = [ "regex", "rustc-hash 2.1.1", "shlex", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -503,7 +503,7 @@ checksum = "f48d6ace212fdf1b45fd6b566bb40808415344642b76c3224c07c8df9da81e97" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -514,7 +514,7 @@ checksum = "8769c4854c5ada2852ddf6fd09d15cf43d4c2aaeccb4de6432f5402f08a6003b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -659,7 +659,7 @@ checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -919,7 +919,7 @@ checksum = "5387f5bbc9e9e6c96436ea125afa12614cebf8ac67f49abc08c1e7a891466c90" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -1195,6 +1195,16 @@ dependencies = [ "darling_macro 0.21.3", ] +[[package]] +name = "darling" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +dependencies = [ + "darling_core 0.23.0", + "darling_macro 0.23.0", +] + [[package]] name = "darling_core" version = "0.20.11" @@ -1206,7 +1216,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -1219,7 +1229,20 @@ dependencies = [ "ident_case", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", +] + +[[package]] +name = "darling_core" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.112", ] [[package]] @@ -1230,7 +1253,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core 0.20.11", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -1241,7 +1264,18 @@ checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core 0.21.3", "quote", - "syn 2.0.111", + "syn 2.0.112", +] + +[[package]] +name = "darling_macro" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +dependencies = [ + "darling_core 0.23.0", + "quote", + "syn 2.0.112", ] [[package]] @@ -1281,7 +1315,7 @@ checksum = "780eb241654bf097afb00fc5f054a09b687dad862e485fdcf8399bb056565370" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -1313,7 +1347,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.1", - "syn 2.0.111", + "syn 2.0.112", "unicode-xid", ] @@ -1325,7 +1359,7 @@ checksum = "ccfae181bab5ab6c5478b2ccb69e4c68a02f8c3ec72f6616bfec9dbc599d2ee0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -1363,7 +1397,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -1509,7 +1543,7 @@ dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -1682,7 +1716,7 @@ dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -1808,7 +1842,7 @@ checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -1829,7 +1863,7 @@ dependencies = [ "darling 0.21.3", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -1849,7 +1883,7 @@ checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -2016,7 +2050,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", "termcolor", ] @@ -2336,7 +2370,7 @@ checksum = "a0aca10fb742cb43f9e7bb8467c91aa9bcb8e3ffbc6a6f7389bb93ffc920577d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -2493,7 +2527,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -2599,7 +2633,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -2924,9 +2958,9 @@ dependencies = [ [[package]] name = "gix-features" -version = "0.45.0" +version = "0.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba0ba40b1ca17f2cb3987c8d54e596aba924201cd8e5947098b441067e6686a0" +checksum = "092a70b60e0cdfc04346ad070ade58c6502afce66b1261bf23a51401eea73d56" dependencies = [ "crc32fast", "crossbeam-channel", @@ -2965,9 +2999,9 @@ dependencies = [ [[package]] name = "gix-fs" -version = "0.18.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95b160a13547a64d67a02d894e4f5502a2a5f98635c89931f6bb9c7a4c80c7db" +checksum = "a167d36b51336499af9e3ff7cde1b6c659b5defe8b2fb71133928a348d939d8e" dependencies = [ "bstr", "fastrand", @@ -2991,9 +3025,9 @@ dependencies = [ [[package]] name = "gix-hash" -version = "0.21.0" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0799db4b114b97da340a3acd6b65f4ef4d325a590acef867ab0e51729b8b761c" +checksum = "3f16fd9bf861f319905759cd8aef230d1a101a26509194617b737a5cb8df9666" dependencies = [ "faster-hex", "gix-features", @@ -3835,7 +3869,7 @@ checksum = "c4c6a3975ccaa66415f5524292750e631879e69178aa97e3928d2396b790d00d" dependencies = [ "quote", "serde_json", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -4111,15 +4145,15 @@ checksum = "bd4f5b4d1c00331c5245163aacfe5f20be75b564c7112d45893d4ae038119eb0" [[package]] name = "instability" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6778b0196eefee7df739db78758e5cf9b37412268bfa5650bfeed028aed20d9c" +checksum = "357b7205c6cd18dd2c86ed312d1e70add149aea98e7ef72b9fdf0270e555c11d" dependencies = [ - "darling 0.20.11", + "darling 0.23.0", "indoc", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -4139,7 +4173,7 @@ checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -4200,7 +4234,7 @@ checksum = "b787bebb543f8969132630c51fd0afab173a86c6abae56ff3b9e5e3e3f9f6e58" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -4543,7 +4577,7 @@ checksum = "5cf92c10c7e361d6b99666ec1c6f9805b0bea2c3bd8c78dc6fe98ac5bd78db11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -4732,7 +4766,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -4784,7 +4818,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -5302,7 +5336,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -5338,7 +5372,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -5461,7 +5495,7 @@ checksum = "a33fa6ec7f2047f572d49317cca19c87195de99c6e5b6ee492da701cfe02b053" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -5484,7 +5518,7 @@ checksum = "e0232bd009a197ceec9cc881ba46f727fcd8060a2d8d6a9dde7a69030a6fe2bb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -5512,7 +5546,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -5567,7 +5601,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b" dependencies = [ "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -5871,7 +5905,7 @@ checksum = "7d323d13972c1b104aa036bc692cd08b822c8bbf23d79a27c526095856499799" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -5900,7 +5934,7 @@ checksum = "def519ddeeb5e43c2b4fc3952c27b3a86782fc05192f322b2309125cd85b1fc3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -5924,8 +5958,6 @@ dependencies = [ [[package]] name = "rmk" version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a301e62e9d2d9f2e44922c121a605aa064f2ef96c5d6f3c4d5fb9e177205186" dependencies = [ "bitfield-struct", "bt-hci", @@ -5970,8 +6002,6 @@ dependencies = [ [[package]] name = "rmk-config" version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f3166813f01b6d3a23260d67cc12e31e97affa89812a499872a33f86688629e" dependencies = [ "cargo_toml", "config", @@ -5988,8 +6018,6 @@ dependencies = [ [[package]] name = "rmk-macro" version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f1aa766e731010e185ec92f1e1db6b9a0a1b3c42ae712bdadb7c7976fa9539" dependencies = [ "cargo_toml", "darling 0.20.11", @@ -6002,15 +6030,13 @@ dependencies = [ "rmk-config", "serde", "serde_derive", - "syn 2.0.111", + "syn 2.0.112", "toml", ] [[package]] name = "rmk-types" version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ec537c7aebb4079311d27b06ec5e82be34a4c0478642317113627d7c36145ff" dependencies = [ "bitfield-struct", "postcard", @@ -6234,7 +6260,7 @@ checksum = "92d48532bc0781ac622a5fea0f16502d3b4f1af0fcebe56d618120969f35d315" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -6266,7 +6292,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -6290,7 +6316,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -6639,7 +6665,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -6695,9 +6721,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.111" +version = "2.0.112" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" +checksum = "21f182278bf2d2bcb3c88b1b08a37df029d71ce3d3ae26168e3c653b213b99d4" dependencies = [ "proc-macro2", "quote", @@ -6712,7 +6738,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -6789,7 +6815,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -6800,7 +6826,7 @@ checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -6950,7 +6976,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -6997,7 +7023,7 @@ dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", "uuid", ] @@ -7394,7 +7420,7 @@ checksum = "8cfcf6171aa2b0f85718ca5888ca32f6edf61d1849f8e4b3786ad890e5b68f68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -7467,7 +7493,7 @@ dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", "wasm-bindgen-shared", ] @@ -7613,7 +7639,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -7624,7 +7650,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -7635,7 +7661,7 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -7646,7 +7672,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -8162,7 +8188,7 @@ checksum = "96fb42cd29c42f8744c74276e9f5bee7b06685bbe5b88df891516d72cb320450" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -8227,7 +8253,7 @@ checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", "synstructure", ] @@ -8274,7 +8300,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", "zbus_names", "zvariant", "zvariant_utils", @@ -8315,7 +8341,7 @@ checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -8335,7 +8361,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", "synstructure", ] @@ -8376,7 +8402,7 @@ checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", ] [[package]] @@ -8387,9 +8413,9 @@ checksum = "40990edd51aae2c2b6907af74ffb635029d5788228222c4bb811e9351c0caad3" [[package]] name = "zmij" -version = "1.0.2" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f4a4e8e9dc5c62d159f04fcdbe07f4c3fb710415aab4754bf11505501e3251d" +checksum = "de9211a9f64b825911bdf0240f58b7a8dac217fe260fc61f080a07f61372fbd5" [[package]] name = "zune-core" @@ -8453,7 +8479,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.112", "zvariant_utils", ] @@ -8466,6 +8492,6 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.111", + "syn 2.0.112", "winnow", ] diff --git a/firmware2/Cargo.toml b/firmware2/Cargo.toml index fdbb381..2e3d2b2 100644 --- a/firmware2/Cargo.toml +++ b/firmware2/Cargo.toml @@ -9,6 +9,7 @@ edition = "2024" [features] default = ["usb-log", "limit-fps"] +develop = ["limit-fps", "alt-log"] no-usb = ["rmk/_no_usb"] ble = ["rmk/esp32s3_ble"] # Use alternative logging via GPIO5 as RX and GPIO12 as TX. @@ -24,6 +25,7 @@ rmk = { version = "0.8.2", default-features = false, features = [ "log", "storage", "vial", + "controller", ] } embassy-executor = { version = "0.9", features = ["log"] } embassy-time = { version = "0.5.0", features = ["log"] } diff --git a/firmware2/build.rs b/firmware2/build.rs index 62f0a88..aab1796 100644 --- a/firmware2/build.rs +++ b/firmware2/build.rs @@ -1,12 +1,12 @@ -use std::fs::File; -use std::io::Read; +use std::fs::{File, OpenOptions}; +use std::io::{Read, Write}; use std::path::Path; use std::{env, fs}; use const_gen::*; +use json::JsonValue; use slint_build::{CompilerConfiguration, EmbedResourcesKind}; use xz2::read::XzEncoder; -// use shadow_rs::{BuildPattern, ShadowBuilder}; fn main() { if let Ok(repo) = gix::discover(env::var_os("CARGO_MANIFEST_DIR").unwrap().into_string().unwrap()) { @@ -19,11 +19,6 @@ fn main() { .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"); @@ -44,7 +39,8 @@ fn main() { fn generate_vial_config() { // Generated vial config file - let out_file = Path::new(&env::var_os("OUT_DIR").unwrap()).join("config_generated.rs"); + let path = Path::new(&env::var_os("OUT_DIR").unwrap()).join("config_generated.rs"); + let mut out_file = OpenOptions::new().create(true).write(true).truncate(true).open(path).unwrap(); let p = Path::new("vial.json"); let mut content = String::new(); @@ -55,9 +51,10 @@ fn generate_vial_config() { Err(e) => println!("Cannot find vial.json {p:?}: {e}"), }; - let vial_cfg = json::stringify(json::parse(&content).unwrap()); + let vial_cfg = json::parse(&content).unwrap(); + let vial_cfg_string = json::stringify(vial_cfg.clone()); let mut keyboard_def_compressed: Vec = Vec::new(); - XzEncoder::new(vial_cfg.as_bytes(), 6) + XzEncoder::new(vial_cfg_string.as_bytes(), 6) .read_to_end(&mut keyboard_def_compressed) .unwrap(); @@ -68,5 +65,25 @@ fn generate_vial_config() { ] .map(|s| "#[allow(clippy::redundant_static_lifetimes)]\n".to_owned() + s.as_str()) .join("\n"); - fs::write(out_file, const_declarations).unwrap(); + + writeln!(out_file, "{}", const_declarations).unwrap(); + + writeln!(out_file, "#[repr(u16)] pub enum CustomKeycodes {{").unwrap(); + + const CUSTOM_KEYCODE_FIRST: u16 = 0x840; + + #[allow(clippy::collapsible_if)] + if let JsonValue::Object(vial_cfg) = vial_cfg { + if let Some(JsonValue::Array(custom_keycodes)) = vial_cfg.get("customKeycodes") { + for (index, custom_keycode) in custom_keycodes.iter().enumerate() { + if let JsonValue::Object(custom_keycode) = custom_keycode { + let name = custom_keycode.get("name").expect("A custom keycode in vial.json is missing a name.") + .as_str().expect("A custom keycode's name must be a string."); + writeln!(out_file, " {} = {},", name, CUSTOM_KEYCODE_FIRST + index as u16).unwrap(); + } + } + } + } + + writeln!(out_file, "}}").unwrap(); } diff --git a/firmware2/src/keymap.rs b/firmware2/src/keymap.rs index 6afbcbc..670a059 100644 --- a/firmware2/src/keymap.rs +++ b/firmware2/src/keymap.rs @@ -1,4 +1,4 @@ -use rmk::types::action::KeyAction; +use rmk::types::action::{KeyAction, Action}; use rmk::{a, k, layer}; use crate::matrix::{MATRIX_COLS, MATRIX_ROWS}; @@ -13,6 +13,7 @@ pub const fn get_default_keymap() -> [[[KeyAction; MATRIX_COLS]; MATRIX_ROWS]; N [k!(Tab), k!(Q), k!(W), k!(E), k!(R), k!(T), k!(Z), k!(U), k!(I), k!(O), k!(P), k!(Delete)], [k!(LCtrl), k!(A), k!(S), k!(D), k!(F), k!(G), k!(H), k!(J), k!(K), k!(L), k!(Comma), k!(Enter)], [k!(LShift), k!(Y), k!(X), k!(C), k!(V), k!(B), k!(N), k!(M), a!(No), a!(No), k!(Up), k!(RShift)], + //[a!(No), a!(No), k!(LGui), k!(LAlt), KeyAction::Single(Action::TriLayerLower), k!(Space), k!(Space), KeyAction::Single(Action::TriLayerLower), k!(RAlt), k!(Left), k!(Down), k!(Right)] [a!(No), a!(No), k!(LGui), k!(LAlt), k!(TriLayerLower), k!(Space), k!(Space), k!(TriLayerLower), k!(RAlt), k!(Left), k!(Down), k!(Right)] ]) ] diff --git a/firmware2/src/main.rs b/firmware2/src/main.rs index 1bf001b..28443aa 100644 --- a/firmware2/src/main.rs +++ b/firmware2/src/main.rs @@ -1,9 +1,12 @@ //! TODO: +//! * GUI event dispatch. +//! * Avoid accessing PSRAM on second core (park it?) while flash is being written to (by vial). //! * Async interrupt handling of keyboard input. Reduces LCD glitching. //! * Attempt to reduce the size of the framebuffer to 240x960 by changing the front/back porch of //! the LCD driver. Reduces LCD glitching. -//! * GUI event dispatch. //! * Bounce buffers to get rid of glitching completely. +//! https://esp32.com/viewtopic.php?t=28230 +//! https://esp32.com/viewtopic.php?f=12&t=26793&start=20#p95677 #![no_std] #![no_main] #![feature(macro_metavar_expr)] @@ -17,7 +20,8 @@ use alloc::boxed::Box; use alloc::vec; use bt_hci::controller::ExternalController; use embassy_executor::Spawner; -use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex; +use embassy_sync::blocking_mutex::raw::{CriticalSectionRawMutex}; +use embassy_sync::channel::Channel; use embassy_sync::signal::Signal; use embassy_time::Duration; use esp_alloc::{HeapRegion, MemoryCapability}; @@ -35,18 +39,24 @@ use esp_hal::rng::TrngSource; use esp_hal::system::Stack; use esp_hal::timer::timg::TimerGroup; use esp_hal::{Blocking, ram}; -use esp_radio::Controller; +use esp_radio::Controller as RadioController; use esp_radio::ble::controller::BleConnector; use esp_rtos::embassy::Executor; use esp_storage::FlashStorage; -use log::{LevelFilter, error, info}; -use rmk::channel::EVENT_CHANNEL; +use log::{LevelFilter, error, info, warn}; +use rmk::channel::{CONTROLLER_CHANNEL, ControllerSub}; use rmk::config::{BehaviorConfig, PositionalConfig, RmkConfig, StorageConfig, VialConfig}; +use rmk::controller::{Controller, EventController}; use rmk::debounce::default_debouncer::DefaultDebouncer; +use rmk::embassy_futures::yield_now; +use rmk::event::{ControllerEvent, KeyboardEvent}; +use rmk::hid::Report; use rmk::input_device::Runnable; -use rmk::{join_all}; +use rmk::join_all; use rmk::keyboard::Keyboard; use rmk::storage::async_flash_wrapper; +use rmk::types::action::{Action, KeyAction}; +use rmk::types::keycode::KeyCode; use rmk::{initialize_keymap_and_storage, run_devices, run_rmk}; use slint::platform::software_renderer::Rgb565Pixel; use slint::ComponentHandle; @@ -57,7 +67,7 @@ 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}; +use crate::vial::{VIAL_KEYBOARD_DEF, VIAL_KEYBOARD_ID, CustomKeycodes}; mod keymap; mod matrix; @@ -163,7 +173,7 @@ async fn main(_spawner: Spawner) { // Enable the TRNG source, so `Trng` can be constructed. let _trng_source = TrngSource::new(peripherals.RNG, peripherals.ADC1); let mut rng = esp_hal::rng::Trng::try_new().unwrap(); - static RADIO: StaticCell> = StaticCell::new(); + static RADIO: StaticCell> = StaticCell::new(); let radio = RADIO.init(esp_radio::init().unwrap()); let bluetooth = peripherals.BT; let connector = BleConnector::new(radio, bluetooth, Default::default()).unwrap(); @@ -313,12 +323,31 @@ async fn main(_spawner: Spawner) { }, ); + let hid_report_proxy_task = { + static KEYBOARD_REPORT_PROXY: Channel = Channel::new(); + + { + *rmk::channel::KEYBOARD_REPORT_SENDER.write().await = &KEYBOARD_REPORT_PROXY; + } + + async { + loop { + let report = KEYBOARD_REPORT_PROXY.receive().await; + + info!("Intercepted HID report: {report:?}"); + rmk::channel::KEYBOARD_REPORT_RECEIVER.send(report).await; + } + } + }; + + let mut user_controller = UserController::new(); + join_all![ // We currently send the framebuffer data using the main core, which does not seem to slow // down the rest of the tasks too much. run_lcd(st7701s, framebuffer), run_devices! ( - (matrix) => EVENT_CHANNEL, + (matrix) => rmk::channel::EVENT_CHANNEL, ), keyboard.run(), // Keyboard is special run_rmk( @@ -330,11 +359,43 @@ async fn main(_spawner: Spawner) { &mut storage, rmk_config, ), + hid_report_proxy_task, + user_controller.event_loop(), alt_uart_rx_task ] .await; } +struct UserController { + sub: ControllerSub, +} + +impl UserController { + fn new() -> Self { + Self { + sub: CONTROLLER_CHANNEL.subscriber().unwrap(), + } + } +} + +impl Controller for UserController { + type Event = ControllerEvent; + + async fn process_event(&mut self, event: Self::Event) { + if let ControllerEvent::Key(keyboard_event, KeyAction::Single(Action::Key(keycode))) = event && (KeyCode::Kb0..=KeyCode::User31).contains(&keycode) { + warn!("{keycode:?} pressed."); + + if keycode as u16 == CustomKeycodes::FOCUS_LCD as u16 { + warn!("Focus LCD pressed."); + } + } + } + + async fn next_message(&mut self) -> Self::Event { + self.sub.next_message_pure().await + } +} + #[embassy_executor::task] async fn run_renderer_task(backend: SlintBackend) { slint::platform::set_platform(Box::new(backend)) @@ -410,82 +471,12 @@ impl Framebuffer { } } -// impl DrawTarget for Framebuffer { -// type Color = Rgb565; -// type Error = (); - -// fn draw_iter(&mut self, pixels: I) -> Result<(), Self::Error> -// where -// I: IntoIterator>, -// { -// let buffer = bytemuck::try_cast_slice_mut::<_, u16>(self.dma_buf.as_mut_slice()).unwrap(); - -// for Pixel(coord, color) in pixels.into_iter() { -// // Check if the pixel coordinates are out of bounds. -// // `DrawTarget` implementation are required to discard any out of bounds -// // pixels without returning an error or causing a panic. -// if coord.x >= 0 -// && coord.x < self.width as i32 -// && coord.y >= 0 -// && coord.y < self.height as i32 -// { -// let index = coord.x as usize + coord.y as usize * self.width as usize; -// buffer[index] = RawU16::from(color).into_inner(); -// } -// } - -// Ok(()) -// } -// } - #[embassy_executor::task] async fn run_lcd_task(st7701s: St7701s<'static, Blocking>, framebuffer: &'static mut Framebuffer) { run_lcd(st7701s, framebuffer).await } async fn run_lcd(mut st7701s: St7701s<'static, Blocking>, framebuffer: &'static mut Framebuffer) { - // const PADDING_LEFT: usize = 121; - // const PADDING_RIGHT: usize = 7; - // const COLORS_WIDTH: usize = 240; - // const COLORS_HEIGHT: usize = 960; - - // const MAX_RED: u8 = (1 << 5) - 1; - // const MAX_GREEN: u8 = (1 << 6) - 1; - // const MAX_BLUE: u8 = (1 << 5) - 1; - - // fn rgb(r: u8, g: u8, b: u8) -> u16 { - // (((r & MAX_RED) as u16) << 11) | (((g & MAX_GREEN) as u16) << 5) | ((b & MAX_BLUE) as u16) - // } - - // fn row(edge: u16) -> impl Iterator + Clone { - // chain![ - // core::iter::repeat_n(rgb(0, 0, 0xFF), PADDING_LEFT), - // core::iter::once(rgb(0xFF, 0xFF, 0xFF)), - // core::iter::repeat_n(edge, COLORS_WIDTH - 2), - // core::iter::once(rgb(0xFF, 0xFF, 0xFF)), - // core::iter::repeat_n(rgb(0, 0, 0xFF), PADDING_RIGHT), - // ] - // } - - // let mut colors = chain![ - // row(rgb(0xFF, 0, 0)), - // core::iter::repeat_n(row(0), COLORS_HEIGHT - 2).flatten(), - // row(rgb(0xFF, 0xFF, 0)), - // ]; - - // const BUFFER_LEN: usize = core::mem::size_of::() - // * (360 + /* TODO: Figure out why more bytes are needed: */ 8) - // * 960; - - // { - // for (chunk, color) in dma_buf.as_mut_slice().chunks_mut(2).zip(&mut colors) { - // chunk.copy_from_slice(&color.to_le_bytes()); - // } - - // info!("chunk addr: {}", dma_buf.as_slice().as_ptr() as usize); - // // colors.next(); // Shift colors - // } - loop { // Timer::after(Duration::from_millis(100)).await; // yield_now().await; diff --git a/firmware2/vial.json b/firmware2/vial.json index 4106278..623aae0 100644 --- a/firmware2/vial.json +++ b/firmware2/vial.json @@ -7,6 +7,48 @@ "rows": 5, "cols": 12 }, + "customKeycodes": [ + { + "name": "BT0", + "title": "Bluetooth Channel 0", + "shortName": "BT0" + }, + { + "name": "BT1", + "title": "Bluetooth Channel 1", + "shortName": "BT1" + }, + { + "name": "BT2", + "title": "Bluetooth Channel 2", + "shortName": "BT2" + }, + { + "name": "NEXT_BT", + "title": "Switch to the next Bluetooth channel", + "shortName": "Next\nBT" + }, + { + "name": "PREV_BT", + "title": "Switch to the previous Bluetooth channel", + "shortName": "Prev\nBT" + }, + { + "name": "CLR_BT", + "title": "Clear bond info for current channel", + "shortName": "Clear\nBT" + }, + { + "name": "SWITCH", + "title": "Switch default output mode between USB/BLE", + "shortName": "Switch\nOutput" + }, + { + "name": "FOCUS_LCD", + "title": "Focus LCD", + "shortName": "Focus\nLCD" + } + ], "layouts": { "keymap": [ [