]> git.mxchange.org Git - flightgear.git/blobdiff - src/Autopilot/route_mgr.hxx
Tie samplegroup 'avionics' to the listener, just in case no other device is created...
[flightgear.git] / src / Autopilot / route_mgr.hxx
index da2d80249f2fe76fd35193f1ea4d41c2ee144d35..8806cae2746a918d18d53bfacf3c95a2479c7e4e 100644 (file)
 #ifndef _ROUTE_MGR_HXX
 #define _ROUTE_MGR_HXX 1
 
-#ifndef __cplusplus
-# error This library requires C++
-#endif
-
-#ifdef HAVE_CONFIG_H
-#  include <config.h>
-#endif
-
-#include <simgear/compiler.h>
-
-#include STL_STRING
-#include <vector>
-
-SG_USING_STD(string);
-SG_USING_STD(vector);
-
 #include <simgear/props/props.hxx>
 #include <simgear/route/route.hxx>
 #include <simgear/structure/subsystem_mgr.hxx>
@@ -58,51 +42,82 @@ private:
     SGRoute *route;
 
     // automatic inputs
-    SGPropertyNode *lon;
-    SGPropertyNode *lat;
-    SGPropertyNode *alt;
+    SGPropertyNode_ptr lon;
+    SGPropertyNode_ptr lat;
+    SGPropertyNode_ptr alt;
 
     // automatic outputs
-    SGPropertyNode *true_hdg_deg;
-
-    SGPropertyNode *wp0_id;
-    SGPropertyNode *wp0_dist;
-    SGPropertyNode *wp0_eta;
-
-    SGPropertyNode *wp1_id;
-    SGPropertyNode *wp1_dist;
-    SGPropertyNode *wp1_eta;
-
-    SGPropertyNode *wpn_id;
-    SGPropertyNode *wpn_dist;
-    SGPropertyNode *wpn_eta;
-
-
+    SGPropertyNode_ptr true_hdg_deg;
+    SGPropertyNode_ptr target_altitude_ft;
+    SGPropertyNode_ptr altitude_lock;
+
+    SGPropertyNode_ptr wp0_id;
+    SGPropertyNode_ptr wp0_dist;
+    SGPropertyNode_ptr wp0_eta;
+
+    SGPropertyNode_ptr wp1_id;
+    SGPropertyNode_ptr wp1_dist;
+    SGPropertyNode_ptr wp1_eta;
+
+    SGPropertyNode_ptr wpn_id;
+    SGPropertyNode_ptr wpn_dist;
+    SGPropertyNode_ptr wpn_eta;
+
+
+    class Listener : public SGPropertyChangeListener {
+    public:
+        Listener(FGRouteMgr *m) : mgr(m) {}
+        virtual void valueChanged (SGPropertyNode * prop);
+    private:
+        FGRouteMgr *mgr;
+    };
+
+    SGPropertyNode_ptr input;
+    Listener *listener;
+    SGPropertyNode_ptr mirror;
+    bool altitude_set;
+
+    SGWayPoint* make_waypoint(const string& target);
+    void update_mirror();
+    bool near_ground();
+
+    /**
+     * Helper to set a string property to the estimated arrival time (ETA),
+     * formatted as either hours:minutes or minutes:seconds, based on a distance
+     * and the current groundspeed.
+     */
+    void setETAPropertyFromDistance(SGPropertyNode_ptr aProp, double aDistance);
+    
+    /**
+     * Helper to update the target_altitude_ft and altitude_set flag when wp0
+     * changes
+     */
+    void updateTargetAltitude();
 public:
 
     FGRouteMgr();
     ~FGRouteMgr();
 
     void init ();
+    void postinit ();
     void bind ();
     void unbind ();
     void update (double dt);
 
     bool build ();
 
-    void add_waypoint( const SGWayPoint& wp ) {
-        route->add_waypoint( wp );
-    }
+    void new_waypoint( const string& tgt_alt, int n = -1 );
+    void add_waypoint( const SGWayPoint& wp, int n = -1 );
+    SGWayPoint pop_waypoint( int i = 0 );
 
     SGWayPoint get_waypoint( int i ) const {
         return route->get_waypoint(i);
     }
 
-    SGWayPoint pop_waypoint();
-
     int size() const {
         return route->size();
     }
+
 };