+// discount navids if they conflict with another on the same frequency
+// this only applies to navids associated with opposite ends of a runway,
+// with matching frequencies.
+bool navidUsable(FGNavRecord* aNav, const SGGeod &aircraft)
+{
+ FGRunway* r(aNav->runway());
+ if (!r || !r->reciprocalRunway()) {
+ return true;
+ }
+
+ // check if the runway frequency is paired
+ FGNavRecord* locA = r->ILS();
+ FGNavRecord* locB = r->reciprocalRunway()->ILS();
+
+ if (!locA || !locB || (locA->get_freq() != locB->get_freq())) {
+ return true; // not paired, ok
+ }
+
+ // okay, both ends have an ILS, and they're paired. We need to select based on
+ // aircraft position. What we're going to use is *runway* (not navid) position,
+ // ie whichever runway end we are closer too. This makes back-course / missed
+ // approach behaviour incorrect, but that's the price we accept.
+ double crs = SGGeodesy::courseDeg(aircraft, r->geod());
+ double hdgDiff = crs - r->headingDeg();
+ SG_NORMALIZE_RANGE(hdgDiff, -180.0, 180.0);
+ return (fabs(hdgDiff) < 90.0);
+}
+