]> git.mxchange.org Git - flightgear.git/blobdiff - src/AIModel/AIAircraft.cxx
Merge branch 'durk/traffic'
[flightgear.git] / src / AIModel / AIAircraft.cxx
index 6207ffbdafa51ce234ce0f9b8c247b893f50800b..2bf71b3b18b96b35a66462bce9f0fe2c9e282e97 100644 (file)
@@ -33,6 +33,7 @@
 #include <string>
 #include <math.h>
 #include <time.h>
+
 #ifdef _MSC_VER
 #  include <float.h>
 #  define finite _finite
@@ -50,9 +51,6 @@ using std::string;
 
 static string tempReg;
 
-class AI_OutOfSight{};
-class FP_Inactive{};
-
 FGAIAircraft::FGAIAircraft(FGAISchedule *ref) : FGAIBase(otAircraft) {
     trafficRef = ref;
     if (trafficRef) {
@@ -79,11 +77,12 @@ FGAIAircraft::FGAIAircraft(FGAISchedule *ref) : FGAIBase(otAircraft) {
     alt_lock = false;
     roll = 0;
     headingChangeRate = 0.0;
+    headingError = 0;
 
     holdPos = false;
 
     _performance = 0; //TODO initialize to JET_TRANSPORT from PerformanceDB
-    
+    dt = 0;
 }
 
 
@@ -113,6 +112,9 @@ void FGAIAircraft::bind() {
     props->tie("controls/gear/gear-down",
                SGRawValueMethods<FGAIAircraft,bool>(*this,
                                                     &FGAIAircraft::_getGearDown));
+    props->tie("transponder-id",
+               SGRawValueMethods<FGAIAircraft,const char*>(*this,
+                                                    &FGAIAircraft::_getTransponderCode));
 }
 
 
@@ -120,6 +122,7 @@ void FGAIAircraft::unbind() {
     FGAIBase::unbind();
 
     props->untie("controls/gear/gear-down");
+    props->untie("transponder-id");
 }
 
 
@@ -142,16 +145,16 @@ void FGAIAircraft::setPerformance(const std::string& acclass) {
 
  void FGAIAircraft::Run(double dt) {
       FGAIAircraft::dt = dt;
-
-     try {
-         updatePrimaryTargetValues(); // target hdg, alt, speed
-     }
-     catch (AI_OutOfSight) {
-         return;
+    
+     bool outOfSight = false, 
+        flightplanActive = true;
+     updatePrimaryTargetValues(flightplanActive, outOfSight); // target hdg, alt, speed
+     if (outOfSight) {
+        return;
      }
-     catch (FP_Inactive) {
-         //return;
-         groundTargetSpeed = 0;
+
+     if (!flightplanActive) {
+        groundTargetSpeed = 0;
      }
 
      handleATCRequests(); // ATC also has a word to say
@@ -163,21 +166,9 @@ void FGAIAircraft::setPerformance(const std::string& acclass) {
 
 void FGAIAircraft::checkVisibility() 
 {
-     double visibility_meters = fgGetDouble("/environment/visibility-m");
-
-     FGViewer* vw = globals->get_current_view();
-     double course, distance;
-
-     SGWayPoint current(pos.getLongitudeDeg(), pos.getLatitudeDeg(), 0);
-     SGWayPoint view (vw->getLongitude_deg(), vw->getLatitude_deg(), 0);
-     view.CourseAndDistance(current, &course, &distance);
-     if (distance > visibility_meters) {
-         //aip.getSGLocation()->set_cur_elev_m(aptElev);
-         //return;
-         invisible = true;
-      } else {
-         invisible = false;
-      }
+  double visibility_meters = fgGetDouble("/environment/visibility-m");
+  FGViewer* vw = globals->get_current_view();
+  invisible = (SGGeodesy::distanceM(vw->getPosition(), pos) > visibility_meters);
 }
 
 
@@ -285,8 +276,8 @@ void FGAIAircraft::ProcessFlightPlan( double dt, time_t now ) {
         }
 
         //TODO let the fp handle this (loading of next leg)
-        fp->IncrementWaypoint((bool) trafficRef);
-        if (!(fp->getNextWaypoint()) && trafficRef)
+        fp->IncrementWaypoint( trafficRef != 0 );
+        if (!(fp->getNextWaypoint()) && trafficRef != 0)
             if (!loadNextLeg()) {
                 setDie(true);
                 return;
@@ -345,6 +336,11 @@ bool FGAIAircraft::_getGearDown() const {
 }
 
 
+const char * FGAIAircraft::_getTransponderCode() const {
+  return transponderCode.c_str();
+}
+
+
 bool FGAIAircraft::loadNextLeg() {
 
     int leg;
@@ -353,7 +349,6 @@ bool FGAIAircraft::loadNextLeg() {
             return false;
         }
         setCallSign(trafficRef->getCallSign());
-       //props->setStringValue("callsign", callsign.c_str());
         leg = 1;
         fp->setLeg(leg);
     }
@@ -366,10 +361,11 @@ bool FGAIAircraft::loadNextLeg() {
     } else {
         double cruiseAlt = trafficRef->getCruiseAlt() * 100;
 
-        fp->create (dep,
+        fp->create (this,
+                    dep,
                     arr,
                     leg,
-                    cruiseAlt,           //(trafficRef->getCruiseAlt() * 100), // convert from FL to feet
+                    cruiseAlt,
                     trafficRef->getSpeed(),
                     _getLatitude(),
                     _getLongitude(),
@@ -402,28 +398,20 @@ void FGAIAircraft::getGroundElev(double dt) {
     // Only do the proper hitlist stuff if we are within visible range of the viewer.
     if (!invisible) {
         double visibility_meters = fgGetDouble("/environment/visibility-m");
-
         FGViewer* vw = globals->get_current_view();
-        double course, distance;
-
-        SGWayPoint current(pos.getLongitudeDeg(), pos.getLatitudeDeg(), 0);
-        SGWayPoint view (vw->getLongitude_deg(), vw->getLatitude_deg(), 0);
-        view.CourseAndDistance(current, &course, &distance);
-        if (distance > visibility_meters) {
-            //aip.getSGLocation()->set_cur_elev_m(aptElev);
+        
+        if (SGGeodesy::distanceM(vw->getPosition(), pos) > visibility_meters) {
             return;
         }
 
-        // FIXME: make sure the pos.lat/pos.lon values are in degrees ...
         double range = 500.0;
-        if (!globals->get_tile_mgr()->scenery_available(pos.getLatitudeDeg(), pos.getLongitudeDeg(), range)) {
+        if (!globals->get_tile_mgr()->scenery_available(pos, range)) {
             // Try to shedule tiles for that position.
-            globals->get_tile_mgr()->update( aip.getSGLocation(), range );
+            globals->get_tile_mgr()->update( pos, range );
         }
 
-        // FIXME: make sure the pos.lat/pos.lon values are in degrees ...
         double alt;
-        if (globals->get_scenery()->get_elevation_m(pos.getLatitudeDeg(), pos.getLongitudeDeg(), 20000.0, alt, 0))
+        if (getGroundElevationM(SGGeod::fromGeodM(pos, 20000), alt, 0))
             tgt_altitude_ft = alt * SG_METER_TO_FEET;
     }
 }
@@ -456,15 +444,6 @@ void FGAIAircraft::announcePositionToController() {
         case 4:              //Take off tower controller
             if (trafficRef->getDepartureAirport()->getDynamics()) {
                 controller = trafficRef->getDepartureAirport()->getDynamics()->getTowerController();
-                //if (trafficRef->getDepartureAirport()->getId() == "EHAM") {
-                //string trns = trafficRef->getCallSign() + " at runway " + fp->getRunway() + 
-                //              ". Ready for departure. " + trafficRef->getFlightType() + " to " +
-                //              trafficRef->getArrivalAirport()->getId();
-                //fgSetString("/sim/messages/atc", trns.c_str());
-                //  if (controller == 0) {
-                //cerr << "Error in assigning controller at " << trafficRef->getDepartureAirport()->getId() << endl;
-                //}
-                //}
             } else {
                 cerr << "Error: Could not find Dynamics at airport : " << trafficRef->getDepartureAirport()->getId() << endl;
             }
@@ -655,16 +634,10 @@ bool FGAIAircraft::leadPointReached(FGAIFlightPlan::waypoint* curr) {
 
 
 bool FGAIAircraft::aiTrafficVisible() {
-    double userLatitude  = fgGetDouble("/position/latitude-deg");
-    double userLongitude = fgGetDouble("/position/longitude-deg");
-    double course, distance;
-
-    SGWayPoint current(pos.getLongitudeDeg(), pos.getLatitudeDeg(), 0);
-    SGWayPoint user (userLongitude, userLatitude, 0);
-
-    user.CourseAndDistance(current, &course, &distance);
-
-    return ((distance * SG_METER_TO_NM) <= TRAFFICTOAIDISTTODIE);
+  SGGeod userPos(SGGeod::fromDeg(fgGetDouble("/position/longitude-deg"), 
+    fgGetDouble("/position/latitude-deg")));
+  
+  return (SGGeodesy::distanceNm(userPos, pos) <= TRAFFICTOAIDISTTODIE);
 }
 
 
@@ -763,7 +736,7 @@ void FGAIAircraft::controlSpeed(FGAIFlightPlan::waypoint* curr, FGAIFlightPlan::
 /**
  * Update target values (heading, alt, speed) depending on flight plan or control properties
  */
-void FGAIAircraft::updatePrimaryTargetValues() {
+void FGAIAircraft::updatePrimaryTargetValues(bool& flightplanActive, bool& aiOutOfSight) {
     if (fp)                      // AI object has a flightplan
     {
         //TODO make this a function of AIBase
@@ -784,16 +757,16 @@ void FGAIAircraft::updatePrimaryTargetValues() {
         }
         if (trafficRef) {
            //cerr << trafficRef->getRegistration() << " Setting altitude to " << altitude_ft;
-            if (! aiTrafficVisible()) {
+            aiOutOfSight = !aiTrafficVisible();
+            if (aiOutOfSight) {
                 setDie(true);
                 //cerr << trafficRef->getRegistration() << " is set to die " << endl;
-                throw AI_OutOfSight();
+                aiOutOfSight = true;
+                return;
             }
         }
         timeElapsed = now - fp->getStartTime();
-        if (! fp->isActive(now)) { 
-            throw FP_Inactive();
-        }
+        flightplanActive = fp->isActive(now);
     } else {
         // no flight plan, update target heading, speed, and altitude
         // from control properties.  These default to the initial