]> git.mxchange.org Git - flightgear.git/blobdiff - src/Instrumentation/navradio.cxx
Merge branches 'jmt/brakes' and 'jmt/dump'
[flightgear.git] / src / Instrumentation / navradio.cxx
index 042cdbdf0bed258b18c1a21afd03bace5e83bd08..782786fd066288822e05a57b70cce8ed9c6542a3 100644 (file)
@@ -150,10 +150,12 @@ FGNavRadio::FGNavRadio(SGPropertyNode *node) :
     last_x(0.0),
     last_loc_dist(0.0),
     last_xtrack_error(0.0),
+    xrate_ms(0.0),
     _localizerWidth(5.0),
     _name(node->getStringValue("name", "nav")),
     _num(node->getIntValue("number", 0)),
-    _time_before_search_sec(-1.0)
+    _time_before_search_sec(-1.0),
+    _falseCoursesEnabled(true)
 {
     SGPath path( globals->get_fg_root() );
     SGPath term = path;
@@ -209,6 +211,9 @@ FGNavRadio::init ()
     tofrom_serviceable_node = createServiceableProp(node, "to-from");
     dme_serviceable_node = createServiceableProp(node, "dme");
     
+    globals->get_props()->tie("sim/realism/false-radio-courses-enabled", 
+      SGRawValuePointer<bool>(&_falseCoursesEnabled));
+    
     // frequencies
     SGPropertyNode *subnode = node->getChild("frequencies", 0, true);
     freq_node = subnode->getChild("selected-mhz", 0, true);
@@ -518,12 +523,28 @@ void FGNavRadio::updateReceiver(double dt)
   SG_NORMALIZE_RANGE(r, -180.0, 180.0);
   
   if ( is_loc ) {
-    // The factor of 30.0 gives a period of 120 which gives us 3 cycles and six 
-    // zeros i.e. six courses: one front course, one back course, and four 
-    // false courses. Three of the six are reverse sensing.
-    _cdiDeflection = 30.0 * sawtooth(r / 30.0);
+    if (_falseCoursesEnabled) {
+      // The factor of 30.0 gives a period of 120 which gives us 3 cycles and six 
+      // zeros i.e. six courses: one front course, one back course, and four 
+      // false courses. Three of the six are reverse sensing.
+      _cdiDeflection = 30.0 * sawtooth(r / 30.0);
+    } else {
+      // no false courses, but we do need to create a back course
+      if (fabs(r) > 90.0) { // front course
+        _cdiDeflection = r - copysign(180.0, r);
+      } else {
+        _cdiDeflection = r; // back course
+      }
+      
+      _cdiDeflection = -_cdiDeflection; // reverse for outbound radial
+    } // of false courses disabled
+    
     const double VOR_FULL_ARC = 20.0; // VOR is -10 .. 10 degree swing
     _cdiDeflection *= VOR_FULL_ARC / _localizerWidth; // increased localiser sensitivity
+    
+    if (backcourse_node->getBoolValue()) {
+      _cdiDeflection = -_cdiDeflection;
+    }
   } else {
     // handle the TO side of the VOR
     if (fabs(r) > 90.0) {
@@ -569,21 +590,23 @@ void FGNavRadio::updateGlideSlope(double dt, const SGVec3d& aircraft, double sig
   double dot_v = dot(pos, _gsVertical);
   double angle = atan2(dot_v, dot_h) * SGD_RADIANS_TO_DEGREES;
   double deflectionAngle = target_gs - angle;
-        
-  // Construct false glideslopes.  The scale factor of 1.5 
-  // in the sawtooth gives a period of 6 degrees.
-  // There will be zeros at 3, 6r, 9, 12r et cetera
-  // where "r" indicates reverse sensing.
-  // This is is consistent with conventional pilot lore
-  // e.g. http://www.allstar.fiu.edu/aerojava/ILS.htm
-  // but inconsistent with
-  // http://www.freepatentsonline.com/3757338.html
-  //
-  // It may be that some of each exist.
-  if (deflectionAngle < 0) {
-    deflectionAngle = 1.5 * sawtooth(deflectionAngle / 1.5);
-  } else {
-    // no false GS below the true GS
+  
+  if (_falseCoursesEnabled) {
+    // Construct false glideslopes.  The scale factor of 1.5 
+    // in the sawtooth gives a period of 6 degrees.
+    // There will be zeros at 3, 6r, 9, 12r et cetera
+    // where "r" indicates reverse sensing.
+    // This is is consistent with conventional pilot lore
+    // e.g. http://www.allstar.fiu.edu/aerojava/ILS.htm
+    // but inconsistent with
+    // http://www.freepatentsonline.com/3757338.html
+    //
+    // It may be that some of each exist.
+    if (deflectionAngle < 0) {
+      deflectionAngle = 1.5 * sawtooth(deflectionAngle / 1.5);
+    } else {
+      // no false GS below the true GS
+    }
   }
   
   _gsNeedleDeflection = deflectionAngle * 5.0;
@@ -718,7 +741,8 @@ void FGNavRadio::updateCDI(double dt)
   //////////////////////////////////////////////////////////
   double t = 0.0;
   if ( inrange && cdi_serviceable ) {
-    double xrate_ms = (last_xtrack_error - _cdiCrossTrackErrorM) / dt;
+    double cur_rate = (last_xtrack_error - _cdiCrossTrackErrorM) / dt;
+    xrate_ms = 0.99 * xrate_ms + 0.01 * cur_rate;
     if ( fabs(xrate_ms) > 0.00001 ) {
         t = _cdiCrossTrackErrorM / xrate_ms;
     } else {