From: James Turner Date: Thu, 3 May 2012 10:05:37 +0000 (+0100) Subject: TrafficManager - check model paths when loading schedules, and ignore schedules with... X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=84beec93257eda8d961704688fe05f9ae3a05787;p=flightgear.git TrafficManager - check model paths when loading schedules, and ignore schedules with a missing mode completely. --- diff --git a/src/Traffic/Schedule.cxx b/src/Traffic/Schedule.cxx index 32be291b8..760a04a33 100644 --- a/src/Traffic/Schedule.cxx +++ b/src/Traffic/Schedule.cxx @@ -314,6 +314,18 @@ bool FGAISchedule::update(time_t now, const SGVec3d& userCart) return createAIAircraft(flight, speed, deptime); } +bool FGAISchedule::validModelPath(const std::string& modelPath) +{ + SGPath mp(globals->get_fg_root()); + SGPath mp_ai = mp; + + mp.append(modelPath); + mp_ai.append("AI"); + mp_ai.append(modelPath); + + return mp.exists() || mp_ai.exists(); +} + bool FGAISchedule::createAIAircraft(FGScheduledFlight* flight, double speedKnots, time_t deptime) { FGAirport* dep = flight->getDepartureAirport(); diff --git a/src/Traffic/Schedule.hxx b/src/Traffic/Schedule.hxx index e3c8d8451..a85d46df6 100644 --- a/src/Traffic/Schedule.hxx +++ b/src/Traffic/Schedule.hxx @@ -91,6 +91,8 @@ class FGAISchedule ~FGAISchedule(); //destructor + static bool validModelPath(const std::string& model); + bool update(time_t now, const SGVec3d& userCart); bool init(); diff --git a/src/Traffic/TrafficMgr.cxx b/src/Traffic/TrafficMgr.cxx index 0f9dbc0b3..43f3acefe 100644 --- a/src/Traffic/TrafficMgr.cxx +++ b/src/Traffic/TrafficMgr.cxx @@ -390,7 +390,13 @@ void FGTrafficManager::readTimeTableFromFile(SGPath infileName) FlightType = tokens[9]; radius = atof(tokens[8].c_str()); offset = atof(tokens[7].c_str());; - SG_LOG(SG_GENERAL, SG_ALERT, "Adding Aircraft" << model << " " << livery << " " << homePort << " " + + if (!FGAISchedule::validModelPath(model)) { + SG_LOG(SG_GENERAL, SG_WARN, "TrafficMgr: Missing model path:" << + model << " from " << infileName.str()); + } else { + + SG_LOG(SG_GENERAL, SG_INFO, "Adding Aircraft" << model << " " << livery << " " << homePort << " " << registration << " " << flightReq << " " << isHeavy << " " << acType << " " << airline << " " << m_class << " " << FlightType << " " << radius << " " << offset); @@ -406,6 +412,7 @@ void FGTrafficManager::readTimeTableFromFile(SGPath infileName) FlightType, radius, offset)); + } // of valid model path } if (tokens[0] == string("FLIGHT")) { //cerr << "Found flight " << buffString << " size is : " << tokens.size() << endl; @@ -642,78 +649,72 @@ void FGTrafficManager::endElement(const char *name) requiredAircraft)); requiredAircraft = ""; } else if (!strcmp(name, "aircraft")) { - string isHeavy; - if (heavy) { - isHeavy = "true"; - } else { - isHeavy = "false"; - } - /* - cerr << "Traffic Dump AC," << homePort << "," << registration << "," << requiredAircraft - << "," << acType << "," << livery << "," - << airline << "," << offset << "," << radius << "," << flighttype << "," << isHeavy << "," << mdl << endl;*/ - int proportion = - (int) (fgGetDouble("/sim/traffic-manager/proportion") * 100); - int randval = rand() & 100; - if (randval <= proportion) { - if (fgGetBool("/sim/traffic-manager/dumpdata") == true) { - SG_LOG(SG_GENERAL, SG_ALERT, "Traffic Dump AC," << homePort << "," << registration << "," << requiredAircraft - << "," << acType << "," << livery << "," - << airline << "," << m_class << "," << offset << "," << radius << "," << flighttype << "," << isHeavy << "," << mdl); - } - //scheduledAircraft.push_back(new FGAISchedule(mdl, - // livery, - // registration, - // heavy, - // acType, - // airline, - // m_class, - // flighttype, - // radius, - // offset, - // score, - // flights)); - if (requiredAircraft == "") { - char buffer[16]; - snprintf(buffer, 16, "%d", acCounter); - requiredAircraft = buffer; - } - if (homePort == "") { - homePort = departurePort; - } - scheduledAircraft.push_back(new FGAISchedule(mdl, - livery, - homePort, - registration, - requiredAircraft, - heavy, - acType, - airline, - m_class, - flighttype, - radius, offset)); - - // while(flights.begin() != flights.end()) { -// flights.pop_back(); -// } - } else { - cerr << "Skipping : " << randval; - } - acCounter++; - requiredAircraft = ""; - homePort = ""; - //for (FGScheduledFlightVecIterator flt = flights.begin(); flt != flights.end(); flt++) - // { - // delete (*flt); - // } - //flights.clear(); - SG_LOG(SG_GENERAL, SG_BULK, "Reading aircraft : " - << registration << " with prioritization score " << score); - score = 0; + endAircraft(); } + elementValueStack.pop_back(); } +void FGTrafficManager::endAircraft() +{ + string isHeavy = heavy ? "true" : "false"; + + if (missingModels.find(mdl) != missingModels.end()) { + // don't stat() or warn again + requiredAircraft = homePort = ""; + return; + } + + if (!FGAISchedule::validModelPath(mdl)) { + missingModels.insert(mdl); + SG_LOG(SG_GENERAL, SG_WARN, "TrafficMgr: Missing model path:" << mdl); + requiredAircraft = homePort = ""; + return; + } + + int proportion = + (int) (fgGetDouble("/sim/traffic-manager/proportion") * 100); + int randval = rand() & 100; + if (randval > proportion) { + requiredAircraft = homePort = ""; + return; + } + + if (fgGetBool("/sim/traffic-manager/dumpdata") == true) { + SG_LOG(SG_GENERAL, SG_ALERT, "Traffic Dump AC," << homePort << "," << registration << "," << requiredAircraft + << "," << acType << "," << livery << "," + << airline << "," << m_class << "," << offset << "," << radius << "," << flighttype << "," << isHeavy << "," << mdl); + } + + if (requiredAircraft == "") { + char buffer[16]; + snprintf(buffer, 16, "%d", acCounter); + requiredAircraft = buffer; + } + if (homePort == "") { + homePort = departurePort; + } + + scheduledAircraft.push_back(new FGAISchedule(mdl, + livery, + homePort, + registration, + requiredAircraft, + heavy, + acType, + airline, + m_class, + flighttype, + radius, offset)); + + acCounter++; + requiredAircraft = ""; + homePort = ""; + SG_LOG(SG_GENERAL, SG_BULK, "Reading aircraft : " + << registration << " with prioritization score " << score); + score = 0; +} + void FGTrafficManager::data(const char *s, int len) { string token = string(s, len); diff --git a/src/Traffic/TrafficMgr.hxx b/src/Traffic/TrafficMgr.hxx index f417a95cf..41d31de84 100644 --- a/src/Traffic/TrafficMgr.hxx +++ b/src/Traffic/TrafficMgr.hxx @@ -46,6 +46,7 @@ #ifndef _TRAFFICMGR_HXX_ #define _TRAFFICMGR_HXX_ +#include #include #include #include @@ -87,6 +88,10 @@ private: ScheduleVectorIterator currAircraft, currAircraftClosest; vector elementValueStack; + // record model paths which are missing, to avoid duplicate + // warnings when parsing traffic schedules. + std::set missingModels; + std::string mdl, livery, registration, callsign, fltrules, port, timeString, departurePort, departureTime, arrivalPort, arrivalTime, repeat, acType, airline, m_class, flighttype, requiredAircraft, homePort; @@ -123,6 +128,8 @@ public: FGScheduledFlightVecIterator getFirstFlight(const string &ref) { return flights[ref].begin(); } FGScheduledFlightVecIterator getLastFlight(const string &ref) { return flights[ref].end(); } + void endAircraft(); + // Some overloaded virtual XMLVisitor members virtual void startXML (); virtual void endXML ();