FGAIFlightPlan::FGAIFlightPlan()
{
- rwy = 0;
sid = 0;
repeat = false;
distance_to_go = 0;
try {
readProperties(path.str(), &root);
} catch (const sg_exception &) {
- SG_LOG(SG_GENERAL, SG_ALERT,
+ SG_LOG(SG_AI, SG_ALERT,
"Error reading AI flight plan: " << path.str());
// cout << path.str() << endl;
return;
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) {
- SG_LOG(SG_GENERAL, SG_WARN, "Error reading AI flight plan: " <<
+ SG_LOG(SG_AI, SG_WARN, "Error reading AI flight plan: " <<
e.getMessage() << " from " << e.getOrigin());
}
} else {
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;
- ac->setTakeOffStatus(2);
- }
+ //else if ((timeDiff >= 1200) && (timeDiff < 1500)) {
+ //leg = 3;
+ //ac->setTakeOffStatus(2);
+ //}
else if ((timeDiff >= 1500) && (timeDiff < 2000))
leg = 4;
else if (timeDiff >= 2000)
if (timeDiff >= 2000)
leg = 5;
*/
- SG_LOG(SG_GENERAL, SG_INFO, "Route from " << dep->getId() << " to " << arr->getId() << ". Set leg to : " << leg << " " << ac->getTrafficRef()->getCallSign());
+ SG_LOG(SG_AI, SG_INFO, "Route from " << dep->getId() << " to " << arr->getId() << ". Set leg to : " << leg << " " << ac->getTrafficRef()->getCallSign());
wpt_iterator = waypoints.begin();
bool dist = 0;
isValid = create(ac, dep,arr, leg, alt, speed, lat, lon,
{
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);
+}