]> git.mxchange.org Git - flightgear.git/blobdiff - src/AIModel/AIFlightPlan.cxx
Make the sound-manager optional in a few places.
[flightgear.git] / src / AIModel / AIFlightPlan.cxx
index c937716a40d30e52519bdd3f8d1f693cc55b1130..f8f7c57636f3ec39f3de1265df69c719021480ef 100644 (file)
@@ -24,7 +24,6 @@
 
 #include <simgear/misc/sg_path.hxx>
 #include <simgear/debug/logstream.hxx>
-#include <simgear/route/waypoint.hxx>
 #include <simgear/math/sg_geodesy.hxx>
 #include <simgear/structure/exception.hxx>
 #include <simgear/constants.h>
@@ -71,45 +70,48 @@ bool FGAIWaypoint::contains(string target) {
 
 FGAIFlightPlan::FGAIFlightPlan() 
 {
-    rwy = 0;
-    sid = 0;
-    repeat = false;
-    distance_to_go = 0;
-    lead_distance = 0;
-    start_time = 0;
-    arrivalTime = 0;
-    leg = 10;
-    gateId = 0;
+    sid             = 0;
+    repeat          = false;
+    distance_to_go  = 0;
+    lead_distance   = 0;
+    start_time      = 0;
+    arrivalTime     = 0;
+    leg             = 10;
+    gateId          = 0;
     lastNodeVisited = 0;
-    taxiRoute = 0;
-    wpt_iterator = waypoints.begin();
-    isValid = true;
+    taxiRoute       = 0;
+    wpt_iterator    = waypoints.begin();
+    isValid         = true;
 }
 
 FGAIFlightPlan::FGAIFlightPlan(const string& filename)
 {
-  int i;
-  sid = 0;
-  start_time = 0;
-  leg = 10;
-  gateId = 0;
-  taxiRoute = 0;
+  sid               = 0;
+  repeat            = false;
+  distance_to_go    = 0;
+  lead_distance     = 0;
+  start_time        = 0;
+  arrivalTime       = 0;
+  leg               = 10;
+  gateId            = 0;
+  lastNodeVisited   = 0;
+  taxiRoute         = 0;
+
   SGPath path( globals->get_fg_root() );
   path.append( ("/AI/FlightPlans/" + filename).c_str() );
   SGPropertyNode root;
-  repeat = false;
 
   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;
   }
 
   SGPropertyNode * node = root.getNode("flightplan");
-  for (i = 0; i < node->nChildren(); i++) { 
+  for (int i = 0; i < node->nChildren(); i++) {
      //cout << "Reading waypoint " << i << endl;        
      FGAIWaypoint* wpt = new FGAIWaypoint;
      SGPropertyNode * wpt_node = node->getChild(i);
@@ -128,7 +130,7 @@ FGAIFlightPlan::FGAIFlightPlan(const string& filename)
      if (wpt->getName() == "END") wpt->setFinished(true);
      else wpt->setFinished(false);
 
-     waypoints.push_back( wpt );
+     pushBackWaypoint( wpt );
    }
 
   wpt_iterator = waypoints.begin();
@@ -145,45 +147,51 @@ FGAIFlightPlan::FGAIFlightPlan(const string& filename)
 // traffic manager. 
 FGAIFlightPlan::FGAIFlightPlan(FGAIAircraft *ac,
                                const std::string& p,
-                              double course,
-                              time_t start,
-                              FGAirport *dep,
-                              FGAirport *arr,
-                              bool firstLeg,
-                              double radius,
+                               double course,
+                               time_t start,
+                               FGAirport *dep,
+                               FGAirport *arr,
+                               bool firstLeg,
+                               double radius,
                                double alt,
                                double lat,
                                double lon,
                                double speed,
-                              const string& fltType,
-                              const string& acType,
-                              const string& airline)
+                               const string& fltType,
+                               const string& acType,
+                               const string& airline)
 {
-  sid = 0;
-  repeat = false;
-  leg = 10;
-  gateId=0;
-  taxiRoute = 0;
-  start_time = start;
-  bool useInitialWayPoint = true;
-  bool useCurrentWayPoint = false;
+  sid               = 0;
+  repeat            = false;
+  distance_to_go    = 0;
+  lead_distance     = 0;
+  start_time        = start;
+  arrivalTime       = 0;
+  leg               = 10;
+  gateId            = 0;
+  lastNodeVisited   = 0;
+  taxiRoute         = 0;
+
   SGPath path( globals->get_fg_root() );
   path.append( "/AI/FlightPlans" );
   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 
   // an AI aircraft. However, if a course value of 999 will be passed
   // when an update request is received, which will by definition always be
   // on the ground and should include all waypoints.
-  if (course == 999) 
-    {
-      useInitialWayPoint = false;
-      useCurrentWayPoint = true;
-    }
+//  bool useInitialWayPoint = true;
+//  bool useCurrentWayPoint = false;
+//  if (course == 999)
+//    {
+//      useInitialWayPoint = false;
+//      useCurrentWayPoint = true;
+//    }
 
   if (path.exists()) 
     {
@@ -193,7 +201,7 @@ FGAIFlightPlan::FGAIFlightPlan(FGAIAircraft *ac,
          
          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;
@@ -209,11 +217,11 @@ FGAIFlightPlan::FGAIFlightPlan(FGAIAircraft *ac,
            
            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 {
@@ -224,10 +232,12 @@ FGAIFlightPlan::FGAIFlightPlan(FGAIAircraft *ac,
       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)
@@ -236,104 +246,14 @@ 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 << " " << 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,
             firstLeg, radius, fltType, acType, airline, dist);
       wpt_iterator = waypoints.begin();
-      //cerr << "after create: " << (*wpt_iterator)->name << endl;
-      //leg++;
-      // Now that we have dynamically created a flight plan,
-      // we need to add some code that pops any waypoints already past.
-      //return;
     }
-  /*
-    waypoint* init_waypoint   = new waypoint;
-    init_waypoint->name       = string("initial position");
-    init_waypoint->latitude   = entity->latitude;
-    init_waypoint->longitude  = entity->longitude;
-    init_waypoint->altitude   = entity->altitude;
-    init_waypoint->speed      = entity->speed;
-    init_waypoint->crossat    = - 10000;
-    init_waypoint->gear_down  = false;
-    init_waypoint->flaps_down = false;
-    init_waypoint->finished   = false;
-    
-    wpt_vector_iterator i = waypoints.begin();
-    while (i != waypoints.end())
-    {
-      //cerr << "Checking status of each waypoint: " << (*i)->name << endl;
-       SGWayPoint first(init_waypoint->longitude, 
-                      init_waypoint->latitude, 
-                      init_waypoint->altitude);
-      SGWayPoint curr ((*i)->longitude, 
-                      (*i)->latitude, 
-                      (*i)->altitude);
-      double crse, crsDiff;
-      double dist;
-      curr.CourseAndDistance(first, &crse, &dist);
-      
-      dist *= SG_METER_TO_NM;
-      
-      // We're only interested in the absolute value of crsDiff
-      // wich should fall in the 0-180 deg range.
-      crsDiff = fabs(crse-course);
-      if (crsDiff > 180)
-       crsDiff = 360-crsDiff;
-      // These are the three conditions that we consider including
-      // in our flight plan:
-      // 1) current waypoint is less then 100 miles away OR
-      // 2) curren waypoint is ahead of us, at any distance
-     
-      if ((dist > 20.0) && (crsDiff > 90.0) && ((*i)->name != string ("EOF")))
-       {
-         //useWpt = false;
-         // Once we start including waypoints, we have to continue, even though
-         // one of the following way point would suffice. 
-         // so once is the useWpt flag is set to true, we cannot reset it to false.
-         //cerr << "Discarding waypoint: " << (*i)->name 
-         //   << ": Course difference = " << crsDiff
-         //  << "Course = " << course
-         // << "crse   = " << crse << endl;
-       }
-      else
-       useCurrentWayPoint = true;
-      
-      if (useCurrentWayPoint)
-       {
-         if ((dist > 100.0) && (useInitialWayPoint))
-           {
-             //waypoints.push_back(init_waypoint);;
-             waypoints.insert(i, init_waypoint);
-             //cerr << "Using waypoint : " << init_waypoint->name <<  endl;
-           }
-         //if (useInitialWayPoint)
-         // {
-         //    (*i)->speed = dist; // A hack
-         //  }
-         //waypoints.push_back( wpt );
-         //cerr << "Using waypoint : " << (*i)->name 
-         //  << ": course diff : " << crsDiff 
-         //   << "Course = " << course
-         //   << "crse   = " << crse << endl
-         //    << "distance      : " << dist << endl;
-         useInitialWayPoint = false;
-         i++;
-       }
-      else 
-       {
-         //delete wpt;
-         delete *(i);
-         i = waypoints.erase(i);
-         }
-         
-       }
-  */
-  //for (i = waypoints.begin(); i != waypoints.end(); i++)
-  //  cerr << "Using waypoint : " << (*i)->name << endl;
-  //wpt_iterator = waypoints.begin();
-  //cout << waypoints.size() << " waypoints read." << endl;
+
 }
 
 
@@ -358,6 +278,8 @@ FGAIWaypoint* const FGAIFlightPlan::getPreviousWaypoint( void ) const
 
 FGAIWaypoint* const FGAIFlightPlan::getCurrentWaypoint( void ) const
 {
+  if (wpt_iterator == waypoints.end())
+      return 0;
   return *wpt_iterator;
 }
 
@@ -408,10 +330,19 @@ void FGAIFlightPlan::DecrementWaypoint(bool eraseWaypoints )
     }
     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), 
@@ -503,10 +434,20 @@ void FGAIFlightPlan::resetWaypoints()
       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()
 {
@@ -544,4 +485,12 @@ double FGAIFlightPlan::checkTrackLength(string wptName) {
         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);
+}