Add support for processing the ICAO.ils.xml scenery data into ILS/LOC nav records.
This commit is contained in:
parent
ce084ab1c5
commit
294a7b675a
2 changed files with 54 additions and 1 deletions
|
@ -27,13 +27,19 @@
|
||||||
#include <istream>
|
#include <istream>
|
||||||
|
|
||||||
#include <simgear/misc/sgstream.hxx>
|
#include <simgear/misc/sgstream.hxx>
|
||||||
|
#include <simgear/misc/sg_path.hxx>
|
||||||
#include <simgear/structure/exception.hxx>
|
#include <simgear/structure/exception.hxx>
|
||||||
#include <simgear/debug/logstream.hxx>
|
#include <simgear/debug/logstream.hxx>
|
||||||
#include <simgear/sg_inlines.h>
|
#include <simgear/sg_inlines.h>
|
||||||
|
#include <simgear/props/props.hxx>
|
||||||
|
#include <simgear/props/props_io.hxx>
|
||||||
|
|
||||||
#include <Navaids/navrecord.hxx>
|
#include <Navaids/navrecord.hxx>
|
||||||
#include <Navaids/navdb.hxx>
|
#include <Navaids/navdb.hxx>
|
||||||
#include <Airports/runways.hxx>
|
#include <Airports/runways.hxx>
|
||||||
|
#include <Airports/simple.hxx>
|
||||||
|
#include <Airports/xmlloader.hxx>
|
||||||
|
|
||||||
#include <Main/fg_props.hxx>
|
#include <Main/fg_props.hxx>
|
||||||
|
|
||||||
FGNavRecord::FGNavRecord(Type aTy, const std::string& aIdent,
|
FGNavRecord::FGNavRecord(Type aTy, const std::string& aIdent,
|
||||||
|
@ -84,7 +90,12 @@ void FGNavRecord::initAirportRelation()
|
||||||
return; // not airport-located
|
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
|
// fudge elevation to the runway elevation if it's not specified
|
||||||
if (fabs(elevation()) < 0.01) {
|
if (fabs(elevation()) < 0.01) {
|
||||||
mPosition.setElevationFt(mRunway->elevation());
|
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)
|
void FGNavRecord::alignLocaliserWithRunway(double aThreshold)
|
||||||
{
|
{
|
||||||
// find the distance from the threshold to the localizer
|
// find the distance from the threshold to the localizer
|
||||||
|
|
|
@ -43,6 +43,7 @@ typedef FGPositioned::Type fg_nav_types;
|
||||||
|
|
||||||
// forward decls
|
// forward decls
|
||||||
class FGRunway;
|
class FGRunway;
|
||||||
|
class SGPropertyNode;
|
||||||
|
|
||||||
class FGNavRecord : public FGPositioned
|
class FGNavRecord : public FGPositioned
|
||||||
{
|
{
|
||||||
|
@ -65,6 +66,9 @@ class FGNavRecord : public FGPositioned
|
||||||
void initAirportRelation();
|
void initAirportRelation();
|
||||||
|
|
||||||
void alignLocaliserWithRunway(double aThreshold);
|
void alignLocaliserWithRunway(double aThreshold);
|
||||||
|
|
||||||
|
void readAirportSceneryData();
|
||||||
|
void processSceneryILS(SGPropertyNode* aILSNode);
|
||||||
public:
|
public:
|
||||||
inline ~FGNavRecord(void) {}
|
inline ~FGNavRecord(void) {}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue