Skip to content

Commit a1dd647

Browse files
committed
Decode Pause and Print Scr correctly.
Tapping "Pause" generates E1,14,77,E1,F0,14,F0,77 We now decode this as: * PauseBreak/Down * NumLock/Down * PauseBreak/Up * NumLock/Up Tapping "Print Scr" generates E0,12,E0,7C. This becomes: We now decode this as: * PrintScreen/SingleShot * PrintScreen2/SingleShot Note the addition of the "SingleShot" KeyState, for keys that don't have a Make/Break pair. This avoids users waiting a "Break" that never happens.
1 parent d53d72d commit a1dd647

File tree

2 files changed

+116
-15
lines changed

2 files changed

+116
-15
lines changed

src/lib.rs

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -189,12 +189,17 @@ pub enum KeyCode {
189189
// Sent when the keyboard boots
190190
PowerOnTestOk,
191191
Oem102,
192+
/// PrintScreen comes in two parts - this is the second
193+
PrintScreen2,
194+
/// Sent by the keyboard when too many keys are pressed
195+
TooManyKeys,
192196
}
193197

194198
#[derive(Debug, PartialEq, Eq, Copy, Clone)]
195199
pub enum KeyState {
196200
Up,
197201
Down,
202+
SingleShot,
198203
}
199204

200205
/// Options for how we can handle what happens when the Ctrl key is held down
@@ -237,6 +242,10 @@ pub trait ScancodeSet {
237242
/// Convert a Scan Code Set X extended byte (prefixed E0) to our `KeyCode`
238243
/// enum.
239244
fn map_extended_scancode(code: u8) -> Result<KeyCode, Error>;
245+
246+
/// Convert a Scan Code Set X extended byte (prefixed E1) to our `KeyCode`
247+
/// enum.
248+
fn map_extended2_scancode(code: u8) -> Result<KeyCode, Error>;
240249
}
241250

242251
#[derive(Debug)]
@@ -276,6 +285,8 @@ pub enum DecodeState {
276285
Extended,
277286
Release,
278287
ExtendedRelease,
288+
Extended2,
289+
Extended2Release,
279290
}
280291

281292
// ****************************************************************************
@@ -286,6 +297,7 @@ pub enum DecodeState {
286297

287298
const KEYCODE_BITS: u8 = 11;
288299
const EXTENDED_KEY_CODE: u8 = 0xE0;
300+
const EXTENDED2_KEY_CODE: u8 = 0xE1;
289301
const KEY_RELEASE_CODE: u8 = 0xF0;
290302

291303
// ****************************************************************************
@@ -912,8 +924,8 @@ mod test {
912924
}
913925
codes.sort();
914926
println!("{:?}", codes);
915-
assert_eq!(codes.len(), 85);
916-
assert_eq!(errs.len(), 43);
927+
assert_eq!(codes.len(), 86);
928+
assert_eq!(errs.len(), 42);
917929

918930
let mut codes = Vec::new();
919931
let mut errs = Vec::new();
@@ -926,8 +938,8 @@ mod test {
926938
}
927939
codes.sort();
928940
println!("{:?}", codes);
929-
assert_eq!(codes.len(), 87);
930-
assert_eq!(errs.len(), 169);
941+
assert_eq!(codes.len(), 89);
942+
assert_eq!(errs.len(), 167);
931943
}
932944

933945
#[test]
@@ -970,6 +982,38 @@ mod test {
970982
);
971983
}
972984

985+
#[test]
986+
fn test_set_2_poweron() {
987+
let mut k = Keyboard::new(
988+
layouts::Us104Key,
989+
ScancodeSet2,
990+
HandleControl::MapLettersToUnicode,
991+
);
992+
assert_eq!(
993+
k.add_byte(0xAA),
994+
Ok(Some(KeyEvent::new(
995+
KeyCode::PowerOnTestOk,
996+
KeyState::SingleShot
997+
)))
998+
);
999+
}
1000+
1001+
#[test]
1002+
fn test_set_2_toomanykeys() {
1003+
let mut k = Keyboard::new(
1004+
layouts::Us104Key,
1005+
ScancodeSet2,
1006+
HandleControl::MapLettersToUnicode,
1007+
);
1008+
assert_eq!(
1009+
k.add_byte(0x00),
1010+
Ok(Some(KeyEvent::new(
1011+
KeyCode::TooManyKeys,
1012+
KeyState::SingleShot
1013+
)))
1014+
);
1015+
}
1016+
9731017
#[test]
9741018
fn test_set_2_down_up() {
9751019
let mut k = Keyboard::new(

src/scancodes.rs

Lines changed: 68 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use super::{
2-
DecodeState, Error, KeyCode, KeyEvent, KeyState, ScancodeSet, EXTENDED_KEY_CODE,
3-
KEY_RELEASE_CODE,
2+
DecodeState, Error, KeyCode, KeyEvent, KeyState, ScancodeSet, EXTENDED2_KEY_CODE,
3+
EXTENDED_KEY_CODE, KEY_RELEASE_CODE,
44
};
55

66
/// Contains the implementation of Scancode Set 1.
@@ -239,6 +239,11 @@ impl ScancodeSet for ScancodeSet1 {
239239
_ => Err(Error::UnknownKeyCode),
240240
}
241241
}
242+
243+
/// There are no extended2 scancodes here
244+
fn map_extended2_scancode(_code: u8) -> Result<KeyCode, Error> {
245+
Err(Error::UnknownKeyCode)
246+
}
242247
}
243248

