]> git.mxchange.org Git - flightgear.git/blobdiff - src/ATC/tower.cxx
Vassilii Khachaturov:
[flightgear.git] / src / ATC / tower.cxx
index 3f3f766fd57f623529ee75f2f39953bfb9fbbc3a..11d076ebc0e87c4fc9289b9b56a427a4acbd19fc 100644 (file)
@@ -508,7 +508,9 @@ void FGTower::Respond() {
                        }
                        trns += ConvertRwyNumToSpokenString(activeRwy);
                        if(_display) {
-                               globals->get_ATC_display()->RegisterSingleMessage(trns, 0);
+                               //globals->get_ATC_display()->RegisterSingleMessage(trns, 0);
+                               pending_transmission = trns;
+                               Transmit();
                        } else {
                                //cout << "Not displaying, trns was " << trns << '\n';
                        }
@@ -543,7 +545,9 @@ void FGTower::Respond() {
                                string trns = t->plane.callsign;
                                trns += " hold position";
                                if(_display) {
-                                       globals->get_ATC_display()->RegisterSingleMessage(trns, 0);
+                                       //globals->get_ATC_display()->RegisterSingleMessage(trns, 0);
+                                       pending_transmission = trns;
+                                       Transmit();
                                }
                                // TODO - add some idea of what traffic is blocking him.
                        }
