X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FNavaids%2Fnavlist.cxx;h=9b0c911dee50c44c274532495c78113a9252fb5d;hb=9c467af6bf2f04ddaae2d7937ce6d4b547ab099b;hp=eb6bac7547b2d80060f488e65b42e8fa1e422f49;hpb=458edb933903836ac10b2acd9ef68e06e2a04470;p=flightgear.git diff --git a/src/Navaids/navlist.cxx b/src/Navaids/navlist.cxx index eb6bac754..9b0c911de 100644 --- a/src/Navaids/navlist.cxx +++ b/src/Navaids/navlist.cxx @@ -37,6 +37,7 @@ #include #include +#include using std::string; @@ -91,6 +92,7 @@ bool navidUsable(FGNavRecord* aNav, const SGGeod &aircraft) // FGNavList ------------------------------------------------------------------ +//------------------------------------------------------------------------------ FGNavList::TypeFilter::TypeFilter(const FGPositioned::Type type) { if (type == FGPositioned::INVALID) { @@ -101,14 +103,32 @@ FGNavList::TypeFilter::TypeFilter(const FGPositioned::Type type) } } - -FGNavList::TypeFilter::TypeFilter(const FGPositioned::Type minType, - const FGPositioned::Type maxType) : +//------------------------------------------------------------------------------ +FGNavList::TypeFilter::TypeFilter( const FGPositioned::Type minType, + const FGPositioned::Type maxType ): _mintype(minType), _maxtype(maxType) { } +//------------------------------------------------------------------------------ +bool FGNavList::TypeFilter::fromTypeString(const std::string& type) +{ + FGPositioned::Type t; + if( type == "any" ) t = FGPositioned::INVALID; + else if( type == "fix" ) t = FGPositioned::FIX; + else if( type == "vor" ) t = FGPositioned::VOR; + else if( type == "ndb" ) t = FGPositioned::NDB; + else if( type == "ils" ) t = FGPositioned::ILS; + else if( type == "dme" ) t = FGPositioned::DME; + else if( type == "tacan") t = FGPositioned::TACAN; + else return false; + + _mintype = _maxtype = t; + + return true; +} + /** * Filter returning Tacan stations. Checks for both pure TACAN stations * but also co-located VORTACs. This is done by searching for DMEs whose @@ -159,14 +179,15 @@ FGNavList::TypeFilter* FGNavList::tacanFilter() return &tf; } -FGNavList::TypeFilter* FGNavList::carrierFilter() +FGNavList::TypeFilter* FGNavList::mobileTacanFilter() { static TypeFilter tf(FGPositioned::MOBILE_TACAN); return &tf; } -FGNavRecord *FGNavList::findByFreq( double freq, const SGGeod& position, - TypeFilter* filter) +FGNavRecordRef FGNavList::findByFreq( double freq, + const SGGeod& position, + TypeFilter* filter ) { flightgear::NavDataCache* cache = flightgear::NavDataCache::instance(); int freqKhz = static_cast(freq * 100 + 0.5); @@ -181,7 +202,7 @@ FGNavRecord *FGNavList::findByFreq( double freq, const SGGeod& position, = FG_NAV_MAX_RANGE*SG_NM_TO_METER*FG_NAV_MAX_RANGE*SG_NM_TO_METER; BOOST_FOREACH(PositionedID id, stations) { - FGNavRecord* station = (FGNavRecord*) cache->loadById(id); + FGNavRecordRef station = FGPositioned::loadById(id); if (!filter->pass(station)) { continue; } @@ -202,7 +223,7 @@ FGNavRecord *FGNavList::findByFreq( double freq, const SGGeod& position, return NULL; } -FGNavRecord *FGNavList::findByFreq( double freq, TypeFilter* filter) +FGNavRecordRef FGNavList::findByFreq(double freq, TypeFilter* filter) { flightgear::NavDataCache* cache = flightgear::NavDataCache::instance(); int freqKhz = static_cast(freq * 100 + 0.5); @@ -212,7 +233,7 @@ FGNavRecord *FGNavList::findByFreq( double freq, TypeFilter* filter) } BOOST_FOREACH(PositionedID id, stations) { - FGNavRecord* station = (FGNavRecord*) cache->loadById(id); + FGNavRecordRef station = FGPositioned::loadById(id); if (filter->pass(station)) { return station; } @@ -231,7 +252,7 @@ nav_list_type FGNavList::findAllByFreq( double freq, const SGGeod& position, PositionedIDVec ids(cache->findNavaidsByFreq(freqKhz, position, filter)); BOOST_FOREACH(PositionedID id, ids) { - FGNavRecord* station = (FGNavRecord*) cache->loadById(id); + FGNavRecordRef station = FGPositioned::loadById(id); if (!filter->pass(station)) { continue; } @@ -248,7 +269,7 @@ nav_list_type FGNavList::findByIdentAndFreq(const string& ident, const double fr nav_list_type reply; int f = (int)(freq*100.0 + 0.5); - FGPositioned::List stations = FGPositioned::findAllWithIdent(ident, filter); + FGPositionedList stations = FGPositioned::findAllWithIdent(ident, filter); BOOST_FOREACH(FGPositionedRef ref, stations) { FGNavRecord* nav = static_cast(ref.ptr()); if ( f <= 0.0 || nav->get_freq() == f) {