1
0
Fork 0

Environment manager overhaul -- return a copy of an FGEnvironment

object rather than a pointer.

FGEnvironment now has the beginning of an atmospheric model, and will
recalculate temperature (not pressure or density, yet) based on
elevation.

FGEnvironment has a copy constructor.
This commit is contained in:
david 2002-05-11 23:23:42 +00:00
parent f8df8ecda9
commit 49bb3306d9
6 changed files with 135 additions and 22 deletions

View file

@ -52,6 +52,18 @@ FGEnvironment::FGEnvironment()
{
}
FGEnvironment::FGEnvironment (const FGEnvironment &env)
: elevation_ft(env.elevation_ft),
visibility_m(env.visibility_m),
temperature_sea_level_degc(env.temperature_sea_level_degc),
pressure_sea_level_inhg(env.pressure_sea_level_inhg),
wind_from_heading_deg(env.wind_from_heading_deg),
wind_speed_kt(env.wind_speed_kt),
wind_from_north_fps(env.wind_from_north_fps),
wind_from_east_fps(env.wind_from_east_fps),
wind_from_down_fps(env.wind_from_down_fps)
{
}
FGEnvironment::~FGEnvironment()
{
@ -70,12 +82,24 @@ FGEnvironment::get_temperature_sea_level_degc () const
return temperature_sea_level_degc;
}
double
FGEnvironment::get_temperature_degc () const
{
return temperature_degc;
}
double
FGEnvironment::get_pressure_sea_level_inhg () const
{
return pressure_sea_level_inhg;
}
double
FGEnvironment::get_pressure_inhg () const
{
return pressure_inhg;
}
double
FGEnvironment::get_wind_from_heading_deg () const
{
@ -106,6 +130,12 @@ FGEnvironment::get_wind_from_down_fps () const
return wind_from_down_fps;
}
double
FGEnvironment::get_elevation_ft () const
{
return elevation_ft;
}
void
@ -118,12 +148,28 @@ void
FGEnvironment::set_temperature_sea_level_degc (double t)
{
temperature_sea_level_degc = t;
_recalc_alt_temp();
}
void
FGEnvironment::set_temperature_degc (double t)
{
temperature_degc = t;
_recalc_sl_temp();
}
void
FGEnvironment::set_pressure_sea_level_inhg (double p)
{
pressure_sea_level_inhg = p;
_recalc_alt_press();
}
void
FGEnvironment::set_pressure_inhg (double p)
{
pressure_inhg = p;
_recalc_sl_press();
}
void
@ -161,6 +207,14 @@ FGEnvironment::set_wind_from_down_fps (double d)
_recalc_hdgspd();
}
void
FGEnvironment::set_elevation_ft (double e)
{
elevation_ft = e;
_recalc_alt_temp();
_recalc_alt_press();
}
void
FGEnvironment::_recalc_hdgspd ()
{
@ -196,5 +250,48 @@ FGEnvironment::_recalc_ne ()
sin(wind_from_heading_deg * SGD_DEGREES_TO_RADIANS);
}
void
FGEnvironment::_recalc_sl_temp ()
{
// Earth atmosphere model from
// http://www.grc.nasa.gov/WWW/K-12/airplane/atmos.html
// Stratospheric temperatures are not really reversible, so use 15degC.
if (elevation_ft < 36152) // Troposphere
temperature_sea_level_degc =
temperature_degc + (.00649 * SG_FEET_TO_METER * elevation_ft);
// If we're in the stratosphere, leave sea-level temp alone
}
void
FGEnvironment::_recalc_alt_temp ()
{
// Earth atmosphere model from
// http://www.grc.nasa.gov/WWW/K-12/airplane/atmos.html
if (elevation_ft < 36152) // Troposphere
temperature_degc =
temperature_sea_level_degc - (.00649 * SG_FEET_TO_METER * elevation_ft);
else if (elevation_ft < 82345) // Lower Stratosphere
temperature_degc = -56.46;
else
temperature_degc = -131.21 + (.00299 * SG_FEET_TO_METER * elevation_ft);
}
void
FGEnvironment::_recalc_sl_press ()
{
// FIXME: calculate properly
pressure_sea_level_inhg = pressure_inhg;
}
void
FGEnvironment::_recalc_alt_press ()
{
// FIXME: calculate properly
pressure_inhg = pressure_sea_level_inhg;
}
// end of environment.cxx

View file

