--- nono/lib/object.h 2026/04/29 17:04:54 1.1.1.7 +++ nono/lib/object.h 2026/04/29 17:05:15 1.1.1.9 @@ -4,13 +4,25 @@ // Licensed under nono-license.txt // +// +// 基本オブジェクト +// + #pragma once #include "mystring.h" -#include "textscreen.h" +#include "object_id.h" #include #include +class Logger; + +// オブジェクト ID +static constexpr int OBJ_FDD(int n) { return OBJ_FDD0 + n; } +static constexpr int OBJ_M88200(int n) { return OBJ_M88200_0 + n; } +static constexpr int OBJ_MPU_MEMDUMP(int n) { return OBJ_MPU_MEMDUMP0 + n; } +static constexpr int OBJ_XP_MEMDUMP(int n) { return OBJ_XP_MEMDUMP0 + n; } + // ログ表示に指定するラムダ式の便利マクロ。 // fmt 内では __func__ が使えないので代わりに lam_func を使うこと。 // lstr("%s value=%d", lam_func, value) のようになる。 @@ -18,29 +30,47 @@ #define lstr(fmt...) \ [&, lam_func = __func__] { (void)lam_func; return string_format(fmt); } -// // 基本オブジェクト -// -// ログ出力機能を持つ。 -// class Object { public: - // 引数はオブジェクト名(ログ表示名)で、これはログに前置される。 + // 引数はオブジェクト ID。 + // ID と紐付けされたオブジェクト名は、ログ表示名で、ログに前置される。 // またコンストラクタ指定の場合はエイリアスにも登録する。 // これは表示名と指示名が同じことが多いための便宜措置。 // 指示名に表示名を使いたくない場合は ClearAlias() してから // AddAlias() すること。 - Object(const std::string& objname_); + Object(int objid_); virtual ~Object(); + // ID を返す + int GetId() const { return objid; } + const char *GetIdStr() const; + + // ID を文字列で返す + static const char *GetIdStr(int target_id); + // オブジェクト名(ログ表示名)を取得する const std::string& GetName() const { return objname; } // エイリアスリストを返す const std::vector& GetAliases() const { return log_aliases; } + // 指定の id を持つオブジェクトを返す。 + // 実体は gMainApp.GetObjects() を呼んでいる。 + // 隣のデバイスを参照したい人が全員 mainapp.h を include しなくて済む + // ようにするための便宜上のもの。 + static Object *GetObject(int target_id); + + // 指定の id を持つオブジェクトを型 T* にして返す版。 + template + static T *GetObject(int target_id) { + auto dev = dynamic_cast(GetObject(target_id)); + assert(dev); + return dev; + } + protected: // オブジェクト名を newname に設定(更新)する。 // 通常、オブジェクト名はコンストラクタで指定するが、コンストラクタ時点 @@ -63,6 +93,8 @@ class Object } private: + int objid {}; + // オブジェクト名。 // こちらはログの先頭に追加される。 std::string objname {}; @@ -71,17 +103,19 @@ class Object // こちらはログ名を指定する時に使う。 std::vector log_aliases {}; + // オブジェクト ID からオブジェクト名(ログ名)変換テーブル + static const std::vector idname; + + // オブジェクト ID を文字列にしたもの + static const std::vector idtext; + public: // // ログ // - // ログレベル - // 0: 未実装動作などのデバッグログではない情報 - // 1: 大雑把なデバッグログ - // 2: 詳細なデバッグログ - // 3: うるさいデバッグログ - int loglevel {}; + // ログレベルを設定する + virtual void SetLogLevel(int loglevel_); // メッセージ出力 // メッセージは仮想時刻も現在の PC も表示しない。Init() など VM 実行前や @@ -108,7 +142,7 @@ class Object // ログは仮想時刻と現在の PC も表示する。VM 実行中は基本的にこれで表示。 // レベル指定なし、フォーマット版。(レベルを評価した後で使う) - void putlogn(const char *fmt, ...) const __printflike(2, 3); + virtual void putlogn(const char *fmt, ...) const __printflike(2, 3); // レベル指定あり、フォーマット版。 #define putlog(lv, fmt...) do { \ @@ -123,7 +157,18 @@ class Object putlogn("%s", msgf().c_str()); } } -}; -// 全オブジェクトのリスト -extern std::vector gObjects; + // オブジェクト登録時に代入される + Logger *logger {}; + + // ログレベルの目安 + // 0: 未実装動作などのデバッグログではない情報 + // 1: 大雑把なデバッグログ + // 2: 詳細なデバッグログ + // 3: うるさいデバッグログ + int loglevel {}; + + protected: + // ログ直接出力 + void WriteLog(const char *) const; +};