roll-doublet.nas 2.85 KB
var target_bank_deg = 0;
var target_speed_kt = 50;
var target_alt_ft = 500;

var time = 0;
var last_time = 0.0;
var converge_time = 10000000.0; # a really big number of seconds we'd
				# never make it to in a real run of
				# the sim
var timer1 = 0.0;

var update_state = func( dt ) {
    if ( dt < 0.000001 ) {
        return;
    }

    var state = getprop("/flight-test/state");

    var bank_deg = getprop("/orientation/roll-deg");
    var speed_kt = getprop("/velocities/airspeed-kt");
    var alt_ft = getprop("/position/altitude-ft");

    if ( state == "init" ) {
	# turn on wing leveler
	setprop("/autopilot/locks/heading", "bank-hold");
	setprop("/autopilot/settings/target-bank-deg", target_bank_deg);
	# turn on altitude hold
	setprop("/autopilot/locks/altitude", "altitude-hold");
	# var target_alt_ft = int((alt_ft + 550) / 100) * 100;
	setprop("/autopilot/settings/target-altitude-ft", target_alt_ft );
	# turn on auto-throttle
	setprop("/autopilot/locks/speed", "speed-with-throttle");
	setprop("/autopilot/settings/target-speed-kt", target_speed_kt);
	setprop("/flight-test/state", "converging");
    } elsif ( state == "converging" ) {
	var bank_diff = abs( bank_deg - target_bank_deg );
	var speed_diff = abs( speed_kt - target_speed_kt );
	var alt_diff = abs( alt_ft - target_alt_ft );
	#printf("bank=%.1f spd=%.1f alt=%.1f t=%.1f ct=%.1f\n", bank_diff,
	#       speed_diff, alt_diff, time, converge_time);
	if ( (bank_diff < 0.1) and (speed_diff < 0.5) and (alt_diff < 5) and (time >= 20.0) )
	{
	    if ( converge_time > time ) {
		converge_time = time;
	    }
	} else {
	    converge_time = 10000000.0;
	}
	if ( time - converge_time > 10 ) {
	    setprop("/flight-test/state", "doublet1");
	    setprop("/autopilot/locks/heading", "");
	    setprop("/autopilot/locks/altitude", "");
	    setprop("/autopilot/locks/speed", "");
	    setprop("/controls/flight/aileron", "0.5");
	    timer1 = time;
	}
    } elsif ( state == "doublet1" ) {
	if ( time - timer1 > 1 ) {
	    setprop("/flight-test/state", "doublet2");
	    setprop("/controls/flight/aileron", "-0.5");
	    timer1 = time;
  	}
    } elsif ( state == "doublet2" ) {
	if ( time - timer1 > 2 ) {
	    setprop("/flight-test/state", "done");
	    setprop("/autopilot/locks/heading", "bank-hold");
	    #setprop("/autopilot/locks/altitude", "altitude-hold");
	    #setprop("/autopilot/locks/speed", "speed-with-throttle");
	}
    }
}

var main_loop = func {
    time = getprop("/sim/time/elapsed-sec");
    var dt = time - last_time;
    last_time = time;

    if ( getprop("/flight-test/master-switch") == 1 ) {
        update_state( dt );
    }

    settimer(main_loop, 0);
}

setlistener("/sim/signals/fdm-initialized",
            func {
                props.globals.initNode("/flight-test/master-switch", 1,
				       "BOOL", 1);
                setprop("/flight-test/state", "init");
                main_loop();
            });