--- nono/hd64180/hd647180asci.cpp 2026/04/29 17:05:47 1.1.1.1 +++ nono/hd64180/hd647180asci.cpp 2026/04/29 17:05:51 1.1.1.2 @@ -9,6 +9,7 @@ // #include "hd647180asci.h" +#include "event.h" #include "hostcom.h" #include "monitor.h" #include "mpu64180.h" @@ -73,6 +74,7 @@ bool HD647180ASCIDevice::Init() { xp = GetMPU64180Device(); + auto evman = GetEventManager(); for (auto& chan : channels) { uint n = chan.id; @@ -83,17 +85,13 @@ HD647180ASCIDevice::Init() scheduler->ConnectMessage(MessageID::HOSTCOM_RX(n + 1), this, ToMessageCallback(&HD647180ASCIDevice::RxMessage)); - txevent[n].dev = this; - txevent[n].func = ToEventCallback(&HD647180ASCIDevice::TxCallback); - txevent[n].code = n; - txevent[n].SetName(string_format("XP ASCI Ch%c TX", n + '0')); - scheduler->RegistEvent(txevent[n]); - - rxevent[n].dev = this; - rxevent[n].func = ToEventCallback(&HD647180ASCIDevice::RxCallback); - rxevent[n].code = n; - rxevent[n].SetName(string_format("XP ASCI Ch%c RX", n + '0')); - scheduler->RegistEvent(rxevent[n]); + txevent[n] = evman->Regist(this, n, + ToEventCallback(&HD647180ASCIDevice::TxCallback), + string_format("XP ASCI Ch%c TX", n + '0')); + + rxevent[n] = evman->Regist(this, n, + ToEventCallback(&HD647180ASCIDevice::RxCallback), + string_format("XP ASCI Ch%c RX", n + '0')); } return true; @@ -380,7 +378,7 @@ HD647180ASCIDevice::WriteTDR(uint n, uin // TSR が空なら即コピーして、送信イベント開始。 chan.tsr = chan.tdr; chan.tdr_empty = true; - if (txevent[n].IsRunning() == false) { + if (txevent[n]->IsRunning() == false) { scheduler->StartEvent(txevent[n]); } } else { @@ -689,16 +687,16 @@ HD647180ASCIDevice::ChangeBaudRate(uint bits++; } uint64 time = chan.bit12_ns * bits / 12; - txevent[n].time = time; - rxevent[n].time = time; + txevent[n]->time = time; + rxevent[n]->time = time; } } // 送信イベント。 void -HD647180ASCIDevice::TxCallback(Event& ev) +HD647180ASCIDevice::TxCallback(Event *ev) { - uint n = ev.code; + uint n = ev->code; Channel& chan = channels[n]; // 1文字分の時間が経過したので TSR の文字をホストに送信。 @@ -725,9 +723,9 @@ HD647180ASCIDevice::HostRxCallback(uint3 // XXX mpscc.cpp の同関数のコメント参照。 uint n = arg; - Event& ev = rxevent[n]; + const Event *ev = rxevent[n]; - if (ev.IsRunning() == false) { + if (ev->IsRunning() == false) { // スレッドを超えるためにメッセージを投げる。 scheduler->SendMessage(MessageID::HOSTCOM_RX(n + 1)); } @@ -739,19 +737,19 @@ void HD647180ASCIDevice::RxMessage(MessageID msgid, uint32 arg) { uint n = msgid - MessageID::HOSTCOM1_RX; - Event& ev = rxevent[n]; + Event *ev = rxevent[n]; // 受信ループが止まっていれば開始。 - if (ev.IsRunning() == false) { + if (ev->IsRunning() == false) { scheduler->StartEvent(ev); } } // 受信イベントコールバック。 void -HD647180ASCIDevice::RxCallback(Event& ev) +HD647180ASCIDevice::RxCallback(Event *ev) { - uint n = ev.code; + uint n = ev->code; int data; data = hostcom[n]->Rx();