X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FNavaids%2Fnavlist.hxx;h=b975f95b0e9b197c229f605b4a39fdd4b1ee45f2;hb=341216e56a427edf614a9a1dd3be9c2802b61566;hp=31e99727687037ec4a94c1c933bfeca25262d44c;hpb=8cc7b283d54d10150ad0883e96fd05ce020e7ed8;p=flightgear.git diff --git a/src/Navaids/navlist.hxx b/src/Navaids/navlist.hxx index 31e997276..b975f95b0 100644 --- a/src/Navaids/navlist.hxx +++ b/src/Navaids/navlist.hxx @@ -2,7 +2,7 @@ // // Written by Curtis Olson, started April 2000. // -// Copyright (C) 2000 Curtis L. Olson - curt@flightgear.org +// Copyright (C) 2000 Curtis L. Olson - http://www.flightgear.org/~curt // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as @@ -16,7 +16,7 @@ // // 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$ @@ -27,62 +27,121 @@ #include #include +#include +#include #include #include -#include STL_STRING +#include -#include "nav.hxx" +#include "navrecord.hxx" -SG_USING_STD(map); -SG_USING_STD(vector); -SG_USING_STD(string); +using std::map; +using std::vector; +using std::string; -class FGNavList { - // convenience types - typedef vector < FGNav* > nav_list_type; - typedef nav_list_type::iterator nav_list_iterator; - typedef nav_list_type::const_iterator nav_list_const_iterator; - typedef map < int, nav_list_type > nav_map_type; - typedef nav_map_type::iterator nav_map_iterator; - typedef nav_map_type::const_iterator nav_map_const_iterator; +// FGNavList ------------------------------------------------------------------ + +typedef SGSharedPtr nav_rec_ptr; +typedef vector < nav_rec_ptr > nav_list_type; +typedef nav_list_type::iterator nav_list_iterator; +typedef nav_list_type::const_iterator nav_list_const_iterator; + +typedef map < int, nav_list_type > nav_map_type; +typedef nav_map_type::iterator nav_map_iterator; +typedef nav_map_type::const_iterator nav_map_const_iterator; + +typedef map < string, nav_list_type > nav_ident_map_type; +typedef nav_ident_map_type::iterator nav_ident_map_iterator; + + +class FGNavList { - typedef map < string, nav_list_type > nav_ident_map_type; - + nav_list_type carrierlist; nav_map_type navaids; + nav_map_type navaids_by_tile; nav_ident_map_type ident_navaids; - + // Given a point and a list of stations, return the closest one to // the specified point. - FGNav *findNavFromList( const Point3D &aircraft, - const nav_list_type &stations ); - + FGNavRecord *findNavFromList( const SGVec3d &aircraft, + const nav_list_type &stations ); + public: FGNavList(); ~FGNavList(); - // load the navaids and build the map - bool init( SGPath path ); + // initialize the nav list + bool init(); - // Query the database for the specified frequency. It is assumed - // that there will be multiple stations with matching frequencies - // so a position must be specified. Lon and lat are in degrees, - // elev is in meters. - FGNav *findByFreq( double freq, double lon, double lat, double elev ); + // add an entry + bool add( FGNavRecord *n ); + + /** Query the database for the specified station. It is assumed + * that there will be multiple stations with matching frequencies + * so a position must be specified. Lon and lat are in radians, + * elev is in meters. + */ + FGNavRecord *findByFreq( double freq, double lon, double lat, double elev ); // locate closest item in the DB matching the requested ident - FGNav *findByIdent( const char* ident, const double lon, const double lat ); + FGNavRecord *findByIdent( const char* ident, const double lon, const double lat ); + + // Find items of requested type with closest exact or subsequent ident + // (by ASCII code value) to that supplied. + // Supplying true for exact forces only exact matches to be returned (similar to above function) + // Returns an empty list if no match found - calling function should check for this! + nav_list_type findFirstByIdent( const string& ident, fg_nav_types type, bool exact = false ); // Given an Ident and optional freqency, return the first matching // station. - FGNav *findByIdentAndFreq( const char* ident, const double freq = 0.0 ); + FGNavRecord *findByIdentAndFreq( const char* ident, + const double freq = 0.0 ); + + // returns the closest entry to the give lon/lat/elev + FGNavRecord *findClosest( double lon_rad, double lat_rad, double elev_m, fg_nav_types type = FG_NAV_ANY ); + + // given a frequency returns the first matching entry + FGNavRecord *findStationByFreq( double frequency ); + + inline const nav_map_type& get_navaids() const { return navaids; } }; -extern FGNavList *current_navlist; +// FGTACANList ---------------------------------------------------------------- + + +typedef SGSharedPtr tacan_rec_ptr; +typedef vector < tacan_rec_ptr > tacan_list_type; +typedef map < int, tacan_list_type > tacan_map_type; +typedef map < string, tacan_list_type > tacan_ident_map_type; + + +class FGTACANList { + + tacan_list_type channellist; + tacan_map_type channels; + tacan_ident_map_type ident_channels; + +public: + + FGTACANList(); + ~FGTACANList(); + + // initialize the TACAN list + bool init(); + + // add an entry + bool add( FGTACANRecord *r ); + + // Given a TACAN Channel, return the appropriate frequency. + FGTACANRecord *findByChannel( const string& channel ); + + +}; #endif // _FG_NAVLIST_HXX