]> git.mxchange.org Git - flightgear.git/blobdiff - src/Instrumentation/navradio.cxx
fix a typo
[flightgear.git] / src / Instrumentation / navradio.cxx
index 1b870dd1a40a9f0754f1f20c6a6671c2b3463a8f..ceeefc8c599ab18ec53014d6edc70a9f2a8f3495 100644 (file)
@@ -31,6 +31,7 @@
 #include <simgear/timing/sg_time.hxx>
 #include <simgear/math/vector.hxx>
 #include <simgear/math/sg_random.h>
+#include <simgear/misc/sg_path.hxx>
 #include <simgear/math/sg_geodesy.hxx>
 #include <simgear/structure/exception.hxx>
 
@@ -88,6 +89,7 @@ FGNavRadio::FGNavRadio(SGPropertyNode *node) :
     gps_cdi_deflection_node(NULL),
     gps_to_flag_node(NULL),
     gps_from_flag_node(NULL),
+    gps_has_gs_node(NULL),
     last_nav_id(""),
     last_nav_vor(false),
     play_count(0),
@@ -200,6 +202,7 @@ FGNavRadio::init ()
     gps_cdi_deflection_node = fgGetNode("/instrumentation/gps/cdi-deflection", true);
     gps_to_flag_node = fgGetNode("/instrumentation/gps/to-flag", true);
     gps_from_flag_node = fgGetNode("/instrumentation/gps/from-flag", true);
+    gps_has_gs_node = fgGetNode("/instrumentation/gps/has-gs", true);
     
     std::ostringstream temp;
     temp << _name << "nav-ident" << _num;
@@ -313,8 +316,17 @@ FGNavRadio::update(double dt)
     bool nav_serviceable = nav_serviceable_node->getBoolValue();
     bool cdi_serviceable = cdi_serviceable_node->getBoolValue();
     bool tofrom_serviceable = tofrom_serviceable_node->getBoolValue();
-    bool inrange = inrange_node->getBoolValue();
-    bool has_gs = has_gs_node->getBoolValue();
+    bool inrange = false;
+    bool has_gs = false;
+    if ( nav_slaved_to_gps_node->getBoolValue() ) {
+       has_gs = gps_has_gs_node->getBoolValue();
+       has_gs_node->setBoolValue( has_gs );
+       inrange = gps_to_flag_node->getBoolValue()
+           || gps_from_flag_node->getBoolValue();
+    } else {
+       has_gs = has_gs_node->getBoolValue();
+       inrange = inrange_node->getBoolValue();
+    }
     bool is_loc = loc_node->getBoolValue();
     double loc_dist = loc_dist_node->getDoubleValue();
     double effective_range_m;
@@ -448,7 +460,10 @@ FGNavRadio::update(double dt)
                    signal_quality_norm, dt );
         }
         signal_quality_norm_node->setDoubleValue( signal_quality_norm );
