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 <simgear/structure/event_mgr.hxx> #include <simgear/sound/soundmgr_openal.hxx> #include <simgear/misc/ResourceManager.hxx> +#include <simgear/props/propertyObject.hxx> #include <Aircraft/controls.hxx> #include <Airports/runways.hxx> @@ -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 <simgear/structure/subsystem_mgr.hxx> +#include <simgear/props/propertyObject.hxx> #include <simgear/xml/easyxml.hxx> #include <simgear/misc/sg_path.hxx> @@ -54,19 +55,19 @@ #include "Schedule.hxx" -typedef vector<int> IdList; -typedef vector<int>::iterator IdListIterator; +typedef std::vector<int> IdList; +typedef std::vector<int>::iterator IdListIterator; class Heuristic { public: - string registration; + std::string registration; unsigned int runCount; unsigned int hits; }; -typedef vector<Heuristic> heuristicsVector; -typedef vector<Heuristic>::iterator heuristicsVectorIterator; +typedef std::vector<Heuristic> heuristicsVector; +typedef std::vector<Heuristic>::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<string> 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<string>& tokens, const string& delimiters = " "); + simgear::PropertyObject<bool> enabled, aiEnabled, metarValid; public: FGTrafficManager(); ~FGTrafficManager();