497 lines
15 KiB
Text
497 lines
15 KiB
Text
# A3XX ECAM
|
|
# Joshua Davidson (Octal450)
|
|
|
|
# Copyright (c) 2019 Joshua Davidson (Octal450)
|
|
|
|
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";
|
|
var man_sel = 0;
|
|
var fault_sel = 0;
|
|
var fault_page = "";
|
|
var warnPhase = 1;
|
|
var page = "door";
|
|
var aileron = 0;
|
|
var elevator = 0;
|
|
var elapsedSec = 0;
|
|
var fctlCounting = 0;
|
|
var fctlTime = 0;
|
|
var showAPUPage = 0;
|
|
var APUMaster = 0;
|
|
var APURPM = 0;
|
|
var APUTime = 0;
|
|
var APUCounting = 0;
|
|
var engModeSel = 0;
|
|
var showENGPage = 0;
|
|
var ENGTime = 0;
|
|
var ENGCounting = 0;
|
|
var flapLever = 0;
|
|
var CRZTime = 0;
|
|
var CRZCondition = 0;
|
|
var CRZCounting = 0;
|
|
var agl = 0;
|
|
var ap_active = 0;
|
|
var athr_active = 0;
|
|
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("/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/fault-page", "");
|
|
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/Lower/light/clr", 0);
|
|
setprop("/ECAM/warning-phase", 1);
|
|
setprop("/ECAM/warning-phase-10-time", 0);
|
|
setprop("/ECAM/ap-off-time", 0);
|
|
setprop("/ECAM/athr-off-time", 0);
|
|
setprop("/it-autoflight/output/ap-warning", 0);
|
|
setprop("/it-autoflight/output/athr-warning", 0);
|
|
var ap_off_time = getprop("/ECAM/ap-off-time");
|
|
var athr_off_time = getprop("/ECAM/athr-off-time");
|
|
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 or stateR != 3) {
|
|
if (getprop("/ECAM/engine-start-time-switch") != 0) {
|
|
setprop("/ECAM/engine-start-time-switch", 0);
|
|
setprop("/ECAM/engine-start-time", 0);
|
|
}
|
|
} else 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 (getprop("/ECAM/show-left-msg") == 1) {
|
|
setprop("/ECAM/left-msg", "MSG");
|
|
} else {
|
|
setprop("/ECAM/left-msg", "NONE");
|
|
}
|
|
|
|
if (getprop("/ECAM/show-right-msg") == 1) {
|
|
setprop("/ECAM/right-msg", "MSG");
|
|
} else {
|
|
setprop("/ECAM/right-msg", "NONE");
|
|
}
|
|
|
|
# AP / ATHR warnings
|
|
if (ap_active == 1 and getprop("/it-autoflight/output/ap-warning") == 0) {
|
|
ap_active = 0;
|
|
} elsif (ap_active == 1 and getprop("/it-autoflight/output/ap-warning") == 1 and getprop("/sim/time/elapsed-sec") > (getprop("/ECAM/ap-off-time") + 9)) {
|
|
ap_active = 0;
|
|
setprop("/it-autoflight/output/ap-warning", 0);
|
|
} elsif (ap_active == 0 and getprop("/it-autoflight/output/ap-warning") != 0) {
|
|
ap_active = 1;
|
|
}
|
|
|
|
if (ap_active == 1 and getprop("/it-autoflight/output/ap-warning") == 1 and getprop("/sim/time/elapsed-sec") > (getprop("/ECAM/ap-off-time") + 3) and getprop("/ECAM/warnings/master-warning-light") == 1) {
|
|
setprop("/ECAM/warnings/master-warning-light", 0);
|
|
}
|
|
|
|
if (getprop("/it-autoflight/output/ap-warning") == 2 and (getprop("/it-autoflight/output/ap1") == 1 or getprop("/it-autoflight/output/ap2") == 1)) {
|
|
setprop("/it-autoflight/output/ap-warning", 0);
|
|
}
|
|
|
|
if (athr_active == 1 and getprop("/it-autoflight/output/athr-warning") == 0) {
|
|
athr_active = 0;
|
|
} elsif (athr_active == 1 and getprop("/it-autoflight/output/athr-warning") == 1 and getprop("/sim/time/elapsed-sec") > (getprop("/ECAM/athr-off-time") + 9)) {
|
|
athr_active = 0;
|
|
setprop("/it-autoflight/output/athr-warning", 0);
|
|
} elsif (athr_active == 0 and getprop("/it-autoflight/output/athr-warning") != 0) {
|
|
athr_active = 1;
|
|
}
|
|
|
|
|
|
if (athr_active == 1 and getprop("/it-autoflight/output/athr-warning") == 1 and getprop("/sim/time/elapsed-sec") > (getprop("/ECAM/athr-off-time") + 3) and getprop("/ECAM/warnings/master-caution-light") == 1) {
|
|
setprop("/ECAM/warnings/master-caution-light", 0);
|
|
}
|
|
|
|
if (getprop("/it-autoflight/output/athr-warning") == 2 and getprop("/it-autoflight/output/athr") == 1) {
|
|
setprop("/it-autoflight/output/athr-warning", 0);
|
|
}
|
|
|
|
LowerECAM.loop();
|
|
},
|
|
};
|
|
|
|
ECAM.MSGclr();
|
|
|
|
# Lower ECAM Pages
|
|
|
|
var LowerECAM = {
|
|
button: func(b) {
|
|
man_sel = getprop("/ECAM/Lower/man-select");
|
|
if (b == "clr" and getprop("/it-autoflight/output/athr-warning") == 2) {
|
|
setprop("/it-autoflight/output/athr-warning", 0);
|
|
setprop("/ECAM/Lower/light/clr", 0);
|
|
setprop("/ECAM/warnings/master-caution-light", 0);
|
|
return;
|
|
}
|
|
|
|
if (b == "clr" and getprop("/it-autoflight/output/ap-warning") == 2) {
|
|
setprop("/it-autoflight/output/ap-warning", 0);
|
|
setprop("/ECAM/Lower/light/clr", 0);
|
|
setprop("/ECAM/warnings/master-warning-light", 0);
|
|
return;
|
|
}
|
|
|
|
if (b == "clr") {
|
|
ecam.ECAM_controller.clear();
|
|
return;
|
|
}
|
|
|
|
if (getprop("/ECAM/Lower/fault-select") == 0) {
|
|
if (b != "clr") {
|
|
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);
|
|
}
|
|
}
|
|
} elsif (getprop("/ECAM/Lower/light/clr") == 1) {
|
|
setprop("/ECAM/Lower/light/clr", 0);
|
|
}
|
|
} else {
|
|
if (b == "clr") {
|
|
setprop("/ECAM/Lower/light/clr", 0);
|
|
setprop("/ECAM/Lower/fault-select", 0);
|
|
setprop("/ECAM/Lower/fault-page", "");
|
|
LowerECAM.loop();
|
|
} elsif (!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);
|
|
setprop("/ECAM/Lower/light/" ~ b, 0);
|
|
setprop("/ECAM/Lower/fault-select", 1);
|
|
setprop("/ECAM/Lower/page", getprop("/ECAM/Lower/fault-page"));
|
|
} else {
|
|
setprop("/ECAM/Lower/light/" ~ getprop("/ECAM/Lower/page"), 0);
|
|
setprop("/ECAM/Lower/page", b);
|
|
setprop("/ECAM/Lower/light/" ~ b, 1);
|
|
}
|
|
}
|
|
}
|
|
},
|
|
loop: func() {
|
|
man_sel = getprop("/ECAM/Lower/man-select");
|
|
fault_sel = getprop("/ECAM/Lower/fault-select");
|
|
fault_page = getprop("/ECAM/Lower/fault-page");
|
|
page = getprop("/ECAM/Lower/page");
|
|
|
|
if (!man_sel) {
|
|
if (!fault_sel) {
|
|
warnPhase = getprop("/ECAM/warning-phase");
|
|
aileron = getprop("/fdm/jsbsim/fbw/aileron-sidestick");
|
|
elevator = getprop("/fdm/jsbsim/fbw/elevator-sidestick");
|
|
APUMaster = getprop("/controls/APU/master");
|
|
APURPM = getprop("/systems/apu/rpm");
|
|
stateL = getprop("/engines/engine[0]/state");
|
|
stateR = getprop("/engines/engine[1]/state");
|
|
engModeSel = getprop("/controls/engines/engine-start-switch");
|
|
elapsedSec = getprop("/sim/time/elapsed-sec");
|
|
|
|
if (warnPhase == 2) {
|
|
if (abs(aileron) > 0.3 or abs(elevator) > 0.3) {
|
|
fctlTime = elapsedSec;
|
|
fctlCounting = 1;
|
|
} else if (fctlCounting) {
|
|
if (fctlTime + 20 < elapsedSec) {
|
|
fctlCounting = 0;
|
|
}
|
|
}
|
|
} else {
|
|
fctlCounting = 0;
|
|
}
|
|
|
|
if (APURPM > 95) {
|
|
if (APUTime + 10 < elapsedSec) {
|
|
APUCounting = 0;
|
|
}
|
|
} else {
|
|
if (APUMaster) {
|
|
APUTime = elapsedSec;
|
|
APUCounting = 1;
|
|
} else {
|
|
APUCounting = 0;
|
|
}
|
|
}
|
|
|
|
if ((APURPM <= 95 or APUCounting) and APUMaster) {
|
|
showAPUPage = 1;
|
|
} else {
|
|
showAPUPage = 0;
|
|
}
|
|
|
|
if (stateL == 3 or stateR == 3) {
|
|
if (ENGCounting and ENGTime + 10 < elapsedSec) {
|
|
ENGCounting = 0;
|
|
}
|
|
}
|
|
|
|
if (((stateL > 0 and stateL != 3) or (stateR > 0 and stateR != 3)) and engModeSel == 2) {
|
|
ENGTime = elapsedSec;
|
|
ENGCounting = 1;
|
|
} else if ((stateL == 0 and stateR == 0) or engModeSel == 1) {
|
|
ENGCounting = 0;
|
|
}
|
|
|
|
if (ENGCounting or engModeSel == 0) {
|
|
showENGPage = 1;
|
|
} else {
|
|
showENGPage = 0;
|
|
}
|
|
|
|
if (warnPhase == 1 or warnPhase == 10) {
|
|
if (showENGPage) {
|
|
if (page != "eng") {
|
|
setprop("/ECAM/Lower/page", "eng");
|
|
}
|
|
} else if (showAPUPage) {
|
|
if (page != "apu") {
|
|
setprop("/ECAM/Lower/page", "apu");
|
|
}
|
|
} else if (page != "door") {
|
|
setprop("/ECAM/Lower/page", "door");
|
|
}
|
|
} else if (warnPhase == 2) {
|
|
|
|
if (showENGPage) {
|
|
if (page != "eng") {
|
|
setprop("/ECAM/Lower/page", "eng");
|
|
}
|
|
} else if (showAPUPage) {
|
|
if (page != "apu") {
|
|
setprop("/ECAM/Lower/page", "apu");
|
|
}
|
|
} else if (fctlCounting == 1) {
|
|
if (page != "fctl") {
|
|
setprop("/ECAM/Lower/page", "fctl");
|
|
}
|
|
} else if (page != "wheel") {
|
|
setprop("/ECAM/Lower/page", "wheel");
|
|
}
|
|
} else if (warnPhase >= 3 and warnPhase <= 5) {
|
|
if (page != "eng") {
|
|
setprop("/ECAM/Lower/page", "eng");
|
|
}
|
|
} else if (warnPhase >= 7 and warnPhase <= 9) {
|
|
if (showENGPage) {
|
|
if (page != "eng") {
|
|
setprop("/ECAM/Lower/page", "eng");
|
|
}
|
|
} else if (showAPUPage) {
|
|
if (page != "apu") {
|
|
setprop("/ECAM/Lower/page", "apu");
|
|
}
|
|
} else if (page != "wheel") {
|
|
setprop("/ECAM/Lower/page", "wheel");
|
|
}
|
|
} else if (warnPhase == 6) {
|
|
flapLever = getprop("/controls/flight/flap-lever");
|
|
gearLever = getprop("/controls/gear/gear-down");
|
|
agl = pts.Position.gearAglFt.getValue();
|
|
|
|
if (CRZCounting and (toPowerSet or flapLever > 0) and !CRZCondition) {
|
|
if (CRZTime + 60 < elapsedSec) {
|
|
CRZCondition = 1;
|
|
CRZCounting = 0;
|
|
} else {
|
|
CRZCondition = 0;
|
|
}
|
|
}
|
|
|
|
if (!CRZCounting and (toPowerSet or flapLever > 0) and !CRZCondition) {
|
|
CRZTime = elapsedSec;
|
|
CRZCondition = 0;
|
|
CRZCounting = 1;
|
|
}
|
|
|
|
if (CRZCondition or (flapLever == 0 and !toPowerSet)) {
|
|
if (gearLever and agl <= 16000) {
|
|
if (page != "wheel") {
|
|
setprop("/ECAM/Lower/page", "wheel");
|
|
}
|
|
} else if (page != "crz") {
|
|
setprop("/ECAM/Lower/page", "crz");
|
|
}
|
|
} else {
|
|
if (showENGPage) {
|
|
if (page != "eng") {
|
|
setprop("/ECAM/Lower/page", "eng");
|
|
}
|
|
} else if (showAPUPage) {
|
|
if (page != "apu") {
|
|
setprop("/ECAM/Lower/page", "apu");
|
|
}
|
|
} else if (page != "eng") {
|
|
setprop("/ECAM/Lower/page", "eng");
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
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);
|
|
}
|
|
}
|
|
},
|
|
reset: func() {
|
|
setprop("/ECAM/Lower/page", "door");
|
|
setprop("/ECAM/Lower/man-select", 0);
|
|
setprop("/ECAM/Lower/fault-select", 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);
|
|
},
|
|
failCall: func(page) {
|
|
setprop("/ECAM/Lower/man-select", 0);
|
|
setprop("/ECAM/Lower/fault-select", 1);
|
|
setprop("/ECAM/Lower/fault-page", page);
|
|
setprop("/ECAM/Lower/page", page);
|
|
setprop("/ECAM/Lower/light/clr", 1);
|
|
},
|
|
clrLight: func() {
|
|
setprop("/ECAM/Lower/light/clr", 1);
|
|
}
|
|
};
|
|
|
|
# Autoflight Warnings
|
|
var doAthrWarn = func(type) {
|
|
if (type == "none") {
|
|
return;
|
|
} elsif (type == "soft") {
|
|
setprop("/ECAM/athr-off-time", getprop("/sim/time/elapsed-sec"));
|
|
setprop("/it-autoflight/output/athr-warning", 1);
|
|
} else {
|
|
libraries.LowerECAM.clrLight();
|
|
setprop("/it-autoflight/output/athr-warning", 2);
|
|
}
|
|
setprop("/ECAM/warnings/master-caution-light", 1);
|
|
}
|
|
|
|
var doApWarn = func(type) {
|
|
if (type == "none") {
|
|
return;
|
|
} elsif (type == "soft") {
|
|
setprop("/ECAM/ap-off-time", getprop("/sim/time/elapsed-sec"));
|
|
setprop("/it-autoflight/output/ap-warning", 1);
|
|
setprop("/ECAM/warnings/master-warning-light", 1);
|
|
} else {
|
|
setprop("/it-autoflight/output/ap-warning", 2);
|
|
# master warning handled by warning system in this case
|
|
libraries.LowerECAM.clrLight();
|
|
}
|
|
}
|