+FGEnvironment & FGEnvironment::operator = ( const FGEnvironment & other )
+{
+ copy( other );
+ return *this;
+}
+
+void
+FGEnvironment::copy (const FGEnvironment &env)
+{
+ elevation_ft = env.elevation_ft;
+ visibility_m = env.visibility_m;
+ temperature_sea_level_degc = env.temperature_sea_level_degc;
+ temperature_degc = env.temperature_degc;
+ dewpoint_sea_level_degc = env.dewpoint_sea_level_degc;
+ dewpoint_degc = env.dewpoint_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;
+ turbulence_magnitude_norm = env.turbulence_magnitude_norm;
+ turbulence_rate_hz = env.turbulence_rate_hz;
+}
+
+static inline bool
+maybe_copy_value (FGEnvironment * env, const SGPropertyNode * node,
+ const char * name, void (FGEnvironment::*setter)(double))
+{
+ const SGPropertyNode * child = node->getNode(name);
+ // fragile: depends on not being typed
+ // as a number
+ if (child != 0 && child->hasValue() &&
+ child->getStringValue()[0] != '\0') {
+ (env->*setter)(child->getDoubleValue());
+ return true;
+ } else {
+ return false;
+ }
+}
+
+void
+FGEnvironment::read (const SGPropertyNode * node)
+{
+ bool live_update = set_live_update( false );
+ maybe_copy_value(this, node, "visibility-m",
+ &FGEnvironment::set_visibility_m);
+
+ maybe_copy_value(this, node, "elevation-ft",
+ &FGEnvironment::set_elevation_ft);
+
+ if (!maybe_copy_value(this, node, "temperature-sea-level-degc",
+ &FGEnvironment::set_temperature_sea_level_degc)) {
+ if( maybe_copy_value(this, node, "temperature-degc",
+ &FGEnvironment::set_temperature_degc)) {
+ _recalc_sl_temperature();
+ }
+ }
+
+ if (!maybe_copy_value(this, node, "dewpoint-sea-level-degc",
+ &FGEnvironment::set_dewpoint_sea_level_degc)) {
+ if( maybe_copy_value(this, node, "dewpoint-degc",
+ &FGEnvironment::set_dewpoint_degc)) {
+ _recalc_sl_dewpoint();
+ }
+ }
+
+ if (!maybe_copy_value(this, node, "pressure-sea-level-inhg",
+ &FGEnvironment::set_pressure_sea_level_inhg)) {
+ if( maybe_copy_value(this, node, "pressure-inhg",
+ &FGEnvironment::set_pressure_inhg)) {
+ _recalc_sl_pressure();
+ }
+ }
+
+ maybe_copy_value(this, node, "wind-from-heading-deg",
+ &FGEnvironment::set_wind_from_heading_deg);
+
+ maybe_copy_value(this, node, "wind-speed-kt",
+ &FGEnvironment::set_wind_speed_kt);
+
+ maybe_copy_value(this, node, "turbulence/magnitude-norm",
+ &FGEnvironment::set_turbulence_magnitude_norm);
+
+ maybe_copy_value(this, node, "turbulence/rate-hz",
+ &FGEnvironment::set_turbulence_rate_hz);
+
+ // calculate derived properties here to avoid duplicate expensive computations
+ _recalc_ne();
+ _recalc_alt_pt();
+ _recalc_alt_dewpoint();
+ _recalc_density();
+ _recalc_relative_humidity();
+
+ set_live_update(live_update);
+}
+
+void FGEnvironment::Tie( SGPropertyNode_ptr base, bool archivable )
+{
+ _tiedProperties.setRoot( base );
+
+ _tiedProperties.Tie( "visibility-m", this,
+ &FGEnvironment::get_visibility_m,
+ &FGEnvironment::set_visibility_m)
+ ->setAttribute( SGPropertyNode::ARCHIVE, archivable );
+
+ _tiedProperties.Tie("temperature-sea-level-degc", this,
+ &FGEnvironment::get_temperature_sea_level_degc,
+ &FGEnvironment::set_temperature_sea_level_degc)
+ ->setAttribute( SGPropertyNode::ARCHIVE, archivable );
+
+ _tiedProperties.Tie("temperature-degc", this,
+ &FGEnvironment::get_temperature_degc,
+ &FGEnvironment::set_temperature_degc)
+ ->setAttribute( SGPropertyNode::ARCHIVE, archivable );
+
+ _tiedProperties.Tie("temperature-degf", this,
+ &FGEnvironment::get_temperature_degf);
+
+ _tiedProperties.Tie("dewpoint-sea-level-degc", this,
+ &FGEnvironment::get_dewpoint_sea_level_degc,
+ &FGEnvironment::set_dewpoint_sea_level_degc)
+ ->setAttribute( SGPropertyNode::ARCHIVE, archivable );
+
+ _tiedProperties.Tie("dewpoint-degc", this,
+ &FGEnvironment::get_dewpoint_degc,
+ &FGEnvironment::set_dewpoint_degc)
+ ->setAttribute( SGPropertyNode::ARCHIVE, archivable );
+
+ _tiedProperties.Tie("pressure-sea-level-inhg", this,
+ &FGEnvironment::get_pressure_sea_level_inhg,
+ &FGEnvironment::set_pressure_sea_level_inhg)
+ ->setAttribute( SGPropertyNode::ARCHIVE, archivable );
+
+ _tiedProperties.Tie("pressure-inhg", this,
+ &FGEnvironment::get_pressure_inhg,
+ &FGEnvironment::set_pressure_inhg)
+ ->setAttribute( SGPropertyNode::ARCHIVE, archivable );
+
+ _tiedProperties.Tie("density-slugft3", this,
+ &FGEnvironment::get_density_slugft3); // read-only
+
+ _tiedProperties.Tie("relative-humidity", this,
+ &FGEnvironment::get_relative_humidity); //ro
+
+ _tiedProperties.Tie("atmosphere/density-tropo-avg", this,
+ &FGEnvironment::get_density_tropo_avg_kgm3); //ro
+
+ _tiedProperties.Tie("atmosphere/altitude-half-to-sun", this,
+ &FGEnvironment::get_altitude_half_to_sun_m,
+ &FGEnvironment::set_altitude_half_to_sun_m)
+ ->setAttribute( SGPropertyNode::ARCHIVE, archivable );
+
+ _tiedProperties.Tie("atmosphere/altitude-troposphere-top", this,
+ &FGEnvironment::get_altitude_tropo_top_m,
+ &FGEnvironment::set_altitude_tropo_top_m)
+ ->setAttribute( SGPropertyNode::ARCHIVE, archivable );
+
+ _tiedProperties.Tie("wind-from-heading-deg", this,
+ &FGEnvironment::get_wind_from_heading_deg,
+ &FGEnvironment::set_wind_from_heading_deg)
+ ->setAttribute( SGPropertyNode::ARCHIVE, archivable );
+
+ _tiedProperties.Tie("wind-speed-kt", this,
+ &FGEnvironment::get_wind_speed_kt,
+ &FGEnvironment::set_wind_speed_kt)
+ ->setAttribute( SGPropertyNode::ARCHIVE, archivable );
+
+ _tiedProperties.Tie("wind-from-north-fps", this,
+ &FGEnvironment::get_wind_from_north_fps,
+ &FGEnvironment::set_wind_from_north_fps)
+ ->setAttribute( SGPropertyNode::ARCHIVE, archivable );
+
+ _tiedProperties.Tie("wind-from-east-fps", this,
+ &FGEnvironment::get_wind_from_east_fps,
+ &FGEnvironment::set_wind_from_east_fps)
+ ->setAttribute( SGPropertyNode::ARCHIVE, archivable );
+
+ _tiedProperties.Tie("wind-from-down-fps", this,
+ &FGEnvironment::get_wind_from_down_fps,
+ &FGEnvironment::set_wind_from_down_fps)
+ ->setAttribute( SGPropertyNode::ARCHIVE, archivable );
+
+ _tiedProperties.Tie("turbulence/magnitude-norm", this,
+ &FGEnvironment::get_turbulence_magnitude_norm,
+ &FGEnvironment::set_turbulence_magnitude_norm)
+ ->setAttribute( SGPropertyNode::ARCHIVE, archivable );
+
+ _tiedProperties.Tie("turbulence/rate-hz", this,
+ &FGEnvironment::get_turbulence_rate_hz,
+ &FGEnvironment::set_turbulence_rate_hz)
+ ->setAttribute( SGPropertyNode::ARCHIVE, archivable );
+}
+
+void FGEnvironment::Untie()
+{
+ _tiedProperties.Untie();
+}