1
0
Fork 0

AIModelData: add error report context

Not complete yet, but add the ability to pass context in from the
AIBase to the loader thread. Also add error context to more places
in AI / scenario loading.
This commit is contained in:
James Turner 2021-02-24 14:47:01 +00:00
parent 2178de9d0d
commit 15dfc492dc
3 changed files with 26 additions and 4 deletions

View file

@ -32,11 +32,12 @@
#include <osg/Node> #include <osg/Node>
#include <osgDB/FileUtils> #include <osgDB/FileUtils>
#include <simgear/debug/ErrorReportingCallback.hxx>
#include <simgear/debug/logstream.hxx>
#include <simgear/misc/sg_path.hxx> #include <simgear/misc/sg_path.hxx>
#include <simgear/props/props.hxx>
#include <simgear/scene/model/modellib.hxx> #include <simgear/scene/model/modellib.hxx>
#include <simgear/scene/util/SGNodeMasks.hxx> #include <simgear/scene/util/SGNodeMasks.hxx>
#include <simgear/debug/logstream.hxx>
#include <simgear/props/props.hxx>
#include <Main/globals.hxx> #include <Main/globals.hxx>
#include <Main/fg_props.hxx> #include <Main/fg_props.hxx>
@ -68,6 +69,16 @@ public:
FGAIModelData* clone() const override { return new FGAIModelData(); } FGAIModelData* clone() const override { return new FGAIModelData(); }
ErrorContext getErrorContext() const override
{
return _errorContext;
}
void addErrorContext(const std::string& key, std::string& value)
{
_errorContext[key] = value;
}
/** osg callback, thread-safe */ /** osg callback, thread-safe */
void modelLoaded(const std::string& path, SGPropertyNode *prop, osg::Node *n) void modelLoaded(const std::string& path, SGPropertyNode *prop, osg::Node *n)
{ {
@ -120,6 +131,8 @@ private:
bool _interiorLoaded = false; bool _interiorLoaded = false;
float _radius = -1.0; float _radius = -1.0;
SGPropertyNode* _root; SGPropertyNode* _root;
ErrorContext _errorContext;
}; };
FGAIBase::FGAIBase(object_type ot, bool enableHot) : FGAIBase::FGAIBase(object_type ot, bool enableHot) :
@ -307,6 +320,7 @@ void FGAIBase::update(double dt) {
const string& fxpath = _modeldata->get_sound_path(); const string& fxpath = _modeldata->get_sound_path();
if (fxpath != "") if (fxpath != "")
{ {
simgear::ErrorReportContext ec("ai-model", _name);
props->setStringValue("sim/sound/path", fxpath.c_str()); props->setStringValue("sim/sound/path", fxpath.c_str());
// Remove any existing sound FX (e.g. from another model) // Remove any existing sound FX (e.g. from another model)
@ -603,6 +617,7 @@ bool FGAIBase::init(ModelSearchOrder searchOrder)
props->addChild("type")->setStringValue("AI"); props->addChild("type")->setStringValue("AI");
_modeldata = new FGAIModelData(props); _modeldata = new FGAIModelData(props);
_modeldata->addErrorContext("ai", _name);
vector<string> model_list = resolveModelPath(searchOrder); vector<string> model_list = resolveModelPath(searchOrder);
_model= SGModelLib::loadPagedModel(model_list, props, _modeldata); _model= SGModelLib::loadPagedModel(model_list, props, _modeldata);

View file

@ -58,6 +58,7 @@ public:
Scenario(FGAIManager* man, const std::string& nm, SGPropertyNode* scenarios) : Scenario(FGAIManager* man, const std::string& nm, SGPropertyNode* scenarios) :
_internalName(nm) _internalName(nm)
{ {
simgear::ErrorReportContext ec("scenario-name", _internalName);
for (auto scEntry : scenarios->getChildren("entry")) { for (auto scEntry : scenarios->getChildren("entry")) {
FGAIBasePtr ai = man->addObject(scEntry); FGAIBasePtr ai = man->addObject(scEntry);
if (ai) { if (ai) {
@ -220,7 +221,7 @@ SGPropertyNode_ptr FGAIManager::registerScenarioFile(SGPropertyNode_ptr root, co
auto scenariosNode = root->getNode("/sim/ai/scenarios", true); auto scenariosNode = root->getNode("/sim/ai/scenarios", true);
SGPropertyNode_ptr sNode; SGPropertyNode_ptr sNode;
simgear::ErrorReportContext ectx("scenario", xmlPath.utf8Str()); simgear::ErrorReportContext ectx("scenario-path", xmlPath.utf8Str());
// don't report XML errors while loading scenarios, to Sentry // don't report XML errors while loading scenarios, to Sentry
flightgear::SentryXMLErrorSupression xml; flightgear::SentryXMLErrorSupression xml;
@ -601,7 +602,7 @@ FGAIBasePtr FGAIManager::getObjectFromProperty(const SGPropertyNode* aProp) cons
bool bool
FGAIManager::loadScenario( const string &id ) FGAIManager::loadScenario( const string &id )
{ {
simgear::ErrorReportContext("scenario", id); simgear::ErrorReportContext ec("scenario", id);
SGPropertyNode_ptr file = loadScenarioFile(id); SGPropertyNode_ptr file = loadScenarioFile(id);
if (!file) { if (!file) {
return false; return false;
@ -665,6 +666,7 @@ FGAIManager::loadScenarioFile(const std::string& scenarioName)
for (auto n : s->getChildren("scenario")) { for (auto n : s->getChildren("scenario")) {
if (n->getStringValue("id") == scenarioName) { if (n->getStringValue("id") == scenarioName) {
SGPath path{n->getStringValue("path")}; SGPath path{n->getStringValue("path")};
simgear::ErrorReportContext ec("scenario-path", path.utf8Str());
try { try {
SGPropertyNode_ptr root = new SGPropertyNode; SGPropertyNode_ptr root = new SGPropertyNode;
readProperties(path, root); readProperties(path, root);

View file

@ -91,6 +91,11 @@ public:
virtual FGNasalModelDataProxy* clone() const { return new FGNasalModelDataProxy(_root); } virtual FGNasalModelDataProxy* clone() const { return new FGNasalModelDataProxy(_root); }
ErrorContext getErrorContext() const override
{
return {}; // return nothing for now, not yet clear if this proxy needs it
}
protected: protected:
SGPropertyNode_ptr _root; SGPropertyNode_ptr _root;
FGNasalModelDataRef _data; FGNasalModelDataRef _data;