FGAIFlightPlan::FGAIFlightPlan()
{
- rwy = 0;
sid = 0;
repeat = false;
distance_to_go = 0;
if (wpt->getName() == "END") wpt->setFinished(true);
else wpt->setFinished(false);
- waypoints.push_back( wpt );
+ pushBackWaypoint( wpt );
}
wpt_iterator = waypoints.begin();
SGPropertyNode * node = root.getNode("flightplan");
- //waypoints.push_back( init_waypoint );
+ //pushBackWaypoint( init_waypoint );
for (int i = 0; i < node->nChildren(); i++) {
//cout << "Reading waypoint " << i << endl;
FGAIWaypoint* wpt = new FGAIWaypoint;
if (wpt->getName() == "END") wpt->setFinished(true);
else wpt->setFinished(false);
- waypoints.push_back(wpt);
+ pushBackWaypoint(wpt);
} // of node loop
wpt_iterator = waypoints.begin();
} catch (const sg_exception &e) {
time_t timeDiff = now-start;
leg = 1;
- if ((timeDiff > 60) && (timeDiff < 1200))
+ if ((timeDiff > 60) && (timeDiff < 1500))
leg = 2;
- else if ((timeDiff >= 1200) && (timeDiff < 1500))
- leg = 3;
+ //else if ((timeDiff >= 1200) && (timeDiff < 1500)) {
+ //leg = 3;
+ //ac->setTakeOffStatus(2);
+ //}
else if ((timeDiff >= 1500) && (timeDiff < 2000))
leg = 4;
else if (timeDiff >= 2000)
{
if ((dist > 100.0) && (useInitialWayPoint))
{
- //waypoints.push_back(init_waypoint);;
+ //pushBackWaypoint(init_waypoint);;
waypoints.insert(i, init_waypoint);
//cerr << "Using waypoint : " << init_waypoint->name << endl;
}
// {
// (*i)->speed = dist; // A hack
// }
- //waypoints.push_back( wpt );
+ //pushBackWaypoint( wpt );
//cerr << "Using waypoint : " << (*i)->name
// << ": course diff : " << crsDiff
// << "Course = " << course
}
else
wpt_iterator--;
+}
+void FGAIFlightPlan::eraseLastWaypoint()
+{
+ delete (waypoints.back());
+ waypoints.pop_back();;
+ wpt_iterator = waypoints.begin();
+ wpt_iterator++;
}
+
+
// gives distance in feet from a position to a waypoint
double FGAIFlightPlan::getDistanceToGo(double lat, double lon, FGAIWaypoint* wp) const{
return SGGeodesy::distanceM(SGGeod::fromDeg(lon, lat),
wpt->setOn_ground ( (*i)->getOn_ground() );
//cerr << "Recycling waypoint " << wpt->name << endl;
deleteWaypoints();
- waypoints.push_back(wpt);
+ pushBackWaypoint(wpt);
}
}
+void FGAIFlightPlan::pushBackWaypoint(FGAIWaypoint *wpt)
+{
+ // std::vector::push_back invalidates waypoints
+ // so we should restore wpt_iterator after push_back
+ // (or it could be an index in the vector)
+ size_t pos = wpt_iterator - waypoints.begin();
+ waypoints.push_back(wpt);
+ wpt_iterator = waypoints.begin() + pos;
+}
+
// Start flightplan over from the beginning
void FGAIFlightPlan::restart()
{
trackDistance = 0; // name not found
}
return trackDistance;
-}
\ No newline at end of file
+}
+
+void FGAIFlightPlan::shortenToFirst(unsigned int number, string name)
+{
+ while (waypoints.size() > number + 3) {
+ eraseLastWaypoint();
+ }
+ (waypoints.back())->setName((waypoints.back())->getName() + name);
+}