X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FInstrumentation%2Faltimeter.cxx;h=ebd2f6d0de6fee2f28ac253f49db61322253c58e;hb=9bb55e78be6c6a9da4be26a3671e7d4bf6332d50;hp=b5450551eece9f33a825a62c46e60c8955c8eef7;hpb=8d5714084e76ab923c08aae431dbdb9e516aaf96;p=flightgear.git diff --git a/src/Instrumentation/altimeter.cxx b/src/Instrumentation/altimeter.cxx index b5450551e..ebd2f6d0d 100644 --- a/src/Instrumentation/altimeter.cxx +++ b/src/Instrumentation/altimeter.cxx @@ -7,44 +7,52 @@ #include "altimeter.hxx" #include
+#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] = { - -8.41, -8858.27, - 0.00, 0.00, - 3.05, 2952.76, - 5.86, 5905.51, - 8.41, 8858.27, - 10.74, 11811.02, - 12.87, 14763.78, - 14.78, 17716.54, - 16.55, 20669.29, - 18.13, 23622.05, - 19.62, 26574.80, - 20.82, 29527.56, - 21.96, 32480.31, - 23.01, 35433.07, - 23.91, 38385.83, - 24.71, 41338.58, - 25.40, 44291.34, - 26.00, 47244.09, - 26.51, 50196.85, - 26.96, 53149.61, - 27.35, 56102.36, - 27.68, 59055.12, - 27.98, 62007.87, - 29.62, 100000.00 // just to fill it in - -1, -1, + { -8.41, -8858.27 }, + { 0.00, 0.00 }, + { 3.05, 2952.76 }, + { 5.86, 5905.51 }, + { 8.41, 8858.27 }, + { 10.74, 11811.02 }, + { 12.87, 14763.78 }, + { 14.78, 17716.54 }, + { 16.55, 20669.29 }, + { 18.13, 23622.05 }, + { 19.62, 26574.80 }, + { 20.82, 29527.56 }, + { 21.96, 32480.31 }, + { 23.01, 35433.07 }, + { 23.91, 38385.83 }, + { 24.71, 41338.58 }, + { 25.40, 44291.34 }, + { 26.00, 47244.09 }, + { 26.51, 50196.85 }, + { 26.96, 53149.61 }, + { 27.35, 56102.36 }, + { 27.68, 59055.12 }, + { 27.98, 62007.87 }, + { 29.62, 100000.00 }, // just to fill it in + { -1, -1 } }; -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]); } @@ -56,24 +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; -void -Altimeter::bind () -{ -} + SGPropertyNode *node = fgGetNode(branch.c_str(), _num, true ); -void -Altimeter::unbind () -{ + _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 @@ -82,8 +81,14 @@ Altimeter::update (double dt) if (_serviceable_node->getBoolValue()) { double pressure = _pressure_node->getDoubleValue(); double setting = _setting_node->getDoubleValue(); - _altitude_node - ->setDoubleValue(_altitude_table->interpolate(setting-pressure)); + + // 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)); } }