]> git.mxchange.org Git - flightgear.git/blobdiff - src/Cockpit/dme.cxx
Melchior FRANZ:
[flightgear.git] / src / Cockpit / dme.cxx
index bc00b0f51b4e66111f783ff7bfa3b02ea86119c7..ed3615298d7f789b2ab3bd18e88024f51da52ac5 100644 (file)
@@ -2,7 +2,7 @@
 //
 // Written by Curtis Olson, started April 2000.
 //
-// Copyright (C) 2000  Curtis L. Olson - curt@flightgear.org
+// Copyright (C) 2000  Curtis L. Olson - http://www.flightgear.org/~curt
 //
 // This program is free software; you can redistribute it and/or
 // modify it under the terms of the GNU General Public License as
 #include <simgear/math/sg_random.h>
 
 #include <Aircraft/aircraft.hxx>
-#include <Navaids/ilslist.hxx>
-#include <Navaids/mkrbeacons.hxx>
 #include <Navaids/navlist.hxx>
-#include <Time/FGEventMgr.hxx>
 
 #include "dme.hxx"
 
@@ -51,7 +48,7 @@ static double kludgeRange ( double stationElev, double aircraftElev,
                                // Assume that the nominal range (usually
                                // 50nm) applies at a 5,000 ft difference.
                                // Just a wild guess!
-  double factor = ((aircraftElev*SG_METER_TO_FEET) - stationElev) / 5000.0;
+  double factor = (aircraftElev - stationElev)*SG_METER_TO_FEET / 5000.0;
   double range = fabs(nominalRange * factor);
 
                                // Clamp the range to keep it sane; for
@@ -81,6 +78,7 @@ FGDME::FGDME() :
     navcom2_freq(fgGetNode("/radios/nav[1]/frequencies/selected-mhz", true)),
     need_update(true),
     freq(0.0),
+    bias(0.0),
     dist(0.0),
     prev_dist(0.0),
     spd(0.0),
@@ -162,6 +160,11 @@ FGDME::update(double dt)
             SGTimeStamp current_time;
             station = Point3D( x, y, z );
             dist = aircraft.distance3D( station ) * SG_METER_TO_NM;
+            dist -= bias;
+            if ( dist < 0.0 ) {
+                dist = 0.0;
+            }
+
             current_time.stamp();
             long dMs = (current_time - last_time) / 1000;
                                // Update every second
@@ -212,38 +215,27 @@ void FGDME::search()
             freq = navcom2_freq->getDoubleValue();
             need_update = true;
         }
+    } else if ( switch_pos == 2 && has_power() ) {
+        // no-op
     } else {
         freq = 0;
         inrange = false;
     }
 
-    FGILS ils;
-    FGNav nav;
-
-    if ( current_ilslist->query( lon, lat, elev, freq, &ils ) ) {
-        if (ils.get_has_dme()) {
-            valid = true;
-            lon = ils.get_loclon();
-            lat = ils.get_loclat();
-            elev = ils.get_gselev();
-            range = FG_ILS_DEFAULT_RANGE;
-            effective_range = kludgeRange(elev, elev, range);
-            x = ils.get_dme_x();
-            y = ils.get_dme_y();
-            z = ils.get_dme_z();
-        }
-    } else if ( current_navlist->query( lon, lat, elev, freq, &nav ) ) {
-        if (nav.get_has_dme()) {
-            valid = true;
-            lon = nav.get_lon();
-            lat = nav.get_lat();
-            elev = nav.get_elev();
-            range = nav.get_range();
-            effective_range = kludgeRange(elev, elev, range);
-            x = nav.get_x();
-            y = nav.get_y();
-            z = nav.get_z();
-        }
+    FGNavRecord *dme
+        = globals->get_dmelist()->findByFreq( freq, lon, lat, elev );
+
+    if ( dme != NULL ) {
+        valid = true;
+        lon = dme->get_lon();
+        lat = dme->get_lat();
+        elev = dme->get_elev_ft();
+        bias = dme->get_multiuse();
+        range = FG_LOC_DEFAULT_RANGE;
+        effective_range = kludgeRange(elev, elev, range);
+        x = dme->get_x();
+        y = dme->get_y();
+        z = dme->get_z();
     } else {
         valid = false;
         dist = 0;