diff --git a/src/ATC/ATCutils.cxx b/src/ATC/ATCutils.cxx index 20a781902..464c2da9d 100644 --- a/src/ATC/ATCutils.cxx +++ b/src/ATC/ATCutils.cxx @@ -266,23 +266,23 @@ double GetAngleDiff_deg( const double &a1, const double &a2) { // in fg_init.cxx, and are just here temporarily until some rationalisation occurs. // find basic airport location info from airport database bool dclFindAirportID( const string& id, FGAirport *a ) { - if ( id.length() ) { - SGPath path( globals->get_fg_root() ); - path.append( "Airports" ); - path.append( "simple.mk4" ); - FGAirports airports( path.c_str() ); + FGAirport result; + if ( id.length() ) { SG_LOG( SG_GENERAL, SG_INFO, "Searching for airport code = " << id ); - if ( ! airports.search( id, a ) ) { + result = globals->get_airports()->search( id ); + if ( result.id.empty() ) { SG_LOG( SG_GENERAL, SG_ALERT, - "Failed to find " << id << " in " << path.str() ); + "Failed to find " << id << " in simple.apt.gz" ); return false; } } else { return false; } + *a = result; + SG_LOG( SG_GENERAL, SG_INFO, "Position for " << id << " is (" << a->longitude << ", " diff --git a/src/Airports/Makefile.am b/src/Airports/Makefile.am index 1a3231817..0b9517fba 100644 --- a/src/Airports/Makefile.am +++ b/src/Airports/Makefile.am @@ -1,14 +1,11 @@ noinst_LIBRARIES = libAirports.a -noinst_PROGRAMS = gensimple genrunways calc_loc +noinst_PROGRAMS = genrunways calc_loc libAirports_a_SOURCES = \ runways.cxx runways.hxx \ simple.cxx simple.hxx -gensimple_SOURCES = gensimple.cxx -gensimple_LDADD = libAirports.a -lsgdebug -lsgmisc -lsgxml -lmk4 -lz - genrunways_SOURCES = genrunways.cxx genrunways_LDADD = libAirports.a -lsgdebug -lsgmisc -lsgxml -lmk4 -lz diff --git a/src/Airports/simple.cxx b/src/Airports/simple.cxx index 560b0d466..7bfe300a1 100644 --- a/src/Airports/simple.cxx +++ b/src/Airports/simple.cxx @@ -1,7 +1,7 @@ // // simple.cxx -- a really simplistic class to manage airport ID, -// lat, lon of the center of one of it's runways, and -// elevation in feet. +// lat, lon of the center of one of it's runways, and +// elevation in feet. // // Written by Curtis Olson, started April 1998. // @@ -35,230 +35,56 @@ #include STL_STRING #include STL_FUNCTIONAL #include STL_ALGORITHM +#include STL_IOSTREAM #include "simple.hxx" SG_USING_NAMESPACE(std); - -#ifndef _MSC_VER -# define NDEBUG // she don't work without it. -#endif -#include -#include -#ifndef _MSC_VER -# undef NDEBUG -#endif - -#ifdef SG_HAVE_STD_INCLUDES -# include -#elif defined( __BORLANDC__ ) || defined (__APPLE__) -# include -#else -# include -#endif SG_USING_STD(istream); inline istream& operator >> ( istream& in, FGAirport& a ) { - return in >> a.id >> a.latitude >> a.longitude >> a.elevation; + string junk; + in >> junk >> a.id >> a.latitude >> a.longitude >> a.elevation + >> a.code; + + char name[256]; // should never be longer than this, right? :-) + in.getline( name, 256 ); + a.name = name; + + return in; } -FGAirports::FGAirports( const string& file ) { - // open the specified database readonly - storage = new c4_Storage( file.c_str(), false ); - - if ( !storage->Strategy().IsValid() ) { - SG_LOG( SG_GENERAL, SG_ALERT, "Cannot open file: " << file ); - exit(-1); - } - - vAirport = new c4_View; - *vAirport = - storage->GetAs("airport[ID:S,Longitude:F,Latitude:F,Elevation:F]"); -} - - -// search for the specified id -bool -FGAirports::search( const string& id, FGAirport* a ) const -{ - c4_StringProp pID ("ID"); - c4_FloatProp pLon ("Longitude"); - c4_FloatProp pLat ("Latitude"); - c4_FloatProp pElev ("Elevation"); - - int idx = vAirport->Find(pID[id.c_str()]); - SG_LOG( SG_TERRAIN, SG_INFO, "idx = " << idx ); - - if ( idx == -1 ) { - return false; - } - - c4_RowRef r = vAirport->GetAt(idx); - a->id = (const char *) pID(r); /// NHV fix wrong case crash - a->longitude = (double) pLon(r); - a->latitude = (double) pLat(r); - a->elevation = (double) pElev(r); - - return true; -} - - -FGAirport -FGAirports::search( const string& id ) const -{ - FGAirport a; - search( id, &a ); - return a; -} - - -// Destructor -FGAirports::~FGAirports( void ) { - delete storage; -} - - -// Constructor -FGAirportsUtil::FGAirportsUtil() { -} - - -// load the data -int FGAirportsUtil::load( const string& file ) { - FGAirport a; - - airports.erase( airports.begin(), airports.end() ); +FGAirportList::FGAirportList( const string& file ) { + SG_LOG( SG_GENERAL, SG_DEBUG, "Reading simple airport list: " << file ); + // open the specified file for reading sg_gzifstream in( file ); if ( !in.is_open() ) { - SG_LOG( SG_GENERAL, SG_ALERT, "Cannot open file: " << file ); + SG_LOG( SG_GENERAL, SG_ALERT, "Cannot open file: " << file ); exit(-1); - } else { - SG_LOG( SG_GENERAL, SG_ALERT, "opened: " << file ); } - // skip first line of file - char tmp[2048]; - in.getline( tmp, 2048 ); + // skip header line + in >> skipeol; - // read in each line of the file - -#ifdef __MWERKS__ - - in >> ::skipws; - char c = 0; - while ( in.get(c) && c != '\0' ) { - if ( c == 'A' ) { - in >> a; - SG_LOG( SG_GENERAL, SG_INFO, a.id ); - in >> skipeol; - airports.insert(a); - } else if ( c == 'R' ) { - in >> skipeol; - } else { - in >> skipeol; - } - in >> ::skipws; + while ( in ) { + FGAirport a; + in >> a; + airports[a.id] = a; } - -#else - - in >> ::skipws; - string token; - while ( ! in.eof() ) { - in >> token; - if ( token == "A" ) { - in >> a; - SG_LOG( SG_GENERAL, SG_INFO, "in <- " << a.id ); - in >> skipeol; - airports.insert(a); - } else if ( token == "R" ) { - in >> skipeol; - } else { - in >> skipeol; - } - in >> ::skipws; - } - -#endif - - return 1; -} - - -// save the data in gdbm format -bool FGAirportsUtil::dump_mk4( const string& file ) { - - // open database for writing - c4_Storage storage( file.c_str(), true ); - - // need to do something about error handling here! - - // define the properties - c4_StringProp pID ("ID"); - c4_FloatProp pLon ("Longitude"); - c4_FloatProp pLat ("Latitude"); - c4_FloatProp pElev ("Elevation"); - - // Start with an empty view of the proper structure. - c4_View vAirport = - storage.GetAs("airport[ID:S,Longitude:F,Latitude:F,Elevation:F]"); - - c4_Row row; - - const_iterator current = airports.begin(); - const_iterator end = airports.end(); - while ( current != end ) { - // add each airport record - SG_LOG( SG_TERRAIN, SG_BULK, "out -> " << current->id ); - pID (row) = current->id.c_str(); - pLon (row) = current->longitude; - pLat (row) = current->latitude; - pElev (row) = current->elevation; - vAirport.Add(row); - - ++current; - } - - // commit our changes - storage.Commit(); - - return true; } // search for the specified id -bool -FGAirportsUtil::search( const string& id, FGAirport* a ) const -{ - const_iterator it = airports.find( FGAirport(id) ); - if ( it != airports.end() ) - { - *a = *it; - return true; - } - else - { - return false; - } -} - - -FGAirport -FGAirportsUtil::search( const string& id ) const -{ - FGAirport a; - this->search( id, &a ); - return a; +FGAirport FGAirportList::search( const string& id) { + return airports[id]; } // Destructor -FGAirportsUtil::~FGAirportsUtil( void ) { +FGAirportList::~FGAirportList( void ) { } - - diff --git a/src/Airports/simple.hxx b/src/Airports/simple.hxx index 288586417..9e1927ee4 100644 --- a/src/Airports/simple.hxx +++ b/src/Airports/simple.hxx @@ -23,8 +23,8 @@ // $Id$ -#ifndef _SIMPLE_HXX -#define _SIMPLE_HXX +#ifndef _FG_SIMPLE_HXX +#define _FG_SIMPLE_HXX #ifndef __cplusplus @@ -39,17 +39,23 @@ #include #include STL_STRING -#include - -// Forward declarations. -class c4_Storage; -class c4_View; +#include SG_USING_STD(string); -SG_USING_STD(set); +SG_USING_STD(map); + class FGAirport { +public: + + string id; + double longitude; + double latitude; + double elevation; + string code; + string name; + public: FGAirport( const string& name = "", @@ -62,76 +68,35 @@ public: return id < a.id; } -public: - - string id; - double longitude; - double latitude; - double elevation; - }; +typedef map < string, FGAirport > airport_map; +typedef airport_map::iterator airport_map_iterator; +typedef airport_map::const_iterator const_airport_map_iterator; -class FGAirports { + +class FGAirportList { private: - c4_Storage *storage; - c4_View *vAirport; + airport_map airports; public: // Constructor - FGAirports( const string& file ); + FGAirportList( const string& file ); // Destructor - ~FGAirports(); + ~FGAirportList(); // search for the specified id. // Returns true if successful, otherwise returns false. // On success, airport data is returned thru "airport" pointer. // "airport" is not changed if "apt" is not found. - bool search( const string& id, FGAirport* airport ) const; - FGAirport search( const string& id ) const; + FGAirport search( const string& id ); }; -class FGAirportsUtil { -public: -#ifdef SG_NO_DEFAULT_TEMPLATE_ARGS - typedef set< FGAirport, less< FGAirport > > container; -#else - typedef set< FGAirport > container; -#endif - typedef container::iterator iterator; - typedef container::const_iterator const_iterator; - -private: - container airports; - -public: - - // Constructor - FGAirportsUtil(); - - // Destructor - ~FGAirportsUtil(); - - // load the data - int load( const string& file ); - - // save the data in metakit format - bool dump_mk4( const string& file ); - - // search for the specified id. - // Returns true if successful, otherwise returns false. - // On success, airport data is returned thru "airport" pointer. - // "airport" is not changed if "id" is not found. - bool search( const string& id, FGAirport* airport ) const; - FGAirport search( const string& id ) const; -}; - - -#endif // _SIMPLE_HXX +#endif // _FG_SIMPLE_HXX diff --git a/src/Main/Makefile.am b/src/Main/Makefile.am index 52ed9d743..d87c09139 100644 --- a/src/Main/Makefile.am +++ b/src/Main/Makefile.am @@ -99,7 +99,7 @@ fgfs_LDADD = \ $(top_builddir)/src/Systems/libSystems.a \ $(top_builddir)/src/Time/libTime.a \ $(WEATHER_LIBS) \ - -lsgroute -lsgsky -lsgsound -lsgephem -lsgmaterial -lsgtgdb -lsgmodel \ + -lsgroute -lsgclouds3d -lsgsky -lsgsound -lsgephem -lsgmaterial -lsgtgdb -lsgmodel \ -lsgtiming -lsgio -lsgscreen -lsgmath -lsgbucket -lsgprops -lsgdebug \ -lsgmagvar -lsgmisc -lsgxml -lsgsound -lsgserial $(CLOUD3D_LIBS) \ $(THREAD_LIBS) \ diff --git a/src/Main/fg_init.cxx b/src/Main/fg_init.cxx index 419d7e5fc..55904a7dd 100644 --- a/src/Main/fg_init.cxx +++ b/src/Main/fg_init.cxx @@ -556,23 +556,23 @@ bool fgInitConfig ( int argc, char **argv ) { // find basic airport location info from airport database bool fgFindAirportID( const string& id, FGAirport *a ) { + FGAirport result; if ( id.length() ) { - SGPath path( globals->get_fg_root() ); - path.append( "Airports" ); - path.append( "simple.mk4" ); - FGAirports airports( path.c_str() ); - SG_LOG( SG_GENERAL, SG_INFO, "Searching for airport code = " << id ); - if ( ! airports.search( id, a ) ) { + result = globals->get_airports()->search( id ); + + if ( result.id.empty() ) { SG_LOG( SG_GENERAL, SG_ALERT, - "Failed to find " << id << " in " << path.str() ); + "Failed to find " << id << " in simple.apt.gz" ); return false; } } else { return false; } + *a = result; + SG_LOG( SG_GENERAL, SG_INFO, "Position for " << id << " is (" << a->longitude << ", " @@ -943,11 +943,18 @@ static bool fgSetPosFromFix( const string& id ) { /** - * Initialize vor/ndb/ils/fix list management and query systems + * Initialize vor/ndb/ils/fix list management and query systems (as + * well as simple airport db list) */ bool fgInitNav () { + SG_LOG(SG_GENERAL, SG_INFO, "Loading Simple Airport List"); + SGPath p_simple( globals->get_fg_root() ); + p_simple.append( "Airports/simple.apt" ); + FGAirportList *airports = new FGAirportList( p_simple.str() ); + globals->set_airports( airports ); + SG_LOG(SG_GENERAL, SG_INFO, "Loading Navaids"); SG_LOG(SG_GENERAL, SG_INFO, " VOR/NDB"); diff --git a/src/Main/globals.cxx b/src/Main/globals.cxx index 7a0242c53..3608120c6 100644 --- a/src/Main/globals.cxx +++ b/src/Main/globals.cxx @@ -57,6 +57,7 @@ FGGlobals::FGGlobals() : route( NULL ), current_panel( NULL ), soundmgr( NULL ), + airports( NULL ), ATC_mgr( NULL ), ATC_display( NULL ), AI_mgr( NULL ), diff --git a/src/Main/globals.hxx b/src/Main/globals.hxx index 2621fe2db..ce3a74ada 100644 --- a/src/Main/globals.hxx +++ b/src/Main/globals.hxx @@ -59,6 +59,7 @@ class SGRoute; class SGTime; class SGSoundMgr; +class FGAirportList; class FGAIMgr; class FGATCMgr; class FGATCDisplay; @@ -134,6 +135,9 @@ private: // sound manager SGSoundMgr *soundmgr; + // Simple Airport List + FGAirportList *airports; + // ATC manager FGATCMgr *ATC_mgr; @@ -240,6 +244,9 @@ public: inline SGRoute *get_route() const { return route; } inline void set_route( SGRoute *r ) { route = r; } + inline FGAirportList *get_airports() const { return airports; } + inline void set_airports( FGAirportList *a ) {airports = a; } + inline FGATCMgr *get_ATC_mgr() const { return ATC_mgr; } inline void set_ATC_mgr( FGATCMgr *a ) {ATC_mgr = a; }