1 // environment_ctrl.cxx -- manager for natural environment information.
3 // Written by David Megginson, started February 2002.
5 // Copyright (C) 2002 David Megginson - david@megginson.com
7 // This program is free software; you can redistribute it and/or
8 // modify it under the terms of the GNU General Public License as
9 // published by the Free Software Foundation; either version 2 of the
10 // License, or (at your option) any later version.
12 // This program is distributed in the hope that it will be useful, but
13 // WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 // General Public License for more details.
17 // You should have received a copy of the GNU General Public License
18 // along with this program; if not, write to the Free Software
19 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 #include <simgear/debug/logstream.hxx>
26 #include <Main/fg_props.hxx>
28 #include "environment_ctrl.hxx"
32 ////////////////////////////////////////////////////////////////////////
33 // Implementation of FGEnvironmentCtrl abstract base class.
34 ////////////////////////////////////////////////////////////////////////
36 FGEnvironmentCtrl::FGEnvironmentCtrl ()
44 FGEnvironmentCtrl::~FGEnvironmentCtrl ()
49 FGEnvironmentCtrl::setEnvironment (FGEnvironment * environment)
51 _environment = environment;
55 FGEnvironmentCtrl::setLongitudeDeg (double lon_deg)
61 FGEnvironmentCtrl::setLatitudeDeg (double lat_deg)
67 FGEnvironmentCtrl::setElevationFt (double elev_ft)
73 FGEnvironmentCtrl::setPosition (double lon_deg, double lat_deg, double elev_ft)
82 ////////////////////////////////////////////////////////////////////////
83 // Implementation of FGUserDefEnvironmentCtrl.
84 ////////////////////////////////////////////////////////////////////////
86 FGUserDefEnvironmentCtrl::FGUserDefEnvironmentCtrl ()
87 : _base_wind_speed_node(0),
88 _gust_wind_speed_node(0),
89 _current_wind_speed_kt(0),
90 _delta_wind_speed_kt(0)
94 FGUserDefEnvironmentCtrl::~FGUserDefEnvironmentCtrl ()
99 FGUserDefEnvironmentCtrl::init ()
101 // Fill in some defaults.
102 if (!fgHasNode("/environment/params/base-wind-speed-kt"))
103 fgSetDouble("/environment/params/base-wind-speed-kt",
104 fgGetDouble("/environment/wind-speed-kt"));
105 if (!fgHasNode("/environment/params/gust-wind-speed-kt"))
106 fgSetDouble("/environment/params/gust-wind-speed-kt",
107 fgGetDouble("/environment/params/base-wind-speed-kt"));
109 _base_wind_speed_node =
110 fgGetNode("/environment/params/base-wind-speed-kt", true);
111 _gust_wind_speed_node =
112 fgGetNode("/environment/params/gust-wind-speed-kt", true);
114 _current_wind_speed_kt = _base_wind_speed_node->getDoubleValue();
115 _delta_wind_speed_kt = 0.1;
119 FGUserDefEnvironmentCtrl::update (double dt)
121 double base_wind_speed = _base_wind_speed_node->getDoubleValue();
122 double gust_wind_speed = _gust_wind_speed_node->getDoubleValue();
124 if (base_wind_speed == gust_wind_speed) {
125 _current_wind_speed_kt = base_wind_speed;
127 int rn = rand() % 128;
128 int sign = (_delta_wind_speed_kt < 0 ? -1 : 1);
129 double gust = _current_wind_speed_kt - base_wind_speed;
130 double incr = gust / 50;
133 _delta_wind_speed_kt = - _delta_wind_speed_kt;
135 _delta_wind_speed_kt -= incr * sign;
137 _delta_wind_speed_kt += incr * sign;
139 _current_wind_speed_kt += _delta_wind_speed_kt;
141 if (_current_wind_speed_kt < base_wind_speed) {
142 _current_wind_speed_kt = base_wind_speed;
143 _delta_wind_speed_kt = 0.01;
144 } else if (_current_wind_speed_kt > gust_wind_speed) {
145 _current_wind_speed_kt = gust_wind_speed;
146 _delta_wind_speed_kt = -0.01;
150 if (_environment != 0)
151 _environment->set_wind_speed_kt(_current_wind_speed_kt);
154 // end of environment_ctrl.cxx