#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
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