--- nono/vm/lunakbd.h 2026/04/29 17:04:55 1.1.1.8 +++ nono/vm/lunakbd.h 2026/04/29 17:05:09 1.1.1.11 @@ -4,11 +4,15 @@ // Licensed under nono-license.txt // +// +// LUNA のキーボードとマウス +// + #pragma once #include "keyboard.h" +#include "event.h" #include "monitor.h" -#include "scheduler.h" class LunaKeyboard : public Keyboard { @@ -17,21 +21,25 @@ class LunaKeyboard : public Keyboard LunaKeyboard(); virtual ~LunaKeyboard() override; - bool PowerOn() override; - void ResetHard() override; - // シフト状態なら true を返す bool IsShift() const 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 MDConnect() override; + void MDDisconnect() override; + // MD キーコードに変換 - uint KeyToMDKey(uint keycode) const override; + uint KeyToMDKey(uint keystat) const override; // キーを1つ処理する void KeyInput(uint keystat) override; @@ -39,38 +47,42 @@ class LunaKeyboard : public Keyboard // キーイベントを起こせる空きスロットを計算して、イベントを開始 void SendStart() override; - // キーボードコールバック - void KeyboardCallback(Event& ev); + // イベントを開始 + void Start(uint64 period); + + // コールバック + void Callback(Event& ev); // 共通キーコードから LED 番号を取得。 // 0: かな // 1: CAPS int Keycode2LED(uint keycode) const; + // LED 番号から共通キーコードを取得。 + uint LED2Keycode(int ledcode) const; + + // マウスサンプリング + void MouseSampling(); + void MouseOn(); + void MouseOff(); DECLARE_MONITOR_CALLBACK(MonitorUpdate); - // イベント - Event key_event { this }; - Event mouse_event[3] {}; + // マウスサンプリング + bool mouse_on {}; - // マウス状態 - int mouse_x {}; // 前回送信から現在までの積算値 - int mouse_y {}; - bool mouse_r {}; // 現在値 - bool mouse_l {}; - bool mouse_m {}; - bool prev_r {}; // 前回送信時の値 - bool prev_l {}; - bool prev_m {}; - - // マウスコールバック - void MouseSamplingCallback(Event& ev); - void MouseCallback(Event& ev); + // ブザー + bool buzzer_on {}; // ブザー発音中なら true + uint buzzer_msec {}; // コマンドで指定した発音時間 [msec] + uint buzzer_freq {}; // コマンドで指定した発音周波数 [Hz] + uint64 buzzer_end {}; // ブザーを鳴らし終わる仮想時刻 + + // イベント + Event event { this }; Monitor monitor { this }; // 変換テーブル - static const uint keycode2lunakey_table[0x80]; + static const uint keycode2lunakey_table[KC_max]; // LUNA キーコード static const uint NoKey = 0;