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.
This commit is contained in:
parent
e0b6ee9d5d
commit
aab04f44bd
6 changed files with 15 additions and 115 deletions
|
@ -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;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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++;
|
||||
|
|
Loading…
Add table
Reference in a new issue