From bf58dbd3c99b26929ee59081de459e04e2000140 Mon Sep 17 00:00:00 2001 From: david Date: Sun, 7 Jul 2002 13:29:52 +0000 Subject: [PATCH] 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 --- src/Cockpit/steam.cxx | 55 +++++++++++++++++++++++++++++-------------- src/Cockpit/steam.hxx | 2 +- 2 files changed, 38 insertions(+), 19 deletions(-) diff --git a/src/Cockpit/steam.cxx b/src/Cockpit/steam.cxx index e3ab19b95..2f3e64bf5 100644 --- a/src/Cockpit/steam.cxx +++ b/src/Cockpit/steam.cxx @@ -31,6 +31,12 @@ #include #include #include +#ifdef FG_WEATHERCM +# include +#else +# include +# include +#endif 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 @@ -100,7 +106,6 @@ int FGSteam::_UpdatesPending = 1000000; /* Forces filter to reset */ void FGSteam::update (double dt) { - int timesteps = int(dt * fgGetInt("/sim/model-hz")); // FIXME if (!isTied) { isTied = true; 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); fgSetArchivable("/steam/mag-compass-deg"); } - _UpdatesPending += timesteps; + _UpdateTimePending += dt; } @@ -200,9 +205,15 @@ double altFtToPressInHg(double alt_ft) void FGSteam::_CatchUp() -{ if ( _UpdatesPending != 0 ) - { double dt = _UpdatesPending * 1.0 / - fgGetInt("/sim/model-hz"); // FIXME: inefficient +{ + static const SGPropertyNode *heading_deg_node = fgGetNode("/orientation/heading-deg", true); + 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; /* int i, j; */ double d, the_ENGINE_rpm; @@ -252,20 +263,20 @@ void FGSteam::_CatchUp() AccN = current_aircraft.fdm_state->get_V_dot_north(); AccE = current_aircraft.fdm_state->get_V_dot_east(); 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 */ ) { /* Massive sideslip jams it; it stops turning */ 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 { double MagDip, MagVar, CosDip; double FrcN, FrcE, FrcU, AccTot; double EdgN, EdgE, EdgU; double TrqN, TrqE, TrqU, Torque; /* Find a force vector towards exact magnetic north */ - MagVar = fgGetDouble("/environment/magnetic-variation-deg") + MagVar = mag_var_deg_node->getDoubleValue() / SGD_RADIANS_TO_DEGREES; - MagDip = fgGetDouble("/environment/magnetic-dip-deg") + MagDip = mag_var_deg_node->getDoubleValue() / SGD_RADIANS_TO_DEGREES; CosDip = cos ( MagDip ); 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; - 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. 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, - 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 account for the line impedance of the plumbing. */ - double static_inhg - = altFtToPressInHg(fgGetDouble("/position/altitude-ft")); +#ifdef FG_WEATHERCM + 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 ); /* @@ -372,16 +391,16 @@ void FGSteam::_CatchUp() > have it tumble when you exceed the usual pitch or bank limits, > 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_degps = 0.01; /* HACK! */ 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 */ - _UpdatesPending = 0; + _UpdateTimePending = 0; } else { // cout << "0 Updates pending" << endl; } diff --git a/src/Cockpit/steam.hxx b/src/Cockpit/steam.hxx index e03a4ba71..87ea3bb67 100644 --- a/src/Cockpit/steam.hxx +++ b/src/Cockpit/steam.hxx @@ -92,7 +92,7 @@ private: 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 int _UpdatesPending; + static double _UpdateTimePending; static void _CatchUp (); static void set_lowpass ( double *outthe, -- 2.39.5