+
+
+bool FGAIAircraft::reachedEndOfCruise(double &distance) {
+ FGAIWaypoint* curr = fp->getCurrentWaypoint();
+ if (curr->getName() == string("BOD")) {
+ double dist = fp->getDistanceToGo(pos.getLatitudeDeg(), pos.getLongitudeDeg(), curr);
+ double descentSpeed = (getPerformance()->vDescent() * SG_NM_TO_METER) / 3600.0; // convert from kts to meter/s
+ double descentRate = (getPerformance()->descentRate() * SG_FEET_TO_METER) / 60.0; // convert from feet/min to meter/s
+
+ double verticalDistance = ((altitude_ft - 2000.0) - trafficRef->getArrivalAirport()->getElevation()) *SG_FEET_TO_METER;
+ double descentTimeNeeded = verticalDistance / descentRate;
+ double distanceCovered = descentSpeed * descentTimeNeeded;
+
+ //cerr << "Tracking : " << fgGetString("/ai/track-callsign");
+ if (trafficRef->getCallSign() == fgGetString("/ai/track-callsign")) {
+ cerr << "Checking for end of cruise stage for :" << trafficRef->getCallSign() << endl;
+ cerr << "Descent rate : " << descentRate << endl;
+ cerr << "Descent speed : " << descentSpeed << endl;
+ cerr << "VerticalDistance : " << verticalDistance << ". Altitude : " << altitude_ft << ". Elevation " << trafficRef->getArrivalAirport()->getElevation() << endl;
+ cerr << "DecentTimeNeeded : " << descentTimeNeeded << endl;
+ cerr << "DistanceCovered : " << distanceCovered << endl;
+ }
+ //cerr << "Distance = " << distance << endl;
+ distance = distanceCovered;
+ if (dist < distanceCovered) {
+ if (trafficRef->getCallSign() == fgGetString("/ai/track-callsign")) {
+ //exit(1);
+ }
+ return true;
+ } else {
+ return false;
+ }
+ } else {
+ return false;
+ }
+}
+
+void FGAIAircraft::resetPositionFromFlightPlan()
+{
+ // the one behind you
+ FGAIWaypoint* prev = 0;
+ // the one ahead
+ FGAIWaypoint* curr = 0;
+ // the next plus 1
+ FGAIWaypoint* next = 0;
+
+ prev = fp->getPreviousWaypoint();
+ curr = fp->getCurrentWaypoint();
+ next = fp->getNextWaypoint();
+
+ setLatitude(prev->getLatitude());
+ setLongitude(prev->getLongitude());
+ double tgt_heading = fp->getBearing(curr, next);
+ setHeading(tgt_heading);
+ setAltitude(prev->getAltitude());
+ setSpeed(prev->getSpeed());
+}
+
+double FGAIAircraft::getBearing(double crse)
+{
+ double hdgDiff = fabs(hdg-crse);
+ if (hdgDiff > 180)
+ hdgDiff = fabs(hdgDiff - 360);
+ return hdgDiff;
+}
+
+time_t FGAIAircraft::checkForArrivalTime(string wptName) {
+ FGAIWaypoint* curr = 0;
+ curr = fp->getCurrentWaypoint();
+
+ double tracklength = fp->checkTrackLength(wptName);
+ if (tracklength > 0.1) {
+ tracklength += fp->getDistanceToGo(pos.getLatitudeDeg(), pos.getLongitudeDeg(), curr);
+ } else {
+ return 0;
+ }
+ time_t now = time(NULL) + fgGetLong("/sim/time/warp");
+ time_t arrivalTime = fp->getArrivalTime();
+
+ time_t ete = tracklength / ((speed * SG_NM_TO_METER) / 3600.0);
+ time_t secondsToGo = arrivalTime - now;
+ if (trafficRef->getCallSign() == fgGetString("/ai/track-callsign")) {
+ cerr << "Checking arrival time: ete " << ete << ". Time to go : " << secondsToGo << ". Track length = " << tracklength << endl;
+ }
+ return (ete - secondsToGo); // Positive when we're too slow...
+}