]> git.mxchange.org Git - flightgear.git/blobdiff - src/Navaids/navdb.cxx
Additional checks, for waypoint role setting.
[flightgear.git] / src / Navaids / navdb.cxx
index abc7975d535e4bfb675a7bcbcd34a68698e8d65c..99453022a826c45185b2b48a032939adffd3ca1e 100644 (file)
@@ -40,7 +40,7 @@
 #include "navlist.hxx"
 #include <Main/globals.hxx>
 #include <Navaids/markerbeacon.hxx>
-#include <Airports/simple.hxx>
+#include <Airports/airport.hxx>
 #include <Airports/runways.hxx>
 #include <Airports/xmlloader.hxx>
 #include <Main/fg_props.hxx>
@@ -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)
 {
@@ -158,16 +158,13 @@ static PositionedID readNavFromStream(std::istream& aStream,
 
   if ((type >= FGPositioned::OM) && (type <= FGPositioned::IM)) {
     AirportRunwayPair arp(cache->findAirportRunway(name));
-#if 0
-      // code is disabled since it's causing some problems, see
-      // http://code.google.com/p/flightgear-bugs/issues/detail?id=926
     if (arp.second && (elev_ft < 0.01)) {
     // snap to runway elevation
       FGPositioned* runway = cache->loadById(arp.second);
       assert(runway);
       pos.setElevationFt(runway->geod().getElevationFt());
     }
-#endif
+
     return cache->insertNavaid(type, string(), name, pos, 0, 0, 0,
                                arp.first, arp.second);
   }
@@ -178,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<FGRunway*>(cache->loadById(arp.second));
+      runway = FGPositioned::loadById<FGRunway>(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
   
@@ -210,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;
 }