]> git.mxchange.org Git - flightgear.git/blobdiff - src/Instrumentation/altimeter.cxx
Support for multiple data dirs.
[flightgear.git] / src / Instrumentation / altimeter.cxx
index 3924ed7c92dabd7d5885acf706f41f80c0ee46c3..a691f1e90814d7f77180eb7845a4c2087edcb5af 100644 (file)
@@ -2,6 +2,7 @@
 // Written by David Megginson, started 2002.
 // Modified by John Denker in 2007 to use a two layer atmosphere
 // model in src/Environment/atmosphere.?xx
+// Last modified by Eric van den Berg, 25 Nov 2012
 //
 // This file is in the Public Domain and comes with no warranty.
 
@@ -19,6 +20,7 @@
 #  include <config.h>
 #endif
 
+#include <simgear/constants.h>
 #include <simgear/math/interpolater.hxx>
 #include <simgear/math/SGMath.hxx>
 
 
 #include "altimeter.hxx"
 
-const double hPa2inHg = 29.92 / 1013.25;
-
-Altimeter::Altimeter ( SGPropertyNode *node, double quantum )
-    : _rootNode( 
-       fgGetNode("/instrumentation",true)->
-           getChild( node->getStringValue("name", "altimeter"),
-                     node->getIntValue("number", 0),
-                     true)),
+Altimeter::Altimeter ( SGPropertyNode *node, const std::string& aDefaultName, double quantum ) :
+      _name(node->getStringValue("name", aDefaultName.c_str())),
+      _num(node->getIntValue("number", 0)),
       _static_pressure(node->getStringValue("static-pressure", "/systems/static/pressure-inhg")),
       _tau(node->getDoubleValue("tau", 0.1)),
       _quantum(node->getDoubleValue("quantum", quantum)),
       _settingInHg(29.921260)
 {
+    // FIXME: change default to false once all aircraft which use
+    // altimiter as an encoder are converted to request this explicitly
+    _encodeModeC = node->getBoolValue("encode-mode-c", true);
+    _encodeModeS = node->getBoolValue("encode-mode-s", false);
+    
     _tiedProperties.setRoot( _rootNode );
 }
 
@@ -62,31 +64,48 @@ Altimeter::setSettingInHg( double value )
 double
 Altimeter::getSettingHPa() const
 {
-    return _settingInHg / hPa2inHg;
+    return _settingInHg * SG_INHG_TO_PA / 100;
 }
 
 void
 Altimeter::setSettingHPa( double value )
 {
-    _settingInHg = value * hPa2inHg;
+    _settingInHg = value * SG_PA_TO_INHG * 100;
 }
 
 
 void
 Altimeter::init ()
 {
-    raw_PA = 0.0;
-    _kollsman = 0.0;
     _pressure_node     = fgGetNode(_static_pressure.c_str(), true);
     _serviceable_node  = _rootNode->getChild("serviceable", 0, true);
     _press_alt_node    = _rootNode->getChild("pressure-alt-ft", 0, true);
-    _mode_c_node       = _rootNode->getChild("mode-c-alt-ft", 0, true);
+    if (_encodeModeC) {
+        _mode_c_node = _rootNode->getChild("mode-c-alt-ft", 0, true);
+    }
+    
+    if (_encodeModeS) {
+        _mode_s_node = _rootNode->getChild("mode-s-alt-ft", 0, true);
+    }
+    
     _altitude_node     = _rootNode->getChild("indicated-altitude-ft", 0, true);
+
+    reinit();
+}
+
+void
+Altimeter::reinit ()
+{
+    _raw_PA = 0.0;
+    _kollsman = 0.0;
 }
 
 void
 Altimeter::bind()
 {
+    _rootNode = fgGetNode("/instrumentation/" + _name, _num, true );
+    _tiedProperties.setRoot(_rootNode);
+    
     _tiedProperties.Tie("setting-inhg", this, &Altimeter::getSettingInHg, &Altimeter::setSettingInHg );
     _tiedProperties.Tie("setting-hpa", this, &Altimeter::getSettingHPa, &Altimeter::setSettingHPa );
 }
@@ -105,13 +124,21 @@ Altimeter::update (double dt)
         double pressure = _pressure_node->getDoubleValue();
         double press_alt = _press_alt_node->getDoubleValue();
         // The mechanism settles slowly toward new pressure altitude:
-        raw_PA = fgGetLowPass(raw_PA, _altimeter.press_alt_ft(pressure), trat);
-        _mode_c_node->setDoubleValue(100 * SGMiscd::round(raw_PA/100));
+        _raw_PA = fgGetLowPass(_raw_PA, _altimeter.press_alt_ft(pressure), trat);
+        
+        if (_encodeModeC) {
+            _mode_c_node->setDoubleValue(100 * SGMiscd::round(_raw_PA/100));
+        }
+        
+        if (_encodeModeS) {
+            _mode_s_node->setDoubleValue(10 * SGMiscd::round(_raw_PA/10));
+        }
+
         _kollsman = fgGetLowPass(_kollsman, _altimeter.kollsman_ft(_settingInHg), trat);
         if (_quantum)
-            press_alt = _quantum * SGMiscd::round(raw_PA/_quantum);
+            press_alt = _quantum * SGMiscd::round(_raw_PA/_quantum);
         else
-            press_alt = raw_PA;
+            press_alt = _raw_PA;
         _press_alt_node->setDoubleValue(press_alt);
         _altitude_node->setDoubleValue(press_alt - _kollsman);
     }