--- nono/vm/event.h 2026/04/29 17:04:32 1.1.1.3 +++ nono/vm/event.h 2026/04/29 17:04:52 1.1.1.7 @@ -1,64 +1,67 @@ // // nono -// Copyright (C) 2018 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt // #pragma once #include "device.h" -#include #include // ユーザ定義リテラルを使ったサフィックス // ナノ秒 -static inline uint64 operator"" _nsec(unsigned long long ns) +static inline constexpr uint64 operator"" _nsec(unsigned long long ns) { return ns; } -static inline uint64 operator"" _nsec(long double ns) +static inline constexpr uint64 operator"" _nsec(long double ns) { return ns; } // マイクロ秒 -static inline uint64 operator"" _usec(unsigned long long us) +static inline constexpr uint64 operator"" _usec(unsigned long long us) { - return us * 1000; + return us * 1000_nsec; } -static inline uint64 operator"" _usec(long double us) +static inline constexpr uint64 operator"" _usec(long double us) { - return us * 1000; + return us * 1000_nsec; } // ミリ秒 -static inline uint64 operator"" _msec(unsigned long long ms) +static inline constexpr uint64 operator"" _msec(unsigned long long ms) { return ms * 1000_usec; } -static inline uint64 operator"" _msec(long double ms) +static inline constexpr uint64 operator"" _msec(long double ms) { return ms * 1000_usec; } // 秒 -static inline uint64 operator"" _sec(unsigned long long sec) +static inline constexpr uint64 operator"" _sec(unsigned long long sec) { return sec * 1000_msec; } -static inline uint64 operator"" _sec(long double sec) +static inline constexpr uint64 operator"" _sec(long double sec) { return sec * 1000_msec; } // コールバック関数の型 -typedef void (Device::*DeviceCallback_t)(int); +class Event; +using DeviceCallback_t = void (Device::*)(Event&); // イベント // // イベントは必要なデバイスごとに用意する。おそらく最初から個数が決まって // いることが多いはずなので、デバイスクラス内のメンバ変数(実体) として // 宣言し、デバイスのコンストラクタ等で初期化するという流れになるはず。 +// +// VM リセットによるイベントタイマーの停止処理は各デバイスの責任で行うこと。 class Event { public: @@ -70,22 +73,26 @@ class Event // このイベントタイマーを停止する void Stop(); + // このイベントが動作中なら true を返す + bool IsRunning() const { + return active; + } + // 以下はイベントを呼び出す側がセットする - // イベントを起こすまでの期間 [nsec] + // イベントを起こすまでの仮想時刻での相対時間 [nsec] // 例えば今から 1msec 後にイベントを起こしたい場合は 1000000 となる。 - // ここは MPU クロックサイクルではなく仮想時間で指定する。 - uint64 time = 0; + uint64 time {}; - Device *dev = NULL; // デバイス - DeviceCallback_t func = NULL; // コールバック関数 - int code = 0; // コールバック関数への引数 + Device *dev {}; // デバイス + DeviceCallback_t func {}; // コールバック関数 + int code {}; // コールバック関数への引数 std::string GetName() const { return name; } void SetName(const std::string& val); // スケジューラが内部で使う - bool active = false; // スケジューラにセットされていれば真 - uint64 cycle = 0; // イベントを起こす仮想サイクル + bool active {}; // スケジューラにセットされていれば真 + uint64 vtime {}; // イベントを起こす仮想時刻 private: // イベント名(表示用)