]> git.mxchange.org Git - flightgear.git/blob - src/Environment/environment_ctrl.hxx
ca096e38390dcc13e2ae79f6d1bd69ebbd013e4c
[flightgear.git] / src / Environment / environment_ctrl.hxx
1 // environment-ctrl.hxx -- controller for environment information.
2 //
3 // Written by David Megginson, started May 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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
20 //
21 // $Id$
22
23 #ifndef _ENVIRONMENT_CTRL_HXX
24 #define _ENVIRONMENT_CTRL_HXX
25
26 #include <simgear/compiler.h>
27 #include <simgear/structure/subsystem_mgr.hxx>
28
29 #if defined(ENABLE_THREADS)
30 # include <OpenThreads/Thread>
31 # include <simgear/threads/SGQueue.hxx>
32 #endif
33
34 #include <queue>
35 #include <vector>
36
37 #include <Navaids/positioned.hxx>
38 #include <Environment/environment.hxx>
39
40 // forward decls
41 class SGPropertyNode;
42 class FGMetar;
43
44 /**
45  * Interface to control environment information for a specific location.
46  */
47 class FGEnvironmentCtrl : public SGSubsystem
48 {
49
50 public:
51
52   FGEnvironmentCtrl ();
53   virtual ~FGEnvironmentCtrl ();
54
55   virtual void setEnvironment (FGEnvironment * environment);
56
57   virtual const FGEnvironment * getEnvironment () const { return _environment; }
58
59   virtual void setLongitudeDeg (double lon_deg);
60   virtual void setLatitudeDeg (double lat_deg);
61   virtual void setElevationFt (double elev_ft);
62   virtual void setPosition (double lon_deg, double lat_deg, double elev_ft);
63
64   virtual double getLongitudeDeg () const { return _lon_deg; }
65   virtual double getLatitudeDeg () const { return _lat_deg; }
66   virtual double getElevationFt () const { return _elev_ft; }
67
68 protected:
69
70   FGEnvironment * _environment;
71   double _lon_deg;
72   double _lat_deg;
73   double _elev_ft;
74
75 };
76
77
78 \f
79 /**
80  * Interplation controller using user-supplied parameters.
81  */
82 class FGInterpolateEnvironmentCtrl : public FGEnvironmentCtrl
83 {
84 public:
85     FGInterpolateEnvironmentCtrl ();
86     virtual ~FGInterpolateEnvironmentCtrl ();
87     
88     virtual void init ();
89     virtual void reinit ();
90     virtual void update (double delta_time_sec);
91
92 private:
93     
94     struct bucket {
95         double altitude_ft;
96         FGEnvironment environment;
97         bool operator< (const bucket &b) const;
98         // LessThan predicate for bucket pointers.
99         static bool lessThan(bucket *a, bucket *b);
100     };
101
102     void read_table (const SGPropertyNode * node, std::vector<bucket *> &table);
103     void do_interpolate (std::vector<bucket *> &table, double altitude_ft,
104                          FGEnvironment * environment);
105
106     FGEnvironment env1, env2;   // temporaries
107
108     std::vector<bucket *> _boundary_table;
109     std::vector<bucket *> _aloft_table;
110
111         SGPropertyNode_ptr altitude_n;
112         SGPropertyNode_ptr altitude_agl_n;
113         SGPropertyNode_ptr boundary_transition_n;
114         SGPropertyNode_ptr boundary_n;
115         SGPropertyNode_ptr aloft_n;
116 };
117
118
119 \f
120 /**
121  * Interplation controller using the FGMetar class
122  */
123
124 class FGMetarCtrl : public SGSubsystem
125 {
126 public:
127     FGMetarCtrl (SGSubsystem * environmentCtrl);
128     virtual ~FGMetarCtrl ();
129
130     virtual void init ();
131     virtual void reinit ();
132     virtual void update (double delta_time_sec);
133
134     void set_metar( const char * metar );
135     const char * get_metar(void) const;
136         bool get_valid(void) const { return metar_valid; }
137         void set_enabled(bool _enabled) { enabled = _enabled; }
138         bool get_enabled(void) const { return enabled; }
139         void set_setup_winds_aloft(bool _setup_winds_aloft) { setup_winds_aloft = _setup_winds_aloft; }
140         bool get_setup_winds_aloft(void) const { return setup_winds_aloft; }
141
142 private:
143         void bind();
144         void unbind();
145     bool metar_valid;
146     bool enabled;
147         bool setup_winds_aloft;
148     bool first_update;
149     double station_elevation_ft;
150     string metar;
151     double interpolate_prop(const char * currentname, const char * requiredname, double dvalue);
152     double interpolate_val(double currentval, double requiredval, double dvalue);
153     const double EnvironmentUpdatePeriodSec;    // Seconds between interpolations
154     const double MaxWindChangeKtsSec;           // Max wind change in kts/sec
155     const double MaxVisChangePercentSec;        // Max visibility change in %/sec
156     const double MaxPressureChangeInHgSec;      // Max pressure change in InHg/sec
157     const double MaxCloudAltitudeChangeFtSec;   // Max cloud altitude change in ft/s
158     const double MaxCloudThicknessChangeFtSec;  // Max cloud thickness change in ft/s
159     const double MaxCloudInterpolationHeightFt; // Max distance from aircraft to
160                                                 // interpolate at. Any cloud
161                                                 // changes above this height
162                                                 // difference are not interpolated
163     const double MaxCloudInterpolationDeltaFt;  // Max difference in altitude to 
164                                                 // interpolate. Any cloud changing height
165                                                 // by more than this value is not 
166                                                 // interpolated
167
168     SGSubsystem * _environmentCtrl;
169
170     SGPropertyNode_ptr metar_base_n;
171     SGPropertyNode_ptr station_id_n;
172     SGPropertyNode_ptr station_elevation_n;
173     SGPropertyNode_ptr min_visibility_n;
174     SGPropertyNode_ptr max_visibility_n;
175     SGPropertyNode_ptr base_wind_range_from_n;
176     SGPropertyNode_ptr base_wind_range_to_n;
177     SGPropertyNode_ptr base_wind_dir_n;
178     SGPropertyNode_ptr base_wind_speed_n;
179     SGPropertyNode_ptr gust_wind_speed_n;
180     SGPropertyNode_ptr temperature_n;
181     SGPropertyNode_ptr dewpoint_n;
182     SGPropertyNode_ptr humidity_n;
183     SGPropertyNode_ptr pressure_n;
184     SGPropertyNode_ptr clouds_n;
185     SGPropertyNode_ptr environment_clouds_n;
186     SGPropertyNode_ptr rain_n;
187     SGPropertyNode_ptr hail_n;
188     SGPropertyNode_ptr snow_n;
189     SGPropertyNode_ptr snow_cover_n;
190     SGPropertyNode_ptr ground_elevation_n;
191     SGPropertyNode_ptr longitude_n;
192     SGPropertyNode_ptr latitude_n;
193
194     SGPropertyNode_ptr boundary_wind_speed_n;
195     SGPropertyNode_ptr boundary_wind_from_heading_n;
196     SGPropertyNode_ptr boundary_visibility_n;
197     SGPropertyNode_ptr boundary_sea_level_pressure_n;
198 private:
199
200 };
201
202 /*
203  * The subsyste to load real world weather
204  */
205 class FGMetarFetcher : public SGSubsystem
206 {
207 public:
208     FGMetarFetcher();
209     virtual ~FGMetarFetcher();
210
211     virtual void init ();
212     virtual void reinit ();
213     virtual void update (double delta_time_sec);
214
215 private:
216     friend class MetarThread;
217 #if defined(ENABLE_THREADS)
218     /**
219      * FIFO queue which holds a pointer to the metar requests.
220      */
221     SGBlockingQueue <string> request_queue;
222
223     OpenThreads::Thread * metar_thread;
224 #endif
225
226     void fetch( const string & id );
227
228     SGPropertyNode_ptr enable_n;
229
230     SGPropertyNode_ptr longitude_n;
231     SGPropertyNode_ptr latitude_n;
232
233     SGPropertyNode_ptr proxy_host_n;
234     SGPropertyNode_ptr proxy_port_n;
235     SGPropertyNode_ptr proxy_auth_n;
236     SGPropertyNode_ptr max_age_n;
237
238     SGPropertyNode_ptr output_n;
239
240     string current_airport_id;
241     double fetch_timer;
242     double search_timer;
243     double error_timer;
244
245     long _stale_count;
246     long _error_count;
247 };
248
249
250 #endif // _ENVIRONMENT_CTRL_HXX