Patch from Julian Foad:
- tidies up the update-time-step handling (making it a simple "dt"); - makes the altimeter get a proper pressure, and the (unused) vacuum calculation get a proper RPM (*); - replaces property name look-ups with static pointers to property nodes. Notes from DPM: - the static pointers are a very bad idea, but they're only temporary; I plan to make FGSteam into a proper subsystem soon, and then they can be member variables - I fixed the patch to get the current static pressure from the /environment/pressure-inhg property, so that the altimeter interacts properly with FGEnvironment
This commit is contained in:
parent
ee8c5d0a3a
commit
bf58dbd3c9
2 changed files with 38 additions and 19 deletions
|
@ -31,6 +31,12 @@
|
||||||
#include <simgear/math/sg_types.hxx>
|
#include <simgear/math/sg_types.hxx>
|
||||||
#include <simgear/misc/props.hxx>
|
#include <simgear/misc/props.hxx>
|
||||||
#include <Aircraft/aircraft.hxx>
|
#include <Aircraft/aircraft.hxx>
|
||||||
|
#ifdef FG_WEATHERCM
|
||||||
|
# include <WeatherCM/FGLocalWeatherDatabase.h>
|
||||||
|
#else
|
||||||
|
# include <Environment/environment_mgr.hxx>
|
||||||
|
# include <Environment/environment.hxx>
|
||||||
|
#endif
|
||||||
|
|
||||||
SG_USING_NAMESPACE(std);
|
SG_USING_NAMESPACE(std);
|
||||||
|
|
||||||
|
@ -92,7 +98,7 @@ double FGSteam::get_TC_std () { _CatchUp(); return the_TC_std; }
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
int FGSteam::_UpdatesPending = 1000000; /* Forces filter to reset */
|
double FGSteam::_UpdateTimePending = 1000000; /* Forces filters to reset */
|
||||||
|
|
||||||
|
|
||||||
// FIXME: no need to use static
|
// FIXME: no need to use static
|
||||||
|
@ -100,7 +106,6 @@ int FGSteam::_UpdatesPending = 1000000; /* Forces filter to reset */
|
||||||
|
|
||||||
void FGSteam::update (double dt)
|
void FGSteam::update (double dt)
|
||||||
{
|
{
|
||||||
int timesteps = int(dt * fgGetInt("/sim/model-hz")); // FIXME
|
|
||||||
if (!isTied) {
|
if (!isTied) {
|
||||||
isTied = true;
|
isTied = true;
|
||||||
fgTie("/steam/airspeed-kt", FGSteam::get_ASI_kias);
|
fgTie("/steam/airspeed-kt", FGSteam::get_ASI_kias);
|
||||||
|
@ -128,7 +133,7 @@ void FGSteam::update (double dt)
|
||||||
fgTie("/steam/mag-compass-deg", FGSteam::get_MH_deg);
|
fgTie("/steam/mag-compass-deg", FGSteam::get_MH_deg);
|
||||||
fgSetArchivable("/steam/mag-compass-deg");
|
fgSetArchivable("/steam/mag-compass-deg");
|
||||||
}
|
}
|
||||||
_UpdatesPending += timesteps;
|
_UpdateTimePending += dt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -200,9 +205,15 @@ double altFtToPressInHg(double alt_ft)
|
||||||
|
|
||||||
|
|
||||||
void FGSteam::_CatchUp()
|
void FGSteam::_CatchUp()
|
||||||
{ if ( _UpdatesPending != 0 )
|
{
|
||||||
{ double dt = _UpdatesPending * 1.0 /
|
static const SGPropertyNode *heading_deg_node = fgGetNode("/orientation/heading-deg", true);
|
||||||
fgGetInt("/sim/model-hz"); // FIXME: inefficient
|
static const SGPropertyNode *mag_var_deg_node = fgGetNode("/environment/magnetic-variation-deg", true);
|
||||||
|
static const SGPropertyNode *mag_dip_deg_node = fgGetNode("/environment/magnetic-dip-deg", true);
|
||||||
|
static const SGPropertyNode *enginge_0_rpm_node = fgGetNode("/engines/engine[0]/rpm", true);
|
||||||
|
|
||||||
|
if ( _UpdateTimePending != 0 )
|
||||||
|
{
|
||||||
|
double dt = _UpdateTimePending;
|
||||||
double AccN, AccE, AccU;
|
double AccN, AccE, AccU;
|
||||||
/* int i, j; */
|
/* int i, j; */
|
||||||
double d, the_ENGINE_rpm;
|
double d, the_ENGINE_rpm;
|
||||||
|
@ -252,20 +263,20 @@ void FGSteam::_CatchUp()
|
||||||
AccN = current_aircraft.fdm_state->get_V_dot_north();
|
AccN = current_aircraft.fdm_state->get_V_dot_north();
|
||||||
AccE = current_aircraft.fdm_state->get_V_dot_east();
|
AccE = current_aircraft.fdm_state->get_V_dot_east();
|
||||||
AccU = current_aircraft.fdm_state->get_V_dot_down()
|
AccU = current_aircraft.fdm_state->get_V_dot_down()
|
||||||
- 9.81 / 0.3;
|
- 9.81 * SG_METER_TO_FEET;
|
||||||
if ( fabs(the_TC_rad) > 0.2 /* 2.0 */ )
|
if ( fabs(the_TC_rad) > 0.2 /* 2.0 */ )
|
||||||
{ /* Massive sideslip jams it; it stops turning */
|
{ /* Massive sideslip jams it; it stops turning */
|
||||||
the_MH_degps = 0.0;
|
the_MH_degps = 0.0;
|
||||||
the_MH_err = fgGetDouble("/orientation/heading-deg") - the_MH_deg;
|
the_MH_err = heading_deg_node->getDoubleValue() - the_MH_deg;
|
||||||
} else
|
} else
|
||||||
{ double MagDip, MagVar, CosDip;
|
{ double MagDip, MagVar, CosDip;
|
||||||
double FrcN, FrcE, FrcU, AccTot;
|
double FrcN, FrcE, FrcU, AccTot;
|
||||||
double EdgN, EdgE, EdgU;
|
double EdgN, EdgE, EdgU;
|
||||||
double TrqN, TrqE, TrqU, Torque;
|
double TrqN, TrqE, TrqU, Torque;
|
||||||
/* Find a force vector towards exact magnetic north */
|
/* Find a force vector towards exact magnetic north */
|
||||||
MagVar = fgGetDouble("/environment/magnetic-variation-deg")
|
MagVar = mag_var_deg_node->getDoubleValue()
|
||||||
/ SGD_RADIANS_TO_DEGREES;
|
/ SGD_RADIANS_TO_DEGREES;
|
||||||
MagDip = fgGetDouble("/environment/magnetic-dip-deg")
|
MagDip = mag_var_deg_node->getDoubleValue()
|
||||||
/ SGD_RADIANS_TO_DEGREES;
|
/ SGD_RADIANS_TO_DEGREES;
|
||||||
CosDip = cos ( MagDip );
|
CosDip = cos ( MagDip );
|
||||||
FrcN = CosDip * cos ( MagVar );
|
FrcN = CosDip * cos ( MagVar );
|
||||||
|
@ -296,7 +307,7 @@ void FGSteam::_CatchUp()
|
||||||
}
|
}
|
||||||
if ( the_MH_err > 180.0 ) the_MH_err -= 360.0; else
|
if ( the_MH_err > 180.0 ) the_MH_err -= 360.0; else
|
||||||
if ( the_MH_err < -180.0 ) the_MH_err += 360.0;
|
if ( the_MH_err < -180.0 ) the_MH_err += 360.0;
|
||||||
the_MH_deg = fgGetDouble("/orientation/heading-deg") - the_MH_err;
|
the_MH_deg = heading_deg_node->getDoubleValue() - the_MH_err;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**************************
|
/**************************
|
||||||
|
@ -304,16 +315,24 @@ void FGSteam::_CatchUp()
|
||||||
scaling capability for the vacuum pump later on.
|
scaling capability for the vacuum pump later on.
|
||||||
When we have a real engine model, we can ask it.
|
When we have a real engine model, we can ask it.
|
||||||
*/
|
*/
|
||||||
the_ENGINE_rpm = globals->get_controls()->get_throttle(0) * 26.0;
|
the_ENGINE_rpm = enginge_0_rpm_node->getDoubleValue();
|
||||||
|
|
||||||
/**************************
|
/**************************
|
||||||
First, we need to know what the static line is reporting,
|
First, we need to know what the static line is reporting,
|
||||||
which is a whole simulation area in itself. For now, we cheat.
|
which is a whole simulation area in itself.
|
||||||
We filter the actual value by one second to
|
We filter the actual value by one second to
|
||||||
account for the line impedance of the plumbing.
|
account for the line impedance of the plumbing.
|
||||||
*/
|
*/
|
||||||
double static_inhg
|
#ifdef FG_WEATHERCM
|
||||||
= altFtToPressInHg(fgGetDouble("/position/altitude-ft"));
|
sgVec3 plane_pos = { cur_fdm_state->get_Latitude(),
|
||||||
|
cur_fdm_state->get_Longitude(),
|
||||||
|
cur_fdm_state->get_Altitude() * SG_FEET_TO_METER };
|
||||||
|
double static_inhg = WeatherDatabase->get(plane_pos).AirPressure *
|
||||||
|
(0.01 / INHG_TO_MB);
|
||||||
|
#else
|
||||||
|
double static_inhg = fgGetDouble("/environment/pressure-inhg");
|
||||||
|
#endif
|
||||||
|
|
||||||
set_lowpass ( & the_STATIC_inhg, static_inhg, dt );
|
set_lowpass ( & the_STATIC_inhg, static_inhg, dt );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -372,16 +391,16 @@ void FGSteam::_CatchUp()
|
||||||
> have it tumble when you exceed the usual pitch or bank limits,
|
> have it tumble when you exceed the usual pitch or bank limits,
|
||||||
> put in those insidious turning errors ... for now anyway.
|
> put in those insidious turning errors ... for now anyway.
|
||||||
*/
|
*/
|
||||||
if ( _UpdatesPending > 999999 )
|
if ( _UpdateTimePending > 999999 )
|
||||||
the_DG_err = fgGetDouble("/environment/magnetic-variation-deg");
|
the_DG_err = fgGetDouble("/environment/magnetic-variation-deg");
|
||||||
the_DG_degps = 0.01; /* HACK! */
|
the_DG_degps = 0.01; /* HACK! */
|
||||||
if (dt<1.0) the_DG_err += dt * the_DG_degps;
|
if (dt<1.0) the_DG_err += dt * the_DG_degps;
|
||||||
the_DG_deg = fgGetDouble("/orientation/heading-deg") - the_DG_err;
|
the_DG_deg = heading_deg_node->getDoubleValue() - the_DG_err;
|
||||||
|
|
||||||
/**************************
|
/**************************
|
||||||
Finished updates, now clear the timer
|
Finished updates, now clear the timer
|
||||||
*/
|
*/
|
||||||
_UpdatesPending = 0;
|
_UpdateTimePending = 0;
|
||||||
} else {
|
} else {
|
||||||
// cout << "0 Updates pending" << endl;
|
// cout << "0 Updates pending" << endl;
|
||||||
}
|
}
|
||||||
|
|
|
@ -92,7 +92,7 @@ private:
|
||||||
static double the_MH_deg, the_MH_degps, the_MH_err;
|
static double the_MH_deg, the_MH_degps, the_MH_err;
|
||||||
static double the_DG_deg, the_DG_degps, the_DG_inhg, the_DG_err;
|
static double the_DG_deg, the_DG_degps, the_DG_inhg, the_DG_err;
|
||||||
|
|
||||||
static int _UpdatesPending;
|
static double _UpdateTimePending;
|
||||||
static void _CatchUp ();
|
static void _CatchUp ();
|
||||||
|
|
||||||
static void set_lowpass ( double *outthe,
|
static void set_lowpass ( double *outthe,
|
||||||
|
|
Loading…
Add table
Reference in a new issue