#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;
-class FGRunway;
-
-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(const flightgear::FlightPlanRef& plan);
+ flightgear::FlightPlanRef 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;
-
+
SGPropertyNode_ptr wayptNodeAtIndex(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;
-
+
+ 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();
-
+
/**
- * Step to the next waypoint on the active route
+ * deactivate the route if active
*/
- void sequence();
-
+ void deactivate();
+
/**
* Set the current waypoint to the specified index.
*/
bool saveRoute(const SGPath& p);
bool loadRoute(const SGPath& p);
- /**
- * Helper command to setup current airport/runway if necessary
- */
- void initAtPosition();
-
- /**
- * Create a WayPoint 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);
-
- FGAirportRef departureAirport() const;
- FGAirportRef destinationAirport() const;
-
- FGRunway* departureRunway() const;
- FGRunway* destinationRunway() const;
+ flightgear::WayptRef waypointFromString(const std::string& target);
+
private:
- flightgear::WayptVec _route;
- int _currentIndex;
+ bool commandDefineUserWaypoint(const SGPropertyNode* arg);
+ bool commandDeleteUserWaypoint(const SGPropertyNode* arg);
+
+ flightgear::FlightPlanRef _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 _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);
/**
SGPropertyNode_ptr input;
SGPropertyNode_ptr weightOnWheels;
-
+ SGPropertyNode_ptr groundSpeed;
+
InputListener *listener;
SGPropertyNode_ptr mirror;
-
- void departureChanged();
- void buildDeparture(flightgear::WayptRef enroute, flightgear::WayptVec& wps);
-
- void arrivalChanged();
- void buildArrival(flightgear::WayptRef enroute, flightgear::WayptVec& wps);
-
+
/**
* 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);
-
- /**
- * Check if we've reached the final waypoint.
- * Returns true if we have.
- */
- bool checkFinished();
-
-
- bool 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)
- */
- bool haveUserWaypoints() const;
+ virtual void currentWaypointChanged();
// tied getters and setters
const char* getDepartureICAO() const;
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;
};