#define _ROUTE_MGR_HXX 1
#include <simgear/props/props.hxx>
-#include <simgear/route/waypoint.hxx>
#include <simgear/structure/subsystem_mgr.hxx>
-#include <Navaids/route.hxx>
+#include <Navaids/FlightPlan.hxx>
// forward decls
class SGPath;
class PropertyWatcher;
-class FGAirport;
-typedef SGSharedPtr<FGAirport> FGAirportRef;
-
/**
* Top level route manager class
*
*/
-class FGRouteMgr : public SGSubsystem
+class FGRouteMgr : public SGSubsystem,
+ public flightgear::FlightPlan::Delegate
{
public:
FGRouteMgr();
void bind ();
void unbind ();
void update (double dt);
-
- void insertWayptAtIndex(flightgear::Waypt* aWpt, int aIndex);
- flightgear::WayptRef removeWayptAtIndex(int index);
-
- void clearRoute();
- typedef enum {
- ROUTE_HIGH_AIRWAYS, ///< high-level airways routing
- ROUTE_LOW_AIRWAYS, ///< low-level airways routing
- ROUTE_VOR ///< VOR-VOR routing
- } RouteType;
-
- /**
- * Insert waypoints from index-1 to index. In practice this means you can
- * 'fill in the gaps' between defined waypoints. If index=0, the departure
- * airport is used as index-1; if index is -1, the destination airport is
- * used as the final waypoint.
- */
- bool routeToIndex(int index, RouteType aRouteType);
-
- void autoRoute();
-
bool isRouteActive() const;
- int currentIndex() const
- { return _currentIndex; }
-
+ int currentIndex() const;
+
+ void setFlightPlan(flightgear::FlightPlan* plan);
+ flightgear::FlightPlan* flightPlan() const;
+
+ void clearRoute();
+
flightgear::Waypt* currentWaypt() const;
- flightgear::Waypt* nextWaypt() const;
- flightgear::Waypt* previousWaypt() const;
- const flightgear::WayptVec& waypts() const
- { return _route; }
+ int numLegs() const;
+// deprecated
int numWaypts() const
- { return _route.size(); }
-
+ { return numLegs(); }
+
+// deprecated
flightgear::Waypt* wayptAtIndex(int index) const;
-
- /**
- * Find a waypoint in the route, by position, and return its index, or
- * -1 if no matching waypoint was found in the route.
- */
- int findWayptIndex(const SGGeod& aPos) const;
-
+
+ SGPropertyNode_ptr wayptNodeAtIndex(int index) const;
+
+ void removeLegAtIndex(int aIndex);
+
/**
* Activate a built route. This checks for various mandatory pieces of
* data, such as departure and destination airports, and creates waypoints
* route could not be activated for some reason
*/
bool activate();
+
+ /**
+ * deactivate the route if active
+ */
+ void deactivate();
/**
* Step to the next waypoint on the active route
*/
void jumpToIndex(int index);
- void saveRoute();
- void loadRoute();
+ bool saveRoute(const SGPath& p);
+ bool loadRoute(const SGPath& p);
+
+ flightgear::WayptRef waypointFromString(const std::string& target);
/**
* Helper command to setup current airport/runway if necessary
*/
void initAtPosition();
+
private:
- flightgear::WayptVec _route;
- int _currentIndex;
+ flightgear::FlightPlan* _plan;
time_t _takeoffTime;
time_t _touchdownTime;
- FGAirportRef _departure;
- FGAirportRef _destination;
-
+
// automatic inputs
- SGPropertyNode_ptr lon;
- SGPropertyNode_ptr lat;
- SGPropertyNode_ptr alt;
SGPropertyNode_ptr magvar;
// automatic outputs
SGPropertyNode_ptr cruise; ///< cruise information
SGPropertyNode_ptr totalDistance;
+ SGPropertyNode_ptr distanceToGo;
SGPropertyNode_ptr ete;
SGPropertyNode_ptr elapsedFlightTime;
SGPropertyNode_ptr _pathNode;
SGPropertyNode_ptr _currentWpt;
- /// integer property corresponding to the RouteType enum
- SGPropertyNode_ptr _routingType;
/**
* Signal property to notify people that the route was edited
*/
SGPropertyNode_ptr _finished;
+ SGPropertyNode_ptr _flightplanChanged;
+
void setETAPropertyFromDistance(SGPropertyNode_ptr aProp, double aDistance);
+ /**
+ * retrieve the cached path distance along a leg
+ */
+ double cachedLegPathDistanceM(int index) const;
+ double cachedWaypointPathTotalDistance(int index) const;
+
class InputListener : public SGPropertyChangeListener {
public:
InputListener(FGRouteMgr *m) : mgr(m) {}
SGPropertyNode_ptr input;
SGPropertyNode_ptr weightOnWheels;
-
+ SGPropertyNode_ptr groundSpeed;
+
InputListener *listener;
- SGPropertyNode_ptr mirror;
-
- /**
- * Create a SGWayPoint from a string in the following format:
- * - simple identifier
- * - decimal-lon,decimal-lat
- * - airport-id/runway-id
- * - navaid/radial-deg/offset-nm
- */
- flightgear::WayptRef waypointFromString(const std::string& target);
-
-
- void departureChanged();
- void buildDeparture(flightgear::WayptRef enroute, flightgear::WayptVec& wps);
-
- void arrivalChanged();
- void buildArrival(flightgear::WayptRef enroute, flightgear::WayptVec& wps);
-
+ SGPropertyNode_ptr mirror;
+
/**
* Helper to keep various pieces of state in sync when the route is
* modified (waypoints added, inserted, removed). Notably, this fires the
* 'edited' signal.
*/
- void waypointsChanged();
+ virtual void waypointsChanged();
void update_mirror();
- void currentWaypointChanged();
-
- /**
- * Parse a route/wp node (from a saved, property-lsit formatted route)
- */
- void parseRouteWaypoint(SGPropertyNode* aWP);
+ virtual void currentWaypointChanged();
/**
* Check if we've reached the final waypoint.
*/
bool checkFinished();
-
- void loadPlainTextRoute(const SGPath& path);
-
- void loadVersion1XMLRoute(SGPropertyNode_ptr routeData);
- void loadVersion2XMLRoute(SGPropertyNode_ptr routeData);
- void loadXMLRouteHeader(SGPropertyNode_ptr routeData);
- flightgear::WayptRef parseVersion1XMLWaypt(SGPropertyNode* aWP);
-
/**
* Predicate for helping the UI - test if at least one waypoint was
* entered by the user (as opposed to being generated by the route-manager)
const char* getDepartureName() const;
void setDepartureICAO(const char* aIdent);
+ const char* getDepartureRunway() const;
+ void setDepartureRunway(const char* aIdent);
+
+ const char* getSID() const;
+ void setSID(const char* aIdent);
+
const char* getDestinationICAO() const;
const char* getDestinationName() const;
void setDestinationICAO(const char* aIdent);
- PropertyWatcher* _departureWatcher;
- PropertyWatcher* _arrivalWatcher;
+ const char* getDestinationRunway() const;
+ void setDestinationRunway(const char* aIdent);
+
+ const char* getApproach() const;
+ void setApproach(const char* aIdent);
+
+ const char* getSTAR() const;
+ void setSTAR(const char* aIdent);
+
+ double getDepartureFieldElevation() const;
+ double getDestinationFieldElevation() const;
};