|
|
1.1 ! root 1: // ! 2: // nono ! 3: // Copyright (C) 2018 [email protected] ! 4: // ! 5: ! 6: #include "lunakbd.h" ! 7: #include "sio.h" ! 8: ! 9: // コンストラクタ ! 10: LunaKeyboard::LunaKeyboard() ! 11: { ! 12: memset(reptable, 0, sizeof(reptable)); ! 13: ! 14: // SIO へキー入力を通知するイベント ! 15: event.dev = gSIO; ! 16: event.func = (DeviceCallback_t)&SIODevice::RxCh1; ! 17: event.time = 0; ! 18: event.name = "KeyInput"; ! 19: } ! 20: ! 21: // デストラクタ ! 22: LunaKeyboard::~LunaKeyboard() ! 23: { ! 24: } ! 25: ! 26: // キーを押した ! 27: void ! 28: LunaKeyboard::MakeKey(uint keycode) ! 29: { ! 30: uint lunakey; ! 31: ! 32: // 共通キーコードから LUNA キーコードに ! 33: lunakey = keycode2lunakey(keycode); ! 34: ! 35: // LUNA にないキーは無視 ! 36: if (lunakey == NoKey) { ! 37: return; ! 38: } ! 39: ! 40: // すでにこのキーが押されていれば送らない ! 41: if (reptable[lunakey]) { ! 42: return; ! 43: } ! 44: ! 45: // キーが押された ! 46: putlog(1, "MakeKey %d(%s)", lunakey, keyname[lunakey]); ! 47: reptable[lunakey] = 1; ! 48: ! 49: // SIO に通知 ! 50: event.code = lunakey; ! 51: gScheduler->AddEvent(&event); ! 52: } ! 53: ! 54: // キーを離した ! 55: void ! 56: LunaKeyboard::BreakKey(uint keycode) ! 57: { ! 58: uint lunakey; ! 59: ! 60: // 共通キーコードから LUNA キーコードに ! 61: lunakey = keycode2lunakey(keycode); ! 62: ! 63: // LUNA にないキーは無視 ! 64: if (lunakey == NoKey) { ! 65: return; ! 66: } ! 67: ! 68: // キーが離された ! 69: putlog(2, "BreakKey %d(%s)", lunakey, keyname[lunakey]); ! 70: reptable[lunakey] = 0; ! 71: ! 72: // SIO に通知 ! 73: event.code = lunakey | 0x80; ! 74: gScheduler->AddEvent(&event); ! 75: } ! 76: ! 77: // 共通キーコードを LUNA キーコードに変換して返す。 ! 78: // LUNA キーがなければ NoKey を返す。 ! 79: uint ! 80: LunaKeyboard::keycode2lunakey(uint keycode) ! 81: { ! 82: if (keycode >= countof(keycode2lunakey_table)) { ! 83: return NoKey; ! 84: } ! 85: ! 86: return keycode2lunakey_table[keycode]; ! 87: } ! 88: ! 89: // キーコード変換表 ! 90: // 共通キーコードから LUNA キーコードに変換する。 ! 91: // ぶっちゃけた話共通キーコードは LUNA キーコードをベースにしているので、 ! 92: // 穴がある以外は全部透過。 ! 93: /*static*/ const uint ! 94: LunaKeyboard::keycode2lunakey_table[128] = { ! 95: NoKey, // [00] ! 96: NoKey, // [01] ! 97: NoKey, // [02] ! 98: NoKey, // [03] ! 99: NoKey, // [04] ! 100: NoKey, // [05] ! 101: NoKey, // [06] ! 102: NoKey, // [07] ! 103: NoKey, // [08] ! 104: LunaKey_TAB, // [09] ! 105: LunaKey_CTRL, // [0a] ! 106: LunaKey_kana, // [0b] ! 107: LunaKey_SHIFT_L, // [0c] ! 108: LunaKey_SHIFT_R, // [0d] ! 109: LunaKey_CAPS, // [0e] ! 110: LunaKey_SF, // [0f] ! 111: ! 112: LunaKey_ESC, // [10] ! 113: LunaKey_BS, // [11] ! 114: LunaKey_enter, // [12] ! 115: NoKey, // [13] ! 116: LunaKey_space, // [14] ! 117: LunaKey_DEL, // [15] ! 118: LunaKey_XFER, // [16] ! 119: LunaKey_VALID, // [17] ! 120: LunaKey_PF11, // [18] ! 121: LunaKey_PF12, // [19] ! 122: LunaKey_PF13, // [1a] ! 123: LunaKey_PF14, // [1b] ! 124: LunaKey_up, // [1c] ! 125: LunaKey_left, // [1d] ! 126: LunaKey_right, // [1e] ! 127: LunaKey_down, // [1f] ! 128: ! 129: NoKey, // [20] ! 130: NoKey, // [21] ! 131: LunaKey_1, // [22] ! 132: LunaKey_2, // [23] ! 133: LunaKey_3, // [24] ! 134: LunaKey_4, // [25] ! 135: LunaKey_5, // [26] ! 136: LunaKey_6, // [27] ! 137: LunaKey_7, // [28] ! 138: LunaKey_8, // [29] ! 139: LunaKey_9, // [2a] ! 140: LunaKey_0, // [2b] ! 141: LunaKey_minus, // [2c] ! 142: LunaKey_circum, // [2d] ! 143: LunaKey_backslash, // [2e] ! 144: NoKey, // [2f] ! 145: ! 146: NoKey, // [30] ! 147: NoKey, // [31] ! 148: LunaKey_Q, // [32] ! 149: LunaKey_W, // [33] ! 150: LunaKey_E, // [34] ! 151: LunaKey_R, // [35] ! 152: LunaKey_T, // [36] ! 153: LunaKey_Y, // [37] ! 154: LunaKey_U, // [38] ! 155: LunaKey_I, // [39] ! 156: LunaKey_O, // [3a] ! 157: LunaKey_P, // [3b] ! 158: LunaKey_at, // [3c] ! 159: LunaKey_bracketleft, // [3d] ! 160: NoKey, // [3e] ! 161: NoKey, // [3f] ! 162: ! 163: NoKey, // [40] ! 164: NoKey, // [41] ! 165: LunaKey_A, // [42] ! 166: LunaKey_S, // [43] ! 167: LunaKey_D, // [44] ! 168: LunaKey_F, // [45] ! 169: LunaKey_G, // [46] ! 170: LunaKey_H, // [47] ! 171: LunaKey_J, // [48] ! 172: LunaKey_K, // [49] ! 173: LunaKey_L, // [4a] ! 174: LunaKey_semicolon, // [4b] ! 175: LunaKey_colon, // [4c] ! 176: LunaKey_bracketright, // [4d] ! 177: NoKey, // [4e] ! 178: NoKey, // [4f] ! 179: ! 180: NoKey, // [50] ! 181: NoKey, // [51] ! 182: LunaKey_Z, // [52] ! 183: LunaKey_X, // [53] ! 184: LunaKey_C, // [54] ! 185: LunaKey_V, // [55] ! 186: LunaKey_B, // [56] ! 187: LunaKey_N, // [57] ! 188: LunaKey_M, // [58] ! 189: LunaKey_comma, // [59] ! 190: LunaKey_period, // [5a] ! 191: LunaKey_slash, // [5b] ! 192: LunaKey_underscore, // [5c] ! 193: NoKey, // [5d] ! 194: NoKey, // [5e] ! 195: NoKey, // [5f] ! 196: ! 197: NoKey, // [60] ! 198: LunaKey_PAD_plus, // [61] ! 199: LunaKey_PAD_minus, // [62] ! 200: LunaKey_PAD_7, // [63] ! 201: LunaKey_PAD_8, // [64] ! 202: LunaKey_PAD_9, // [65] ! 203: LunaKey_PAD_4, // [66] ! 204: LunaKey_PAD_5, // [67] ! 205: LunaKey_PAD_6, // [68] ! 206: LunaKey_PAD_1, // [69] ! 207: LunaKey_PAD_2, // [6a] ! 208: LunaKey_PAD_3, // [6b] ! 209: LunaKey_PAD_0, // [6c] ! 210: LunaKey_PAD_decimal, // [6d] ! 211: LunaKey_PAD_enter, // [6e] ! 212: NoKey, // [6f] ! 213: ! 214: NoKey, // [70] ! 215: NoKey, // [71] ! 216: LunaKey_F1, // [72] ! 217: LunaKey_F2, // [73] ! 218: LunaKey_F3, // [74] ! 219: LunaKey_F4, // [75] ! 220: LunaKey_F5, // [76] ! 221: LunaKey_F6, // [77] ! 222: LunaKey_F7, // [78] ! 223: LunaKey_F8, // [79] ! 224: LunaKey_F9, // [7a] ! 225: LunaKey_F10, // [7b] ! 226: LunaKey_PAD_multiply, // [7c] ! 227: LunaKey_PAD_divide, // [7d] ! 228: LunaKey_PAD_equal, // [7e] ! 229: LunaKey_PAD_comma, // [7f] ! 230: }; ! 231: ! 232: /*static*/ const char * const ! 233: LunaKeyboard::keyname[] = ! 234: { ! 235: "", // 00 ! 236: "", // 01 ! 237: "", // 02 ! 238: "", // 03 ! 239: "", // 04 ! 240: "", // 05 ! 241: "", // 06 ! 242: "", // 07 ! 243: "", // 08 ! 244: "TAB", // 09 ! 245: "CTRL", // 0a ! 246: "かな", // 0b ! 247: "SHIFT", // 0c ! 248: "SHIFT", // 0d ! 249: "CAPS", // 0e ! 250: "S.F", // 0f ! 251: ! 252: "ESC", // 10 ! 253: "BS", // 11 ! 254: "Enter", // 12 ! 255: "", // 13 ! 256: "Space", // 14 ! 257: "DEL", // 15 ! 258: "XFER", // 16 ! 259: "VALID", // 17 ! 260: "PF11", // 18 ! 261: "PF12", // 19 ! 262: "PF13", // 1a ! 263: "PF14", // 1b ! 264: "↑", // 1c ! 265: "←", // 1d ! 266: "→", // 1e ! 267: "↓", // 1f ! 268: ! 269: "", // 20 ! 270: "", // 21 ! 271: "1!", // 22 ! 272: "2\"", // 23 ! 273: "3#", // 24 ! 274: "4$", // 25 ! 275: "5%", // 26 ! 276: "6&", // 27 ! 277: "7'", // 28 ! 278: "8(", // 29 ! 279: "9)", // 2a ! 280: "0", // 2b ! 281: "-=", // 2c ! 282: "^~", // 2d ! 283: "\\|", // 2e ! 284: "", // 2f ! 285: ! 286: "", // 30 ! 287: "", // 31 ! 288: "Q", // 32 ! 289: "W", // 33 ! 290: "E", // 34 ! 291: "R", // 35 ! 292: "T", // 36 ! 293: "Y", // 37 ! 294: "U", // 38 ! 295: "I", // 39 ! 296: "O", // 3a ! 297: "P", // 3b ! 298: "@`", // 3c ! 299: "[{", // 3d ! 300: "", // 3e ! 301: "", // 3f ! 302: ! 303: "", // 40 ! 304: "", // 41 ! 305: "A", // 42 ! 306: "S", // 43 ! 307: "D", // 44 ! 308: "F", // 45 ! 309: "G", // 46 ! 310: "H", // 47 ! 311: "J", // 48 ! 312: "K", // 49 ! 313: "L", // 4a ! 314: ";+", // 4b ! 315: ":*", // 4c ! 316: "]}", // 4d ! 317: "", // 4e ! 318: "", // 4f ! 319: ! 320: "", // 50 ! 321: "", // 51 ! 322: "Z", // 52 ! 323: "X", // 53 ! 324: "C", // 54 ! 325: "V", // 55 ! 326: "B", // 56 ! 327: "N", // 57 ! 328: "M", // 58 ! 329: ",<", // 59 ! 330: ".>", // 5a ! 331: "/?", // 5b ! 332: " _", // 5c ! 333: "", // 5d ! 334: "", // 5e ! 335: "", // 5f ! 336: ! 337: "", // 60 ! 338: "PAD+", // 61 ! 339: "PAD-", // 62 ! 340: "PAD7", // 63 ! 341: "PAD8", // 64 ! 342: "PAD9", // 65 ! 343: "PAD4", // 66 ! 344: "PAD5", // 67 ! 345: "PAD6", // 68 ! 346: "PAD1", // 69 ! 347: "PAD2", // 6a ! 348: "PAD3", // 6b ! 349: "PAD0", // 6c ! 350: "PAD.", // 6d ! 351: "PADEn", // 6e ! 352: "", // 6f ! 353: ! 354: "", // 70 ! 355: "", // 71 ! 356: "F1", // 72 ! 357: "F2", // 73 ! 358: "F3", // 74 ! 359: "F4", // 75 ! 360: "F5", // 76 ! 361: "F6", // 77 ! 362: "F7", // 78 ! 363: "F8", // 79 ! 364: "F9", // 7a ! 365: "F10", // 7b ! 366: "PAD*", // 7c ! 367: "PAD/", // 7d ! 368: "PAD=", // 7e ! 369: "PAD,", // 7f ! 370: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.