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