]> git.mxchange.org Git - flightgear.git/blob - src/Autopilot/route_mgr.hxx
More route-manager functionality moved to Nasal.
[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(flightgear::FlightPlan* plan);
59   flightgear::FlightPlan* 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    * Step to the next waypoint on the active route
90    */
91   void sequence();
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   /**
104    * Helper command to setup current airport/runway if necessary
105    */
106   void initAtPosition();
107
108 private:
109     flightgear::FlightPlan* _plan;
110   
111     time_t _takeoffTime;
112     time_t _touchdownTime;
113
114     // automatic inputs
115     SGPropertyNode_ptr magvar;
116     
117     // automatic outputs    
118     SGPropertyNode_ptr departure; ///< departure airport information
119     SGPropertyNode_ptr destination; ///< destination airport information
120     SGPropertyNode_ptr alternate; ///< alternate airport information
121     SGPropertyNode_ptr cruise; ///< cruise information
122     
123     SGPropertyNode_ptr totalDistance;
124     SGPropertyNode_ptr distanceToGo;
125     SGPropertyNode_ptr ete;
126     SGPropertyNode_ptr elapsedFlightTime;
127     
128     SGPropertyNode_ptr active;
129     SGPropertyNode_ptr airborne;
130     
131     SGPropertyNode_ptr wp0;
132     SGPropertyNode_ptr wp1;
133     SGPropertyNode_ptr wpn;
134     
135     
136     SGPropertyNode_ptr _pathNode;
137     SGPropertyNode_ptr _currentWpt;
138     
139     
140     /** 
141      * Signal property to notify people that the route was edited
142      */
143     SGPropertyNode_ptr _edited;
144     
145     /**
146      * Signal property to notify when the last waypoint is reached
147      */
148     SGPropertyNode_ptr _finished;
149     
150     SGPropertyNode_ptr _flightplanChanged;
151   
152     void setETAPropertyFromDistance(SGPropertyNode_ptr aProp, double aDistance);
153     
154     /**
155      * retrieve the cached path distance along a leg
156      */
157     double cachedLegPathDistanceM(int index) const;
158     double cachedWaypointPathTotalDistance(int index) const;
159   
160     class InputListener : public SGPropertyChangeListener {
161     public:
162         InputListener(FGRouteMgr *m) : mgr(m) {}
163         virtual void valueChanged (SGPropertyNode * prop);
164     private:
165         FGRouteMgr *mgr;
166     };
167
168     SGPropertyNode_ptr input;
169     SGPropertyNode_ptr weightOnWheels;
170     SGPropertyNode_ptr groundSpeed;
171   
172     InputListener *listener;
173     SGPropertyNode_ptr mirror;    
174   
175     /**
176      * Helper to keep various pieces of state in sync when the route is
177      * modified (waypoints added, inserted, removed). Notably, this fires the
178      * 'edited' signal.
179      */
180     virtual void waypointsChanged();
181     
182     void update_mirror();
183     
184     virtual void currentWaypointChanged();
185     
186     /**
187      * Check if we've reached the final waypoint. 
188      * Returns true if we have.
189      */
190     bool checkFinished();
191     
192     /**
193      * Predicate for helping the UI - test if at least one waypoint was
194      * entered by the user (as opposed to being generated by the route-manager)
195      */
196     bool haveUserWaypoints() const;
197     
198 // tied getters and setters
199     const char* getDepartureICAO() const;
200     const char* getDepartureName() const;
201     void setDepartureICAO(const char* aIdent);
202     
203     const char* getDepartureRunway() const;
204     void setDepartureRunway(const char* aIdent);
205   
206     const char* getSID() const;
207     void setSID(const char* aIdent);
208   
209     const char* getDestinationICAO() const;
210     const char* getDestinationName() const;
211     void setDestinationICAO(const char* aIdent);
212
213     const char* getDestinationRunway() const;
214     void setDestinationRunway(const char* aIdent);
215   
216     const char* getApproach() const;
217     void setApproach(const char* aIdent);
218   
219     const char* getSTAR() const;
220     void setSTAR(const char* aIdent);
221   
222     double getDepartureFieldElevation() const;  
223     double getDestinationFieldElevation() const;  
224 };
225
226
227 #endif // _ROUTE_MGR_HXX