]> git.mxchange.org Git - flightgear.git/commitdiff
Accept setting-hpa along with setting-inhg for altimeter
authorTorsten Dreyer <Torsten@t3r.de>
Mon, 13 Feb 2012 21:25:30 +0000 (22:25 +0100)
committerTorsten Dreyer <Torsten@t3r.de>
Mon, 13 Feb 2012 21:25:30 +0000 (22:25 +0100)
src/Instrumentation/altimeter.cxx
src/Instrumentation/altimeter.hxx

index 0f8d5fc2c7a1ab184c0f790eccf3205c78b0e754..3924ed7c92dabd7d5885acf706f41f80c0ee46c3 100644 (file)
 
 #include "altimeter.hxx"
 
+const double hPa2inHg = 29.92 / 1013.25;
+
 Altimeter::Altimeter ( SGPropertyNode *node, double quantum )
-    : _name(node->getStringValue("name", "altimeter")),
-      _num(node->getIntValue("number", 0)),
+    : _rootNode( 
+       fgGetNode("/instrumentation",true)->
+           getChild( node->getStringValue("name", "altimeter"),
+                     node->getIntValue("number", 0),
+                     true)),
       _static_pressure(node->getStringValue("static-pressure", "/systems/static/pressure-inhg")),
       _tau(node->getDoubleValue("tau", 0.1)),
-      _quantum(node->getDoubleValue("quantum", quantum))
-{}
+      _quantum(node->getDoubleValue("quantum", quantum)),
+      _settingInHg(29.921260)
+{
+    _tiedProperties.setRoot( _rootNode );
+}
 
 Altimeter::~Altimeter ()
 {}
 
+double
+Altimeter::getSettingInHg() const
+{
+    return _settingInHg;
+}
+
 void
-Altimeter::init ()
+Altimeter::setSettingInHg( double value )
+{
+    _settingInHg = value;
+}
+
+double
+Altimeter::getSettingHPa() const
+{
+    return _settingInHg / hPa2inHg;
+}
+
+void
+Altimeter::setSettingHPa( double value )
 {
-    string branch;
-    branch = "/instrumentation/" + _name;
+    _settingInHg = value * hPa2inHg;
+}
 
-    SGPropertyNode *node = fgGetNode(branch.c_str(), _num, true );
+
+void
+Altimeter::init ()
+{
     raw_PA = 0.0;
     _kollsman = 0.0;
     _pressure_node     = fgGetNode(_static_pressure.c_str(), true);
-    _serviceable_node  = node->getChild("serviceable", 0, true);
-    _setting_node      = node->getChild("setting-inhg", 0, true);
-    _press_alt_node    = node->getChild("pressure-alt-ft", 0, true);
-    _mode_c_node       = node->getChild("mode-c-alt-ft", 0, true);
-    _altitude_node     = node->getChild("indicated-altitude-ft", 0, true);
-
-    if (_setting_node->getDoubleValue() == 0)
-        _setting_node->setDoubleValue(29.921260);
+    _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);
+    _altitude_node     = _rootNode->getChild("indicated-altitude-ft", 0, true);
+}
+
+void
+Altimeter::bind()
+{
+    _tiedProperties.Tie("setting-inhg", this, &Altimeter::getSettingInHg, &Altimeter::setSettingInHg );
+    _tiedProperties.Tie("setting-hpa", this, &Altimeter::getSettingHPa, &Altimeter::setSettingHPa );
+}
+
+void
+Altimeter::unbind()
+{
+    _tiedProperties.Untie();
 }
 
 void
@@ -65,12 +103,11 @@ Altimeter::update (double dt)
     if (_serviceable_node->getBoolValue()) {
         double trat = _tau > 0 ? dt/_tau : 100;
         double pressure = _pressure_node->getDoubleValue();
-        double setting = _setting_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));
-        _kollsman = fgGetLowPass(_kollsman, _altimeter.kollsman_ft(setting), trat);
+        _kollsman = fgGetLowPass(_kollsman, _altimeter.kollsman_ft(_settingInHg), trat);
         if (_quantum)
             press_alt = _quantum * SGMiscd::round(raw_PA/_quantum);
         else
index a2ad87969bba47dbde20c93ee070e91e6b65a539..f57c1ad37400d2503835dfdc4c6dde4ce2ef0d02 100644 (file)
@@ -9,6 +9,7 @@
 #define __INSTRUMENTS_ALTIMETER_HXX 1
 
 #include <simgear/props/props.hxx>
+#include <simgear/props/tiedpropertylist.hxx>
 #include <simgear/structure/subsystem_mgr.hxx>
 #include <Environment/atmosphere.hxx>
 
@@ -36,25 +37,32 @@ public:
 
     virtual void init ();
     virtual void update (double dt);
+    virtual void bind();
+    virtual void unbind();
 
-private:
+    double getSettingInHg() const;
+    void setSettingInHg( double value );
+    double getSettingHPa() const;
+    void setSettingHPa( double value );
 
-    std::string _name;
-    int _num;
+private:
+    SGPropertyNode_ptr _rootNode;
     string _static_pressure;
     double _tau;
     double _quantum;
     double _kollsman;
     double raw_PA;
+    double _settingInHg;
 
     SGPropertyNode_ptr _serviceable_node;
-    SGPropertyNode_ptr _setting_node;
     SGPropertyNode_ptr _pressure_node;
     SGPropertyNode_ptr _press_alt_node;
     SGPropertyNode_ptr _mode_c_node;
     SGPropertyNode_ptr _altitude_node;
 
     FGAltimeter _altimeter;
+
+    simgear::TiedPropertyList _tiedProperties;
 };
 
 #endif // __INSTRUMENTS_ALTIMETER_HXX