#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>
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.
*/
case FGPositioned::GS:
return FG_LOC_DEFAULT_RANGE;
- case FGPositioned::DME: return FG_DME_DEFAULT_RANGE;
- default: return FG_LOC_DEFAULT_RANGE;
+ case FGPositioned::DME:
+ return FG_DME_DEFAULT_RANGE;
+
+ case FGPositioned::TACAN:
+ case FGPositioned::MOBILE_TACAN:
+ return FG_TACAN_DEFAULT_RANGE;
+
+ default:
+ return FG_LOC_DEFAULT_RANGE;
}
}
namespace flightgear
{
-
+
static PositionedID readNavFromStream(std::istream& aStream,
FGPositioned::Type type = FGPositioned::INVALID)
{
int rawType;
aStream >> rawType;
- if (aStream.eof() || (rawType == 99)) {
+ if( aStream.eof() || (rawType == 99) || (rawType == 0) )
return 0; // happens with, eg, carrier_nav.dat
- }
double lat, lon, elev_ft, multiuse;
int freq, range;
SGGeod pos(SGGeod::fromDegFt(lon, lat, elev_ft));
name = simgear::strutils::strip(name);
-
+
// the type can be forced by our caller, but normally we use th value
// supplied in the .dat file
if (type == FGPositioned::INVALID) {
assert(runway);
pos.setElevationFt(runway->geod().getElevationFt());
}
-
+
return cache->insertNavaid(type, string(), name, pos, 0, 0, 0,
arp.first, arp.second);
}
- if (range < 0.01) {
+ if (range < 1) {
range = defaultNavRange(ident, type);
}
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
if (isLoc) {
cache->setRunwayILS(arp.second, r);
}
+
+ if (navaid_dme) {
+ cache->setNavaidColocated(navaid_dme, r);
+ }
return r;
}
}
while ( ! incarrier.eof() ) {
+ incarrier >> skipcomment;
// force the type to be MOBILE_TACAN
readNavFromStream(incarrier, FGPositioned::MOBILE_TACAN);
- } // end while
+ }
return true;
}