1
0
Fork 0
flightgear/src/Systems/static.cxx

114 lines
3.5 KiB
C++
Raw Normal View History

// static.cxx - the static air system.
// Written by David Megginson, started 2002.
//
// Last modified by Eric van den Berg, 09 Nov 2013
// This file is in the Public Domain and comes with no warranty.
2011-11-14 07:38:58 +00:00
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include "static.hxx"
#include <string>
#include <Main/fg_props.hxx>
#include <Main/util.hxx>
#include <simgear/constants.h>
#include <simgear/math/SGMisc.hxx>
#include <simgear/math/SGLimits.hxx>
#include <simgear/math/SGMathFwd.hxx>
#include <simgear/sg_inlines.h>
StaticSystem::StaticSystem ( SGPropertyNode *node )
:
_name(node->getStringValue("name", "static")),
_num(node->getIntValue("number", 0)),
_tau(SGMiscd::max(.0,node->getDoubleValue("tau", 1))),
_error_factor(node->getDoubleValue("error-factor", 0)),
_type(node->getIntValue("type", 0))
{
}
StaticSystem::~StaticSystem ()
{
}
void
StaticSystem::init ()
{
std::string branch = "/systems/" + _name;
SGPropertyNode *node = fgGetNode(branch.c_str(), _num, true );
_serviceable_node = node->getChild("serviceable", 0, true);
_pressure_in_node = fgGetNode("/environment/pressure-inhg", true);
_pressure_out_node = node->getChild("pressure-inhg", 0, true);
_beta_node = fgGetNode("/orientation/side-slip-deg", true);
_alpha_node = fgGetNode("/orientation/alpha-deg", true);
_mach_node = fgGetNode("/velocities/mach", true);
SG_CLAMP_RANGE(_error_factor,0.0,1.0); // making sure the error_factor is between 0 and 1
reinit();
}
void
StaticSystem::reinit ()
{
// start with settled static pressure
_pressure_out_node->setDoubleValue(_pressure_in_node->getDoubleValue());
}
void
StaticSystem::bind ()
{
}
void
StaticSystem::unbind ()
{
}
void
StaticSystem::update (double dt)
{
if (_serviceable_node->getBoolValue()) {
double p_new = _pressure_in_node->getDoubleValue(); //current static pressure around aircraft
double p = _pressure_out_node->getDoubleValue(); //last pressure in aircraft static system
double beta;
double alpha;
double mach;
double trat = _tau ? dt/_tau : SGLimitsd::max();
double proj_factor = 0;
double pt;
double qc_part;
if (_type == 1) { // type 1 = static pressure dependent on side-slip only: static port on the fuselage
beta = _beta_node->getDoubleValue() * SGD_DEGREES_TO_RADIANS;
proj_factor = sin(beta);
}
if (_type == 2) { // type 2 = static pressure dependent on aoa and side-slip: static port on the pitot tube
alpha = _alpha_node->getDoubleValue() * SGD_DEGREES_TO_RADIANS;
beta = _beta_node->getDoubleValue() * SGD_DEGREES_TO_RADIANS;
proj_factor = sqrt( 1.0 - cos(beta)*cos(beta) * cos(alpha)*cos(alpha) );
}
2013-11-17 16:26:56 +00:00
if ( (_type ==1) || (_type == 2) ) {
mach = _mach_node->getDoubleValue();
pt = p_new * pow(1 + 0.2 * mach*mach*proj_factor*proj_factor, 3.5 ); //total pressure perpendicular to static port (=perpendicular to body x-axis)
qc_part = (pt - p_new) * _error_factor ; //part of impact pressure to be added to static pressure (due to sideslip)
p_new = p_new + qc_part;
}
_pressure_out_node->setDoubleValue(
_tau > .0 ? fgGetLowPass(p, p_new, trat) : p_new
); //setting new pressure in static system
}
}
// end of static.cxx