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