--- nono/lib/object.cpp 2026/04/29 17:04:28 1.1 +++ nono/lib/object.cpp 2026/04/29 17:05:56 1.1.1.12 @@ -1,95 +1,108 @@ // // nono -// Copyright (C) 2018 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt // +// +// 基本オブジェクト +// +// オブジェクトはログ出力機能 (とそのための自身のオブジェクト名) を持つ。 + +#include "nono.h" #include "object.h" #include "logger.h" -#include "mpu.h" -#include "scheduler.h" -#include "textscreen.h" - -// 全オブジェクトのリスト -std::vector gObjects; +#include "mainapp.h" // コンストラクタ -Object::Object() +Object::Object(uint objid_) { - logname = "?"; - devname = "?"; + objid = objid_; + assertmsg(objid < idname.size(), + "objid=%u, size=%zu", objid, idname.size()); + + // オブジェクト名(ログ表示名)は ID から引く。 + // (コンストラクタでは SetName() のオーバーライド版は呼ばれないことに注意) + SetName(idname[objid]); + + // コンストラクタで指定した場合はエイリアスにも登録しておく。 + // ただし OBJ_NONE ならログを出すことも想定していないはずなので + // エイリアスも追加しない。 + if (objid != OBJ_NONE) { + AddAlias(GetName()); + } // 自分自身をリストに繋ぐ - gObjects.push_back(this); + gMainApp.RegistObject(this); } // デストラクタ Object::~Object() { + // 自分自身をリストから削除する + gMainApp.UnregistObject(this); +} + +// ログレベルを設定する。 +void +Object::SetLogLevel(int loglevel_) +{ + loglevel = loglevel_; } // メッセージ表示 // 常に表示 (あらかじめ loglevel の評価をした後で呼び出す用) void -Object::putmsg(const char *fmt, ...) +Object::putmsgn(const char *fmt, ...) const { + char buf[1024]; va_list ap; + int len; + + // 名前だけ生表示されても分かりづらいので括弧でもつけておく + len = snprintf(buf, sizeof(buf), "(%s) ", GetName().c_str()); va_start(ap, fmt); - vputmsg(fmt, ap); + vsnprintf(buf + len, sizeof(buf) - len, fmt, ap); va_end(ap); + + WriteLog(buf); } -// メッセージ出力 (va_list) -// 常に表示 (あらかじめ loglevel の評価をした後で呼び出す用) +// ログ表示 (継承側で用意すること) void -Object::vputmsg(const char *fmt, va_list ap) +Object::putlogn(const char *fmt, ...) const { - int len; - - // デバイス名だけ生表示されても分かりづらいので括弧でもつけておく - len = snprintf(lastbuf, sizeof(lastbuf), "(%s) ", devname); - vsnprintf(lastbuf + len, sizeof(lastbuf) - len, fmt, ap); - gLogger->Write(lastbuf); + PANIC("Object::putlogn called"); } -// ログ出力 (可変引数) -// 常に表示 (あらかじめ loglevel の評価をした後で呼び出す用) +// ロガーに出力する共通部分 void -Object::putlog(const char *fmt, ...) +Object::WriteLog(const char *buf) const { - va_list ap; - - va_start(ap, fmt); - vputlog(fmt, ap); - va_end(ap); + logger->WriteLog(buf); } -// ログ出力 (va_list) -// 常に表示 (あらかじめ loglevel の評価をした後で呼び出す用) -void -Object::vputlog(const char *fmt, va_list ap) +// このオブジェクトの ID を文字列にして返す +const char * +Object::GetIdStr() const { - uint64 vt; - int len = 0; - - vt = gScheduler->GetVirtTime(); - len += snprintf(lastbuf + len, sizeof(lastbuf) - len, "%4d.%03d'%03d'%03d ", - (int)(vt / 1000 / 1000 / 1000), - (int)((vt / 1000 / 1000) % 1000), - (int)((vt / 1000) % 1000), - (int)(vt % 1000)); - - len += snprintf(lastbuf + len, sizeof(lastbuf) - len, "%08x %s ", - gMPU->GetPPC(), devname); - vsnprintf(lastbuf + len, sizeof(lastbuf) - len, fmt, ap); + return GetIdStr(GetId()); +} - gLogger->Write(lastbuf); +// 指定のオブジェクト ID を文字列にして返す +/*static*/ const char * +Object::GetIdStr(uint target_id) +{ + if (target_id < idname.size()) { + return idname[target_id]; + } + return "unknownID?"; } -// モニタースクリーンを更新する。 -bool -Object::MonitorUpdate() +// 指定のオブジェクト ID を持つオブジェクトを返す。 +/*static*/ Object * +Object::GetObject(uint target_id) { - // モニタースクリーンなし - return false; + return gMainApp.GetObject(target_id); }