244249
/// Contains the implementation of Scancode Set 2.
@@ -252,6 +257,7 @@ impl ScancodeSet for ScancodeSet2 {
252257
/// Start:
253258
/// F0 => Release
254259
/// E0 => Extended
260+
/// E1 => Extended2 (only used for Pause Key)
255261
/// xx => Key Down
256262
///
257263
/// Release:
@@ -263,21 +269,39 @@ impl ScancodeSet for ScancodeSet2 {
263269
///
264270
/// Release Extended:
265271
/// xxx => Extended Key Up
272+
///
273+
/// Extended2:
274+
/// F0 => Release Extended2
275+
/// xx => Extended2 Key Down
276+
///
277+
/// Release Extended2:
278+
/// xxx => Extended2 Key Up
266279
fn advance_state(state: &mut DecodeState, code: u8) -> Result<Option<KeyEvent>, Error> {
267280
match *state {
268281
DecodeState::Start => match code {
269282
EXTENDED_KEY_CODE => {
270283
*state = DecodeState::Extended;
271284
Ok(None)
272285
}
286+
EXTENDED2_KEY_CODE => {
287+
*state = DecodeState::Extended2;
288+
Ok(None)
289+
}
273290
KEY_RELEASE_CODE => {
274291
*state = DecodeState::Release;
275292
Ok(None)
276293
}
277-
_ => Ok(Some(KeyEvent::new(
278-
Self::map_scancode(code)?,
279-
KeyState::Down,
280-
))),
294+
_ => {
295+
let keycode = Self::map_scancode(code)?;
296+
if keycode == KeyCode::TooManyKeys || keycode == KeyCode::PowerOnTestOk {
297+
Ok(Some(KeyEvent::new(keycode, KeyState::SingleShot)))
298+
} else {
299+
Ok(Some(KeyEvent::new(
300+
Self::map_scancode(code)?,
301+
KeyState::Down,
302+
)))
303+
}
304+
}
281305
},
282306
DecodeState::Release => {
283307
*state = DecodeState::Start;
@@ -288,18 +312,41 @@ impl ScancodeSet for ScancodeSet2 {
288312
*state = DecodeState::ExtendedRelease;
289313
Ok(None)
290314
}
315+
_ => {
316+
*state = DecodeState::Start;
317+
318+
let keycode = Self::map_extended_scancode(code)?;
319+
if keycode == KeyCode::PrintScreen || keycode == KeyCode::PrintScreen2 {
320+
Ok(Some(KeyEvent::new(keycode, KeyState::SingleShot)))
321+
} else {
322+
Ok(Some(KeyEvent::new(keycode, KeyState::Down)))
323+
}
324+
}
325+
},
326+
DecodeState::ExtendedRelease => {
327+
*state = DecodeState::Start;
328+
Ok(Some(KeyEvent::new(
329+
Self::map_extended_scancode(code)?,
330+
KeyState::Up,
331+
)))
332+
}
333+
DecodeState::Extended2 => match code {
334+
KEY_RELEASE_CODE => {
335+
*state = DecodeState::Extended2Release;
336+
Ok(None)
337+
}
291338
_ => {
292339
*state = DecodeState::Start;
293340
Ok(Some(KeyEvent::new(
294-
Self::map_extended_scancode(code)?,
341+
Self::map_extended2_scancode(code)?,
295342
KeyState::Down,
296343
)))
297344
}
298345
},
299-
DecodeState::ExtendedRelease => {
346+
DecodeState::Extended2Release => {
300347
*state = DecodeState::Start;
301348
Ok(Some(KeyEvent::new(
302-
Self::map_extended_scancode(code)?,
349+
Self::map_extended2_scancode(code)?,
303350
KeyState::Up,
304351
)))
305352
}
@@ -309,6 +356,7 @@ impl ScancodeSet for ScancodeSet2 {
309356
/// Implements the single byte codes for Set 2.
310357
fn map_scancode(code: u8) -> Result<KeyCode, Error> {
311358
match code {
359+
0x00 => Ok(KeyCode::TooManyKeys), // 00
312360
0x01 => Ok(KeyCode::F9), // 01
313361
0x03 => Ok(KeyCode::F5), // 03
314362
0x04 => Ok(KeyCode::F3), // 04
@@ -405,6 +453,7 @@ impl ScancodeSet for ScancodeSet2 {
405453
fn map_extended_scancode(code: u8) -> Result<KeyCode, Error> {
406454
match code {
407455
0x11 => Ok(KeyCode::AltRight), // E011
456+
0x12 => Ok(KeyCode::PrintScreen), // E012 (first half)
408457
0x14 => Ok(KeyCode::ControlRight), // E014
409458
0x1F => Ok(KeyCode::WindowsLeft), // E01F
410459
0x27 => Ok(KeyCode::WindowsRight), // E027
@@ -420,9 +469,17 @@ impl ScancodeSet for ScancodeSet2 {
420469
0x74 => Ok(KeyCode::ArrowRight), // E074
421470
0x75 => Ok(KeyCode::ArrowUp), // E075
422471
0x7A => Ok(KeyCode::PageDown), // E07A
423-
0x7C => Ok(KeyCode::PrintScreen), // E07C
472+
0x7C => Ok(KeyCode::PrintScreen2), // E07C (second half)
424473
0x7D => Ok(KeyCode::PageUp), // E07D
425-
0x7E => Ok(KeyCode::Break), // E07E
474+
0x7E => Ok(KeyCode::ScrollLock), // E07E
475+
_ => Err(Error::UnknownKeyCode),
476+
}
477+
}
478+
479+
/// Implements the extended byte codes for set 2 (prefixed with E1)
480+
fn map_extended2_scancode(code: u8) -> Result<KeyCode, Error> {
481+
match code {
482+
0x14 => Ok(KeyCode::PauseBreak), // E114
426483
_ => Err(Error::UnknownKeyCode),
427484
}
428485
}

0 commit comments

Comments
 (0)