X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FEnvironment%2Fenvironment_ctrl.hxx;h=aec1442cb375f56f142facb786ac5d46865d60c9;hb=8f056da61884b14e37ec92e52c4e5823a50d30e5;hp=bb3460484ff1c626838b8cdf33ae779d83ecb3e6;hpb=f42e3cb2ac5b43d5b2ad760934ad515665043ead;p=flightgear.git diff --git a/src/Environment/environment_ctrl.hxx b/src/Environment/environment_ctrl.hxx index bb3460484..aec1442cb 100644 --- a/src/Environment/environment_ctrl.hxx +++ b/src/Environment/environment_ctrl.hxx @@ -16,7 +16,7 @@ // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // // $Id$ @@ -25,31 +25,24 @@ #include #include -#include -#if defined(ENABLE_THREADS) && ENABLE_THREADS -# include +#if defined(ENABLE_THREADS) +# include # include #endif -#ifdef SG_HAVE_STD_INCLUDES -# include -#else -# include -#endif - #include #include -SG_USING_STD(queue); -SG_USING_STD(vector); +#include +#include +#include "fgwind.hxx" +// forward decls class SGPropertyNode; +class SGSampleGroup; +class FGMetar; -#include "environment.hxx" - - - /** * Interface to control environment information for a specific location. */ @@ -58,202 +51,210 @@ class FGEnvironmentCtrl : public SGSubsystem public: - FGEnvironmentCtrl (); - virtual ~FGEnvironmentCtrl (); + FGEnvironmentCtrl (); + virtual ~FGEnvironmentCtrl (); - virtual void setEnvironment (FGEnvironment * environment); + virtual void setEnvironment (FGEnvironment * environment); - virtual FGEnvironment * getEnvironment () const { return _environment; } + virtual const FGEnvironment * getEnvironment () const { return _environment; } - virtual void setLongitudeDeg (double lon_deg); - virtual void setLatitudeDeg (double lat_deg); - virtual void setElevationFt (double elev_ft); - virtual void setPosition (double lon_deg, double lat_deg, double elev_ft); + virtual void setLongitudeDeg (double lon_deg); + virtual void setLatitudeDeg (double lat_deg); + virtual void setElevationFt (double elev_ft); + virtual void setPosition (double lon_deg, double lat_deg, double elev_ft); - virtual double getLongitudeDeg () const { return _lon_deg; } - virtual double getLatitudeDeg () const { return _lat_deg; } - virtual double getElevationFt () const { return _elev_ft; } + virtual double getLongitudeDeg () const { return _lon_deg; } + virtual double getLatitudeDeg () const { return _lat_deg; } + virtual double getElevationFt () const { return _elev_ft; } protected: - FGEnvironment * _environment; - double _lon_deg; - double _lat_deg; - double _elev_ft; + FGEnvironment * _environment; + double _lon_deg; + double _lat_deg; + double _elev_ft; }; /** - * Environment controller using user-supplied parameters. + * Interplation controller using user-supplied parameters. */ -class FGUserDefEnvironmentCtrl : public FGEnvironmentCtrl +class FGInterpolateEnvironmentCtrl : public FGEnvironmentCtrl { public: - FGUserDefEnvironmentCtrl (); - virtual ~FGUserDefEnvironmentCtrl (); - - virtual void init (); - virtual void update (double dt); + FGInterpolateEnvironmentCtrl (); + virtual ~FGInterpolateEnvironmentCtrl (); + + virtual void init (); + virtual void reinit (); + virtual void update (double delta_time_sec); private: - - SGPropertyNode * _base_wind_speed_node; - SGPropertyNode * _gust_wind_speed_node; - - double _current_wind_speed_kt; - double _delta_wind_speed_kt; - + + struct bucket { + double altitude_ft; + FGEnvironment environment; + bool operator< (const bucket &b) const; + // LessThan predicate for bucket pointers. + static bool lessThan(bucket *a, bucket *b); + }; + + void read_table (const SGPropertyNode * node, std::vector &table); + void do_interpolate (std::vector &table, double altitude_ft, + FGEnvironment * environment); + + FGEnvironment env1, env2; // temporaries + + std::vector _boundary_table; + std::vector _aloft_table; + + SGPropertyNode_ptr altitude_n; + SGPropertyNode_ptr altitude_agl_n; + SGPropertyNode_ptr boundary_transition_n; + SGPropertyNode_ptr boundary_n; + SGPropertyNode_ptr aloft_n; }; /** - * Interplation controller using user-supplied parameters. + * Interplation controller using the FGMetar class */ -class FGInterpolateEnvironmentCtrl : public FGEnvironmentCtrl + +class FGMetarCtrl : public SGSubsystem { public: - FGInterpolateEnvironmentCtrl (); - virtual ~FGInterpolateEnvironmentCtrl (); - - virtual void init (); - virtual void reinit (); - virtual void update (double delta_time_sec); - -private: - - struct bucket { - double altitude_ft; - FGEnvironment environment; - bool operator< (const bucket &b) const; - }; + FGMetarCtrl (SGSubsystem * environmentCtrl); + virtual ~FGMetarCtrl (); - void read_table (const SGPropertyNode * node, vector &table); - void do_interpolate (vector &table, double altitude_ft, - FGEnvironment * environment); + virtual void init (); + virtual void reinit (); + virtual void update (double delta_time_sec); - FGEnvironment env1, env2; // temporaries - - vector _boundary_table; - vector _aloft_table; -}; + void set_metar( const char * metar ); + const char * get_metar(void) const; + bool get_valid(void) const { return metar_valid; } + void set_enabled(bool _enabled) { enabled = _enabled; } + bool get_enabled(void) const { return enabled; } + void set_setup_winds_aloft(bool _setup_winds_aloft) { setup_winds_aloft = _setup_winds_aloft; } + bool get_setup_winds_aloft(void) const { return setup_winds_aloft; } +private: + void bind(); + void unbind(); + + SGSharedPtr windModulator; + bool metar_valid; + bool enabled; + bool setup_winds_aloft; + bool first_update; + bool wind_interpolation_required; + string metar; + double metar_sealevel_temperature; + double metar_sealevel_dewpoint; + double interpolate_prop(const char * currentname, const char * requiredname, double dvalue); + double interpolate_val(double currentval, double requiredval, double dvalue); + const double MaxWindChangeKtsSec; // Max wind change in kts/sec + const double MaxVisChangePercentSec; // Max visibility change in %/sec + const double MaxPressureChangeInHgSec; // Max pressure change in InHg/sec + const double MaxTemperatureChangeDegcSec; // Max temperature change in degc/s + const double MaxCloudAltitudeChangeFtSec; // Max cloud altitude change in ft/s + const double MaxCloudThicknessChangeFtSec; // Max cloud thickness change in ft/s + const double MaxCloudInterpolationHeightFt; // Max distance from aircraft to + // interpolate at. Any cloud + // changes above this height + // difference are not interpolated + const double MaxCloudInterpolationDeltaFt; // Max difference in altitude to + // interpolate. Any cloud changing height + // by more than this value is not + // interpolated + + SGSubsystem * _environmentCtrl; + + SGPropertyNode_ptr metar_base_n; + SGPropertyNode_ptr station_id_n; + SGPropertyNode_ptr station_elevation_n; + SGPropertyNode_ptr min_visibility_n; + SGPropertyNode_ptr max_visibility_n; + SGPropertyNode_ptr base_wind_range_from_n; + SGPropertyNode_ptr base_wind_range_to_n; + SGPropertyNode_ptr base_wind_dir_n; + SGPropertyNode_ptr base_wind_speed_n; + SGPropertyNode_ptr gust_wind_speed_n; + SGPropertyNode_ptr temperature_n; + SGPropertyNode_ptr dewpoint_n; + SGPropertyNode_ptr humidity_n; + SGPropertyNode_ptr pressure_n; + SGPropertyNode_ptr clouds_n; + SGPropertyNode_ptr environment_clouds_n; + SGPropertyNode_ptr rain_n; + SGPropertyNode_ptr hail_n; + SGPropertyNode_ptr snow_n; + SGPropertyNode_ptr snow_cover_n; + SGPropertyNode_ptr ground_elevation_n; + SGPropertyNode_ptr longitude_n; + SGPropertyNode_ptr latitude_n; + SGPropertyNode_ptr magnetic_variation_n; + + SGPropertyNode_ptr boundary_wind_speed_n; + SGPropertyNode_ptr boundary_wind_from_heading_n; + SGPropertyNode_ptr boundary_visibility_n; + SGPropertyNode_ptr boundary_sea_level_pressure_n; + SGPropertyNode_ptr boundary_sea_level_temperature_n; + SGPropertyNode_ptr boundary_sea_level_dewpoint_n; +private: -// A convenience wrapper around SGMetar -struct FGMetarResult { - string icao; - SGMetar *m; }; - - -/** - * Interplation controller using the SGMetar class +/* + * The subsyste to load real world weather */ -class FGMetarEnvironmentCtrl : public FGEnvironmentCtrl +class FGMetarFetcher : public SGSubsystem { public: - FGMetarEnvironmentCtrl (); - virtual ~FGMetarEnvironmentCtrl (); + FGMetarFetcher(); + virtual ~FGMetarFetcher(); - virtual void init (); - virtual void reinit (); - virtual void update (double delta_time_sec); - virtual void setEnvironment (FGEnvironment * environment); + virtual void init (); + virtual void reinit (); + virtual void update (double delta_time_sec); private: - FGInterpolateEnvironmentCtrl *env; - - string _icao; - float station_elevation_ft; - float search_interval_sec; - float same_station_interval_sec; - float search_elapsed; - float fetch_elapsed; - FGAirport last_apt; - SGPropertyNode *proxy_host; - SGPropertyNode *proxy_port; - SGPropertyNode *proxy_auth; - - FGMetarResult fetch_data( const string &icao ); - virtual void update_metar_properties( SGMetar *m ); - void update_env_config(); + friend class MetarThread; +#if defined(ENABLE_THREADS) + /** + * FIFO queue which holds a pointer to the metar requests. + */ + SGBlockingQueue request_queue; + + OpenThreads::Thread * metar_thread; +#endif -private: + void fetch( const string & id ); -#if defined(ENABLE_THREADS) && ENABLE_THREADS - /** - * FIFO queue which holds a pointer to the fetched metar data. - */ - SGBlockingQueue < string > request_queue; - - /** - * FIFO queue which holds a pointer to the fetched metar data. - */ - SGBlockingQueue < FGMetarResult > result_queue; -#else - /** - * FIFO queue which holds a pointer to the fetched metar data. - */ - queue < string > request_queue; - - /** - * FIFO queue which holds a pointer to the fetched metar data. - */ - queue < FGMetarResult > result_queue; -#endif + SGPropertyNode_ptr enable_n; + + SGPropertyNode_ptr longitude_n; + SGPropertyNode_ptr latitude_n; + + SGPropertyNode_ptr proxy_host_n; + SGPropertyNode_ptr proxy_port_n; + SGPropertyNode_ptr proxy_auth_n; + SGPropertyNode_ptr max_age_n; -#if defined(ENABLE_THREADS) && ENABLE_THREADS - /** - * This class represents the thread of execution responsible for - * fetching the metar data. - */ - class MetarThread : public SGThread - { - public: - MetarThread( FGMetarEnvironmentCtrl* f ) : fetcher(f) {} - ~MetarThread() {} - - /** - * Fetche the metar data from the NOAA. - */ - void run(); - - private: - FGMetarEnvironmentCtrl *fetcher; - - private: - // not implemented. - MetarThread(); - MetarThread( const MetarThread& ); - MetarThread& operator=( const MetarThread& ); - }; - - friend class MetarThread; - - /** - * Metar data fetching thread. - */ - MetarThread* thread; - - /** - * Lock and synchronize access to metar queue. - */ - SGMutex mutex; - SGPthreadCond metar_cond; - - /** - * Thread cleanup handler. - */ - friend void metar_cleanup_handler( void* ); - -#endif // ENABLE_THREADS - - int _error_count; - double _dt; - double _error_dt; + SGPropertyNode_ptr output_n; + + string current_airport_id; + double fetch_timer; + double search_timer; + double error_timer; + + long _stale_count; + long _error_count; + bool enabled; }; + #endif // _ENVIRONMENT_CTRL_HXX