X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FAirports%2Frunways.cxx;h=ff45f4c7e7e00fe17c31a514d343e0fdb91de38b;hb=df2ce45ab71442cd24d6bb9f8da3a0c2e13a8c7c;hp=0cc274262409ac74e14849156bee903218d7b5a3;hpb=9b24a371807c29fff6988a8ff6af6ed0cc3e02fc;p=flightgear.git diff --git a/src/Airports/runways.cxx b/src/Airports/runways.cxx index 0cc274262..ff45f4c7e 100644 --- a/src/Airports/runways.cxx +++ b/src/Airports/runways.cxx @@ -90,6 +90,47 @@ FGRunways::FGRunways( const string& file ) { } +// Return reverse rwy number +// eg 01 -> 19 +// 03L -> 21R +static string GetReverseRunwayNo(string rwyno) { + // cout << "Original rwyno = " << rwyNo << '\n'; + + // standardize input number + string tmp = rwyno.substr(1, 1); + if (( tmp == "L" || tmp == "R" || tmp == "C" ) || (rwyno.size() == 1)) { + tmp = rwyno; + rwyno = "0" + tmp; + SG_LOG( SG_GENERAL, SG_INFO, "Standardising rwy number from " << tmp + << " to " << rwyno ); + } + + char buf[4]; + int rn = atoi(rwyno.substr(0,2).c_str()); + rn += 18; + while(rn > 36) { + rn -= 36; + } + sprintf(buf, "%02i", rn); + if(rwyno.size() == 3) { + if(rwyno.substr(2,1) == "L") { + buf[2] = 'R'; + buf[3] = '\0'; + } else if (rwyno.substr(2,1) == "R") { + buf[2] = 'L'; + buf[3] = '\0'; + } else if (rwyno.substr(2,1) == "C") { + buf[2] = 'C'; + buf[3] = '\0'; + } else { + SG_LOG(SG_GENERAL, SG_ALERT, "Unknown runway code " + << rwyno << " passed to GetReverseRunwayNo(...)"); + } + } + return((string)buf); +} + + // search for the specified apt id bool FGRunways::search( const string& aptid, FGRunway* r ) { c4_StringProp pID ("ID"); @@ -132,6 +173,7 @@ bool FGRunways::search( const string& aptid, FGRunway* r ) { // search for the specified apt id and runway no bool FGRunways::search( const string& aptid, const string& rwyno, FGRunway* r ) { + string runwayno = rwyno; c4_StringProp pID ("ID"); c4_StringProp pRwy ("Rwy"); c4_FloatProp pLon ("Longitude"); @@ -149,6 +191,15 @@ bool FGRunways::search( const string& aptid, const string& rwyno, FGRunway* r ) if ( index == -1 ) { return false; } + + // standardize input number + string tmp = runwayno.substr(1, 1); + if (( tmp == "L" || tmp == "R" || tmp == "C" ) || (runwayno.size() == 1)) { + tmp = runwayno; + runwayno = "0" + tmp; + SG_LOG(SG_GENERAL, SG_INFO, "Standardising rwy number from " << tmp + << " to " << runwayno ); + } c4_RowRef row = vRunway->GetAt(index); string rowid = (const char *) pID(row); @@ -156,7 +207,7 @@ bool FGRunways::search( const string& aptid, const string& rwyno, FGRunway* r ) while ( rowid == aptid ) { next_index = index + 1; - if ( rowrwyno == rwyno ) { + if ( rowrwyno == runwayno ) { r->id = (const char *) pID(row); r->rwy_no = (const char *) pRwy(row); r->lon = (double) pLon(row); @@ -171,34 +222,11 @@ bool FGRunways::search( const string& aptid, const string& rwyno, FGRunway* r ) return true; } - // Check reverse rwy number - // eg 01 -> 19 - // 03L -> 21R - // cout << "Original rowrwyno = " << rowrwyno << '\n'; - char buf[4]; - int rn = atoi(rowrwyno.substr(0,2).c_str()); - rn += 18; - while(rn > 36) { - rn -= 36; - } - sprintf(buf, "%02i", rn); - if(rowrwyno.size() == 3) { - if(rowrwyno.substr(2,1) == "L") { - buf[2] = 'R'; - buf[3] = '\0'; - } else if (rowrwyno.substr(2,1) == "R") { - buf[2] = 'L'; - buf[3] = '\0'; - } else { - SG_LOG(SG_GENERAL, SG_ALERT, "Unknown runway code " - << rowrwyno << " found in FGRunways.search(...)"); - } - } - rowrwyno = buf; - // cout << "New rowrwyno = " << rowrwyno << '\n'; // Search again with the other-end runway number - // Remember we have to munge the heading result if this one matches - if ( rowrwyno == rwyno ) { + // Remember we have to munge the heading and rwy_no results if this one matches + rowrwyno = GetReverseRunwayNo(rowrwyno); + // cout << "New rowrwyno = " << rowrwyno << '\n'; + if ( rowrwyno == runwayno ) { r->id = (const char *) pID(row); r->rwy_no = rowrwyno; r->lon = (double) pLon(row); @@ -285,10 +313,11 @@ bool FGRunways::search( const string& aptid, const int tgt_hdg, // Return the runway number of the runway closest to a given heading string FGRunways::search( const string& aptid, const int tgt_hdg ) { FGRunway r; + FGRunway tmp_r; string rn; double found_dir = 0.0; - if ( !search( aptid, &r ) ) { + if ( !search( aptid, &tmp_r ) ) { SG_LOG( SG_GENERAL, SG_ALERT, "Failed to find " << aptid << " in database." ); return "NN"; @@ -297,7 +326,9 @@ string FGRunways::search( const string& aptid, const int tgt_hdg ) { double diff; double min_diff = 360.0; - while ( r.id == aptid ) { + while ( tmp_r.id == aptid ) { + r = tmp_r; + // forward direction diff = tgt_hdg - r.heading; while ( diff < -180.0 ) { diff += 360.0; } @@ -327,22 +358,16 @@ string FGRunways::search( const string& aptid, const int tgt_hdg ) { found_dir = 180.0; } - next( &r ); + next( &tmp_r ); } // SG_LOG( SG_GENERAL, SG_INFO, "closest runway = " << r.rwy_no // << " + " << found_dir ); - // rn = r.rwy_no; + rn = r.rwy_no; // cout << "In search, rn = " << rn << endl; if ( found_dir == 180 ) { - int irn = atoi(rn.c_str()); - irn += 18; - if ( irn > 36 ) { - irn -= 36; - } - char buf[4]; // 2 chars + string terminator + 1 for safety - sprintf(buf, "%i", irn); - rn = buf; + rn = GetReverseRunwayNo(rn); + //cout << "New rn = " << rn << '\n'; } return rn;