365 lines
14 KiB
Text
365 lines
14 KiB
Text
# A3XX ECAM
|
|
# Joshua Davidson (it0uchpods)
|
|
|
|
##############################################
|
|
# Copyright (c) Joshua Davidson (it0uchpods) #
|
|
##############################################
|
|
|
|
var stateL = 0;
|
|
var stateR = 0;
|
|
var thrustL = 0;
|
|
var thrustR = 0;
|
|
var elec = 0;
|
|
var speed = 0;
|
|
var wow = 0;
|
|
var altitude = 0;
|
|
var phase = 1;
|
|
var toPowerSet = 0;
|
|
var eng = "XX";
|
|
var eprlim = 0;
|
|
var n1lim = 0;
|
|
var mode = "XX";
|
|
var modeI = "XX";
|
|
setprop("/ECAM/left-msg", "NONE");
|
|
setprop("/position/gear-agl-ft", 0);
|
|
# w = White, b = Blue, g = Green, a = Amber, r = Red
|
|
|
|
var ECAM = {
|
|
init: func() {
|
|
setprop("/ECAM/engine-start-time", 0);
|
|
setprop("/ECAM/engine-start-time-switch", 0);
|
|
setprop("/ECAM/to-memo-enable", 1);
|
|
setprop("/ECAM/to-config", 0);
|
|
setprop("/ECAM/ldg-memo-enable", 0);
|
|
setprop("/systems/gear/landing-gear-warning-light", 0);
|
|
setprop("/ECAM/Lower/page", "door");
|
|
setprop("/ECAM/Lower/man-select", 0);
|
|
setprop("/ECAM/Lower/fault-select", 0);
|
|
setprop("/ECAM/Lower/apu-timer", 0);
|
|
setprop("/ECAM/Lower/eng-timer", 0);
|
|
setprop("/ECAM/Lower/fctl-timer", 0);
|
|
setprop("/ECAM/Lower/light/apu", 0);
|
|
setprop("/ECAM/Lower/light/bleed", 0);
|
|
setprop("/ECAM/Lower/light/cond", 0);
|
|
setprop("/ECAM/Lower/light/door", 0);
|
|
setprop("/ECAM/Lower/light/elec", 0);
|
|
setprop("/ECAM/Lower/light/eng", 0);
|
|
setprop("/ECAM/Lower/light/fctl", 0);
|
|
setprop("/ECAM/Lower/light/fuel", 0);
|
|
setprop("/ECAM/Lower/light/hyd", 0);
|
|
setprop("/ECAM/Lower/light/press", 0);
|
|
setprop("/ECAM/Lower/light/sts", 0);
|
|
setprop("/ECAM/Lower/light/wheel", 0);
|
|
setprop("/ECAM/warning-phase", 1);
|
|
setprop("/ECAM/warning-phase-10-time", 0);
|
|
LowerECAM.reset();
|
|
},
|
|
MSGclr: func() {
|
|
setprop("/ECAM/ecam-checklist-active", 0);
|
|
setprop("/ECAM/left-msg", "NONE");
|
|
setprop("/ECAM/msg/line1", "");
|
|
setprop("/ECAM/msg/line2", "");
|
|
setprop("/ECAM/msg/line3", "");
|
|
setprop("/ECAM/msg/line4", "");
|
|
setprop("/ECAM/msg/line5", "");
|
|
setprop("/ECAM/msg/line6", "");
|
|
setprop("/ECAM/msg/line7", "");
|
|
setprop("/ECAM/msg/line8", "");
|
|
setprop("/ECAM/msg/linec1", "w");
|
|
setprop("/ECAM/msg/linec2", "w");
|
|
setprop("/ECAM/msg/linec3", "w");
|
|
setprop("/ECAM/msg/linec4", "w");
|
|
setprop("/ECAM/msg/linec5", "w");
|
|
setprop("/ECAM/msg/linec6", "w");
|
|
setprop("/ECAM/msg/linec7", "w");
|
|
setprop("/ECAM/msg/linec8", "w");
|
|
setprop("/ECAM/rightmsg/line1", "");
|
|
setprop("/ECAM/rightmsg/line2", "");
|
|
setprop("/ECAM/rightmsg/line3", "");
|
|
setprop("/ECAM/rightmsg/line4", "");
|
|
setprop("/ECAM/rightmsg/line5", "");
|
|
setprop("/ECAM/rightmsg/line6", "");
|
|
setprop("/ECAM/rightmsg/line7", "");
|
|
setprop("/ECAM/rightmsg/line8", "");
|
|
setprop("/ECAM/rightmsg/linec1", "w");
|
|
setprop("/ECAM/rightmsg/linec2", "w");
|
|
setprop("/ECAM/rightmsg/linec3", "w");
|
|
setprop("/ECAM/rightmsg/linec4", "w");
|
|
setprop("/ECAM/rightmsg/linec5", "w");
|
|
setprop("/ECAM/rightmsg/linec6", "w");
|
|
setprop("/ECAM/rightmsg/linec7", "w");
|
|
setprop("/ECAM/rightmsg/linec8", "w");
|
|
},
|
|
loop: func() {
|
|
stateL = getprop("/engines/engine[0]/state");
|
|
stateR = getprop("/engines/engine[1]/state");
|
|
thrustL = getprop("/systems/thrust/state1");
|
|
thrustR = getprop("/systems/thrust/state2");
|
|
elec = getprop("/systems/electrical/on");
|
|
speed = getprop("/instrumentation/airspeed-indicator/indicated-speed-kt");
|
|
wow = getprop("/gear/gear[0]/wow");
|
|
eng = getprop("/options/eng");
|
|
|
|
if (stateL == 3 and stateR == 3 and wow == 1) {
|
|
if (getprop("/ECAM/engine-start-time-switch") != 1) {
|
|
setprop("/ECAM/engine-start-time", getprop("/sim/time/elapsed-sec"));
|
|
setprop("/ECAM/engine-start-time-switch", 1);
|
|
}
|
|
} else if (wow == 1) {
|
|
if (getprop("/ECAM/engine-start-time-switch") != 0) {
|
|
setprop("/ECAM/engine-start-time-switch", 0);
|
|
}
|
|
}
|
|
|
|
if (wow == 0) {
|
|
setprop("/ECAM/to-memo-enable", 0);
|
|
} else if ((stateL != 3 or stateR != 3) and wow == 1) {
|
|
setprop("/ECAM/to-memo-enable", 1);
|
|
}
|
|
|
|
if (getprop("/position/gear-agl-ft") <= 2000 and (getprop("/FMGC/status/phase") == 3 or getprop("/FMGC/status/phase") == 4 or getprop("/FMGC/status/phase") == 5) and wow == 0) {
|
|
setprop("/ECAM/ldg-memo-enable", 1);
|
|
} else if (getprop("/ECAM/left-msg") == "LDG-MEMO" and speed <= 80 and wow == 1) {
|
|
setprop("/ECAM/ldg-memo-enable", 0);
|
|
} else if (getprop("/ECAM/left-msg") != "LDG-MEMO") {
|
|
setprop("/ECAM/ldg-memo-enable", 0);
|
|
}
|
|
|
|
if (ecam.warnings.size() > 0) {
|
|
setprop("/ECAM/left-msg", "MSG");
|
|
} else if (getprop("/FMGC/status/phase") == 0 and stateL == 3 and stateR == 3 and getprop("/ECAM/engine-start-time") + 120 < getprop("/sim/time/elapsed-sec") and getprop("/ECAM/to-memo-enable") == 1 and wow == 1) {
|
|
setprop("/ECAM/left-msg", "TO-MEMO");
|
|
} else if (getprop("/ECAM/ldg-memo-enable") == 1) {
|
|
setprop("/ECAM/left-msg", "LDG-MEMO");
|
|
} else {
|
|
setprop("/ECAM/left-msg", "NONE");
|
|
}
|
|
|
|
if (ecam.memos.size() > 0) {
|
|
setprop("/ECAM/right-msg", "MSG");
|
|
} else {
|
|
setprop("/ECAM/right-msg", "NONE");
|
|
}
|
|
|
|
if (getprop("/controls/autobrake/mode") == 3 and getprop("/controls/switches/no-smoking-sign") == 1 and getprop("/controls/switches/seatbelt-sign") == 1 and getprop("/controls/flight/speedbrake-arm") == 1 and getprop("/controls/flight/flap-pos") > 0
|
|
and getprop("/controls/flight/flap-pos") < 5) {
|
|
# Do nothing
|
|
} else {
|
|
setprop("/ECAM/to-config", 0);
|
|
}
|
|
|
|
if (eng == "IAE") {
|
|
eprlim = getprop("/controls/engines/epr-limit");
|
|
if (abs(getprop("/engines/engine[0]/epr-actual") - eprlim) <= 0.005 or abs(getprop("/engines/engine[0]/epr-actual") - eprlim) <= 0.005) {
|
|
toPowerSet = 1;
|
|
} else {
|
|
toPowerSet = 0;
|
|
}
|
|
} else {
|
|
n1lim = getprop("/controls/engines/n1-limit");
|
|
if (abs(getprop("/engines/engine[0]/n1-actual") - n1lim) <= 0.1 or abs(getprop("/engines/engine[0]/n1-actual") - n1lim) <= 0.1) {
|
|
toPowerSet = 1;
|
|
} else {
|
|
toPowerSet = 0;
|
|
}
|
|
}
|
|
|
|
# Warning Phases
|
|
if (getprop("/systems/electrical/bus/ac1") < 110 and getprop("/systems/electrical/bus/ac2") < 110 and getprop("/systems/electrical/bus/ac-ess") < 110) { # Reset warning phases
|
|
if (getprop("/ECAM/warning-phase") != 1) {
|
|
setprop("/ECAM/warning-phase", 1);
|
|
}
|
|
} else {
|
|
phase = getprop("/ECAM/warning-phase");
|
|
mode = getprop("/modes/pfd/fma/pitch-mode");
|
|
modeI = getprop("/it-autoflight/mode/vert");
|
|
|
|
if (phase == 1 and (stateL == 3 or stateR == 3)) {
|
|
setprop("/ECAM/warning-phase", 2);
|
|
} else if (phase == 2 and toPowerSet) {
|
|
setprop("/ECAM/warning-phase", 3);
|
|
} else if (phase == 3 and speed >= 80) {
|
|
setprop("/ECAM/warning-phase", 4);
|
|
} else if (phase == 4 and getprop("/fdm/jsbsim/position/wow") == 0) { # Liftoff
|
|
setprop("/ECAM/warning-phase", 5);
|
|
} else if (phase == 5 and getprop("/position/gear-agl-ft") >= 1500) {
|
|
setprop("/ECAM/warning-phase", 6);
|
|
} else if (phase == 6 and getprop("/position/gear-agl-ft") < 800) {
|
|
if (mode == "OP CLB" or mode == "CLB" or (modeI == "V/S" and getprop("/it-autoflight/input/vs") >= 100) or (modeI == "FPA" and getprop("/it-autoflight/input/fpa") >= 0.1)) {
|
|
# Do not do this if we are climbing, not in FCOM, but prevents terrain from causing early mode change. If this ends up using baro alt, not radio, then delete this if
|
|
} else {
|
|
setprop("/ECAM/warning-phase", 7);
|
|
}
|
|
} else if (phase == 7 and getprop("/fdm/jsbsim/position/wow") == 1) { # Touchdown
|
|
setprop("/ECAM/warning-phase", 8);
|
|
} else if (phase == 8 and speed < 80) {
|
|
setprop("/ECAM/warning-phase", 9);
|
|
} else if (phase == 9 and (stateL == 0 or stateR == 0)) {
|
|
setprop("/ECAM/warning-phase", 10);
|
|
setprop("/ECAM/warning-phase-10-time", getprop("/sim/time/elapsed-sec"));
|
|
} else if (phase == 10 and getprop("/ECAM/warning-phase-10-time") + 300 < getprop("/sim/time/elapsed-sec")) { # After 5 mins, reset to phase 1
|
|
setprop("/ECAM/warning-phase", 1);
|
|
}
|
|
}
|
|
|
|
LowerECAM.loop();
|
|
},
|
|
toConfig: func() {
|
|
stateL = getprop("/engines/engine[0]/state");
|
|
stateR = getprop("/engines/engine[1]/state");
|
|
wow = getprop("/gear/gear[0]/wow");
|
|
|
|
if (wow == 1 and stateL == 3 and stateR == 3 and getprop("/ECAM/left-msg") != "TO-MEMO") {
|
|
setprop("/ECAM/to-memo-enable", 1);
|
|
setprop("/ECAM/engine-start-time", getprop("/ECAM/engine-start-time") - 120);
|
|
}
|
|
|
|
if (getprop("/controls/autobrake/mode") == 3 and getprop("/controls/switches/no-smoking-sign") == 1 and getprop("/controls/switches/seatbelt-sign") == 1 and getprop("/controls/flight/speedbrake-arm") == 1 and getprop("/controls/flight/flap-pos") > 0
|
|
and getprop("/controls/flight/flap-pos") < 5) {
|
|
setprop("/ECAM/to-config", 1);
|
|
}
|
|
},
|
|
};
|
|
|
|
ECAM.MSGclr();
|
|
|
|
var LowerECAM = {
|
|
button: func(b) {
|
|
var man_sel = getprop("/ECAM/Lower/man-select");
|
|
|
|
if(!getprop("/ECAM/lower/fault-select")) {
|
|
if(!man_sel) {
|
|
setprop("/ECAM/Lower/man-select", 1);
|
|
setprop("/ECAM/Lower/page", b);
|
|
setprop("/ECAM/Lower/light/" ~ b, 1);
|
|
} else {
|
|
if(b == getprop("/ECAM/Lower/page")) {
|
|
setprop("/ECAM/Lower/man-select", 0);
|
|
LowerECAM.loop();
|
|
setprop("/ECAM/Lower/light/" ~ b, 0);
|
|
} else {
|
|
setprop("/ECAM/Lower/light/" ~ getprop("/ECAM/Lower/page"), 0);
|
|
setprop("/ECAM/Lower/page", b);
|
|
setprop("/ECAM/Lower/light/" ~ b, 1);
|
|
}
|
|
}
|
|
}
|
|
},
|
|
loop: func() {
|
|
var man_sel = getprop("/ECAM/Lower/man-select");
|
|
var fault_sel = getprop("/ECAM/Lower/fault-select");
|
|
|
|
if (!man_sel) {
|
|
if (!fault_sel) {
|
|
var apu_timer = getprop("/ECAM/Lower/apu-timer");
|
|
var apu_n = getprop("/systems/apu/rpm");
|
|
var apu_master = getprop("/controls/APU/master");
|
|
|
|
var eng_timer = getprop("/ECAM/Lower/eng-timer");
|
|
var eng_to = getprop("/ECAM/Lower/eng-to");
|
|
var eng1_state = getprop("/engines/engine[0]/state");
|
|
var eng2_state = getprop("/engines/engine[1]/state");
|
|
var eng_mode = getprop("/controls/engines/engine-start-switch");
|
|
|
|
var flaps = getprop("/controls/flight/flap-lever");
|
|
var agl = getprop("/position/gear-agl-ft");
|
|
|
|
var phase = getprop("/FMGC/status/phase");
|
|
var gear0 = getprop("/gear/gear[0]/wow");
|
|
var n1_left = getprop("/engines/engine[0]/n1-actual");
|
|
var n1_right = getprop("/engines/engine[1]/n1-actual");
|
|
var state1 = getprop("/systems/thrust/state1");
|
|
var state2 = getprop("/systems/thrust/state2");
|
|
var flx = getprop("/systems/thrust/lim-flex");
|
|
var thr1 = getprop("/controls/engines/engine[0]/throttle-pos");
|
|
var thr2 = getprop("/controls/engines/engine[1]/throttle-pos");
|
|
|
|
var eng_out = 0;
|
|
if ((getprop("/engines/engine[0]/state") == 3 and getprop("/engines/engine[1]/state") != 3) or (getprop("/engines/engine[0]/state") != 3 and getprop("/engines/engine[1]/state") == 3)) {
|
|
eng_out = 1;
|
|
}
|
|
|
|
var to_thr = 0;
|
|
if (n1_left >= 70 and state1 == "TOGA" or (flx == 1 and state1 == "MCT" and eng_out == 0) or (flx == 1 and (state1 == "MAN THR" and thr1 >= 0.83 and eng_out == 0)) or n1_right >= 70 and state2 == "TOGA" or (flx == 1 and state2 == "MCT"
|
|
and eng_out == 0) or (flx == 1 and (state2 == "MAN THR" and thr2 >= 0.83 and eng_out == 0))) {
|
|
to_thr = 1;
|
|
}
|
|
|
|
#TODO auto select page for F/CTL
|
|
if (eng_mode == 0 or eng1_state == 1 or eng1_state == 2 or eng2_state == 1 or eng2_state == 2 or (to_thr == 1 and agl < 1500) or eng_to == 1 or eng_timer > 0) {
|
|
if (eng_timer == 0) {
|
|
setprop("/ECAM/Lower/eng-timer", 1);
|
|
}
|
|
|
|
if (eng_mode == 1 and to_thr == 0) {
|
|
setprop("/ECAM/Lower/eng-timer", 0);
|
|
}
|
|
|
|
if (to_thr == 1 and agl <= 1500) {
|
|
setprop("/ECAM/Lower/eng-to", 1);
|
|
}
|
|
|
|
if (eng_to == 1 and flaps == 0 and to_thr == 0 and agl >= 1500) {
|
|
setprop("/ECAM/Lower/eng-to", 0);
|
|
}
|
|
|
|
if ((eng1_state == 0 or eng1_state == 3) and (eng2_state == 0 or eng2_state == 3) and gear0 == 1 and to_thr == 0) {
|
|
settimer(func() { setprop("/ECAM/Lower/eng-timer", 0);}, 10);
|
|
}
|
|
|
|
if (eng_to == 1 and agl >= 1500) {
|
|
settimer(func() { setprop("/ECAM/Lower/eng-to", 0);}, 60);
|
|
}
|
|
|
|
setprop("/ECAM/Lower/page", "eng");
|
|
} else if ((apu_master == 1 and apu_n < 95) or apu_timer > 0) {
|
|
# apu-timer states:
|
|
# 0 -> no apu start
|
|
# 1 -> apu starting/started, will be set back to 0 by timer
|
|
if (apu_timer == 0) {
|
|
setprop("/ECAM/Lower/apu-timer", 1);
|
|
}
|
|
|
|
if (apu_master == 0) {
|
|
setprop("/ECAM/Lower/apu-timer", 0);
|
|
}
|
|
|
|
if (apu_n >= 95) {
|
|
settimer(func() { setprop("/ECAM/Lower/apu-timer", 0);}, 10);
|
|
}
|
|
|
|
setprop("/ECAM/Lower/page", "apu");
|
|
|
|
} else if (((getprop("/engines/engine[0]/n2-actual") >= 59 or getprop("/engines/engine[1]/n2-actual") >= 59) and getprop("/gear/gear[1]/wow") == 1) or (getprop("/instrumentation/altimeter/indicated-altitude-ft") <= 16000
|
|
and getprop("/controls/gear/gear-down") == 1 and getprop("/gear/gear[1]/wow") == 0)) {
|
|
setprop("/ECAM/Lower/page", "wheel");
|
|
} else if (getprop("/gear/gear[1]/wow") == 1) {
|
|
setprop("/ECAM/Lower/page", "door");
|
|
} else {
|
|
setprop("/ECAM/Lower/page", "crz");
|
|
}
|
|
}
|
|
}
|
|
},
|
|
reset: func() {
|
|
setprop("/ECAM/Lower/page", "door");
|
|
setprop("/ECAM/Lower/man-select", 0);
|
|
setprop("/ECAM/Lower/fault-select", 0);
|
|
setprop("/ECAM/Lower/apu-timer", 0);
|
|
setprop("/ECAM/Lower/eng-timer", 0);
|
|
setprop("/ECAM/Lower/eng-to", 0);
|
|
setprop("/ECAM/Lower/fctl-timer", 0);
|
|
setprop("/ECAM/Lower/light/apu", 0);
|
|
setprop("/ECAM/Lower/light/bleed", 0);
|
|
setprop("/ECAM/Lower/light/cond", 0);
|
|
setprop("/ECAM/Lower/light/door", 0);
|
|
setprop("/ECAM/Lower/light/elec", 0);
|
|
setprop("/ECAM/Lower/light/eng", 0);
|
|
setprop("/ECAM/Lower/light/fctl", 0);
|
|
setprop("/ECAM/Lower/light/fuel", 0);
|
|
setprop("/ECAM/Lower/light/hyd", 0);
|
|
setprop("/ECAM/Lower/light/press", 0);
|
|
setprop("/ECAM/Lower/light/sts", 0);
|
|
setprop("/ECAM/Lower/light/wheel", 0);
|
|
},
|
|
};
|