-        inrange = signal_quality_norm > 0.2;
+        if ( ! nav_slaved_to_gps_node->getBoolValue() ) {
+           /* not slaved to gps */
+            inrange = signal_quality_norm > 0.2;
+        }
         inrange_node->setBoolValue( inrange );
 
        if ( !is_loc ) {
@@ -578,16 +593,18 @@ FGNavRadio::update(double dt)
         // compute the time to intercept selected radial (based on
         // current and last cross track errors and dt
         //////////////////////////////////////////////////////////
-        double t = 0.0;
-        if ( inrange && cdi_serviceable ) {
-            double xrate_ms = (last_xtrack_error - xtrack_error) / dt;
-            if ( fabs(xrate_ms) > 0.00001 ) {
-                t = xtrack_error / xrate_ms;
-            } else {
-                t = 9999.9;
+        if (dt > 0) { // Are we paused?
+            double t = 0.0;
+            if ( inrange && cdi_serviceable ) {
+                double xrate_ms = (last_xtrack_error - xtrack_error) / dt;
+                if ( fabs(xrate_ms) > 0.00001 ) {
+                    t = xtrack_error / xrate_ms;
+                } else {
+                    t = 9999.9;
+                }
             }
+            time_to_intercept->setDoubleValue( t );
         }
-        time_to_intercept->setDoubleValue( t );
 
         //////////////////////////////////////////////////////////
         // compute the amount of glide slope needle deflection
@@ -606,10 +623,10 @@ FGNavRadio::update(double dt)
                 // FIXME/FINISHME, what should be set here?
             } else if ( inrange ) {
                 double x = gs_dist_node->getDoubleValue();
-                double y = (fgGetDouble("/position/altitude-ft") - nav_elev)
+                double y = (alt_node->getDoubleValue() - nav_elev)
                     * SG_FEET_TO_METER;
                 // cout << "dist = " << x << " height = " << y << endl;
-                double angle = asin( y / x ) * SGD_RADIANS_TO_DEGREES;
+                double angle = atan2( y, x ) * SGD_RADIANS_TO_DEGREES;
                 r = (target_gs - angle) * 5.0;
                 r *= signal_quality_norm;
             }
@@ -764,10 +781,8 @@ void FGNavRadio::search()
     _time_before_search_sec = 1.0;
 
     // cache values locally for speed
-    double lon = lon_node->getDoubleValue() * SGD_DEGREES_TO_RADIANS;
-    double lat = lat_node->getDoubleValue() * SGD_DEGREES_TO_RADIANS;
-    double elev = alt_node->getDoubleValue() * SG_FEET_TO_METER;
-
+    SGGeod pos = SGGeod::fromDegFt(lon_node->getDoubleValue(),
+      lat_node->getDoubleValue(), alt_node->getDoubleValue());
     FGNavRecord *nav = NULL;
     FGNavRecord *loc = NULL;
     FGNavRecord *dme = NULL;
@@ -778,11 +793,11 @@ void FGNavRadio::search()
     ////////////////////////////////////////////////////////////////////////
 
     double freq = freq_node->getDoubleValue();
-    nav = globals->get_navlist()->findByFreq(freq, lon, lat, elev);
-    dme = globals->get_dmelist()->findByFreq(freq, lon, lat, elev);
+    nav = globals->get_navlist()->findByFreq(freq, pos);
+    dme = globals->get_dmelist()->findByFreq(freq, pos);
     if ( nav == NULL ) {
-        loc = globals->get_loclist()->findByFreq(freq, lon, lat, elev);
-        gs = globals->get_gslist()->findByFreq(freq, lon, lat, elev);
+        loc = globals->get_loclist()->findByFreq(freq, pos);
+        gs = globals->get_gslist()->findByFreq(freq, pos);
     }
 
     string nav_id = "";
@@ -799,7 +814,7 @@ void FGNavRadio::search()
            while ( target_radial > 360.0 ) { target_radial -= 360.0; }
            loc_lon = loc->get_lon();
            loc_lat = loc->get_lat();
-           nav_xyz = loc->get_cart();
+           nav_xyz = loc->cart();
            last_nav_id = nav_id;
            last_nav_vor = false;
            loc_node->setBoolValue( true );
@@ -811,7 +826,7 @@ void FGNavRadio::search()
                 nav_elev = gs->get_elev_ft();
                 int tmp = (int)(gs->get_multiuse() / 1000.0);
                 target_gs = (double)tmp / 100.0;
-                gs_xyz = gs->get_cart();
+                gs_xyz = gs->cart();
 
                 // derive GS baseline (perpendicular to the runay
                 // along the ground)
@@ -884,10 +899,10 @@ void FGNavRadio::search()
            nav_elev = nav->get_elev_ft();
            twist = nav->get_multiuse();
            range = nav->get_range();
-           effective_range = adjustNavRange(nav_elev, elev, range);
+           effective_range = adjustNavRange(nav_elev, pos.getElevationM(), range);
            target_gs = 0.0;
            target_radial = sel_radial_node->getDoubleValue();
-           nav_xyz = nav->get_cart();
+           nav_xyz = nav->cart();
 
            if ( globals->get_soundmgr()->exists( nav_fx_name ) ) {
                globals->get_soundmgr()->remove( nav_fx_name );