diff --git a/Cargo.lock b/Cargo.lock index 56e7df0..61c7999 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -37,9 +37,9 @@ dependencies = [ [[package]] name = "atomic-polyfill" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d299f547288d6db8d5c3a2916f7b2f66134b15b8c1ac1c4357dd3b8752af7bb2" +checksum = "c314e70d181aa6053b26e3f7fbf86d1dfff84f816a6175b967666b3506ef7289" dependencies = [ "critical-section", ] @@ -166,7 +166,7 @@ checksum = "f0f6f3e36f203cfedbc78b357fb28730aa2c6dc1ab060ee5c2405e843988d3c7" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -202,7 +202,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn", + "syn 1.0.109", ] [[package]] @@ -213,7 +213,7 @@ checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" dependencies = [ "darling_core", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -252,9 +252,9 @@ checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" [[package]] name = "embassy-cortex-m" version = "0.1.0" -source = "git+https://github.com/embassy-rs/embassy.git#055597063f2d3f1156a9f8076c601dd300d85542" +source = "git+https://github.com/embassy-rs/embassy.git#4bfe6248936bf9d12185ada7f43c938d87f99841" dependencies = [ - "atomic-polyfill 1.0.1", + "atomic-polyfill 1.0.2", "cfg-if", "cortex-m", "critical-section", @@ -267,7 +267,7 @@ dependencies = [ [[package]] name = "embassy-embedded-hal" version = "0.1.0" -source = "git+https://github.com/embassy-rs/embassy.git#055597063f2d3f1156a9f8076c601dd300d85542" +source = "git+https://github.com/embassy-rs/embassy.git#4bfe6248936bf9d12185ada7f43c938d87f99841" dependencies = [ "embassy-sync", "embedded-hal 0.2.7", @@ -281,9 +281,9 @@ dependencies = [ [[package]] name = "embassy-executor" version = "0.1.1" -source = "git+https://github.com/embassy-rs/embassy.git#055597063f2d3f1156a9f8076c601dd300d85542" +source = "git+https://github.com/embassy-rs/embassy.git#4bfe6248936bf9d12185ada7f43c938d87f99841" dependencies = [ - "atomic-polyfill 1.0.1", + "atomic-polyfill 1.0.2", "cfg-if", "critical-section", "embassy-macros", @@ -296,7 +296,7 @@ dependencies = [ [[package]] name = "embassy-futures" version = "0.1.0" -source = "git+https://github.com/embassy-rs/embassy.git#055597063f2d3f1156a9f8076c601dd300d85542" +source = "git+https://github.com/embassy-rs/embassy.git#4bfe6248936bf9d12185ada7f43c938d87f99841" dependencies = [ "log", ] @@ -304,7 +304,7 @@ dependencies = [ [[package]] name = "embassy-hal-common" version = "0.1.0" -source = "git+https://github.com/embassy-rs/embassy.git#055597063f2d3f1156a9f8076c601dd300d85542" +source = "git+https://github.com/embassy-rs/embassy.git#4bfe6248936bf9d12185ada7f43c938d87f99841" dependencies = [ "num-traits", ] @@ -312,23 +312,23 @@ dependencies = [ [[package]] name = "embassy-macros" version = "0.1.0" -source = "git+https://github.com/embassy-rs/embassy.git#055597063f2d3f1156a9f8076c601dd300d85542" +source = "git+https://github.com/embassy-rs/embassy.git#4bfe6248936bf9d12185ada7f43c938d87f99841" dependencies = [ "darling", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "embassy-net-driver" version = "0.1.0" -source = "git+https://github.com/embassy-rs/embassy.git#055597063f2d3f1156a9f8076c601dd300d85542" +source = "git+https://github.com/embassy-rs/embassy.git#4bfe6248936bf9d12185ada7f43c938d87f99841" [[package]] name = "embassy-net-driver-channel" version = "0.1.0" -source = "git+https://github.com/embassy-rs/embassy.git#055597063f2d3f1156a9f8076c601dd300d85542" +source = "git+https://github.com/embassy-rs/embassy.git#4bfe6248936bf9d12185ada7f43c938d87f99841" dependencies = [ "embassy-futures", "embassy-net-driver", @@ -338,9 +338,9 @@ dependencies = [ [[package]] name = "embassy-rp" version = "0.1.0" -source = "git+https://github.com/embassy-rs/embassy.git#055597063f2d3f1156a9f8076c601dd300d85542" +source = "git+https://github.com/embassy-rs/embassy.git#4bfe6248936bf9d12185ada7f43c938d87f99841" dependencies = [ - "atomic-polyfill 1.0.1", + "atomic-polyfill 1.0.2", "cfg-if", "cortex-m", "cortex-m-rt", @@ -372,7 +372,7 @@ dependencies = [ [[package]] name = "embassy-sync" version = "0.1.0" -source = "git+https://github.com/embassy-rs/embassy.git#055597063f2d3f1156a9f8076c601dd300d85542" +source = "git+https://github.com/embassy-rs/embassy.git#4bfe6248936bf9d12185ada7f43c938d87f99841" dependencies = [ "cfg-if", "critical-section", @@ -385,9 +385,9 @@ dependencies = [ [[package]] name = "embassy-time" version = "0.1.0" -source = "git+https://github.com/embassy-rs/embassy.git#055597063f2d3f1156a9f8076c601dd300d85542" +source = "git+https://github.com/embassy-rs/embassy.git#4bfe6248936bf9d12185ada7f43c938d87f99841" dependencies = [ - "atomic-polyfill 1.0.1", + "atomic-polyfill 1.0.2", "cfg-if", "critical-section", "embassy-sync", @@ -400,7 +400,7 @@ dependencies = [ [[package]] name = "embassy-usb" version = "0.1.0" -source = "git+https://github.com/embassy-rs/embassy.git#055597063f2d3f1156a9f8076c601dd300d85542" +source = "git+https://github.com/embassy-rs/embassy.git#4bfe6248936bf9d12185ada7f43c938d87f99841" dependencies = [ "embassy-futures", "embassy-net-driver-channel", @@ -414,12 +414,12 @@ dependencies = [ [[package]] name = "embassy-usb-driver" version = "0.1.0" -source = "git+https://github.com/embassy-rs/embassy.git#055597063f2d3f1156a9f8076c601dd300d85542" +source = "git+https://github.com/embassy-rs/embassy.git#4bfe6248936bf9d12185ada7f43c938d87f99841" [[package]] name = "embassy-usb-logger" version = "0.1.0" -source = "git+https://github.com/embassy-rs/embassy.git#055597063f2d3f1156a9f8076c601dd300d85542" +source = "git+https://github.com/embassy-rs/embassy.git#4bfe6248936bf9d12185ada7f43c938d87f99841" dependencies = [ "embassy-futures", "embassy-sync", @@ -498,9 +498,9 @@ dependencies = [ [[package]] name = "ena" -version = "0.14.1" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2e5d13ca2353ab7d0230988629def93914a8c4015f621f9b13ed2955614731d" +checksum = "c533630cf40e9caa44bd91aadc88a75d75a4c3a12b4cfde353cbed41daa1e1f1" dependencies = [ "log", ] @@ -525,9 +525,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "futures" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13e2792b0ff0340399d58445b88fd9770e3489eff258a4cbc1523418f12abf84" +checksum = "531ac96c6ff5fd7c62263c5e3c67a603af4fcaee2e1a0ae5565ba3a11e69e549" dependencies = [ "futures-channel", "futures-core", @@ -539,9 +539,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e5317663a9089767a1ec00a487df42e0ca174b61b4483213ac24448e4664df5" +checksum = "164713a5a0dcc3e7b4b1ed7d3b433cabc18025386f9339346e8daf15963cf7ac" dependencies = [ "futures-core", "futures-sink", @@ -549,44 +549,44 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec90ff4d0fe1f57d600049061dc6bb68ed03c7d2fbd697274c41805dcb3f8608" +checksum = "86d7a0c1aa76363dac491de0ee99faf6941128376f1cf96f07db7603b7de69dd" [[package]] name = "futures-io" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfb8371b6fb2aeb2d280374607aeabfc99d95c72edfe51692e42d3d7f0d08531" +checksum = "89d422fa3cbe3b40dca574ab087abb5bc98258ea57eea3fd6f1fa7162c778b91" [[package]] name = "futures-macro" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a73af87da33b5acf53acfebdc339fe592ecf5357ac7c0a7734ab9d8c876a70" +checksum = "3eb14ed937631bd8b8b8977f2c198443447a8355b6e3ca599f38c975e5a963b6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "futures-sink" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f310820bb3e8cfd46c80db4d7fb8353e15dfff853a127158425f31e0be6c8364" +checksum = "ec93083a4aecafb2a80a885c9de1f0ccae9dbd32c2bb54b0c3a65690e0b8d2f2" [[package]] name = "futures-task" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf79a1bf610b10f42aea489289c5a2c478a786509693b80cd39c44ccd936366" +checksum = "fd65540d33b37b16542a0438c12e6aeead10d4ac5d05bd3f805b8f35ab592879" [[package]] name = "futures-util" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c1d6de3acfef38d2be4b1f543f553131788603495be83da675e180c8d6b7bd1" +checksum = "3ef6b17e481503ec85211fed8f39d1970f128935ca1f814cd32ac4a6842e84ab" dependencies = [ "futures-core", "futures-macro", @@ -786,7 +786,7 @@ checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -896,7 +896,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -925,7 +925,7 @@ dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "version_check", ] @@ -942,18 +942,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.51" +version = "1.0.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d727cae5b39d21da60fa540906919ad737832fe0b1c165da3a34d6548c849d6" +checksum = "1d0e1ae9e836cc3beddd63db0df682593d7e2d3d891ae8c9083d2113e1744224" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.23" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" +checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" dependencies = [ "proc-macro2", ] @@ -1045,7 +1045,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.16", + "semver 1.0.17", ] [[package]] @@ -1071,9 +1071,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58bc9567378fc7690d6b2addae4e60ac2eeea07becb2c64b9f218b53865cba2a" +checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" [[package]] name = "semver-parser" @@ -1083,22 +1083,22 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.156" +version = "1.0.157" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "314b5b092c0ade17c00142951e50ced110ec27cea304b1037c6969246c2469a4" +checksum = "707de5fcf5df2b5788fca98dd7eab490bc2fd9b7ef1404defc462833b83f25ca" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.156" +version = "1.0.157" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7e29c4601e36bcec74a223228dce795f4cd3616341a4af93520ca1a837c087d" +checksum = "78997f4555c22a7971214540c4a661291970619afd56de19f77e0de86296e1e5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.2", ] [[package]] @@ -1133,9 +1133,9 @@ dependencies = [ [[package]] name = "spin" -version = "0.9.5" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dccf47db1b41fa1573ed27ccf5e08e3ca771cb994f776668c5ebda893b248fc" +checksum = "b5d6e0250b93c8427a177b849d144a96d5acc57006149479403d7861ab721e34" dependencies = [ "lock_api", ] @@ -1162,7 +1162,7 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4c37c250d21f53fa7165e76e5401d7e6539c211a8d2cf449e3962956a5cc2ce" dependencies = [ - "atomic-polyfill 1.0.1", + "atomic-polyfill 1.0.2", ] [[package]] @@ -1195,6 +1195,17 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59d3276aee1fa0c33612917969b5172b5be2db051232a6e4826f1a1a9191b045" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "tangentbord1" version = "0.1.0" @@ -1248,29 +1259,29 @@ dependencies = [ [[package]] name = "tgnt" version = "0.1.0" -source = "git+https://git.nubo.sh/hulthe/tgnt.git#e22588c2cb139864fcd3be1087350803343c622b" +source = "git+https://git.nubo.sh/hulthe/tgnt.git#eb18dc95902e5698e6a506798559d367d7fd7ced" dependencies = [ "serde", ] [[package]] name = "thiserror" -version = "1.0.39" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5ab016db510546d856297882807df8da66a16fb8c4101cb8b30054b0d5b2d9c" +checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.39" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5420d42e90af0c38c3290abcca25b9b3bdf379fc9f55c528f53a269d9c9a267e" +checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.2", ] [[package]] @@ -1337,7 +1348,7 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn", + "syn 1.0.109", "usbd-hid-descriptors", ] @@ -1416,9 +1427,9 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.42.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", @@ -1431,42 +1442,42 @@ dependencies = [ [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" [[package]] name = "windows_aarch64_msvc" -version = "0.42.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" [[package]] name = "windows_i686_gnu" -version = "0.42.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" [[package]] name = "windows_i686_msvc" -version = "0.42.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" [[package]] name = "windows_x86_64_gnu" -version = "0.42.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" [[package]] name = "windows_x86_64_msvc" -version = "0.42.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" diff --git a/src/keyboard.rs b/src/keyboard.rs index 320a91a..8e20692 100644 --- a/src/keyboard.rs +++ b/src/keyboard.rs @@ -97,24 +97,25 @@ async fn switch_task(switch_num: usize, pin: AnyPin, layers: &'static [Layer]) - KB_REPORT.lock().await.release_key(key); continue; } - Button::Mod(modifier) => { - // TODO - //KB_REPORT.lock().await.press_mod(modifier); - //pin.wait_for_high().await; - //KB_REPORT.lock().await.release_mod(modifier); - //continue; + &Button::Mod(modifier) => { + KB_REPORT.lock().await.press_modifier(modifier); + wait_for_release.await; + KB_REPORT.lock().await.release_modifier(modifier); + continue; } - Button::ModTap { keycode, modifier } => { + &Button::ModTap { keycode, modifier } => { select_biased! { _ = Timer::after(MOD_TAP_TIME).fuse() => { - // TODO: Modifier + KB_REPORT.lock().await.press_modifier(modifier); pin.wait_for_high().await; + KB_REPORT.lock().await.release_modifier(modifier); + debug!("switch {switch_num} button {button:?} released"); continue; } _ = wait_for_release.fuse() => { - KB_REPORT.lock().await.press_key(*keycode); + KB_REPORT.lock().await.press_key(keycode); Timer::after(Duration::from_millis(10)).await; - KB_REPORT.lock().await.release_key(*keycode); + KB_REPORT.lock().await.release_key(keycode); continue; } } @@ -122,10 +123,12 @@ async fn switch_task(switch_num: usize, pin: AnyPin, layers: &'static [Layer]) - Button::NextLayer => { let next_layer = (current_layer + 1) % layer_count; CURRENT_LAYER.store(next_layer, Ordering::Relaxed); + debug!("switched to layer {next_layer}"); } Button::PrevLayer => { let prev_layer = current_layer.checked_sub(1).unwrap_or(layer_count - 1); CURRENT_LAYER.store(prev_layer, Ordering::Relaxed); + debug!("switched to layer {prev_layer}"); } Button::None => {} } diff --git a/src/usb/keyboard.rs b/src/usb/keyboard.rs index 22711af..23e8821 100644 --- a/src/usb/keyboard.rs +++ b/src/usb/keyboard.rs @@ -103,7 +103,7 @@ async fn keyboard_test(mut stream: HidStream, _handler: &'static Handler) -> Res } #[cfg(feature = "n-key-rollover")] - stream.write(&report.serialized()).await?; + stream.write(report.as_bytes()).await?; #[cfg(not(feature = "n-key-rollover"))] stream.write_serialize(&report).await?; diff --git a/src/usb/keyboard/report.rs b/src/usb/keyboard/report.rs index c65ed38..ce25a75 100644 --- a/src/usb/keyboard/report.rs +++ b/src/usb/keyboard/report.rs @@ -7,21 +7,24 @@ /// Unlike usbd_hids KeyboardReport, this one supports N-key rollover. #[derive(Clone, PartialEq, Eq)] #[cfg(feature = "n-key-rollover")] +#[repr(C, packed)] pub struct KeyboardReport { pub modifier: u8, - /// Bitmap representing all keycodes from 0 to 104 - pub keycodes: [u8; 13], + /// Bitmap representing all keycodes from 0 to 215 + pub keycodes: [u8; 27], } -use tgnt::keys::Key; +use core::mem::{size_of, transmute}; +use tgnt::{button::Modifier, keys::Key}; + #[cfg(not(feature = "n-key-rollover"))] -pub use usbd_hid::descriptor::KeyboardReport; +pub use ::usbd_hid::descriptor::KeyboardReport; #[cfg(feature = "n-key-rollover")] pub const EMPTY_KEYBOARD_REPORT: KeyboardReport = KeyboardReport { modifier: 0, - keycodes: [0; 13], + keycodes: [0; 27], }; #[cfg(not(feature = "n-key-rollover"))] @@ -34,6 +37,7 @@ pub const EMPTY_KEYBOARD_REPORT: KeyboardReport = KeyboardReport { #[cfg(feature = "n-key-rollover")] impl KeyboardReport { + #[inline(always)] pub fn set_key(&mut self, key: Key, pressed: bool) { let keycode = u8::from(key); let byte = keycode >> 3; @@ -51,29 +55,43 @@ impl KeyboardReport { } } + #[inline(always)] pub fn press_key(&mut self, key: Key) { self.set_key(key, true) } + #[inline(always)] pub fn release_key(&mut self, key: Key) { self.set_key(key, false) } - pub fn serialized(&self) -> [u8; 14] { - let [a, b, c, d, e, f, g, h, i, j, k, l, m] = self.keycodes; - [self.modifier, a, b, c, d, e, f, g, h, i, j, k, l, m] + #[inline(always)] + pub fn set_modifier(&mut self, modifier: Modifier, pressed: bool) { + if pressed { + self.modifier |= u8::from(modifier); + } else { + self.modifier &= !u8::from(modifier); + } + } + + #[inline(always)] + pub fn press_modifier(&mut self, modifier: Modifier) { + self.set_modifier(modifier, true) + } + + #[inline(always)] + pub fn release_modifier(&mut self, modifier: Modifier) { + self.set_modifier(modifier, false) + } + + #[inline(always)] + pub fn as_bytes(&self) -> &[u8; size_of::()] { + // SAFETY: KeyboardReport is repr(C, packed) and contains only u8s. + unsafe { transmute(self) } } } // bitmasks for the `modifier` field -pub const MOD_LCTRL: u8 = 0x01; -pub const MOD_LSHIFT: u8 = 0x02; -pub const MOD_LALT: u8 = 0x04; -pub const MOD_LSUPER: u8 = 0x08; -pub const MOD_RCTRL: u8 = 0x10; -pub const MOD_RSHIFT: u8 = 0x20; -pub const MOD_RALT: u8 = 0x40; -pub const MOD_RSUPER: u8 = 0x80; #[cfg(feature = "n-key-rollover")] impl usbd_hid::descriptor::SerializedDescriptor for KeyboardReport { @@ -95,8 +113,10 @@ impl usbd_hid::descriptor::SerializedDescriptor for KeyboardReport { 0x81, 0x02, // input (variable) // 0x19, 0x00, // local usage minimum - 0x29, 0x67, // local usage maximum - 0x95, 0x68, // report count + //0x29, 0x67, // local usage maximum (0x67) + //0x95, 0x68, // report count (0x68) + 0x29, 215, // local usage maximum (215) + 0x95, 216, // report count (216) 0x81, 0x02, // input (variable) // 0x05, 0x08, // usage page 8 (led page)