]> git.mxchange.org Git - flightgear.git/blobdiff - src/Airports/groundnetwork.cxx
Avoid some useless file accesses
[flightgear.git] / src / Airports / groundnetwork.cxx
index 32dbdfc15ef55bc3a9d342007b9d15ea5be4f865..a642a7768bedc6584a366618837dea9ffce40351 100644 (file)
@@ -173,6 +173,7 @@ bool FGTaxiRoute::next(int *nde, int *rte)
     return true;
 };
 
+
 void FGTaxiRoute::rewind(int route)
 {
     int currPoint;
@@ -534,7 +535,19 @@ void FGGroundNetwork::signOff(int id)
         i = activeTraffic.erase(i);
     }
 }
-
+/**
+ * The ground network can deal with the following states:
+ * 0 =  Normal; no action required
+ * 1 = "Acknowledge "Hold position
+ * 2 = "Acknowledge "Resume taxi".
+ * 3 = "Issue TaxiClearance"
+ * 4 = Acknowledge Taxi Clearance"
+ * 5 = Post acknowlegde taxiclearance: Start taxiing
+ * 6 = Report runway
+ * 7 = Acknowledge report runway
+ * 8 = Switch tower frequency
+ * 9 = Acknowledge switch tower frequency
+ *************************************************************************************************************************/
 bool FGGroundNetwork::checkTransmissionState(int minState, int maxState, TrafficVectorIterator i, time_t now, AtcMsgId msgId,
                                AtcMsgDir msgDir)
 {
@@ -547,7 +560,7 @@ bool FGGroundNetwork::checkTransmissionState(int minState, int maxState, Traffic
             if (n == 0) {
                 trans_num->setIntValue(-1);
                  // PopupCallback(n);
-                 cerr << "Selected transmission message " << n << endl;
+                 //cerr << "Selected transmission message " << n << endl;
                  FGATCManager *atc = (FGATCManager*) globals->get_subsystem("atc");
                  atc->getATCDialog()->removeEntry(1);
             } else {
@@ -634,12 +647,11 @@ void FGGroundNetwork::updateAircraftInformation(int id, double lat, double lon,
         if ((state == 5) && available) {
             current->setState(0);
             current->getAircraft()->setTaxiClearanceRequest(false);
-            current->setHoldPosition(true);
+            current->setHoldPosition(false);
             available = false;
         }
 
     }
-
 }
 
 /**
@@ -723,6 +735,10 @@ void FGGroundNetwork::checkSpeedAdjustment(int id, double lat,
                 if (bearing > 180)
                     bearing = 360 - bearing;
                 if ((dist < mindist) && (bearing < 60.0)) {
+                    //cerr << "Current aircraft " << current->getAircraft()->getTrafficRef()->getCallSign()
+                    //     << " is closest to " << i->getAircraft()->getTrafficRef()->getCallSign() 
+                    //     << ", which has status " << i->getAircraft()->isScheduledForTakeoff() 
+                    //     << endl;
                     mindist = dist;
                     closest = i;
                     minbearing = bearing;
@@ -760,13 +776,18 @@ void FGGroundNetwork::checkSpeedAdjustment(int id, double lat,
                     return;
                 else
                     current->setWaitsForId(closest->getId());
-                if (closest->getId() != current->getId())
+                if (closest->getId() != current->getId()) {
                     current->setSpeedAdjustment(closest->getSpeed() *
                                                 (mindist / 100));
-                    if (closest->getAircraft()->isScheduledForTakeoff())
-                        current->getAircraft()->scheduleForATCTowerDepartureControl();
-                else
+                    if ( 
+                        closest->getAircraft()->getTakeOffStatus() && 
+                        (current->getAircraft()->getTrafficRef()->getDepartureAirport() ==  closest->getAircraft()->getTrafficRef()->getDepartureAirport()) &&
+                        (current->getAircraft()->GetFlightPlan()->getRunway() == closest->getAircraft()->GetFlightPlan()->getRunway())
+                       )
+                            current->getAircraft()->scheduleForATCTowerDepartureControl(1); 
+                } else {
                     current->setSpeedAdjustment(0);     // This can only happen when the user aircraft is the one closest
+                }
                 if (mindist < maxAllowableDistance) {
                     //double newSpeed = (maxAllowableDistance-mindist);
                     //current->setSpeedAdjustment(newSpeed);
@@ -867,8 +888,10 @@ void FGGroundNetwork::checkHoldPosition(int id, double lat,
                         //(!(current->getSpeedAdjustment())))
 
                     {
-                        current->setHoldPosition(true);
-                        current->setWaitsForId(i->getId());
+                        if (!(isUserAircraft(i->getAircraft()))) { // test code. Don't wait for the user, let the user wait for you.
+                            current->setHoldPosition(true);
+                            current->setWaitsForId(i->getId());
+                        }
                         //cerr << "Hold check 5: " << current->getCallSign() <<"  Setting Hold Position: distance to node ("  << node << ") "
                         //           << dist << " meters. Waiting for " << i->getCallSign();
                         //if (opposing)
@@ -886,31 +909,37 @@ void FGGroundNetwork::checkHoldPosition(int id, double lat,
         }
     }
     bool currStatus = current->hasHoldPosition();
-
+    current->setHoldPosition(origStatus);
     // Either a Hold Position or a resume taxi transmission has been issued
     time_t now = time(NULL) + fgGetLong("/sim/time/warp");
     if ((now - lastTransmission) > 2) {
         available = true;
     }
-    if ((origStatus != currStatus) && available) {
-        //cerr << "Issueing hold short instrudtion " << currStatus << " " << available << endl;
-        if (currStatus == true) { // No has a hold short instruction
-           transmit(&(*current), MSG_HOLD_POSITION, ATC_GROUND_TO_AIR, true);
-           //cerr << "Transmittin hold short instrudtion " << currStatus << " " << available << endl;
-           current->setState(1);
-        } else {
-           transmit(&(*current), MSG_RESUME_TAXI, ATC_GROUND_TO_AIR, true);
-           //cerr << "Transmittig resume instrudtion " << currStatus << " " << available << endl;
-           current->setState(2);
+    if (current->getState() == 0) {
+        if ((origStatus != currStatus) && available) {
+            //cerr << "Issueing hold short instrudtion " << currStatus << " " << available << endl;
+            if (currStatus == true) { // No has a hold short instruction
+                transmit(&(*current), MSG_HOLD_POSITION, ATC_GROUND_TO_AIR, true);
+                //cerr << "Transmittin hold short instrudtion " << currStatus << " " << available << endl;
+                current->setState(1);
+            } else {
+                transmit(&(*current), MSG_RESUME_TAXI, ATC_GROUND_TO_AIR, true);
+                //cerr << "Transmittig resume instrudtion " << currStatus << " " << available << endl;
+                current->setState(2);
+            }
+            lastTransmission = now;
+            available = false;
+            // Don't act on the changed instruction until the transmission is confirmed
+            // So set back to original status
+            //cerr << "Current state " << current->getState() << endl;
         }
-        lastTransmission = now;
-        available = false;
-        // Don't act on the changed instruction until the transmission is confirmed
-        // So set back to original status
-        current->setHoldPosition(origStatus);
-        //cerr << "Current state " << current->getState() << endl;
-    } else {
+
     }
+    // 6 = Report runway
+    // 7 = Acknowledge report runway
+    // 8 = Switch tower frequency
+    //9 = Acknowledge switch tower frequency
+
     //int state = current->getState();
     if (checkTransmissionState(1,1, current, now, MSG_ACKNOWLEDGE_HOLD_POSITION, ATC_AIR_TO_GROUND)) {
             current->setState(0);
@@ -920,6 +949,22 @@ void FGGroundNetwork::checkHoldPosition(int id, double lat,
             current->setState(0);
             current->setHoldPosition(false);
     }
+    if (current->getAircraft()->getTakeOffStatus() && (current->getState() == 0)) {
+            //cerr << "Scheduling " << current->getAircraft()->getCallSign() << " for hold short" << endl;
+            current->setState(6);
+        }
+    if (checkTransmissionState(6,6, current, now, MSG_REPORT_RUNWAY_HOLD_SHORT, ATC_AIR_TO_GROUND)) {
+    }
+    if (checkTransmissionState(7,7, current, now, MSG_ACKNOWLEDGE_REPORT_RUNWAY_HOLD_SHORT, ATC_GROUND_TO_AIR)) {
+    }
+    if (checkTransmissionState(8,8, current, now, MSG_SWITCH_TOWER_FREQUENCY, ATC_GROUND_TO_AIR)) {
+    }
+    if (checkTransmissionState(9,9, current, now, MSG_ACKNOWLEDGE_SWITCH_TOWER_FREQUENCY, ATC_AIR_TO_GROUND)) {
+    }
+
+
+
+            //current->setState(0);
 } 
 
 /**