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