X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FInstrumentation%2Faltimeter.cxx;h=ebd2f6d0de6fee2f28ac253f49db61322253c58e;hb=9bb55e78be6c6a9da4be26a3671e7d4bf6332d50;hp=993672e6fbeffe1ce101da32eea180ffb05d18cb;hpb=f72891e113b79c96e23f46a8ae2a0ecdacc9155f;p=flightgear.git diff --git a/src/Instrumentation/altimeter.cxx b/src/Instrumentation/altimeter.cxx index 993672e6f..ebd2f6d0d 100644 --- a/src/Instrumentation/altimeter.cxx +++ b/src/Instrumentation/altimeter.cxx @@ -10,6 +10,10 @@ #include
+// A higher number means more responsive +#define RESPONSIVENESS 10.0 + + // Altitude based on pressure difference from sea level. // pressure difference inHG, altitude ft static double altitude_data[][2] = { @@ -41,11 +45,14 @@ static double altitude_data[][2] = { }; -Altimeter::Altimeter () - : _altitude_table(new SGInterpTable) +Altimeter::Altimeter ( SGPropertyNode *node ) + : _name(node->getStringValue("name", "altimeter")), + _num(node->getIntValue("number", 0)), + _static_pressure(node->getStringValue("static-pressure", "/systems/static/pressure-inhg")), + _altitude_table(new SGInterpTable) { - - for (int i = 0; altitude_data[i][0] != -1; i++) + int i; + for (i = 0; altitude_data[i][0] != -1; i++) _altitude_table->addEntry(altitude_data[i][0], altitude_data[i][1]); } @@ -57,14 +64,15 @@ Altimeter::~Altimeter () void Altimeter::init () { - _serviceable_node = - fgGetNode("/instrumentation/altimeter/serviceable", true); - _setting_node = - fgGetNode("/instrumentation/altimeter/setting-inhg", true); - _pressure_node = - fgGetNode("/systems/static/pressure-inhg", true); - _altitude_node = - fgGetNode("/instrumentation/altimeter/indicated-altitude-ft", true); + string branch; + branch = "/instrumentation/" + _name; + + SGPropertyNode *node = fgGetNode(branch.c_str(), _num, true ); + + _serviceable_node = node->getChild("serviceable", 0, true); + _setting_node = node->getChild("setting-inhg", 0, true); + _pressure_node = fgGetNode(_static_pressure.c_str(), true); + _altitude_node = node->getChild("indicated-altitude-ft", 0, true); } void @@ -73,11 +81,14 @@ Altimeter::update (double dt) if (_serviceable_node->getBoolValue()) { double pressure = _pressure_node->getDoubleValue(); double setting = _setting_node->getDoubleValue(); - double altitude = - fgGetLowPass(_altitude_node->getDoubleValue(), - _altitude_table->interpolate(setting - pressure), - dt * 10); - _altitude_node->setDoubleValue(altitude); + + // Move towards the current setting + double last_altitude = _altitude_node->getDoubleValue(); + double current_altitude = + _altitude_table->interpolate(setting - pressure); + _altitude_node->setDoubleValue(fgGetLowPass(last_altitude, + current_altitude, + dt * RESPONSIVENESS)); } }