1
0
Fork 0

Fix unrealistic-but-convenient direct-drive from the route-manager to the autopilot code. A new boolean config prop, 'drive-autopilot' exists, to disable this behaviour.

This commit is contained in:
jmt 2009-10-11 21:29:24 +00:00 committed by Tim Moore
parent bde366e0e3
commit 110dd605a0
2 changed files with 24 additions and 16 deletions

View file

@ -65,11 +65,7 @@ static double get_ground_speed() {
FGRouteMgr::FGRouteMgr() : FGRouteMgr::FGRouteMgr() :
_route( new SGRoute ), _route( new SGRoute ),
_autoSequence(true), _autoSequence(true),
lon( NULL ), _driveAutopilot(true),
lat( NULL ),
alt( NULL ),
target_altitude_ft( NULL ),
altitude_lock( NULL ),
input(fgGetNode( RM "input", true )), input(fgGetNode( RM "input", true )),
mirror(fgGetNode( RM "route", true )), mirror(fgGetNode( RM "route", true )),
altitude_set( false ) altitude_set( false )
@ -96,9 +92,12 @@ void FGRouteMgr::init() {
alt = fgGetNode( "/position/altitude-ft", true ); alt = fgGetNode( "/position/altitude-ft", true );
magvar = fgGetNode("/environment/magnetic-variation-deg", true); magvar = fgGetNode("/environment/magnetic-variation-deg", true);
target_altitude_ft = fgGetNode( "/autopilot/settings/target-altitude-ft", true ); // autopilot drive properties
altitude_lock = fgGetNode( "/autopilot/locks/altitude", true ); _apTargetAltitudeFt = fgGetNode( "/autopilot/settings/target-altitude-ft", true );
_apAltitudeLock = fgGetNode( "/autopilot/locks/altitude", true );
_apTrueHeading = fgGetNode( "/autopilot/settings/true-heading-deg", true );
rm->tie("drive-autopilot", SGRawValuePointer<bool>(&_driveAutopilot));
departure = fgGetNode(RM "departure", true); departure = fgGetNode(RM "departure", true);
// init departure information from current location // init departure information from current location
SGGeod pos = SGGeod::fromDegFt(lon->getDoubleValue(), lat->getDoubleValue(), alt->getDoubleValue()); SGGeod pos = SGGeod::fromDegFt(lon->getDoubleValue(), lat->getDoubleValue(), alt->getDoubleValue());
@ -203,13 +202,15 @@ void FGRouteMgr::updateTargetAltitude() {
} }
altitude_set = true; altitude_set = true;
target_altitude_ft->setDoubleValue(wp.get_target().getElevationFt());
if (!_driveAutopilot) {
return;
}
_apTargetAltitudeFt->setDoubleValue(wp.get_target().getElevationFt());
if ( !near_ground() ) { if ( !near_ground() ) {
// James Turner [zakalawe]: there's no explanation for this logic, _apAltitudeLock->setStringValue( "altitude-hold" );
// it feels like the autopilot should pull the target altitude out of
// wp0 instead of us pushing it through here. Hmmm.
altitude_lock->setStringValue( "altitude-hold" );
} }
} }
@ -261,6 +262,10 @@ void FGRouteMgr::update( double dt ) {
} }
} }
if (_driveAutopilot) {
_apTrueHeading->setDoubleValue(wp_course);
}
// update wp0 / wp1 / wp-last for legacy users // update wp0 / wp1 / wp-last for legacy users
wp0->setDoubleValue("dist", wp_distance * SG_METER_TO_NM); wp0->setDoubleValue("dist", wp_distance * SG_METER_TO_NM);
wp_course -= magvar->getDoubleValue(); // expose magnetic bearing wp_course -= magvar->getDoubleValue(); // expose magnetic bearing
@ -639,6 +644,7 @@ void FGRouteMgr::currentWaypointChanged()
} }
currentWp->setIntValue(_route->current_index()); currentWp->setIntValue(_route->current_index());
updateTargetAltitude();
SG_LOG(SG_AUTOPILOT, SG_INFO, "route manager, current-wp is now " << _route->current_index()); SG_LOG(SG_AUTOPILOT, SG_INFO, "route manager, current-wp is now " << _route->current_index());
} }

View file

@ -54,9 +54,11 @@ private:
SGPropertyNode_ptr magvar; SGPropertyNode_ptr magvar;
// automatic outputs // automatic outputs
SGPropertyNode_ptr target_altitude_ft; bool _driveAutopilot;
SGPropertyNode_ptr altitude_lock; SGPropertyNode_ptr _apTargetAltitudeFt;
SGPropertyNode_ptr _apAltitudeLock;
SGPropertyNode_ptr _apTrueHeading;
SGPropertyNode_ptr departure; ///< departure airport information SGPropertyNode_ptr departure; ///< departure airport information
SGPropertyNode_ptr destination; ///< destination airport information SGPropertyNode_ptr destination; ///< destination airport information
SGPropertyNode_ptr alternate; ///< alternate airport information SGPropertyNode_ptr alternate; ///< alternate airport information