X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;ds=sidebyside;f=src%2FInstrumentation%2Faltimeter.cxx;h=a691f1e90814d7f77180eb7845a4c2087edcb5af;hb=ef1ec369dbd422e17efb3959821069867f58dba4;hp=56516da2c647adf0d84e128e083e0d10b5a47a6b;hpb=7e6bc192bad98454187ffe2b5521d28fe6b722a4;p=flightgear.git diff --git a/src/Instrumentation/altimeter.cxx b/src/Instrumentation/altimeter.cxx index 56516da2c..a691f1e90 100644 --- a/src/Instrumentation/altimeter.cxx +++ b/src/Instrumentation/altimeter.cxx @@ -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. @@ -15,7 +16,13 @@ // // Note non-default name, quantum, and tau values. +#ifdef HAVE_CONFIG_H +# include +#endif + +#include #include +#include #include
#include
@@ -23,34 +30,90 @@ #include "altimeter.hxx" -Altimeter::Altimeter ( SGPropertyNode *node, double quantum ) - : _name(node->getStringValue("name", "altimeter")), +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)) -{} + _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 ); +} Altimeter::~Altimeter () {} +double +Altimeter::getSettingInHg() const +{ + return _settingInHg; +} + void -Altimeter::init () +Altimeter::setSettingInHg( double value ) +{ + _settingInHg = value; +} + +double +Altimeter::getSettingHPa() const { - string branch; - branch = "/instrumentation/" + _name; + return _settingInHg * SG_INHG_TO_PA / 100; +} - SGPropertyNode *node = fgGetNode(branch.c_str(), _num, true ); - raw_PA = 0.0; +void +Altimeter::setSettingHPa( double value ) +{ + _settingInHg = value * SG_PA_TO_INHG * 100; +} + + +void +Altimeter::init () +{ _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); + 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 ); +} + +void +Altimeter::unbind() +{ + _tiedProperties.Untie(); } void @@ -59,16 +122,23 @@ 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 * round(raw_PA/100)); - _kollsman = fgGetLowPass(_kollsman, _altimeter.kollsman_ft(setting), trat); + _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*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); }