2006-01-06 09:47:58 +00:00
|
|
|
# $Id$
|
|
|
|
#
|
|
|
|
# Nasal script to print errors to the screen when aircraft exceed design limits:
|
2006-02-15 22:53:23 +00:00
|
|
|
# - extending flaps above maximum flap extension speed(s)
|
2006-01-06 09:47:58 +00:00
|
|
|
# - extending gear above maximum gear extension speed
|
|
|
|
# - exceeding Vna
|
|
|
|
# - exceeding structural G limits
|
|
|
|
#
|
2006-02-15 22:53:23 +00:00
|
|
|
# To use, include this .nas file and define one or more of
|
|
|
|
# limits/max-flap-extension-speed/speed
|
|
|
|
# limits/max-flap-extension-speed/flaps
|
2006-01-06 09:47:58 +00:00
|
|
|
# limits/vne
|
|
|
|
# limits/max-gear-extension-speed
|
|
|
|
# limits/max-positive-g
|
|
|
|
# limits/max-negative-g (must be defined in max-positive-g defined)
|
|
|
|
#
|
2006-02-15 22:53:23 +00:00
|
|
|
# You can defined multiple max-flap-extension-speed entries, for max extension
|
|
|
|
# speeds for different flap settings.
|
2006-01-06 09:47:58 +00:00
|
|
|
|
2006-02-15 22:53:23 +00:00
|
|
|
checkFlaps = func {
|
|
|
|
airspeed = getprop("velocities/airspeed-kt");
|
|
|
|
flapsetting = cmdarg().getValue();
|
|
|
|
ltext = "";
|
2006-01-06 09:47:58 +00:00
|
|
|
|
2006-02-15 22:53:23 +00:00
|
|
|
limits = props.globals.getNode("limits");
|
2006-01-06 09:47:58 +00:00
|
|
|
|
2006-02-15 22:53:23 +00:00
|
|
|
if ((limits != nil) and (limits.getChildren("max-flap-extension-speed") != nil))
|
|
|
|
{
|
|
|
|
children = limits.getChildren("max-flap-extension-speed");
|
|
|
|
foreach(c; children)
|
|
|
|
{
|
|
|
|
if ((c.getChild("flaps") != nil) and
|
|
|
|
(c.getChild("speed") != nil) )
|
|
|
|
{
|
|
|
|
flaps = c.getChild("flaps").getValue();
|
|
|
|
speed = c.getChild("speed").getValue();
|
|
|
|
|
|
|
|
if ((flaps != nil) and
|
|
|
|
(speed != nil) and
|
|
|
|
(flapsetting > flaps) and
|
|
|
|
(airspeed > speed) )
|
|
|
|
{
|
|
|
|
ltext = "Flaps extended above maximum flap extension speed!";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2006-01-06 09:47:58 +00:00
|
|
|
|
2006-02-15 22:53:23 +00:00
|
|
|
if (ltext != "")
|
|
|
|
{
|
|
|
|
screen.log.write(ltext);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2006-01-06 09:47:58 +00:00
|
|
|
|
|
|
|
|
2006-02-15 22:53:23 +00:00
|
|
|
checkGear = func {
|
|
|
|
airspeed = getprop("velocities/airspeed-kt");
|
|
|
|
max_gear = cmdarg().getValue();
|
2006-01-06 09:47:58 +00:00
|
|
|
|
2006-02-15 22:53:23 +00:00
|
|
|
if ((max_gear != nil) and (airspeed > max_gear))
|
|
|
|
{
|
|
|
|
screen.log.write("Gear extended above maximum extension speed!");
|
|
|
|
}
|
|
|
|
}
|
2006-01-06 09:47:58 +00:00
|
|
|
|
|
|
|
|
2006-02-15 22:53:23 +00:00
|
|
|
# Set the listeners
|
|
|
|
setlistener("controls/flight/flaps", checkFlaps);
|
|
|
|
setlistener("controls/gear/gear-down", checkGear);
|
2006-01-06 09:47:58 +00:00
|
|
|
|
2006-02-15 22:53:23 +00:00
|
|
|
# =============================== Pilot G stuff (taken from hurricane.nas) =================================
|
2006-01-06 09:47:58 +00:00
|
|
|
pilot_g = props.globals.getNode("fdm/jsbsim/accelerations/a-pilot-z-ft_sec2", 1);
|
|
|
|
pilot_g.setDoubleValue(0);
|
|
|
|
|
2006-02-15 22:53:23 +00:00
|
|
|
var g_damp = 0;
|
2006-01-06 09:47:58 +00:00
|
|
|
|
|
|
|
updatePilotG = func {
|
2006-02-15 22:53:23 +00:00
|
|
|
var g = pilot_g.getValue() ;
|
|
|
|
#if (g == nil) { g = 0; }
|
|
|
|
g_damp = ( g * 0.2) + (g_damp * 0.8);
|
2006-01-06 09:47:58 +00:00
|
|
|
|
2006-02-15 22:53:23 +00:00
|
|
|
settimer(updatePilotG, 0.2);
|
|
|
|
}
|
2006-01-06 09:47:58 +00:00
|
|
|
|
|
|
|
updatePilotG();
|
|
|
|
|
2006-02-15 22:53:23 +00:00
|
|
|
checkGandVNE = func {
|
|
|
|
max_positive = getprop("limits/max-positive-g");
|
|
|
|
max_negative = getprop("limits/max-negative-g");
|
|
|
|
msg = "";
|
|
|
|
|
|
|
|
# Convert the ft/sec^2 into Gs - allowing for gravity.
|
|
|
|
g = (- g_damp) / 32;
|
|
|
|
|
|
|
|
if ((max_positive != nil) and (g > max_positive))
|
|
|
|
{
|
|
|
|
msg = "Airframe structural positive-g load limit exceeded!";
|
|
|
|
}
|
|
|
|
|
|
|
|
if ((max_negative != nil) and (g < max_negative))
|
|
|
|
{
|
|
|
|
msg = "Airframe structural negative-g load limit exceeded!";
|
|
|
|
}
|
|
|
|
|
|
|
|
# Now check VNE
|
|
|
|
airspeed = getprop("velocities/airspeed-kt");
|
|
|
|
vne = getprop("limits/vne");
|
|
|
|
|
|
|
|
if ((airspeed != nil) and (vne != nil) and (airspeed > vne))
|
|
|
|
{
|
|
|
|
msg = "Airspeed exceeds Vne!";
|
|
|
|
}
|
|
|
|
|
|
|
|
if (msg != "")
|
|
|
|
{
|
|
|
|
# If we have a message, display it, but don't bother checking for
|
|
|
|
# any other errors for 10 seconds. Otherwise we're likely to get
|
|
|
|
# repeated messages.
|
|
|
|
screen.log.write(msg);
|
|
|
|
settimer(checkGandVNE, 10);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
settimer(checkGandVNE, 1);
|
|
|
|
}
|
2006-01-06 09:47:58 +00:00
|
|
|
}
|
|
|
|
|
2006-02-15 22:53:23 +00:00
|
|
|
checkGandVNE();
|