]> git.mxchange.org Git - flightgear.git/blobdiff - src/AIModel/AIFlightPlanCreate.cxx
Major update of traffic manager and AI related airport facilities.
[flightgear.git] / src / AIModel / AIFlightPlanCreate.cxx
index 1f772ccc0eac92ad2007602a965ee0ad87eef12b..ccb677bb80c60e05b0d1f6316674defc201e6180 100644 (file)
@@ -44,7 +44,7 @@ void FGAIFlightPlan::create(FGAirport *dep, FGAirport *arr, int legNr,
   int currWpt = wpt_iterator - waypoints.begin();
   switch(legNr)
     {
-    case 1:
+      case 1:
       createPushBack(firstFlight,dep, latitude, longitude, 
                     radius, fltType, aircraftType, airline);
       break;
@@ -140,10 +140,9 @@ void FGAIFlightPlan::createPushBack(bool firstFlight, FGAirport *dep,
   wpt->flaps_down= true;
   wpt->finished  = false;
   wpt->on_ground = true;
+
   waypoints.push_back(wpt); 
   
-  // Add park twice, because it uses park once for initialization and once
-  // to trigger the departure ATC message 
   geo_direct_wgs_84 ( 0, lat, lon, heading, 
                      10, 
                      &lat2, &lon2, &az2 );
@@ -158,6 +157,7 @@ void FGAIFlightPlan::createPushBack(bool firstFlight, FGAirport *dep,
   wpt->flaps_down= true;
   wpt->finished  = false;
   wpt->on_ground = true;
+  wpt->routeIndex = 0;
   waypoints.push_back(wpt); 
   geo_direct_wgs_84 ( 0, lat, lon, heading, 
                      2.2*radius,           
@@ -173,6 +173,7 @@ void FGAIFlightPlan::createPushBack(bool firstFlight, FGAirport *dep,
   wpt->flaps_down= true;
   wpt->finished  = false;
   wpt->on_ground = true;
+  wpt->routeIndex = 0;
   waypoints.push_back(wpt);  
 }
 
@@ -185,10 +186,8 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction,
                                double radius, const string& fltType, 
                                const string& acType, const string& airline)
 {
-  double wind_speed;
-  double wind_heading;
   double heading;
-  double lat, lon, az;
+  double lat, lon;
   double lat2, lon2, az2;
   waypoint *wpt;
 
@@ -282,6 +281,7 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction,
            wpt->flaps_down= true;
            wpt->finished  = false;
            wpt->on_ground = true;
+           wpt->routeIndex = 0;
            waypoints.push_back(wpt);
            
            //Add the runway startpoint;
@@ -296,6 +296,7 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction,
            wpt->flaps_down= true;
            wpt->finished  = false;
            wpt->on_ground = true;
+           wpt->routeIndex = 0;
            waypoints.push_back(wpt);   
          } else {
            int node;
@@ -314,8 +315,7 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction,
                isPushBackPoint = false;
                taxiRoute->next(&node);
              }
-           }
-           else {
+           } else {
              //chop off the first two waypoints, because
              // those have already been created
              // by create pushback
@@ -325,13 +325,16 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction,
                taxiRoute->next(&node);
              }
            }
-           while(taxiRoute->next(&node))
+           int route;
+           while(taxiRoute->next(&node, &route))
              {
                //FGTaxiNode *tn = apt->getDynamics()->getGroundNetwork()->findSegment(node)->getEnd();
+               char buffer[10];
+               snprintf (buffer, 10, "%d", node);
                FGTaxiNode *tn = apt->getDynamics()->getGroundNetwork()->findNode(node);
                //ids.pop_back();  
                wpt = new waypoint;
-               wpt->name      = "taxiway"; // fixme: should be the name of the taxiway
+               wpt->name      = string(buffer); // fixme: should be the name of the taxiway
                wpt->latitude  = tn->getLatitude();
                wpt->longitude = tn->getLongitude();
                // Elevation is currently disregarded when on_ground is true
@@ -349,23 +352,27 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction,
                wpt->flaps_down= true;
                wpt->finished  = false;
                wpt->on_ground = true;
+               wpt->routeIndex = route;
                waypoints.push_back(wpt);
              }
            //cerr << endl;
            // finally, rewind the taxiRoute object to the point where we started
+           // generating the Flightplan, for AI use.
+           // This is a bit tricky, because the 
            taxiRoute->first();
            if (firstFlight) { 
-             for (int i = 0; i < nrWaypointsToSkip-2; i++) {
+             for (int i = 0; i < nrWaypointsToSkip-1; i++) {
                taxiRoute->next(&node);
              }
            } else {
              int size = taxiRoute->size();
              if (size > 2) {
-               taxiRoute->next(&node);
-               taxiRoute->next(&node);
+               //taxiRoute->next(&node);
+               //taxiRoute->next(&node);       
+               //taxiRoute->next(&node);
              }
            }
-         }
+         } // taxiRoute not empty
        }
       else 
        {
@@ -382,6 +389,7 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction,
          wpt->flaps_down= true;
          wpt->finished  = false;
          wpt->on_ground = true;
+         wpt->routeIndex = 0;
          waypoints.push_back(wpt);
          
          //Add the runway startpoint;
@@ -396,6 +404,7 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction,
          wpt->flaps_down= true;
          wpt->finished  = false;
          wpt->on_ground = true;
+         wpt->routeIndex = 0;
          waypoints.push_back(wpt);
        }
     }
