Accept setting-hpa along with setting-inhg for altimeter
This commit is contained in:
parent
5a05e30abd
commit
d141beee0f
2 changed files with 66 additions and 21 deletions
|
@ -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::setSettingInHg( double value )
|
||||
{
|
||||
_settingInHg = value;
|
||||
}
|
||||
|
||||
double
|
||||
Altimeter::getSettingHPa() const
|
||||
{
|
||||
return _settingInHg / hPa2inHg;
|
||||
}
|
||||
|
||||
void
|
||||
Altimeter::setSettingHPa( double value )
|
||||
{
|
||||
_settingInHg = value * hPa2inHg;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
Altimeter::init ()
|
||||
{
|
||||
string branch;
|
||||
branch = "/instrumentation/" + _name;
|
||||
|
||||
SGPropertyNode *node = fgGetNode(branch.c_str(), _num, true );
|
||||
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);
|
||||
_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);
|
||||
}
|
||||
|
||||
if (_setting_node->getDoubleValue() == 0)
|
||||
_setting_node->setDoubleValue(29.921260);
|
||||
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
|
||||
|
|
|
@ -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();
|
||||
|
||||
double getSettingInHg() const;
|
||||
void setSettingInHg( double value );
|
||||
double getSettingHPa() const;
|
||||
void setSettingHPa( double value );
|
||||
|
||||
private:
|
||||
|
||||
std::string _name;
|
||||
int _num;
|
||||
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
|
||||
|
|
Loading…
Add table
Reference in a new issue