@@ -581,7 +585,9 @@ void FGTower::Respond() {
                                t->clearedToLand = false;
                        }
                        if(_display && disp) {
-                               globals->get_ATC_display()->RegisterSingleMessage(trns);
+                               //globals->get_ATC_display()->RegisterSingleMessage(trns);
+                               pending_transmission = trns;
+                               Transmit();
                        }
                        t->finalAcknowledged = true;
                } else if(t->rwyVacatedReported && !(t->rwyVacatedAcknowledged)) {
@@ -601,7 +607,7 @@ void FGTower::ProcessDownwindReport(TowerPlaneRec* t) {
        int a = 0;      // Count of preceding planes on approach
        bool cf = false;        // conflicting traffic on final
        bool cc = false;        // preceding traffic in circuit
-       TowerPlaneRec* tc;
+       TowerPlaneRec* tc = NULL;
        for(tower_plane_rec_list_iterator twrItr = circuitList.begin(); twrItr != circuitList.end(); twrItr++) {
                if((*twrItr)->plane.callsign == responseID) break;
                tc = *twrItr;
@@ -609,7 +615,7 @@ void FGTower::ProcessDownwindReport(TowerPlaneRec* t) {
        }
        if(i > 1) { cc = true; }
        doThresholdETACalc();
-       TowerPlaneRec* tf;
+       TowerPlaneRec* tf = NULL;
        for(tower_plane_rec_list_iterator twrItr = appList.begin(); twrItr != appList.end(); twrItr++) {
                if((*twrItr)->eta < (t->eta + 45)) {
                        a++;
@@ -625,22 +631,23 @@ void FGTower::ProcessDownwindReport(TowerPlaneRec* t) {
        trns += ConvertNumToSpokenDigits(i + a);
        // This assumes that the number spoken is landing position, not circuit position, since some of the traffic might be on straight-in final.
        trns += " ";
-       TowerPlaneRec* tt;
+       TowerPlaneRec* tt = NULL;
        if((i == 1) && (!rwyList.size()) && (t->nextOnRwy) && (!cf)) {  // Unfortunately nextOnRwy currently doesn't handle circuit/straight-in ordering properly at present, hence the cf check below.
                trns += "Cleared to land";      // TODO - clear for the option if appropriate
                t->clearedToLand = true;
                if(!t->isUser) t->planePtr->RegisterTransmission(7);
        } else if((i+a) > 1) {
                //First set tt to point to the correct preceding plane - final or circuit
-               if(i > 1 && a > 0) {
+               if(tc && tf) {
                        tt = (tf->eta < tc->eta ? tf : tc);
-               } else if(i > 1) {
+               } else if(tc) {
                        tt = tc;
-               } else if(a > 0) {
+               } else if(tf) {
                        tt = tf;
                } else {
                        // We should never get here!
                        SG_LOG(SG_ATC, SG_ALERT, "ALERT - Logic error in FGTower::ProcessDownwindReport");
+                       return;
                }
                trns += "Follow the ";
                string s = tt->plane.callsign;
@@ -648,13 +655,19 @@ void FGTower::ProcessDownwindReport(TowerPlaneRec* t) {
                s = s.substr(0,p);
                trns += s;
                if((tt->opType) == CIRCUIT) {
-                       if(tt->planePtr->GetLeg() == FINAL) {
+                       PatternLeg leg;
+                       if(t->isUser) {
+                               leg = tt->leg;
+                       } else {
+                               leg = tt->planePtr->GetLeg();
+                       }
+                       if(leg == FINAL) {
                                trns += " on final";
-                       } else if(tt->planePtr->GetLeg() == TURN4) {
+                       } else if(leg == TURN4) {
                                trns += " turning final";
-                       } else if(tt->planePtr->GetLeg() == BASE) {
+                       } else if(leg == BASE) {
                                trns += " on base";
-                       } else if(tt->planePtr->GetLeg() == TURN3) {
+                       } else if(leg == TURN3) {
                                trns += " turning base";
                        }
                } else {
@@ -669,7 +682,9 @@ void FGTower::ProcessDownwindReport(TowerPlaneRec* t) {
                }
        }
        if(_display) {
-               globals->get_ATC_display()->RegisterSingleMessage(trns);
+               //globals->get_ATC_display()->RegisterSingleMessage(trns);
+               pending_transmission = trns;
+               Transmit();
        }
        if(t->isUser) {
                if(t->opType == TTT_UNKNOWN) t->opType = CIRCUIT;
@@ -701,7 +716,9 @@ void FGTower::ProcessRunwayVacatedReport(TowerPlaneRec* t) {
        }
        //cout << "trns = " << trns << '\n';
        if(_display) {
-               globals->get_ATC_display()->RegisterSingleMessage(trns);
+               //globals->get_ATC_display()->RegisterSingleMessage(trns);
+               pending_transmission = trns;
+               Transmit();
        }
        RemoveFromRwyList(t->plane.callsign);
        AddToVacatedList(t);
@@ -812,7 +829,9 @@ void FGTower::ClearHoldingPlane(TowerPlaneRec* t) {
                timeSinceLastDeparture = 0.0;
        }
        if(_display) {
-               globals->get_ATC_display()->RegisterSingleMessage(trns, 0);
+               //globals->get_ATC_display()->RegisterSingleMessage(trns, 0);
+               pending_transmission = trns;
+               Transmit();
        }
        //cout << "Done ClearHoldingPlane " << endl;
 }
@@ -891,7 +910,7 @@ void FGTower::CheckCircuitList(double dt) {
                        //cout << " ho = " << ho << " abs(ho = " << abs(ho) << '\n';
                        // TODO FIXME - get the wind and convert this to track, or otherwise use track somehow!!!
                        // If it's gusty might need to filter the value, although we are leaving 30 degrees each way leeway!
-                       if(abs(ho) < 30) {
+                       if(fabs(ho) < 30) {
                                // could be either takeoff, climbout or landing - check orthopos.y
                                //cout << "tortho.y = " << tortho.y() << '\n';
                                if((tortho.y() < 0) || (t->leg == TURN4) || (t->leg == FINAL)) {
@@ -924,7 +943,7 @@ void FGTower::CheckCircuitList(double dt) {
                                                }
                                        }
                                }
-                       } else if(abs(ho) < 60) {
+                       } else if(fabs(ho) < 60) {
                                // turn1 or turn 4
                                // TODO - either fix or doublecheck this hack by looking at heading and pattern direction
                                if((t->leg == CLIMBOUT) || (t->leg == TURN1)) {
@@ -934,7 +953,7 @@ void FGTower::CheckCircuitList(double dt) {
                                        t->leg = TURN4;
                                        //cout << "Turn4\n";
                                }
-                       } else if(abs(ho) < 120) {
+                       } else if(fabs(ho) < 120) {
                                // crosswind or base
                                // TODO - either fix or doublecheck this hack by looking at heading and pattern direction
                                if((t->leg == TURN1) || (t->leg == CROSSWIND)) {
@@ -944,7 +963,7 @@ void FGTower::CheckCircuitList(double dt) {
                                        t->leg = BASE;
                                        //cout << "Base\n";
                                }
-                       } else if(abs(ho) < 150) {
+                       } else if(fabs(ho) < 150) {
                                // turn2 or turn 3
                                // TODO - either fix or doublecheck this hack by looking at heading and pattern direction
                                if((t->leg == CROSSWIND) || (t->leg == TURN2)) {
@@ -1366,26 +1385,26 @@ void FGTower::DoRwyDetails() {
        bool rwyGood = globals->get_runways()->search(ident, int(hdg), &runway);
        if(rwyGood) {
                //cout << "RUNWAY GOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOD\n";
-               activeRwy = runway.rwy_no;
-               rwy.rwyID = runway.rwy_no;
+               activeRwy = runway._rwy_no;
+               rwy.rwyID = runway._rwy_no;
                SG_LOG(SG_ATC, SG_INFO, "Active runway for airport " << ident << " is " << activeRwy);
                
                // Get the threshold position
-               double other_way = runway.heading - 180.0;
+               double other_way = runway._heading - 180.0;
                while(other_way <= 0.0) {
                        other_way += 360.0;
                }
        // move to the +l end/center of the runway
-               //cout << "Runway center is at " << runway.lon << ", " << runway.lat << '\n';
-       Point3D origin = Point3D(runway.lon, runway.lat, aptElev);
+               //cout << "Runway center is at " << runway._lon << ", " << runway._lat << '\n';
+       Point3D origin = Point3D(runway._lon, runway._lat, aptElev);
                Point3D ref = origin;
        double tshlon, tshlat, tshr;
                double tolon, tolat, tor;
-               rwy.length = runway.length * SG_FEET_TO_METER;
-               rwy.width = runway.width * SG_FEET_TO_METER;
+               rwy.length = runway._length * SG_FEET_TO_METER;
+               rwy.width = runway._width * SG_FEET_TO_METER;
        geo_direct_wgs_84 ( aptElev, ref.lat(), ref.lon(), other_way, 
                                rwy.length / 2.0 - 25.0, &tshlat, &tshlon, &tshr );
-       geo_direct_wgs_84 ( aptElev, ref.lat(), ref.lon(), runway.heading, 
+       geo_direct_wgs_84 ( aptElev, ref.lat(), ref.lon(), runway._heading, 
                                rwy.length / 2.0 - 25.0, &tolat, &tolon, &tor );
                // Note - 25 meters in from the runway end is a bit of a hack to put the plane ahead of the user.
                // now copy what we need out of runway into rwy
@@ -1393,7 +1412,7 @@ void FGTower::DoRwyDetails() {
                Point3D takeoff_end = Point3D(tolon, tolat, aptElev);
                //cout << "Threshold position = " << tshlon << ", " << tshlat << ", " << aptElev << '\n';
                //cout << "Takeoff position = " << tolon << ", " << tolat << ", " << aptElev << '\n';
-               rwy.hdg = runway.heading;
+               rwy.hdg = runway._heading;
                // Set the projection for the local area based on this active runway
                ortho.Init(rwy.threshold_pos, rwy.hdg); 
                rwy.end1ortho = ortho.ConvertToLocal(rwy.threshold_pos);        // should come out as zero
@@ -1452,9 +1471,9 @@ bool FGTower::OnAnyRunway(Point3D pt) {
                SG_LOG(SG_ATC, SG_WARN, "Unable to find any runways for airport ID " << ad.ident << " in FGTower");
        }
        bool on = false;
-       while(runway.id == ad.ident) {          
+       while(runway._id == ad.ident) {         
                on = OnRunway(pt, runway);
-               //cout << "Runway " << runway.rwy_no << ": On = " << (on ? "true\n" : "false\n");
+               //cout << "Runway " << runway._rwy_no << ": On = " << (on ? "true\n" : "false\n");
                if(on) return(true);
                globals->get_runways()->next(&runway);          
        }
@@ -2135,6 +2154,7 @@ void FGTower::RemovePlane(string ID) {
                if((*twrItr)->plane.callsign == ID) {
                        t = *twrItr;
                        twrItr = depList.erase(twrItr);
+                       twrItr--;
                        depListItr = depList.begin();
                }
        }
@@ -2265,7 +2285,7 @@ string FGTower::GenText(const string& m, int c) {
                        int check = 0;  // If mes gets overflowed the while loop can go infinite
                        while ( strchr(&mes[0], crej) != NULL  ) {      // ie. loop until no more occurances of crej ('@') found
                                pos = strchr( &mes[0], crej );
-                               bcopy(pos, &tag[0], 3);
+                               memmove(&tag[0], pos, 3);
                                tag[3] = '\0';
                                int i;
                                len = 0;