@@ -443,13 +452,14 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction,
            wpt->flaps_down= true;
            wpt->finished  = false;
            wpt->on_ground = true;
+           wpt->routeIndex = 0;
            waypoints.push_back(wpt);
            
            //Add the runway startpoint;
            wpt = new waypoint;
            wpt->name      = "Runway Takeoff";
-           wpt->latitude  = lat2;
-           wpt->longitude = lon2;
+           wpt->latitude  = lat3;
+           wpt->longitude = lon3;
            wpt->altitude  = apt->getElevation();
            wpt->speed     = 15; 
            wpt->crossat   = -10000;
@@ -457,6 +467,7 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction,
            wpt->flaps_down= true;
            wpt->finished  = false;
            wpt->on_ground = true;
+           wpt->routeIndex = 0;
            waypoints.push_back(wpt);   
          } else {
            int node;
@@ -464,13 +475,17 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction,
            int size = taxiRoute->size();
            // Omit the last two waypoints, as 
            // those are created by createParking()
+           int route;
            for (int i = 0; i < size-2; i++)
              {
-               taxiRoute->next(&node);
+               taxiRoute->next(&node, &route);
+               char buffer[10];
+               snprintf (buffer, 10, "%d", node);
                //FGTaxiNode *tn = apt->getDynamics()->getGroundNetwork()->findNode(node);
                FGTaxiNode *tn = apt->getDynamics()->getGroundNetwork()->findNode(node);
                wpt = new waypoint;
-               wpt->name      = "taxiway"; // fixme: should be the name of the taxiway
+               //wpt->name      = "taxiway"; // fixme: should be the name of the taxiway
+               wpt->name      = string(buffer);// fixme: should be the name of the taxiway
                wpt->latitude  = tn->getLatitude();
                wpt->longitude = tn->getLongitude();
                wpt->altitude  = apt->getElevation();
@@ -480,8 +495,11 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction,
                wpt->flaps_down= true;
                wpt->finished  = false;
                wpt->on_ground = true;
+               wpt->routeIndex = route;
                waypoints.push_back(wpt);
              }
+           //taxiRoute->first();
+           //taxiRoute->next(&node);
          }
        }
       else
@@ -505,6 +523,7 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction,
          wpt->flaps_down= true;
          wpt->finished  = false;
          wpt->on_ground = true;
+         wpt->routeIndex = 0;
          waypoints.push_back(wpt);
         
          wpt = new waypoint;
@@ -518,6 +537,7 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction,
          wpt->flaps_down= true;
          wpt->finished  = false;
          wpt->on_ground = true;
+         wpt->routeIndex = 0;
          waypoints.push_back(wpt); 
 
          //waypoint* wpt;
@@ -540,6 +560,7 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction,
          wpt->flaps_down= true;
          wpt->finished  = false;
          wpt->on_ground = true;
+         wpt->routeIndex = 0;
          waypoints.push_back(wpt);
        }
       
