X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FNavaids%2Fnavlist.hxx;h=d2db76cbf7d325803cb023836f758f8aaef5bbd3;hb=30fcfd219e1389fa06997f175e1597d459657397;hp=e46521b738a9cba5bf36889838e6080400bf5cc7;hpb=f1b1077d930d542014baf54a328b7a233182647a;p=flightgear.git diff --git a/src/Navaids/navlist.hxx b/src/Navaids/navlist.hxx index e46521b73..d2db76cbf 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$ @@ -26,46 +26,128 @@ #include -#include + +#include #include #include +#include -#include "nav.hxx" - -SG_USING_STD(map); -SG_USING_STD(vector); - - -class FGNavList { +#include "navrecord.hxx" - // 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; +// forward decls +class SGGeod; - // typedef map < int, nav_list_type, less > nav_map_type; - 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 ------------------------------------------------------------------ - nav_map_type navaids; +typedef SGSharedPtr nav_rec_ptr; +typedef std::vector < nav_rec_ptr > nav_list_type; +class FGNavList +{ public: + class TypeFilter : public FGPositioned::Filter + { + public: + TypeFilter( const FGPositioned::Type type = FGPositioned::INVALID ); + TypeFilter( const FGPositioned::Type minType, + const FGPositioned::Type maxType ); + + /** + * Construct from string containing type + * + * @param type One of "fix"|"vor"|"ndb"|"ils"|"dme"|"tacan"|"any" + */ + bool fromTypeString(const std::string& type); + + virtual FGPositioned::Type minType() const { return _mintype; } + virtual FGPositioned::Type maxType() const { return _maxtype; } + + protected: + FGPositioned::Type _mintype; + FGPositioned::Type _maxtype; + }; + + /** + filter matching VOR & ILS/LOC transmitters + */ + static TypeFilter* navFilter(); + + /** + * filter matching ILS/LOC transmitter + */ + static TypeFilter* locFilter(); + + static TypeFilter* ndbFilter(); + + /** + * Filter returning TACANs and VORTACs + */ + static TypeFilter* tacanFilter(); + + + static TypeFilter* carrierFilter(); + + /** 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. + */ + static FGNavRecordRef findByFreq( double freq, const SGGeod& position, + TypeFilter* filter = NULL); + + /** + * Overloaded version above - no positioned supplied so can be used with + * mobile TACANs which have no valid position. The first match is + * returned only. + */ + static FGNavRecordRef findByFreq( double freq, TypeFilter* filter = NULL); + + static nav_list_type findAllByFreq( double freq, const SGGeod& position, + TypeFilter* filter = NULL); + + // Given an Ident and optional frequency and type , + // return a list of matching stations. + static nav_list_type findByIdentAndFreq( const std::string& ident, + const double freq, + TypeFilter* filter = NULL); + + // Given an Ident and optional frequency and type , + // return a list of matching stations sorted by distance to the given position + static nav_list_type findByIdentAndFreq( const SGGeod & position, + const std::string& ident, const double freq = 0.0, + TypeFilter* filter = NULL); + + }; + + +// FGTACANList ---------------------------------------------------------------- + + +typedef SGSharedPtr tacan_rec_ptr; +typedef std::vector < tacan_rec_ptr > tacan_list_type; +typedef std::map < int, tacan_list_type > tacan_map_type; +typedef std::map < std::string, tacan_list_type > tacan_ident_map_type; + +class FGTACANList { + + tacan_list_type channellist; + tacan_map_type channels; + tacan_ident_map_type ident_channels; - FGNavList(); - ~FGNavList(); +public: - // load the navaids and build the map - bool init( SGPath path ); + FGTACANList(); + ~FGTACANList(); - // query the database for the specified frequency, lon and lat are - // in degrees, elev is in meters - bool query( double lon, double lat, double elev, double freq, FGNav *n ); -}; + // initialize the TACAN list + bool init(); + // add an entry + bool add( FGTACANRecord *r ); -extern FGNavList *current_navlist; + // Given a TACAN Channel, return the appropriate frequency. + FGTACANRecord *findByChannel( const std::string& channel ); +}; #endif // _FG_NAVLIST_HXX