1
0
Fork 0

Add support for processing the ICAO.ils.xml scenery data into ILS/LOC nav records.

This commit is contained in:
jmt 2009-08-30 17:13:53 +00:00 committed by Tim Moore
parent ce084ab1c5
commit 294a7b675a
2 changed files with 54 additions and 1 deletions

View file

@ -27,13 +27,19 @@
#include <istream>
#include <simgear/misc/sgstream.hxx>
#include <simgear/misc/sg_path.hxx>
#include <simgear/structure/exception.hxx>
#include <simgear/debug/logstream.hxx>
#include <simgear/sg_inlines.h>
#include <simgear/props/props.hxx>
#include <simgear/props/props_io.hxx>
#include <Navaids/navrecord.hxx>
#include <Navaids/navdb.hxx>
#include <Airports/runways.hxx>
#include <Airports/simple.hxx>
#include <Airports/xmlloader.hxx>
#include <Main/fg_props.hxx>
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

View file

@ -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) {}