]> git.mxchange.org Git - flightgear.git/blob - src/Autopilot/route_mgr.hxx
Interim windows build fix
[flightgear.git] / src / Autopilot / route_mgr.hxx
1 // route_mgr.hxx - manage a route (i.e. a collection of waypoints)
2 //
3 // Written by Curtis Olson, started January 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 _ROUTE_MGR_HXX
25 #define _ROUTE_MGR_HXX 1
26
27 #include <simgear/props/props.hxx>
28 #include <simgear/structure/subsystem_mgr.hxx>
29
30 #include <Navaids/FlightPlan.hxx>
31
32 // forward decls
33 class SGPath;
34 class PropertyWatcher;
35
36 /**
37  * Top level route manager class
38  * 
39  */
40
41 class FGRouteMgr : public SGSubsystem, 
42                    public flightgear::FlightPlan::Delegate
43 {
44 public:
45   FGRouteMgr();
46   ~FGRouteMgr();
47
48   void init ();
49   void postinit ();
50   void bind ();
51   void unbind ();
52   void update (double dt);
53   
54   bool isRouteActive() const;
55          
56   int currentIndex() const;
57   
58   void setFlightPlan(const flightgear::FlightPlanRef& plan);
59   flightgear::FlightPlanRef flightPlan() const;
60   
61   void clearRoute();
62   
63   flightgear::Waypt* currentWaypt() const;
64   
65   int numLegs() const;
66   
67 // deprecated
68   int numWaypts() const
69   { return numLegs(); }
70   
71 // deprecated
72   flightgear::Waypt* wayptAtIndex(int index) const;
73   
74   SGPropertyNode_ptr wayptNodeAtIndex(int index) const;
75   
76   void removeLegAtIndex(int aIndex);
77   
78   /**
79    * Activate a built route. This checks for various mandatory pieces of
80    * data, such as departure and destination airports, and creates waypoints
81    * for them on the route structure.
82    *
83    * returns true if the route was activated successfully, or false if the
84    * route could not be activated for some reason
85    */
86   bool activate();
87   
88   /**
89    * deactivate the route if active
90    */
91   void deactivate();
92
93   /**
94    * Set the current waypoint to the specified index.
95    */
96   void jumpToIndex(int index);
97   
98   bool saveRoute(const SGPath& p);
99   bool loadRoute(const SGPath& p);
100   
101   flightgear::WayptRef waypointFromString(const std::string& target);
102
103   static const char* subsystemName() { return "route-manager"; }
104 private:
105     bool commandDefineUserWaypoint(const SGPropertyNode* arg);
106     bool commandDeleteUserWaypoint(const SGPropertyNode* arg);
107     
108     flightgear::FlightPlanRef _plan;
109   
110     time_t _takeoffTime;
111     time_t _touchdownTime;
112
113     // automatic inputs
114     SGPropertyNode_ptr magvar;
115     
116     // automatic outputs    
117     SGPropertyNode_ptr departure; ///< departure airport information
118     SGPropertyNode_ptr destination; ///< destination airport information
119     SGPropertyNode_ptr alternate; ///< alternate airport information
120     SGPropertyNode_ptr cruise; ///< cruise information
121     
122     SGPropertyNode_ptr totalDistance;
123     SGPropertyNode_ptr distanceToGo;
124     SGPropertyNode_ptr ete;
125     SGPropertyNode_ptr elapsedFlightTime;
126     
127     SGPropertyNode_ptr active;
128     SGPropertyNode_ptr airborne;
129     
130     SGPropertyNode_ptr wp0;
131     SGPropertyNode_ptr wp1;
132     SGPropertyNode_ptr wpn;
133     
134     
135     SGPropertyNode_ptr _pathNode;
136     SGPropertyNode_ptr _currentWpt;
137     
138     
139     /** 
140      * Signal property to notify people that the route was edited
141      */
142     SGPropertyNode_ptr _edited;
143     
144     /**
145      * Signal property to notify when the last waypoint is reached
146      */
147     SGPropertyNode_ptr _finished;
148     
149     SGPropertyNode_ptr _flightplanChanged;
150   
151     void setETAPropertyFromDistance(SGPropertyNode_ptr aProp, double aDistance);
152     
153     /**
154      * retrieve the cached path distance along a leg
155      */
156     double cachedLegPathDistanceM(int index) const;
157     double cachedWaypointPathTotalDistance(int index) const;
158   
159     class InputListener : public SGPropertyChangeListener {
160     public:
161         InputListener(FGRouteMgr *m) : mgr(m) {}
162         virtual void valueChanged (SGPropertyNode * prop);
163     private:
164         FGRouteMgr *mgr;
165     };
166
167     SGPropertyNode_ptr input;
168     SGPropertyNode_ptr weightOnWheels;
169     SGPropertyNode_ptr groundSpeed;
170   
171     InputListener *listener;
172     SGPropertyNode_ptr mirror;    
173   
174     /**
175      * Helper to keep various pieces of state in sync when the route is
176      * modified (waypoints added, inserted, removed). Notably, this fires the
177      * 'edited' signal.
178      */
179     virtual void waypointsChanged();
180     
181     void update_mirror();
182     
183     virtual void currentWaypointChanged();
184     
185 // tied getters and setters
186     const char* getDepartureICAO() const;
187     const char* getDepartureName() const;
188     void setDepartureICAO(const char* aIdent);
189     
190     const char* getDepartureRunway() const;
191     void setDepartureRunway(const char* aIdent);
192   
193     const char* getSID() const;
194     void setSID(const char* aIdent);
195   
196     const char* getDestinationICAO() const;
197     const char* getDestinationName() const;
198     void setDestinationICAO(const char* aIdent);
199
200     const char* getDestinationRunway() const;
201     void setDestinationRunway(const char* aIdent);
202   
203     const char* getApproach() const;
204     void setApproach(const char* aIdent);
205   
206     const char* getSTAR() const;
207     void setSTAR(const char* aIdent);
208   
209     double getDepartureFieldElevation() const;  
210     double getDestinationFieldElevation() const;  
211 };
212
213
214 #endif // _ROUTE_MGR_HXX