//
// 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
//
// 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$
#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
inline ~FGNavRecord(void) {}
inline int get_type() const { return type; }
- inline double get_lon() const { return lon; }
- inline void set_lon( double l ) { lon = l; }
- inline double get_lat() const { return lat; }
- inline void set_lat( double l ) { lat = l; }
- inline double get_elev_ft() const { return elev_ft; }
- inline void set_elev_ft( double e ) { elev_ft = e; }
- 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 void set_multiuse( double m ) { multiuse = m; }
- inline const char *get_ident() { return ident.c_str(); }
- inline string get_name() { return name; }
- inline string get_apt_id() { return apt_id; }
- inline bool get_serviceable() { return serviceable; }
- inline const char *get_trans_ident() { return trans_ident.c_str(); }
+ 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& );
};
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),
}
+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 )
{
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
n.apt_id = n.name.substr(0, pos);
}
- // 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;
+ // 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