//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
// $Id$
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
#include <simgear/structure/exception.hxx>
#include <simgear/misc/sg_path.hxx>
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 ) {
delta_u_n = Kp * ( (ep_n - ep_n_1)
+ ((Ts/Ti) * e_n)
+ ((Td/Ts) * (edf_n - 2*edf_n_1 + edf_n_2)) );
- } else if ( Ti <= 0.0 ) {
- delta_u_n = Kp * ( (ep_n - ep_n_1)
- + ((Td/Ts) * (edf_n - 2*edf_n_1 + edf_n_2)) );
}
if ( debug ) {
// Integrator anti-windup logic:
if ( delta_u_n > (u_max - u_n_1) ) {
- delta_u_n = 0;
+ delta_u_n = u_max - u_n_1;
if ( debug ) cout << " max saturation " << endl;
} else if ( delta_u_n < (u_min - u_n_1) ) {
- delta_u_n = 0;
+ delta_u_n = u_min - u_n_1;
if ( debug ) cout << " min saturation " << endl;
}
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;
if ( ! build() ) {
SG_LOG( SG_ALL, SG_ALERT,
- "Detected an internal inconsistancy in the autopilot");
+ "Detected an internal inconsistency in the autopilot");
SG_LOG( SG_ALL, SG_ALERT,
" configuration. See earlier errors for" );
SG_LOG( SG_ALL, SG_ALERT,