From: Torsten Dreyer Date: Mon, 13 Feb 2012 21:25:30 +0000 (+0100) Subject: Accept setting-hpa along with setting-inhg for altimeter X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=d141beee0f032e677b80fbb7a4bed6a9262d921f;p=flightgear.git Accept setting-hpa along with setting-inhg for altimeter --- diff --git a/src/Instrumentation/altimeter.cxx b/src/Instrumentation/altimeter.cxx index 0f8d5fc2c..3924ed7c9 100644 --- a/src/Instrumentation/altimeter.cxx +++ b/src/Instrumentation/altimeter.cxx @@ -28,35 +28,73 @@ #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 diff --git a/src/Instrumentation/altimeter.hxx b/src/Instrumentation/altimeter.hxx index a2ad87969..f57c1ad37 100644 --- a/src/Instrumentation/altimeter.hxx +++ b/src/Instrumentation/altimeter.hxx @@ -9,6 +9,7 @@ #define __INSTRUMENTS_ALTIMETER_HXX 1 #include +#include #include #include @@ -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