@ -49,11 +49,14 @@ class FGEnvironment
public:
FGEnvironment();
FGEnvironment (const FGEnvironment &environment);
virtual ~FGEnvironment();
virtual double get_visibility_m () const;
virtual double get_temperature_sea_level_degc () const;
virtual double get_temperature_degc () const;
virtual double get_pressure_sea_level_inhg () const;
virtual double get_pressure_inhg () const;
virtual double get_wind_from_heading_deg () const;
virtual double get_wind_speed_kt () const;
virtual double get_wind_from_north_fps () const;
@ -62,21 +65,38 @@ public:
virtual void set_visibility_m (double v);
virtual void set_temperature_sea_level_degc (double t);
virtual void set_temperature_degc (double t);
virtual void set_pressure_sea_level_inhg (double p);
virtual void set_pressure_inhg (double p);
virtual void set_wind_from_heading_deg (double h);
virtual void set_wind_speed_kt (double s);
virtual void set_wind_from_north_fps (double n);
virtual void set_wind_from_east_fps (double e);
virtual void set_wind_from_down_fps (double d);
protected:
friend class FGEnvironmentMgr;
virtual double get_elevation_ft () const;
virtual void set_elevation_ft (double elevation_ft);
private:
void _recalc_hdgspd ();
void _recalc_ne ();
void _recalc_sl_temp ();
void _recalc_alt_temp ();
void _recalc_sl_press ();
void _recalc_alt_press ();
double elevation_ft;
double visibility_m;
double temperature_sea_level_degc;
double temperature_degc;
double pressure_sea_level_inhg;
double pressure_inhg;
double wind_from_heading_deg;
double wind_speed_kt;

View file

@ -60,10 +60,18 @@ FGEnvironmentMgr::bind ()
&FGEnvironment::get_temperature_sea_level_degc,
&FGEnvironment::set_temperature_sea_level_degc);
fgSetArchivable("/environment/temperature-sea-level-degc");
fgTie("/environment/temperature-degc", _environment,
&FGEnvironment::get_temperature_degc,
&FGEnvironment::set_temperature_degc);
fgSetArchivable("/environment/temperature-degc");
fgTie("/environment/pressure-sea-level-inhg", _environment,
&FGEnvironment::get_pressure_sea_level_inhg,
&FGEnvironment::set_pressure_sea_level_inhg);
fgSetArchivable("/environment/pressure-sea-level-inhg");
fgTie("/environment/pressure-inhg", _environment,
&FGEnvironment::get_pressure_inhg,
&FGEnvironment::set_pressure_inhg);
fgSetArchivable("/environment/pressure-inhg");
fgTie("/environment/wind-from-heading-deg", _environment,
&FGEnvironment::get_wind_from_heading_deg,
&FGEnvironment::set_wind_from_heading_deg);
@ -103,21 +111,24 @@ FGEnvironmentMgr::update (double dt)
->set_Velocities_Local_Airmass(_environment->get_wind_from_north_fps(),
_environment->get_wind_from_east_fps(),
_environment->get_wind_from_down_fps());
_environment->set_elevation_ft(fgGetDouble("/position/altitude-ft"));
}
const FGEnvironment *
FGEnvironment
FGEnvironmentMgr::getEnvironment () const
{
return _environment;
return *_environment;
}
const FGEnvironment *
FGEnvironment
FGEnvironmentMgr::getEnvironment (double lat, double lon, double alt) const
{
// Always returns the same environment
// for now; we'll make it interesting
// later.
return _environment;
FGEnvironment env = *_environment;
env.set_elevation_ft(alt);
return env;
}
// end of environment-mgr.cxx

View file

@ -56,14 +56,14 @@ public:
/**
* Get the environment information for the plane's current position.
*/
virtual const FGEnvironment * getEnvironment () const;
virtual FGEnvironment getEnvironment () const;
/**
* Get the environment information for another location.
*/
virtual const FGEnvironment * getEnvironment (double lat, double lon,
double alt) const;
virtual FGEnvironment getEnvironment (double lat, double lon,
double alt) const;
private:

View file

@ -90,18 +90,6 @@ FGGlobals::restoreInitialState ()
}
}
const FGEnvironment *
FGGlobals::get_environment () const
{
return environment_mgr->getEnvironment();
}
const FGEnvironment *
FGGlobals::get_environment (double lat, double lon, double alt) const
{
return environment_mgr->getEnvironment(lat, lon, alt);
}
FGViewer *
FGGlobals::get_current_view () const
{

View file

@ -228,9 +228,6 @@ public:
inline void set_environment_mgr(FGEnvironmentMgr * mgr) {
environment_mgr = mgr;
}
const FGEnvironment * get_environment() const;
const FGEnvironment * get_environment(double lat, double lon,
double alt) const;
inline FGATCMgr *get_ATC_mgr() const { return ATC_mgr; }
inline void set_ATC_mgr( FGATCMgr *a ) {ATC_mgr = a; }