]> git.mxchange.org Git - flightgear.git/blob - src/Navaids/route.hxx
Expand route-manager waypoint info, to support smarter FMS functions.
[flightgear.git] / src / Navaids / route.hxx
1 /**
2  * route.hxx - defines basic route and route-element classes. Route elements
3  * are specialised into waypoints and related things. Routes are any class tha
4  * owns a collection (list, tree, graph) of route elements - such as airways,
5  * procedures or a flight plan.
6  */
7  
8 // Written by James Turner, started 2009.
9 //
10 // Copyright (C) 2009  Curtis L. Olson
11 //
12 // This program is free software; you can redistribute it and/or
13 // modify it under the terms of the GNU General Public License as
14 // published by the Free Software Foundation; either version 2 of the
15 // License, or (at your option) any later version.
16 //
17 // This program is distributed in the hope that it will be useful, but
18 // WITHOUT ANY WARRANTY; without even the implied warranty of
19 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20 // General Public License for more details.
21 //
22 // You should have received a copy of the GNU General Public License
23 // along with this program; if not, write to the Free Software
24 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
25
26 #ifndef FG_ROUTE_HXX
27 #define FG_ROUTE_HXX
28
29 // std
30 #include <vector>
31 #include <map>
32 #include <iosfwd>
33
34 // Simgear
35 #include <simgear/math/SGMath.hxx>
36 #include <simgear/structure/SGReferenced.hxx>
37 #include <simgear/structure/SGSharedPtr.hxx>
38 #include <simgear/props/props.hxx>
39
40 // forward decls
41 class FGPositioned;
42 class SGPath;
43 class FGAirport;
44
45 namespace flightgear
46 {
47
48 // forward decls
49 class Route;
50 class Waypt;
51 class NavdataVisitor;
52
53 typedef SGSharedPtr<Waypt> WayptRef;
54
55 typedef enum {
56         WPT_MAP           = 1 << 0, ///< missed approach point
57         WPT_IAF           = 1 << 1, ///< initial approach fix
58         WPT_FAF           = 1 << 2, ///< final approach fix
59         WPT_OVERFLIGHT    = 1 << 3, ///< must overfly the point directly
60         WPT_TRANSITION    = 1 << 4, ///< transition to/from enroute structure
61         WPT_MISS          = 1 << 5, ///< segment is part of missed approach
62   /// waypoint position is dynamic, i.e moves based on other criteria,
63   /// such as altitude, inbound course, or so on.
64   WPT_DYNAMIC       = 1 << 6,
65   /// waypoint was created automatically (not manually entered/loaded)
66   /// for example waypoints from airway routing or a procedure  
67   WPT_GENERATED     = 1 << 7,
68   
69   WPT_DEPARTURE     = 1 << 8,
70   WPT_ARRIVAL       = 1 << 9
71 } WayptFlag;
72
73 typedef enum {
74         RESTRICT_NONE,
75         RESTRICT_AT,
76         RESTRICT_ABOVE,
77         RESTRICT_BELOW,
78   SPEED_RESTRICT_MACH
79 } RouteRestriction;
80
81 /**
82  * Abstract base class for waypoints (and things that are treated similarly
83  * by navigation systems)
84  */
85 class Waypt : public SGReferenced
86 {
87 public:
88         Route* owner() const 
89                 { return _owner; }
90   
91   /**
92    * Return true course (in degrees) and distance (in metres) from the provided
93    * position to this waypoint
94    */
95   virtual std::pair<double, double> courseAndDistanceFrom(const SGGeod& aPos) const;
96                         
97         virtual SGGeod position() const = 0;
98         
99         /**
100          * The Positioned associated with this element, if one exists
101          */
102         virtual FGPositioned* source() const
103                 { return NULL; }
104         
105         virtual double altitudeFt() const 
106                 { return _altitudeFt; }
107                 
108   virtual double speed() const
109     { return _speed; }
110   
111 // wrapper - asserts if restriction type is _MACH
112   double speedKts() const;
113   
114 // wrapper - asserts if restriction type is not _MACH
115   double speedMach() const;
116   
117         virtual RouteRestriction altitudeRestriction() const
118                 { return _altRestrict; }
119         
120         virtual RouteRestriction speedRestriction() const
121                 { return _speedRestrict; }
122         
123   void setAltitude(double aAlt, RouteRestriction aRestrict);
124   void setSpeed(double aSpeed, RouteRestriction aRestrict);
125   
126   /**
127    * Identifier assoicated with the waypoint. Human-readable, but
128    * possibly quite terse, and definitiely not unique.
129    */
130         virtual std::string ident() const;
131         
132         /**
133          * Test if the specified flag is set for this element
134          */
135         virtual bool flag(WayptFlag aFlag) const;
136         
137   void setFlag(WayptFlag aFlag, bool aV = true);
138   
139   /**
140    * Factory method
141    */
142   static WayptRef createFromProperties(Route* aOwner, SGPropertyNode_ptr aProp);
143   
144   void saveAsNode(SGPropertyNode* node) const;
145   
146   /**
147    * Test if this element and another are 'the same', i.e matching
148    * ident and lat/lon are approximately equal
149    */
150   bool matches(Waypt* aOther) const;
151
152   /**
153    * Test if this element and a position 'the same'
154    * this can be defined by either position, ident or both
155    */
156   bool matches(const SGGeod& aPos) const;
157   
158   virtual std::string type() const = 0;
159 protected:
160   friend class NavdataVisitor;
161   
162         Waypt(Route* aOwner);
163   
164   /**
165    * Persistence helper - read node properties from a file
166    */
167   virtual void initFromProperties(SGPropertyNode_ptr aProp);
168   
169   /**
170    * Persistence helper - save this element to a node
171    */
172   virtual void writeToProperties(SGPropertyNode_ptr aProp) const;
173   
174   typedef Waypt* (FactoryFunction)(Route* aOwner) ;
175   static void registerFactory(const std::string aNodeType, FactoryFunction* aFactory);
176   
177   double _altitudeFt;
178         double _speed; // knots IAS or mach
179         RouteRestriction _altRestrict;
180         RouteRestriction _speedRestrict;
181 private:
182
183   /**
184    * Create an instance of a concrete subclass, or throw an exception
185    */
186   static Waypt* createInstance(Route* aOwner, const std::string& aTypeName);
187
188         Route* _owner;
189         unsigned short _flags;
190         
191 };
192
193 typedef std::vector<WayptRef> WayptVec;
194   
195 class Route
196 {
197 public:
198   /**
199    *
200    */
201   virtual std::string ident() const = 0;
202   
203   static void loadAirportProcedures(const SGPath& aPath, FGAirport* aApt);
204   
205   static void dumpRouteToFile(const WayptVec& aRoute, const std::string& aName);
206   
207   static void dumpRouteToLineString(const std::string& aIdent,
208     const WayptVec& aRoute, std::ostream& aStream);
209 private:
210
211 };
212
213 } // of namespace flightgear
214
215 #endif // of FG_ROUTE_HXX