From bcd9b071c549f5d71159d54817e17ad3fbbb972c Mon Sep 17 00:00:00 2001 From: curt Date: Sat, 24 Jun 2006 00:52:20 +0000 Subject: [PATCH] Create a "passive" mode for the autopilot. This is analogous to running the autopilot with the servos off. In otherwords, the computer goes through the motions of computing the desired behavior (pitch or roll) but doesn't actually drive the outputs. This is potentially useful when implimenting a flight director. --- src/Autopilot/xmlauto.cxx | 19 ++++++++++++++++--- src/Autopilot/xmlauto.hxx | 6 ++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/Autopilot/xmlauto.cxx b/src/Autopilot/xmlauto.cxx index 2de17263e..9594d5f07 100644 --- a/src/Autopilot/xmlauto.cxx +++ b/src/Autopilot/xmlauto.cxx @@ -79,6 +79,10 @@ FGPIDController::FGPIDController( SGPropertyNode *node ): if ( val != NULL ) { enable_value = val->getStringValue(); } + SGPropertyNode *pass = child->getChild( "honor-passive" ); + if ( pass != NULL ) { + honor_passive = pass->getBoolValue(); + } } else if ( cname == "input" ) { SGPropertyNode *prop = child->getChild( "prop" ); if ( prop != NULL ) { @@ -338,9 +342,18 @@ void FGPIDController::update( double dt ) { edf_n_2 = edf_n_1; edf_n_1 = edf_n; - unsigned int i; - for ( i = 0; i < output_list.size(); ++i ) { - output_list[i]->setDoubleValue( u_n ); + // passive_ignore == true means that we go through all the + // motions, but drive the outputs. This is analogous to + // running the autopilot with the "servos" off. This is + // helpful for things like flight directors which position + // their vbars from the autopilot computations. + if ( passive_mode->getBoolValue() && honor_passive ) { + // skip output step + } else { + unsigned int i; + for ( i = 0; i < output_list.size(); ++i ) { + output_list[i]->setDoubleValue( u_n ); + } } } else if ( !enabled ) { ep_n = 0.0; diff --git a/src/Autopilot/xmlauto.hxx b/src/Autopilot/xmlauto.hxx index b4cfdbce4..38cfef890 100644 --- a/src/Autopilot/xmlauto.hxx +++ b/src/Autopilot/xmlauto.hxx @@ -45,6 +45,8 @@ SG_USING_STD(deque); #include #include +#include
+ /** * Base class for other autopilot components @@ -57,7 +59,9 @@ protected: string name; SGPropertyNode_ptr enable_prop; + SGPropertyNode_ptr passive_mode; string enable_value; + bool honor_passive; bool enabled; SGPropertyNode_ptr input_prop; @@ -69,7 +73,9 @@ public: FGXMLAutoComponent() : enable_prop( NULL ), + passive_mode( fgGetNode("/autopilot/settings/passive-mode", true) ), enable_value( "" ), + honor_passive( false ), enabled( false ), input_prop( NULL ), r_n_prop( NULL ), -- 2.39.5