X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FSystems%2Fvacuum.cxx;h=a776d9a493d246a36561c57356a784fb1775fdc5;hb=e9a9f8c96d2963f28e4ecb4eaa91e47b52aaecf6;hp=19bde57773912bd073779970f47bd67dc4650bc6;hpb=682feb8f2d4803444b5a95d956de3979a7a7fcc7;p=flightgear.git diff --git a/src/Systems/vacuum.cxx b/src/Systems/vacuum.cxx index 19bde5777..a776d9a49 100644 --- a/src/Systems/vacuum.cxx +++ b/src/Systems/vacuum.cxx @@ -3,12 +3,28 @@ // // This file is in the Public Domain and comes with no warranty. +#ifdef HAVE_CONFIG_H +# include +#endif + #include "vacuum.hxx" + +#include + #include
-VacuumSystem::VacuumSystem () +VacuumSystem::VacuumSystem ( SGPropertyNode *node ) + : + _name(node->getStringValue("name", "vacuum")), + _num(node->getIntValue("number", 0)), + _scale(node->getDoubleValue("scale", 1.0)) { + for ( int i = 0; i < node->nChildren(); ++i ) { + SGPropertyNode *child = node->getChild(i); + if (!strcmp(child->getName(), "rpm")) + _rpms.push_back(child->getStringValue()); + } } VacuumSystem::~VacuumSystem () @@ -16,14 +32,20 @@ VacuumSystem::~VacuumSystem () } void -VacuumSystem::init () +VacuumSystem::init() { - // TODO: allow index of pump and engine - // to be configured. - _serviceable_node = fgGetNode("/systems/vacuum[0]/serviceable", true); - _rpm_node = fgGetNode("/engines/engine[0]/rpm", true); + unsigned int i; + string branch; + branch = "/systems/" + _name; + + SGPropertyNode *node = fgGetNode(branch.c_str(), _num, true ); + _serviceable_node = node->getChild("serviceable", 0, true); + for ( i = 0; i < _rpms.size(); i++ ) { + SGPropertyNode_ptr _rpm_node = fgGetNode(_rpms[i].c_str(), true); + _rpm_nodes.push_back( _rpm_node ); + } _pressure_node = fgGetNode("/environment/pressure-inhg", true); - _suction_node = fgGetNode("/systems/vacuum[0]/suction-inhg", true); + _suction_node = node->getChild("suction-inhg", 0, true); } void @@ -42,15 +64,28 @@ VacuumSystem::update (double dt) // Model taken from steam.cxx double suction; + unsigned int i; if (!_serviceable_node->getBoolValue()) { suction = 0.0; } else { - double rpm = _rpm_node->getDoubleValue(); + // select the source with the max rpm + double rpm = 0.0; + for ( i = 0; i < _rpm_nodes.size(); i++ ) { + double tmp = _rpm_nodes[i]->getDoubleValue() * _scale; + if ( tmp > rpm ) { + rpm = tmp; + } + } double pressure = _pressure_node->getDoubleValue(); - suction = pressure * rpm / (rpm + 10000.0); - if (suction > 5.0) - suction = 5.0; + // This magic formula yields about 4 inhg at 700 rpm + suction = pressure * rpm / (rpm + 4875.0); + + // simple regulator model that clamps smoothly to about 5 inhg + // over a normal rpm range + double max = (rpm > 0 ? 5.39 - 1.0 / ( rpm * 0.00111 ) : 0); + if ( suction < 0.0 ) suction = 0.0; + if ( suction > max ) suction = max; } _suction_node->setDoubleValue(suction); }