]> git.mxchange.org Git - flightgear.git/blobdiff - src/AIModel/AIFlightPlan.cxx
Merge branch 'next' into durk-atc
[flightgear.git] / src / AIModel / AIFlightPlan.cxx
index d3b042bbe4c31760aa520ef6906b406d9f622f11..2fa5c36092badad57ca64d0d90ecc620fd41ff64 100644 (file)
@@ -1,4 +1,4 @@
-// FGAIFlightPlan - class for loading and storing  AI flight plans
+// // FGAIFlightPlan - class for loading and storing  AI flight plans
 // Written by David Culp, started May 2004
 // - davidculp2@comcast.net
 //
@@ -49,6 +49,8 @@ using std::cerr;
 FGAIFlightPlan::FGAIFlightPlan() 
 {
    sid = 0;
+   wpt_iterator = waypoints.begin();
+   isValid = true;
 }
 
 FGAIFlightPlan::FGAIFlightPlan(const string& filename)
@@ -97,6 +99,7 @@ FGAIFlightPlan::FGAIFlightPlan(const string& filename)
    }
 
   wpt_iterator = waypoints.begin();
+  isValid = true;
   //cout << waypoints.size() << " waypoints read." << endl;
 }
 
@@ -136,7 +139,7 @@ FGAIFlightPlan::FGAIFlightPlan(FGAIAircraft *ac,
   path.append( p );
   
   SGPropertyNode root;
-  
+  isValid = true;
   // This is a bit of a hack:
   // Normally the value of course will be used to evaluate whether
   // or not a waypoint will be used for midair initialization of 
@@ -175,28 +178,21 @@ FGAIFlightPlan::FGAIFlightPlan(FGAIAircraft *ac,
            if (wpt->name == "END") wpt->finished = true;
            else wpt->finished = false;
            waypoints.push_back(wpt);
-         }
-       }
-      catch (const sg_exception &) {
-       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
+          wpt_iterator = waypoints.begin();
+       } 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;
       time_t now = time(NULL) + fgGetLong("/sim/time/warp");
       time_t timeDiff = now-start; 
       leg = 1;
-      /*
-      if ((timeDiff > 300) && (timeDiff < 1200))
+      
+      if ((timeDiff > 60) && (timeDiff < 1200))
        leg = 2;
       else if ((timeDiff >= 1200) && (timeDiff < 1500))
        leg = 3;
@@ -204,14 +200,15 @@ FGAIFlightPlan::FGAIFlightPlan(FGAIAircraft *ac,
        leg = 4;
       else if (timeDiff >= 2000)
        leg = 5;
-      */
+      /*
       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());
       wpt_iterator = waypoints.begin();
-      create(ac, dep,arr, leg, alt, speed, lat, lon,
-            firstLeg, radius, fltType, acType, airline);
+      bool dist = 0;
+      isValid = create(ac, dep,arr, leg, alt, speed, lat, lon,
+            firstLeg, radius, fltType, acType, airline, dist);
       wpt_iterator = waypoints.begin();
       //cerr << "after create: " << (*wpt_iterator)->name << endl;
       //leg++;
@@ -419,6 +416,7 @@ 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 ((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;
@@ -428,7 +426,7 @@ void FGAIFlightPlan::setLeadDistance(double speed, double bearing,
   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){
@@ -501,3 +499,20 @@ int FGAIFlightPlan::getRouteIndex(int i) {
   else
     return 0;
 }
+
+
+double FGAIFlightPlan::checkTrackLength(string wptName) {
+    // skip the first two waypoints: first one is behind, second one is partially done;
+    double trackDistance = 0;
+    wpt_vector_iterator wptvec = waypoints.begin();
+    wptvec++;
+    wptvec++;
+    while ((wptvec != waypoints.end()) && ((*wptvec)->name != wptName)) {
+           trackDistance += (*wptvec)->trackLength;
+           wptvec++;
+    }
+    if (wptvec == waypoints.end()) {
+        trackDistance = 0; // name not found
+    }
+    return trackDistance;
+}
\ No newline at end of file