]> git.mxchange.org Git - flightgear.git/blobdiff - src/Airports/dynamics.cxx
Conditional compilation of ATCDCL module. Use --disable-atcdcl to try building flight...
[flightgear.git] / src / Airports / dynamics.cxx
index bef81ebe60bf228e5862ae039913a07e9be8f781..3e658a1473aa5effe73f158c7fe181d1e2c797b0 100644 (file)
@@ -26,7 +26,6 @@
 
 #include <simgear/compiler.h>
 
-#include <plib/sg.h>
 #include <plib/ul.h>
 
 #include <Environment/environment_mgr.hxx>
@@ -52,7 +51,7 @@ using std::random_shuffle;
 #include "dynamics.hxx"
 
 FGAirportDynamics::FGAirportDynamics(FGAirport* ap) :
-  _ap(ap), rwyPrefs(ap) {
+  _ap(ap), rwyPrefs(ap), SIDs(ap) {
   lastUpdate = 0;
 
   // For testing only. This needs to be refined when we move ATIS functionality over.
@@ -61,7 +60,8 @@ FGAirportDynamics::FGAirportDynamics(FGAirport* ap) :
 
 // Note that the ground network should also be copied
 FGAirportDynamics::FGAirportDynamics(const FGAirportDynamics& other) :
-  rwyPrefs(other.rwyPrefs)
+  rwyPrefs(other.rwyPrefs),
+  SIDs(other.SIDs)
 {
   for (FGParkingVecConstIterator ip= other.parkings.begin(); ip != other.parkings.end(); ip++)
     parkings.push_back(*(ip));
@@ -343,7 +343,7 @@ void FGAirportDynamics::setRwyUse(const FGRunwayPreference& ref)
   //exit(1);
 }
 
-bool FGAirportDynamics::innerGetActiveRunway(const string &trafficType, int action, string &runway)
+bool FGAirportDynamics::innerGetActiveRunway(const string &trafficType, int action, string &runway, double heading)
 {
 double windSpeed;
   double windHeading;
@@ -452,7 +452,7 @@ double windSpeed;
              // Note that the randomization below, is just a placeholder to choose between
              // multiple active runways for this action. This should be
              // under ATC control.
-             runway = takeoff[(rand() %  nr)];
+             runway = chooseRwyByHeading (takeoff, heading);
            }
          else
            { // Fallback
@@ -465,7 +465,7 @@ double windSpeed;
          int nr = landing.size();
          if (nr)
            {
-             runway = landing[(rand() % nr)];
+             runway = chooseRwyByHeading (landing, heading);
            }
          else
            {  //fallback
@@ -476,9 +476,28 @@ double windSpeed;
   return true;
 }
 
-void FGAirportDynamics::getActiveRunway(const string &trafficType, int action, string &runway)
+string FGAirportDynamics::chooseRwyByHeading(stringVec rwys, double heading) {
+   double bestError = 360.0;
+   double rwyHeading, headingError;
+   string runway;
+   for (stringVecIterator i = rwys.begin(); i != rwys.end(); i++) {
+       FGRunway *rwy = _ap->getRunwayByIdent((*i));
+       rwyHeading = rwy->headingDeg();
+       headingError = fabs(heading - rwyHeading);
+        if (headingError > 180)
+            headingError = fabs(headingError - 360);
+        if (headingError < bestError) {
+            runway = (*i);
+            bestError = headingError;
+        }
+   }
+   //cerr << "Using active runway " << runway << " for heading " << heading << endl;
+   return runway;
+}
+
+void FGAirportDynamics::getActiveRunway(const string &trafficType, int action, string &runway, double heading)
 {
-  bool ok = innerGetActiveRunway(trafficType, action, runway);
+  bool ok = innerGetActiveRunway(trafficType, action, runway, heading);
   if (!ok) {
     runway = chooseRunwayFallback();
   }
@@ -517,23 +536,28 @@ const string& FGAirportDynamics::getId() const {
 // so that at least I can start working on assigning different frequencies to different
 // operations.
 
-int FGAirportDynamics::getGroundFrequency(int leg) { 
+int FGAirportDynamics::getGroundFrequency(unsigned leg) { 
      //return freqGround.size() ? freqGround[0] : 0; };
-     int groundFreq;
+     int groundFreq = 0;
      if (leg < 2) {
          SG_LOG(SG_ATC, SG_ALERT, "Leg value is smaller than two at " << SG_ORIGIN);
      }
      if (freqGround.size() == 0) {
          return 0;
      }
-     if ((freqGround.size() >= leg-1) && (leg > 1)) {
+     if ((freqGround.size() > leg-1) && (leg > 1)) {
           groundFreq =  freqGround[leg-1];
      }
      if ((freqGround.size() < leg-1) && (leg > 1)) {
-          groundFreq = (freqGround.size() < (leg-2)) ? freqGround[freqGround.size()-1] : freqGround[leg-2];
+          groundFreq = (freqGround.size() < (leg-1)) ? freqGround[freqGround.size()-1] : freqGround[leg-2];
      }
      if ((freqGround.size() >= leg-1) && (leg > 1)) {
           groundFreq = freqGround[leg-2];
      }
     return groundFreq;
-}
\ No newline at end of file
+}
+
+FGAIFlightPlan *FGAirportDynamics::getSID(string activeRunway, double heading)
+{
+   return SIDs.getBest(activeRunway, heading);
+}