X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FEnvironment%2Fenvironment_ctrl.cxx;h=5b9cfcfb99744b5e0a72843dbb252f57ab1518d8;hb=11d15b451347674fba77648700d23c5aaec3c6c2;hp=b11dc450e938535ce89ab3880928252e1794bf60;hpb=0503f827817eee8f0e78e40a259644c993dfdb60;p=flightgear.git diff --git a/src/Environment/environment_ctrl.cxx b/src/Environment/environment_ctrl.cxx index b11dc450e..5b9cfcfb9 100644 --- a/src/Environment/environment_ctrl.cxx +++ b/src/Environment/environment_ctrl.cxx @@ -141,9 +141,9 @@ FGInterpolateEnvironmentCtrl::read_table (const SGPropertyNode * node, vectornChildren(); i++) { + for (i = 0; i < (size_t)node->nChildren(); i++) { const SGPropertyNode * child = node->getChild(i); if ( strcmp(child->getName(), "entry") == 0 && child->getStringValue("elevation-ft", "")[0] != '\0' @@ -264,8 +264,7 @@ FGInterpolateEnvironmentCtrl::bucket::lessThan(bucket *a, bucket *b) //////////////////////////////////////////////////////////////////////// FGMetarCtrl::FGMetarCtrl( SGSubsystem * environmentCtrl ) - : _environmentCtrl(environmentCtrl), - station_elevation_ft(0.0), + : metar_valid(false), setup_winds_aloft(true), wind_interpolation_required(true), @@ -277,7 +276,8 @@ FGMetarCtrl::FGMetarCtrl( SGSubsystem * environmentCtrl ) MaxCloudAltitudeChangeFtSec( 20.0 ), MaxCloudThicknessChangeFtSec( 50.0 ), MaxCloudInterpolationHeightFt( 5000.0 ), - MaxCloudInterpolationDeltaFt( 4000.0 ) + MaxCloudInterpolationDeltaFt( 4000.0 ), + _environmentCtrl(environmentCtrl) { windModulator = new FGBasicWindModulator(); @@ -666,9 +666,11 @@ FGMetarCtrl::update(double dt) } } } - - set_temp_at_altitude(temperature_n->getDoubleValue(), station_elevation_ft); - set_dewpoint_at_altitude(dewpoint_n->getDoubleValue(), station_elevation_ft); + { + double station_elevation_ft = station_elevation_n->getDoubleValue(); + set_temp_at_altitude(temperature_n->getDoubleValue(), station_elevation_ft); + set_dewpoint_at_altitude(dewpoint_n->getDoubleValue(), station_elevation_ft); + } //TODO: check if temperature/dewpoint have changed. This requires reinit. // Force an update of the 3D clouds @@ -823,7 +825,7 @@ void MetarThread::run() break; } - metar_fetcher->fetch( airport_id ); + metar_fetcher->fetch( airport_id ); } } #endif @@ -836,7 +838,8 @@ FGMetarFetcher::FGMetarFetcher() : search_timer(0.0), error_timer(0.0), _stale_count(0), - _error_count(0) + _error_count(0), + enabled(false) { longitude_n = fgGetNode( "/position/longitude-deg", true ); latitude_n = fgGetNode( "/position/latitude-deg", true ); @@ -874,6 +877,22 @@ void FGMetarFetcher::init () _stale_count = 0; _error_count = 0; current_airport_id.clear(); + /* Torsten Dreyer: + hack to stop startup.nas complaining if metar arrives after nasal-dir-initialized + is fired. Immediately fetch and wait for the METAR before continuing. This gets the + /environment/metar/xxx properties filled before nasal-dir is initialized. + Maybe the runway selection should happen here to make startup.nas obsolete? + */ + const char * startup_airport = fgGetString("/sim/startup/options/airport"); + if( *startup_airport ) { + FGAirport * a = FGAirport::getByIdent( startup_airport ); + if( a ) { + SGGeod pos = SGGeod::fromDeg(a->getLongitude(), a->getLatitude()); + a = FGAirport::findClosest(pos, 10000.0, &airportWithMetarFilter); + current_airport_id = a->getId(); + fetch( current_airport_id ); + } + } } void FGMetarFetcher::reinit () @@ -901,8 +920,19 @@ void FGMetarFetcher::update (double delta_time_sec) _error_count = 0; } - if( enable_n->getBoolValue() == false ) + if( enable_n->getBoolValue() == false ) { + enabled = false; return; + } + + // we were just enabled, reset all timers to + // trigger immediate metar fetch + if( !enabled ) { + search_timer = 0.0; + fetch_timer = 0.0; + error_timer = error_timer_sec; + enabled = true; + } FGAirport * a = NULL; @@ -933,6 +963,9 @@ void FGMetarFetcher::update (double delta_time_sec) void FGMetarFetcher::fetch( const string & id ) { + if( enable_n->getBoolValue() == false ) + return; + SGSharedPtr result = NULL; // fetch current metar data @@ -954,11 +987,16 @@ void FGMetarFetcher::fetch( const string & id ) } } else { _stale_count = 0; - } + } } catch (const sg_io_exception& e) { SG_LOG( SG_GENERAL, SG_WARN, "Error fetching live weather data: " << e.getFormattedMessage().c_str() ); result = NULL; + // remove METAR flag from the airport + FGAirport * a = FGAirport::findByIdent( id ); + if( a ) a->setMetar( false ); + // immediately schedule a new search + search_timer = 0.0; } // write the metar to the property node, the rest is done by the methods tied to this property