--- nono/lib/object.h 2026/04/29 17:05:08 1.1.1.8 +++ nono/lib/object.h 2026/04/29 17:05:56 1.1.1.17 @@ -11,10 +11,27 @@ #pragma once #include "mystring.h" +#include "object_id.h" #include #include class Logger; +class Monitor; +class TextScreen; + +// オブジェクト ID +constexpr uint OBJ_BANKRAM(uint n) { return OBJ_BANKRAM0 + n; } +constexpr uint OBJ_DMAC_CH(uint n) { return OBJ_DMAC_CH0 + n; } +constexpr uint OBJ_ETHERNET(uint n) { return OBJ_ETHERNET0 + n; } +constexpr uint OBJ_FDD(uint n) { return OBJ_FDD0 + n; } +constexpr uint OBJ_GFPIC(uint n) { return OBJ_GFPIC0 + n; } +constexpr uint OBJ_HOSTCOM(uint n) { return OBJ_HOSTCOM0 + n; } +constexpr uint OBJ_HOSTNET(uint n) { return OBJ_HOSTNET0 + n; } +constexpr uint OBJ_M88200(uint n) { return OBJ_M88200_0 + n; } +constexpr uint OBJ_MPU_MEMDUMP(uint n) { return OBJ_MPU_MEMDUMP0 + n; } +constexpr uint OBJ_NEREID_BOARD(uint n) { return OBJ_NEREID_BOARD0 + n; } +constexpr uint OBJ_VIRTIO_BLOCK(uint n) { return OBJ_VIRTIO_BLOCK0 + n; } +constexpr uint OBJ_XP_MEMDUMP(uint n) { return OBJ_XP_MEMDUMP0 + n; } // ログ表示に指定するラムダ式の便利マクロ。 // fmt 内では __func__ が使えないので代わりに lam_func を使うこと。 @@ -23,31 +40,59 @@ class Logger; #define lstr(fmt...) \ [&, lam_func = __func__] { (void)lam_func; return string_format(fmt); } +// モニタコールバックを宣言するマクロ。 +// 強制力はないけどヘッダで宣言するところで使うこと。 +// コールバック関数の型が変わった時にコンパイルエラーで検出させるため。 +#define DECLARE_MONITOR_SCREEN(name) void name (Monitor *, TextScreen&) +#define DECLARE_MONITOR_BITMAP(name) void name (Monitor *, BitmapRGBX&) + // 基本オブジェクト class Object { public: - // 引数はオブジェクト名(ログ表示名)で、これはログに前置される。 + // 引数はオブジェクト ID。 + // ID と紐付けされたオブジェクト名は、ログ表示名で、ログに前置される。 // またコンストラクタ指定の場合はエイリアスにも登録する。 // これは表示名と指示名が同じことが多いための便宜措置。 // 指示名に表示名を使いたくない場合は ClearAlias() してから // AddAlias() すること。 - Object(const std::string& objname_); + explicit Object(uint objid_); virtual ~Object(); + // ID を返す + uint GetId() const { return objid; } + const char *GetIdStr() const; + + // ID を文字列で返す + static const char *GetIdStr(uint target_id); + // オブジェクト名(ログ表示名)を取得する const std::string& GetName() const { return objname; } // エイリアスリストを返す const std::vector& GetAliases() const { return log_aliases; } + // 指定の id を持つオブジェクトを返す。 + // 実体は gMainApp.GetObject() を呼んでいる。 + // 隣のデバイスを参照したい人が全員 mainapp.h を include しなくて済む + // ようにするための便宜上のもの。 + static Object *GetObject(uint target_id); + + // 指定の id を持つオブジェクトを型 T* にして返す版。 + template + static T *GetObject(uint target_id) { + auto dev = dynamic_cast(GetObject(target_id)); + assert(dev); + return dev; + } + protected: // オブジェクト名を newname に設定(更新)する。 // 通常、オブジェクト名はコンストラクタで指定するが、コンストラクタ時点 // ではまだ名前が決まらないような場合にだけ使う。 // こちらはエイリアスには関与しない。 - void SetName(const std::string& newname) { + virtual void SetName(const std::string& newname) { objname = newname; } @@ -64,6 +109,8 @@ class Object } private: + uint objid {}; + // オブジェクト名。 // こちらはログの先頭に追加される。 std::string objname {}; @@ -72,6 +119,12 @@ class Object // こちらはログ名を指定する時に使う。 std::vector log_aliases {}; + // オブジェクト ID からオブジェクト名(ログ名)変換テーブル + static const std::vector idname; + + // オブジェクト ID を文字列にしたもの + static const std::vector idtext; + public: // // ログ