From: ThorstenB Date: Wed, 14 Nov 2012 23:35:45 +0000 (+0100) Subject: #895: AI traffic not working when system is offline but real-wx is enabled X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=791389cb9874f3ac2a1f81bbfd341f6a686d41df;p=flightgear.git #895: AI traffic not working when system is offline but real-wx is enabled Add a timeout when waiting for valid METAR. --- diff --git a/src/Traffic/TrafficMgr.cxx b/src/Traffic/TrafficMgr.cxx index acc9fa90c..0d895a8c9 100644 --- a/src/Traffic/TrafficMgr.cxx +++ b/src/Traffic/TrafficMgr.cxx @@ -151,6 +151,7 @@ private: FGTrafficManager::FGTrafficManager() : inited(false), doingInit(false), + waitingMetarTime(0.0), enabled("/sim/traffic-manager/enabled"), aiEnabled("/sim/ai/enabled"), realWxEnabled("/environment/realwx/enabled"), @@ -339,7 +340,36 @@ void FGTrafficManager::loadHeuristics() } } -void FGTrafficManager::update(double /*dt */ ) +bool FGTrafficManager::metarReady(double dt) +{ + // wait for valid METAR (when realWX is enabled only), since we need + // to know the active runway + if (metarValid || !realWxEnabled) + { + waitingMetarTime = 0.0; + return true; + } + + // METAR timeout: when running offline, remote server is down etc + if (waitingMetarStation != fgGetString("/environment/metar/station-id")) + { + // station has changed: wait for reply, restart timeout + waitingMetarTime = 0.0; + waitingMetarStation = fgGetString("/environment/metar/station-id"); + return false; + } + + // timeout elapsed (10 seconds)? + if (waitingMetarTime > 20.0) + { + return true; + } + + waitingMetarTime += dt; + return false; +} + +void FGTrafficManager::update(double dt) { if (!enabled) { @@ -348,9 +378,8 @@ void FGTrafficManager::update(double /*dt */ ) return; } - if ((realWxEnabled && !metarValid)) { + if (!metarReady(dt)) return; - } if (!aiEnabled) { diff --git a/src/Traffic/TrafficMgr.hxx b/src/Traffic/TrafficMgr.hxx index bc2705804..5be7fd3cd 100644 --- a/src/Traffic/TrafficMgr.hxx +++ b/src/Traffic/TrafficMgr.hxx @@ -86,6 +86,8 @@ class FGTrafficManager : public SGSubsystem, public XMLVisitor private: bool inited; bool doingInit; + double waitingMetarTime; + std::string waitingMetarStation; ScheduleVector scheduledAircraft; ScheduleVectorIterator currAircraft, currAircraftClosest; @@ -122,9 +124,11 @@ private: // helper to read and parse the schedule data. // this is run on a helper thread, so be careful about - // accesing properties during parsing + // accessing properties during parsing void parseSchedule(const SGPath& path); + bool metarReady(double dt); + public: FGTrafficManager(); ~FGTrafficManager();