1
0
Fork 0
fgdata/Nasal/autopilot.nas
andy 8bc72e8e7b Fix typing bug where the autopilot wouldn't turn off. GUI buttons
set their properties as strings, not bools.  So set the properties
once from initialization to ensure their types are correct.
2004-05-15 23:04:17 +00:00

83 lines
3.2 KiB
Text

##
## These are just GUI helper routines. The autopilot itself is not a
## Nasal module.
##
tagSettings =
{
"hdg-wing" : ["/autopilot/locks/heading", "wing-leveler"],
"hdg-bug" : ["/autopilot/locks/heading", "dg-heading-hold"],
"hdg-true" : ["/autopilot/locks/heading", "true-heading-hold"],
"hdg-nav" : ["/autopilot/locks/heading", "nav1-hold"],
"vel-throttle" : ["/autopilot/locks/speed", "speed-with-throttle"],
"vel-pitch" : ["/autopilot/locks/speed", "speed-with-pitch-trim"],
"alt-vert" : ["/autopilot/locks/altitude", "vertical-speed-hold"],
"alt-pitch" : ["/autopilot/locks/altitude", "pitch-hold"],
"alt-aoa" : ["/autopilot/locks/altitude", "aoa-hold"],
"alt-alt" : ["/autopilot/locks/altitude", "altitude-hold"],
"alt-agl" : ["/autopilot/locks/altitude", "agl-hold"],
"alt-gs" : ["/autopilot/locks/altitude", "gs1-hold"]
};
radioGroups = [["hdg-wing", "hdg-bug", "hdg-true", "hdg-nav"],
["vel-throttle", "vel-pitch"],
["alt-vert", "alt-pitch", "alt-aoa", "alt-alt",
"alt-agl", "alt-gs"]];
# Initialize to get the types of the gui properties correct
INIT = func {
guinode = props.globals.getNode("/autopilot/gui", 1);
foreach(tag; keys(tagSettings)) {
guinode.getNode(tag, 1).setBoolValue(0);
}
foreach(tag; ["hdg", "alt", "vel"]) {
guinode.getNode(tag ~ "-active", 1).setBoolValue(0);
}
}
settimer(INIT, 0);
update = func {
# Suck out the values from the dialog
fgcommand("dialog-apply", props.Node.new());
# Sanitize the radio buttons such that only one is selected. We are
# passed a tag indicating the one that was pressed.
if(size(arg) > 0) {
tag = arg[0];
foreach(group; radioGroups) {
for(i=0; i<size(group); i = i+1) {
if(tag == group[i]) {
if(getprop("/autopilot/gui", tag)) {
# The user just turned it on, turn the rest off...
for(j=0; j<size(group); j=j+1) {
if(j != i) {
setprop("/autopilot/gui", group[j], 0);
}
}
} else {
# The user tried to turn off an active radio
# button. Turn it back on.
setprop("/autopilot/gui", tag, 1);
}
}
}
}
}
# Set the actual output properties for the autopilot system
foreach(tag; keys(tagSettings)) {
setting = tagSettings[tag];
if(getprop("/autopilot/gui", tag)) {
setprop(setting[0], setting[1]);
}
}
if(!getprop("/autopilot/gui/hdg-active")) {
setprop("/autopilot/locks/heading", ""); }
if(!getprop("/autopilot/gui/alt-active")) {
setprop("/autopilot/locks/altitude", ""); }
if(!getprop("/autopilot/gui/vel-active")) {
setprop("/autopilot/locks/speed", ""); }
# Push any changes back to the dialog
fgcommand("dialog-update", props.Node.new());
}