--- nono/vm/lunakbd.h 2026/04/29 17:04:39 1.1.1.4 +++ nono/vm/lunakbd.h 2026/04/29 17:05:17 1.1.1.12 @@ -4,79 +4,90 @@ // Licensed under nono-license.txt // +// +// LUNA のキーボードとマウス +// + #pragma once #include "keyboard.h" -#include "scheduler.h" +#include "event.h" +#include "monitor.h" + +class SIODevice; class LunaKeyboard : public Keyboard { using inherited = Keyboard; public: LunaKeyboard(); - ~LunaKeyboard() override; + virtual ~LunaKeyboard() override; + + bool Init() override; - void ResetHard() override; - void MonitorUpdate(TextScreen&) override; + // シフト状態なら true を返す + bool IsShift() const override; - // キーを押した - void MakeKey(uint) override; - // キーを離した - void BreakKey(uint) override; // マウス入力 void MouseInput(int x, int y, bool rb, bool lb, bool mb) override; + // マウスデータを VM に送信する MD 処理 + void MouseSendStart() override; + // ホストからの制御コマンド void Command(uint32 data) override; private: - // キーを離した (内部用) - void BreakKeyCommon(uint lunakey); + // キーボードの接続と取り外し + void MDConnect() override; + void MDDisconnect() override; + + // MD キーコードに変換 + uint KeyToMDKey(uint keystat) const override; + + // キーを1つ処理する + void KeyInput(uint keystat) override; - // キーイベントを空きスロットに登録 - void SetKeyEvent(uint code); + // キーイベントを起こせる空きスロットを計算して、イベントを開始 + void SendStart() override; - // キーボードコールバック - void KeyboardCallback(int arg); + // イベントを開始 + void Start(uint64 period); - // 共通キーコードから LUNA キーコードへの変換 - uint keycode2lunakey(uint); + // コールバック + void Callback(Event& ev); - // LUNA キーコードから LED 番号を取得。 + // 共通キーコードから LED 番号を取得。 // 0: かな // 1: CAPS - int LunaKey2LED(uint lunakey) const; + int Keycode2LED(uint keycode) const; + // LED 番号から共通キーコードを取得。 + uint LED2Keycode(int ledcode) const; + + // マウスサンプリング + void MouseSampling(); + void MouseOn(); + void MouseOff(); + + DECLARE_MONITOR_CALLBACK(MonitorUpdate); + + // マウスサンプリング + bool mouse_on {}; + + // ブザー + uint buzzer_msec {}; // コマンドで指定した発音時間 [msec] + uint buzzer_freq {}; // コマンドで指定した発音周波数 [Hz] + uint64 buzzer_end {}; // ブザーを鳴らし終わる仮想時刻 // イベント - Event key_event {}; - Event mouse_event[3] {}; + Event event { this }; - // キー送信中なら true - bool key_sending = false; + Monitor monitor { this }; - // マウス状態 - int mouse_x; // 前回送信から現在までの積算値 - int mouse_y; - bool mouse_r, prev_r; // 現在値と前回送信時の値 - bool mouse_l, prev_l; - bool mouse_m, prev_m; - - // マウスコールバック - void MouseSamplingCallback(int arg); - void MouseCallback(int arg); + SIODevice *sio {}; // 変換テーブル - static const uint keycode2lunakey_table[128]; - - // キー名テーブル - static const char * const keyname[128]; - - // キーリピート用のテーブル。 - // LUNA のキーボードはキーを押し続けてもキーボードはオートリピート - // しないが、wxWidgets はキーを押し続けると KEY_DOWN イベントが連続 - // して飛んでくる。そのためすでに押されているキーについて再び - // KEY_DOWN が来てもこれを本体に送らないようにする。 - uint8 reptable[128] {}; + static const uint keycode2lunakey_table[KC_max]; // LUNA キーコード static const uint NoKey = 0; @@ -117,6 +128,7 @@ class LunaKeyboard : public Keyboard static const uint LunaKey_minus = 0x2c; static const uint LunaKey_circum = 0x2d; static const uint LunaKey_backslash = 0x2e; + static const uint LunaKey_buzzer = 0x2f; static const uint LunaKey_Q = 0x32; static const uint LunaKey_W = 0x33;