|
|
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.