From 294a7b675a54b4f8dfe303c271070054be4e00df Mon Sep 17 00:00:00 2001 From: jmt Date: Sun, 30 Aug 2009 17:13:53 +0000 Subject: [PATCH] Add support for processing the ICAO.ils.xml scenery data into ILS/LOC nav records. --- src/Navaids/navrecord.cxx | 51 ++++++++++++++++++++++++++++++++++++++- src/Navaids/navrecord.hxx | 4 +++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/src/Navaids/navrecord.cxx b/src/Navaids/navrecord.cxx index 2689f3d3b..61b5725a7 100644 --- a/src/Navaids/navrecord.cxx +++ b/src/Navaids/navrecord.cxx @@ -27,13 +27,19 @@ #include #include +#include #include #include #include +#include +#include #include #include #include +#include +#include + #include
FGNavRecord::FGNavRecord(Type aTy, const std::string& aIdent, @@ -84,7 +90,12 @@ void FGNavRecord::initAirportRelation() return; // not airport-located } - mRunway = getRunwayFromName(_name); + mRunway = getRunwayFromName(_name); + + if (type() != GS) { + readAirportSceneryData(); + } + // fudge elevation to the runway elevation if it's not specified if (fabs(elevation()) < 0.01) { mPosition.setElevationFt(mRunway->elevation()); @@ -106,6 +117,44 @@ void FGNavRecord::initAirportRelation() } } +void FGNavRecord::readAirportSceneryData() +{ + // allow users to disable the scenery data in the short-term + // longer term, this option can probably disappear + if (!fgGetBool("/sim/use-scenery-airport-data")) { + return; + } + + SGPath path; + SGPropertyNode_ptr rootNode = new SGPropertyNode; + if (!XMLLoader::findAirportData(mRunway->airport()->ident(), "ils", path)) { + return; + } + + readProperties(path.str(), rootNode); + SGPropertyNode* runwayNode, *ilsNode; + for (int i=0; (runwayNode = rootNode->getChild("runway", i)) != NULL; ++i) { + for (int j=0; (ilsNode = runwayNode->getChild("ils", j)) != NULL; ++j) { + if (ilsNode->getStringValue("nav-id") == ident()) { + processSceneryILS(ilsNode); + return; + } + } // of ILS iteration + } // of runway iteration +} + +void FGNavRecord::processSceneryILS(SGPropertyNode* aILSNode) +{ + assert(aILSNode->getStringValue("rwy") == mRunway->ident()); + double hdgDeg = aILSNode->getDoubleValue("hdg-deg"), + lon = aILSNode->getDoubleValue("lon"), + lat = aILSNode->getDoubleValue("lat"), + elevM = aILSNode->getDoubleValue("elev-m"); + + mPosition = SGGeod::fromDegM(lon, lat, elevM); + multiuse = hdgDeg; +} + void FGNavRecord::alignLocaliserWithRunway(double aThreshold) { // find the distance from the threshold to the localizer diff --git a/src/Navaids/navrecord.hxx b/src/Navaids/navrecord.hxx index f686d1c15..afb60083b 100644 --- a/src/Navaids/navrecord.hxx +++ b/src/Navaids/navrecord.hxx @@ -43,6 +43,7 @@ typedef FGPositioned::Type fg_nav_types; // forward decls class FGRunway; +class SGPropertyNode; class FGNavRecord : public FGPositioned { @@ -65,6 +66,9 @@ class FGNavRecord : public FGPositioned void initAirportRelation(); void alignLocaliserWithRunway(double aThreshold); + + void readAirportSceneryData(); + void processSceneryILS(SGPropertyNode* aILSNode); public: inline ~FGNavRecord(void) {} -- 2.39.5