From b9976f7d3422137f505d23724662d3fba6ec7c8c Mon Sep 17 00:00:00 2001 From: James Turner Date: Thu, 2 Dec 2010 20:29:28 +0000 Subject: [PATCH] Fix for bug #72 - don't init traffic manager if disabled. Disabling the traffic-manager at runtime will prevent new flights being scheduled. --- src/Main/globals.cxx | 2 ++ src/Traffic/Schedule.cxx | 3 --- src/Traffic/TrafficMgr.cxx | 21 +++++++++++++++++++-- src/Traffic/TrafficMgr.hxx | 16 ++++++++++------ 4 files changed, 31 insertions(+), 11 deletions(-) diff --git a/src/Main/globals.cxx b/src/Main/globals.cxx index 2e72e8276..c560f2765 100644 --- a/src/Main/globals.cxx +++ b/src/Main/globals.cxx @@ -35,6 +35,7 @@ #include #include #include +#include #include #include @@ -148,6 +149,7 @@ FGGlobals::FGGlobals() : channellist( NULL ) { simgear::ResourceManager::instance()->addProvider(new AircraftResourceProvider()); + simgear::PropertyObjectBase::setDefaultRoot(props); } diff --git a/src/Traffic/Schedule.cxx b/src/Traffic/Schedule.cxx index 3b8e7636d..cb7fafb3d 100644 --- a/src/Traffic/Schedule.cxx +++ b/src/Traffic/Schedule.cxx @@ -187,9 +187,6 @@ bool FGAISchedule::init() bool FGAISchedule::update(time_t now, const SGVec3d& userCart) { - if (!fgGetBool("/sim/traffic-manager/enabled")) - return true; - time_t totalTimeEnroute, elapsedTimeEnroute, diff --git a/src/Traffic/TrafficMgr.cxx b/src/Traffic/TrafficMgr.cxx index d9fcb6fff..765c870fd 100644 --- a/src/Traffic/TrafficMgr.cxx +++ b/src/Traffic/TrafficMgr.cxx @@ -75,7 +75,11 @@ using std::strcmp; /****************************************************************************** * TrafficManager *****************************************************************************/ -FGTrafficManager::FGTrafficManager() +FGTrafficManager::FGTrafficManager() : + inited(false), + enabled("/sim/traffic-manager/enabled"), + aiEnabled("/sim/ai/enabled"), + metarValid("/environment/metar/valid") { //score = 0; //runCount = 0; @@ -125,6 +129,10 @@ FGTrafficManager::~FGTrafficManager() void FGTrafficManager::init() { + if (!enabled || !aiEnabled) { + return; + } + heuristicsVector heuristics; HeuristicMap heurMap; @@ -218,13 +226,22 @@ void FGTrafficManager::init() compareSchedules); currAircraft = scheduledAircraft.begin(); currAircraftClosest = scheduledAircraft.begin(); + + inited = true; } void FGTrafficManager::update(double /*dt */ ) { - if (fgGetBool("/environment/metar/valid") == false) { + if (!enabled || !aiEnabled || !metarValid) { return; } + + if (!inited) { + // lazy-initialization, we've been enabled at run-time + SG_LOG(SG_GENERAL, SG_INFO, "doing lazy-init of TrafficManager"); + init(); + } + time_t now = time(NULL) + fgGetLong("/sim/time/warp"); if (scheduledAircraft.size() == 0) { return; diff --git a/src/Traffic/TrafficMgr.hxx b/src/Traffic/TrafficMgr.hxx index 862c87be4..a9bb9a305 100644 --- a/src/Traffic/TrafficMgr.hxx +++ b/src/Traffic/TrafficMgr.hxx @@ -47,6 +47,7 @@ #define _TRAFFICMGR_HXX_ #include +#include #include #include @@ -54,19 +55,19 @@ #include "Schedule.hxx" -typedef vector IdList; -typedef vector::iterator IdListIterator; +typedef std::vector IdList; +typedef std::vector::iterator IdListIterator; class Heuristic { public: - string registration; + std::string registration; unsigned int runCount; unsigned int hits; }; -typedef vector heuristicsVector; -typedef vector::iterator heuristicsVectorIterator; +typedef std::vector heuristicsVector; +typedef std::vector::iterator heuristicsVectorIterator; typedef std::map < std::string, Heuristic> HeuristicMap; typedef HeuristicMap::iterator HeuristicMapIterator; @@ -77,11 +78,13 @@ typedef HeuristicMap::iterator HeuristicMapIterator; class FGTrafficManager : public SGSubsystem, public XMLVisitor { private: + bool inited; + ScheduleVector scheduledAircraft; ScheduleVectorIterator currAircraft, currAircraftClosest; vector elementValueStack; - string mdl, livery, registration, callsign, fltrules, + std::string mdl, livery, registration, callsign, fltrules, port, timeString, departurePort, departureTime, arrivalPort, arrivalTime, repeat, acType, airline, m_class, flighttype, requiredAircraft, homePort; int cruiseAlt; @@ -96,6 +99,7 @@ private: void readTimeTableFromFile(SGPath infilename); void Tokenize(const string& str, vector& tokens, const string& delimiters = " "); + simgear::PropertyObject enabled, aiEnabled, metarValid; public: FGTrafficManager(); ~FGTrafficManager();