X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FNavaids%2Fnavrecord.hxx;h=2773629f4ebccfd20f9d767d79b89abd28442e4c;hb=0e53e2cbb1e7f511c40121ade43a539d15e0e155;hp=544d2d1aa63508ba394cf3b310a834d5ee91d1c0;hpb=b2b33f75820359670ca4d8b326370fc3771ee08c;p=flightgear.git diff --git a/src/Navaids/navrecord.hxx b/src/Navaids/navrecord.hxx index 544d2d1aa..2773629f4 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$ @@ -24,139 +24,100 @@ #ifndef _FG_NAVRECORD_HXX #define _FG_NAVRECORD_HXX -#include +#include -#include -#include -#include -#include -#include +#include "positioned.hxx" -#ifdef SG_HAVE_STD_INCLUDES -# include -#elif defined( __BORLANDC__ ) || (__APPLE__) -# include -#else -# include -#endif +#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 -SG_USING_STD(istream); +// FIXME - get rid of these, and use the real enum directly +#define FG_NAV_VOR FGPositioned::VOR +#define FG_NAV_NDB FGPositioned::NDB +#define FG_NAV_ILS FGPositioned::ILS +#define FG_NAV_ANY FGPositioned::INVALID +typedef FGPositioned::Type fg_nav_types; -#define FG_NAV_DEFAULT_RANGE 50 -#define FG_LOC_DEFAULT_RANGE 18 -#define FG_DME_DEFAULT_RANGE 50 +// forward decls +class FGRunway; +class SGPropertyNode; +class FGNavRecord : public FGPositioned +{ -class FGNavRecord { - - int type; - double lon, lat; // location in geodetic coords - double elev_ft; - double x, y, z; // location in cartesian coords (earth centered) int freq; int range; double multiuse; // can be slaved variation of VOR // (degrees) or localizer heading // (degrees) or dme bias (nm) - string ident; // navaid ident - string name; // "given" name - + std::string _name; // verbose name in nav database + FGRunway* mRunway; // associated runway, if there is one bool serviceable; // for failure modeling - string trans_ident; // for failure modeling - + std::string trans_ident; // for failure modeling + + /** + * Helper to init data when a navrecord is associated with an airport + */ + void initAirportRelation(); + + void alignLocaliserWithRunway(double aThreshold); + + void readAirportSceneryData(); + void processSceneryILS(SGPropertyNode* aILSNode); public: + inline ~FGNavRecord(void) {} - inline FGNavRecord(void); - 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; } + FGNavRecord(Type type, const std::string& ident, const std::string& name, + const SGGeod& aPos, + int freq, int range, double multiuse); + + inline double get_lon() const { return longitude(); } // degrees + inline double get_lat() const { return latitude(); } // degrees + inline double get_elev_ft() const { return elevation(); } + 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(); } - - friend istream& operator>> ( istream&, FGNavRecord& ); + inline void set_multiuse( double m ) { multiuse = m; } + inline const char *get_ident() const { return ident().c_str(); } + + inline bool get_serviceable() const { return serviceable; } + inline const char *get_trans_ident() const { return trans_ident.c_str(); } + + virtual const std::string& name() const + { return _name; } + + /** + * Retrieve the runway this navaid is associated with (for ILS/LOC/GS) + */ + FGRunway* runway() const { return mRunway; } + + /** + * return the localizer width, in degrees + * computation is based up ICAO stdandard width at the runway threshold + * see implementation for further details. + */ + double localizerWidth() const; }; +class FGTACANRecord : public SGReferenced { -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), - freq(0), - range(0), - multiuse(0.0), - ident(""), - name(""), - serviceable(true), - trans_ident("") -{ -} - - -inline istream& -operator >> ( istream& in, FGNavRecord& n ) -{ - in >> n.type; + std::string channel; + int freq; + +public: - if ( n.type == 99 ) { - return in >> skipeol; - } - - in >> n.lat >> n.lon >> n.elev_ft >> n.freq >> n.multiuse - >> n.ident; - getline( in, n.name ); - - // silently multiply adf frequencies by 100 so that adf - // vs. nav/loc frequency lookups can use the same code. - if ( n.type == 2 ) { - n.freq *= 100; - } - - // Remove the space before the name - if ( 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; - } - - // 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(); - - return in; -} + FGTACANRecord(void); + inline ~FGTACANRecord(void) {} + inline const std::string& get_channel() const { return channel; } + inline int get_freq() const { return freq; } + friend std::istream& operator>> ( std::istream&, FGTACANRecord& ); + }; #endif // _FG_NAVRECORD_HXX