From: Durk Talsma Date: Mon, 2 Jan 2012 21:23:24 +0000 (+0100) Subject: Bugfixes and some finetuning: X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=aab04f44bdd2c5228ab547f5802a365c76323f3a;p=flightgear.git Bugfixes and some finetuning: * Pregenerating taxiroutes could interfere with runway assignments by ATC, when conditions changed, resulting in a taxi to one runway and a takeoff from another * A simpler solution for the "Error in Traffic record bug". This still needs some more testing, but I haven't seen any error message anymore, since changing to the current code. * Initialize AI traffic at speed zero, this should prevent some weirdness observed under boundary conditions. * Don't activate groundnetwork proximity detection for pushback traffic until the "ready for startup message is transmitted. this should allow sufficient time for them to reserve a route, but a little more testing still needs to be done. --- diff --git a/src/AIModel/AIFlightPlan.cxx b/src/AIModel/AIFlightPlan.cxx index 09d1eb746..21ad6f9ab 100644 --- a/src/AIModel/AIFlightPlan.cxx +++ b/src/AIModel/AIFlightPlan.cxx @@ -243,98 +243,8 @@ FGAIFlightPlan::FGAIFlightPlan(FGAIAircraft *ac, isValid = create(ac, dep,arr, leg, alt, speed, lat, lon, firstLeg, radius, fltType, acType, airline, dist); wpt_iterator = waypoints.begin(); - //cerr << "after create: " << (*wpt_iterator)->name << endl; - //leg++; - // Now that we have dynamically created a flight plan, - // we need to add some code that pops any waypoints already past. - //return; } - /* - waypoint* init_waypoint = new waypoint; - init_waypoint->name = string("initial position"); - init_waypoint->latitude = entity->latitude; - init_waypoint->longitude = entity->longitude; - init_waypoint->altitude = entity->altitude; - init_waypoint->speed = entity->speed; - init_waypoint->crossat = - 10000; - init_waypoint->gear_down = false; - init_waypoint->flaps_down = false; - init_waypoint->finished = false; - - wpt_vector_iterator i = waypoints.begin(); - while (i != waypoints.end()) - { - //cerr << "Checking status of each waypoint: " << (*i)->name << endl; - SGWayPoint first(init_waypoint->longitude, - init_waypoint->latitude, - init_waypoint->altitude); - SGWayPoint curr ((*i)->longitude, - (*i)->latitude, - (*i)->altitude); - double crse, crsDiff; - double dist; - curr.CourseAndDistance(first, &crse, &dist); - - dist *= SG_METER_TO_NM; - - // We're only interested in the absolute value of crsDiff - // wich should fall in the 0-180 deg range. - crsDiff = fabs(crse-course); - if (crsDiff > 180) - crsDiff = 360-crsDiff; - // These are the three conditions that we consider including - // in our flight plan: - // 1) current waypoint is less then 100 miles away OR - // 2) curren waypoint is ahead of us, at any distance - - if ((dist > 20.0) && (crsDiff > 90.0) && ((*i)->name != string ("EOF"))) - { - //useWpt = false; - // Once we start including waypoints, we have to continue, even though - // one of the following way point would suffice. - // so once is the useWpt flag is set to true, we cannot reset it to false. - //cerr << "Discarding waypoint: " << (*i)->name - // << ": Course difference = " << crsDiff - // << "Course = " << course - // << "crse = " << crse << endl; - } - else - useCurrentWayPoint = true; - - if (useCurrentWayPoint) - { - if ((dist > 100.0) && (useInitialWayPoint)) - { - //pushBackWaypoint(init_waypoint);; - waypoints.insert(i, init_waypoint); - //cerr << "Using waypoint : " << init_waypoint->name << endl; - } - //if (useInitialWayPoint) - // { - // (*i)->speed = dist; // A hack - // } - //pushBackWaypoint( wpt ); - //cerr << "Using waypoint : " << (*i)->name - // << ": course diff : " << crsDiff - // << "Course = " << course - // << "crse = " << crse << endl - // << "distance : " << dist << endl; - useInitialWayPoint = false; - i++; - } - else - { - //delete wpt; - delete *(i); - i = waypoints.erase(i); - } - - } - */ - //for (i = waypoints.begin(); i != waypoints.end(); i++) - // cerr << "Using waypoint : " << (*i)->name << endl; - //wpt_iterator = waypoints.begin(); - //cout << waypoints.size() << " waypoints read." << endl; + } diff --git a/src/AIModel/AIFlightPlanCreate.cxx b/src/AIModel/AIFlightPlanCreate.cxx index ba2f29174..5eb04f21b 100644 --- a/src/AIModel/AIFlightPlanCreate.cxx +++ b/src/AIModel/AIFlightPlanCreate.cxx @@ -63,11 +63,11 @@ bool FGAIFlightPlan::create(FGAIAircraft * ac, FGAirport * dep, case 1: retVal = createPushBack(ac, firstFlight, dep, latitude, longitude, radius, fltType, aircraftType, airline); - // Pregenerate the - if (retVal) { - waypoints.back()->setName( waypoints.back()->getName() + string("legend")); - retVal = createTakeoffTaxi(ac, false, dep, radius, fltType, aircraftType, airline); - } + // Pregenerate the taxi leg. + //if (retVal) { + // waypoints.back()->setName( waypoints.back()->getName() + string("legend")); + // retVal = createTakeoffTaxi(ac, false, dep, radius, fltType, aircraftType, airline); + //} break; case 2: retVal = createTakeoffTaxi(ac, firstFlight, dep, radius, fltType, diff --git a/src/AIModel/AIFlightPlanCreatePushBack.cxx b/src/AIModel/AIFlightPlanCreatePushBack.cxx index b65333dd7..708d71e1d 100644 --- a/src/AIModel/AIFlightPlanCreatePushBack.cxx +++ b/src/AIModel/AIFlightPlanCreatePushBack.cxx @@ -118,8 +118,8 @@ bool FGAIFlightPlan::createPushBack(FGAIAircraft *ac, pushBackRoute = parking->getPushBackRoute(); int size = pushBackRoute->size(); if (size < 2) { - SG_LOG(SG_AI, SG_WARN, "Push back route from gate " << gateId << " has only " << size << " nodes."); - SG_LOG(SG_AI, SG_WARN, "Using " << pushBackNode); + SG_LOG(SG_AI, SG_ALERT, "Push back route from gate " << gateId << " has only " << size << " nodes."); + SG_LOG(SG_AI, SG_ALERT, "Using " << pushBackNode); } pushBackRoute->first(); while (pushBackRoute->next(&node, &rte)) diff --git a/src/ATC/trafficcontrol.cxx b/src/ATC/trafficcontrol.cxx index b919b0830..a0a4d98d8 100644 --- a/src/ATC/trafficcontrol.cxx +++ b/src/ATC/trafficcontrol.cxx @@ -187,23 +187,18 @@ void FGTrafficRecord::setPositionAndIntentions(int pos, if (intentions.size()) { intVecIterator i = intentions.begin(); if ((*i) != pos) { - SG_LOG(SG_ATC, SG_INFO, - "Skipping repeated intention in FGTrafficRecord::setPositionAndIntentions at " << SG_ORIGIN); - } else { - intentions.erase(i); + SG_LOG(SG_ATC, SG_ALERT, + "Error in FGTrafficRecord::setPositionAndIntentions at " << SG_ORIGIN); } + intentions.erase(i); } else { //FGAIFlightPlan::waypoint* const wpt= route->getCurrentWaypoint(); int size = route->getNrOfWayPoints(); //cerr << "Setting pos" << pos << " "; //cerr << "setting intentions "; - for (int i = 0; i < size; i++) { + for (int i = 2; i < size; i++) { int val = route->getRouteIndex(i); - //cerr << val<< " "; - if ((val) && (val != pos)) { // NOTE THAAT THERES A PROBLEM WITH REPEATED INTENSIONS HERE. - intentions.push_back(val); - //cerr << "[set] "; - } + intentions.push_back(val); } } } diff --git a/src/Airports/groundnetwork.cxx b/src/Airports/groundnetwork.cxx index 20d0a793d..bf4d24f7d 100644 --- a/src/Airports/groundnetwork.cxx +++ b/src/Airports/groundnetwork.cxx @@ -1522,7 +1522,7 @@ void FGGroundNetwork::update(double dt) i->setPriority(priority++); // in meters per second; double vTaxi = (i->getAircraft()->getPerformance()->vTaxi() * SG_NM_TO_METER) / 3600; - if (i->isActive(60)) { + if (i->isActive(0)) { // Check for all active aircraft whether it's current pos segment is // an opposite of one of the departing aircraft's intentions diff --git a/src/Traffic/Schedule.cxx b/src/Traffic/Schedule.cxx index 85343db29..789631bd5 100644 --- a/src/Traffic/Schedule.cxx +++ b/src/Traffic/Schedule.cxx @@ -334,7 +334,7 @@ bool FGAISchedule::createAIAircraft(FGScheduledFlight* flight, double speedKnots aircraft->setLatitude(position.getLatitudeDeg()); aircraft->setLongitude(position.getLongitudeDeg()); aircraft->setAltitude(flight->getCruiseAlt()*100); // convert from FL to feet - aircraft->setSpeed(speedKnots); + aircraft->setSpeed(0); aircraft->setBank(0); courseToDest = SGGeodesy::courseDeg(position, arr->geod()); @@ -389,15 +389,10 @@ void FGAISchedule::scheduleFlights(time_t now) if (!flight) { break; } - //if (startingPort.empty()) { - // startingPort = flight->getDepartureAirport()->getId(); - //} currentDestination = flight->getArrivalAirport()->getId(); //cerr << "Current destination " << currentDestination << endl; if (!initialized) { string departurePort = flight->getDepartureAirport()->getId(); - //cerr << "Scheduled " << registration << " " << score << " for Flight " - // << flight-> getCallSign() << " from " << departurePort << " to " << currentDestination << endl; if (userPort == departurePort) { lastRun = 1; hits++;