]> git.mxchange.org Git - flightgear.git/blobdiff - src/Autopilot/route_mgr.cxx
only activate heading & altitude lock when in air (and even then it should
[flightgear.git] / src / Autopilot / route_mgr.cxx
index 0da9c28dc38623a744a1c037c6ca0f926aaf71de..0fe2d7f433957373d55930395c92f32458dc3108 100644 (file)
@@ -140,12 +140,12 @@ void FGRouteMgr::update( double dt ) {
         true_hdg_deg->setDoubleValue( wp_course );
         double target_alt = wp.get_target_alt();
 
-        // activate altitude lock only once per route (this can't be done in
-        // new_waypoint() because the first wp might not have an altitude defined at all)
-        if (!altitude_set && target_alt > -9990) {
+        if ( !altitude_set && target_alt > -9990 ) {
             target_altitude_ft->setDoubleValue( target_alt * SG_METER_TO_FEET );
-            altitude_lock->setStringValue( "altitude-hold" );
             altitude_set = true;
+
+            if ( !on_ground() )
+                altitude_lock->setStringValue( "altitude-hold" );
         }
 
         if ( wp_distance < 200.0 ) {
@@ -231,6 +231,9 @@ void FGRouteMgr::update( double dt ) {
 
 
 void FGRouteMgr::add_waypoint( const SGWayPoint& wp, int n ) {
+    if ( n == 0 || !route->size() )
+        altitude_set = false;
+
     route->add_waypoint( wp, n );
     update_mirror();
 }
@@ -264,6 +267,9 @@ SGWayPoint FGRouteMgr::pop_waypoint( int n ) {
         wp0_eta->setStringValue( "" );
     }
 
+    if ( n == 0 && route->size() )
+        altitude_set = false;
+
     update_mirror();
     return wp;
 }
@@ -274,7 +280,6 @@ bool FGRouteMgr::build() {
 }
 
 
-
 int FGRouteMgr::new_waypoint( const string& Tgt_Alt, int n ) {
     string target = Tgt_Alt;
 
@@ -287,15 +292,16 @@ int FGRouteMgr::new_waypoint( const string& Tgt_Alt, int n ) {
     int type = make_waypoint( &wp, target );
 
     if (wp) {
-        fgSetString( "/autopilot/locks/heading", "true-heading-hold" );
         add_waypoint( *wp, n );
         delete wp;
+
+        if ( !on_ground() )
+            fgSetString( "/autopilot/locks/heading", "true-heading-hold" );
     }
     return type;
 }
 
 
-
 int FGRouteMgr::make_waypoint(SGWayPoint **wp, string& target) {
     double alt = -9999.0;
 
@@ -309,7 +315,7 @@ int FGRouteMgr::make_waypoint(SGWayPoint **wp, string& target) {
     }
 
     // check for lon,lat
-    pos = target.find(',');
+    pos = target.find( ',' );
     if ( pos != string::npos ) {
         double lon = atof( target.substr(0, pos).c_str());
         double lat = atof( target.c_str() + pos + 1);
@@ -361,7 +367,7 @@ int FGRouteMgr::make_waypoint(SGWayPoint **wp, string& target) {
         return 4;
     }
 
-    // target not identified
+    // unknown target
     return 0;
 }
 
@@ -385,6 +391,15 @@ void FGRouteMgr::update_mirror() {
 }
 
 
+bool FGRouteMgr::on_ground() {
+    SGPropertyNode *gear = fgGetNode( "/gear/gear/wow", false );
+    if ( !gear || gear->getType() == SGPropertyNode::NONE )
+        return fgGetBool( "/sim/presets/onground", true );
+
+    return gear->getBoolValue();
+}
+
+
 // command interface /autopilot/route-manager/input:
 //
 //   @clear             ... clear route