]> git.mxchange.org Git - flightgear.git/blob - src/Navaids/navrecord.hxx
TACAN improvements.
[flightgear.git] / src / Navaids / navrecord.hxx
1 // navrecord.hxx -- generic vor/dme/ndb class
2 //
3 // Written by Curtis Olson, started May 2004.
4 //
5 // Copyright (C) 2004  Curtis L. Olson - http://www.flightgear.org/~curt
6 //
7 // This program is free software; you can redistribute it and/or
8 // modify it under the terms of the GNU General Public License as
9 // published by the Free Software Foundation; either version 2 of the
10 // License, or (at your option) any later version.
11 //
12 // This program is distributed in the hope that it will be useful, but
13 // WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 // General Public License for more details.
16 //
17 // You should have received a copy of the GNU General Public License
18 // along with this program; if not, write to the Free Software
19 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
20 //
21 // $Id$
22
23
24 #ifndef _FG_NAVRECORD_HXX
25 #define _FG_NAVRECORD_HXX
26
27 #include <iosfwd>
28
29 #include "navaids_fwd.hxx"
30 #include "positioned.hxx"
31 #include <Airports/airports_fwd.hxx>
32
33 #include <simgear/props/propsfwd.hxx>
34 #include <simgear/timing/timestamp.hxx>
35
36 const double FG_NAV_DEFAULT_RANGE = 50; // nm
37 const double FG_LOC_DEFAULT_RANGE = 18; // nm
38 const double FG_DME_DEFAULT_RANGE = 50; // nm
39 const double FG_NAV_MAX_RANGE = 300;    // nm
40
41 class FGNavRecord : public FGPositioned 
42 {
43
44     int freq;
45     int range;
46     double multiuse;            // can be slaved variation of VOR
47                                 // (degrees) or localizer heading
48                                 // (degrees) or dme bias (nm)
49
50     std::string mName;          // verbose name in nav database
51     PositionedID mRunway;       // associated runway, if there is one
52     PositionedID mColocated;    // Colocated DME at a navaid (ILS, VOR, TACAN, NDB)
53
54   protected:
55     mutable bool serviceable;   // for failure modeling
56
57   public:
58     FGNavRecord( PositionedID aGuid,
59                  Type type,
60                  const std::string& ident,
61                  const std::string& name,
62                  const SGGeod& aPos,
63                  int freq,
64                  int range,
65                  double multiuse,
66                  PositionedID aRunway );
67
68     inline double get_lon() const { return longitude(); } // degrees
69     inline double get_lat() const { return latitude(); } // degrees
70     inline double get_elev_ft() const { return elevation(); }
71         
72     inline int get_freq() const { return freq; }
73     inline int get_range() const { return range; }
74     inline double get_multiuse() const { return multiuse; }
75     inline void set_multiuse( double m ) { multiuse = m; }
76     inline const char *get_ident() const { return ident().c_str(); }
77
78     inline bool get_serviceable() const { return serviceable; }
79     inline const char *get_trans_ident() const { return get_ident(); }
80
81   virtual const std::string& name() const
82   { return mName; }
83   
84   /**
85    * Retrieve the runway this navaid is associated with (for ILS/LOC/GS)
86    */
87   FGRunwayRef runway() const;
88   
89   /**
90    * return the localizer width, in degrees
91    * computation is based up ICAO stdandard width at the runway threshold
92    * see implementation for further details.
93    */
94   double localizerWidth() const;
95   
96   void bindToNode(SGPropertyNode* nd) const;
97   void unbindFromNode(SGPropertyNode* nd) const;
98
99   void setColocatedDME(PositionedID other);
100   bool hasDME();
101     
102     void updateFromXML(const SGGeod& geod, double heading);
103 };
104
105 /**
106  * A mobile navaid, aka. a navaid which can change its position (eg. a mobile
107  * TACAN)
108  */
109 class FGMobileNavRecord:
110   public FGNavRecord
111 {
112   public:
113     FGMobileNavRecord( PositionedID aGuid,
114                        Type type,
115                        const std::string& ident,
116                        const std::string& name,
117                        const SGGeod& aPos,
118                        int freq,
119                        int range,
120                        double multiuse,
121                        PositionedID aRunway );
122
123     virtual const SGGeod& geod() const;
124     virtual const SGVec3d& cart() const;
125
126     void updateVehicle();
127     void updatePos();
128
129   protected:
130     SGTimeStamp _last_vehicle_update;
131     SGPropertyNode_ptr _vehicle_node;
132     double _initial_elevation_ft; // Elevation as given in the config file
133 };
134
135 class FGTACANRecord : public SGReferenced {
136
137     std::string channel;                
138     int freq;
139      
140 public:
141     
142      FGTACANRecord(void);
143     inline ~FGTACANRecord(void) {}
144
145     inline const std::string& get_channel() const { return channel; }
146     inline int get_freq() const { return freq; }
147     friend std::istream& operator>> ( std::istream&, FGTACANRecord& );
148     };
149
150 #endif // _FG_NAVRECORD_HXX