1 //
2 // Copyright (c) 2010-2018 Antmicro
3 // Copyright (c) 2011-2015 Realtime Embedded
4 //
5 // This file is licensed under the MIT License.
6 // Full license text is available in 'licenses/MIT.txt'.
7 //
8 using System;
9 
10 namespace Antmicro.Renode.Peripherals.Input
11 {
12     // Here values are according to the USB keyboard scan codes
13     public enum KeyScanCode
14     {
15         NoKey = -1,
16         Number1 = 0x1E,
17         Number2 = 0x1F,
18         Number3 = 0x20,
19         Number4 = 0x21,
20         Number5 = 0x22,
21         Number6 = 0x23,
22         Number7 = 0x24,
23         Number8 = 0x25,
24         Number9 = 0x26,
25         Number0 = 0x27,
26         Keypad1 = 0x59,
27         Keypad2 = 0x5A,
28         Keypad3 = 0x5B,
29         Keypad4 = 0x5C,
30         Keypad5 = 0x5D,
31         Keypad6 = 0x5E,
32         Keypad7 = 0x5F,
33         Keypad8 = 0x60,
34         Keypad9 = 0x61,
35         Keypad0 = 0x62,
36         KeypadMinus = 0x56,
37         KeypadPlus = 0x57,
38         KeypadMultiply = 0x55,
39         KeypadDivide = 0x54,
40         KeypadEnter = 0x58,
41         KeypadComma = 0x63,
42         WinL = 0xE3,
43         WinR = 0xE7,
44         WinMenu = 0x65,
45         Q = 0x14,
46         W = 0x1A,
47         E = 0x08,
48         R = 0x15,
49         T = 0x17,
50         Y = 0x1C,
51         U = 0x18,
52         I = 0x0C,
53         O = 0x12,
54         P = 0x13,
55         A = 0x04,
56         S = 0x16,
57         D = 0x07,
58         F = 0x09,
59         G = 0x0A,
60         H = 0x0B,
61         J = 0x0D,
62         K = 0x0E,
63         L = 0x0F,
64         ShiftL = 0xE1,
65         Z = 0x1D,
66         X = 0x1B,
67         C = 0x06,
68         V = 0x19,
69         B = 0x05,
70         N = 0x11,
71         M = 0x10,
72         ShiftR = 0xE5,
73         Enter = 0x28,
74         Escape = 0x29,
75         BackSpace = 0x2A,
76         Tab = 0x2B,
77         Space = 0x2C,
78         OemMinus = 0x2D,
79         OemPlus = 0x2E,
80         OemOpenBrackets = 0x2F,
81         OemCloseBrackets = 0x30,
82         OemPipe = 0x31,
83         OemSemicolon = 0x33,
84         OemQuotes = 0x34,
85         CapsLock = 0x39,
86         OemPeriod= 0x36,
87         OemComma = 0x37,
88         OemQuestion = 0x38,
89         NumLock = 0x53,
90         Pause = 0x48,
91         PrtSc = 0x46,
92         ScrollLock = 0x47,
93         Insert = 0x49,
94         Delete = 0x4C,
95         Left = 0x50,
96         Right = 0x4F,
97         Up = 0x52,
98         Down = 0x51,
99         CtrlL = 0xE0,
100         CtrlR = 0xE4,
101         AltL = 0xE2,
102         AltR = 0xE6,
103         Tilde = 0x35,
104         F1 = 0x3A,
105         F2 = 0x3B,
106         F3 = 0x3C,
107         F4 = 0x3D,
108         F5 = 0x3E,
109         F6 = 0x3F,
110         F7 = 0x40,
111         F8 = 0x41,
112         F9 = 0x42,
113         F10 = 0x43,
114         F11 = 0x44,
115         F12 = 0x45,
116         Home = 0x4A,
117         End = 0x4D,
118         PageUp = 0x4B,
119         PageDown = 0x4E
120     }
121 
122     public static class KeyScanCodeExtensions
123     {
ToKeyScanCodes(this char c)124         public static KeyScanCode[] ToKeyScanCodes(this char c)
125         {
126             if(c >= 'a' && c <= 'z')
127             {
128                 return new[] { KeyScanCode.A + (c - 'a') };
129             }
130 
131             if(c >= 'A' && c <= 'Z')
132             {
133                 return new[] { KeyScanCode.ShiftL, KeyScanCode.A + (c - 'A') };
134             }
135 
136             // `0` is handled in the switch below as Number0 is after Number9
137             // and in ACII 0 is before 1
138             if(c >= '1' && c <= '9')
139             {
140                 return new [] { KeyScanCode.Number1 + (c - '1') };
141             }
142 
143             switch(c)
144             {
145                 case '0':
146                     return new [] { KeyScanCode.Number0 };
147                 case ' ':
148                     return new [] { KeyScanCode.Space };
149                 case '`':
150                     return new [] { KeyScanCode.Tilde };
151                 case '~':
152                     return new [] { KeyScanCode.ShiftL, KeyScanCode.Tilde };
153                 case '!':
154                     return new [] { KeyScanCode.ShiftL, KeyScanCode.Number1 };
155                 case '@':
156                     return new [] { KeyScanCode.ShiftL, KeyScanCode.Number2 };
157                 case '#':
158                     return new [] { KeyScanCode.ShiftL, KeyScanCode.Number3 };
159                 case '$':
160                     return new [] { KeyScanCode.ShiftL, KeyScanCode.Number4 };
161                 case '%':
162                     return new [] { KeyScanCode.ShiftL, KeyScanCode.Number5 };
163                 case '^':
164                     return new [] { KeyScanCode.ShiftL, KeyScanCode.Number6 };
165                 case '&':
166                     return new [] { KeyScanCode.ShiftL, KeyScanCode.Number7 };
167                 case '*':
168                     return new [] { KeyScanCode.ShiftL, KeyScanCode.Number8 };
169                 case '(':
170                     return new [] { KeyScanCode.ShiftL, KeyScanCode.Number9 };
171                 case ')':
172                     return new [] { KeyScanCode.ShiftL, KeyScanCode.Number0 };
173                 case '-':
174                     return new [] { KeyScanCode.OemMinus };
175                 case '_':
176                     return new [] { KeyScanCode.ShiftL, KeyScanCode.OemMinus };
177                 case '=':
178                     return new [] { KeyScanCode.OemPlus };
179                 case '+':
180                     return new [] { KeyScanCode.ShiftL, KeyScanCode.OemPlus };
181                 case '[':
182                     return new [] { KeyScanCode.OemOpenBrackets };
183                 case '{':
184                     return new [] { KeyScanCode.ShiftL, KeyScanCode.OemOpenBrackets };
185                 case ']':
186                     return new [] { KeyScanCode.OemCloseBrackets };
187                 case '}':
188                     return new [] { KeyScanCode.ShiftL, KeyScanCode.OemCloseBrackets };
189                 case '\\':
190                     return new [] { KeyScanCode.OemPipe };
191                 case '|':
192                     return new [] { KeyScanCode.ShiftL, KeyScanCode.OemPipe };
193                 case ';':
194                     return new [] { KeyScanCode.OemSemicolon };
195                 case ':':
196                     return new [] { KeyScanCode.ShiftL, KeyScanCode.OemSemicolon };
197                 case '\'':
198                     return new [] { KeyScanCode.OemQuotes };
199                 case '"':
200                     return new [] { KeyScanCode.ShiftL, KeyScanCode.OemQuotes };
201                 case ',':
202                     return new [] { KeyScanCode.OemComma };
203                 case '<':
204                     return new [] { KeyScanCode.ShiftL, KeyScanCode.OemComma };
205                 case '.':
206                     return new [] { KeyScanCode.OemPeriod };
207                 case '>':
208                     return new [] { KeyScanCode.ShiftL, KeyScanCode.OemPeriod };
209                 case '/':
210                     return new [] { KeyScanCode.OemQuestion };
211                 case '?':
212                     return new [] { KeyScanCode.ShiftL, KeyScanCode.OemQuestion };
213             }
214 
215             return new KeyScanCode[0];
216         }
217     }
218 }
219 
220 
221