|
|
1.1 root 1: //
2: // nono
1.1.1.4 root 3: // Copyright (C) 2020 nono project
4: // Licensed under nono-license.txt
1.1 root 5: //
6:
1.1.1.11! root 7: //
! 8: // キーボード (基本クラス)
! 9: //
! 10:
1.1 root 11: #pragma once
12:
13: #include "device.h"
1.1.1.6 root 14: #include "fixedqueue.h"
1.1.1.11! root 15: #include "message.h"
1.1 root 16:
17: class Keyboard : public Device
18: {
1.1.1.4 root 19: using inherited = Device;
1.1 root 20: protected:
21: Keyboard();
22: public:
1.1.1.5 root 23: virtual ~Keyboard() override;
1.1 root 24:
1.1.1.11! root 25: bool Init() override;
! 26: void ResetHard(bool poweron) override;
! 27: void PowerOff() override;
1.1.1.6 root 28:
29: // キーを押した (外部から呼ばれる)
30: void MakeKey(uint keycode);
31: // キーを離した (外部から呼ばれる)
32: void BreakKey(uint keycode);
1.1.1.9 root 33: // 文字入力によるキーエミュレーション (外部から呼ばれる)
34: void CharInput(uint charcode);
1.1 root 35:
1.1.1.11! root 36: // マウス入力。
1.1.1.2 root 37: // x, y は X, Y の前回からの移動量。
38: // X は画面右に動く方向をプラス、Y は画面下に動く方向をプラスとする。
39: // 移動量が VM で扱える範囲内か、それを越えていたらどうするかは
40: // 継承クラスが処理する。
41: // rb, lb, mb はボタンの状態。true なら押下中。
42: virtual void MouseInput(int x, int y, bool rb, bool lb, bool mb) = 0;
43:
1.1.1.8 root 44: // マウスデータを VM に送信する MD 処理
45: virtual void MouseSendStart() = 0;
46:
1.1.1.4 root 47: // ホストからの制御コマンド
48: virtual void Command(uint32 data) = 0;
49:
1.1.1.6 root 50: // 指定のキーの押し下げ状態取得 (ソフトウェアキーボードなどから)
51: bool IsPressed(uint keycode) const {
52: assert(keycode < pressed.size());
53: return pressed[keycode];
54: }
55:
56: // 全てのキーの押し下げ状態取得 (ソフトウェアキーボードなどから)
57: const std::vector<bool>& GetPressed() const { return pressed; }
58:
1.1.1.4 root 59: // LED 状態取得 (ソフトウェアキーボードなどから)
60: const std::vector<bool>& GetLED() const { return led; }
61:
1.1.1.6 root 62: // シフト状態なら true を返す
63: // シフトキーは機種によって処理が異なるため、この関数を使って
64: // 状態を取得すること。
65: virtual bool IsShift() const = 0;
66:
1.1.1.11! root 67: // キーボードを接続する
! 68: void Connect(bool connect);
! 69:
! 70: // キーボードが接続されていれば true を返す
! 71: bool IsConnected() const { return is_connected; }
! 72:
1.1 root 73: // キー名を返す (主にデバッグ表示用)
1.1.1.7 root 74: static const std::string GetKeyName(uint code);
1.1 root 75:
1.1.1.4 root 76: protected:
1.1.1.11! root 77: // キーボードの接続処理の実体
! 78: void DoConnect();
! 79: void DoDisconnect();
! 80:
! 81: virtual void MDConnect() = 0;
! 82: virtual void MDDisconnect() = 0;
! 83:
1.1.1.6 root 84: // キーコードには、
85: // o 共通キーコード(コードのみ)、
86: // o 共通キーコード(コードと Make/Break フラグあり)、
87: // o 機種依存キーコード
88: // の3つがあり、どれも uint なので変数名で区別することにする。
89: // o keycode .. 共通キーコード
90: // o keystat .. フラグ付き共通キーコード
91: // o mdkey .. 機種依存キーコード
92:
93: // 共通キーコードを機種別のキーコードに変換する
94: virtual uint KeyToMDKey(uint keycode) const = 0;
95:
1.1.1.7 root 96: // キーを1つ処理する
97: virtual void KeyInput(uint keystat) = 0;
98:
99: // キーを処理する (共通部分)
100: bool KeyInputCommon(uint keystat);
1.1.1.6 root 101:
1.1.1.10 root 102: // アクティブカウンタを 1 増やす。
103: // 0 -> 1 の遷移でスケジューラに通知する。
104: void Acquire();
105:
106: // アクティブカウンタを 1 減らす。
107: // 1 -> 0 の遷移でスケジューラに通知する。
108: void Release();
109:
1.1.1.6 root 110: // キーを VM に送信する MD 処理
111: virtual void SendStart() = 0;
112:
1.1.1.11! root 113: // キーボードが接続されているとき true
! 114: bool is_connected {};
! 115:
1.1.1.6 root 116: // どのキーが押されているか (共通キーコード)
117: std::vector<bool> pressed {};
118:
1.1.1.10 root 119: // アクティブカウンタ。
120: // 0 のときは UI と対話していないことを示す。
121: int active {};
1.1.1.6 root 122:
123: // 入力されたキーを VM へ送信するときのバッファ。
124: FixedQueue<uint, 8> sendqueue {};
125:
1.1.1.4 root 126: // LED (true で点灯)。
127: // GetLED() あたりが同じ形式で済むのでここにあるけど、機種によって
128: // LED 数が違うので、何番がどのキーに対応するかの取り決めや、初期化も
129: // 含めたコードはすべて派生クラス側で用意すること。
130: std::vector<bool> led {};
131:
1.1.1.8 root 132: // マウス状態
133: int mouse_x {}; // 前回送信から現在までの積算値
134: int mouse_y {};
135: bool mouse_r {}; // 現在値
136: bool mouse_l {};
137: bool mouse_m {};
138: bool prev_r {}; // 前回送信時の値
139: bool prev_l {};
140: bool prev_m {};
141:
1.1 root 142: private:
1.1.1.11! root 143: void KeyInputCallback(MessageID, uint32);
1.1.1.6 root 144:
1.1 root 145: static std::vector<const char *> keyname;
1.1.1.9 root 146: static std::vector<uint> char_key;
1.1 root 147: };
148:
1.1.1.11! root 149: extern Keyboard *gKeyboard;
1.1 root 150:
1.1.1.10 root 151: // keystat は下位 8bit がキーコード。
152: // 上位(今の所 8bit) は各種フラグ。
153: //
154: // 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
155: // +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
156: // |M/B|UI | LED | 0 | KM_* | Keycode |
157: // +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
158: // | | | |
159: // | | | +-- キャラクタ入力でのモディファイヤフラグ
160: // | | +------------------ LUNA の LED キー送信フラグ
161: // | +------------------------ char 入力モードでキーコードを UI に通知
162: // | (inputqueue 内で使用する)
163: // +---------------------------- キーの Make/Break
164:
165: #define KM_SHIFT (0x0100) // char モードで SHIFT 押下
166: #define KM_CTRL (0x0200) // char モードで CTRL 押下
167:
168: #define KC_FLAG_LED_MAKE (0x1000) // LUNA LED キーの押下を送信
169: #define KC_FLAG_LED_BREAK (0x2000) // LUNA LED キーの開放を送信
170: #define KC_FLAG_LED_DROP (0x3000) // LUNA LED キーを送信しない
171:
172: #define KC_FLAG_POST (0x4000) // キーコードを UI に通知
173:
174: #define KC_FLAG_MAKE (0x0000) // キー押下 (値は 0 だが便宜上)
175: #define KC_FLAG_BREAK (0x8000) // キー開放
176:
177: // keystat のアクセスマクロ
178: #define KC_CODE(x) ((x) & 0x00ff) // keycode を取得
179: #define KC_FLAG_LED(x) ((x) & 0x3000) // LUNA LED キー動作を取得
180: #define KC_IS_POST(x) (((x) & KC_FLAG_POST) != 0) // UI に通知なら true
181: #define KC_IS_MAKE(x) (((x) & KC_FLAG_BREAK) == 0) // キー押下なら true
182: #define KC_IS_BREAK(x) (((x) & KC_FLAG_BREAK) != 0) // キー開放なら true
183:
1.1 root 184: // 抽象化キーボードレイヤーでのキーコード。
185: // wxWidgets で受け取ったキーコードをこれに変換して VM に入力する。
186: // VM のキーボードデバイスがこれを当該機種ごとのキーコードなり何なりに
187: // 変換して入力する。
188:
189: #define KC_none (0)
190:
191: #define KC_BREAK (0x01) // [X68k] BREAK
192: #define KC_COPY (0x02) // [X68k] COPY
193: #define KC_romaji (0x03) // [X68k] ローマ字
194: #define KC_code (0x04) // [X68k] コード入力
195: #define KC_kigou (0x05) // [X68k] 記号入力
196: #define KC_touroku (0x06) // [X68k] 登録
197: #define KC_HELP (0x07) // [X68k] HELP
1.1.1.10 root 198: #define KC_SHIFT (0x08) // [X68k] SHIFT (左右の区別なし)
1.1 root 199: #define KC_TAB (0x09)
200: #define KC_CTRL (0x0a)
201: #define KC_kana (0x0b) // かな
202: #define KC_SHIFT_L (0x0c) // SHIFT(左)
203: #define KC_SHIFT_R (0x0d) // SHIFT(右)
204: #define KC_CAPS (0x0e)
205: #define KC_SF (0x0f) // [LUNA] S.F
206:
207: #define KC_ESC (0x10)
208: #define KC_BS (0x11) // BackSpace
209: #define KC_enter (0x12) // Enter (Return)
210: #define KC_INS (0x13) // [X68k] INS
211: #define KC_space (0x14)
212: #define KC_DEL (0x15)
213: #define KC_XFER (0x16) // [LUNA] XFER
214: #define KC_VALID (0x17) // [LUNA] VALID
215: #define KC_PF11 (0x18) // [LUNA] PF11
216: #define KC_PF12 (0x19) // [LUNA] PF12
217: #define KC_PF13 (0x1a) // [LUNA] PF13
218: #define KC_PF14 (0x1b) // [LUNA] PF14
219: #define KC_up (0x1c) // cursor up
220: #define KC_left (0x1d) // cursor left
221: #define KC_right (0x1e) // cursor right
222: #define KC_down (0x1f) // cursor down
223:
224: #define KC_ROLLUP (0x20) // [X68k] ROLL UP
225: #define KC_ROLLDOWN (0x21) // [X68k] ROLL DOWN
226: #define KC_1 (0x22)
227: #define KC_2 (0x23)
228: #define KC_3 (0x24)
229: #define KC_4 (0x25)
230: #define KC_5 (0x26)
231: #define KC_6 (0x27)
232: #define KC_7 (0x28)
233: #define KC_8 (0x29)
234: #define KC_9 (0x2a)
235: #define KC_0 (0x2b)
236: #define KC_minus (0x2c)
237: #define KC_circum (0x2d) // ^~
238: #define KC_backslash (0x2e) // \|
239:
240: #define KC_OPT1 (0x30) // [X68k] OPT.1
241: #define KC_OPT2 (0x31) // [X68k] OPT.2
242: #define KC_Q (0x32)
243: #define KC_W (0x33)
244: #define KC_E (0x34)
245: #define KC_R (0x35)
246: #define KC_T (0x36)
247: #define KC_Y (0x37)
248: #define KC_U (0x38)
249: #define KC_I (0x39)
250: #define KC_O (0x3a)
251: #define KC_P (0x3b)
252: #define KC_at (0x3c)
253: #define KC_bracketleft (0x3d) // '['
254: #define KC_hira (0x3e) // [X68k] ひらがな
255: #define KC_zenkaku (0x3f) // [X68k] 全角
256:
1.1.1.10 root 257: #define KC_HOME (0x40) // [X68k] HOME
258: #define KC_UNDO (0x41) // [X68k] UNDO
1.1 root 259: #define KC_A (0x42)
260: #define KC_S (0x43)
261: #define KC_D (0x44)
262: #define KC_F (0x45)
263: #define KC_G (0x46)
264: #define KC_H (0x47)
265: #define KC_J (0x48)
266: #define KC_K (0x49)
267: #define KC_L (0x4a)
268: #define KC_semicolon (0x4b)
269: #define KC_colon (0x4c)
270: #define KC_bracketright (0x4d) // ']'
271:
1.1.1.10 root 272: #define KC_XF1 (0x50) // [X68k] XF1
273: #define KC_XF2 (0x51) // [X68k] XF2
1.1 root 274: #define KC_Z (0x52)
275: #define KC_X (0x53)
276: #define KC_C (0x54)
277: #define KC_V (0x55)
278: #define KC_B (0x56)
279: #define KC_N (0x57)
280: #define KC_M (0x58)
281: #define KC_comma (0x59)
282: #define KC_period (0x5a)
283: #define KC_slash (0x5b)
284: #define KC_underscore (0x5c)
1.1.1.10 root 285: #define KC_XF3 (0x5d) // [X68k] XF3
286: #define KC_XF4 (0x5e) // [X68k] XF4
287: #define KC_XF5 (0x5f) // [X68k] XF5
1.1 root 288:
289: #define KC_PAD_plus (0x61)
290: #define KC_PAD_minus (0x62)
291: #define KC_PAD_7 (0x63)
292: #define KC_PAD_8 (0x64)
293: #define KC_PAD_9 (0x65)
294: #define KC_PAD_4 (0x66)
295: #define KC_PAD_5 (0x67)
296: #define KC_PAD_6 (0x68)
297: #define KC_PAD_1 (0x69)
298: #define KC_PAD_2 (0x6a)
299: #define KC_PAD_3 (0x6b)
300: #define KC_PAD_0 (0x6c)
301: #define KC_PAD_decimal (0x6d) // .
302: #define KC_PAD_enter (0x6e)
303: #define KC_PAD_CLR (0x6f) // [X68k] CLR
304:
305: #define KC_F1 (0x72)
306: #define KC_F2 (0x73)
307: #define KC_F3 (0x74)
308: #define KC_F4 (0x75)
309: #define KC_F5 (0x76)
310: #define KC_F6 (0x77)
311: #define KC_F7 (0x78)
312: #define KC_F8 (0x79)
313: #define KC_F9 (0x7a)
314: #define KC_F10 (0x7b)
315: #define KC_PAD_multiply (0x7c)
316: #define KC_PAD_divide (0x7d)
317: #define KC_PAD_equal (0x7e)
318: #define KC_PAD_comma (0x7f)
319:
1.1.1.10 root 320: #define KC_max (0x80)
1.1.1.9 root 321:
322: // 文字入力モードの拡張部分
323: #define CC_NUL (0x80) // NUL (Ctrl + @)
324: #define CC_F1 (0x81)
325: #define CC_F2 (0x82)
326: #define CC_F3 (0x83)
327: #define CC_F4 (0x84)
328: #define CC_F5 (0x85)
329: #define CC_F6 (0x86)
330: #define CC_F7 (0x87)
331: #define CC_F8 (0x88)
332: #define CC_F9 (0x89)
333: #define CC_F10 (0x8a)
334:
335: #define CC_up (0x8c)
336: #define CC_left (0x8d)
337: #define CC_right (0x8e)
338: #define CC_down (0x8f)
1.1.1.11! root 339:
! 340: #define CC_disconnect (0x90) // キーボードを取り外す
! 341: #define CC_connect (0x91) // キーボードを接続する
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.