X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FNavaids%2Fnavdb.cxx;h=f7a2761f3dc67ee64db562624c91c7990db9d086;hb=4022edc5ba91cfedec45f8a39ff8f41d20f3f34e;hp=1595e7a69a6b25535b870f28c480fc498f80b9a5;hpb=222446df29724aa496da85ea334788f59276b922;p=flightgear.git diff --git a/src/Navaids/navdb.cxx b/src/Navaids/navdb.cxx index 1595e7a69..f7a2761f3 100644 --- a/src/Navaids/navdb.cxx +++ b/src/Navaids/navdb.cxx @@ -16,10 +16,13 @@ // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // // $Id$ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif #include @@ -40,7 +43,9 @@ SG_USING_STD( string ); // load and initialize the navigational databases bool fgNavDBInit( FGAirportList *airports, FGNavList *navlist, FGNavList *loclist, FGNavList *gslist, - FGNavList *dmelist, FGNavList *mkrlist ) + FGNavList *dmelist, FGNavList *mkrlist, + FGNavList *tacanlist, FGNavList *carrierlist, + FGTACANList *channellist) { SG_LOG(SG_GENERAL, SG_INFO, "Loading Navaid Databases"); // SG_LOG(SG_GENERAL, SG_INFO, " VOR/NDB"); @@ -70,8 +75,14 @@ bool fgNavDBInit( FGAirportList *airports, #ifdef __MWERKS__ + + FIXME -- Please report to the FlightGear mailing list, if you still use a + compiler identifying itself as __MWERKS__ that needs this hack. + There are 41 instances of it in the SimGear & FilghtGear code, + and they are scheduled for removal. + char c = 0; - while ( in.get(c) && c != '\0' ) { + while ( in.get(c) && c != '\0' ) { in.putback(c); #else while ( ! in.eof() ) { @@ -80,24 +91,26 @@ bool fgNavDBInit( FGAirportList *airports, FGNavRecord *r = new FGNavRecord; in >> (*r); if ( r->get_type() > 95 ) { + delete r; break; } - /* cout << "id = " << n.get_ident() << endl; - cout << " type = " << n.get_type() << endl; - cout << " lon = " << n.get_lon() << endl; - cout << " lat = " << n.get_lat() << endl; - cout << " elev = " << n.get_elev() << endl; - cout << " freq = " << n.get_freq() << endl; - cout << " range = " << n.get_range() << endl << endl; */ + /*cout << "id = " << r->get_ident() << endl; + cout << " type = " << r->get_type() << endl; + cout << " lon = " << r->get_lon() << endl; + cout << " lat = " << r->get_lat() << endl; + cout << " elev = " <get_elev_ft() << endl; + cout << " freq = " << r->get_freq() << endl; + cout << " range = " << r->get_range() << endl; + cout << " name = " << r->get_name() << endl << endl; */ // fudge elevation to the field elevation if it's not specified if ( fabs(r->get_elev_ft()) < 0.01 && r->get_apt_id().length() ) { // cout << r->get_type() << " " << r->get_apt_id() << " zero elev" // << endl; - FGAirport a = airports->search( r->get_apt_id() ); - if ( a._id == r->get_apt_id() ) { - r->set_elev_ft( a._elevation ); + const FGAirport* a = airports->search( r->get_apt_id() ); + if ( a ) { + r->set_elev_ft( a->getElevation() ); // cout << " setting to " << a.elevation << endl; } } @@ -116,16 +129,105 @@ bool fgNavDBInit( FGAirportList *airports, { // Marker Beacon = 7,8,9 mkrlist->add( r ); - } else if ( r->get_type() == 12 ) { - // DME=12 + } else if ( r->get_type() == 12 || r->get_type() == 13) { + // DME with ILS=12; standalone DME=13 + string str1( r->get_name() ); + string::size_type loc1= str1.find( "TACAN", 0 ); + string::size_type loc2 = str1.find( "VORTAC", 0 ); + + if( loc1 != string::npos || loc2 != string::npos ){ + //cout << " name = " << r->get_name() ; + //cout << " freq = " << r->get_freq() ; + tacanlist->add( r ); + } + dmelist->add( r ); + } in >> skipcomment; } - // cout << "min freq = " << min << endl; - // cout << "max freq = " << max << endl; +// load the carrier navaids file + + string file, name; + path = ""; + path = globals->get_fg_root() ; + path.append( "Navaids/carrier_nav.dat" ); + + file = path.str(); + SG_LOG( SG_GENERAL, SG_INFO, "opening file: " << path.str() ); + + sg_gzifstream incarrier( path.str() ); + + if ( !incarrier.is_open() ) { + SG_LOG( SG_GENERAL, SG_ALERT, "Cannot open file: " << path.str() ); + exit(-1); + } + + // skip first two lines + //incarrier >> skipeol; + //incarrier >> skipeol; + +#ifdef __MWERKS__ + char c = 0; + while ( incarrier.get(c) && c != '\0' ) { + incarrier.putback(c); +#else + while ( ! incarrier.eof() ) { +#endif + + FGNavRecord *r = new FGNavRecord; + incarrier >> (*r); + carrierlist->add ( r ); + /*cout << " carrier lon: "<< r->get_lon() ; + cout << " carrier lat: "<< r->get_lat() ; + cout << " freq: " << r->get_freq() ; + cout << " carrier name: "<< r->get_name() << endl;*/ + + //if ( r->get_type() > 95 ) { + // break;} + } // end while + +// end loading the carrier navaids file + +// load the channel/freqency file + string channel, freq; + path=""; + path = globals->get_fg_root(); + path.append( "Navaids/TACAN_freq.dat" ); + + SG_LOG( SG_GENERAL, SG_INFO, "opening file: " << path.str() ); + + sg_gzifstream inchannel( path.str() ); + + if ( !inchannel.is_open() ) { + SG_LOG( SG_GENERAL, SG_ALERT, "Cannot open file: " << path.str() ); + exit(-1); + } + + // skip first line + inchannel >> skipeol; + +#ifdef __MWERKS__ + char c = 0; + while ( inchannel.get(c) && c != '\0' ) { + in.putback(c); +#else + while ( ! inchannel.eof() ) { +#endif + + FGTACANRecord *r = new FGTACANRecord; + inchannel >> (*r); + channellist->add ( r ); + //cout << "channel = " << r->get_channel() ; + //cout << " freq = " << r->get_freq() << endl; + + } // end while + + + // end ReadChanFile + return true; } @@ -198,10 +300,10 @@ void fgNavDBAlignLOCwithRunway( FGRunwayList *runways, FGNavList *loclist, double threshold ) { nav_map_type navmap = loclist->get_navaids(); - nav_map_iterator freq = navmap.begin(); + nav_map_const_iterator freq = navmap.begin(); while ( freq != navmap.end() ) { nav_list_type locs = freq->second; - nav_list_iterator loc = locs.begin(); + nav_list_const_iterator loc = locs.begin(); while ( loc != locs.end() ) { string name = (*loc)->get_name(); string::size_type pos1 = name.find(" "); @@ -219,3 +321,4 @@ void fgNavDBAlignLOCwithRunway( FGRunwayList *runways, FGNavList *loclist, ++freq; } } +