X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FNavaids%2Fnavlist.hxx;h=d2db76cbf7d325803cb023836f758f8aaef5bbd3;hb=30fcfd219e1389fa06997f175e1597d459657397;hp=f54e5db9320433dff00b90f96d33bb0c93959af9;hpb=1e71177e7c1e9622d2346f168c9fdd479ad1a7cf;p=flightgear.git diff --git a/src/Navaids/navlist.hxx b/src/Navaids/navlist.hxx index f54e5db93..d2db76cbf 100644 --- a/src/Navaids/navlist.hxx +++ b/src/Navaids/navlist.hxx @@ -42,50 +42,82 @@ class SGGeod; typedef SGSharedPtr nav_rec_ptr; typedef std::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 std::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; - -class FGNavList { - - nav_list_type carrierlist; - nav_map_type navaids; - - // Given a point and a list of stations, return the closest one to - // the specified point. - FGNavRecord *findNavFromList( const SGGeod &aircraft, - const nav_list_type &stations ); +class FGNavList +{ public: - - FGNavList(); - ~FGNavList(); - - // initialize the nav list - bool init(); - - // add an entry - bool add( FGNavRecord *n ); - + 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. */ - FGNavRecord *findByFreq( double freq, const SGGeod& position); - - // Given an Ident and optional freqency, return the first matching - // station. - FGNavRecord *findByIdentAndFreq( const std::string& ident, - const double freq = 0.0 ); - - // given a frequency returns the first matching entry - FGNavRecord *findStationByFreq( double frequency ); -}; - - + 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 ----------------------------------------------------------------