#[allow(missing_docs)]
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)]
#[repr(u8)]
pub enum KeyCode {
No = 0x00,
ErrorRollOver,
PostFail,
ErrorUndefined,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M, N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z,
Kb1,
Kb2,
Kb3, Kb4,
Kb5,
Kb6,
Kb7,
Kb8,
Kb9,
Kb0,
Enter,
Escape,
BSpace,
Tab,
Space,
Minus,
Equal,
LBracket,
RBracket, Bslash,
NonUsHash,
SColon,
Quote,
Grave,
Comma,
Dot,
Slash,
CapsLock,
F1,
F2,
F3,
F4,
F5,
F6,
F7, F8,
F9,
F10,
F11,
F12,
PScreen,
ScrollLock,
Pause,
Insert,
Home,
PgUp,
Delete,
End,
PgDown,
Right,
Left, Down,
Up,
NumLock,
KpSlash,
KpAsterisk,
KpMinus,
KpPlus,
KpEnter,
Kp1,
Kp2,
Kp3,
Kp4,
Kp5,
Kp6,
Kp7,
Kp8, Kp9,
Kp0,
KpDot,
NonUsBslash,
Application, Power,
KpEqual,
F13,
F14,
F15,
F16,
F17,
F18,
F19,
F20,
F21, F22,
F23,
F24,
Execute,
Help,
Menu,
Select,
Stop,
Again,
Undo,
Cut,
Copy,
Paste,
Find,
Mute,
VolUp, VolDown,
LockingCapsLock,
LockingNumLock,
LockingScrollLock,
KpComma,
KpEqualSign,
Intl1,
Intl2,
Intl3,
Intl4,
Intl5,
Intl6,
Intl7,
Intl8,
Intl9,
Lang1, Lang2,
Lang3,
Lang4,
Lang5,
Lang6,
Lang7,
Lang8,
Lang9,
AltErase,
SysReq,
Cancel,
Clear,
Prior,
Return,
Separator,
Out, Oper,
ClearAgain,
CrSel,
ExSel,
LCtrl = 0xE0,
LShift,
LAlt,
LGui,
RCtrl,
RShift,
RAlt,
RGui,
MediaPlayPause = 0xE8,
MediaStopCD,
MediaPreviousSong,
MediaNextSong,
MediaEjectCD,
MediaVolUp,
MediaVolDown,
MediaMute,
MediaWWW, MediaBack,
MediaForward,
MediaStop,
MediaFind,
MediaScrollUp,
MediaScrollDown,
MediaEdit,
MediaSleep,
MeidaCoffee,
MediaRefresh,
MediaCalc, }
impl KeyCode {
pub fn is_modifier(self) -> bool {
KeyCode::LCtrl <= self && self <= KeyCode::RGui
}
pub fn as_modifier_bit(self) -> u8 {
if self.is_modifier() {
1 << (self as u8 - KeyCode::LCtrl as u8)
} else {
0
}
}
}
#[derive(Default, Debug, Clone, Eq, PartialEq)]
pub struct KbHidReport([u8; 8]);
impl core::iter::FromIterator<KeyCode> for KbHidReport {
fn from_iter<T>(iter: T) -> Self
where
T: IntoIterator<Item = KeyCode>,
{
let mut res = Self::default();
for kc in iter {
res.pressed(kc);
}
res
}
}
impl KbHidReport {
pub fn as_bytes(&self) -> &[u8] {
&self.0
}
pub fn pressed(&mut self, kc: KeyCode) {
use KeyCode::*;
match kc {
No => (),
ErrorRollOver | PostFail | ErrorUndefined => self.set_all(kc),
kc if kc.is_modifier() => self.0[0] |= kc.as_modifier_bit(),
_ => self.0[2..]
.iter_mut()
.find(|c| **c == 0)
.map(|c| *c = kc as u8)
.unwrap_or_else(|| self.set_all(ErrorRollOver)),
}
}
fn set_all(&mut self, kc: KeyCode) {
for c in &mut self.0[2..] {
*c = kc as u8;
}
}
}