FlightGear next
route.hxx
Go to the documentation of this file.
1
7// Copyright (C) 2009 James Turner
8// SPDX-License-Identifier: GPL-2.0-or-later
9
10#pragma once
11
12// std
13#include <vector>
14#include <map>
15#include <iosfwd>
16#include <optional>
17
18// Simgear
19#include <simgear/structure/SGReferenced.hxx>
20#include <simgear/structure/SGSharedPtr.hxx>
21#include <simgear/props/props.hxx>
22
23// forward decls
24class FGPositioned;
25class SGPath;
26class FGAirport;
27
28namespace flightgear
29{
30
31// forward decls
32class RouteBase;
33class Waypt;
34class NavdataVisitor;
35class Airway;
36
37using AirwayRef = SGSharedPtr<Airway>;
38typedef SGSharedPtr<Waypt> WayptRef;
39
40typedef enum {
41 WPT_MAP = 1 << 0,
42 WPT_IAF = 1 << 1,
43 WPT_FAF = 1 << 2,
44 WPT_OVERFLIGHT = 1 << 3,
45 WPT_TRANSITION = 1 << 4,
46 WPT_MISS = 1 << 5,
49 WPT_DYNAMIC = 1 << 6,
52 WPT_GENERATED = 1 << 7,
53
54 WPT_DEPARTURE = 1 << 8,
55 WPT_ARRIVAL = 1 << 9,
56
59 WPT_PSEUDO = 1 << 10,
60 WPT_APPROACH = 1 << 11,
61
63 WPT_VIA = 1 << 12,
64
67 WPT_HIDDEN = 1 << 13
68} WayptFlag;
69
81
91
92RouteRestriction restrictionFromString(const std::string& t);
93
95
96double convertSpeedUnits(RouteUnits aSrc, RouteUnits aDest, double aAltitudeFt, double aValue);
97double convertAltitudeUnits(RouteUnits aSrc, RouteUnits aDest, double aValue);
98
104class Waypt : public SGReferenced
105{
106public:
107 virtual ~Waypt();
108
110 { return const_cast<RouteBase*>(_owner); }
111
112 virtual SGGeod position() const = 0;
113
117 virtual FGPositioned* source() const
118 { return nullptr; }
119
120 double altitudeFt() const;
121
122 double speed(RouteUnits aUnits = DEFAULT_UNITS) const;
123
124 double altitude(RouteUnits aUnits = DEFAULT_UNITS) const;
125
126 double constraintAltitude(RouteUnits aUnits = DEFAULT_UNITS) const;
127
128// wrapper - asserts if restriction type is _MACH
129 double speedKts() const;
130
131// wrapper - asserts if restriction type is not _MACH
132 double speedMach() const;
133
135 { return _altRestrict; }
136
138 { return _speedRestrict; }
139
140 void setAltitude(double aAlt, RouteRestriction aRestrict, RouteUnits aUnits = DEFAULT_UNITS);
141 void setSpeed(double aSpeed, RouteRestriction aRestrict, RouteUnits aUnits = DEFAULT_UNITS);
142
143 void setConstraintAltitude(double aAlt);
144
149 virtual std::string ident() const;
150
154 virtual bool flag(WayptFlag aFlag) const;
155
156 virtual unsigned int flags() const
157 { return _flags; }
158
159 void setFlag(WayptFlag aFlag, bool aV = true);
160
164 static WayptRef createFromProperties(RouteBase* aOwner, SGPropertyNode_ptr aProp);
165
173 static WayptRef createFromString(RouteBase* aOwner, const std::string& s, const SGGeod& vicinity);
174
175 static WayptRef fromLatLonString(RouteBase* aOwner, const std::string& target);
176
177
178 void saveAsNode(SGPropertyNode* node) const;
179
184 bool matches(Waypt* aOther) const;
185
190 bool matches(FGPositioned* aPos) const;
191
196 bool matches(const SGGeod& aPos) const;
197
198 virtual std::string type() const = 0;
199
204 virtual double magvarDeg() const;
205
211 virtual double headingRadialDeg() const;
212
217 virtual std::string icaoDescription() const;
218
219protected:
220 friend class NavdataVisitor;
221
222 Waypt(RouteBase* aOwner);
223
227 virtual bool initFromProperties(SGPropertyNode_ptr aProp);
228
232 virtual void writeToProperties(SGPropertyNode_ptr aProp) const;
233
234 typedef Waypt*(FactoryFunction)(RouteBase* aOwner);
235 static void registerFactory(const std::string aNodeType, FactoryFunction* aFactory);
236
237 double _altitude = 0.0;
240 std::optional<double> _constraintAltitude;
241
243
244 double _speed = 0.0;
246
249private:
250
254 static WayptRef createInstance(RouteBase* aOwner, const std::string& aTypeName);
255
256 const RouteBase* _owner = nullptr;
257 unsigned short _flags = 0;
258 mutable double _magVarDeg = 0.0;
259};
260
261typedef std::vector<WayptRef> WayptVec;
262
263class RouteBase : public SGReferenced
264{
265public:
266 virtual ~RouteBase();
267
271 virtual std::string ident() const = 0;
272
273 static void loadAirportProcedures(const SGPath& aPath, FGAirport* aApt);
274
275 static void dumpRouteToKML(const WayptVec& aRoute, const std::string& aName);
276
277 static void dumpRouteToKMLLineString(const std::string& aIdent,
278 const WayptVec& aRoute, std::ostream& aStream);
279private:
280
281};
282
283} // of namespace flightgear
double altitude
Definition ADA.cxx:46
static void dumpRouteToKML(const WayptVec &aRoute, const std::string &aName)
Definition route.cxx:713
static void loadAirportProcedures(const SGPath &aPath, FGAirport *aApt)
Definition route.cxx:757
static void dumpRouteToKMLLineString(const std::string &aIdent, const WayptVec &aRoute, std::ostream &aStream)
Definition route.cxx:735
virtual std::string ident() const =0
virtual ~RouteBase()
Definition route.cxx:709
Abstract base class for waypoints (and things that are treated similarly by navigation systems).
Definition route.hxx:105
virtual unsigned int flags() const
Definition route.hxx:156
virtual std::string icaoDescription() const
icaoDescription - description of the waypoint in ICAO route plan format
Definition route.cxx:342
RouteUnits _altitudeUnits
Definition route.hxx:242
double speed(RouteUnits aUnits=DEFAULT_UNITS) const
Definition route.cxx:294
friend class NavdataVisitor
Definition route.hxx:220
Waypt(RouteBase *aOwner)
Definition route.cxx:189
RouteBase * owner() const
Definition route.hxx:109
double altitudeFt() const
Definition route.cxx:289
RouteRestriction _altRestrict
Definition route.hxx:247
std::optional< double > _constraintAltitude
some restriction types specify two altitudes, in which case this is the second value,...
Definition route.hxx:240
virtual FGPositioned * source() const
The Positioned associated with this element, if one exists.
Definition route.hxx:117
virtual RouteRestriction altitudeRestriction() const
Definition route.hxx:134
virtual std::string type() const =0
static WayptRef createFromString(RouteBase *aOwner, const std::string &s, const SGGeod &vicinity)
Create a waypoint from the route manager's standard string format:
Definition route.cxx:491
void setAltitude(double aAlt, RouteRestriction aRestrict, RouteUnits aUnits=DEFAULT_UNITS)
Definition route.cxx:248
void setConstraintAltitude(double aAlt)
Definition route.cxx:259
RouteRestriction _speedRestrict
Definition route.hxx:248
void setFlag(WayptFlag aFlag, bool aV=true)
Definition route.cxx:209
virtual ~Waypt()
Definition route.cxx:195
bool matches(Waypt *aOther) const
Test if this element and another are 'the same', i.e matching ident and lat/lon are approximately equ...
Definition route.cxx:219
static WayptRef createFromProperties(RouteBase *aOwner, SGPropertyNode_ptr aProp)
Factory method.
Definition route.cxx:417
virtual bool initFromProperties(SGPropertyNode_ptr aProp)
Persistence helper - read node properties from a file.
Definition route.cxx:584
virtual bool flag(WayptFlag aFlag) const
Test if the specified flag is set for this element.
Definition route.cxx:204
virtual double headingRadialDeg() const
return the assoicated heading or radial for this waypoint.
Definition route.cxx:337
static void registerFactory(const std::string aNodeType, FactoryFunction *aFactory)
virtual void writeToProperties(SGPropertyNode_ptr aProp) const
Persistence helper - save this element to a node.
Definition route.cxx:655
void saveAsNode(SGPropertyNode *node) const
Definition route.cxx:578
virtual std::string ident() const
Identifier assoicated with the waypoint.
Definition route.cxx:199
virtual SGGeod position() const =0
static WayptRef fromLatLonString(RouteBase *aOwner, const std::string &target)
Definition route.cxx:458
RouteUnits _speedUnits
Definition route.hxx:245
double speedMach() const
Definition route.cxx:284
virtual double magvarDeg() const
Magentic variation at/in the vicinity of the waypoint.
Definition route.cxx:324
Waypt * FactoryFunction(RouteBase *aOwner)
Definition route.hxx:234
virtual RouteRestriction speedRestriction() const
Definition route.hxx:137
void setSpeed(double aSpeed, RouteRestriction aRestrict, RouteUnits aUnits=DEFAULT_UNITS)
Definition route.cxx:264
double constraintAltitude(RouteUnits aUnits=DEFAULT_UNITS) const
Definition route.cxx:312
double speedKts() const
Definition route.cxx:279
FlightPlan.hxx - defines a full flight-plan object, including departure, cruise, arrival information ...
Definition Addon.cxx:53
double convertAltitudeUnits(RouteUnits aSrc, RouteUnits aDest, double aValue)
Definition route.cxx:164
RouteRestriction restrictionFromString(const std::string &aStr)
Definition route.cxx:350
@ SPEED_KPH
Definition route.hxx:89
@ ALTITUDE_FLIGHTLEVEL
Definition route.hxx:86
@ DEFAULT_UNITS
Definition route.hxx:83
@ ALTITUDE_METER
Definition route.hxx:85
@ SPEED_KNOTS
Definition route.hxx:87
@ SPEED_MACH
Definition route.hxx:88
@ ALTITUDE_FEET
Definition route.hxx:84
SGSharedPtr< Waypt > WayptRef
SGSharedPtr< Airway > AirwayRef
Definition airways.hxx:40
double convertSpeedUnits(RouteUnits aSrc, RouteUnits aDest, double aAltitudeFt, double aValue)
Definition route.cxx:158
bool isMachRestrict(RouteRestriction rr)
Definition route.cxx:59
@ WPT_DEPARTURE
Definition route.hxx:54
@ WPT_DYNAMIC
waypoint position is dynamic, i.e moves based on other criteria, such as altitude,...
Definition route.hxx:49
@ WPT_PSEUDO
waypoint generated by VNAV / speed management profile, for step climbs or top of descent
Definition route.hxx:59
@ WPT_MAP
missed approach point
Definition route.hxx:41
@ WPT_MISS
segment is part of missed approach
Definition route.hxx:46
@ WPT_HIDDEN
waypoint should not be shown in UI displays, etc this is used to implement FMSs which delete waypoint...
Definition route.hxx:67
@ WPT_APPROACH
Definition route.hxx:60
@ WPT_TRANSITION
transition to/from enroute structure
Definition route.hxx:45
@ WPT_FAF
final approach fix
Definition route.hxx:43
@ WPT_IAF
initial approach fix
Definition route.hxx:42
@ WPT_ARRIVAL
Definition route.hxx:55
@ WPT_GENERATED
waypoint was created automatically (not manually entered/loaded) for example waypoints from airway ro...
Definition route.hxx:52
@ WPT_OVERFLIGHT
must overfly the point directly
Definition route.hxx:44
@ WPT_VIA
waypoint prodcued by expanding a VIA segment
Definition route.hxx:63
std::vector< WayptRef > WayptVec
RouteRestriction
Definition route.hxx:70
@ RESTRICT_NONE
Definition route.hxx:71
@ RESTRICT_AT
Definition route.hxx:72
@ RESTRICT_BELOW
Definition route.hxx:74
@ RESTRICT_DELETE
ignore underlying restriction (on a leg)
Definition route.hxx:77
@ RESTRICT_COMPUTED
data is computed, not a real restriction
Definition route.hxx:78
@ SPEED_COMPUTED_MACH
variant on above to encode a Mach value
Definition route.hxx:79
@ RESTRICT_ABOVE
Definition route.hxx:73
@ SPEED_RESTRICT_MACH
encode an 'AT' restriction in Mach, not IAS
Definition route.hxx:76
@ RESTRICT_BETWEEN
Definition route.hxx:75