]> git.mxchange.org Git - flightgear.git/blobdiff - src/Navaids/ils.hxx
Added static port system and a new altimeter model connected to it.
[flightgear.git] / src / Navaids / ils.hxx
index 21b202138b44d376e8202a45f32398fb0eff969b..8fd0a2fc26eb0fc821c018065b8198fb2004f6b8 100644 (file)
 
 
 #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 {
 
@@ -53,7 +53,7 @@ class FGILS {
     char aptcode[5];
     char rwyno[4];
     int  locfreq;
-    char locident[5];
+    char locident[5];          // official ident
     double locheading;
     double loclat;
     double loclon;
@@ -75,9 +75,15 @@ class FGILS {
     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; }
@@ -86,6 +92,7 @@ public:
     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; }
@@ -117,11 +124,52 @@ public:
 };
 
 
+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
@@ -135,39 +183,43 @@ operator >> ( istream& in, FGILS& i )
     // generate cartesian coordinates
     Point3D geod, cart;
 
-    geod = Point3D( i.loclon * DEG_TO_RAD, i.loclat * DEG_TO_RAD, i.gselev );
-    cart = fgGeodToCart( geod );
+    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 < FG_EPSILON && i.gslat < FG_EPSILON ) {
+    if ( i.gslon < SG_EPSILON && i.gslat < SG_EPSILON ) {
        i.has_gs = false;
     } else {
        i.has_gs = true;
 
-       geod = Point3D( i.gslon * DEG_TO_RAD, i.gslat * DEG_TO_RAD, i.gselev );
-       cart = fgGeodToCart( geod );
+       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 ) {
+    if ( i.dmelon < SG_EPSILON && i.dmelat < SG_EPSILON ) {
        i.has_dme = false;
     } else {
        i.has_dme = true;
 
-       geod = Point3D( i.dmelon * DEG_TO_RAD, i.dmelat * DEG_TO_RAD, i.gselev);
-       cart = fgGeodToCart( geod );
+       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;
     }
 
-     // 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;
 }