X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FNavaids%2Fnavlist.cxx;h=9b0c911dee50c44c274532495c78113a9252fb5d;hb=9c467af6bf2f04ddaae2d7937ce6d4b547ab099b;hp=0beae3f0ff5a8634004bebb8cfac7086fd521108;hpb=5eb2f74e991827692a6d7f2b1a33e4a6568b6ab7;p=flightgear.git diff --git a/src/Navaids/navlist.cxx b/src/Navaids/navlist.cxx index 0beae3f0f..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,17 +179,18 @@ 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); + int freqKhz = static_cast(freq * 100 + 0.5); PositionedIDVec stations(cache->findNavaidsByFreq(freqKhz, position, filter)); if (stations.empty()) { return NULL; @@ -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,17 +223,17 @@ 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); + int freqKhz = static_cast(freq * 100 + 0.5); PositionedIDVec stations(cache->findNavaidsByFreq(freqKhz, filter)); if (stations.empty()) { return NULL; } BOOST_FOREACH(PositionedID id, stations) { - FGNavRecord* station = (FGNavRecord*) cache->loadById(id); + FGNavRecordRef station = FGPositioned::loadById(id); if (filter->pass(station)) { return station; } @@ -227,11 +248,11 @@ nav_list_type FGNavList::findAllByFreq( double freq, const SGGeod& position, nav_list_type stations; flightgear::NavDataCache* cache = flightgear::NavDataCache::instance(); - int freqKhz = static_cast(freq * 1000); + int freqKhz = static_cast(freq * 1000 + 0.5); 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) { @@ -302,7 +323,7 @@ bool FGTACANList::add( FGTACANRecord *c ) FGTACANRecord *FGTACANList::findByChannel( const string& channel ) { const tacan_list_type& stations = ident_channels[channel]; - SG_LOG( SG_INSTR, SG_DEBUG, "findByChannel " << channel<< " size " << stations.size() ); + SG_LOG( SG_NAVAID, SG_DEBUG, "findByChannel " << channel<< " size " << stations.size() ); if (!stations.empty()) { return stations[0];