X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FATCDCL%2FAILocalTraffic.cxx;h=6c1b77d8f5da776381435328fe7c13074fdfcacc;hb=934ce52a235cda3827866f64a9af492f2ea1e63e;hp=e38e4314970c35a6d0847674625b9ee5665aa6bb;hpb=a6db6d89ff41a619569e6433409e8bf62ff98499;p=flightgear.git diff --git a/src/ATCDCL/AILocalTraffic.cxx b/src/ATCDCL/AILocalTraffic.cxx index e38e43149..6c1b77d8f 100644 --- a/src/ATCDCL/AILocalTraffic.cxx +++ b/src/ATCDCL/AILocalTraffic.cxx @@ -546,6 +546,7 @@ void FGAILocalTraffic::Update(double dt) { // And to avoid compiler warnings... case APPROACH: break; case ATIS: break; + case AWOS: break; case ENROUTE: break; case DEPARTURE: break; case INVALID: break; @@ -840,7 +841,7 @@ void FGAILocalTraffic::FlyTrafficPattern(double dt) { // TODO - At hot 'n high airports this may be 500ft AGL though - need to make this a variable. if((_pos.getElevationM() - rwy.threshold_pos.getElevationM()) * SG_METER_TO_FEET > 700) { double cc = 0.0; - if(tower->GetCrosswindConstraint(cc)) { + if(tower && tower->GetCrosswindConstraint(cc)) { if(orthopos.y() > cc) { //cout << "Turning to crosswind, distance from threshold = " << orthopos.y() << '\n'; leg = TURN1; @@ -883,7 +884,7 @@ void FGAILocalTraffic::FlyTrafficPattern(double dt) { // turn 1000m out for now, taking other traffic into accout if(fabs(orthopos.x()) > 900) { double dd = 0.0; - if(tower->GetDownwindConstraint(dd)) { + if(tower && tower->GetDownwindConstraint(dd)) { if(fabs(orthopos.x()) > fabs(dd)) { //cout << "Turning to downwind, distance from centerline = " << fabs(orthopos.x()) << '\n'; leg = TURN2; @@ -929,7 +930,7 @@ void FGAILocalTraffic::FlyTrafficPattern(double dt) { // For now we're assuming that we aim to follow the same glidepath regardless of wind. double d1; double d2; - CalculateSoD((tower->GetBaseConstraint(d1) ? d1 : -1000.0), (tower->GetDownwindConstraint(d2) ? d2 : 1000.0 * patternDirection), (patternDirection ? true : false)); + CalculateSoD(((tower && tower->GetBaseConstraint(d1)) ? d1 : -1000.0), ((tower && tower->GetDownwindConstraint(d2)) ? d2 : 1000.0 * patternDirection), (patternDirection ? true : false)); if(SoD.leg == DOWNWIND) { descending = (orthopos.y() < SoD.y ? true : false); } @@ -949,7 +950,7 @@ void FGAILocalTraffic::FlyTrafficPattern(double dt) { if(orthopos.y() < -1000.0 + turn_radius) { //if(orthopos.y() < -980) { double bb = 0.0; - if(tower->GetBaseConstraint(bb)) { + if(tower && tower->GetBaseConstraint(bb)) { if(fabs(orthopos.y()) > fabs(bb)) { //cout << "Turning to base, distance from threshold = " << fabs(orthopos.y()) << '\n'; leg = TURN3; @@ -981,7 +982,7 @@ void FGAILocalTraffic::FlyTrafficPattern(double dt) { double d1; // Make downwind leg position artifically large to avoid any chance of SoD being returned as // on downwind when we are already on base. - CalculateSoD((tower->GetBaseConstraint(d1) ? d1 : -1000.0), (10000.0 * patternDirection), (patternDirection ? true : false)); + CalculateSoD(((tower && tower->GetBaseConstraint(d1)) ? d1 : -1000.0), (10000.0 * patternDirection), (patternDirection ? true : false)); if(SoD.leg == BASE) { descending = (fabs(orthopos.y()) < fabs(SoD.y) ? true : false); } @@ -1206,10 +1207,11 @@ void FGAILocalTraffic::CalculateSoD(double base_leg_pos, double downwind_leg_pos void FGAILocalTraffic::TransmitPatternPositionReport(void) { // airport name + "traffic" + airplane callsign + pattern direction + pattern leg + rwy + ? - string trns = ""; + string trns; int code = 0; - - trns += tower->get_name(); + const string& apt_name = tower ? tower->get_name() : airportID; + + trns += apt_name; trns += " Traffic "; trns += plane.callsign; if(patternDirection == 1) { @@ -1248,10 +1250,10 @@ void FGAILocalTraffic::TransmitPatternPositionReport(void) { } trns += ConvertRwyNumToSpokenString(rwy.rwyID); - trns += " "; + trns += ' '; // And add the airport name again - trns += tower->get_name(); + trns += apt_name; pending_transmission = trns; ConditionalTransmit(60.0, code); // Assume a report of this leg will be invalid if we can't transmit within a minute.