@@ -552,8 +573,6 @@ void FGAIFlightPlan::createTaxi(bool firstFlight, int direction,
  ******************************************************************/
 void FGAIFlightPlan::createTakeOff(bool firstFlight, FGAirport *apt, double speed)
 {
-  double wind_speed;
-  double wind_heading;
   double heading;
   double lat, lon, az;
   double lat2, lon2, az2;
@@ -579,6 +598,7 @@ void FGAIFlightPlan::createTakeOff(bool firstFlight, FGAirport *apt, double spee
            exit(1);
          }
     }
+  // Acceleration point, 105 meters into the runway,
   heading = rwy._heading;
   double azimuth = heading + 180.0;
   while ( azimuth >= 360.0 ) { azimuth -= 360.0; }
@@ -596,19 +616,41 @@ void FGAIFlightPlan::createTakeOff(bool firstFlight, FGAirport *apt, double spee
   wpt->flaps_down= true;
   wpt->finished  = false;
   wpt->on_ground = true;
+  wpt->routeIndex = 0;
   waypoints.push_back(wpt); 
   
   lat = lat2;
   lon = lon2;
   az  = az2;
   
-  //Next: the Start of Climb
+  //Start Climbing to 3000 ft. Let's do this 
+  // at the center of the runway for now:
+  // 
   geo_direct_wgs_84 ( 0, lat, lon, heading, 
   2560 * SG_FEET_TO_METER,
   &lat2, &lon2, &az2 );
   
   wpt = new waypoint;
   wpt->name      = "SOC";
+  wpt->latitude  = rwy._lat;
+  wpt->longitude = rwy._lon;
+  wpt->altitude  = apt->getElevation()+1000;
+  wpt->speed     = speed; 
+  wpt->crossat   = -10000;
+  wpt->gear_down = true;
+  wpt->flaps_down= true;
+  wpt->finished  = false;
+  wpt->on_ground = false;
+  wpt->routeIndex = 0;
+  waypoints.push_back(wpt);
+
+
+ geo_direct_wgs_84 ( 0, rwy._lat, rwy._lon, heading, 
+  rwy._length * SG_FEET_TO_METER,
+  &lat2, &lon2, &az2 );
+
+  wpt = new waypoint;
+  wpt->name      = "3000 ft";
   wpt->latitude  = lat2;
   wpt->longitude = lon2;
   wpt->altitude  = apt->getElevation()+3000;
@@ -618,7 +660,48 @@ void FGAIFlightPlan::createTakeOff(bool firstFlight, FGAirport *apt, double spee
   wpt->flaps_down= true;
   wpt->finished  = false;
   wpt->on_ground = false;
+  wpt->routeIndex = 0;
   waypoints.push_back(wpt);
+
+// Finally, add two more waypoints, so that aircraft will remain under
+  // Tower control until they have reached the 3000 ft climb point
+
+
+ geo_direct_wgs_84 ( 0, rwy._lat, rwy._lon, heading, 
+  5000,
+  &lat2, &lon2, &az2 );
+
+
+  wpt = new waypoint;
+  wpt->name      = "5000 ft";
+  wpt->latitude  = lat2;
+  wpt->longitude = lon2;
+  wpt->altitude  = apt->getElevation()+5000;
+  wpt->speed     = speed; 
+  wpt->crossat   = -10000;
+  wpt->gear_down = true;
+  wpt->flaps_down= true;
+  wpt->finished  = false;
+  wpt->on_ground = false;
+  wpt->routeIndex = 0;
+  waypoints.push_back(wpt);  
+
+ //  geo_direct_wgs_84 ( 0, rwy._lat, rwy._lon, heading, 
+//   100000,
+//   &lat2, &lon2, &az2 );
+//   wpt = new waypoint;
+//   wpt->name      = "5100 ft";
+//   wpt->latitude  = lat2;
+//   wpt->longitude = lon2;
+//   wpt->altitude  = apt->getElevation()+5100;
+//   wpt->speed     = speed; 
+//   wpt->crossat   = -10000;
+//   wpt->gear_down = true;
+//   wpt->flaps_down= true;
+//   wpt->finished  = false;
+//   wpt->on_ground = false;
+//   wpt->routeIndex = 0;
+//   waypoints.push_back(wpt);
 }
  
 /*******************************************************************
@@ -627,11 +710,8 @@ void FGAIFlightPlan::createTakeOff(bool firstFlight, FGAirport *apt, double spee
  ******************************************************************/
 void FGAIFlightPlan::createClimb(bool firstFlight, FGAirport *apt, double speed, double alt)
 {
-  double wind_speed;
-  double wind_heading;
   double heading;
   //FGRunway rwy;
-  double lat, lon, az;
   double lat2, lon2, az2;
   //int direction;
   waypoint *wpt;
@@ -674,6 +754,7 @@ void FGAIFlightPlan::createClimb(bool firstFlight, FGAirport *apt, double speed,
   wpt->flaps_down= true;
   wpt->finished  = false;
   wpt->on_ground = false;
+  wpt->routeIndex = 0;
   waypoints.push_back(wpt); 
   
 
@@ -691,6 +772,7 @@ void FGAIFlightPlan::createClimb(bool firstFlight, FGAirport *apt, double speed,
   wpt->flaps_down= true;
   wpt->finished  = false;
   wpt->on_ground = false;
+  wpt->routeIndex = 0;
   waypoints.push_back(wpt); 
 }
 
@@ -767,11 +849,8 @@ void FGAIFlightPlan::createDecent(FGAirport *apt)
 {
 
   // Ten thousand ft. Slowing down to 240 kts
-  double wind_speed;
-  double wind_heading;
   double heading;
   //FGRunway rwy;
-  double lat, lon, az;
   double lat2, lon2, az2;
   double azimuth;
   //int direction;
@@ -809,6 +888,7 @@ void FGAIFlightPlan::createDecent(FGAirport *apt)
   wpt->flaps_down= false;
   wpt->finished  = false;
   wpt->on_ground = false;
+  wpt->routeIndex = 0;
   waypoints.push_back(wpt);  
   
   // Three thousand ft. Slowing down to 160 kts
@@ -826,6 +906,7 @@ void FGAIFlightPlan::createDecent(FGAirport *apt)
   wpt->flaps_down= true;
   wpt->finished  = false;
   wpt->on_ground = false;
+  wpt->routeIndex = 0;
   waypoints.push_back(wpt);
 }
 /*******************************************************************
@@ -835,11 +916,8 @@ void FGAIFlightPlan::createDecent(FGAirport *apt)
 void FGAIFlightPlan::createLanding(FGAirport *apt)
 {
   // Ten thousand ft. Slowing down to 150 kts
-  double wind_speed;
-  double wind_heading;
   double heading;
   //FGRunway rwy;
-  double lat, lon, az;
   double lat2, lon2, az2;
   double azimuth;
   //int direction;
@@ -865,6 +943,7 @@ void FGAIFlightPlan::createLanding(FGAirport *apt)
   wpt->flaps_down= true;
   wpt->finished  = false;
   wpt->on_ground = true;
+  wpt->routeIndex = 0;
   waypoints.push_back(wpt); 
 
  //Full stop at the runway centerpoint
@@ -882,6 +961,7 @@ void FGAIFlightPlan::createLanding(FGAirport *apt)
   wpt->flaps_down= true;
   wpt->finished  = false;
   wpt->on_ground = true;
+  wpt->routeIndex = 0;
   waypoints.push_back(wpt);
 
  geo_direct_wgs_84 ( 0, rwy._lat, rwy._lon, heading, 
@@ -898,6 +978,7 @@ void FGAIFlightPlan::createLanding(FGAirport *apt)
   wpt->flaps_down= true;
   wpt->finished  = false;
   wpt->on_ground = true;
+  wpt->routeIndex = 0;
   waypoints.push_back(wpt); 
 }
 
@@ -930,6 +1011,7 @@ void FGAIFlightPlan::createParking(FGAirport *apt, double radius)
   wpt->flaps_down= true;
   wpt->finished  = false;
   wpt->on_ground = true;
+  wpt->routeIndex = 0;
   waypoints.push_back(wpt); 
   geo_direct_wgs_84 ( 0, lat, lon, heading, 
                      0.1 *radius,           
@@ -945,6 +1027,7 @@ void FGAIFlightPlan::createParking(FGAirport *apt, double radius)
   wpt->flaps_down= true;
   wpt->finished  = false;
   wpt->on_ground = true;
+  wpt->routeIndex = 0;
   waypoints.push_back(wpt);   
 
   wpt = new waypoint;
@@ -958,5 +1041,6 @@ void FGAIFlightPlan::createParking(FGAirport *apt, double radius)
   wpt->flaps_down= true;
   wpt->finished  = false;
   wpt->on_ground = true;
+  wpt->routeIndex = 0;
   waypoints.push_back(wpt);
 }