]> git.mxchange.org Git - flightgear.git/blob - src/Environment/environment_ctrl.hxx
Merge branch 'maint' into next
[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 FGAirport;
43 class FGMetar;
44
45 /**
46  * Interface to control environment information for a specific location.
47  */
48 class FGEnvironmentCtrl : public SGSubsystem
49 {
50
51 public:
52
53   FGEnvironmentCtrl ();
54   virtual ~FGEnvironmentCtrl ();
55
56   virtual void setEnvironment (FGEnvironment * environment);
57
58   virtual const FGEnvironment * getEnvironment () const { return _environment; }
59
60   virtual void setLongitudeDeg (double lon_deg);
61   virtual void setLatitudeDeg (double lat_deg);
62   virtual void setElevationFt (double elev_ft);
63   virtual void setPosition (double lon_deg, double lat_deg, double elev_ft);
64
65   virtual double getLongitudeDeg () const { return _lon_deg; }
66   virtual double getLatitudeDeg () const { return _lat_deg; }
67   virtual double getElevationFt () const { return _elev_ft; }
68
69 protected:
70
71   FGEnvironment * _environment;
72   double _lon_deg;
73   double _lat_deg;
74   double _elev_ft;
75
76 };
77
78
79 \f
80 /**
81  * Environment controller using user-supplied parameters.
82  */
83 class FGUserDefEnvironmentCtrl : public FGEnvironmentCtrl
84 {
85 public:
86   FGUserDefEnvironmentCtrl ();
87   virtual ~FGUserDefEnvironmentCtrl ();
88
89   virtual void init ();
90   virtual void update (double dt);
91
92 private:
93
94   SGPropertyNode_ptr _base_wind_speed_node;
95   SGPropertyNode_ptr _gust_wind_speed_node;
96
97   double _current_wind_speed_kt;
98   double _delta_wind_speed_kt;
99
100 };
101
102
103 \f
104 /**
105  * Interplation controller using user-supplied parameters.
106  */
107 class FGInterpolateEnvironmentCtrl : public FGEnvironmentCtrl
108 {
109 public:
110     FGInterpolateEnvironmentCtrl ();
111     virtual ~FGInterpolateEnvironmentCtrl ();
112     
113     virtual void init ();
114     virtual void reinit ();
115     virtual void update (double delta_time_sec);
116
117 private:
118     
119     struct bucket {
120         double altitude_ft;
121         FGEnvironment environment;
122         bool operator< (const bucket &b) const;
123         // LessThan predicate for bucket pointers.
124         static bool lessThan(bucket *a, bucket *b);
125     };
126
127     void read_table (const SGPropertyNode * node, std::vector<bucket *> &table);
128     void do_interpolate (std::vector<bucket *> &table, double altitude_ft,
129                          FGEnvironment * environment);
130
131     FGEnvironment env1, env2;   // temporaries
132
133     std::vector<bucket *> _boundary_table;
134     std::vector<bucket *> _aloft_table;
135 };
136
137
138 // A convenience wrapper around FGMetar
139 struct FGMetarResult {
140     FGAirport* airport;
141     FGMetar *m;
142 };
143
144
145 \f
146 /**
147  * Interplation controller using the FGMetar class
148  */
149 class FGMetarEnvironmentCtrl : public FGEnvironmentCtrl
150 {
151 public:
152     FGMetarEnvironmentCtrl ();
153     virtual ~FGMetarEnvironmentCtrl ();
154
155     virtual void init ();
156     virtual void reinit ();
157     virtual void update (double delta_time_sec);
158     virtual void setEnvironment (FGEnvironment * environment);
159
160 private:
161     FGInterpolateEnvironmentCtrl *env;
162
163     bool metar_loaded;
164     float station_elevation_ft;
165     float search_interval_sec;
166     float same_station_interval_sec;
167     float search_elapsed;
168     float fetch_elapsed;
169     float interpolate_elapsed;
170     FGPositionedRef last_apt;
171     SGPropertyNode_ptr proxy_host;
172     SGPropertyNode_ptr proxy_port;
173     SGPropertyNode_ptr proxy_auth;
174     SGPropertyNode_ptr metar_max_age;
175
176     FGMetarResult fetch_data(FGAirport* apt);
177     virtual void update_metar_properties( const FGMetar *m );
178     void update_env_config();
179     double interpolate_prop(const char * currentname, const char * requiredname, double dvalue);
180     double interpolate_val(double currentval, double requiredval, double dvalue);
181     const double EnvironmentUpdatePeriodSec;    // Seconds between interpolations
182     const double MaxWindChangeKtsSec;           // Max wind change in kts/sec
183     const double MaxVisChangePercentSec;        // Max visibility change in %/sec
184     const double MaxPressureChangeInHgSec;      // Max pressure change in InHg/sec
185     const double MaxCloudAltitudeChangeFtSec;   // Max cloud altitude change in ft/s
186     const double MaxCloudThicknessChangeFtSec;  // Max cloud thickness change in ft/s
187     const double MaxCloudInterpolationHeightFt; // Max distance from aircraft to
188                                                 // interpolate at. Any cloud
189                                                 // changes above this height
190                                                 // difference are not interpolated
191     const double MaxCloudInterpolationDeltaFt;  // Max difference in altitude to 
192                                                 // interpolate. Any cloud changing height
193                                                 // by more than this value is not 
194                                                 // interpolated
195
196 private:
197
198 #if defined(ENABLE_THREADS)
199     /**
200      * FIFO queue which holds a pointer to the fetched metar data.
201      */
202     SGBlockingQueue <FGAirport*> request_queue;
203
204     /**
205      * FIFO queue which holds a pointer to the fetched metar data.
206      */
207     SGLockedQueue < FGMetarResult > result_queue;
208 #else
209     /**
210      * FIFO queue which holds a pointer to the fetched metar data.
211      */
212     std::queue <FGAirport*> request_queue;
213
214     /**
215      * FIFO queue which holds a pointer to the fetched metar data.
216      */
217     std::queue < FGMetarResult > result_queue;
218 #endif
219
220 #if defined(ENABLE_THREADS)
221     /**
222      * This class represents the thread of execution responsible for
223      * fetching the metar data.
224      */
225     class MetarThread : public OpenThreads::Thread
226     {
227     public:
228         MetarThread( FGMetarEnvironmentCtrl* f ) : fetcher(f) {}
229         ~MetarThread() {}
230
231         /**
232          * Fetche the metar data from the NOAA.
233          */
234         void run();
235
236     private:
237         FGMetarEnvironmentCtrl *fetcher;
238
239     private:
240         // not implemented.
241         MetarThread();
242         MetarThread( const MetarThread& );
243         MetarThread& operator=( const MetarThread& );
244     };
245
246     friend class MetarThread;
247
248     /**
249      * Metar data fetching thread.
250      */
251     MetarThread* thread;
252
253     void thread_stop();
254 #endif // ENABLE_THREADS
255
256     int _error_count;
257     int _stale_count;
258     double _dt;
259     double _error_dt;
260 };
261
262 #endif // _ENVIRONMENT_CTRL_HXX