#include <simgear/compiler.h>
-#include <simgear/math/fg_geodesy.hxx>
-#include <simgear/misc/fgstream.hxx>
+#include <simgear/math/sg_geodesy.hxx>
+#include <simgear/misc/sgstream.hxx>
-#ifdef FG_HAVE_STD_INCLUDES
+#ifdef SG_HAVE_STD_INCLUDES
# include <istream>
-#elif defined( FG_HAVE_NATIVE_SGI_COMPILERS )
+#elif defined( SG_HAVE_NATIVE_SGI_COMPILERS )
# include <iostream.h>
-#elif defined( __BORLANDC__ )
+#elif defined( __BORLANDC__ ) || (__APPLE__)
# include <iostream>
#else
# include <istream.h>
#endif
-#if ! defined( FG_HAVE_NATIVE_SGI_COMPILERS )
-FG_USING_STD(istream);
+#if ! defined( SG_HAVE_NATIVE_SGI_COMPILERS )
+SG_USING_STD(istream);
#endif
-#define FG_ILS_DEFAULT_RANGE 30
+#define FG_ILS_DEFAULT_RANGE 18
class FGILS {
char aptcode[5];
char rwyno[4];
int locfreq;
- char locident[5];
+ char locident[5]; // official ident
double locheading;
double loclat;
double loclon;
+ double x, y, z;
+ bool has_gs;
double gselev;
double gsangle;
double gslat;
double gslon;
double gs_x, gs_y, gs_z;
+ bool has_dme;
double dmelat;
double dmelon;
double dme_x, dme_y, dme_z;
double imlat;
double imlon;
+ // for failure modeling
+ string trans_ident; // transmitted ident
+ bool loc_failed; // localizer failed?
+ bool gs_failed; // glide slope failed?
+ bool dme_failed; // dme failed?
+
public:
- inline FGILS(void) {}
+ inline FGILS(void);
inline ~FGILS(void) {}
inline char get_ilstype() const { return ilstype; }
inline char *get_rwyno() { return rwyno; }
inline int get_locfreq() const { return locfreq; }
inline char *get_locident() { return locident; }
+ inline string get_trans_ident() { return trans_ident; }
inline double get_locheading() const { return locheading; }
inline double get_loclat() const { return loclat; }
inline double get_loclon() const { return loclon; }
+ inline double get_x() const { return x; }
+ inline double get_y() const { return y; }
+ inline double get_z() const { return z; }
+ inline bool get_has_gs() const { return has_gs; }
inline double get_gselev() const { return gselev; }
inline double get_gsangle() const { return gsangle; }
inline double get_gslat() const { return gslat; }
inline double get_gs_x() const { return gs_x; }
inline double get_gs_y() const { return gs_y; }
inline double get_gs_z() const { return gs_z; }
+ inline bool get_has_dme() const { return has_dme; }
inline double get_dmelat() const { return dmelat; }
inline double get_dmelon() const { return dmelon; }
inline double get_dme_x() const { return dme_x; }
};
+inline
+FGILS::FGILS(void)
+ : ilstype(0),
+ locfreq(0),
+ locheading(0.0),
+ loclat(0.0),
+ loclon(0.0),
+ x(0.0), y(0.0), z(0.0),
+ has_gs(false),
+ gselev(0.0),
+ gsangle(0.0),
+ gslat(0.0),
+ gslon(0.0),
+ gs_x(0.0), gs_y(0.0), gs_z(0.0),
+ has_dme(false),
+ dmelat(0.0),
+ dmelon(0.0),
+ dme_x(0.0), dme_y(0.0), dme_z(0.0),
+ omlat(0.0),
+ omlon(0.0),
+ mmlat(0.0),
+ mmlon(0.0),
+ imlat(0.0),
+ imlon(0.0),
+ trans_ident(""),
+ loc_failed(false),
+ gs_failed(false),
+ dme_failed(false)
+{
+ ilstypename[0] = '\0';
+ aptcode[0] = '\0';
+ rwyno[0] = '\0';
+ locident[0] = '\0';
+}
+
+
inline istream&
operator >> ( istream& in, FGILS& i )
{
double f;
- in >> i.ilstype >> i.ilstypename >> i.aptcode >> i.rwyno
+ in >> i.ilstype;
+
+ if ( i.ilstype == '[' )
+ return in;
+
+ in >> i.ilstypename >> i.aptcode >> i.rwyno
>> f >> i.locident >> i.locheading >> i.loclat >> i.loclon
>> i.gselev >> i.gsangle >> i.gslat >> i.gslon
>> i.dmelat >> i.dmelon
// generate cartesian coordinates
Point3D geod, cart;
- if ( i.gslon < FG_EPSILON && i.gslat < FG_EPSILON ) {
- i.gslon = i.loclon;
- i.gslat = i.loclat;
+ geod = Point3D( i.loclon * SGD_DEGREES_TO_RADIANS, i.loclat * SGD_DEGREES_TO_RADIANS, i.gselev );
+ cart = sgGeodToCart( geod );
+ i.x = cart.x();
+ i.y = cart.y();
+ i.z = cart.z();
+
+ if ( i.gslon < SG_EPSILON && i.gslat < SG_EPSILON ) {
+ i.has_gs = false;
+ } else {
+ i.has_gs = true;
+
+ geod = Point3D( i.gslon * SGD_DEGREES_TO_RADIANS, i.gslat * SGD_DEGREES_TO_RADIANS, i.gselev );
+ cart = sgGeodToCart( geod );
+ i.gs_x = cart.x();
+ i.gs_y = cart.y();
+ i.gs_z = cart.z();
+ // cout << "gs = " << cart << endl;
}
- if ( i.dmelon < FG_EPSILON && i.dmelat < FG_EPSILON ) {
- i.dmelon = i.gslon;
- i.dmelat = i.gslat;
+ if ( i.dmelon < SG_EPSILON && i.dmelat < SG_EPSILON ) {
+ i.has_dme = false;
+ } else {
+ i.has_dme = true;
+
+ geod = Point3D( i.dmelon * SGD_DEGREES_TO_RADIANS, i.dmelat * SGD_DEGREES_TO_RADIANS, i.gselev);
+ cart = sgGeodToCart( geod );
+ i.dme_x = cart.x();
+ i.dme_y = cart.y();
+ i.dme_z = cart.z();
+ // cout << "dme = " << cart << endl;
}
- geod = Point3D( i.gslon * DEG_TO_RAD, i.gslat * DEG_TO_RAD, i.gselev );
- cart = fgGeodToCart( geod );
- i.gs_x = cart.x();
- i.gs_y = cart.y();
- i.gs_z = cart.z();
- // cout << "gs = " << cart << endl;
-
- geod = Point3D( i.dmelon * DEG_TO_RAD, i.dmelat * DEG_TO_RAD, i.gselev );
- cart = fgGeodToCart( geod );
- i.dme_x = cart.x();
- i.dme_y = cart.y();
- i.dme_z = cart.z();
- // cout << "dme = " << cart << endl;
-
- // return in >> skipeol;
+ i.trans_ident = "I";
+ i.trans_ident += i.locident;
+ i.loc_failed = i.gs_failed = i.dme_failed = false;
+
+ // return in >> skipeol;
return in;
}