X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FNavaids%2Fnavdb.cxx;h=99453022a826c45185b2b48a032939adffd3ca1e;hb=c3c0f68f76c031adcf610fdd3dbeee59bc33d553;hp=b94f1a3f8475f1d34fb0c109464544fcd5ecc6f5;hpb=458edb933903836ac10b2acd9ef68e06e2a04470;p=flightgear.git diff --git a/src/Navaids/navdb.cxx b/src/Navaids/navdb.cxx index b94f1a3f8..99453022a 100644 --- a/src/Navaids/navdb.cxx +++ b/src/Navaids/navdb.cxx @@ -40,7 +40,7 @@ #include "navlist.hxx" #include
#include -#include +#include #include #include #include
@@ -74,10 +74,10 @@ static bool autoAlignLocalizers = false; static double autoAlignThreshold = 0.0; /** - * Given a runway, and proposed localiser data (ident, positioned and heading), - * precisely align the localiser with the actual runway heading, providing the - * difference between the localiser course and runway heading is less than a - * threshold. (To allow for localizers such as Kai-Tek requiring a turn on final). + * Given a runway, and proposed localizer data (ident, positioned and heading), + * precisely align the localizer with the actual runway heading, providing the + * difference between the localizer course and runway heading is less than a + * threshold. (To allow for localizers such as Kai-Tak requiring a turn on final). * * The positioned and heading argument are modified if changes are made. */ @@ -126,7 +126,7 @@ static double defaultNavRange(const string& ident, FGPositioned::Type type) namespace flightgear { - + static PositionedID readNavFromStream(std::istream& aStream, FGPositioned::Type type = FGPositioned::INVALID) { @@ -164,7 +164,7 @@ static PositionedID readNavFromStream(std::istream& aStream, assert(runway); pos.setElevationFt(runway->geod().getElevationFt()); } - + return cache->insertNavaid(type, string(), name, pos, 0, 0, 0, arp.first, arp.second); } @@ -175,18 +175,49 @@ static PositionedID readNavFromStream(std::istream& aStream, AirportRunwayPair arp; FGRunway* runway = NULL; - - // FIXME - also relate DMEs, but only ILS/LOC DMEs - need a heuristic - // on the DME naming string + PositionedID navaid_dme = 0; + + if (type == FGPositioned::DME) { + FGPositioned::TypeFilter f(FGPositioned::INVALID); + if ( name.find("VOR-DME") != std::string::npos ) { + f.addType(FGPositioned::VOR); + } else if ( name.find("DME-ILS") != std::string::npos ) { + f.addType(FGPositioned::ILS); + f.addType(FGPositioned::LOC); + } else if ( name.find("VORTAC") != std::string::npos ) { + f.addType(FGPositioned::VOR); + } else if ( name.find("NDB-DME") != std::string::npos ) { + f.addType(FGPositioned::NDB); + } else if ( name.find("TACAN") != std::string::npos ) { + f.addType(FGPositioned::VOR); + } + + if (f.maxType() > 0) { + FGPositionedRef ref = FGPositioned::findClosestWithIdent(ident, pos, &f); + if (ref.valid()) { + string_list dme_part = simgear::strutils::split(name , 0 ,1); + string_list navaid_part = simgear::strutils::split(ref.get()->name(), 0 ,1); + + if ( simgear::strutils::uppercase(navaid_part[0]) == simgear::strutils::uppercase(dme_part[0]) ) { + navaid_dme = ref.get()->guid(); + } + } + } + } + if ((type >= FGPositioned::ILS) && (type <= FGPositioned::GS)) { arp = cache->findAirportRunway(name); if (arp.second) { - runway = static_cast(cache->loadById(arp.second)); + runway = FGPositioned::loadById(arp.second); assert(runway); +#if 0 + // code is disabled since it's causing some problems, see + // http://code.google.com/p/flightgear-bugs/issues/detail?id=926 if (elev_ft < 0.01) { // snap to runway elevation pos.setElevationFt(runway->geod().getElevationFt()); } +#endif } // of found runway in the DB } // of type is runway-related @@ -207,6 +238,10 @@ static PositionedID readNavFromStream(std::istream& aStream, if (isLoc) { cache->setRunwayILS(arp.second, r); } + + if (navaid_dme) { + cache->setNavaidColocated(navaid_dme, r); + } return r; }