HID report interception, listening for user keycodes

This commit is contained in:
Jakub Hlusička 2026-01-02 02:44:00 +01:00
parent 9ecf066abe
commit 67c2a8f2b6
7 changed files with 260 additions and 178 deletions

View file

@ -18,6 +18,9 @@ ESP_LOG = "info"
[unstable] [unstable]
build-std = ["alloc", "core"] build-std = ["alloc", "core"]
[patch.crates-io]
rmk = { path = "../../../rust/rmk/rmk" }
# [patch.crates-io] # [patch.crates-io]
# esp-backtrace = { path = "../../../rust/esp-hal/esp-backtrace" } # esp-backtrace = { path = "../../../rust/esp-hal/esp-backtrace" }
# esp-hal = { path = "../../../rust/esp-hal/esp-hal" } # esp-hal = { path = "../../../rust/esp-hal/esp-hal" }

198
firmware2/Cargo.lock generated
View file

@ -174,7 +174,7 @@ checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -297,7 +297,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -332,7 +332,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -359,7 +359,7 @@ dependencies = [
"derive_utils", "derive_utils",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -465,7 +465,7 @@ dependencies = [
"regex", "regex",
"rustc-hash 2.1.1", "rustc-hash 2.1.1",
"shlex", "shlex",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -503,7 +503,7 @@ checksum = "f48d6ace212fdf1b45fd6b566bb40808415344642b76c3224c07c8df9da81e97"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -514,7 +514,7 @@ checksum = "8769c4854c5ada2852ddf6fd09d15cf43d4c2aaeccb4de6432f5402f08a6003b"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -659,7 +659,7 @@ checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -919,7 +919,7 @@ checksum = "5387f5bbc9e9e6c96436ea125afa12614cebf8ac67f49abc08c1e7a891466c90"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -1195,6 +1195,16 @@ dependencies = [
"darling_macro 0.21.3", "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]] [[package]]
name = "darling_core" name = "darling_core"
version = "0.20.11" version = "0.20.11"
@ -1206,7 +1216,7 @@ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"strsim", "strsim",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -1219,7 +1229,20 @@ dependencies = [
"ident_case", "ident_case",
"proc-macro2", "proc-macro2",
"quote", "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]] [[package]]
@ -1230,7 +1253,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead"
dependencies = [ dependencies = [
"darling_core 0.20.11", "darling_core 0.20.11",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -1241,7 +1264,18 @@ checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81"
dependencies = [ dependencies = [
"darling_core 0.21.3", "darling_core 0.21.3",
"quote", "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]] [[package]]
@ -1281,7 +1315,7 @@ checksum = "780eb241654bf097afb00fc5f054a09b687dad862e485fdcf8399bb056565370"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -1313,7 +1347,7 @@ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"rustc_version 0.4.1", "rustc_version 0.4.1",
"syn 2.0.111", "syn 2.0.112",
"unicode-xid", "unicode-xid",
] ]
@ -1325,7 +1359,7 @@ checksum = "ccfae181bab5ab6c5478b2ccb69e4c68a02f8c3ec72f6616bfec9dbc599d2ee0"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -1363,7 +1397,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -1509,7 +1543,7 @@ dependencies = [
"darling 0.20.11", "darling 0.20.11",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -1682,7 +1716,7 @@ dependencies = [
"darling 0.20.11", "darling 0.20.11",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -1808,7 +1842,7 @@ checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -1829,7 +1863,7 @@ dependencies = [
"darling 0.21.3", "darling 0.21.3",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -1849,7 +1883,7 @@ checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -2016,7 +2050,7 @@ dependencies = [
"proc-macro-crate", "proc-macro-crate",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
"termcolor", "termcolor",
] ]
@ -2336,7 +2370,7 @@ checksum = "a0aca10fb742cb43f9e7bb8467c91aa9bcb8e3ffbc6a6f7389bb93ffc920577d"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -2493,7 +2527,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -2599,7 +2633,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -2924,9 +2958,9 @@ dependencies = [
[[package]] [[package]]
name = "gix-features" name = "gix-features"
version = "0.45.0" version = "0.45.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ba0ba40b1ca17f2cb3987c8d54e596aba924201cd8e5947098b441067e6686a0" checksum = "092a70b60e0cdfc04346ad070ade58c6502afce66b1261bf23a51401eea73d56"
dependencies = [ dependencies = [
"crc32fast", "crc32fast",
"crossbeam-channel", "crossbeam-channel",
@ -2965,9 +2999,9 @@ dependencies = [
[[package]] [[package]]
name = "gix-fs" name = "gix-fs"
version = "0.18.0" version = "0.18.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "95b160a13547a64d67a02d894e4f5502a2a5f98635c89931f6bb9c7a4c80c7db" checksum = "a167d36b51336499af9e3ff7cde1b6c659b5defe8b2fb71133928a348d939d8e"
dependencies = [ dependencies = [
"bstr", "bstr",
"fastrand", "fastrand",
@ -2991,9 +3025,9 @@ dependencies = [
[[package]] [[package]]
name = "gix-hash" name = "gix-hash"
version = "0.21.0" version = "0.21.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0799db4b114b97da340a3acd6b65f4ef4d325a590acef867ab0e51729b8b761c" checksum = "3f16fd9bf861f319905759cd8aef230d1a101a26509194617b737a5cb8df9666"
dependencies = [ dependencies = [
"faster-hex", "faster-hex",
"gix-features", "gix-features",
@ -3835,7 +3869,7 @@ checksum = "c4c6a3975ccaa66415f5524292750e631879e69178aa97e3928d2396b790d00d"
dependencies = [ dependencies = [
"quote", "quote",
"serde_json", "serde_json",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -4111,15 +4145,15 @@ checksum = "bd4f5b4d1c00331c5245163aacfe5f20be75b564c7112d45893d4ae038119eb0"
[[package]] [[package]]
name = "instability" name = "instability"
version = "0.3.10" version = "0.3.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6778b0196eefee7df739db78758e5cf9b37412268bfa5650bfeed028aed20d9c" checksum = "357b7205c6cd18dd2c86ed312d1e70add149aea98e7ef72b9fdf0270e555c11d"
dependencies = [ dependencies = [
"darling 0.20.11", "darling 0.23.0",
"indoc", "indoc",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -4139,7 +4173,7 @@ checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -4200,7 +4234,7 @@ checksum = "b787bebb543f8969132630c51fd0afab173a86c6abae56ff3b9e5e3e3f9f6e58"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -4543,7 +4577,7 @@ checksum = "5cf92c10c7e361d6b99666ec1c6f9805b0bea2c3bd8c78dc6fe98ac5bd78db11"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -4732,7 +4766,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -4784,7 +4818,7 @@ dependencies = [
"proc-macro-crate", "proc-macro-crate",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -5302,7 +5336,7 @@ dependencies = [
"pest_meta", "pest_meta",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -5338,7 +5372,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -5461,7 +5495,7 @@ checksum = "a33fa6ec7f2047f572d49317cca19c87195de99c6e5b6ee492da701cfe02b053"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -5484,7 +5518,7 @@ checksum = "e0232bd009a197ceec9cc881ba46f727fcd8060a2d8d6a9dde7a69030a6fe2bb"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -5512,7 +5546,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -5567,7 +5601,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b" checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b"
dependencies = [ dependencies = [
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -5871,7 +5905,7 @@ checksum = "7d323d13972c1b104aa036bc692cd08b822c8bbf23d79a27c526095856499799"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -5900,7 +5934,7 @@ checksum = "def519ddeeb5e43c2b4fc3952c27b3a86782fc05192f322b2309125cd85b1fc3"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -5924,8 +5958,6 @@ dependencies = [
[[package]] [[package]]
name = "rmk" name = "rmk"
version = "0.8.2" version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a301e62e9d2d9f2e44922c121a605aa064f2ef96c5d6f3c4d5fb9e177205186"
dependencies = [ dependencies = [
"bitfield-struct", "bitfield-struct",
"bt-hci", "bt-hci",
@ -5970,8 +6002,6 @@ dependencies = [
[[package]] [[package]]
name = "rmk-config" name = "rmk-config"
version = "0.6.1" version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f3166813f01b6d3a23260d67cc12e31e97affa89812a499872a33f86688629e"
dependencies = [ dependencies = [
"cargo_toml", "cargo_toml",
"config", "config",
@ -5988,8 +6018,6 @@ dependencies = [
[[package]] [[package]]
name = "rmk-macro" name = "rmk-macro"
version = "0.7.1" version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "17f1aa766e731010e185ec92f1e1db6b9a0a1b3c42ae712bdadb7c7976fa9539"
dependencies = [ dependencies = [
"cargo_toml", "cargo_toml",
"darling 0.20.11", "darling 0.20.11",
@ -6002,15 +6030,13 @@ dependencies = [
"rmk-config", "rmk-config",
"serde", "serde",
"serde_derive", "serde_derive",
"syn 2.0.111", "syn 2.0.112",
"toml", "toml",
] ]
[[package]] [[package]]
name = "rmk-types" name = "rmk-types"
version = "0.2.2" version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ec537c7aebb4079311d27b06ec5e82be34a4c0478642317113627d7c36145ff"
dependencies = [ dependencies = [
"bitfield-struct", "bitfield-struct",
"postcard", "postcard",
@ -6234,7 +6260,7 @@ checksum = "92d48532bc0781ac622a5fea0f16502d3b4f1af0fcebe56d618120969f35d315"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -6266,7 +6292,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -6290,7 +6316,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -6639,7 +6665,7 @@ dependencies = [
"heck", "heck",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -6695,9 +6721,9 @@ dependencies = [
[[package]] [[package]]
name = "syn" name = "syn"
version = "2.0.111" version = "2.0.112"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" checksum = "21f182278bf2d2bcb3c88b1b08a37df029d71ce3d3ae26168e3c653b213b99d4"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -6712,7 +6738,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -6789,7 +6815,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -6800,7 +6826,7 @@ checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -6950,7 +6976,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -6997,7 +7023,7 @@ dependencies = [
"darling 0.20.11", "darling 0.20.11",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
"uuid", "uuid",
] ]
@ -7394,7 +7420,7 @@ checksum = "8cfcf6171aa2b0f85718ca5888ca32f6edf61d1849f8e4b3786ad890e5b68f68"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -7467,7 +7493,7 @@ dependencies = [
"bumpalo", "bumpalo",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
"wasm-bindgen-shared", "wasm-bindgen-shared",
] ]
@ -7613,7 +7639,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -7624,7 +7650,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -7635,7 +7661,7 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -7646,7 +7672,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -8162,7 +8188,7 @@ checksum = "96fb42cd29c42f8744c74276e9f5bee7b06685bbe5b88df891516d72cb320450"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -8227,7 +8253,7 @@ checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
"synstructure", "synstructure",
] ]
@ -8274,7 +8300,7 @@ dependencies = [
"proc-macro-crate", "proc-macro-crate",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
"zbus_names", "zbus_names",
"zvariant", "zvariant",
"zvariant_utils", "zvariant_utils",
@ -8315,7 +8341,7 @@ checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -8335,7 +8361,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
"synstructure", "synstructure",
] ]
@ -8376,7 +8402,7 @@ checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
] ]
[[package]] [[package]]
@ -8387,9 +8413,9 @@ checksum = "40990edd51aae2c2b6907af74ffb635029d5788228222c4bb811e9351c0caad3"
[[package]] [[package]]
name = "zmij" name = "zmij"
version = "1.0.2" version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0f4a4e8e9dc5c62d159f04fcdbe07f4c3fb710415aab4754bf11505501e3251d" checksum = "de9211a9f64b825911bdf0240f58b7a8dac217fe260fc61f080a07f61372fbd5"
[[package]] [[package]]
name = "zune-core" name = "zune-core"
@ -8453,7 +8479,7 @@ dependencies = [
"proc-macro-crate", "proc-macro-crate",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.111", "syn 2.0.112",
"zvariant_utils", "zvariant_utils",
] ]
@ -8466,6 +8492,6 @@ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"serde", "serde",
"syn 2.0.111", "syn 2.0.112",
"winnow", "winnow",
] ]

View file

@ -9,6 +9,7 @@ edition = "2024"
[features] [features]
default = ["usb-log", "limit-fps"] default = ["usb-log", "limit-fps"]
develop = ["limit-fps", "alt-log"]
no-usb = ["rmk/_no_usb"] no-usb = ["rmk/_no_usb"]
ble = ["rmk/esp32s3_ble"] ble = ["rmk/esp32s3_ble"]
# Use alternative logging via GPIO5 as RX and GPIO12 as TX. # 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", "log",
"storage", "storage",
"vial", "vial",
"controller",
] } ] }
embassy-executor = { version = "0.9", features = ["log"] } embassy-executor = { version = "0.9", features = ["log"] }
embassy-time = { version = "0.5.0", features = ["log"] } embassy-time = { version = "0.5.0", features = ["log"] }

View file

@ -1,12 +1,12 @@
use std::fs::File; use std::fs::{File, OpenOptions};
use std::io::Read; use std::io::{Read, Write};
use std::path::Path; use std::path::Path;
use std::{env, fs}; use std::{env, fs};
use const_gen::*; use const_gen::*;
use json::JsonValue;
use slint_build::{CompilerConfiguration, EmbedResourcesKind}; use slint_build::{CompilerConfiguration, EmbedResourcesKind};
use xz2::read::XzEncoder; use xz2::read::XzEncoder;
// use shadow_rs::{BuildPattern, ShadowBuilder};
fn main() { fn main() {
if let Ok(repo) = gix::discover(env::var_os("CARGO_MANIFEST_DIR").unwrap().into_string().unwrap()) { 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()) .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 // Generate vial config at the root of project
println!("cargo:rerun-if-changed=vial.json"); println!("cargo:rerun-if-changed=vial.json");
@ -44,7 +39,8 @@ fn main() {
fn generate_vial_config() { fn generate_vial_config() {
// Generated vial config file // 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 p = Path::new("vial.json");
let mut content = String::new(); let mut content = String::new();
@ -55,9 +51,10 @@ fn generate_vial_config() {
Err(e) => println!("Cannot find vial.json {p:?}: {e}"), 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<u8> = Vec::new(); let mut keyboard_def_compressed: Vec<u8> = Vec::new();
XzEncoder::new(vial_cfg.as_bytes(), 6) XzEncoder::new(vial_cfg_string.as_bytes(), 6)
.read_to_end(&mut keyboard_def_compressed) .read_to_end(&mut keyboard_def_compressed)
.unwrap(); .unwrap();
@ -68,5 +65,25 @@ fn generate_vial_config() {
] ]
.map(|s| "#[allow(clippy::redundant_static_lifetimes)]\n".to_owned() + s.as_str()) .map(|s| "#[allow(clippy::redundant_static_lifetimes)]\n".to_owned() + s.as_str())
.join("\n"); .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();
} }

View file

@ -1,4 +1,4 @@
use rmk::types::action::KeyAction; use rmk::types::action::{KeyAction, Action};
use rmk::{a, k, layer}; use rmk::{a, k, layer};
use crate::matrix::{MATRIX_COLS, MATRIX_ROWS}; 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!(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!(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)], [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)] [a!(No), a!(No), k!(LGui), k!(LAlt), k!(TriLayerLower), k!(Space), k!(Space), k!(TriLayerLower), k!(RAlt), k!(Left), k!(Down), k!(Right)]
]) ])
] ]

View file

@ -1,9 +1,12 @@
//! TODO: //! 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. //! * 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 //! * Attempt to reduce the size of the framebuffer to 240x960 by changing the front/back porch of
//! the LCD driver. Reduces LCD glitching. //! the LCD driver. Reduces LCD glitching.
//! * GUI event dispatch.
//! * Bounce buffers to get rid of glitching completely. //! * 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_std]
#![no_main] #![no_main]
#![feature(macro_metavar_expr)] #![feature(macro_metavar_expr)]
@ -17,7 +20,8 @@ use alloc::boxed::Box;
use alloc::vec; use alloc::vec;
use bt_hci::controller::ExternalController; use bt_hci::controller::ExternalController;
use embassy_executor::Spawner; 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_sync::signal::Signal;
use embassy_time::Duration; use embassy_time::Duration;
use esp_alloc::{HeapRegion, MemoryCapability}; use esp_alloc::{HeapRegion, MemoryCapability};
@ -35,18 +39,24 @@ use esp_hal::rng::TrngSource;
use esp_hal::system::Stack; use esp_hal::system::Stack;
use esp_hal::timer::timg::TimerGroup; use esp_hal::timer::timg::TimerGroup;
use esp_hal::{Blocking, ram}; use esp_hal::{Blocking, ram};
use esp_radio::Controller; use esp_radio::Controller as RadioController;
use esp_radio::ble::controller::BleConnector; use esp_radio::ble::controller::BleConnector;
use esp_rtos::embassy::Executor; use esp_rtos::embassy::Executor;
use esp_storage::FlashStorage; use esp_storage::FlashStorage;
use log::{LevelFilter, error, info}; use log::{LevelFilter, error, info, warn};
use rmk::channel::EVENT_CHANNEL; use rmk::channel::{CONTROLLER_CHANNEL, ControllerSub};
use rmk::config::{BehaviorConfig, PositionalConfig, RmkConfig, StorageConfig, VialConfig}; use rmk::config::{BehaviorConfig, PositionalConfig, RmkConfig, StorageConfig, VialConfig};
use rmk::controller::{Controller, EventController};
use rmk::debounce::default_debouncer::DefaultDebouncer; 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::input_device::Runnable;
use rmk::{join_all}; use rmk::join_all;
use rmk::keyboard::Keyboard; use rmk::keyboard::Keyboard;
use rmk::storage::async_flash_wrapper; 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 rmk::{initialize_keymap_and_storage, run_devices, run_rmk};
use slint::platform::software_renderer::Rgb565Pixel; use slint::platform::software_renderer::Rgb565Pixel;
use slint::ComponentHandle; use slint::ComponentHandle;
@ -57,7 +67,7 @@ use {esp_alloc as _, esp_backtrace as _};
use crate::matrix::IoeMatrix; use crate::matrix::IoeMatrix;
use crate::peripherals::st7701s::St7701s; use crate::peripherals::st7701s::St7701s;
use crate::ui::backend::{FramebufferPtr, SlintBackend}; 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 keymap;
mod matrix; mod matrix;
@ -163,7 +173,7 @@ async fn main(_spawner: Spawner) {
// Enable the TRNG source, so `Trng` can be constructed. // Enable the TRNG source, so `Trng` can be constructed.
let _trng_source = TrngSource::new(peripherals.RNG, peripherals.ADC1); let _trng_source = TrngSource::new(peripherals.RNG, peripherals.ADC1);
let mut rng = esp_hal::rng::Trng::try_new().unwrap(); let mut rng = esp_hal::rng::Trng::try_new().unwrap();
static RADIO: StaticCell<Controller<'static>> = StaticCell::new(); static RADIO: StaticCell<RadioController<'static>> = StaticCell::new();
let radio = RADIO.init(esp_radio::init().unwrap()); let radio = RADIO.init(esp_radio::init().unwrap());
let bluetooth = peripherals.BT; let bluetooth = peripherals.BT;
let connector = BleConnector::new(radio, bluetooth, Default::default()).unwrap(); 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<CriticalSectionRawMutex, Report, 16> = 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![ join_all![
// We currently send the framebuffer data using the main core, which does not seem to slow // We currently send the framebuffer data using the main core, which does not seem to slow
// down the rest of the tasks too much. // down the rest of the tasks too much.
run_lcd(st7701s, framebuffer), run_lcd(st7701s, framebuffer),
run_devices! ( run_devices! (
(matrix) => EVENT_CHANNEL, (matrix) => rmk::channel::EVENT_CHANNEL,
), ),
keyboard.run(), // Keyboard is special keyboard.run(), // Keyboard is special
run_rmk( run_rmk(
@ -330,11 +359,43 @@ async fn main(_spawner: Spawner) {
&mut storage, &mut storage,
rmk_config, rmk_config,
), ),
hid_report_proxy_task,
user_controller.event_loop(),
alt_uart_rx_task alt_uart_rx_task
] ]
.await; .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] #[embassy_executor::task]
async fn run_renderer_task(backend: SlintBackend) { async fn run_renderer_task(backend: SlintBackend) {
slint::platform::set_platform(Box::new(backend)) 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<I>(&mut self, pixels: I) -> Result<(), Self::Error>
// where
// I: IntoIterator<Item = Pixel<Self::Color>>,
// {
// 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] #[embassy_executor::task]
async fn run_lcd_task(st7701s: St7701s<'static, Blocking>, framebuffer: &'static mut Framebuffer) { async fn run_lcd_task(st7701s: St7701s<'static, Blocking>, framebuffer: &'static mut Framebuffer) {
run_lcd(st7701s, framebuffer).await run_lcd(st7701s, framebuffer).await
} }
async fn run_lcd(mut st7701s: St7701s<'static, Blocking>, framebuffer: &'static mut Framebuffer) { 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<Item = u16> + 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::<u16>()
// * (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 { loop {
// Timer::after(Duration::from_millis(100)).await; // Timer::after(Duration::from_millis(100)).await;
// yield_now().await; // yield_now().await;

View file

@ -7,6 +7,48 @@
"rows": 5, "rows": 5,
"cols": 12 "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": { "layouts": {
"keymap": [ "keymap": [
[ [