Ps2KeyboardHost  1.0.1
Allows you to read from one or more PS2-style keyboards on an Arduino.
ps2_NeutralTranslator.h
Go to the documentation of this file.
1 /*
2 Copyright (C) 2017 Steve Benz <s8878992@hotmail.com>
3 The defines under KeyCode were originally written here, https://github.com/techpaul/PS2KeyAdvanced/blob/master/src/PS2KeyAdvanced.h, by Paul Carpenter
4 
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9 
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14 
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
18 USA
19 */
20 
21 #pragma once
22 #include "ps2_KeyboardOutput.h"
23 
24 namespace ps2
25 {
29  enum KeyCode : uint16_t {
30  PS2_NONE = 0x0,
31 
32  /* Flags/bit masks for status bits in returned unsigned int value */
33  PS2_SHIFT = 0x4000,
34  PS2_CTRL = 0x2000,
35  PS2_ALT = 0x800,
36  PS2_GUI = 0x200,
37 
38  PS2_MODIFIERS = 0xff00,
39 
40  /* Returned keycode definitions */
41  /* Do NOT change these codings as you will break base
42  functionality use PS2KeyMap for that and internationalisation */
43  PS2_KEY_NUM = 0x01,
45  PS2_KEY_CAPS = 0x03,
47  PS2_KEY_PAUSE = 0x05,
52  PS2_KEY_L_ALT = 0x0A,
53  PS2_KEY_R_ALT = 0x0B,
54  /* Sometimes called windows key */
55  PS2_KEY_L_GUI = 0x0C,
56  PS2_KEY_R_GUI = 0x0D,
57  PS2_KEY_MENU = 0x0E,
58  /* Break is CTRL + PAUSE generated inside keyboard */
59  PS2_KEY_BREAK = 0x0F,
60  /* Generated by some keyboards by ALT and PRTSCR */
61  PS2_KEY_SYSRQ = 0x10,
62  PS2_KEY_HOME = 0x11,
63  PS2_KEY_END = 0x12,
64  PS2_KEY_PGUP = 0x13,
65  PS2_KEY_PGDN = 0x14,
72  PS2_KEY_ESC = 0x1B,
73  PS2_KEY_BS = 0x1C,
74  PS2_KEY_TAB = 0x1D,
75  PS2_KEY_ENTER = 0x1E,
76  PS2_KEY_SPACE = 0x1F,
77  PS2_KEY_KP0 = 0x20,
78  PS2_KEY_KP1 = 0x21,
79  PS2_KEY_KP2 = 0x22,
80  PS2_KEY_KP3 = 0x23,
81  PS2_KEY_KP4 = 0x24,
82  PS2_KEY_KP5 = 0x25,
83  PS2_KEY_KP6 = 0x26,
84  PS2_KEY_KP7 = 0x27,
85  PS2_KEY_KP8 = 0x28,
86  PS2_KEY_KP9 = 0x29,
93  PS2_KEY_0 = 0x30,
94  PS2_KEY_1 = 0x31,
95  PS2_KEY_2 = 0x32,
96  PS2_KEY_3 = 0x33,
97  PS2_KEY_4 = 0x34,
98  PS2_KEY_5 = 0x35,
99  PS2_KEY_6 = 0x36,
100  PS2_KEY_7 = 0x37,
101  PS2_KEY_8 = 0x38,
102  PS2_KEY_9 = 0x39,
103  PS2_KEY_APOS = 0x3A, // '
106  PS2_KEY_DOT = 0x3D,
107  PS2_KEY_DIV = 0x3E,
108  /* Some Numeric keyboards have an '=' on right keypad */
110  PS2_KEY_SINGLE = 0x40, // `
111  PS2_KEY_A = 0x41,
112  PS2_KEY_B = 0x42,
113  PS2_KEY_C = 0x43,
114  PS2_KEY_D = 0x44,
115  PS2_KEY_E = 0x45,
116  PS2_KEY_F = 0x46,
117  PS2_KEY_G = 0x47,
118  PS2_KEY_H = 0x48,
119  PS2_KEY_I = 0x49,
120  PS2_KEY_J = 0x4A,
121  PS2_KEY_K = 0x4B,
122  PS2_KEY_L = 0x4C,
123  PS2_KEY_M = 0x4D,
124  PS2_KEY_N = 0x4E,
125  PS2_KEY_O = 0x4F,
126  PS2_KEY_P = 0x50,
127  PS2_KEY_Q = 0x51,
128  PS2_KEY_R = 0x52,
129  PS2_KEY_S = 0x53,
130  PS2_KEY_T = 0x54,
131  PS2_KEY_U = 0x55,
132  PS2_KEY_V = 0x56,
133  PS2_KEY_W = 0x57,
134  PS2_KEY_X = 0x58,
135  PS2_KEY_Y = 0x59,
136  PS2_KEY_Z = 0x5A,
137  PS2_KEY_SEMI = 0x5B,
138  PS2_KEY_BACK = 0x5C,
142  /* Some Numeric keypads have a comma key */
144  PS2_KEY_F1 = 0x61,
145  PS2_KEY_F2 = 0x62,
146  PS2_KEY_F3 = 0x63,
147  PS2_KEY_F4 = 0x64,
148  PS2_KEY_F5 = 0x65,
149  PS2_KEY_F6 = 0x66,
150  PS2_KEY_F7 = 0x67,
151  PS2_KEY_F8 = 0x68,
152  PS2_KEY_F9 = 0x69,
153  PS2_KEY_F10 = 0x6A,
154  PS2_KEY_F11 = 0x6B,
155  PS2_KEY_F12 = 0x6C,
156  PS2_KEY_F13 = 0x6D,
157  PS2_KEY_F14 = 0x6E,
158  PS2_KEY_F15 = 0x6F,
159  PS2_KEY_F16 = 0x70,
160  PS2_KEY_F17 = 0x71,
161  PS2_KEY_F18 = 0x72,
162  PS2_KEY_F19 = 0x73,
163  PS2_KEY_F20 = 0x74,
164  PS2_KEY_F21 = 0x75,
165  PS2_KEY_F22 = 0x76,
166  PS2_KEY_F23 = 0x77,
167  PS2_KEY_F24 = 0x78,
170  PS2_KEY_STOP = 0x7B,
171  PS2_KEY_PLAY = 0x7C,
172  PS2_KEY_MUTE = 0x7D,
177  PS2_KEY_CALC = 0x82,
189  PS2_KEY_WAKE = 0x90,
200  };
201  inline KeyCode operator |(KeyCode code, KeyCode modifiers) { return (KeyCode)((uint16_t)code | (uint16_t)modifiers); }
202  inline KeyCode operator &(KeyCode code, KeyCode modifiers) { return (KeyCode)((uint16_t)code & (uint16_t)modifiers); }
203  inline KeyCode &operator |=(KeyCode &code, KeyCode modifiers) { return code = (KeyCode)((uint16_t)code | (uint16_t)modifiers); }
204  inline KeyCode &operator &=(KeyCode &code, KeyCode modifiers) { return code = (KeyCode)((uint16_t)code & (uint16_t)modifiers); }
205  inline KeyCode operator ~(KeyCode code) { return (KeyCode)(~(uint16_t)code); }
206 
207 
235  bool isUnmake : 1;
236  bool isExtended : 1;
237  bool isExtended1 : 1;
238  bool haveGotExtended1FirstByte : 1;
239  KeyCode modifiers = PS2_NONE;
240 
241  public:
243 
248  KeyCode result = PS2_NONE;
249  if (code == KeyboardOutput::none) {
250  return PS2_NONE;
251  }
252  if (code == KeyboardOutput::unmake) {
253  this->isUnmake = true;
254  return PS2_NONE;
255  }
256  if (code == KeyboardOutput::extend) {
257  this->isExtended = true;
258  return PS2_NONE;
259  }
260  if (code == KeyboardOutput::extend1) {
261  this->isExtended1 = true;
262  return PS2_NONE;
263  }
264 
265  if (this->isExtended1) {
266  if (!this->haveGotExtended1FirstByte) {
267  this->haveGotExtended1FirstByte = true;
268  // Don't care about the actual content of the thing, because, oddly, there's only one
269  // key that uses Extended-1 mode
270  return PS2_NONE;
271  }
272  if (!this->isUnmake) {
273  result = KeyCode::PS2_KEY_BREAK;
274  }
275  this->reset();
276  return result;
277  }
278 
279  KeyCode modifier = this->translateModifier(code);
280  if (modifier != KeyCode::PS2_NONE) {
281  if (this->isUnmake) {
282  this->modifiers &= ~modifier;
283  }
284  else {
285  this->modifiers |= modifier;
286  }
287  this->reset();
288  return PS2_NONE;
289  }
290 
291  if (this->isUnmake) {
292  if (this->isExtended1 && !this->haveGotExtended1FirstByte) {
293  this->haveGotExtended1FirstByte = true;
294  }
295  else {
296  this->reset();
297  }
298  // Don't care about unmake
299  return PS2_NONE;
300  }
301 
302  KeyCode translatedCode = this->isExtended
303  ? translateExtended(code)
304  : translateNonExtended(code);
305  if (translatedCode != PS2_NONE) {
306  result = translatedCode | this->modifiers;
307  }
308 
309  this->reset();
310  return result;
311  }
312 
313  void reset()
314  {
315  this->isUnmake = false;
316  this->isExtended = false;
317  this->isExtended1 = false;
318  this->haveGotExtended1FirstByte = false;
319  }
320 
321  private:
322  KeyCode translateModifier(KeyboardOutput inputCode)
323  {
324  switch (inputCode) {
331  default: return KeyCode::PS2_NONE;
332  }
333  }
334 
335  KeyCode translateNonExtended(KeyboardOutput inputCode)
336  {
337  // This switch statements might make a bad bargain - they trade
338  // time-efficiency for program size.
339  switch (inputCode) {
450  // case KeyboardOutput::sc2_LANG5: return KeyCode::PS2_KEY_LANG5;
451  default: return KeyCode::PS2_NONE;
452  };
453  }
454 
455  KeyCode translateExtended(KeyboardOutput inputCode)
456  {
457  switch (inputCode) {
464  // case KeyboardOutput::sc2_BREAK: return KeyCode::PS2_KEY_BREAK; // <- This doesn't match up with how my keyboards work; I think it's an error
498  default: return KeyCode::PS2_NONE;
499  }
500  }
501  };
502 }
Definition: ps2_NeutralTranslator.h:43
Definition: ps2_NeutralTranslator.h:146
Definition: ps2_NeutralTranslator.h:93
Definition: ps2_NeutralTranslator.h:75
Definition: ps2_NeutralTranslator.h:135
Definition: ps2_NeutralTranslator.h:186
Definition: ps2_NeutralTranslator.h:160
Definition: ps2_NeutralTranslator.h:176
Definition: ps2_NeutralTranslator.h:145
Definition: ps2_NeutralTranslator.h:91
Definition: ps2_NeutralTranslator.h:69
Definition: ps2_NeutralTranslator.h:189
Definition: ps2_NeutralTranslator.h:192
Definition: ps2_NeutralTranslator.h:164
Definition: ps2_NeutralTranslator.h:48
Definition: ps2_NeutralTranslator.h:33
Definition: ps2_NeutralTranslator.h:129
Definition: ps2_NeutralTranslator.h:63
Definition: ps2_NeutralTranslator.h:102
Definition: ps2_NeutralTranslator.h:101
Definition: ps2_NeutralTranslator.h:115
Definition: ps2_NeutralTranslator.h:113
Definition: ps2_NeutralTranslator.h:46
Definition: ps2_NeutralTranslator.h:172
Definition: ps2_NeutralTranslator.h:112
Definition: ps2_NeutralTranslator.h:151
Definition: ps2_NeutralTranslator.h:66
Definition: ps2_NeutralTranslator.h:124
Definition: ps2_NeutralTranslator.h:64
Definition: ps2_NeutralTranslator.h:36
Definition: ps2_NeutralTranslator.h:156
Definition: ps2_NeutralTranslator.h:138
KeyboardLeds operator|(KeyboardLeds a, KeyboardLeds b)
Definition: ps2_KeyboardLeds.h:32
Definition: ps2_NeutralTranslator.h:169
Definition: ps2_NeutralTranslator.h:133
Definition: ps2_NeutralTranslator.h:96
Definition: ps2_NeutralTranslator.h:98
Definition: ps2_NeutralTranslator.h:165
Definition: ps2_NeutralTranslator.h:143
Definition: ps2_NeutralTranslator.h:45
Definition: ps2_NeutralTranslator.h:94
Definition: ps2_NeutralTranslator.h:73
Definition: ps2_NeutralTranslator.h:70
Definition: ps2_NeutralTranslator.h:50
Definition: ps2_NeutralTranslator.h:71
Definition: ps2_NeutralTranslator.h:84
Definition: ps2_NeutralTranslator.h:174
Definition: ps2_NeutralTranslator.h:199
Definition: ps2_NeutralTranslator.h:140
Definition: ps2_NeutralTranslator.h:80
Definition: ps2_NeutralTranslator.h:118
Definition: ps2_NeutralTranslator.h:158
Definition: ps2_NeutralTranslator.h:185
Definition: ps2_NeutralTranslator.h:193
KeyCode translatePs2Keycode(KeyboardOutput code)
Definition: ps2_NeutralTranslator.h:247
Definition: ps2_AnsiTranslator.h:24
Definition: ps2_NeutralTranslator.h:183
Definition: ps2_NeutralTranslator.h:166
Definition: ps2_NeutralTranslator.h:92
Definition: ps2_NeutralTranslator.h:59
Definition: ps2_NeutralTranslator.h:106
Definition: ps2_NeutralTranslator.h:141
Definition: ps2_NeutralTranslator.h:78
Definition: ps2_NeutralTranslator.h:157
KeyCode
Definition: ps2_NeutralTranslator.h:29
Definition: ps2_NeutralTranslator.h:76
Definition: ps2_NeutralTranslator.h:179
Definition: ps2_NeutralTranslator.h:123
Definition: ps2_NeutralTranslator.h:62
Definition: ps2_NeutralTranslator.h:79
Definition: ps2_NeutralTranslator.h:100
Definition: ps2_NeutralTranslator.h:125
Definition: ps2_NeutralTranslator.h:97
Definition: ps2_NeutralTranslator.h:195
Definition: ps2_NeutralTranslator.h:150
Definition: ps2_NeutralTranslator.h:180
Definition: ps2_NeutralTranslator.h:127
Definition: ps2_NeutralTranslator.h:149
Definition: ps2_NeutralTranslator.h:122
Definition: ps2_NeutralTranslator.h:121
Definition: ps2_NeutralTranslator.h:103
Definition: ps2_NeutralTranslator.h:99
Definition: ps2_NeutralTranslator.h:65
Definition: ps2_NeutralTranslator.h:168
Definition: ps2_NeutralTranslator.h:196
Definition: ps2_NeutralTranslator.h:74
Definition: ps2_NeutralTranslator.h:148
A translation from PS2 default ScanCode Set to a neutral format.
Definition: ps2_NeutralTranslator.h:234
Definition: ps2_NeutralTranslator.h:126
Definition: ps2_NeutralTranslator.h:175
Definition: ps2_NeutralTranslator.h:49
Definition: ps2_NeutralTranslator.h:83
KeyCode operator&(KeyCode code, KeyCode modifiers)
Definition: ps2_NeutralTranslator.h:202
Definition: ps2_NeutralTranslator.h:35
Definition: ps2_NeutralTranslator.h:117
void reset()
Definition: ps2_NeutralTranslator.h:313
KeyCode & operator&=(KeyCode &code, KeyCode modifiers)
Definition: ps2_NeutralTranslator.h:204
Definition: ps2_NeutralTranslator.h:163
Definition: ps2_NeutralTranslator.h:89
Definition: ps2_NeutralTranslator.h:57
Definition: ps2_NeutralTranslator.h:188
Definition: ps2_NeutralTranslator.h:191
Definition: ps2_NeutralTranslator.h:130
Definition: ps2_NeutralTranslator.h:147
Definition: ps2_NeutralTranslator.h:132
Definition: ps2_NeutralTranslator.h:68
Definition: ps2_NeutralTranslator.h:162
KeyboardOutput
Byte-codes sent back from the Ps2 keyboard to the host.
Definition: ps2_KeyboardOutput.h:31
Definition: ps2_NeutralTranslator.h:95
Definition: ps2_NeutralTranslator.h:77
KeyCode & operator|=(KeyCode &code, KeyCode modifiers)
Definition: ps2_NeutralTranslator.h:203
Definition: ps2_NeutralTranslator.h:120
Definition: ps2_NeutralTranslator.h:131
Definition: ps2_NeutralTranslator.h:144
Definition: ps2_NeutralTranslator.h:154
Definition: ps2_NeutralTranslator.h:107
Definition: ps2_NeutralTranslator.h:128
Definition: ps2_NeutralTranslator.h:114
Definition: ps2_NeutralTranslator.h:109
Definition: ps2_NeutralTranslator.h:55
Definition: ps2_NeutralTranslator.h:90
Definition: ps2_NeutralTranslator.h:155
Definition: ps2_NeutralTranslator.h:170
Definition: ps2_NeutralTranslator.h:194
KeyCode operator~(KeyCode code)
Definition: ps2_NeutralTranslator.h:205
Definition: ps2_NeutralTranslator.h:105
Definition: ps2_NeutralTranslator.h:152
Definition: ps2_NeutralTranslator.h:182
Definition: ps2_NeutralTranslator.h:104
Definition: ps2_NeutralTranslator.h:34
Definition: ps2_NeutralTranslator.h:136
Definition: ps2_NeutralTranslator.h:52
Definition: ps2_NeutralTranslator.h:178
Definition: ps2_NeutralTranslator.h:184
Definition: ps2_NeutralTranslator.h:198
Definition: ps2_NeutralTranslator.h:190
Definition: ps2_NeutralTranslator.h:187
Definition: ps2_NeutralTranslator.h:88
Definition: ps2_NeutralTranslator.h:85
Definition: ps2_NeutralTranslator.h:53
Definition: ps2_NeutralTranslator.h:51
NeutralTranslator()
Definition: ps2_NeutralTranslator.h:242
Definition: ps2_NeutralTranslator.h:197
Definition: ps2_NeutralTranslator.h:137
Definition: ps2_NeutralTranslator.h:56
Definition: ps2_NeutralTranslator.h:173
Definition: ps2_NeutralTranslator.h:72
Definition: ps2_NeutralTranslator.h:30
Definition: ps2_NeutralTranslator.h:44
Definition: ps2_NeutralTranslator.h:161
Definition: ps2_NeutralTranslator.h:38
Definition: ps2_NeutralTranslator.h:153
Definition: ps2_NeutralTranslator.h:61
Definition: ps2_NeutralTranslator.h:87
Definition: ps2_NeutralTranslator.h:82
Definition: ps2_NeutralTranslator.h:116
Definition: ps2_NeutralTranslator.h:171
Definition: ps2_NeutralTranslator.h:86
Definition: ps2_NeutralTranslator.h:139
Definition: ps2_NeutralTranslator.h:159
Definition: ps2_NeutralTranslator.h:111
Definition: ps2_NeutralTranslator.h:81
Definition: ps2_NeutralTranslator.h:134
Definition: ps2_NeutralTranslator.h:177
Definition: ps2_NeutralTranslator.h:181
Definition: ps2_NeutralTranslator.h:47
Definition: ps2_NeutralTranslator.h:67
Definition: ps2_NeutralTranslator.h:119
Definition: ps2_NeutralTranslator.h:110
Definition: ps2_NeutralTranslator.h:167