X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FAIModel%2FAIFlightPlan.cxx;h=60952d799621889b7ced9a87f5578853c5b9ec5b;hb=388a0a5b6af2b91f2ed36488177813d693ed374e;hp=4d130991fe0a782e4fdbb1a75de93fc6e67bb179;hpb=8be4e97f54121260feb292e1fcbe3d072d28c941;p=flightgear.git diff --git a/src/AIModel/AIFlightPlan.cxx b/src/AIModel/AIFlightPlan.cxx index 4d130991f..60952d799 100644 --- a/src/AIModel/AIFlightPlan.cxx +++ b/src/AIModel/AIFlightPlan.cxx @@ -42,13 +42,19 @@ #include #include "AIFlightPlan.hxx" +#include "AIAircraft.hxx" using std::cerr; +FGAIFlightPlan::FGAIFlightPlan() +{ + sid = 0; +} FGAIFlightPlan::FGAIFlightPlan(const string& filename) { int i; + sid = 0; start_time = 0; leg = 10; gateId = 0; @@ -60,7 +66,7 @@ FGAIFlightPlan::FGAIFlightPlan(const string& filename) try { readProperties(path.str(), &root); - } catch (const sg_exception &e) { + } catch (const sg_exception &) { SG_LOG(SG_GENERAL, SG_ALERT, "Error reading AI flight plan: " << path.str()); // cout << path.str() << endl; @@ -117,6 +123,7 @@ FGAIFlightPlan::FGAIFlightPlan(FGAIAircraft *ac, const string& acType, const string& airline) { + sid = 0; repeat = false; leg = 10; gateId=0; @@ -168,20 +175,12 @@ FGAIFlightPlan::FGAIFlightPlan(FGAIAircraft *ac, if (wpt->name == "END") wpt->finished = true; else wpt->finished = false; waypoints.push_back(wpt); - } - } - catch (const sg_exception &e) { - SG_LOG(SG_GENERAL, SG_WARN, - "Error reading AI flight plan: "); - cerr << "Errno = " << errno << endl; - if (errno == ENOENT) - { - SG_LOG(SG_GENERAL, SG_WARN, "Reason: No such file or directory"); - } - } + } // of node loop + } catch (const sg_exception &e) { + SG_LOG(SG_GENERAL, SG_WARN, "Error reading AI flight plan: " << + e.getMessage() << " from " << e.getOrigin()); } - else - { + } else { // cout << path.str() << endl; // cout << "Trying to create this plan dynamically" << endl; // cout << "Route from " << dep->id << " to " << arr->id << endl; @@ -201,7 +200,7 @@ FGAIFlightPlan::FGAIFlightPlan(FGAIAircraft *ac, if (timeDiff >= 2000) leg = 5; - SG_LOG(SG_GENERAL, SG_INFO, "Route from " << dep->getId() << " to " << arr->getId() << ". Set leg to : " << leg); + SG_LOG(SG_GENERAL, SG_INFO, "Route from " << dep->getId() << " to " << arr->getId() << ". Set leg to : " << leg << " " << ac->getTrafficRef()->getCallSign()); wpt_iterator = waypoints.begin(); create(ac, dep,arr, leg, alt, speed, lat, lon, firstLeg, radius, fltType, acType, airline); @@ -359,6 +358,26 @@ void FGAIFlightPlan::IncrementWaypoint(bool eraseWaypoints ) } +void FGAIFlightPlan::DecrementWaypoint(bool eraseWaypoints ) +{ + if (eraseWaypoints) + { + if (wpt_iterator == waypoints.end()) + wpt_iterator--; + else + { + delete *(waypoints.end()); + waypoints.erase(waypoints.end()); + wpt_iterator = waypoints.end(); + wpt_iterator--; + } + } + else + wpt_iterator--; + +} + + // gives distance in feet from a position to a waypoint double FGAIFlightPlan::getDistanceToGo(double lat, double lon, waypoint* wp) const{ return SGGeodesy::distanceM(SGGeod::fromDeg(lon, lat), @@ -378,7 +397,7 @@ void FGAIFlightPlan::setLeadDistance(double speed, double bearing, return; } if (speed < 25) { - turn_radius = ((360/30)*15) / (2*M_PI); + turn_radius = ((360/30)*fabs(speed)) / (2*M_PI); } else turn_radius = 0.1911 * speed * speed; // an estimate for 25 degrees bank @@ -392,9 +411,16 @@ void FGAIFlightPlan::setLeadDistance(double speed, double bearing, //lead_distance = turn_radius * sin(leadInAngle * SG_DEGREES_TO_RADIANS); lead_distance = turn_radius * tan((leadInAngle * SG_DEGREES_TO_RADIANS)/2); - // if ((errno == EDOM) || (errno == ERANGE) || lead_distance < 1.0) - // { - // } + if ((lead_distance > (3*turn_radius)) && (current->on_ground == false)) { + // cerr << "Warning: Lead-in distance is large. Inbound = " << inbound + // << ". Outbound = " << outbound << ". Lead in angle = " << leadInAngle << ". Turn radius = " << turn_radius << endl; + lead_distance = 3 * turn_radius; + return; + } + if ((leadInAngle > 90) && (current->on_ground == true)) { + lead_distance = turn_radius * tan((90 * SG_DEGREES_TO_RADIANS)/2); + return; + } } void FGAIFlightPlan::setLeadDistance(double distance_ft){ @@ -461,7 +487,7 @@ void FGAIFlightPlan::deleteTaxiRoute() int FGAIFlightPlan::getRouteIndex(int i) { - if ((i > 0) && (i < waypoints.size())) { + if ((i > 0) && (i < (int)waypoints.size())) { return waypoints[i]->routeIndex; } else