1
0
Fork 0

Ground-net loading: collect which nets have problems

Log problem airports so we can fix them case-by-case.
This commit is contained in:
James Turner 2021-05-04 12:03:27 +01:00
parent cf75ba1fe9
commit 2614945b8f
3 changed files with 37 additions and 11 deletions

View file

@ -67,14 +67,19 @@ void FGGroundNetXMLLoader::endXML ()
for (it = _parkingPushbacks.begin(); it != _parkingPushbacks.end(); ++it) { for (it = _parkingPushbacks.begin(); it != _parkingPushbacks.end(); ++it) {
NodeIndexMap::const_iterator j = _indexMap.find(it->second); NodeIndexMap::const_iterator j = _indexMap.find(it->second);
if (j == _indexMap.end()) { if (j == _indexMap.end()) {
SG_LOG(SG_NAVAID, SG_DEV_WARN, "bad groundnet, no node for index:" << it->first); _hasErrors = true;
continue; SG_LOG(SG_NAVAID, SG_DEV_WARN, "bad groundnet, no node for index:" << it->first);
continue;
} }
it->first->setPushBackPoint(j->second); it->first->setPushBackPoint(j->second);
} }
if (!_unreferencedNodes.empty()) {
_hasErrors = true;
}
for (const FGTaxiNodeRef& node: _unreferencedNodes) { for (const FGTaxiNodeRef& node: _unreferencedNodes) {
SG_LOG(SG_NAVAID, SG_DEV_WARN, SG_LOG(SG_NAVAID, SG_DEV_WARN,
"unreferenced groundnet node: " << node->getIndex()); "unreferenced groundnet node: " << node->getIndex());
@ -132,6 +137,7 @@ void FGGroundNetXMLLoader::startParking(const XMLAttributes &atts)
SG_LOG(SG_NAVAID, SG_DEV_WARN, SG_LOG(SG_NAVAID, SG_DEV_WARN,
getPath() << ":" << getLine() << ": " << getPath() << ":" << getLine() << ": " <<
"invalid value for 'pushBackRoute': " << e.what()); "invalid value for 'pushBackRoute': " << e.what());
_hasErrors = true;
pushBackRoute = -2; pushBackRoute = -2;
} }
} }
@ -187,6 +193,7 @@ void FGGroundNetXMLLoader::startNode(const XMLAttributes &atts)
if (_indexMap.find(index) != _indexMap.end()) { if (_indexMap.find(index) != _indexMap.end()) {
SG_LOG(SG_NAVAID, SG_DEV_WARN, "duplicate ground-net index:" << index); SG_LOG(SG_NAVAID, SG_DEV_WARN, "duplicate ground-net index:" << index);
_hasErrors = true;
} }
SGGeod pos(SGGeod::fromDeg(processPosition(lon), processPosition(lat))); SGGeod pos(SGGeod::fromDeg(processPosition(lon), processPosition(lat)));
@ -214,6 +221,7 @@ void FGGroundNetXMLLoader::startArc(const XMLAttributes &atts)
IntPair e(begin, end); IntPair e(begin, end);
if (_arcSet.find(e) != _arcSet.end()) { if (_arcSet.find(e) != _arcSet.end()) {
SG_LOG(SG_NAVAID, SG_DEV_WARN, _groundNetwork->airport()->ident() << " ground-net: skipping duplicate edge:" << begin << "->" << end); SG_LOG(SG_NAVAID, SG_DEV_WARN, _groundNetwork->airport()->ident() << " ground-net: skipping duplicate edge:" << begin << "->" << end);
_hasErrors = true;
return; return;
} }
@ -222,6 +230,7 @@ void FGGroundNetXMLLoader::startArc(const XMLAttributes &atts)
it = _indexMap.find(begin); it = _indexMap.find(begin);
if (it == _indexMap.end()) { if (it == _indexMap.end()) {
SG_LOG(SG_NAVAID, SG_DEV_WARN, "ground-net: bad edge:" << begin << "->" << end << ", begin index unknown"); SG_LOG(SG_NAVAID, SG_DEV_WARN, "ground-net: bad edge:" << begin << "->" << end << ", begin index unknown");
_hasErrors = true;
return; return;
} else { } else {
_unreferencedNodes.erase(it->second); _unreferencedNodes.erase(it->second);
@ -231,6 +240,7 @@ void FGGroundNetXMLLoader::startArc(const XMLAttributes &atts)
it = _indexMap.find(end); it = _indexMap.find(end);
if (it == _indexMap.end()) { if (it == _indexMap.end()) {
SG_LOG(SG_NAVAID, SG_DEV_WARN, "ground-net: bad edge:" << begin << "->" << end << ", end index unknown"); SG_LOG(SG_NAVAID, SG_DEV_WARN, "ground-net: bad edge:" << begin << "->" << end << ", end index unknown");
_hasErrors = true;
return; return;
} else { } else {
_unreferencedNodes.erase(it->second); _unreferencedNodes.erase(it->second);
@ -289,9 +299,9 @@ void FGGroundNetXMLLoader::pi (const char * target, const char * data) {
} }
void FGGroundNetXMLLoader::warning (const char * message, int line, int column) { void FGGroundNetXMLLoader::warning (const char * message, int line, int column) {
SG_LOG(SG_IO, SG_WARN, "Warning: " << message << " (" << line << ',' << column << ')'); SG_LOG(SG_IO, SG_DEV_WARN, "Warning: " << message << " (" << line << ',' << column << ')');
} }
void FGGroundNetXMLLoader::error (const char * message, int line, int column) { void FGGroundNetXMLLoader::error (const char * message, int line, int column) {
SG_LOG(SG_IO, SG_ALERT, "Error: " << message << " (" << line << ',' << column << ')'); SG_LOG(SG_IO, SG_DEV_ALERT, "Error: " << message << " (" << line << ',' << column << ')');
} }

View file

@ -27,6 +27,11 @@ class FGGroundNetXMLLoader : public XMLVisitor {
public: public:
FGGroundNetXMLLoader(FGGroundNetwork* gn); FGGroundNetXMLLoader(FGGroundNetwork* gn);
bool hasErrors() const
{
return _hasErrors;
}
protected: protected:
virtual void startXML (); virtual void startXML ();
virtual void endXML (); virtual void endXML ();
@ -43,7 +48,10 @@ private:
void startArc(const XMLAttributes &atts); void startArc(const XMLAttributes &atts);
FGGroundNetwork* _groundNetwork; FGGroundNetwork* _groundNetwork;
// we set this flag if the ground-network has any problems
bool _hasErrors = false;
std::string value; std::string value;
// map from local (groundnet.xml) ids to parking instances // map from local (groundnet.xml) ids to parking instances

View file

@ -54,39 +54,47 @@ void XMLLoader::load(FGGroundNetwork* net)
SGTimeStamp t; SGTimeStamp t;
t.stamp(); t.stamp();
try { try {
flightgear::sentryThreadReportXMLErrors(false); flightgear::SentryXMLErrorSupression xs;
FGGroundNetXMLLoader visitor(net); FGGroundNetXMLLoader visitor(net);
readXML(path, visitor); readXML(path, visitor);
if (visitor.hasErrors()) {
flightgear::sentryReportException("Ground-net load error", path.utf8Str());
}
} catch (sg_exception& e) { } catch (sg_exception& e) {
SG_LOG(SG_NAVAID, SG_DEV_WARN, "parsing groundnet XML failed:" << e.getFormattedMessage()); SG_LOG(SG_NAVAID, SG_DEV_WARN, "parsing groundnet XML failed:" << e.getFormattedMessage());
} }
flightgear::sentryThreadReportXMLErrors(true);
SG_LOG(SG_NAVAID, SG_DEBUG, "parsing groundnet XML took " << t.elapsedMSec()); SG_LOG(SG_NAVAID, SG_DEBUG, "parsing groundnet XML took " << t.elapsedMSec());
} }
void XMLLoader::loadFromStream(FGGroundNetwork* net, std::istream& inData) void XMLLoader::loadFromStream(FGGroundNetwork* net, std::istream& inData)
{ {
try { try {
flightgear::sentryThreadReportXMLErrors(false); flightgear::SentryXMLErrorSupression xs;
FGGroundNetXMLLoader visitor(net); FGGroundNetXMLLoader visitor(net);
readXML(inData, visitor); readXML(inData, visitor);
if (visitor.hasErrors()) {
flightgear::sentryReportException("Ground-net load error", {});
}
} catch (sg_exception& e) { } catch (sg_exception& e) {
SG_LOG(SG_NAVAID, SG_DEV_WARN, "parsing groundnet XML failed:" << e.getFormattedMessage()); SG_LOG(SG_NAVAID, SG_DEV_WARN, "parsing groundnet XML failed:" << e.getFormattedMessage());
} }
flightgear::sentryThreadReportXMLErrors(true);
} }
void XMLLoader::loadFromPath(FGGroundNetwork* net, const SGPath& path) void XMLLoader::loadFromPath(FGGroundNetwork* net, const SGPath& path)
{ {
try { try {
flightgear::sentryThreadReportXMLErrors(false); flightgear::SentryXMLErrorSupression xs;
FGGroundNetXMLLoader visitor(net); FGGroundNetXMLLoader visitor(net);
readXML(path, visitor); readXML(path, visitor);
if (visitor.hasErrors()) {
flightgear::sentryReportException("Ground-net load error", path.utf8Str());
}
} catch (sg_exception& e) { } catch (sg_exception& e) {
SG_LOG(SG_NAVAID, SG_DEV_WARN, "parsing groundnet XML failed:" << e.getFormattedMessage()); SG_LOG(SG_NAVAID, SG_DEV_WARN, "parsing groundnet XML failed:" << e.getFormattedMessage());
} }
flightgear::sentryThreadReportXMLErrors(true);
} }
void XMLLoader::load(FGRunwayPreference* p) { void XMLLoader::load(FGRunwayPreference* p) {