X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FNavaids%2Fnavrecord.hxx;h=90e719a8e9f55d47eca563a1acb3fb9f4e741e79;hb=4a79d82ba62fa4e5be759fa0fc4b20220e8da303;hp=544d2d1aa63508ba394cf3b310a834d5ee91d1c0;hpb=b2b33f75820359670ca4d8b326370fc3771ee08c;p=flightgear.git diff --git a/src/Navaids/navrecord.hxx b/src/Navaids/navrecord.hxx index 544d2d1aa..90e719a8e 100644 --- a/src/Navaids/navrecord.hxx +++ b/src/Navaids/navrecord.hxx @@ -2,7 +2,7 @@ // // Written by Curtis Olson, started May 2004. // -// Copyright (C) 2004 Curtis L. Olson - curt@flightgear.org +// Copyright (C) 2004 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$ @@ -43,17 +43,26 @@ SG_USING_STD(istream); -#define FG_NAV_DEFAULT_RANGE 50 -#define FG_LOC_DEFAULT_RANGE 18 -#define FG_DME_DEFAULT_RANGE 50 +#define FG_NAV_DEFAULT_RANGE 50 // nm +#define FG_LOC_DEFAULT_RANGE 18 // nm +#define FG_DME_DEFAULT_RANGE 50 // nm +#define FG_NAV_MAX_RANGE 300 // nm +// Shield the rest of FG from possibly changing details of Robins navaid type numbering system. +// Currently only the GPS code uses this - extra types (LOC, GS etc) may need to be added +// should other FG code choose to use this. +enum fg_nav_types { + FG_NAV_VOR, + FG_NAV_NDB, + FG_NAV_ILS, + FG_NAV_ANY +}; class FGNavRecord { int type; - double lon, lat; // location in geodetic coords - double elev_ft; - double x, y, z; // location in cartesian coords (earth centered) + SGGeod pos; // location in geodetic coords (degrees) + SGVec3d cart; // location in cartesian coords (earth centered) int freq; int range; double multiuse; // can be slaved variation of VOR @@ -61,7 +70,8 @@ class FGNavRecord { // (degrees) or dme bias (nm) string ident; // navaid ident - string name; // "given" name + string name; // verbose name in nav database + string apt_id; // corresponding airport id bool serviceable; // for failure modeling @@ -73,19 +83,24 @@ public: inline ~FGNavRecord(void) {} inline int get_type() const { return type; } - inline double get_lon() const { return lon; } - inline double get_lat() const { return lat; } - inline double get_elev_ft() const { return elev_ft; } - inline double get_x() const { return x; } - inline double get_y() const { return y; } - inline double get_z() const { return z; } + inline fg_nav_types get_fg_type() const; + inline double get_lon() const { return pos.getLongitudeDeg(); } // degrees + inline void set_lon( double l ) { pos.setLongitudeDeg(l); } // degrees + inline double get_lat() const { return pos.getLatitudeDeg(); } // degrees + inline void set_lat( double l ) { pos.setLatitudeDeg(l); } // degrees + inline double get_elev_ft() const { return pos.getElevationFt(); } + inline void set_elev_ft( double e ) { pos.setElevationFt(e); } + const SGGeod& get_pos() const { return pos; } + const SGVec3d& get_cart() const { return cart; } inline int get_freq() const { return freq; } inline int get_range() const { return range; } inline double get_multiuse() const { return multiuse; } - inline const char *get_ident() { return ident.c_str(); } - inline string get_name() { return name; } - inline bool get_serviceable() { return serviceable; } - inline const char *get_trans_ident() { return trans_ident.c_str(); } + inline void set_multiuse( double m ) { multiuse = m; } + inline const char *get_ident() const { return ident.c_str(); } + inline const string& get_name() const { return name; } + inline const string& get_apt_id() const { return apt_id; } + inline bool get_serviceable() const { return serviceable; } + inline const char *get_trans_ident() const { return trans_ident.c_str(); } friend istream& operator>> ( istream&, FGNavRecord& ); }; @@ -94,20 +109,30 @@ public: inline FGNavRecord::FGNavRecord(void) : type(0), - lon(0.0), lat(0.0), - elev_ft(0.0), - x(0.0), y(0.0), z(0.0), + pos(SGGeod::fromDeg(0, 0)), + cart(0, 0, 0), freq(0), range(0), multiuse(0.0), ident(""), name(""), + apt_id(""), serviceable(true), trans_ident("") { } +inline fg_nav_types FGNavRecord::get_fg_type() const { + switch(type) { + case 2: return(FG_NAV_NDB); + case 3: return(FG_NAV_VOR); + case 4: return(FG_NAV_ILS); + default: return(FG_NAV_ANY); + } +} + + inline istream& operator >> ( istream& in, FGNavRecord& n ) { @@ -117,8 +142,12 @@ operator >> ( istream& in, FGNavRecord& n ) return in >> skipeol; } - in >> n.lat >> n.lon >> n.elev_ft >> n.freq >> n.multiuse + double lat, lon, elev_ft; + in >> lat >> lon >> elev_ft >> n.freq >> n.range >> n.multiuse >> n.ident; + n.pos.setLatitudeDeg(lat); + n.pos.setLongitudeDeg(lon); + n.pos.setElevationFt(elev_ft); getline( in, n.name ); // silently multiply adf frequencies by 100 so that adf @@ -127,36 +156,74 @@ operator >> ( istream& in, FGNavRecord& n ) n.freq *= 100; } - // Remove the space before the name - if ( n.name.substr(0,1) == " " ) { + // Remove any leading spaces before the name + while ( n.name.substr(0,1) == " " ) { n.name = n.name.erase(0,1); } - // assign default ranges - if ( n.type == 2 || n.type == 3 ) { - n.range = FG_NAV_DEFAULT_RANGE; - } else if ( n.type == 4 || n.type == 5 || n.type == 6 ) { - n.range = FG_LOC_DEFAULT_RANGE; - } else if ( n.type == 12 ) { - n.range = FG_DME_DEFAULT_RANGE; - } else { - n.range = FG_LOC_DEFAULT_RANGE; + if ( n.type >= 4 && n.type <= 9 ) { + // these types are always associated with an airport id + string::size_type pos = n.name.find(" "); + n.apt_id = n.name.substr(0, pos); + } + + // Ranges are included with the latest data format, no need to + // assign our own defaults, unless the range is not set for some + // reason. + + if ( n.range < 0.1 ) { + // assign default ranges + + if ( n.type == 2 || n.type == 3 ) { + n.range = FG_NAV_DEFAULT_RANGE; + } else if ( n.type == 4 || n.type == 5 || n.type == 6 ) { + n.range = FG_LOC_DEFAULT_RANGE; + } else if ( n.type == 12 ) { + n.range = FG_DME_DEFAULT_RANGE; + } else { + n.range = FG_LOC_DEFAULT_RANGE; + } } // transmitted ident (same as ident unless modeling a fault) n.trans_ident = n.ident; // generate cartesian coordinates - Point3D geod( n.lon * SGD_DEGREES_TO_RADIANS, - n.lat * SGD_DEGREES_TO_RADIANS, - n.elev_ft * SG_FEET_TO_METER ); - Point3D cart = sgGeodToCart( geod ); - n.x = cart.x(); - n.y = cart.y(); - n.z = cart.z(); + n.cart = SGVec3d::fromGeod(n.pos); return in; } +class FGTACANRecord { + + string channel; + int freq; + +public: + + inline FGTACANRecord(void); + inline ~FGTACANRecord(void) {} + + inline const string& get_channel() const { return channel; } + inline int get_freq() const { return freq; } + friend istream& operator>> ( istream&, FGTACANRecord& ); + }; + + +inline +FGTACANRecord::FGTACANRecord(void) : + channel(""), + freq(0) + +{ +} + +inline istream& +operator >> ( istream& in, FGTACANRecord& n ) +{ + in >> n.channel >> n.freq ; + //getline( in, n.name ); + return in; +} #endif // _FG_NAVRECORD_HXX