]> git.mxchange.org Git - flightgear.git/blob - src/Environment/environment_ctrl.cxx
Added an interface for an environment controller, together with a
[flightgear.git] / src / Environment / environment_ctrl.cxx
1 // environment_ctrl.cxx -- manager for natural environment information.
2 //
3 // Written by David Megginson, started February 2002.
4 //
5 // Copyright (C) 2002  David Megginson - david@megginson.com
6 //
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.
11 //
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.
16 //
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.
20 //
21 // $Id$
22
23 #include <simgear/debug/logstream.hxx>
24
25 #include <stdlib.h>
26 #include <Main/fg_props.hxx>
27
28 #include "environment_ctrl.hxx"
29
30
31 \f
32 ////////////////////////////////////////////////////////////////////////
33 // Implementation of FGEnvironmentCtrl abstract base class.
34 ////////////////////////////////////////////////////////////////////////
35
36 FGEnvironmentCtrl::FGEnvironmentCtrl ()
37   : _environment(0),
38     _lon_deg(0),
39     _lat_deg(0),
40     _elev_ft(0)
41 {
42 }
43
44 FGEnvironmentCtrl::~FGEnvironmentCtrl ()
45 {
46 }
47
48 void
49 FGEnvironmentCtrl::setEnvironment (FGEnvironment * environment)
50 {
51   _environment = environment;
52 }
53
54 void
55 FGEnvironmentCtrl::setLongitudeDeg (double lon_deg)
56 {
57   _lon_deg = lon_deg;
58 }
59
60 void
61 FGEnvironmentCtrl::setLatitudeDeg (double lat_deg)
62 {
63   _lat_deg = lat_deg;
64 }
65
66 void
67 FGEnvironmentCtrl::setElevationFt (double elev_ft)
68 {
69   _elev_ft = elev_ft;
70 }
71
72 void
73 FGEnvironmentCtrl::setPosition (double lon_deg, double lat_deg, double elev_ft)
74 {
75   _lon_deg = lon_deg;
76   _lat_deg = lat_deg;
77   _elev_ft = elev_ft;
78 }
79
80
81 \f
82 ////////////////////////////////////////////////////////////////////////
83 // Implementation of FGUserDefEnvironmentCtrl.
84 ////////////////////////////////////////////////////////////////////////
85
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)
91 {
92 }
93
94 FGUserDefEnvironmentCtrl::~FGUserDefEnvironmentCtrl ()
95 {
96 }
97
98 void
99 FGUserDefEnvironmentCtrl::init ()
100 {
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"));
108
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);
113
114   _current_wind_speed_kt = _base_wind_speed_node->getDoubleValue();
115   _delta_wind_speed_kt = 0.1;
116 }
117
118 void
119 FGUserDefEnvironmentCtrl::update (int dt)
120 {
121   double base_wind_speed = _base_wind_speed_node->getDoubleValue();
122   double gust_wind_speed = _gust_wind_speed_node->getDoubleValue();
123
124   if (base_wind_speed == gust_wind_speed) {
125     _current_wind_speed_kt = base_wind_speed;
126   } else {
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;
131
132     if (rn == 0)
133       _delta_wind_speed_kt = - _delta_wind_speed_kt;
134     else if (rn < 4)
135       _delta_wind_speed_kt -= incr * sign;
136     else if (rn < 16)
137       _delta_wind_speed_kt += incr * sign;
138
139     _current_wind_speed_kt += _delta_wind_speed_kt;
140
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;
147     }
148   }
149   
150   if (_environment != 0)
151     _environment->set_wind_speed_kt(_current_wind_speed_kt);
152 }
153
154 // end of environment_ctrl.cxx