Annotation of nono/vm/keyboard.h, revision 1.1.1.18

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.18! root      160: inline Keyboard *GetKeyboard() {
1.1.1.12  root      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)  // キーボードを接続する

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.