--- nono/vm/lunakbd.cpp 2026/04/29 17:05:06 1.1.1.12 +++ nono/vm/lunakbd.cpp 2026/04/29 17:05:10 1.1.1.13 @@ -4,13 +4,16 @@ // Licensed under nono-license.txt // -// キーボードとマウス // +// LUNA のキーボードとマウス +// + // キーボード/マウスからシリアルポートへの入力は、1バイトの送信自体に約1msec // (9600bps、スタートビット1、ストップビット1) で送信後に 1msec 空けるそう // なので、ここでは単純に 2msec を1スロットとする。 #include "lunakbd.h" +#include "scheduler.h" #include "sio.h" #include "uimessage.h" @@ -19,10 +22,10 @@ LunaKeyboard::LunaKeyboard() { led.resize(2); - event.func = (DeviceCallback_t)&LunaKeyboard::Callback; - event.SetName("Keyboard/Mouse"); + event.func = ToEventCallback(&LunaKeyboard::Callback); + event.Regist("Keyboard/Mouse"); - monitor.func = (MonitorCallback_t)&LunaKeyboard::MonitorUpdate; + monitor.func = ToMonitorCallback(&LunaKeyboard::MonitorUpdate); monitor.SetSize(40, 4); monitor.Regist(ID_MONITOR_KEYBOARD); } @@ -32,12 +35,12 @@ LunaKeyboard::~LunaKeyboard() { } -// 電源オン -bool -LunaKeyboard::PowerOn() +// キーボード接続時の MD 固有処理 +void +LunaKeyboard::MDConnect() { // XXX リセットはマウスには届かないような気がするので - // 電源オンで初期化。 + // 接続時(電源オン)で初期化。 mouse_x = 0; mouse_y = 0; mouse_r = false; @@ -47,23 +50,25 @@ LunaKeyboard::PowerOn() prev_l = false; prev_m = false; - // ブザー停止 + // ブザー停止状態で初期化すると定義されている buzzer_on = false; - return true; + // デフォルトでマウス有効 + MouseOn(); } -// リセット +// キーボード取り外し時の MD 固有処理 void -LunaKeyboard::ResetHard() +LunaKeyboard::MDDisconnect() { - inherited::ResetHard(); + // 動作中のタイマーは停止 + gScheduler->StopEvent(event); - // 動作中のタイマーは一旦とめる - event.Stop(); + // 電源が切れるのでブザー停止 + buzzer_on = false; - // マウスサンプリングは電源オン時から有効 - MouseOn(); + // マウスサンプリングは停止 + MouseOff(); } // モニター @@ -244,12 +249,12 @@ LunaKeyboard::SendStart() void LunaKeyboard::Start(uint64 period) { - uint64 now = gMPU->GetVirtTime(); + uint64 now = gScheduler->GetVirtTime(); uint64 target = ((now / period) + 1) * period; // XXX メンバの event.vtime 参照してるけどどうするかね if (event.IsRunning() == false || target < event.vtime) { event.time = target - now; - event.Start(); + gScheduler->RestartEvent(event); } } @@ -259,7 +264,7 @@ LunaKeyboard::Start(uint64 period) void LunaKeyboard::Callback(Event& ev) { - uint64 now = gMPU->GetVirtTime(); + uint64 now = gScheduler->GetVirtTime(); uint mdkey; // マウスサンプリングオンなら 20msec ごとにサンプリングを行う。 @@ -267,9 +272,8 @@ LunaKeyboard::Callback(Event& ev) MouseSampling(); } + // キューから取り出す。ここで取り出せるのは MDKey またはマウスデータ if (sendqueue.Dequeue(&mdkey)) { - // キューから取り出す。ここで取り出せるのは MDKey - // またはマウスデータ // 送信 gSIO->Rx(1, mdkey); } @@ -395,8 +399,8 @@ LunaKeyboard::Command(uint32 data) UIMessage::Post(UIMessage::KEYBOARD); if (loglevel >= 1) { const auto name = GetKeyName(LED2Keycode(code)); - putlogn("Command LED $%x(%s) %s", - code, name.c_str(), (on ? "ON" : "OFF")); + putlogn("Command $%02x LED $%x(%s) %s", + data, code, name.c_str(), (on ? "ON" : "OFF")); } break; } @@ -413,9 +417,10 @@ LunaKeyboard::Command(uint32 data) uint f = data & 7; buzzer_msec = buzzer_msec_table[t]; buzzer_freq = buzzer_freq_table[f]; - putlog(1, "Command Buzzer %dmsec, %dHz", buzzer_msec, buzzer_freq); + putlog(1, "Command $%02x Buzzer %dmsec, %dHz", + data, buzzer_msec, buzzer_freq); - uint64 now = gMPU->GetVirtTime(); + uint64 now = gScheduler->GetVirtTime(); buzzer_end = now + buzzer_msec * 1_msec; buzzer_on = true; Acquire(); @@ -428,7 +433,7 @@ LunaKeyboard::Command(uint32 data) // +---+---+---+---+---+---+---+---+ // | 0 0 1 | x x x x x | // +---+---+---+---+---+---+---+---+ - putlog(1, "Command Mouse Sampling Off"); + putlog(1, "Command $%02x Mouse Sampling Off", data); MouseOff(); break; @@ -437,12 +442,12 @@ LunaKeyboard::Command(uint32 data) // +---+---+---+---+---+---+---+---+ // | 0 1 1 | x x x x x | // +---+---+---+---+---+---+---+---+ - putlog(1, "Command Mouse Sampling On"); + putlog(1, "Command $%02x Mouse Sampling On", data); MouseOn(); break; default: - putlog(1, "未定義コマンド受信 $%02x", data); + putlog(1, "Command $%02x Undefined", data); break; } }