]> git.mxchange.org Git - flightgear.git/blobdiff - src/AIModel/AIFlightPlan.cxx
Make saveInitialProperties smarter, and hence simplify the reset code path.
[flightgear.git] / src / AIModel / AIFlightPlan.cxx
index 41c7966be01d95ed37bc52eaac9009a27a442724..60952d799621889b7ced9a87f5578853c5b9ec5b 100644 (file)
@@ -66,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;
@@ -175,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;
@@ -366,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), 
@@ -385,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
 
@@ -399,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){
@@ -468,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