]> git.mxchange.org Git - flightgear.git/commitdiff
Roy V. OVESEN: add support for heading bug
authormfranz <mfranz>
Sun, 15 Mar 2009 19:18:14 +0000 (19:18 +0000)
committerTim Moore <timoore@redhat.com>
Wed, 18 Mar 2009 07:00:08 +0000 (08:00 +0100)
src/Instrumentation/heading_indicator.cxx
src/Instrumentation/heading_indicator.hxx

index 10f25e7990866818863b55439dc01816addaacfb..53046480a5e1826155730e6d2f358f56c923cfc4 100644 (file)
@@ -4,6 +4,7 @@
 // This file is in the Public Domain and comes with no warranty.
 
 #include <simgear/compiler.h>
+#include <simgear/sg_inlines.h>
 #include <iostream>
 #include <string>
 #include <sstream>
@@ -36,6 +37,8 @@ HeadingIndicator::init ()
     _heading_in_node = fgGetNode("/orientation/heading-deg", true);
     _suction_node = fgGetNode(_suction.c_str(), true);
     _heading_out_node = node->getChild("indicated-heading-deg", 0, true);
+    _heading_bug_error_node = node->getChild("heading-bug-error-deg", 0, true);
+    _heading_bug_node = node->getChild("heading-bug-deg", 0, true);
     _last_heading_deg = (_heading_in_node->getDoubleValue() +
                          _offset_node->getDoubleValue());
 }
@@ -77,11 +80,7 @@ HeadingIndicator::update (double dt)
                                 // Next, calculate time-based precession
     double offset = _offset_node->getDoubleValue();
     offset -= dt * (0.25 / 60.0); // 360deg/day
-    while (offset < -360)
-        offset += 360;
-    while (offset > 360)
-        offset -= 360;
-    _offset_node->setDoubleValue(offset);
+    SG_NORMALIZE_RANGE(offset, -360.0, 360.0);
 
                                 // TODO: movement-induced error
 
@@ -102,12 +101,16 @@ HeadingIndicator::update (double dt)
     _last_heading_deg = heading;
 
     heading += offset;
-    while (heading < 0)
-        heading += 360;
-    while (heading > 360)
-        heading -= 360;
+    SG_NORMALIZE_RANGE(heading, 0.0, 360.0);
 
     _heading_out_node->setDoubleValue(heading);
+
+    // Calculate heading bug error normalized to +/- 180.0
+    double heading_bug = _heading_bug_node->getDoubleValue();
+    double diff = heading_bug - heading;
+
+    SG_NORMALIZE_RANGE(diff, -180.0, 180.0);
+    _heading_bug_error_node->setDoubleValue( diff );
 }
 
 // end of heading_indicator.cxx
index 8316384073f0e45480cec59ff68953e7984d9073..f3d6f5f155cb83c3a8f0851676ef228a7cef9824 100644 (file)
@@ -59,7 +59,9 @@ private:
     SGPropertyNode_ptr _heading_in_node;
     SGPropertyNode_ptr _suction_node;
     SGPropertyNode_ptr _heading_out_node;
-    
+    SGPropertyNode_ptr _heading_bug_error_node;
+    SGPropertyNode_ptr _heading_bug_node;
+
 };
 
 #endif // __INSTRUMENTS_HEADING_INDICATOR_HXX