1
0
Fork 0
fgdata/Aircraft/Instruments-3d/kfc200/kfc-200.nas

219 lines
6.2 KiB
Text

#### Bendix-King KFC-200 Flight Director ####
#Buttons
# HDG ...heading hold
# FD ..... flightdirector on/off
# ALT ....altitude arm
# NAV ...VOR / LOC arm
# BC ....LOC back course
# APPR ... LOC / GS arm
#### lnav ####
# 0 = wingleveler
# 1 = heading hold
# 2 = NAV arm
# 3 = NAV cap
# 4 = APPR arm
# 5 = APPR cap
#### vnav ####
# 0 = pitch hold
# 1 = ALT arm
# 2 = ALT cap
# 3 = GS arm
# 4 = GS cap
var L_list=["wing-leveler","dg-heading-hold","dg-heading-hold","nav1-hold","dg-heading-hold","nav1-hold","dg-heading-hold","nav1-hold"];
var V_list=["pitch-hold","pitch-hold","altitude-hold","pitch-hold","gs1-hold"];
var fdprop = props.globals.getNode("/instrumentation/kfc200",1);
var lnav = 0;
var vnav = 0;
var current_alt=0.0;
var alt_select = 0.0;
var DH = 0;
var HASGS = "/instrumentation/nav/has-gs";
var NAVLOC = "/instrumentation/nav/nav-loc";
var NAVDST = "/instrumentation/nav/nav-dist";
var NAVRNG = "/instrumentation/nav/in-range";
var HDEFL = "/instrumentation/nav/heading-needle-deflection";
var GSDEFL = "/instrumentation/nav/gs-needle-deflection-norm";
var BC = "/instrumentation/nav/back-course-btn";
var HDG = props.globals.getNode("/autopilot/locks/heading",1);
var ALT = props.globals.getNode("/autopilot/locks/altitude",1);
var SPD = props.globals.getNode("/autopilot/locks/speed",1);
var SRVC = 0;
setlistener("/sim/signals/fdm-initialized", func {
fdprop.getNode("serviceable",1).setBoolValue(1);
fdprop.getNode("armed",1).setBoolValue(0);
fdprop.getNode("cpld",1).setBoolValue(0);
fdprop.getNode("pitch-trim",1).setIntValue(0);
fdprop.getNode("alt-trim",1).setIntValue(0);
fdprop.getNode("fd-on",1).setBoolValue(0);
fdprop.getNode("gs-arm",1).setBoolValue(0);
fdprop.getNode("lnav",1).setValue(0);
fdprop.getNode("vnav",1).setValue(0);
fdprop.getNode("alt-preset",1).setDoubleValue(0.0);
fdprop.getNode("alt-alert",1).setBoolValue(0);
fdprop.getNode("dh-alert",1).setBoolValue(0);
DH = getprop("/autopilot/route-manager/min-lock-altitude-agl-ft");
alt_select = 0;
ALT.setValue(V_list[vnav]);
HDG.setValue(L_list[lnav]);
settimer(update,5);
print("KFC-200 ... Check");
});
setlistener("/instrumentation/kfc200/fd-on", func(fd){
var fdON = fd.getBoolValue();
clear_ap();
},0,0);
setlistener("/autopilot/locks/passive-mode", func(ap){
if(!ap.getBoolValue()){
setprop("autopilot/settings/target-pitch-deg",getprop("/orientation/pitch-deg"));
}
},0,0);
setlistener("/instrumentation/kfc200/serviceable", func(srv){
if(srv.getBoolValue()){SRVC=1;
}else{
SRVC=0;
}
},0,0);
setlistener("/autopilot/settings/target-altitude-ft",func(at){
alt_select = at.getValue();
},0,0);
setlistener("/autopilot/route-manager/min-lock-altitude-agl-ft",func(dh){
DH = dh.getValue();
},0,0);
setlistener("/instrumentation/kfc200/lnav",func(ln){
if(SRVC == 0)return;
lnav = ln.getValue();
if(lnav == 4){
if(!getprop(NAVLOC)){
lnav=2;
setprop("/instrumentation/kfc200/lnav",lnav);
}else{
if(getprop(HASGS)){
if(!getprop(BC)){
setprop("/instrumentation/kfc200/gs-arm",1);
}
}
}
}
HDG.setValue(L_list[lnav]);
},0,0);
setlistener("/instrumentation/kfc200/vnav", func(vn){
if(SRVC == 0)return;
vnav = vn.getValue();
ALT.setValue(V_list[vnav]);
},0,0);
var clear_ap = func {
setprop("/autopilot/settings/target-pitch-deg",getprop("/orientation/pitch-deg"));
vnav = 0;
lnav=0;
setprop("/instrumentation/kfc200/lnav",lnav);
setprop("/instrumentation/kfc200/vnav",vnav);
HDG.setValue(L_list[lnav]);
ALT.setValue(V_list[vnav]);
}
#### PITCH TRIM = 1 degree per second ####
var pitch_trim = func {
var temp_pitch = getprop("autopilot/settings/target-pitch-deg");
var FR =getprop("sim/frame-rate");
if(FR > 0){
var trim = (1/FR) * arg[0];
setprop("autopilot/settings/target-pitch-deg",temp_pitch + trim);
}
}
#### ALTITUDE TRIM = 600 fpm ####
var alt_trim = func {
var temp_alt = getprop("autopilot/settings/target-altitude-ft");
var FR =getprop("sim/frame-rate");
if(FR > 0){
var trim = (10/FR) * arg[0];
setprop("autopilot/settings/target-altitude-ft",temp_alt + trim);
}
}
var update_nav = func {
if(SRVC == 1){
var inrange= getprop(NAVRNG);
if(inrange){
if(lnav == 2 or lnav == 4){
setprop("instrumentation/kfc200/armed",1);
setprop("instrumentation/kfc200/cpld",0);
var DF = getprop(HDEFL);
if(DF > -9 and DF < 9){
setprop("/instrumentation/kfc200/lnav",lnav + 1);
setprop("instrumentation/kfc200/armed",0);
setprop("instrumentation/kfc200/cpld",1);
}
}
if(lnav ==5){
if(getprop("instrumentation/kfc200/gs-arm")){
if(getprop("instrumentation/nav/gs-distance") < 25000){
var GS1 = getprop(GSDEFL);
if( GS1< 0.5 and GS1 > -0.5){vnav = 4;
setprop("/instrumentation/kfc200/vnav",vnav);
}
}
}
}
}
if(vnav == 1){
var offset = get_altoffset();
if(offset > -990 and offset < 990){
setprop("/instrumentation/kfc200/vnav",vnav + 1);
}
}
}
}
var get_altoffset = func(){
current_alt = getprop("/instrumentation/altimeter/pressure-alt-ft");
var offset = (current_alt - alt_select);
var alert =0;
if(offset > -1000 and offset < -1000){
if(offset < -300 and offset > 300)alert = 1;
}
fdprop.getNode("alt-alert").setBoolValue(alert);
return(offset);
}
var update = func {
var PT = getprop("instrumentation/kfc200/pitch-trim");
var AT = getprop("instrumentation/kfc200/alt-trim");
if(PT !=0)pitch_trim(PT);
if(AT!=0)alt_trim(AT);
if(getprop("/position/altitude-agl-ft") < DH){
props.globals.getNode("/autopilot/locks/passive-mode").setBoolValue(1);
setprop("instrumentation/kfc200/dh-alert",1);
}else{
setprop("instrumentation/kfc200/dh-alert",0);
}
update_nav();
settimer(update, 0);
}