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) {
NodeIndexMap::const_iterator j = _indexMap.find(it->second);
if (j == _indexMap.end()) {
SG_LOG(SG_NAVAID, SG_DEV_WARN, "bad groundnet, no node for index:" << it->first);
continue;
_hasErrors = true;
SG_LOG(SG_NAVAID, SG_DEV_WARN, "bad groundnet, no node for index:" << it->first);
continue;
}
it->first->setPushBackPoint(j->second);
}
if (!_unreferencedNodes.empty()) {
_hasErrors = true;
}
for (const FGTaxiNodeRef& node: _unreferencedNodes) {
SG_LOG(SG_NAVAID, SG_DEV_WARN,
"unreferenced groundnet node: " << node->getIndex());
@ -132,6 +137,7 @@ void FGGroundNetXMLLoader::startParking(const XMLAttributes &atts)
SG_LOG(SG_NAVAID, SG_DEV_WARN,
getPath() << ":" << getLine() << ": " <<
"invalid value for 'pushBackRoute': " << e.what());
_hasErrors = true;
pushBackRoute = -2;
}
}
@ -187,6 +193,7 @@ void FGGroundNetXMLLoader::startNode(const XMLAttributes &atts)
if (_indexMap.find(index) != _indexMap.end()) {
SG_LOG(SG_NAVAID, SG_DEV_WARN, "duplicate ground-net index:" << index);
_hasErrors = true;
}
SGGeod pos(SGGeod::fromDeg(processPosition(lon), processPosition(lat)));
@ -214,6 +221,7 @@ void FGGroundNetXMLLoader::startArc(const XMLAttributes &atts)
IntPair e(begin, end);
if (_arcSet.find(e) != _arcSet.end()) {
SG_LOG(SG_NAVAID, SG_DEV_WARN, _groundNetwork->airport()->ident() << " ground-net: skipping duplicate edge:" << begin << "->" << end);
_hasErrors = true;
return;
}
@ -222,6 +230,7 @@ void FGGroundNetXMLLoader::startArc(const XMLAttributes &atts)
it = _indexMap.find(begin);
if (it == _indexMap.end()) {
SG_LOG(SG_NAVAID, SG_DEV_WARN, "ground-net: bad edge:" << begin << "->" << end << ", begin index unknown");
_hasErrors = true;
return;
} else {
_unreferencedNodes.erase(it->second);
@ -231,6 +240,7 @@ void FGGroundNetXMLLoader::startArc(const XMLAttributes &atts)
it = _indexMap.find(end);
if (it == _indexMap.end()) {
SG_LOG(SG_NAVAID, SG_DEV_WARN, "ground-net: bad edge:" << begin << "->" << end << ", end index unknown");
_hasErrors = true;
return;
} else {
_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) {
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) {
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:
FGGroundNetXMLLoader(FGGroundNetwork* gn);
bool hasErrors() const
{
return _hasErrors;
}
protected:
virtual void startXML ();
virtual void endXML ();
@ -43,7 +48,10 @@ private:
void startArc(const XMLAttributes &atts);
FGGroundNetwork* _groundNetwork;
// we set this flag if the ground-network has any problems
bool _hasErrors = false;
std::string value;
// map from local (groundnet.xml) ids to parking instances

View file

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