1#![cfg_attr(not(test), no_std)]
21
22pub mod layouts;
29
30mod scancodes;
31pub use crate::scancodes::{ScancodeSet1, ScancodeSet2};
32
33#[derive(Debug)]
41pub struct Keyboard<L, S>
42where
43 S: ScancodeSet,
44 L: KeyboardLayout,
45{
46 ps2_decoder: Ps2Decoder,
47 scancode_set: S,
48 event_decoder: EventDecoder<L>,
49}
50
51#[derive(Debug)]
53pub struct Ps2Decoder {
54 register: u16,
55 num_bits: u8,
56}
57
58#[derive(Debug)]
60pub struct EventDecoder<L>
61where
62 L: KeyboardLayout,
63{
64 handle_ctrl: HandleControl,
65 modifiers: Modifiers,
66 layout: L,
67}
68
69#[derive(Debug, PartialEq, Eq, Copy, Clone)]
71#[non_exhaustive]
72pub enum Error {
73 BadStartBit,
74 BadStopBit,
75 ParityError,
76 UnknownKeyCode,
77}
78
79#[derive(Debug, PartialEq, Eq, Copy, Clone, PartialOrd, Ord)]
85#[repr(u8)]
86pub enum KeyCode {
87 Escape,
90 F1,
92 F2,
94 F3,
96 F4,
98 F5,
100 F6,
102 F7,
104 F8,
106 F9,
108 F10,
110 F11,
112 F12,
114
115 PrintScreen,
117 SysRq,
119 ScrollLock,
121 PauseBreak,
123
124 Oem8,
127 Key1,
129 Key2,
131 Key3,
133 Key4,
135 Key5,
137 Key6,
139 Key7,
141 Key8,
143 Key9,
145 Key0,
147 OemMinus,
149 OemPlus,
151 Backspace,
153
154 Insert,
156 Home,
158 PageUp,
160
161 NumpadLock,
163 NumpadDivide,
165 NumpadMultiply,
167 NumpadSubtract,
169
170 Tab,
173 Q,
175 W,
177 E,
179 R,
181 T,
183 Y,
185 U,
187 I,
189 O,
191 P,
193 Oem4,
195 Oem6,
197 Oem5,
199 Oem7,
201
202 Delete,
204 End,
206 PageDown,
208
209 Numpad7,
211 Numpad8,
213 Numpad9,
215 NumpadAdd,
217
218 CapsLock,
221 A,
223 S,
225 D,
227 F,
229 G,
231 H,
233 J,
235 K,
237 L,
239 Oem1,
241 Oem3,
243
244 Return,
246
247 Numpad4,
249 Numpad5,
251 Numpad6,
253
254 LShift,
257 Z,
259 X,
261 C,
263 V,
265 B,
267 N,
269 M,
271 OemComma,
273 OemPeriod,
275 Oem2,
277 RShift,
279
280 ArrowUp,
282
283 Numpad1,
285 Numpad2,
287 Numpad3,
289 NumpadEnter,
291
292 LControl,
295 LWin,
297 LAlt,
299 Spacebar,
301 RAltGr,
303 RWin,
305 Apps,
307 RControl,
309
310 ArrowLeft,
312 ArrowDown,
314 ArrowRight,
316
317 Numpad0,
319 NumpadPeriod,
321
322 Oem9,
325 Oem10,
327 Oem11,
329 Oem12,
331 Oem13,
333
334 PrevTrack,
337 NextTrack,
339 Mute,
341 Calculator,
343 Play,
345 Stop,
347 VolumeDown,
349 VolumeUp,
351 WWWHome,
353 PowerOnTestOk,
355 TooManyKeys,
357 RControl2,
359 RAlt2,
361}
362
363#[derive(Debug, PartialEq, Eq, Copy, Clone)]
365pub enum KeyState {
366 Up,
368 Down,
370 SingleShot,
373}
374
375#[derive(Debug, PartialEq, Eq, Copy, Clone)]
378pub enum HandleControl {
379 MapLettersToUnicode,
383 Ignore,
386}
387
388#[derive(Debug, PartialEq, Eq, Clone)]
390pub struct KeyEvent {
391 pub code: KeyCode,
393 pub state: KeyState,
395}
396
397pub trait KeyboardLayout {
401 fn map_keycode(
406 &self,
407 keycode: KeyCode,
408 modifiers: &Modifiers,
409 handle_ctrl: HandleControl,
410 ) -> DecodedKey;
411}
412
413pub trait ScancodeSet {
417 fn advance_state(&mut self, code: u8) -> Result<Option<KeyEvent>, Error>;
419}
420
421#[derive(Debug, Default, Clone, Eq, PartialEq, Hash)]
423pub struct Modifiers {
424 pub lshift: bool,
426 pub rshift: bool,
428 pub lctrl: bool,
430 pub rctrl: bool,
432 pub numlock: bool,
434 pub capslock: bool,
436 pub lalt: bool,
438 pub ralt: bool,
440 pub rctrl2: bool,
442}
443
444#[derive(Debug, PartialEq, Eq, Copy, Clone)]
446pub enum DecodedKey {
447 RawKey(KeyCode),
448 Unicode(char),
449}
450
451#[derive(Debug, Copy, Clone, Eq, PartialEq)]
467enum DecodeState {
468 Start,
469 Extended,
470 Release,
471 ExtendedRelease,
472 Extended2,
473 Extended2Release,
474}
475
476const KEYCODE_BITS: u8 = 11;
483const EXTENDED_KEY_CODE: u8 = 0xE0;
484const EXTENDED2_KEY_CODE: u8 = 0xE1;
485const KEY_RELEASE_CODE: u8 = 0xF0;
486
487impl<L, S> Keyboard<L, S>
494where
495 L: KeyboardLayout,
496 S: ScancodeSet,
497{
498 pub const fn new(scancode_set: S, layout: L, handle_ctrl: HandleControl) -> Keyboard<L, S> {
500 Keyboard {
501 ps2_decoder: Ps2Decoder::new(),
502 scancode_set,
503 event_decoder: EventDecoder::new(layout, handle_ctrl),
504 }
505 }
506
507 pub const fn get_modifiers(&self) -> &Modifiers {
509 &self.event_decoder.modifiers
510 }
511
512 pub fn set_ctrl_handling(&mut self, new_value: HandleControl) {
514 self.event_decoder.set_ctrl_handling(new_value);
515 }
516
517 pub const fn get_ctrl_handling(&self) -> HandleControl {
519 self.event_decoder.get_ctrl_handling()
520 }
521
522 pub fn clear(&mut self) {
526 self.ps2_decoder.clear();
527 }
528
529 pub fn add_word(&mut self, word: u16) -> Result<Option<KeyEvent>, Error> {
537 let byte = self.ps2_decoder.add_word(word)?;
538 self.add_byte(byte)
539 }
540
541 pub fn add_byte(&mut self, byte: u8) -> Result<Option<KeyEvent>, Error> {
546 self.scancode_set.advance_state(byte)
547 }
548
549 pub fn add_bit(&mut self, bit: bool) -> Result<Option<KeyEvent>, Error> {
554 if let Some(byte) = self.ps2_decoder.add_bit(bit)? {
555 self.scancode_set.advance_state(byte)
556 } else {
557 Ok(None)
558 }
559 }
560
561 pub fn process_keyevent(&mut self, ev: KeyEvent) -> Option<DecodedKey> {
568 self.event_decoder.process_keyevent(ev)
569 }
570}
571
572impl Ps2Decoder {
573 pub const fn new() -> Ps2Decoder {
575 Ps2Decoder {
576 register: 0,
577 num_bits: 0,
578 }
579 }
580
581 pub fn clear(&mut self) {
585 self.register = 0;
586 self.num_bits = 0;
587 }
588
589 pub fn add_bit(&mut self, bit: bool) -> Result<Option<u8>, Error> {
593 self.register |= (bit as u16) << self.num_bits;
594 self.num_bits += 1;
595 if self.num_bits == KEYCODE_BITS {
596 let word = self.register;
597 self.register = 0;
598 self.num_bits = 0;
599 let byte = Self::check_word(word)?;
600 Ok(Some(byte))
601 } else {
602 Ok(None)
603 }
604 }
605
606 pub fn add_word(&self, word: u16) -> Result<u8, Error> {
610 Self::check_word(word)
611 }
612
613 const fn check_word(word: u16) -> Result<u8, Error> {
615 let start_bit = Self::get_bit(word, 0);
616 let parity_bit = Self::get_bit(word, 9);
617 let stop_bit = Self::get_bit(word, 10);
618 let data = ((word >> 1) & 0xFF) as u8;
619
620 if start_bit {
621 return Err(Error::BadStartBit);
622 }
623
624 if !stop_bit {
625 return Err(Error::BadStopBit);
626 }
627
628 let need_parity = Self::has_even_number_bits(data);
631
632 if need_parity != parity_bit {
633 return Err(Error::ParityError);
634 }
635
636 Ok(data)
637 }
638
639 const fn get_bit(word: u16, offset: usize) -> bool {
640 ((word >> offset) & 0x0001) != 0
641 }
642
643 const fn has_even_number_bits(data: u8) -> bool {
644 (data.count_ones() % 2) == 0
645 }
646}
647
648impl Default for Ps2Decoder {
649 fn default() -> Self {
650 Ps2Decoder::new()
651 }
652}
653
654impl<L> EventDecoder<L>
655where
656 L: KeyboardLayout,
657{
658 pub const fn new(layout: L, handle_ctrl: HandleControl) -> EventDecoder<L> {
660 EventDecoder {
661 handle_ctrl,
662 modifiers: Modifiers {
663 lshift: false,
664 rshift: false,
665 lctrl: false,
666 rctrl: false,
667 numlock: true,
668 capslock: false,
669 lalt: false,
670 ralt: false,
671 rctrl2: false,
672 },
673 layout,
674 }
675 }
676
677 pub fn set_ctrl_handling(&mut self, new_value: HandleControl) {
679 self.handle_ctrl = new_value;
680 }
681
682 pub const fn get_ctrl_handling(&self) -> HandleControl {
684 self.handle_ctrl
685 }
686
687 pub fn process_keyevent(&mut self, ev: KeyEvent) -> Option<DecodedKey> {
694 match ev {
695 KeyEvent {
696 code: KeyCode::LShift,
697 state: KeyState::Down,
698 } => {
699 self.modifiers.lshift = true;
700 Some(DecodedKey::RawKey(KeyCode::LShift))
701 }
702 KeyEvent {
703 code: KeyCode::RShift,
704 state: KeyState::Down,
705 } => {
706 self.modifiers.rshift = true;
707 Some(DecodedKey::RawKey(KeyCode::RShift))
708 }
709 KeyEvent {
710 code: KeyCode::LShift,
711 state: KeyState::Up,
712 } => {
713 self.modifiers.lshift = false;
714 None
715 }
716 KeyEvent {
717 code: KeyCode::RShift,
718 state: KeyState::Up,
719 } => {
720 self.modifiers.rshift = false;
721 None
722 }
723 KeyEvent {
724 code: KeyCode::CapsLock,
725 state: KeyState::Down,
726 } => {
727 self.modifiers.capslock = !self.modifiers.capslock;
728 Some(DecodedKey::RawKey(KeyCode::CapsLock))
729 }
730 KeyEvent {
731 code: KeyCode::NumpadLock,
732 state: KeyState::Down,
733 } => {
734 if self.modifiers.rctrl2 {
735 Some(DecodedKey::RawKey(KeyCode::PauseBreak))
738 } else {
739 self.modifiers.numlock = !self.modifiers.numlock;
741 Some(DecodedKey::RawKey(KeyCode::NumpadLock))
742 }
743 }
744 KeyEvent {
745 code: KeyCode::LControl,
746 state: KeyState::Down,
747 } => {
748 self.modifiers.lctrl = true;
749 Some(DecodedKey::RawKey(KeyCode::LControl))
750 }
751 KeyEvent {
752 code: KeyCode::LControl,
753 state: KeyState::Up,
754 } => {
755 self.modifiers.lctrl = false;
756 None
757 }
758 KeyEvent {
759 code: KeyCode::RControl,
760 state: KeyState::Down,
761 } => {
762 self.modifiers.rctrl = true;
763 Some(DecodedKey::RawKey(KeyCode::RControl))
764 }
765 KeyEvent {
766 code: KeyCode::RControl,
767 state: KeyState::Up,
768 } => {
769 self.modifiers.rctrl = false;
770 None
771 }
772 KeyEvent {
773 code: KeyCode::LAlt,
774 state: KeyState::Down,
775 } => {
776 self.modifiers.lalt = true;
777 Some(DecodedKey::RawKey(KeyCode::LAlt))
778 }
779 KeyEvent {
780 code: KeyCode::LAlt,
781 state: KeyState::Up,
782 } => {
783 self.modifiers.lalt = false;
784 None
785 }
786 KeyEvent {
787 code: KeyCode::RAltGr,
788 state: KeyState::Down,
789 } => {
790 self.modifiers.ralt = true;
791 Some(DecodedKey::RawKey(KeyCode::RAltGr))
792 }
793 KeyEvent {
794 code: KeyCode::RAltGr,
795 state: KeyState::Up,
796 } => {
797 self.modifiers.ralt = false;
798 None
799 }
800 KeyEvent {
801 code: KeyCode::RControl2,
802 state: KeyState::Down,
803 } => {
804 self.modifiers.rctrl2 = true;
805 Some(DecodedKey::RawKey(KeyCode::RControl2))
806 }
807 KeyEvent {
808 code: KeyCode::RControl2,
809 state: KeyState::Up,
810 } => {
811 self.modifiers.rctrl2 = false;
812 None
813 }
814 KeyEvent {
815 code: c,
816 state: KeyState::Down,
817 } => Some(
818 self.layout
819 .map_keycode(c, &self.modifiers, self.handle_ctrl),
820 ),
821 _ => None,
822 }
823 }
824
825 pub fn change_layout(&mut self, new_layout: L) {
830 self.layout = new_layout;
831 }
832}
833
834impl KeyEvent {
835 pub const fn new(code: KeyCode, state: KeyState) -> KeyEvent {
836 KeyEvent { code, state }
837 }
838}
839
840impl Modifiers {
847 pub const fn is_shifted(&self) -> bool {
848 self.lshift | self.rshift
849 }
850
851 pub const fn is_ctrl(&self) -> bool {
852 self.lctrl | self.rctrl
853 }
854
855 pub const fn is_alt(&self) -> bool {
856 self.lalt | self.ralt
857 }
858
859 pub const fn is_altgr(&self) -> bool {
860 self.ralt | (self.lalt & self.is_ctrl())
861 }
862
863 pub const fn is_caps(&self) -> bool {
864 self.is_shifted() ^ self.capslock
865 }
866}
867
868#[cfg(test)]
875mod test {
876 use super::*;
877
878 fn add_bytes<L, S>(keyboard: &mut Keyboard<L, S>, test_sequence: &[(u8, Option<KeyEvent>)])
879 where
880 L: KeyboardLayout,
881 S: ScancodeSet,
882 {
883 for (byte, expected_key) in test_sequence.iter().cloned() {
884 let result = keyboard.add_byte(byte);
885 assert_eq!(
886 result,
887 Ok(expected_key.clone()),
888 "0x{:02x} should have given {:?} not {:?}",
889 byte,
890 expected_key,
891 result
892 );
893 }
894 }
895
896 fn process_keyevents<L, S>(
897 keyboard: &mut Keyboard<L, S>,
898 test_sequence: &[(KeyEvent, Option<DecodedKey>)],
899 ) where
900 L: KeyboardLayout,
901 S: ScancodeSet,
902 {
903 for (idx, (event, expected_decode)) in test_sequence.iter().cloned().enumerate() {
904 let result = keyboard.process_keyevent(event.clone());
905 assert_eq!(
906 result,
907 expected_decode.clone(),
908 "Entry {} {:?} should have given {:?} not {:?}",
909 idx,
910 event,
911 expected_decode,
912 result
913 );
914 }
915 }
916
917 #[test]
918 fn test_f9() {
919 let mut k = Keyboard::new(
920 ScancodeSet2::new(),
921 layouts::Us104Key,
922 HandleControl::MapLettersToUnicode,
923 );
924 assert_eq!(k.add_bit(false), Ok(None));
926 assert_eq!(k.add_bit(true), Ok(None));
928 assert_eq!(k.add_bit(false), Ok(None));
929 assert_eq!(k.add_bit(false), Ok(None));
930 assert_eq!(k.add_bit(false), Ok(None));
931 assert_eq!(k.add_bit(false), Ok(None));
932 assert_eq!(k.add_bit(false), Ok(None));
933 assert_eq!(k.add_bit(false), Ok(None));
934 assert_eq!(k.add_bit(false), Ok(None));
935 assert_eq!(k.add_bit(false), Ok(None));
937 assert_eq!(
939 k.add_bit(true),
940 Ok(Some(KeyEvent::new(KeyCode::F9, KeyState::Down)))
941 );
942 }
943
944 #[test]
945 fn test_f9_word() {
946 let mut k = Keyboard::new(
947 ScancodeSet2::new(),
948 layouts::Us104Key,
949 HandleControl::MapLettersToUnicode,
950 );
951 assert_eq!(
952 k.add_word(0x0402),
953 Ok(Some(KeyEvent::new(KeyCode::F9, KeyState::Down)))
954 );
955 }
956
957 #[test]
958 fn test_f9_byte() {
959 let mut k = Keyboard::new(
960 ScancodeSet2::new(),
961 layouts::Us104Key,
962 HandleControl::MapLettersToUnicode,
963 );
964
965 let test_sequence = [(0x01, Some(KeyEvent::new(KeyCode::F9, KeyState::Down)))];
966 add_bytes(&mut k, &test_sequence);
967 }
968
969 #[test]
970 fn test_keyup_keydown() {
971 let mut k = Keyboard::new(
972 ScancodeSet2::new(),
973 layouts::Us104Key,
974 HandleControl::MapLettersToUnicode,
975 );
976 let test_sequence = [
977 (0x01, Some(KeyEvent::new(KeyCode::F9, KeyState::Down))),
978 (0x01, Some(KeyEvent::new(KeyCode::F9, KeyState::Down))),
979 (0xF0, None),
980 (0x01, Some(KeyEvent::new(KeyCode::F9, KeyState::Up))),
981 ];
982 add_bytes(&mut k, &test_sequence);
983 }
984
985 #[test]
986 fn test_f5() {
987 let mut k = Keyboard::new(
988 ScancodeSet2::new(),
989 layouts::Us104Key,
990 HandleControl::MapLettersToUnicode,
991 );
992 assert_eq!(k.add_bit(false), Ok(None));
994 assert_eq!(k.add_bit(true), Ok(None));
996 assert_eq!(k.add_bit(true), Ok(None));
997 assert_eq!(k.add_bit(false), Ok(None));
998 assert_eq!(k.add_bit(false), Ok(None));
999 assert_eq!(k.add_bit(false), Ok(None));
1000 assert_eq!(k.add_bit(false), Ok(None));
1001 assert_eq!(k.add_bit(false), Ok(None));
1002 assert_eq!(k.add_bit(false), Ok(None));
1003 assert_eq!(k.add_bit(true), Ok(None));
1005 assert_eq!(
1007 k.add_bit(true),
1008 Ok(Some(KeyEvent::new(KeyCode::F5, KeyState::Down)))
1009 );
1010 }
1011
1012 #[test]
1013 fn test_f5_up() {
1014 let mut k = Keyboard::new(
1015 ScancodeSet2::new(),
1016 layouts::Us104Key,
1017 HandleControl::MapLettersToUnicode,
1018 );
1019 assert_eq!(k.add_bit(false), Ok(None));
1023 assert_eq!(k.add_bit(false), Ok(None));
1025 assert_eq!(k.add_bit(false), Ok(None));
1026 assert_eq!(k.add_bit(false), Ok(None));
1027 assert_eq!(k.add_bit(false), Ok(None));
1028 assert_eq!(k.add_bit(true), Ok(None));
1029 assert_eq!(k.add_bit(true), Ok(None));
1030 assert_eq!(k.add_bit(true), Ok(None));
1031 assert_eq!(k.add_bit(true), Ok(None));
1032 assert_eq!(k.add_bit(true), Ok(None));
1034 assert_eq!(k.add_bit(true), Ok(None));
1036
1037 assert_eq!(k.add_bit(false), Ok(None));
1041 assert_eq!(k.add_bit(true), Ok(None));
1043 assert_eq!(k.add_bit(true), Ok(None));
1044 assert_eq!(k.add_bit(false), Ok(None));
1045 assert_eq!(k.add_bit(false), Ok(None));
1046 assert_eq!(k.add_bit(false), Ok(None));
1047 assert_eq!(k.add_bit(false), Ok(None));
1048 assert_eq!(k.add_bit(false), Ok(None));
1049 assert_eq!(k.add_bit(false), Ok(None));
1050 assert_eq!(k.add_bit(true), Ok(None));
1052 assert_eq!(
1054 k.add_bit(true),
1055 Ok(Some(KeyEvent::new(KeyCode::F5, KeyState::Up)))
1056 );
1057 }
1058
1059 #[test]
1060 fn test_shift() {
1061 let mut k = Keyboard::new(
1062 ScancodeSet2::new(),
1063 layouts::Uk105Key,
1064 HandleControl::MapLettersToUnicode,
1065 );
1066 let test_sequence = [
1067 (
1069 KeyEvent::new(KeyCode::LShift, KeyState::Down),
1070 Some(DecodedKey::RawKey(KeyCode::LShift)),
1071 ),
1072 (
1073 KeyEvent::new(KeyCode::A, KeyState::Down),
1074 Some(DecodedKey::Unicode('A')),
1075 ),
1076 (KeyEvent::new(KeyCode::A, KeyState::Up), None),
1077 (KeyEvent::new(KeyCode::LShift, KeyState::Up), None),
1078 (
1080 KeyEvent::new(KeyCode::A, KeyState::Down),
1081 Some(DecodedKey::Unicode('a')),
1082 ),
1083 (KeyEvent::new(KeyCode::A, KeyState::Up), None),
1084 (
1086 KeyEvent::new(KeyCode::RShift, KeyState::Down),
1087 Some(DecodedKey::RawKey(KeyCode::RShift)),
1088 ),
1089 (
1090 KeyEvent::new(KeyCode::A, KeyState::Down),
1091 Some(DecodedKey::Unicode('A')),
1092 ),
1093 (KeyEvent::new(KeyCode::A, KeyState::Up), None),
1094 (KeyEvent::new(KeyCode::RShift, KeyState::Up), None),
1095 (
1097 KeyEvent::new(KeyCode::CapsLock, KeyState::Down),
1098 Some(DecodedKey::RawKey(KeyCode::CapsLock)),
1099 ),
1100 (KeyEvent::new(KeyCode::CapsLock, KeyState::Up), None),
1101 (
1103 KeyEvent::new(KeyCode::X, KeyState::Down),
1104 Some(DecodedKey::Unicode('X')),
1105 ),
1106 (KeyEvent::new(KeyCode::X, KeyState::Up), None),
1107 (
1109 KeyEvent::new(KeyCode::RShift, KeyState::Down),
1110 Some(DecodedKey::RawKey(KeyCode::RShift)),
1111 ),
1112 (
1113 KeyEvent::new(KeyCode::A, KeyState::Down),
1114 Some(DecodedKey::Unicode('a')),
1115 ),
1116 (KeyEvent::new(KeyCode::A, KeyState::Up), None),
1117 (KeyEvent::new(KeyCode::RShift, KeyState::Up), None),
1118 (
1120 KeyEvent::new(KeyCode::Key1, KeyState::Down),
1121 Some(DecodedKey::Unicode('1')),
1122 ),
1123 (KeyEvent::new(KeyCode::Key1, KeyState::Up), None),
1124 ];
1125
1126 process_keyevents(&mut k, &test_sequence);
1127 }
1128
1129 #[test]
1130 fn test_ctrl() {
1131 let mut k = Keyboard::new(
1132 ScancodeSet2::new(),
1133 layouts::Us104Key,
1134 HandleControl::MapLettersToUnicode,
1135 );
1136 let test_sequence = [
1137 (
1139 KeyEvent::new(KeyCode::A, KeyState::Down),
1140 Some(DecodedKey::Unicode('a')),
1141 ),
1142 (KeyEvent::new(KeyCode::A, KeyState::Up), None),
1143 (
1145 KeyEvent::new(KeyCode::LControl, KeyState::Down),
1146 Some(DecodedKey::RawKey(KeyCode::LControl)),
1147 ),
1148 (
1149 KeyEvent::new(KeyCode::A, KeyState::Down),
1150 Some(DecodedKey::Unicode('\u{0001}')),
1151 ),
1152 (KeyEvent::new(KeyCode::LControl, KeyState::Up), None),
1153 (KeyEvent::new(KeyCode::A, KeyState::Up), None),
1154 (
1156 KeyEvent::new(KeyCode::A, KeyState::Down),
1157 Some(DecodedKey::Unicode('a')),
1158 ),
1159 (KeyEvent::new(KeyCode::A, KeyState::Up), None),
1160 (
1162 KeyEvent::new(KeyCode::RControl, KeyState::Down),
1163 Some(DecodedKey::RawKey(KeyCode::RControl)),
1164 ),
1165 (
1166 KeyEvent::new(KeyCode::A, KeyState::Down),
1167 Some(DecodedKey::Unicode('\u{0001}')),
1168 ),
1169 (KeyEvent::new(KeyCode::RControl, KeyState::Up), None),
1170 (KeyEvent::new(KeyCode::A, KeyState::Up), None),
1171 ];
1172 process_keyevents(&mut k, &test_sequence);
1173 }
1174
1175 #[test]
1176 fn test_numlock() {
1177 let mut k = Keyboard::new(
1178 ScancodeSet2::new(),
1179 layouts::Uk105Key,
1180 HandleControl::MapLettersToUnicode,
1181 );
1182
1183 let test_sequence = [
1184 (
1186 KeyEvent::new(KeyCode::Numpad0, KeyState::Down),
1187 Some(DecodedKey::Unicode('0')),
1188 ),
1189 (KeyEvent::new(KeyCode::Numpad0, KeyState::Up), None),
1190 (
1192 KeyEvent::new(KeyCode::NumpadLock, KeyState::Down),
1193 Some(DecodedKey::RawKey(KeyCode::NumpadLock)),
1194 ),
1195 (KeyEvent::new(KeyCode::NumpadLock, KeyState::Up), None),
1196 (
1198 KeyEvent::new(KeyCode::Numpad0, KeyState::Down),
1199 Some(DecodedKey::RawKey(KeyCode::Insert)),
1200 ),
1201 (KeyEvent::new(KeyCode::Numpad0, KeyState::Up), None),
1202 ];
1203 process_keyevents(&mut k, &test_sequence);
1204 }
1205
1206 #[test]
1207 fn test_set_1_down_up_down() {
1208 let mut k = Keyboard::new(
1209 ScancodeSet1::new(),
1210 layouts::Us104Key,
1211 HandleControl::MapLettersToUnicode,
1212 );
1213 let test_sequence = [
1214 (0x1e, Some(KeyEvent::new(KeyCode::A, KeyState::Down))),
1215 (0x9e, Some(KeyEvent::new(KeyCode::A, KeyState::Up))),
1216 (0x1f, Some(KeyEvent::new(KeyCode::S, KeyState::Down))),
1217 ];
1218
1219 add_bytes(&mut k, &test_sequence);
1220 }
1221
1222 #[test]
1223 fn test_set_1_ext_down_up_down() {
1224 let mut k = Keyboard::new(
1225 ScancodeSet1::new(),
1226 layouts::Us104Key,
1227 HandleControl::MapLettersToUnicode,
1228 );
1229 let test_sequence = [
1230 (0xe0, None),
1231 (
1232 0x1c,
1233 Some(KeyEvent::new(KeyCode::NumpadEnter, KeyState::Down)),
1234 ),
1235 (0xe0, None),
1236 (
1237 0x9c,
1238 Some(KeyEvent::new(KeyCode::NumpadEnter, KeyState::Up)),
1239 ),
1240 ];
1241 add_bytes(&mut k, &test_sequence);
1242 }
1243
1244 #[test]
1245 fn test_set_2_poweron() {
1246 let mut k = Keyboard::new(
1247 ScancodeSet2::new(),
1248 layouts::Us104Key,
1249 HandleControl::MapLettersToUnicode,
1250 );
1251 let test_sequence = [(
1252 0xAA,
1253 Some(KeyEvent::new(KeyCode::PowerOnTestOk, KeyState::SingleShot)),
1254 )];
1255 add_bytes(&mut k, &test_sequence);
1256 }
1257
1258 #[test]
1259 fn test_set_2_toomanykeys() {
1260 let mut k = Keyboard::new(
1261 ScancodeSet2::new(),
1262 layouts::Us104Key,
1263 HandleControl::MapLettersToUnicode,
1264 );
1265 let test_sequence = [(
1266 0x00,
1267 Some(KeyEvent::new(KeyCode::TooManyKeys, KeyState::SingleShot)),
1268 )];
1269 add_bytes(&mut k, &test_sequence);
1270 }
1271
1272 #[test]
1273 fn test_set_2_down_up() {
1274 let mut k = Keyboard::new(
1275 ScancodeSet2::new(),
1276 layouts::Us104Key,
1277 HandleControl::MapLettersToUnicode,
1278 );
1279 let test_sequence = [
1280 (0x29, Some(KeyEvent::new(KeyCode::Spacebar, KeyState::Down))),
1281 (0xF0, None),
1282 (0x29, Some(KeyEvent::new(KeyCode::Spacebar, KeyState::Up))),
1283 (0x29, Some(KeyEvent::new(KeyCode::Spacebar, KeyState::Down))),
1284 (0xF0, None),
1285 (0x29, Some(KeyEvent::new(KeyCode::Spacebar, KeyState::Up))),
1286 (0x29, Some(KeyEvent::new(KeyCode::Spacebar, KeyState::Down))),
1287 (0xF0, None),
1288 (0x29, Some(KeyEvent::new(KeyCode::Spacebar, KeyState::Up))),
1289 ];
1290 add_bytes(&mut k, &test_sequence);
1291 }
1292
1293 #[test]
1294 fn test_set_2_ext_down_up() {
1295 let mut k = Keyboard::new(
1296 ScancodeSet2::new(),
1297 layouts::Us104Key,
1298 HandleControl::MapLettersToUnicode,
1299 );
1300 let test_sequence = [
1301 (0xE0, None),
1302 (0x6C, Some(KeyEvent::new(KeyCode::Home, KeyState::Down))),
1303 (0xE0, None),
1304 (0xF0, None),
1305 (0x6C, Some(KeyEvent::new(KeyCode::Home, KeyState::Up))),
1306 ];
1307 add_bytes(&mut k, &test_sequence);
1308 }
1309
1310 #[test]
1311 fn test_pause_set1() {
1312 let mut k = Keyboard::new(
1313 ScancodeSet1::new(),
1314 layouts::Uk105Key,
1315 HandleControl::MapLettersToUnicode,
1316 );
1317
1318 let test_sequence = [
1321 (0xE1, None),
1323 (
1324 0x1D,
1325 Some(KeyEvent {
1326 code: KeyCode::RControl2,
1327 state: KeyState::Down,
1328 }),
1329 ),
1330 (
1332 0x45,
1333 Some(KeyEvent {
1334 code: KeyCode::NumpadLock,
1335 state: KeyState::Down,
1336 }),
1337 ),
1338 (0xE1, None),
1340 (
1341 0x9D,
1342 Some(KeyEvent {
1343 code: KeyCode::RControl2,
1344 state: KeyState::Up,
1345 }),
1346 ),
1347 (
1349 0xC5,
1350 Some(KeyEvent {
1351 code: KeyCode::NumpadLock,
1352 state: KeyState::Up,
1353 }),
1354 ),
1355 ];
1356
1357 add_bytes(&mut k, &test_sequence);
1358 }
1359
1360 #[test]
1361 fn test_pause_set2() {
1362 let mut k = Keyboard::new(
1363 ScancodeSet2::new(),
1364 layouts::Uk105Key,
1365 HandleControl::MapLettersToUnicode,
1366 );
1367
1368 let test_sequence = [
1371 (0xE1, None),
1373 (
1374 0x14,
1375 Some(KeyEvent {
1376 code: KeyCode::RControl2,
1377 state: KeyState::Down,
1378 }),
1379 ),
1380 (
1382 0x77,
1383 Some(KeyEvent {
1384 code: KeyCode::NumpadLock,
1385 state: KeyState::Down,
1386 }),
1387 ),
1388 (0xE1, None),
1390 (0xF0, None),
1391 (
1392 0x14,
1393 Some(KeyEvent {
1394 code: KeyCode::RControl2,
1395 state: KeyState::Up,
1396 }),
1397 ),
1398 (0xF0, None),
1400 (
1401 0x77,
1402 Some(KeyEvent {
1403 code: KeyCode::NumpadLock,
1404 state: KeyState::Up,
1405 }),
1406 ),
1407 ];
1408 add_bytes(&mut k, &test_sequence);
1409 }
1410
1411 #[test]
1412 fn test_pause_events() {
1413 let mut k = Keyboard::new(
1414 ScancodeSet2::new(),
1415 layouts::Uk105Key,
1416 HandleControl::MapLettersToUnicode,
1417 );
1418
1419 let test_sequence = [
1422 (
1424 KeyEvent {
1425 code: KeyCode::RControl2,
1426 state: KeyState::Down,
1427 },
1428 Some(DecodedKey::RawKey(KeyCode::RControl2)),
1429 ),
1430 (
1432 KeyEvent {
1433 code: KeyCode::NumpadLock,
1434 state: KeyState::Down,
1435 },
1436 Some(DecodedKey::RawKey(KeyCode::PauseBreak)),
1437 ),
1438 (
1440 KeyEvent {
1441 code: KeyCode::RControl2,
1442 state: KeyState::Up,
1443 },
1444 None,
1445 ),
1446 (
1448 KeyEvent {
1449 code: KeyCode::NumpadLock,
1450 state: KeyState::Up,
1451 },
1452 None,
1453 ),
1454 ];
1455 process_keyevents(&mut k, &test_sequence);
1456 }
1457
1458 #[test]
1459 fn test_print_screen_set1() {
1460 let mut k = Keyboard::new(
1461 ScancodeSet1::new(),
1462 layouts::Uk105Key,
1463 HandleControl::MapLettersToUnicode,
1464 );
1465
1466 let test_sequence = [
1468 (0xE0, None),
1470 (
1471 0x2A,
1472 Some(KeyEvent {
1473 code: KeyCode::RAlt2,
1474 state: KeyState::Down,
1475 }),
1476 ),
1477 (0xE0, None),
1479 (
1480 0x37,
1481 Some(KeyEvent {
1482 code: KeyCode::PrintScreen,
1483 state: KeyState::Down,
1484 }),
1485 ),
1486 (0xE0, None),
1488 (
1489 0xB7,
1490 Some(KeyEvent {
1491 code: KeyCode::PrintScreen,
1492 state: KeyState::Up,
1493 }),
1494 ),
1495 (0xE0, None),
1497 (
1498 0xAA,
1499 Some(KeyEvent {
1500 code: KeyCode::RAlt2,
1501 state: KeyState::Up,
1502 }),
1503 ),
1504 ];
1505 add_bytes(&mut k, &test_sequence);
1506 }
1507
1508 #[test]
1509 fn test_print_screen_set2() {
1510 let mut k = Keyboard::new(
1511 ScancodeSet2::new(),
1512 layouts::Uk105Key,
1513 HandleControl::MapLettersToUnicode,
1514 );
1515
1516 let test_sequence = [
1518 (0xE0, None),
1520 (
1521 0x12,
1522 Some(KeyEvent {
1523 code: KeyCode::RAlt2,
1524 state: KeyState::Down,
1525 }),
1526 ),
1527 (0xE0, None),
1529 (
1530 0x7C,
1531 Some(KeyEvent {
1532 code: KeyCode::PrintScreen,
1533 state: KeyState::Down,
1534 }),
1535 ),
1536 (0xE0, None),
1538 (0xF0, None),
1539 (
1540 0x7C,
1541 Some(KeyEvent {
1542 code: KeyCode::PrintScreen,
1543 state: KeyState::Up,
1544 }),
1545 ),
1546 (0xE0, None),
1548 (0xF0, None),
1549 (
1550 0x12,
1551 Some(KeyEvent {
1552 code: KeyCode::RAlt2,
1553 state: KeyState::Up,
1554 }),
1555 ),
1556 ];
1557
1558 add_bytes(&mut k, &test_sequence);
1559 }
1560
1561 #[test]
1562 fn test_print_screen_events() {
1563 let mut k = Keyboard::new(
1564 ScancodeSet2::new(),
1565 layouts::Uk105Key,
1566 HandleControl::MapLettersToUnicode,
1567 );
1568
1569 let test_sequence = [
1571 (
1573 KeyEvent {
1574 code: KeyCode::RAlt2,
1575 state: KeyState::Down,
1576 },
1577 Some(DecodedKey::RawKey(KeyCode::RAlt2)),
1578 ),
1579 (
1581 KeyEvent {
1582 code: KeyCode::PrintScreen,
1583 state: KeyState::Down,
1584 },
1585 Some(DecodedKey::RawKey(KeyCode::PrintScreen)),
1586 ),
1587 (
1589 KeyEvent {
1590 code: KeyCode::PrintScreen,
1591 state: KeyState::Up,
1592 },
1593 None,
1594 ),
1595 (
1597 KeyEvent {
1598 code: KeyCode::RAlt2,
1599 state: KeyState::Up,
1600 },
1601 None,
1602 ),
1603 ];
1604
1605 process_keyevents(&mut k, &test_sequence);
1606 }
1607
1608 #[test]
1609 fn test_modifier_state_shift() {
1610 let mut k = Keyboard::new(
1611 ScancodeSet2::new(),
1612 layouts::Uk105Key,
1613 HandleControl::MapLettersToUnicode,
1614 );
1615 assert!(!k.get_modifiers().lshift);
1616
1617 k.process_keyevent(KeyEvent {
1618 code: KeyCode::LShift,
1619 state: KeyState::Down,
1620 });
1621 assert!(k.get_modifiers().lshift);
1622
1623 k.process_keyevent(KeyEvent {
1624 code: KeyCode::LShift,
1625 state: KeyState::Up,
1626 });
1627 assert!(!k.get_modifiers().lshift);
1628 }
1629}
1630
1631