diff --git a/A320-main.xml b/A320-main.xml
index b02f0d69..a1ec310d 100644
--- a/A320-main.xml
+++ b/A320-main.xml
@@ -4773,6 +4773,20 @@
Aircraft/A320-family/Nasal/emesary/exec.nas
Aircraft/A320-family/Models/Instruments/Upper-ECAM/Upper-ECAM.nas
+ Aircraft/A320-family/Models/Instruments/Lower-ECAM/Lower-ECAM-base.nas
+ Aircraft/A320-family/Models/Instruments/Lower-ECAM/Lower-ECAM-APU.nas
+ Aircraft/A320-family/Models/Instruments/Lower-ECAM/Lower-ECAM-bleed.nas
+ Aircraft/A320-family/Models/Instruments/Lower-ECAM/Lower-ECAM-cond.nas
+ Aircraft/A320-family/Models/Instruments/Lower-ECAM/Lower-ECAM-cruise.nas
+ Aircraft/A320-family/Models/Instruments/Lower-ECAM/Lower-ECAM-door.nas
+ Aircraft/A320-family/Models/Instruments/Lower-ECAM/Lower-ECAM-elec.nas
+ Aircraft/A320-family/Models/Instruments/Lower-ECAM/Lower-ECAM-eng.nas
+ Aircraft/A320-family/Models/Instruments/Lower-ECAM/Lower-ECAM-fctl.nas
+ Aircraft/A320-family/Models/Instruments/Lower-ECAM/Lower-ECAM-fuel.nas
+ Aircraft/A320-family/Models/Instruments/Lower-ECAM/Lower-ECAM-hyd.nas
+ Aircraft/A320-family/Models/Instruments/Lower-ECAM/Lower-ECAM-press.nas
+ Aircraft/A320-family/Models/Instruments/Lower-ECAM/Lower-ECAM-sts.nas
+ Aircraft/A320-family/Models/Instruments/Lower-ECAM/Lower-ECAM-wheel.nas
Aircraft/A320-family/Models/Instruments/Lower-ECAM/Lower-ECAM.nas
diff --git a/Models/Instruments/Lower-ECAM/Lower-ECAM-APU.nas b/Models/Instruments/Lower-ECAM/Lower-ECAM-APU.nas
new file mode 100644
index 00000000..83d47a84
--- /dev/null
+++ b/Models/Instruments/Lower-ECAM/Lower-ECAM-APU.nas
@@ -0,0 +1,320 @@
+# A3XX Lower ECAM Canvas
+# Copyright (c) 2021 Josh Davidson (Octal450) and Jonathan Redpath
+
+var apu_load = props.globals.initNode("/systems/electrical/extra/apu-load", 0, "DOUBLE");
+var gen1_load = props.globals.initNode("/systems/electrical/extra/gen1-load", 0, "DOUBLE");
+var gen2_load = props.globals.initNode("/systems/electrical/extra/gen2-load", 0, "DOUBLE");
+
+var canvas_lowerECAMPageApu =
+{
+ new: func(svg,name) {
+ var obj = {parents: [canvas_lowerECAMPageApu,canvas_lowerECAM_base] };
+ obj.group = obj.canvas.createGroup();
+ obj.name = name;
+
+ canvas.parsesvg(obj.group, svg, {"font-mapper": obj.font_mapper} );
+
+ foreach(var key; obj.getKeys()) {
+ obj[key] = obj.group.getElementById(key);
+ };
+
+ foreach(var key; obj.getKeysBottom()) {
+ obj[key] = obj.group.getElementById(key);
+ };
+
+ obj.units = acconfig_weight_kgs.getValue();
+
+ # init
+ obj["APUGenOff"].hide();
+
+ obj.update_items = [
+ props.UpdateManager.FromHashValue("apuFlap",1, func(val) {
+ if (val) {
+ obj["APUFlapOpen"].show();
+ } else {
+ obj["APUFlapOpen"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashValue("apuNeedleRot",0.1, func(val) {
+ obj["APUN-needle"].setRotation((val + 90) * D2R);
+ }),
+ props.UpdateManager.FromHashValue("apuEgtRot",0.1, func(val) {
+ obj["APUEGT-needle"].setRotation((val + 90) * D2R);
+ }),
+ props.UpdateManager.FromHashValue("apuAvailable", nil, func(val) {
+ if (val) {
+ obj["APUAvail"].show();
+ } else {
+ obj["APUAvail"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashList(["apuRpm","apuEgt","apuMaster","apuGenPB"], nil, func(val) {
+ if (val.apuRpm > 0.001) {
+ obj["APUN"].setColor(0.0509,0.7529,0.2941);
+ obj["APUN"].setText(sprintf("%s", math.round(val.apuRpm)));
+ obj["APUN-needle"].show();
+ obj["APUEGT"].setColor(0.0509,0.7529,0.2941);
+ obj["APUEGT"].setText(sprintf("%s", math.round(val.apuEgt, 5)));
+ obj["APUEGT-needle"].show();
+ } else {
+ obj["APUN"].setColor(0.7333,0.3803,0);
+ obj["APUN"].setText(sprintf("%s", "XX"));
+ obj["APUN-needle"].hide();
+ obj["APUEGT"].setColor(0.7333,0.3803,0);
+ obj["APUEGT"].setText(sprintf("%s", "XX"));
+ obj["APUEGT-needle"].hide();
+ }
+
+ if (val.apuMaster or val.apuRpm >= 94.9) {
+ obj["APUGenbox"].show();
+ if (val.apuGenPB) {
+ obj["APUGenOff"].hide();
+ obj["APUGentext"].setColor(0.8078,0.8039,0.8078);
+ obj["APUGenHz"].show();
+ obj["APUGenVolt"].show();
+ obj["APUGenLoad"].show();
+ obj["text3724"].show();
+ obj["text3728"].show();
+ obj["text3732"].show();
+ } else {
+ obj["APUGenOff"].show();
+ obj["APUGentext"].setColor(0.7333,0.3803,0);
+ obj["APUGenHz"].hide();
+ obj["APUGenVolt"].hide();
+ obj["APUGenLoad"].hide();
+ obj["text3724"].hide();
+ obj["text3728"].hide();
+ obj["text3732"].hide();
+ }
+ } else {
+ obj["APUGentext"].setColor(0.8078,0.8039,0.8078);
+ obj["APUGenbox"].hide();
+ obj["APUGenHz"].hide();
+ obj["APUGenVolt"].hide();
+ obj["APUGenLoad"].hide();
+ obj["text3724"].hide();
+ obj["text3728"].hide();
+ obj["text3732"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashList(["apuFuelPumpsOff","apuFuelPump"], nil, func(val) {
+ if (val.apuFuelPumpsOff and !val.apuFuelPump) {
+ obj["APUfuelLO"].show();
+ } else {
+ obj["APUfuelLO"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashList(["apuRpm","apuOilLevel","gear0Wow"], nil, func(val) {
+ if (val.apuRpm >= 94.9 and val.gear0Wow and val.apuOilLevel < 3.69) {
+ obj["APU-low-oil"].show();
+ } else {
+ obj["APU-low-oil"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashList(["apuAdr","apuPsi","apuRpm"], nil, func(val) {
+ if (val.apuAdr and val.apuRpm > 0.001) {
+ obj["APUBleedPSI"].setColor(0.0509,0.7529,0.2941);
+ obj["APUBleedPSI"].setText(sprintf("%s", math.round(val.apuPsi)));
+ } else {
+ obj["APUBleedPSI"].setColor(0.7333,0.3803,0);
+ obj["APUBleedPSI"].setText(sprintf("%s", "XX"));
+ }
+ }),
+ props.UpdateManager.FromHashValue("apuLoad", 0.1, func(val) {
+ obj["APUGenLoad"].setText(sprintf("%s", math.round(val)));
+
+ if (val <= 100) {
+ obj["APUGenHz"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["APUGenHz"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashValue("apuHertz", 1, func(val) {
+ if (val == 0) {
+ obj["APUGenHz"].setText(sprintf("XX"));
+ } else {
+ obj["APUGenHz"].setText(sprintf("%s", math.round(val)));
+ }
+
+ if (val >= 390 and val <= 410) {
+ obj["APUGenHz"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["APUGenHz"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashValue("apuVolt", 0.1, func(val) {
+ obj["APUGenVolt"].setText(sprintf("%s", math.round(val)));
+
+ if (val >= 110 and val <= 120) {
+ obj["APUGenVolt"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["APUGenVolt"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashValue("apuGLC", nil, func(val) {
+ if (val) {
+ obj["APUGenOnline"].show();
+ } else {
+ obj["APUGenOnline"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashList(["apuBleedValvePos","apuBleedValveCmd"], nil, func(val) {
+ if (val.apuBleedValvePos == 1) {
+ obj["APUBleedValve"].setRotation(90 * D2R);
+ obj["APUBleedOnline"].show();
+ } else {
+ obj["APUBleedValve"].setRotation(0);
+ obj["APUBleedOnline"].hide();
+ }
+
+ if (val.apuBleedValveCmd == val.apuBleedValvePos) {
+ obj["APUBleedValveCrossBar"].setColor(0.0509,0.7529,0.2941);
+ obj["APUBleedValveCrossBar"].setColorFill(0.0509,0.7529,0.2941);
+ obj["APUBleedValve"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["APUBleedValveCrossBar"].setColor(0.7333,0.3803,0);
+ obj["APUBleedValveCrossBar"].setColorFill(0.7333,0.3803,0);
+ obj["APUBleedValve"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ ];
+
+ obj.displayedGForce = 0;
+ obj.updateItemsBottom = [
+ props.UpdateManager.FromHashValue("acconfigUnits", nil, func(val) {
+ obj.units = val;
+ if (val) {
+ obj["GW-weight-unit"].setText("KG");
+ } else {
+ obj["GW-weight-unit"].setText("LBS");
+ }
+ }),
+ props.UpdateManager.FromHashValue("hour", nil, func(val) {
+ obj["UTCh"].setText(sprintf("%02d", val));
+ }),
+ props.UpdateManager.FromHashValue("minute", nil, func(val) {
+ obj["UTCm"].setText(sprintf("%02d", val));
+ }),
+ props.UpdateManager.FromHashValue("gForce", 0.05, func(val) {
+ if (obj.displayedGForce) {
+ obj["GLoad"].setText("G.LOAD " ~ sprintf("%3.1f", val));
+ }
+ }),
+ props.UpdateManager.FromHashValue("gForceDisplay", nil, func(val) {
+ if ((val == 1 and !obj.displayedGForce) or (val != 0 and obj.displayedGForce)) {
+ obj.displayedGForce = 1;
+ obj["GLoad"].show();
+ } else {
+ obj.displayedGForce = 0;
+ obj["GLoad"].hide();
+ }
+ }),
+ ];
+ return obj;
+ },
+ getKeysBottom: func() {
+ return ["TAT","SAT","GW","UTCh","UTCm","GLoad","GW-weight-unit"];
+ },
+ getKeys: func() {
+ return ["APUN-needle","APUEGT-needle","APUN","APUEGT","APUAvail","APUFlapOpen","APUBleedValve","APUBleedOnline","APUBleedValveCrossBar","APUGenOnline","APUGenOff","APUGentext","APUGenLoad","APUGenbox","APUGenVolt","APUGenHz","APUBleedPSI","APUfuelLO","APU-low-oil","text3724","text3728","text3732"];
+ },
+ updateBottom: func(notification) {
+ foreach(var update_item_bottom; me.updateItemsBottom)
+ {
+ update_item_bottom.update(notification);
+ }
+
+ if (fmgc.FMGCInternal.fuelRequest and fmgc.FMGCInternal.blockConfirmed and !fmgc.FMGCInternal.fuelCalculating and notification.FWCPhase != 1) {
+ if (me.units) {
+ me["GW"].setText(sprintf("%s", math.round(fmgc.FMGCInternal.fuelPredGw * 1000 * LBS2KGS, 100)));
+ } else {
+ me["GW"].setText(sprintf("%s", math.round(fmgc.FMGCInternal.fuelPredGw * 1000, 100)));
+ }
+ me["GW"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ me["GW"].setText(sprintf("%s", "-----"));
+ me["GW"].setColor(0.0901,0.6039,0.7176);
+ }
+
+ if (dmc.DMController.DMCs[1].outputs[4] != nil) {
+ me["SAT"].setText(sprintf("%+2.0f", dmc.DMController.DMCs[1].outputs[4].getValue()));
+ me["SAT"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ me["SAT"].setText(sprintf("%s", "XX"));
+ me["SAT"].setColor(0.7333,0.3803,0);
+ }
+
+ if (dmc.DMController.DMCs[1].outputs[5] != nil) {
+ me["TAT"].setText(sprintf("%+2.0f", dmc.DMController.DMCs[1].outputs[5].getValue()));
+ me["TAT"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ me["TAT"].setText(sprintf("%s", "XX"));
+ me["TAT"].setColor(0.7333,0.3803,0);
+ }
+ },
+ update: func(notification) {
+ me.updatePower();
+
+ if (me.test.getVisible() == 1) {
+ me.updateTest(notification);
+ }
+
+ if (me.group.getVisible() == 0) {
+ return;
+ }
+
+ foreach(var update_item; me.update_items)
+ {
+ update_item.update(notification);
+ }
+
+ me.updateBottom(notification);
+ },
+ updatePower: func() {
+ if (me.name == ecam.SystemDisplayController.displayedPage.name) {
+ if (du4_lgt.getValue() > 0.01 and systems.ELEC.Bus.ac2.getValue() >= 110) {
+ if (du4_test_time.getValue() + du4_test_amount.getValue() >= pts.Sim.Time.elapsedSec.getValue()) {
+ me.group.setVisible(0);
+ me.test.setVisible(1);
+ } else {
+ me.group.setVisible(1);
+ me.test.setVisible(0);
+ }
+ } else {
+ me.group.setVisible(0);
+ me.test.setVisible(0);
+ }
+ } else {
+ me.group.setVisible(0);
+ # don't hide the test group; just let whichever page is active control it
+ }
+ },
+};
+
+var input = {
+ apuAdr: "/systems/navigation/adr/operating-1",
+ apuAvailable: "/systems/apu/available",
+ apuBleed: "/controls/pneumatics/switches/apu",
+ apuBleedValveCmd: "/systems/pneumatics/valves/apu-bleed-valve-cmd",
+ apuBleedValvePos: "/systems/pneumatics/valves/apu-bleed-valve",
+ apuEgt: "/systems/apu/egt-degC",
+ apuEgtRot: "/ECAM/Lower/APU-EGT",
+ apuGenPB: "/controls/electrical/switches/apu",
+ apuGLC: "/systems/electrical/relay/apu-glc/contact-pos",
+ apuFireBtn: "/controls/apu/fire-btn",
+ apuFlap: "/controls/apu/inlet-flap/position-norm",
+ apuFuelPump: "/systems/fuel/pumps/apu-operate",
+ apuFuelPumpsOff: "/systems/fuel/pumps/all-eng-pump-off",
+ apuOilLevel: "/systems/apu/oil/level-l",
+ apuMaster: "/controls/apu/master",
+ apuNeedleRot: "/ECAM/Lower/APU-N",
+ apuRpm: "/engines/engine[2]/n1",
+ apuPsi: "/systems/pneumatics/source/apu-psi",
+ apuLoad: "/systems/electrical/extra/apu-load",
+ apuHertz: "/systems/electrical/sources/apu/output-hertz",
+ apuVolt: "/systems/electrical/sources/apu/output-volt",
+};
+
+foreach (var name; keys(input)) {
+ emesary.GlobalTransmitter.NotifyAll(notifications.FrameNotificationAddProperty.new("A320 System Display", name, input[name]));
+}
\ No newline at end of file
diff --git a/Models/Instruments/Lower-ECAM/Lower-ECAM-base.nas b/Models/Instruments/Lower-ECAM/Lower-ECAM-base.nas
new file mode 100644
index 00000000..fbde5c93
--- /dev/null
+++ b/Models/Instruments/Lower-ECAM/Lower-ECAM-base.nas
@@ -0,0 +1,73 @@
+# A3XX Lower ECAM Canvas
+# Copyright (c) 2021 Josh Davidson (Octal450) and Jonathan Redpath
+
+var du4_lgt = props.globals.getNode("/controls/lighting/DU/du4", 1);
+var du4_test = props.globals.initNode("/instrumentation/du/du4-test", 0, "BOOL");
+var du4_test_time = props.globals.initNode("/instrumentation/du/du4-test-time", 0, "DOUBLE");
+var du4_test_amount = props.globals.initNode("/instrumentation/du/du4-test-amount", 0, "DOUBLE");
+var du4_offtime = props.globals.initNode("/instrumentation/du/du4-off-time", 0.0, "DOUBLE");
+
+var canvas_lowerECAM_base =
+{
+ init: func() {
+ me.canvas = canvas.new({
+ "name": "lowerECAM",
+ "size": [1024, 1024],
+ "view": [1024, 1024],
+ "mipmapping": 1
+ });
+ me.canvas.addPlacement({"node": "lecam.screen"});
+
+ me.font_mapper = func(family, weight) {
+ return "LiberationFonts/LiberationSans-Regular.ttf";
+ };
+
+ me.test = me.canvas.createGroup();
+
+ canvas.parsesvg(me.test, "Aircraft/A320-family/Models/Instruments/Common/res/du-test.svg", {"font-mapper": me.font_mapper} );
+ foreach(var key; me.getKeysTest()) {
+ me[key] = me.test.getElementById(key);
+ };
+ },
+ getKeysTest: func() {
+ return ["Test_white","Test_text"];
+ },
+ powerTransient: func() {
+ if (systems.ELEC.Bus.ac2.getValue() >= 110) {
+ if (du4_offtime.getValue() + 3 < pts.Sim.Time.elapsedSec.getValue()) {
+ if (pts.Gear.wow[0].getValue()) {
+ if (!acconfig.getBoolValue() and !du4_test.getBoolValue()) {
+ du4_test.setValue(1);
+ du4_test_amount.setValue(math.round((rand() * 5 ) + 35, 0.1));
+ du4_test_time.setValue(pts.Sim.Time.elapsedSec.getValue());
+ } else if (acconfig.getBoolValue() and !du4_test.getBoolValue()) {
+ du4_test.setValue(1);
+ du4_test_amount.setValue(math.round((rand() * 5 ) + 35, 0.1));
+ du4_test_time.setValue(pts.Sim.Time.elapsedSec.getValue() - 30);
+ }
+ } else {
+ du4_test.setValue(1);
+ du4_test_amount.setValue(0);
+ du4_test_time.setValue(-100);
+ }
+ }
+ } else {
+ du4_test.setValue(0);
+ du4_offtime.setValue(pts.Sim.Time.elapsedSec.getValue());
+ }
+ },
+ # Due to weirdness of the parents hash / me reference
+ # you need to access it using me.Test_white rather than
+ # me["Test_white"]
+ updateTest: func(notification) {
+ if (du4_test_time.getValue() + 1 >= notification.elapsedTime) {
+ me.Test_white.show();
+ me.Test_text.hide();
+ } else {
+ me.Test_white.hide();
+ me.Test_text.show();
+ }
+ },
+};
+
+canvas_lowerECAM_base.init();
\ No newline at end of file
diff --git a/Models/Instruments/Lower-ECAM/Lower-ECAM-bleed.nas b/Models/Instruments/Lower-ECAM/Lower-ECAM-bleed.nas
new file mode 100644
index 00000000..7c104add
--- /dev/null
+++ b/Models/Instruments/Lower-ECAM/Lower-ECAM-bleed.nas
@@ -0,0 +1,547 @@
+# A3XX Lower ECAM Canvas
+# Copyright (c) 2021 Josh Davidson (Octal450) and Jonathan Redpath
+
+var canvas_lowerECAMPageBleed =
+{
+ new: func(svg,name) {
+ var obj = {parents: [canvas_lowerECAMPageBleed,canvas_lowerECAM_base] };
+ obj.group = obj.canvas.createGroup();
+ obj.name = name;
+
+ canvas.parsesvg(obj.group, svg, {"font-mapper": obj.font_mapper} );
+
+ foreach(var key; obj.getKeys()) {
+ obj[key] = obj.group.getElementById(key);
+ };
+
+ foreach(var key; obj.getKeysBottom()) {
+ obj[key] = obj.group.getElementById(key);
+ };
+
+ obj.units = acconfig_weight_kgs.getValue();
+
+ # init
+
+ obj.update_items = [
+ props.UpdateManager.FromHashList(["BleedCrossbleedCmd","BleedCrossbleed"], nil, func(val) {
+ if (val.BleedCrossbleedCmd != val.BleedCrossbleed) {
+ obj["BLEED-XFEED"].setColor(0.7333,0.3803,0);
+ obj["BLEED-XFEED-Cross"].setColorFill(0.7333,0.3803,0);
+ } else {
+ obj["BLEED-XFEED"].setColor(0.0509,0.7529,0.2941);
+ obj["BLEED-XFEED-Cross"].setColorFill(0.0509,0.7529,0.2941);
+ }
+
+ if (val.BleedCrossbleedCmd == val.BleedCrossbleed) {
+ if (val.BleedCrossbleedCmd) {
+ obj["BLEED-XFEED"].setRotation(0);
+ } else {
+ obj["BLEED-XFEED"].setRotation(90 * D2R);
+ }
+ } else {
+ obj["BLEED-XFEED"].setRotation(45 * D2R);
+ }
+
+ if (val.BleedCrossbleed == 1) {
+ obj["BLEED-xbleedCenter"].show();
+ obj["BLEED-xbleedRight"].show();
+ } else {
+ obj["BLEED-xbleedCenter"].hide();
+ obj["BLEED-xbleedRight"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashList(["BleedHPValve1","BleedHPValve1Cmd"], nil, func(val) {
+ if (val.BleedHPValve1Cmd == 1) {
+ obj["BLEED-HP-Valve-1"].setRotation(90 * D2R);
+ obj["BLEED-HP-1-connection"].show();
+ } else {
+ obj["BLEED-HP-Valve-1"].setRotation(0);
+ obj["BLEED-HP-1-connection"].hide();
+ }
+
+ if (val.BleedHPValve1Cmd == val.BleedHPValve1) {
+ obj["BLEED-HP-Valve-1"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["BLEED-HP-Valve-1"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashList(["BleedHPValve2","BleedHPValve2Cmd"], nil, func(val) {
+ if (val.BleedHPValve2Cmd == 1) {
+ obj["BLEED-HP-Valve-2"].setRotation(90 * D2R);
+ obj["BLEED-HP-2-connection"].show();
+ } else {
+ obj["BLEED-HP-Valve-2"].setRotation(0);
+ obj["BLEED-HP-2-connection"].hide();
+ }
+
+ if (val.BleedHPValve2Cmd == val.BleedHPValve2) {
+ obj["BLEED-HP-Valve-2"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["BLEED-HP-Valve-2"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashList(["BleedPRVValve1Cmd","BleedPRVValve1"], nil, func(val) {
+ if (val.BleedPRVValve1 == 0) {
+ obj["BLEED-ENG-1"].setRotation(0);
+ } else {
+ obj["BLEED-ENG-1"].setRotation(90 * D2R);
+ }
+
+ if (val.BleedPRVValve1Cmd == val.BleedPRVValve1) {
+ obj["BLEED-ENG-1"].setColor(0.0509,0.7529,0.2941);
+ obj["BLEED-ENG-1-Cross"].setColorFill(0.0509,0.7529,0.2941);
+ } else {
+ obj["BLEED-ENG-1"].setColor(0.7333,0.3803,0);
+ obj["BLEED-ENG-1-Cross"].setColorFill(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashList(["BleedPRVValve2Cmd","BleedPRVValve2"], nil, func(val) {
+ if (val.BleedPRVValve2 == 0) {
+ obj["BLEED-ENG-2"].setRotation(0);
+ } else {
+ obj["BLEED-ENG-2"].setRotation(90 * D2R);
+ }
+
+ if (val.BleedPRVValve2Cmd == val.BleedPRVValve2) {
+ obj["BLEED-ENG-2"].setColor(0.0509,0.7529,0.2941);
+ obj["BLEED-ENG-2-Cross"].setColorFill(0.0509,0.7529,0.2941);
+ } else {
+ obj["BLEED-ENG-2"].setColor(0.7333,0.3803,0);
+ obj["BLEED-ENG-2-Cross"].setColorFill(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashValue("gear1Wow", nil, func(val) {
+ if (val) {
+ obj["BLEED-GND"].show();
+ } else {
+ obj["BLEED-GND"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashValue("IceWingSw", nil, func(val) {
+ if (val) {
+ obj["BLEED-Anti-Ice-Left"].show();
+ obj["BLEED-Anti-Ice-Right"].show();
+ } else {
+ obj["BLEED-Anti-Ice-Left"].hide();
+ obj["BLEED-Anti-Ice-Right"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashValue("N2_actual_1", nil, func(val) {
+ if (val >= 59) {
+ obj["BLEED-ENG-1-label"].setColor(0.8078,0.8039,0.8078);
+ } else {
+ obj["BLEED-ENG-1-label"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashValue("N2_actual_2", nil, func(val) {
+ if (val >= 59) {
+ obj["BLEED-ENG-2-label"].setColor(0.8078,0.8039,0.8078);
+ } else {
+ obj["BLEED-ENG-2-label"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashList(["BleedBMC1Working","BleedPreCoolerPSI1"], nil, func(val) {
+ if (val.BleedBMC1Working) {
+ if (val.BleedPreCoolerPSI1 >= 98) {
+ obj["BLEED-Precooler-1-Inlet-Press"].setText(sprintf("%s", 98));
+ } else {
+ obj["BLEED-Precooler-1-Inlet-Press"].setText(sprintf("%s", math.round(val.BleedPreCoolerPSI1,2)));
+ }
+ if (val.BleedPreCoolerPSI1 < 4 or val.BleedPreCoolerPSI1 > 57) {
+ obj["BLEED-Precooler-1-Inlet-Press"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["BLEED-Precooler-1-Inlet-Press"].setColor(0.0509,0.7529,0.2941);
+ }
+ } else {
+ obj["BLEED-Precooler-1-Inlet-Press"].setText(sprintf("%s", "XX"));
+ obj["BLEED-Precooler-1-Inlet-Press"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashList(["BleedBMC2Working","BleedPreCoolerPSI2"], nil, func(val) {
+ if (val.BleedBMC2Working) {
+ if (val.BleedPreCoolerPSI2 >= 98) {
+ obj["BLEED-Precooler-2-Inlet-Press"].setText(sprintf("%s", 98));
+ } else {
+ obj["BLEED-Precooler-2-Inlet-Press"].setText(sprintf("%s", math.round(val.BleedPreCoolerPSI2,2)));
+ }
+
+ if (val.BleedPreCoolerPSI2 < 4 or val.BleedPreCoolerPSI2 > 57) {
+ obj["BLEED-Precooler-2-Inlet-Press"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["BLEED-Precooler-2-Inlet-Press"].setColor(0.0509,0.7529,0.2941);
+ }
+ } else {
+ obj["BLEED-Precooler-2-Inlet-Press"].setText(sprintf("%s", "XX"));
+ obj["BLEED-Precooler-2-Inlet-Press"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashList(["BleedBMC1Working","BleedPreCoolerTemp1","BleedPRVValve1Cmd","BleedPreCoolerOvht1"], nil, func(val) {
+ if (val.BleedBMC1Working) {
+ if (val.BleedPreCoolerTemp1 >= 510) {
+ obj["BLEED-Precooler-1-Outlet-Temp"].setText(sprintf("%s", 510));
+ } else {
+ obj["BLEED-Precooler-1-Outlet-Temp"].setText(sprintf("%s", math.round(val.BleedPreCoolerTemp1, 5)));
+ }
+
+ if (val.BleedPRVValve1Cmd and (val.BleedPreCoolerTemp1 < 150 or val.BleedPreCoolerOvht1)) {
+ obj["BLEED-Precooler-1-Outlet-Temp"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["BLEED-Precooler-1-Outlet-Temp"].setColor(0.0509,0.7529,0.2941);
+ }
+ } else {
+ obj["BLEED-Precooler-1-Outlet-Temp"].setText(sprintf("%s", "XX"));
+ obj["BLEED-Precooler-1-Outlet-Temp"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashList(["BleedBMC2Working","BleedPreCoolerTemp2","BleedPRVValve2Cmd","BleedPreCoolerOvht2"], nil, func(val) {
+ if (val.BleedBMC2Working) {
+ if (val.BleedPreCoolerTemp2 >= 510) {
+ obj["BLEED-Precooler-2-Outlet-Temp"].setText(sprintf("%s", 510));
+ } else {
+ obj["BLEED-Precooler-2-Outlet-Temp"].setText(sprintf("%s", math.round(val.BleedPreCoolerTemp2, 5)));
+ }
+
+ if (val.BleedPRVValve2Cmd and (val.BleedPreCoolerTemp2 < 150 or val.BleedPreCoolerOvht2)) {
+ obj["BLEED-Precooler-2-Outlet-Temp"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["BLEED-Precooler-2-Outlet-Temp"].setColor(0.0509,0.7529,0.2941);
+ }
+ } else {
+ obj["BLEED-Precooler-2-Outlet-Temp"].setText(sprintf("%s", "XX"));
+ obj["BLEED-Precooler-2-Outlet-Temp"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashValue("Pack1Bypass", 1, func(val) {
+ obj["BLEED-Pack-1-Bypass-needle"].setRotation((val - 50) * D2R);
+ }),
+ props.UpdateManager.FromHashValue("Pack2Bypass", 1, func(val) {
+ obj["BLEED-Pack-2-Bypass-needle"].setRotation((val - 50) * D2R);
+ }),
+ props.UpdateManager.FromHashValue("Pack1OutTemp", 0.25, func(val) {
+ obj["BLEED-Pack-1-Out-Temp"].setText(sprintf("%s", math.round(val, 5)));
+ if (val > 90) {
+ obj["BLEED-Pack-1-Out-Temp"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["BLEED-Pack-1-Out-Temp"].setColor(0.0509,0.7529,0.2941);
+ }
+ }),
+ props.UpdateManager.FromHashValue("Pack2OutTemp", 0.25, func(val) {
+ obj["BLEED-Pack-2-Out-Temp"].setText(sprintf("%s", math.round(val, 5)));
+ if (val > 90) {
+ obj["BLEED-Pack-2-Out-Temp"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["BLEED-Pack-2-Out-Temp"].setColor(0.0509,0.7529,0.2941);
+ }
+ }),
+ props.UpdateManager.FromHashValue("Pack1OutletTemp", 0.25, func(val) {
+ obj["BLEED-Pack-1-Comp-Out-Temp"].setText(sprintf("%s", math.round(val, 5)));
+ if (val > 230) {
+ obj["BLEED-Pack-1-Comp-Out-Temp"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["BLEED-Pack-1-Comp-Out-Temp"].setColor(0.0509,0.7529,0.2941);
+ }
+ }),
+ props.UpdateManager.FromHashValue("Pack2OutletTemp", 0.25, func(val) {
+ obj["BLEED-Pack-2-Comp-Out-Temp"].setText(sprintf("%s", math.round(val, 5)));
+ if (val > 230) {
+ obj["BLEED-Pack-2-Comp-Out-Temp"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["BLEED-Pack-2-Comp-Out-Temp"].setColor(0.0509,0.7529,0.2941);
+ }
+ }),
+ props.UpdateManager.FromHashValue("Pack1FlowOutput", 0.5, func(val) {
+ obj["BLEED-Pack-1-Packflow-needle"].setRotation(val * D2R);
+
+ }),
+ props.UpdateManager.FromHashValue("Pack2FlowOutput", 0.5, func(val) {
+ obj["BLEED-Pack-2-Packflow-needle"].setRotation(val * D2R);
+ }),
+ props.UpdateManager.FromHashList(["Pack1Switch","flowCtlValve1"], nil, func(val) {
+ if (val.flowCtlValve1 == 0) {
+ obj["BLEED-Pack-1-Packflow-needle"].setColorFill(0.7333,0.3803,0);
+ obj["BLEED-Pack-1-Flow-Valve"].setRotation(90 * D2R);
+ } else {
+ obj["BLEED-Pack-1-Packflow-needle"].setColorFill(0.0509,0.7529,0.2941);
+ obj["BLEED-Pack-1-Flow-Valve"].setRotation(0);
+ }
+
+ if (val.flowCtlValve1 == val.Pack1Switch) {
+ obj["BLEED-Pack-1-Flow-Valve"].setColor(0.0509,0.7529,0.2941);
+ obj["BLEED-Pack-1-Flow-Valve-Cross"].setColorFill(0.0509,0.7529,0.2941);
+ } else {
+ obj["BLEED-Pack-1-Flow-Valve"].setColor(0.7333,0.3803,0);
+ obj["BLEED-Pack-1-Flow-Valve-Cross"].setColorFill(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashList(["Pack2Switch","flowCtlValve2"], nil, func(val) {
+ if (val.flowCtlValve2 == 0) {
+ obj["BLEED-Pack-2-Packflow-needle"].setColorFill(0.7333,0.3803,0);
+ obj["BLEED-Pack-2-Flow-Valve"].setRotation(90 * D2R);
+ } else {
+ obj["BLEED-Pack-2-Packflow-needle"].setColorFill(0.0509,0.7529,0.2941);
+ obj["BLEED-Pack-2-Flow-Valve"].setRotation(0);
+ }
+
+ if (val.flowCtlValve2 == val.Pack2Switch) {
+ obj["BLEED-Pack-2-Flow-Valve"].setColor(0.0509,0.7529,0.2941);
+ obj["BLEED-Pack-2-Flow-Valve-Cross"].setColorFill(0.0509,0.7529,0.2941);
+ } else {
+ obj["BLEED-Pack-2-Flow-Valve"].setColor(0.7333,0.3803,0);
+ obj["BLEED-Pack-2-Flow-Valve-Cross"].setColorFill(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashList(["flowCtlValve1","flowCtlValve2","RamAirValve","gear1Wow"], nil, func(val) {
+ if (val.RamAirValve == 0) {
+ obj["BLEED-Ram-Air"].setRotation(90 * D2R);
+ obj["BLEED-Ram-Air"].setColor(0.0509,0.7529,0.2941);
+ obj["BLEED-Ram-Air"].setColorFill(0.0509,0.7529,0.2941);
+ obj["BLEED-Ram-Air-Cross"].setColorFill(0.0509,0.7529,0.2941);
+ obj["BLEED-Ram-Air-connection"].hide();
+ } elsif (val.RamAirValve) {
+ obj["BLEED-Ram-Air"].setRotation(0);
+ if (val.gear1Wow) {
+ obj["BLEED-Ram-Air"].setColor(0.7333,0.3803,0);
+ obj["BLEED-Ram-Air"].setColorFill(0.7333,0.3803,0);
+ obj["BLEED-Ram-Air-Cross"].setColorFill(0.7333,0.3803,0);
+ obj["BLEED-Ram-Air-connection"].setColorFill(0.7333,0.3803,0);
+ obj["BLEED-Ram-Air-connection"].setColorFill(0.7333,0.3803,0);
+ } else {
+ obj["BLEED-Ram-Air"].setColor(0.0509,0.7529,0.2941);
+ obj["BLEED-Ram-Air"].setColorFill(0.0509,0.7529,0.2941);
+ obj["BLEED-Ram-Air-Cross"].setColorFill(0.0509,0.7529,0.2941);
+ obj["BLEED-Ram-Air-connection"].setColor(0.0509,0.7529,0.2941);
+ obj["BLEED-Ram-Air-connection"].setColorFill(0.0509,0.7529,0.2941);
+ }
+ obj["BLEED-Ram-Air-connection"].show();
+ } else {
+ obj["BLEED-Ram-Air"].setRotation(45 * D2R);
+ obj["BLEED-Ram-Air"].setColor(0.7333,0.3803,0);
+ obj["BLEED-Ram-Air"].setColorFill(0.7333,0.3803,0);
+ obj["BLEED-Ram-Air-Cross"].setColorFill(0.7333,0.3803,0);
+ obj["BLEED-Ram-Air-connection"].setColorFill(0.7333,0.3803,0);
+ obj["BLEED-Ram-Air-connection"].setColorFill(0.7333,0.3803,0);
+ obj["BLEED-Ram-Air-connection"].show();
+ }
+
+ if (val.flowCtlValve1 == 0 and val.flowCtlValve2 == 0) {
+ if (val.gear1Wow or val.RamAirValve != 1) {
+ obj["BLEED-cond-1"].setColor(0.7333,0.3803,0);
+ obj["BLEED-cond-2"].setColor(0.7333,0.3803,0);
+ obj["BLEED-cond-3"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["BLEED-cond-1"].setColor(0.0509,0.7529,0.2941);
+ obj["BLEED-cond-2"].setColor(0.0509,0.7529,0.2941);
+ obj["BLEED-cond-3"].setColor(0.0509,0.7529,0.2941);
+ }
+ } else {
+ obj["BLEED-cond-1"].setColor(0.0509,0.7529,0.2941);
+ obj["BLEED-cond-2"].setColor(0.0509,0.7529,0.2941);
+ obj["BLEED-cond-3"].setColor(0.0509,0.7529,0.2941);
+ }
+
+ if (val.flowCtlValve1 == 0) {
+ obj["BLEED-Pack-1-connection"].setColor(0.7333,0.3803,0);
+ obj["BLEED-Pack-1-connection"].setColorFill(0.7333,0.3803,0);
+ } else {
+ obj["BLEED-Pack-1-connection"].setColor(0.0509,0.7529,0.2941);
+ obj["BLEED-Pack-1-connection"].setColorFill(0.0509,0.7529,0.2941);
+ }
+
+ if (val.flowCtlValve2 == 0) {
+ obj["BLEED-Pack-2-connection"].setColor(0.7333,0.3803,0);
+ obj["BLEED-Pack-2-connection"].setColorFill(0.7333,0.3803,0);
+ } else {
+ obj["BLEED-Pack-2-connection"].setColor(0.0509,0.7529,0.2941);
+ obj["BLEED-Pack-2-connection"].setColorFill(0.0509,0.7529,0.2941);
+ }
+ }),
+ props.UpdateManager.FromHashList(["BleedCrossbleed","apuMaster","apuBleedValvePos","ApuBleedNotOn"], nil, func(val) {
+ if (val.apuMaster) {
+ obj["BLEED-APU-LINES"].show();
+ if (val.apuBleedValvePos == 1) {
+ obj["BLEED-APU-CIRCLE"].setRotation(0);
+ obj["BLEED-APU-connectionTop"].show();
+ obj["BLEED-xbleedLeft"].show();
+ } else {
+ obj["BLEED-APU-CIRCLE"].setRotation(90 * D2R);
+ obj["BLEED-APU-connectionTop"].hide();
+ if (val.BleedCrossbleed != 1) {
+ obj["BLEED-xbleedLeft"].hide();
+ } else {
+ obj["BLEED-xbleedLeft"].show();
+ }
+ }
+ if (val.ApuBleedNotOn != 1) {
+ obj["BLEED-APU-CIRCLE"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["BLEED-APU-CIRCLE"].setColor(0.7333,0.3803,0);
+ }
+ } else {
+ if (val.BleedCrossbleed != 1) {
+ obj["BLEED-xbleedLeft"].hide();
+ } else {
+ obj["BLEED-xbleedLeft"].show();
+ }
+ obj["BLEED-APU-LINES"].hide();
+ obj["BLEED-APU-connectionTop"].hide();
+ }
+ }),
+ ];
+
+ obj.displayedGForce = 0;
+ obj.updateItemsBottom = [
+ props.UpdateManager.FromHashValue("acconfigUnits", nil, func(val) {
+ obj.units = val;
+ if (val) {
+ obj["GW-weight-unit"].setText("KG");
+ } else {
+ obj["GW-weight-unit"].setText("LBS");
+ }
+ }),
+ props.UpdateManager.FromHashValue("hour", nil, func(val) {
+ obj["UTCh"].setText(sprintf("%02d", val));
+ }),
+ props.UpdateManager.FromHashValue("minute", nil, func(val) {
+ obj["UTCm"].setText(sprintf("%02d", val));
+ }),
+ props.UpdateManager.FromHashValue("gForce", 0.05, func(val) {
+ if (obj.displayedGForce) {
+ obj["GLoad"].setText("G.LOAD " ~ sprintf("%3.1f", val));
+ }
+ }),
+ props.UpdateManager.FromHashValue("gForceDisplay", nil, func(val) {
+ if ((val == 1 and !obj.displayedGForce) or (val != 0 and obj.displayedGForce)) {
+ obj.displayedGForce = 1;
+ obj["GLoad"].show();
+ } else {
+ obj.displayedGForce = 0;
+ obj["GLoad"].hide();
+ }
+ }),
+ ];
+ return obj;
+ },
+ getKeysBottom: func() {
+ return ["TAT","SAT","GW","UTCh","UTCm","GLoad","GW-weight-unit"];
+ },
+ getKeys: func() {
+ return["TAT","SAT","GW","UTCh","UTCm","GLoad","GW-weight-unit", "BLEED-XFEED", "BLEED-Ram-Air", "BLEED-Ram-Air-Cross", "BLEED-APU-CIRCLE", "BLEED-HP-Valve-1", "BLEED-XFEED-Cross",
+ "BLEED-APU-LINES","BLEED-ENG-1", "BLEED-HP-Valve-2", "BLEED-ENG-2", "BLEED-Precooler-1-Inlet-Press", "BLEED-Precooler-1-Outlet-Temp",
+ "BLEED-Precooler-2-Inlet-Press", "BLEED-Precooler-2-Outlet-Temp", "BLEED-ENG-1-label", "BLEED-ENG-2-label",
+ "BLEED-GND", "BLEED-Pack-1-Flow-Valve", "BLEED-Pack-2-Flow-Valve", "BLEED-Pack-1-Out-Temp","BLEED-APU-connectionTop",
+ "BLEED-Pack-1-Comp-Out-Temp", "BLEED-Pack-1-Packflow-needle", "BLEED-Pack-1-Bypass-needle", "BLEED-Pack-2-Out-Temp",
+ "BLEED-Pack-2-Bypass-needle", "BLEED-Pack-2-Comp-Out-Temp", "BLEED-Pack-2-Packflow-needle", "BLEED-Anti-Ice-Left",
+ "BLEED-Anti-Ice-Right", "BLEED-HP-2-connection", "BLEED-HP-1-connection", "BLEED-ANTI-ICE-ARROW-LEFT", "BLEED-ANTI-ICE-ARROW-RIGHT",
+ "BLEED-xbleedLeft","BLEED-xbleedCenter","BLEED-xbleedRight","BLEED-cond-1","BLEED-cond-2","BLEED-cond-3","BLEED-Ram-Air-connection","BLEED-ENG-1-Cross","BLEED-ENG-2-Cross",
+ "BLEED-Pack-1-Flow-Valve-Cross","BLEED-Pack-2-Flow-Valve-Cross","BLEED-Pack-1-connection","BLEED-Pack-2-connection"];
+ },
+ updateBottom: func(notification) {
+ foreach(var update_item_bottom; me.updateItemsBottom)
+ {
+ update_item_bottom.update(notification);
+ }
+
+ if (fmgc.FMGCInternal.fuelRequest and fmgc.FMGCInternal.blockConfirmed and !fmgc.FMGCInternal.fuelCalculating and notification.FWCPhase != 1) {
+ if (me.units) {
+ me["GW"].setText(sprintf("%s", math.round(fmgc.FMGCInternal.fuelPredGw * 1000 * LBS2KGS, 100)));
+ } else {
+ me["GW"].setText(sprintf("%s", math.round(fmgc.FMGCInternal.fuelPredGw * 1000, 100)));
+ }
+ me["GW"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ me["GW"].setText(sprintf("%s", "-----"));
+ me["GW"].setColor(0.0901,0.6039,0.7176);
+ }
+
+ if (dmc.DMController.DMCs[1].outputs[4] != nil) {
+ me["SAT"].setText(sprintf("%+2.0f", dmc.DMController.DMCs[1].outputs[4].getValue()));
+ me["SAT"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ me["SAT"].setText(sprintf("%s", "XX"));
+ me["SAT"].setColor(0.7333,0.3803,0);
+ }
+
+ if (dmc.DMController.DMCs[1].outputs[5] != nil) {
+ me["TAT"].setText(sprintf("%+2.0f", dmc.DMController.DMCs[1].outputs[5].getValue()));
+ me["TAT"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ me["TAT"].setText(sprintf("%s", "XX"));
+ me["TAT"].setColor(0.7333,0.3803,0);
+ }
+ },
+ update: func(notification) {
+ me.updatePower();
+
+ if (me.test.getVisible() == 1) {
+ me.updateTest(notification);
+ }
+
+ if (me.group.getVisible() == 0) {
+ return;
+ }
+
+ foreach(var update_item; me.update_items)
+ {
+ update_item.update(notification);
+ }
+
+ me.updateBottom(notification);
+ },
+ updatePower: func() {
+ if (me.name == ecam.SystemDisplayController.displayedPage.name) {
+ if (du4_lgt.getValue() > 0.01 and systems.ELEC.Bus.ac2.getValue() >= 110) {
+ if (du4_test_time.getValue() + du4_test_amount.getValue() >= pts.Sim.Time.elapsedSec.getValue()) {
+ me.group.setVisible(0);
+ me.test.setVisible(1);
+ } else {
+ me.group.setVisible(1);
+ me.test.setVisible(0);
+ }
+ } else {
+ me.group.setVisible(0);
+ me.test.setVisible(0);
+ }
+ } else {
+ me.group.setVisible(0);
+ # don't hide the test group; just let whichever page is active control it
+ }
+ },
+};
+
+var input = {
+ ApuBleedNotOn: "/systems/pneumatics/warnings/apu-bleed-not-on",
+ BleedBMC1Working: "/systems/pneumatics/indicating/bmc1-working",
+ BleedBMC2Working: "/systems/pneumatics/indicating/bmc2-working",
+ BleedCrossbleedCmd: "/systems/pneumatics/valves/crossbleed-valve-cmd",
+ BleedCrossbleed: "/systems/pneumatics/valves/crossbleed-valve",
+ BleedHPValve1: "/systems/pneumatics/valves/engine-1-hp-valve",
+ BleedHPValve2: "/systems/pneumatics/valves/engine-2-hp-valve",
+ BleedHPValve1Cmd: "/systems/pneumatics/valves/engine-1-hp-valve-cmd",
+ BleedHPValve2Cmd: "/systems/pneumatics/valves/engine-2-hp-valve-cmd",
+ BleedPRVValve1Cmd: "/controls/pneumatics/switches/bleed-1",
+ BleedPRVValve2Cmd: "/controls/pneumatics/switches/bleed-2",
+ BleedPRVValve1: "/systems/pneumatics/valves/engine-1-prv-valve",
+ BleedPRVValve2: "/systems/pneumatics/valves/engine-2-prv-valve",
+ BleedPreCoolerPSI1: "/systems/pneumatics/psi/engine-1-psi",
+ BleedPreCoolerPSI2: "/systems/pneumatics/psi/engine-2-psi",
+ BleedPreCoolerTemp1: "/systems/pneumatics/precooler/temp-1",
+ BleedPreCoolerTemp2: "/systems/pneumatics/precooler/temp-2",
+ BleedPreCoolerOvht1: "/systems/pneumatics/precooler/ovht-1",
+ BleedPreCoolerOvht2: "/systems/pneumatics/precooler/ovht-2",
+ Pack1Bypass: "/systems/pneumatics/pack-1-bypass",
+ Pack2Bypass: "/systems/pneumatics/pack-2-bypass",
+ Pack1FlowOutput: "/ECAM/Lower/pack-1-flow-output",
+ Pack2FlowOutput: "/ECAM/Lower/pack-2-flow-output",
+ Pack1OutTemp: "/systems/air-conditioning/packs/pack-1-output-temp",
+ Pack2OutTemp: "/systems/air-conditioning/packs/pack-2-output-temp",
+ Pack1OutletTemp: "/systems/air-conditioning/packs/pack-1-outlet-temp",
+ Pack2OutletTemp: "/systems/air-conditioning/packs/pack-2-outlet-temp",
+ Pack1Switch: "/controls/pneumatics/switches/pack-1",
+ Pack2Switch: "/controls/pneumatics/switches/pack-2",
+ RamAirValve: "/systems/air-conditioning/valves/ram-air",
+ IceWingSw: "/controls/ice-protection/wing",
+};
+
+foreach (var name; keys(input)) {
+ emesary.GlobalTransmitter.NotifyAll(notifications.FrameNotificationAddProperty.new("A320 System Display", name, input[name]));
+}
\ No newline at end of file
diff --git a/Models/Instruments/Lower-ECAM/Lower-ECAM-cond.nas b/Models/Instruments/Lower-ECAM/Lower-ECAM-cond.nas
new file mode 100644
index 00000000..74b0732a
--- /dev/null
+++ b/Models/Instruments/Lower-ECAM/Lower-ECAM-cond.nas
@@ -0,0 +1,209 @@
+# A3XX Lower ECAM Canvas
+# Copyright (c) 2021 Josh Davidson (Octal450) and Jonathan Redpath
+
+var canvas_lowerECAMPageCond =
+{
+ new: func(svg,name) {
+ var obj = {parents: [canvas_lowerECAMPageCond,canvas_lowerECAM_base] };
+ obj.group = obj.canvas.createGroup();
+ obj.name = name;
+
+ canvas.parsesvg(obj.group, svg, {"font-mapper": obj.font_mapper} );
+
+ foreach(var key; obj.getKeys()) {
+ obj[key] = obj.group.getElementById(key);
+ };
+
+ foreach(var key; obj.getKeysBottom()) {
+ obj[key] = obj.group.getElementById(key);
+ };
+
+ obj.units = acconfig_weight_kgs.getValue();
+
+ # init
+ obj["CONDFanFwdFault"].hide();
+ obj["CONDFanAftFault"].hide();
+
+ # aft cargo ventilation disabled
+ obj["CargoCond"].hide();
+
+ obj.update_items = [
+ props.UpdateManager.FromHashValue("condDuctTempCockpit", 0.5, func(val) {
+ obj["CONDDuctTempCKPT"].setText(sprintf("%2.0f",val));
+ }),
+ props.UpdateManager.FromHashValue("condDuctTempAft", 0.5, func(val) {
+ obj["CONDDuctTempAFT"].setText(sprintf("%2.0f",val));
+ }),
+ props.UpdateManager.FromHashValue("condDuctTempFwd", 0.5, func(val) {
+ obj["CONDDuctTempFWD"].setText(sprintf("%2.0f",val));
+ }),
+ props.UpdateManager.FromHashValue("condTempCockpit", 0.5, func(val) {
+ obj["CONDTempCKPT"].setText(sprintf("%2.0f",val));
+ }),
+ props.UpdateManager.FromHashValue("condTempAft", 0.5, func(val) {
+ obj["CONDTempAFT"].setText(sprintf("%2.0f",val));
+ }),
+ props.UpdateManager.FromHashValue("condTempFwd", 0.5, func(val) {
+ obj["CONDTempFWD"].setText(sprintf("%2.0f",val));
+ }),
+ props.UpdateManager.FromHashValue("condTrimCockpit", 0.01, func(val) {
+ obj["CONDTrimValveCKPT"].setRotation(val * D2R);
+ }),
+ props.UpdateManager.FromHashValue("condTrimAft", 0.01, func(val) {
+ obj["CONDTrimValveAFT"].setRotation(val * D2R);
+ }),
+ props.UpdateManager.FromHashValue("condTrimFwd", 0.01, func(val) {
+ obj["CONDTrimValveFWD"].setRotation(val * D2R);
+ }),
+ props.UpdateManager.FromHashList(["condHotAirSwitch","condHotAirValve","condHotAirCmd"], nil, func(val) {
+ if (!val.condHotAirSwitch or (val.condHotAirCmd == 1 and val.condHotAirValve == 0)) {
+ obj["CONDHotAirValve"].setRotation(90 * D2R);
+ obj["CONDHotAirValve"].setColor(0.7333,0.3803,0);
+ obj["CONDHotAirValveCross"].setColorFill(0.7333,0.3803,0);
+ } elsif (val.condHotAirCmd == 0 and val.condHotAirValve == 0) {
+ obj["CONDHotAirValve"].setRotation(90 * D2R);
+ obj["CONDHotAirValve"].setColor(0.0509,0.7529,0.2941);
+ obj["CONDHotAirValveCross"].setColorFill(0.0509,0.7529,0.2941);
+ } elsif (val.condHotAirCmd == 0 and val.condHotAirValve != 0) {
+ obj["CONDHotAirValve"].setRotation(0);
+ obj["CONDHotAirValve"].setColor(0.7333,0.3803,0);
+ obj["CONDHotAirValveCross"].setColorFill(0.7333,0.3803,0);
+ } else {
+ obj["CONDHotAirValve"].setRotation(0);
+ obj["CONDHotAirValve"].setColor(0.0509,0.7529,0.2941);
+ obj["CONDHotAirValveCross"].setColorFill(0.0509,0.7529,0.2941);
+ }
+ }),
+ ];
+
+ obj.displayedGForce = 0;
+ obj.updateItemsBottom = [
+ props.UpdateManager.FromHashValue("acconfigUnits", nil, func(val) {
+ obj.units = val;
+ if (val) {
+ obj["GW-weight-unit"].setText("KG");
+ } else {
+ obj["GW-weight-unit"].setText("LBS");
+ }
+ }),
+ props.UpdateManager.FromHashValue("hour", nil, func(val) {
+ obj["UTCh"].setText(sprintf("%02d", val));
+ }),
+ props.UpdateManager.FromHashValue("minute", nil, func(val) {
+ obj["UTCm"].setText(sprintf("%02d", val));
+ }),
+ props.UpdateManager.FromHashValue("gForce", 0.05, func(val) {
+ if (obj.displayedGForce) {
+ obj["GLoad"].setText("G.LOAD " ~ sprintf("%3.1f", val));
+ }
+ }),
+ props.UpdateManager.FromHashValue("gForceDisplay", nil, func(val) {
+ if ((val == 1 and !obj.displayedGForce) or (val != 0 and obj.displayedGForce)) {
+ obj.displayedGForce = 1;
+ obj["GLoad"].show();
+ } else {
+ obj.displayedGForce = 0;
+ obj["GLoad"].hide();
+ }
+ }),
+ ];
+ return obj;
+ },
+ getKeysBottom: func() {
+ return ["TAT","SAT","GW","UTCh","UTCm","GLoad","GW-weight-unit"];
+ },
+ getKeys: func() {
+ return["CargoCond","CONDHotAirValve","CONDFanFwdFault","CONDFanAftFault","CONDTrimValveCKPT","CONDTrimValveAFT","CONDTrimValveFWD","CONDDuctTempCKPT",
+ "CONDDuctTempAFT","CONDDuctTempFWD","CONDTempCKPT","CONDTempAFT","CONDTempFWD","CONDHotAirValveCross"];
+ },
+ updateBottom: func(notification) {
+ foreach(var update_item_bottom; me.updateItemsBottom)
+ {
+ update_item_bottom.update(notification);
+ }
+
+ if (fmgc.FMGCInternal.fuelRequest and fmgc.FMGCInternal.blockConfirmed and !fmgc.FMGCInternal.fuelCalculating and notification.FWCPhase != 1) {
+ if (me.units) {
+ me["GW"].setText(sprintf("%s", math.round(fmgc.FMGCInternal.fuelPredGw * 1000 * LBS2KGS, 100)));
+ } else {
+ me["GW"].setText(sprintf("%s", math.round(fmgc.FMGCInternal.fuelPredGw * 1000, 100)));
+ }
+ me["GW"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ me["GW"].setText(sprintf("%s", "-----"));
+ me["GW"].setColor(0.0901,0.6039,0.7176);
+ }
+
+ if (dmc.DMController.DMCs[1].outputs[4] != nil) {
+ me["SAT"].setText(sprintf("%+2.0f", dmc.DMController.DMCs[1].outputs[4].getValue()));
+ me["SAT"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ me["SAT"].setText(sprintf("%s", "XX"));
+ me["SAT"].setColor(0.7333,0.3803,0);
+ }
+
+ if (dmc.DMController.DMCs[1].outputs[5] != nil) {
+ me["TAT"].setText(sprintf("%+2.0f", dmc.DMController.DMCs[1].outputs[5].getValue()));
+ me["TAT"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ me["TAT"].setText(sprintf("%s", "XX"));
+ me["TAT"].setColor(0.7333,0.3803,0);
+ }
+ },
+ update: func(notification) {
+ me.updatePower();
+
+ if (me.test.getVisible() == 1) {
+ me.updateTest(notification);
+ }
+
+ if (me.group.getVisible() == 0) {
+ return;
+ }
+
+ foreach(var update_item; me.update_items)
+ {
+ update_item.update(notification);
+ }
+
+ me.updateBottom(notification);
+ },
+ updatePower: func() {
+ if (me.name == ecam.SystemDisplayController.displayedPage.name) {
+ if (du4_lgt.getValue() > 0.01 and systems.ELEC.Bus.ac2.getValue() >= 110) {
+ if (du4_test_time.getValue() + du4_test_amount.getValue() >= pts.Sim.Time.elapsedSec.getValue()) {
+ me.group.setVisible(0);
+ me.test.setVisible(1);
+ } else {
+ me.group.setVisible(1);
+ me.test.setVisible(0);
+ }
+ } else {
+ me.group.setVisible(0);
+ me.test.setVisible(0);
+ }
+ } else {
+ me.group.setVisible(0);
+ # don't hide the test group; just let whichever page is active control it
+ }
+ },
+};
+
+var input = {
+ condDuctTempCockpit: "/systems/air-conditioning/temperatures/cockpit-duct",
+ condDuctTempAft: "/systems/air-conditioning/temperatures/cabin-aft-duct",
+ condDuctTempFwd: "/systems/air-conditioning/temperatures/cabin-fwd-duct",
+ condTempCockpit: "/systems/air-conditioning/temperatures/cockpit-temp",
+ condTempAft: "/systems/air-conditioning/temperatures/cabin-aft-temp",
+ condTempFwd: "/systems/air-conditioning/temperatures/cabin-fwd-temp",
+ condTrimCockpit: "/ECAM/Lower/trim-cockpit-output",
+ condTrimAft: "/ECAM/Lower/trim-aft-output",
+ condTrimFwd: "/ECAM/Lower/trim-fwd-output",
+ condHotAirCmd: "/systems/air-conditioning/valves/hot-air-cmd",
+ condHotAirSwitch: "/controls/pneumatics/switches/hot-air",
+ condHotAirValve: "/systems/air-conditioning/valves/hot-air"
+};
+
+foreach (var name; keys(input)) {
+ emesary.GlobalTransmitter.NotifyAll(notifications.FrameNotificationAddProperty.new("A320 System Display", name, input[name]));
+}
\ No newline at end of file
diff --git a/Models/Instruments/Lower-ECAM/Lower-ECAM-cruise.nas b/Models/Instruments/Lower-ECAM/Lower-ECAM-cruise.nas
new file mode 100644
index 00000000..23445844
--- /dev/null
+++ b/Models/Instruments/Lower-ECAM/Lower-ECAM-cruise.nas
@@ -0,0 +1,257 @@
+# A3XX Lower ECAM Canvas
+# Copyright (c) 2021 Josh Davidson (Octal450) and Jonathan Redpath
+
+var canvas_lowerECAMPageCruise =
+{
+ new: func(svg,name) {
+ var obj = {parents: [canvas_lowerECAMPageCruise,canvas_lowerECAM_base] };
+ obj.group = obj.canvas.createGroup();
+ obj.name = name;
+
+ canvas.parsesvg(obj.group, svg, {"font-mapper": obj.font_mapper} );
+
+ foreach(var key; obj.getKeys()) {
+ obj[key] = obj.group.getElementById(key);
+ };
+
+ foreach(var key; obj.getKeysBottom()) {
+ obj[key] = obj.group.getElementById(key);
+ };
+
+ obj.units = acconfig_weight_kgs.getValue();
+
+ # init
+
+ obj.update_items = [
+ props.UpdateManager.FromHashValue("engOil1", 0.005, func(val) {
+ if (obj.units) {
+ obj["Oil1"].setText(sprintf("%2.1f",(0.1 * math.round(val * QT2LTR * 10,5))));
+ } else {
+ obj["Oil1"].setText(sprintf("%2.1f",(0.1 * math.round(val * 10,5))));
+ }
+ }),
+ props.UpdateManager.FromHashValue("engOil2", 0.005, func(val) {
+ if (obj.units) {
+ obj["Oil2"].setText(sprintf("%2.1f",(0.1 * math.round(val * QT2LTR * 10,5))));
+ } else {
+ obj["Oil2"].setText(sprintf("%2.1f",(0.1 * math.round(val * 10,5))));
+ }
+ }),
+ props.UpdateManager.FromHashValue("acconfigUnits", nil, func(val) {
+ if (val) {
+ obj["Fused-weight-unit"].setText("KG");
+ obj["OilUnit"].setText("LTR");
+ # immediately update parameters
+ obj["Oil1"].setText(sprintf("%2.1f",(0.1 * math.round(pts.Engines.Engine.oilQt[0].getValue() * QT2LTR * 10,5))));
+ obj["Oil2"].setText(sprintf("%2.1f",(0.1 * math.round(pts.Engines.Engine.oilQt[1].getValue() * QT2LTR * 10,5))));
+ obj["FUsed1"].setText(sprintf("%s", math.round(fuel_used_lbs1.getValue() * LBS2KGS, 10)));
+ obj["FUsed2"].setText(sprintf("%s", math.round(fuel_used_lbs2.getValue() * LBS2KGS, 10)));
+ } else {
+ obj["Fused-weight-unit"].setText("LBS");
+ obj["OilUnit"].setText("QT");
+ obj["Oil1"].setText(sprintf("%2.1f",(0.1 * math.round(pts.Engines.Engine.oilQt[0].getValue() * 10,5))));
+ obj["Oil2"].setText(sprintf("%2.1f",(0.1 * math.round(pts.Engines.Engine.oilQt[1].getValue() * 10,5))));
+ obj["FUsed1"].setText(sprintf("%s", math.round(fuel_used_lbs1.getValue(), 10)));
+ obj["FUsed2"].setText(sprintf("%s", math.round(fuel_used_lbs2.getValue(), 10)));
+ }
+ }),
+ props.UpdateManager.FromHashValue("engFuelUsed1", 1, func(val) {
+ if (obj.units) {
+ obj["FUsed1"].setText(sprintf("%s", math.round(val * LBS2KGS, 10)));
+ } else {
+ obj["FUsed1"].setText(sprintf("%s", math.round(val, 10)));
+ }
+ }),
+ props.UpdateManager.FromHashValue("engFuelUsed2", 1, func(val) {
+ if (obj.units) {
+ obj["FUsed2"].setText(sprintf("%s", math.round(val * LBS2KGS, 10)));
+ } else {
+ obj["FUsed2"].setText(sprintf("%s", math.round(val, 10)));
+ }
+ }),
+ props.UpdateManager.FromHashList(["engFuelUsed1","engFuelUsed2"], 1, func(val) {
+ if (obj.units) {
+ obj["FUsed"].setText(sprintf("%s", math.round((val.engFuelUsed1 + val.engFuelUsed2) * LBS2KGS, 10)));
+ } else {
+ obj["FUsed"].setText(sprintf("%s", math.round((val.engFuelUsed1 + val.engFuelUsed2), 10)));
+ }
+ }),
+ props.UpdateManager.FromHashValue("pressDelta", 0.05, func(val) {
+ if (val > 31.9) {
+ obj["deltaPSI"].setText(sprintf("%2.1f", 31.9));
+ } else if (val < -9.9) {
+ obj["deltaPSI"].setText(sprintf("%2.1f", -9.9));
+ } else {
+ obj["deltaPSI"].setText(sprintf("%2.1f", val));
+ }
+
+ if (val < -0.4 or val > 8.5) {
+ obj["deltaPSI"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["deltaPSI"].setColor(0.0509,0.7529,0.2941);
+ }
+ }),
+ props.UpdateManager.FromHashValue("pressVS", 25, func(val) {
+ if (val > 9950) {
+ obj["CABVS"].setText(sprintf("%4.0f", 9950));
+ } else if (val < -9950) {
+ obj["CABVS"].setText(sprintf("%4.0f", -9950));
+ } else {
+ obj["CABVS"].setText(sprintf("%-4.0f", math.round(val,50)));
+ }
+
+ if (val >= 25) {
+ obj["VS-Arrow-UP"].show();
+ obj["VS-Arrow-DN"].hide();
+ } elsif (val <= -25) {
+ obj["VS-Arrow-UP"].hide();
+ obj["VS-Arrow-DN"].show();
+ } else {
+ obj["VS-Arrow-UP"].hide();
+ obj["VS-Arrow-DN"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashValue("pressAlt", 25, func(val) {
+ if (val > 32750) {
+ obj["CABALT"].setText(sprintf("%5.0f", 32750));
+ } else if (val < -9950) {
+ obj["CABALT"].setText(sprintf("%5.0f", -9950));
+ } else {
+ obj["CABALT"].setText(sprintf("%5.0f", math.round(val,50)));
+ }
+
+ if (val > 9550) {
+ obj["CABALT"].setColor(1,0,0);
+ } else {
+ obj["CABALT"].setColor(0.0509,0.7529,0.2941);
+ }
+ }),
+ props.UpdateManager.FromHashValue("condTempCockpit", 0.5, func(val) {
+ obj["CKPT-TEMP"].setText(sprintf("%2.0f",val));
+ }),
+ props.UpdateManager.FromHashValue("condTempAft", 0.5, func(val) {
+ obj["AFT-TEMP"].setText(sprintf("%2.0f",val));
+ }),
+ props.UpdateManager.FromHashValue("condTempFwd", 0.5, func(val) {
+ obj["FWD-TEMP"].setText(sprintf("%2.0f",val));
+ }),
+ ];
+
+ obj.displayedGForce = 0;
+ obj.updateItemsBottom = [
+ props.UpdateManager.FromHashValue("acconfigUnits", nil, func(val) {
+ obj.units = val;
+ if (val) {
+ obj["GW-weight-unit"].setText("KG");
+ } else {
+ obj["GW-weight-unit"].setText("LBS");
+ }
+ }),
+ props.UpdateManager.FromHashValue("hour", nil, func(val) {
+ obj["UTCh"].setText(sprintf("%02d", val));
+ }),
+ props.UpdateManager.FromHashValue("minute", nil, func(val) {
+ obj["UTCm"].setText(sprintf("%02d", val));
+ }),
+ props.UpdateManager.FromHashValue("gForce", 0.05, func(val) {
+ if (obj.displayedGForce) {
+ obj["GLoad"].setText("G.LOAD " ~ sprintf("%3.1f", val));
+ }
+ }),
+ props.UpdateManager.FromHashValue("gForceDisplay", nil, func(val) {
+ if ((val == 1 and !obj.displayedGForce) or (val != 0 and obj.displayedGForce)) {
+ obj.displayedGForce = 1;
+ obj["GLoad"].show();
+ } else {
+ obj.displayedGForce = 0;
+ obj["GLoad"].hide();
+ }
+ }),
+ ];
+ return obj;
+ },
+ getKeysBottom: func() {
+ return ["TAT","SAT","GW","UTCh","UTCm","GLoad","GW-weight-unit"];
+ },
+ getKeys: func() {
+ return["Oil1","Oil2","OilUnit","FUsed1","FUsed2","FUsed","VIB1N1","VIB1N2","VIB2N1","VIB2N2","deltaPSI","LDGELEV-AUTO","LDGELEV","CABVS","CABALT","VS-Arrow-UP","VS-Arrow-DN","CKPT-TEMP","FWD-TEMP","AFT-TEMP","Fused-weight-unit"];
+ },
+ updateBottom: func(notification) {
+ foreach(var update_item_bottom; me.updateItemsBottom)
+ {
+ update_item_bottom.update(notification);
+ }
+
+ if (fmgc.FMGCInternal.fuelRequest and fmgc.FMGCInternal.blockConfirmed and !fmgc.FMGCInternal.fuelCalculating and notification.FWCPhase != 1) {
+ if (me.units) {
+ me["GW"].setText(sprintf("%s", math.round(fmgc.FMGCInternal.fuelPredGw * 1000 * LBS2KGS, 100)));
+ } else {
+ me["GW"].setText(sprintf("%s", math.round(fmgc.FMGCInternal.fuelPredGw * 1000, 100)));
+ }
+ me["GW"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ me["GW"].setText(sprintf("%s", "-----"));
+ me["GW"].setColor(0.0901,0.6039,0.7176);
+ }
+
+ if (dmc.DMController.DMCs[1].outputs[4] != nil) {
+ me["SAT"].setText(sprintf("%+2.0f", dmc.DMController.DMCs[1].outputs[4].getValue()));
+ me["SAT"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ me["SAT"].setText(sprintf("%s", "XX"));
+ me["SAT"].setColor(0.7333,0.3803,0);
+ }
+
+ if (dmc.DMController.DMCs[1].outputs[5] != nil) {
+ me["TAT"].setText(sprintf("%+2.0f", dmc.DMController.DMCs[1].outputs[5].getValue()));
+ me["TAT"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ me["TAT"].setText(sprintf("%s", "XX"));
+ me["TAT"].setColor(0.7333,0.3803,0);
+ }
+ },
+ update: func(notification) {
+ me.updatePower();
+
+ if (me.test.getVisible() == 1) {
+ me.updateTest(notification);
+ }
+
+ if (me.group.getVisible() == 0) {
+ return;
+ }
+
+ foreach(var update_item; me.update_items)
+ {
+ update_item.update(notification);
+ }
+
+ me.updateBottom(notification);
+ },
+ updatePower: func() {
+ if (me.name == ecam.SystemDisplayController.displayedPage.name) {
+ if (du4_lgt.getValue() > 0.01 and systems.ELEC.Bus.ac2.getValue() >= 110) {
+ if (du4_test_time.getValue() + du4_test_amount.getValue() >= pts.Sim.Time.elapsedSec.getValue()) {
+ me.group.setVisible(0);
+ me.test.setVisible(1);
+ } else {
+ me.group.setVisible(1);
+ me.test.setVisible(0);
+ }
+ } else {
+ me.group.setVisible(0);
+ me.test.setVisible(0);
+ }
+ } else {
+ me.group.setVisible(0);
+ # don't hide the test group; just let whichever page is active control it
+ }
+ },
+};
+
+var input = {
+};
+
+foreach (var name; keys(input)) {
+ emesary.GlobalTransmitter.NotifyAll(notifications.FrameNotificationAddProperty.new("A320 System Display", name, input[name]));
+}
\ No newline at end of file
diff --git a/Models/Instruments/Lower-ECAM/Lower-ECAM-door.nas b/Models/Instruments/Lower-ECAM/Lower-ECAM-door.nas
new file mode 100644
index 00000000..9e279235
--- /dev/null
+++ b/Models/Instruments/Lower-ECAM/Lower-ECAM-door.nas
@@ -0,0 +1,319 @@
+# A3XX Lower ECAM Canvas
+# Copyright (c) 2021 Josh Davidson (Octal450) and Jonathan Redpath
+
+var canvas_lowerECAMPageDoor =
+{
+ new: func(svg,name) {
+ var obj = {parents: [canvas_lowerECAMPageDoor,canvas_lowerECAM_base] };
+ obj.group = obj.canvas.createGroup();
+ obj.name = name;
+
+ canvas.parsesvg(obj.group, svg, {"font-mapper": obj.font_mapper} );
+
+ foreach(var key; obj.getKeys()) {
+ obj[key] = obj.group.getElementById(key);
+ };
+
+ foreach(var key; obj.getKeysBottom()) {
+ obj[key] = obj.group.getElementById(key);
+ };
+
+ obj.units = acconfig_weight_kgs.getValue();
+
+ # init
+ obj["Cabin2LeftSlide"].hide();
+ obj["Cabin2RightSlide"].hide();
+ obj["Cabin3LeftSlide"].hide();
+ obj["Cabin3RightSlide"].hide();
+
+ obj["DOOROXY-REGUL-LO-PR"].hide();
+ obj["AvionicsLine1"].hide();
+ obj["AvionicsLine2"].hide();
+ obj["AvionicsLbl1"].hide();
+ obj["AvionicsLbl2"].hide();
+ obj["ExitLLine"].hide();
+ obj["ExitLLbl"].hide();
+ obj["ExitRLine"].hide();
+ obj["ExitRLbl"].hide();
+ obj["Cabin2Left"].hide();
+ obj["Cabin2LeftLine"].hide();
+ obj["Cabin2LeftLbl"].hide();
+ obj["Cabin2Right"].hide();
+ obj["Cabin2RightLine"].hide();
+ obj["Cabin2RightLbl"].hide();
+ obj["Cabin3Left"].hide();
+ obj["Cabin3LeftLine"].hide();
+ obj["Cabin3LeftLbl"].hide();
+ obj["Cabin3Right"].hide();
+ obj["Cabin3RightLine"].hide();
+ obj["Cabin3RightLbl"].hide();
+
+
+ obj.update_items = [
+ props.UpdateManager.FromHashValue("doorL1", nil, func(val) {
+ if (val > 0) {
+ obj["Cabin1Left"].show();
+ obj["Cabin1Left"].setColor(0.7333,0.3803,0);
+ obj["Cabin1Left"].setColorFill(0.7333,0.3803,0);
+ obj["Cabin1LeftLbl"].show();
+ obj["Cabin1LeftLine"].show();
+ obj["Cabin1LeftSlide"].hide();
+ } else {
+ obj["Cabin1Left"].setColor(0.0509,0.7529,0.2941);
+ obj["Cabin1Left"].setColorFill(0,0,0);
+ obj["Cabin1LeftLbl"].hide();
+ obj["Cabin1LeftLine"].hide();
+ obj["Cabin1LeftSlide"].show();
+ }
+ }),
+ props.UpdateManager.FromHashValue("doorL4", nil, func(val) {
+ if (val > 0) {
+ obj["Cabin4Left"].show();
+ obj["Cabin4Left"].setColor(0.7333,0.3803,0);
+ obj["Cabin4Left"].setColorFill(0.7333,0.3803,0);
+ obj["Cabin4LeftLbl"].show();
+ obj["Cabin4LeftLine"].show();
+ obj["Cabin4LeftSlide"].hide();
+ } else {
+ obj["Cabin4Left"].setColor(0.0509,0.7529,0.2941);
+ obj["Cabin4Left"].setColorFill(0,0,0);
+ obj["Cabin4LeftLbl"].hide();
+ obj["Cabin4LeftLine"].hide();
+ obj["Cabin4LeftSlide"].show();
+ }
+ }),
+ props.UpdateManager.FromHashValue("doorR1", nil, func(val) {
+ if (val > 0) {
+ obj["Cabin1Right"].show();
+ obj["Cabin1Right"].setColor(0.7333,0.3803,0);
+ obj["Cabin1Right"].setColorFill(0.7333,0.3803,0);
+ obj["Cabin1RightLbl"].show();
+ obj["Cabin1RightLine"].show();
+ obj["Cabin1RightSlide"].hide();
+ } else {
+ obj["Cabin1Right"].setColor(0.0509,0.7529,0.2941);
+ obj["Cabin1Right"].setColorFill(0,0,0);
+ obj["Cabin1RightLbl"].hide();
+ obj["Cabin1RightLine"].hide();
+ obj["Cabin1RightSlide"].show();
+ }
+ }),
+ props.UpdateManager.FromHashValue("doorR4", nil, func(val) {
+ if (val > 0) {
+ obj["Cabin4Right"].show();
+ obj["Cabin4Right"].setColor(0.7333,0.3803,0);
+ obj["Cabin4Right"].setColorFill(0.7333,0.3803,0);
+ obj["Cabin4RightLbl"].show();
+ obj["Cabin4RightLine"].show();
+ obj["Cabin4RightSlide"].hide();
+ } else {
+ obj["Cabin4Right"].setColor(0.0509,0.7529,0.2941);
+ obj["Cabin4Right"].setColorFill(0,0,0);
+ obj["Cabin4RightLbl"].hide();
+ obj["Cabin4RightLine"].hide();
+ obj["Cabin4RightSlide"].show();
+ }
+ }),
+ props.UpdateManager.FromHashValue("cargoAft", nil, func(val) {
+ if (val > 0) {
+ obj["Cargo2Door"].setColor(0.7333,0.3803,0);
+ obj["Cargo2Door"].setColorFill(0.7333,0.3803,0);
+ obj["Cargo2Lbl"].show();
+ obj["Cargo2Line"].show();
+ } else {
+ obj["Cargo2Door"].setColor(0.0509,0.7529,0.2941);
+ obj["Cargo2Door"].setColorFill(0,0,0);
+ obj["Cargo2Lbl"].hide();
+ obj["Cargo2Line"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashValue("cargoBulk", nil, func(val) {
+ if (val > 0) {
+ obj["Bulk"].setColor(0.7333,0.3803,0);
+ obj["Bulk"].setColorFill(0.7333,0.3803,0);
+ obj["BulkLbl"].show();
+ obj["BulkLine"].show();
+ } else {
+ obj["Bulk"].setColor(0.0509,0.7529,0.2941);
+ obj["Bulk"].setColorFill(0,0,0);
+ obj["BulkLbl"].hide();
+ obj["BulkLine"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashValue("cargoFwd", nil, func(val) {
+ if (val > 0) {
+ obj["Cargo1Door"].setColor(0.7333,0.3803,0);
+ obj["Cargo1Door"].setColorFill(0.7333,0.3803,0);
+ obj["Cargo1Lbl"].show();
+ obj["Cargo1Line"].show();
+ } else {
+ obj["Cargo1Door"].setColor(0.0509,0.7529,0.2941);
+ obj["Cargo1Door"].setColorFill(0,0,0);
+ obj["Cargo1Lbl"].hide();
+ obj["Cargo1Line"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashValue("oxyPB", nil, func(val) {
+ if (val) {
+ obj["DOOROXY-OxyIndicator"].setColor(0.8078,0.8039,0.8078);
+ obj["DOOROXY-PR"].setColor(0.0509,0.7529,0.2941);
+ obj["DOOROXY-PR"].setText("1300");
+ } else {
+ obj["DOOROXY-OxyIndicator"].setColor(0.7333,0.3803,0);
+ obj["DOOROXY-PR"].setColor(0.7333,0.3803,0);
+ obj["DOOROXY-PR"].setText("0");
+ }
+ }),
+ props.UpdateManager.FromHashValue("pressVS", nil, func(val) {
+ if (val > 9950) {
+ obj["DOOR-VS"].setText(sprintf("%+4.0f", 9950));
+ } else if (val < -9950) {
+ obj["DOOR-VS"].setText(sprintf("%+4.0f", -9950));
+ } else {
+ obj["DOOR-VS"].setText(sprintf("%+4.0f", math.round(val,50)));
+ }
+
+ if (abs(val) > 2000) {
+ obj["DOOR-VS"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["DOOR-VS"].setColor(0.0509,0.7529,0.2941);
+ }
+ }),
+ props.UpdateManager.FromHashValue("FWCPhase", nil, func(val) {
+ if (val >= 5 and val <= 7) {
+ obj["DOOR-VS-Container"].show();
+ } else {
+ obj["DOOR-VS-Container"].hide();
+ }
+ }),
+ ];
+
+ obj.displayedGForce = 0;
+ obj.updateItemsBottom = [
+ props.UpdateManager.FromHashValue("acconfigUnits", nil, func(val) {
+ obj.units = val;
+ if (val) {
+ obj["GW-weight-unit"].setText("KG");
+ } else {
+ obj["GW-weight-unit"].setText("LBS");
+ }
+ }),
+ props.UpdateManager.FromHashValue("hour", nil, func(val) {
+ obj["UTCh"].setText(sprintf("%02d", val));
+ }),
+ props.UpdateManager.FromHashValue("minute", nil, func(val) {
+ obj["UTCm"].setText(sprintf("%02d", val));
+ }),
+ props.UpdateManager.FromHashValue("gForce", 0.05, func(val) {
+ if (obj.displayedGForce) {
+ obj["GLoad"].setText("G.LOAD " ~ sprintf("%3.1f", val));
+ }
+ }),
+ props.UpdateManager.FromHashValue("gForceDisplay", nil, func(val) {
+ if ((val == 1 and !obj.displayedGForce) or (val != 0 and obj.displayedGForce)) {
+ obj.displayedGForce = 1;
+ obj["GLoad"].show();
+ } else {
+ obj.displayedGForce = 0;
+ obj["GLoad"].hide();
+ }
+ }),
+ ];
+ return obj;
+ },
+ getKeysBottom: func() {
+ return ["TAT","SAT","GW","UTCh","UTCm","GLoad","GW-weight-unit"];
+ },
+ getKeys: func() {
+ return["Bulk","BulkLine","BulkLbl","Exit1L","Exit1R","Cabin1Left","Cabin1LeftLbl","Cabin1LeftLine","Cabin1LeftSlide","Cabin1Right","Cabin1RightLbl","Cabin1RightLine","Cabin1RightSlide","Cabin2Left","Cabin2LeftLbl",
+ "Cabin2LeftLine","Cabin2LeftSlide","Cabin2Right","Cabin2RightLbl","Cabin2RightLine","Cabin2RightSlide","Cabin3Left","Cabin3LeftLbl","Cabin3LeftLine","Cabin3LeftSlide","Cabin3Right","Cabin3RightLbl","Cabin3RightLine","Cabin3RightSlide","AvionicsLine1",
+ "AvionicsLbl1","AvionicsLine2","AvionicsLbl2","Cargo1Line","Cargo1Lbl","Cargo1Door","Cargo2Line","Cargo2Lbl","Cargo2Door","ExitLSlide","ExitLLine","ExitLLbl","ExitRSlide","ExitRLine","ExitRLbl","Cabin4Left","Cabin4LeftLbl","Cabin4LeftLine",
+ "Cabin4LeftSlide","Cabin4Right","Cabin4RightLbl","Cabin4RightLine","Cabin4RightSlide","DOOROXY-REGUL-LO-PR","DOOROXY-PR","DOOROXY-OxyIndicator","DOOR-VS","DOOR-VS-Container"];
+ },
+ updateBottom: func(notification) {
+ foreach(var update_item_bottom; me.updateItemsBottom)
+ {
+ update_item_bottom.update(notification);
+ }
+
+ if (fmgc.FMGCInternal.fuelRequest and fmgc.FMGCInternal.blockConfirmed and !fmgc.FMGCInternal.fuelCalculating and notification.FWCPhase != 1) {
+ if (me.units) {
+ me["GW"].setText(sprintf("%s", math.round(fmgc.FMGCInternal.fuelPredGw * 1000 * LBS2KGS, 100)));
+ } else {
+ me["GW"].setText(sprintf("%s", math.round(fmgc.FMGCInternal.fuelPredGw * 1000, 100)));
+ }
+ me["GW"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ me["GW"].setText(sprintf("%s", "-----"));
+ me["GW"].setColor(0.0901,0.6039,0.7176);
+ }
+
+ if (dmc.DMController.DMCs[1].outputs[4] != nil) {
+ me["SAT"].setText(sprintf("%+2.0f", dmc.DMController.DMCs[1].outputs[4].getValue()));
+ me["SAT"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ me["SAT"].setText(sprintf("%s", "XX"));
+ me["SAT"].setColor(0.7333,0.3803,0);
+ }
+
+ if (dmc.DMController.DMCs[1].outputs[5] != nil) {
+ me["TAT"].setText(sprintf("%+2.0f", dmc.DMController.DMCs[1].outputs[5].getValue()));
+ me["TAT"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ me["TAT"].setText(sprintf("%s", "XX"));
+ me["TAT"].setColor(0.7333,0.3803,0);
+ }
+ },
+ update: func(notification) {
+ me.updatePower();
+
+ if (me.test.getVisible() == 1) {
+ me.updateTest(notification);
+ }
+
+ if (me.group.getVisible() == 0) {
+ return;
+ }
+
+ foreach(var update_item; me.update_items)
+ {
+ update_item.update(notification);
+ }
+
+ me.updateBottom(notification);
+ },
+ updatePower: func() {
+ if (me.name == ecam.SystemDisplayController.displayedPage.name) {
+ if (du4_lgt.getValue() > 0.01 and systems.ELEC.Bus.ac2.getValue() >= 110) {
+ if (du4_test_time.getValue() + du4_test_amount.getValue() >= pts.Sim.Time.elapsedSec.getValue()) {
+ me.group.setVisible(0);
+ me.test.setVisible(1);
+ } else {
+ me.group.setVisible(1);
+ me.test.setVisible(0);
+ }
+ } else {
+ me.group.setVisible(0);
+ me.test.setVisible(0);
+ }
+ } else {
+ me.group.setVisible(0);
+ # don't hide the test group; just let whichever page is active control it
+ }
+ },
+};
+
+var input = {
+ doorL1: "/sim/model/door-positions/doorl1/position-norm",
+ doorL4: "/sim/model/door-positions/doorl4/position-norm",
+ doorR1: "/sim/model/door-positions/doorr1/position-norm",
+ doorR4: "/sim/model/door-positions/doorr4/position-norm",
+ cargoAft: "/sim/model/door-positions/cargoaft/position-norm",
+ cargoBulk: "/sim/model/door-positions/cargobulk/position-norm",
+ cargoFwd: "/sim/model/door-positions/cargofwd/position-norm",
+ oxyPB: "/controls/oxygen/crewOxyPB",
+};
+
+foreach (var name; keys(input)) {
+ emesary.GlobalTransmitter.NotifyAll(notifications.FrameNotificationAddProperty.new("A320 System Display", name, input[name]));
+}
\ No newline at end of file
diff --git a/Models/Instruments/Lower-ECAM/Lower-ECAM-elec.nas b/Models/Instruments/Lower-ECAM/Lower-ECAM-elec.nas
new file mode 100644
index 00000000..6b7ab26e
--- /dev/null
+++ b/Models/Instruments/Lower-ECAM/Lower-ECAM-elec.nas
@@ -0,0 +1,827 @@
+# A3XX Lower ECAM Canvas
+# Copyright (c) 2021 Josh Davidson (Octal450) and Jonathan Redpath
+
+var canvas_lowerECAMPageElec =
+{
+ new: func(svg,name) {
+ var obj = {parents: [canvas_lowerECAMPageElec,canvas_lowerECAM_base] };
+ obj.group = obj.canvas.createGroup();
+ obj.name = name;
+
+ canvas.parsesvg(obj.group, svg, {"font-mapper": obj.font_mapper} );
+
+ foreach(var key; obj.getKeys()) {
+ obj[key] = obj.group.getElementById(key);
+ };
+
+ foreach(var key; obj.getKeysBottom()) {
+ obj[key] = obj.group.getElementById(key);
+ };
+
+ obj.units = acconfig_weight_kgs.getValue();
+
+ # init
+ obj["IDG1-LOPR"].hide();
+ obj["IDG2-LOPR"].hide();
+ obj["Shed-label"].hide();
+ obj["IDG2-RISE-label"].hide();
+ obj["IDG2-RISE-Value"].hide();
+ obj["IDG1-RISE-label"].hide();
+ obj["IDG1-RISE-Value"].hide();
+
+ obj.update_items = [
+ props.UpdateManager.FromHashValue("apuLoad", 0.1, func(val) {
+ obj["APUGenLoad"].setText(sprintf("%s", math.round(val)));
+
+ if (val < 110) {
+ obj["APUGenHz"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["APUGenHz"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashValue("apuHertz", 0.5, func(val) {
+ if (val == 0) {
+ obj["APUGenHz"].setText(sprintf("XX"));
+ } else {
+ obj["APUGenHz"].setText(sprintf("%s", math.round(val)));
+ }
+
+ if (val >= 390 and val <= 410) {
+ obj["APUGenHz"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["APUGenHz"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashValue("apuVolt", 0.1, func(val) {
+ obj["APUGenVolt"].setText(sprintf("%s", math.round(val)));
+
+ if (val >= 110 and val <= 120) {
+ obj["APUGenVolt"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["APUGenVolt"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashList(["apuMaster","apuVolt","apuLoad","apuHertz","apuGLC"], nil, func(val) {
+ if (val.apuMaster == 0) {
+ obj["APUGentext"].setColor(0.8078,0.8039,0.8078);
+ } else {
+ if (val.apuGLC == 0) {
+ obj["APUGentext"].setColor(0.7333,0.3803,0);
+ } else if (val.apuVolt > 120 or val.apuVolt < 110 or val.apuHertz > 410 or val.apuHertz < 390 or val.apuLoad >= 100) {
+ obj["APUGentext"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["APUGentext"].setColor(0.8078,0.8039,0.8078);
+ }
+ }
+ }),
+ props.UpdateManager.FromHashList(["apuMaster","apuGenPB"], nil, func(val) {
+ if (val.apuMaster == 0) {
+ obj["APU-content"].hide();
+ obj["APUGEN-off"].hide();
+ obj["APU-border"].hide();
+ } else {
+ obj["APU-border"].show();
+ if (val.apuGenPB == 0) {
+ obj["APU-content"].hide();
+ obj["APUGEN-off"].show();
+ } else {
+ obj["APU-content"].show();
+ obj["APUGEN-off"].hide();
+ }
+ }
+ }),
+ props.UpdateManager.FromHashValue("elecIDG1Disc", nil, func(val) {
+ if (!val) {
+ obj["IDG1-DISC"].show();
+ obj["ELEC-IDG-1-label"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["IDG1-DISC"].hide();
+ obj["ELEC-IDG-1-label"].setColor(0.8078,0.8039,0.8078);
+ }
+ }),
+ props.UpdateManager.FromHashValue("elecIDG2Disc", nil, func(val) {
+ if (!val) {
+ obj["IDG2-DISC"].show();
+ obj["ELEC-IDG-2-label"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["IDG2-DISC"].hide();
+ obj["ELEC-IDG-2-label"].setColor(0.8078,0.8039,0.8078);
+ }
+ }),
+ props.UpdateManager.FromHashValue("engine1Running", nil, func(val) {
+ if (val == 0) {
+ obj["ELEC-IDG-1-num-label"].setColor(0.7333,0.3803,0);
+ obj["GEN1-num-label"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["ELEC-IDG-1-num-label"].setColor(0.8078,0.8039,0.8078);
+ obj["GEN1-num-label"].setColor(0.8078,0.8039,0.8078);
+ }
+ }),
+ props.UpdateManager.FromHashValue("engine2Running", nil, func(val) {
+ if (val == 0) {
+ obj["ELEC-IDG-2-num-label"].setColor(0.7333,0.3803,0);
+ obj["GEN2-num-label"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["ELEC-IDG-2-num-label"].setColor(0.8078,0.8039,0.8078);
+ obj["GEN2-num-label"].setColor(0.8078,0.8039,0.8078);
+ }
+ }),
+ props.UpdateManager.FromHashValue("dc1", 0.5, func(val) {
+ if (val > 25) {
+ obj["ELEC-DC1-label"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["ELEC-DC1-label"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashValue("dc2", 0.5, func(val) {
+ if (val > 25) {
+ obj["ELEC-DC2-label"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["ELEC-DC2-label"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashValue("dcEss", 0.5, func(val) {
+ if (val > 25) {
+ obj["ELEC-DCESS-label"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["ELEC-DCESS-label"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashValue("elecAC1", 0.5, func(val) {
+ if (val >= 110) {
+ obj["ELEC-AC1-label"].setColor(0.0509,0.7529,0.2941);
+ obj["AC1-in"].show();
+ obj["ELEC-Line-AC1-TR1"].show();
+ } else {
+ obj["ELEC-AC1-label"].setColor(0.7333,0.3803,0);
+ obj["AC1-in"].hide();
+ obj["ELEC-Line-AC1-TR1"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashValue("elecAC2", 0.5, func(val) {
+ if (val >= 110) {
+ obj["ELEC-AC2-label"].setColor(0.0509,0.7529,0.2941);
+ obj["AC2-in"].show();
+ obj["ELEC-Line-AC2-TR2"].show();
+ } else {
+ obj["ELEC-AC2-label"].setColor(0.7333,0.3803,0);
+ obj["AC2-in"].hide();
+ obj["ELEC-Line-AC2-TR2"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashValue("elecACEss", 0.5, func(val) {
+ if (val >= 110) {
+ obj["ELEC-ACESS-label"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["ELEC-ACESS-label"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashValue("elecACEssShed", 0.5, func(val) {
+ if (val >= 110) {
+ obj["ACESS-SHED"].hide();
+ } else {
+ obj["ACESS-SHED"].show();
+ }
+ }),
+ props.UpdateManager.FromHashValue("ElecGalleyShed", nil, func(val) {
+ if (val) {
+ obj["GalleyShed"].show();
+ } else {
+ obj["GalleyShed"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashList(["elecBat1Switch","elecBat2Switch","dcBat"], nil, func(val) {
+ if (val.elecBat1Switch or val.elecBat2Switch) {
+ obj["ELEC-DCBAT-label"].setText("DC BAT");
+ if (val.dcBat > 25) {
+ obj["ELEC-DCBAT-label"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["ELEC-DCBAT-label"].setColor(0.7333,0.3803,0);
+ }
+ } else {
+ obj["ELEC-DCBAT-label"].setText("XX"); # BCL not powered hence no voltage info supplied from BCL
+ obj["ELEC-DCBAT-label"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashList(["elecBat1Switch","elecBat1Volt","elecBat1Amp","elecBat1Direction","elecBat1Fault"], nil, func(val) {
+ if (val.elecBat1Switch == 0) {
+ obj["BAT1-OFF"].show();
+ obj["BAT1-content"].hide();
+ obj["BAT1-discharge"].hide();
+ obj["BAT1-charge"].hide();
+ } else {
+ obj["BAT1-OFF"].hide();
+ obj["BAT1-content"].show();
+ obj["Bat1Ampere"].setText(sprintf("%2.0f", val.elecBat1Amp));
+
+ obj["Bat1Volt"].setText(sprintf("%2.0f", val.elecBat1Volt));
+
+ if (val.elecBat1Volt >= 24.95 and val.elecBat1Volt <= 31.05) {
+ obj["Bat1Volt"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["Bat1Volt"].setColor(0.7333,0.3803,0);
+ }
+
+ if (val.elecBat1Amp > 5 and val.elecBat1Direction == 1) {
+ obj["Bat1Ampere"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["Bat1Ampere"].setColor(0.0509,0.7529,0.2941);
+ }
+
+ if (val.elecBat1Direction == 0) {
+ obj["BAT1-discharge"].hide();
+ obj["BAT1-charge"].hide();
+ } else {
+ if (val.elecBat1Direction == -1) {
+ obj["BAT1-charge"].show();
+ obj["BAT1-discharge"].hide();
+ } else {
+ obj["BAT1-discharge"].show();
+ obj["BAT1-charge"].hide();
+ }
+ }
+ }
+
+ if (val.elecBat1Fault or val.elecBat1Volt < 25 or val.elecBat1Volt > 31 or val.elecBat1Amp > 5) {
+ obj["BAT1-label"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["BAT1-label"].setColor(0.8078,0.8039,0.8078);
+ }
+ }),
+ props.UpdateManager.FromHashList(["elecBat2Switch","elecBat2Volt","elecBat2Amp","elecBat2Direction","elecBat2Fault"], nil, func(val) {
+ if (val.elecBat2Switch == 0) {
+ obj["BAT2-OFF"].show();
+ obj["BAT2-content"].hide();
+ obj["BAT2-discharge"].hide();
+ obj["BAT2-charge"].hide();
+ } else {
+ obj["BAT2-OFF"].hide();
+ obj["BAT2-content"].show();
+ obj["Bat2Ampere"].setText(sprintf("%2.0f", val.elecBat2Amp));
+
+ obj["Bat2Volt"].setText(sprintf("%2.0f", val.elecBat2Volt));
+
+ if (val.elecBat2Volt >= 24.95 and val.elecBat2Volt <= 31.05) {
+ obj["Bat2Volt"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["Bat2Volt"].setColor(0.7333,0.3803,0);
+ }
+
+ if (val.elecBat2Amp > 5 and val.elecBat2Direction == 1) {
+ obj["Bat2Ampere"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["Bat2Ampere"].setColor(0.0509,0.7529,0.2941);
+ }
+
+ if (val.elecBat2Direction == 0) {
+ obj["BAT2-discharge"].hide();
+ obj["BAT2-charge"].hide();
+ } else {
+ if (val.elecBat2Direction == -1) {
+ obj["BAT2-charge"].show();
+ obj["BAT2-discharge"].hide();
+ } else {
+ obj["BAT2-discharge"].show();
+ obj["BAT2-charge"].hide();
+ }
+ }
+ }
+
+ if (val.elecBat2Fault or val.elecBat2Volt < 25 or val.elecBat2Volt > 31 or val.elecBat2Amp > 5) {
+ obj["BAT2-label"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["BAT2-label"].setColor(0.8078,0.8039,0.8078);
+ }
+ }),
+ props.UpdateManager.FromHashList(["elecTR1Amp","elecTR1Volt"], nil, func(val) {
+ obj["TR1Volt"].setText(sprintf("%s", math.round(val.elecTR1Volt)));
+ obj["TR1Ampere"].setText(sprintf("%s", math.round(val.elecTR1Amp)));
+
+ if (val.elecTR1Volt < 25 or val.elecTR1Volt > 31 or val.elecTR1Amp < 5) {
+ obj["TR1-label"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["TR1-label"].setColor(0.8078,0.8039,0.8078);
+ }
+
+ if (val.elecTR1Volt < 25 or val.elecTR1Volt > 31) {
+ obj["TR1Volt"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["TR1Volt"].setColor(0.0509,0.7529,0.2941);
+ }
+
+ if (val.elecTR1Amp < 5) {
+ obj["TR1Ampere"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["TR1Ampere"].setColor(0.0509,0.7529,0.2941);
+ }
+ }),
+ props.UpdateManager.FromHashList(["elecTR2Amp","elecTR2Volt"], nil, func(val) {
+ obj["TR2Volt"].setText(sprintf("%s", math.round(val.elecTR2Volt)));
+ obj["TR2Ampere"].setText(sprintf("%s", math.round(val.elecTR2Amp)));
+
+ if (val.elecTR2Volt < 25 or val.elecTR2Volt > 31 or val.elecTR2Amp < 5) {
+ obj["TR2-label"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["TR2-label"].setColor(0.8078,0.8039,0.8078);
+ }
+
+ if (val.elecTR2Volt < 25 or val.elecTR2Volt > 31) {
+ obj["TR2Volt"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["TR2Volt"].setColor(0.0509,0.7529,0.2941);
+ }
+
+ if (val.elecTR2Amp < 5) {
+ obj["TR2Ampere"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["TR2Ampere"].setColor(0.0509,0.7529,0.2941);
+ }
+ }),
+ props.UpdateManager.FromHashList(["elecExtHertz","elecExtVolt","elecGroundCart"], nil, func(val) {
+ if (val.elecGroundCart == 0) {
+ obj["EXTPWR-group"].hide();
+ } else {
+ obj["EXTPWR-group"].show();
+ obj["ExtVolt"].setText(sprintf("%s", math.round(val.elecExtVolt)));
+ obj["ExtHz"].setText(sprintf("%s", math.round(val.elecExtHertz)));
+
+ if (val.elecExtHertz > 410 or val.elecExtHertz < 390 or val.elecExtVolt > 120 or val.elecExtVolt < 110) {
+ obj["EXTPWR-label"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["EXTPWR-label"].setColor(0.0509,0.7529,0.2941);
+ }
+
+ if (val.elecExtHertz > 410 or val.elecExtHertz < 390) {
+ obj["ExtHz"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["ExtHz"].setColor(0.0509,0.7529,0.2941);
+ }
+
+ if (val.elecExtVolt > 120 or val.elecExtVolt < 110) {
+ obj["ExtVolt"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["ExtVolt"].setColor(0.0509,0.7529,0.2941);
+ }
+ }
+ }),
+ props.UpdateManager.FromHashValue("elecDCTie1", nil, func(val) {
+ if (val) {
+ obj["ELEC-Line-DC1-DCESS_DCBAT"].show();
+ } else {
+ obj["ELEC-Line-DC1-DCESS_DCBAT"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashValue("elecDCTie2", nil, func(val) {
+ if (val) {
+ obj["ELEC-Line-DC2-DCESS_DCBAT"].show();
+ obj["ELEC-Line-DC2-DCBAT"].show();
+ } else {
+ obj["ELEC-Line-DC2-DCESS_DCBAT"].hide();
+ obj["ELEC-Line-DC2-DCBAT"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashList(["elecDcEssFeedBat","elecDCTie1"], nil, func(val) {
+ if (val.elecDcEssFeedBat or val.elecDCTie1) {
+ obj["ELEC-Line-DC1-DCBAT"].show();
+ } else {
+ obj["ELEC-Line-DC1-DCBAT"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashValue("elecDcEssFeedBat", nil, func(val) {
+ if (val) {
+ obj["ELEC-Line-DC1-DCESS"].show();
+ } else {
+ obj["ELEC-Line-DC1-DCESS"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashValue("elecTrEssContact", nil, func(val) {
+ if (val) {
+ obj["ELEC-Line-ESSTR-DCESS"].show();
+ } else {
+ obj["ELEC-Line-ESSTR-DCESS"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashValue("elecAcEssEmerGenFeed", nil, func(val) {
+ if (val) {
+ obj["EMERGEN-out"].show();
+ obj["ELEC-Line-Emergen-ESSTR"].show();
+ } else {
+ obj["EMERGEN-out"].hide();
+ obj["ELEC-Line-Emergen-ESSTR"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashList(["elecTREssAmp","elecTREssVolt","elecTrEssContact"], nil, func(val) {
+ if (val.elecTrEssContact) {
+ obj["ESSTR-group"].show();
+ obj["ESSTR-Volt"].setText(sprintf("%s", math.round(val.elecTREssVolt)));
+ obj["ESSTR-Ampere"].setText(sprintf("%s", math.round(val.elecTREssAmp)));
+
+ if (val.elecTREssVolt < 25 or val.elecTREssVolt > 31 or val.elecTREssAmp < 5) {
+ obj["ESSTR"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["ESSTR"].setColor(0.8078,0.8039,0.8078);
+ }
+
+ if (val.elecTREssVolt < 25 or val.elecTREssVolt > 31) {
+ obj["ESSTR-Volt"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["ESSTR-Volt"].setColor(0.0509,0.7529,0.2941);
+ }
+
+ if (val.elecTREssAmp < 5) {
+ obj["ESSTR-Ampere"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["ESSTR-Ampere"].setColor(0.0509,0.7529,0.2941);
+ }
+ } else {
+ obj["ESSTR-group"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashList(["elecEmerGenHertz","elecEmerGenVolts","elecEmerGenVoltsRelay"], nil, func(val) {
+ if (val.elecEmerGenVolts == 0) {
+ obj["EMERGEN-group"].hide();
+ obj["ELEC-Line-Emergen-ESSTR"].hide();
+ obj["ELEC-Line-Emergen-ESSTR-off"].show();
+ obj["EMERGEN-Label-off"].show();
+ } else {
+ obj["EMERGEN-group"].show();
+ obj["ELEC-Line-Emergen-ESSTR"].show();
+ obj["ELEC-Line-Emergen-ESSTR-off"].hide();
+ obj["EMERGEN-Label-off"].hide();
+
+ obj["EmergenVolt"].setText(sprintf("%s", math.round(val.elecEmerGenVoltsRelay)));
+ obj["EmergenHz"].setText(sprintf("%s", math.round(val.elecEmerGenHertz)));
+
+ if (val.elecEmerGenVoltsRelay > 120 or val.elecEmerGenVoltsRelay < 110 or val.elecEmerGenHertz > 410 or val.elecEmerGenHertz < 390) {
+ obj["Emergen-Label"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["Emergen-Label"].setColor(0.8078,0.8039,0.8078);
+ }
+
+ if (val.elecEmerGenVoltsRelay > 120 or val.elecEmerGenVoltsRelay < 110) {
+ obj["EmergenVolt"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["EmergenVolt"].setColor(0.0509,0.7529,0.2941);
+ }
+
+ if (val.elecEmerGenHertz > 410 or val.elecEmerGenHertz < 390) {
+ obj["EmergenHz"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["EmergenHz"].setColor(0.0509,0.7529,0.2941);
+ }
+ }
+ }),
+ props.UpdateManager.FromHashList(["elecGen1Switch","elecGen1Hertz","elecGen1Volt","engine1Running","elecGen1Relay"], nil, func(val) {
+ if (val.elecGen1Switch == 0) {
+ obj["GEN1-content"].hide();
+ obj["GEN1-off"].show();
+ if (val.elecGen1Relay) {
+ obj["GEN1-label"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["GEN1-label"].setColor(0.8078,0.8039,0.8078);
+ }
+ } else {
+ obj["GEN1-content"].show();
+ obj["GEN1-off"].hide();
+ obj["Gen1Volt"].setText(sprintf("%s", math.round(val.elecGen1Volt)));
+
+ if (val.elecGen1Hertz == 0) {
+ obj["Gen1Hz"].setText(sprintf("XX"));
+ } else {
+ obj["Gen1Hz"].setText(sprintf("%s", math.round(val.elecGen1Hertz)));
+ }
+
+ if (val.elecGen1Volt > 120 or val.elecGen1Volt < 110 or val.elecGen1Hertz > 410 or val.elecGen1Hertz < 390) {
+ obj["GEN1-label"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["GEN1-label"].setColor(0.8078,0.8039,0.8078);
+ }
+
+ if (val.elecGen1Volt > 120 or val.elecGen1Volt < 110) {
+ obj["Gen1Volt"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["Gen1Volt"].setColor(0.0509,0.7529,0.2941);
+ }
+
+ if (val.elecGen1Hertz > 410 or val.elecGen1Hertz < 390) {
+ obj["Gen1Hz"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["Gen1Hz"].setColor(0.0509,0.7529,0.2941);
+ }
+ }
+ }),
+ props.UpdateManager.FromHashList(["elecGen2Switch","elecGen2Hertz","elecGen2Volt","engine1Running","elecGen2Relay"], nil, func(val) {
+ if (val.elecGen2Switch == 0) {
+ obj["GEN2-content"].hide();
+ obj["GEN2-off"].show();
+ if (val.elecGen2Relay) {
+ obj["GEN2-label"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["GEN2-label"].setColor(0.8078,0.8039,0.8078);
+ }
+ } else {
+ obj["GEN2-content"].show();
+ obj["GEN2-off"].hide();
+ obj["Gen2Volt"].setText(sprintf("%s", math.round(val.elecGen2Volt)));
+
+ if (val.elecGen2Hertz == 0) {
+ obj["Gen2Hz"].setText(sprintf("XX"));
+ } else {
+ obj["Gen2Hz"].setText(sprintf("%s", math.round(val.elecGen2Hertz)));
+ }
+
+ if (val.elecGen2Volt > 120 or val.elecGen2Volt < 110 or val.elecGen2Hertz > 410 or val.elecGen2Hertz < 390) {
+ obj["GEN2-label"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["GEN2-label"].setColor(0.8078,0.8039,0.8078);
+ }
+
+ if (val.elecGen2Volt > 120 or val.elecGen2Volt < 110) {
+ obj["Gen2Volt"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["Gen2Volt"].setColor(0.0509,0.7529,0.2941);
+ }
+
+ if (val.elecGen2Hertz > 410 or val.elecGen2Hertz < 390) {
+ obj["Gen2Hz"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["Gen2Hz"].setColor(0.0509,0.7529,0.2941);
+ }
+ }
+ }),
+ props.UpdateManager.FromHashList(["elecTR1Contact","elecAC1"], nil, func(val) {
+ if (val.elecTR1Contact) {
+ if (val.elecAC1 < 110) {
+ obj["ELEC-Line-AC1-TR1"].setColorFill(0.7333,0.3803,0);
+ } else {
+ obj["ELEC-Line-AC1-TR1"].setColorFill(0.0509,0.7529,0.2941);
+ }
+ obj["ELEC-Line-TR1-DC1"].show();
+ } else {
+ obj["ELEC-Line-TR1-DC1"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashList(["elecTR2Contact","elecAC2"], nil, func(val) {
+ if (val.elecTR2Contact) {
+ if (val.elecAC2 < 110) {
+ obj["ELEC-Line-AC2-TR2"].setColorFill(0.7333,0.3803,0);
+ } else {
+ obj["ELEC-Line-AC2-TR2"].setColorFill(0.0509,0.7529,0.2941);
+ }
+ obj["ELEC-Line-TR2-DC2"].show();
+ } else {
+ obj["ELEC-Line-TR2-DC2"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashList(["elecAcEssFeed1","elecAcEssFeed2","elecAC1","elecAC2"], nil, func(val) {
+ if (val.elecAcEssFeed1) {
+ if (val.elecAC1 >= 110) {
+ obj["ELEC-Line-AC1-ACESS"].show();
+ } else {
+ obj["ELEC-Line-AC1-ACESS"].hide();
+ }
+ obj["ELEC-Line-AC2-ACESS"].hide();
+ } elsif (val.elecAcEssFeed2) {
+ obj["ELEC-Line-AC1-ACESS"].hide();
+ if (val.elecAC2 >= 110) {
+ obj["ELEC-Line-AC2-ACESS"].show();
+ } else {
+ obj["ELEC-Line-AC2-ACESS"].hide();
+ }
+ } else {
+ obj["ELEC-Line-AC1-ACESS"].hide();
+ obj["ELEC-Line-AC2-ACESS"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashList(["elecGen1Volt","elecGen1GLC"], nil, func(val) {
+ if (val.elecGen1Volt >= 110 and val.elecGen1GLC) {
+ obj["ELEC-Line-GEN1-AC1"].show();
+ } else {
+ obj["ELEC-Line-GEN1-AC1"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashList(["elecGen2Volt","elecGen2GLC"], nil, func(val) {
+ if (val.elecGen2Volt >= 110 and val.elecGen2GLC) {
+ obj["ELEC-Line-GEN1-AC1"].show();
+ } else {
+ obj["ELEC-Line-GEN1-AC1"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashList(["elecAcTie1","elecAcTie2","apuGLC","elecExtEPC","elecGen1GLC","elecGen2GLC"], nil, func(val) {
+ if (val.apuGLC and (val.elecAcTie1 or val.elecAcTie2)) {
+ obj["APU-out"].show();
+ } else {
+ obj["APU-out"].hide();
+ }
+
+ if (val.elecExtEPC and (val.elecAcTie1 or val.elecAcTie2)) {
+ obj["EXT-out"].show();
+ } else {
+ obj["EXT-out"].hide();
+ }
+
+
+ if (val.elecAcTie1 and val.elecAcTie2) {
+ obj["ELEC-Line-APU-AC1"].show();
+ obj["ELEC-Line-APU-EXT"].show();
+ obj["ELEC-Line-EXT-AC2"].show();
+ } else {
+ if (val.elecAcTie1) {
+ obj["ELEC-Line-APU-AC1"].show();
+ } else {
+ obj["ELEC-Line-APU-AC1"].hide();
+ }
+
+ if ((val.elecAcTie2 and val.apuGLC and !val.elecGen2GLC) or (val.elecAcTie1 and val.elecExtEPC and !val.elecGen1GLC)) {
+ obj["ELEC-Line-APU-EXT"].show();
+ } else {
+ obj["ELEC-Line-APU-EXT"].hide();
+ }
+
+ if (val.elecAcTie2) {
+ obj["ELEC-Line-EXT-AC2"].show();
+ } else {
+ obj["ELEC-Line-EXT-AC2"].hide();
+ }
+ }
+ }),
+ props.UpdateManager.FromHashList(["elecACEss","ELEC-Line-ACESS-TRESS","elecTR1Contact","elecTR2Contact"], nil, func(val) {
+ if (val.elecACEss >= 110 and !val.elecAcEssEmerGenFeed and (!val.elecTR1Contact or !val.elecTR2Contact)) {
+ obj["ELEC-Line-ACESS-TRESS"].show();
+ } else {
+ obj["ELEC-Line-ACESS-TRESS"].hide();
+ }
+ }),
+ ];
+
+ obj.displayedGForce = 0;
+ obj.updateItemsBottom = [
+ props.UpdateManager.FromHashValue("acconfigUnits", nil, func(val) {
+ obj.units = val;
+ if (val) {
+ obj["GW-weight-unit"].setText("KG");
+ } else {
+ obj["GW-weight-unit"].setText("LBS");
+ }
+ }),
+ props.UpdateManager.FromHashValue("hour", nil, func(val) {
+ obj["UTCh"].setText(sprintf("%02d", val));
+ }),
+ props.UpdateManager.FromHashValue("minute", nil, func(val) {
+ obj["UTCm"].setText(sprintf("%02d", val));
+ }),
+ props.UpdateManager.FromHashValue("gForce", 0.05, func(val) {
+ if (obj.displayedGForce) {
+ obj["GLoad"].setText("G.LOAD " ~ sprintf("%3.1f", val));
+ }
+ }),
+ props.UpdateManager.FromHashValue("gForceDisplay", nil, func(val) {
+ if ((val == 1 and !obj.displayedGForce) or (val != 0 and obj.displayedGForce)) {
+ obj.displayedGForce = 1;
+ obj["GLoad"].show();
+ } else {
+ obj.displayedGForce = 0;
+ obj["GLoad"].hide();
+ }
+ }),
+ ];
+ return obj;
+ },
+ getKeysBottom: func() {
+ return ["TAT","SAT","GW","UTCh","UTCm","GLoad","GW-weight-unit"];
+ },
+ getKeys: func() {
+ return ["TAT","SAT","GW","UTCh","UTCm","GLoad","GW-weight-unit","BAT1-label","Bat1Volt","Bat1Ampere","BAT2-label","Bat2Volt","Bat2Ampere","BAT1-charge","BAT1-discharge","BAT2-charge","BAT2-discharge","ELEC-Line-DC1-DCBAT","ELEC-Line-DC1-DCESS","ELEC-Line-DC2-DCBAT",
+ "ELEC-Line-DC1-DCESS_DCBAT","ELEC-Line-DC2-DCESS_DCBAT","ELEC-Line-TR1-DC1","ELEC-Line-TR2-DC2","Shed-label","ELEC-Line-ESSTR-DCESS","TR1-label","TR1Volt","TR1Ampere","TR2-label","TR2Volt","TR2Ampere","EMERGEN-group","EmergenVolt","EmergenHz",
+ "ELEC-Line-Emergen-ESSTR","EMERGEN-Label-off","Emergen-Label","EMERGEN-out","ELEC-Line-ACESS-TRESS","ELEC-Line-AC1-TR1","ELEC-Line-AC2-TR2","ELEC-Line-AC1-ACESS","ELEC-Line-AC2-ACESS","ACESS-SHED","ACESS","AC1-in","AC2-in","ELEC-Line-GEN1-AC1","ELEC-Line-GEN2-AC2",
+ "ELEC-Line-APU-AC1","ELEC-Line-APU-EXT","ELEC-Line-EXT-AC2","APU-out","EXT-out","EXTPWR-group","ExtVolt","ExtHz","APU-content","APU-border","APUGentext","APUGenLoad","APUGenVolt","APUGenHz","APUGEN-off","GEN1-label","Gen1Load","Gen1Volt","Gen1Hz",
+ "GEN2-label","Gen2Load","GEN2-off","Gen2Volt","Gen2Hz","ELEC-IDG-1-label","ELEC-IDG-1-num-label","ELEC-IDG-1-Temp","IDG1-LOPR","IDG1-DISC","IDG1-RISE-Value","IDG1-RISE-label","GalleyShed","ELEC-IDG-2-Temp","ELEC-IDG-2-label","ELEC-IDG-2-num-label","IDG2-RISE-label","IDG2-RISE-Value","IDG2-LOPR",
+ "IDG2-DISC","ESSTR-group","ESSTR","ESSTR-Volt","ESSTR-Ampere","BAT1-content","BAT2-content","BAT1-OFF","BAT2-OFF","GEN1-content","GEN2-content","GEN-1-num-label","GEN-2-num-label","GEN1-off","GEN2-off","GEN1-num-label","GEN2-num-label","EXTPWR-label",
+ "ELEC-ACESS-SHED-label","ELEC-DCBAT-label","ELEC-DCESS-label","ELEC-DC2-label","ELEC-DC1-label","ELEC-AC1-label","ELEC-AC2-label","ELEC-ACESS-label","ELEC-Line-ESSTR-DCESS-off","ELEC-Line-Emergen-ESSTR-off"];
+ },
+ updateBottom: func(notification) {
+ foreach(var update_item_bottom; me.updateItemsBottom)
+ {
+ update_item_bottom.update(notification);
+ }
+
+ if (fmgc.FMGCInternal.fuelRequest and fmgc.FMGCInternal.blockConfirmed and !fmgc.FMGCInternal.fuelCalculating and notification.FWCPhase != 1) {
+ if (me.units) {
+ me["GW"].setText(sprintf("%s", math.round(fmgc.FMGCInternal.fuelPredGw * 1000 * LBS2KGS, 100)));
+ } else {
+ me["GW"].setText(sprintf("%s", math.round(fmgc.FMGCInternal.fuelPredGw * 1000, 100)));
+ }
+ me["GW"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ me["GW"].setText(sprintf("%s", "-----"));
+ me["GW"].setColor(0.0901,0.6039,0.7176);
+ }
+
+ if (dmc.DMController.DMCs[1].outputs[4] != nil) {
+ me["SAT"].setText(sprintf("%+2.0f", dmc.DMController.DMCs[1].outputs[4].getValue()));
+ me["SAT"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ me["SAT"].setText(sprintf("%s", "XX"));
+ me["SAT"].setColor(0.7333,0.3803,0);
+ }
+
+ if (dmc.DMController.DMCs[1].outputs[5] != nil) {
+ me["TAT"].setText(sprintf("%+2.0f", dmc.DMController.DMCs[1].outputs[5].getValue()));
+ me["TAT"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ me["TAT"].setText(sprintf("%s", "XX"));
+ me["TAT"].setColor(0.7333,0.3803,0);
+ }
+ },
+ update: func(notification) {
+ me.updatePower();
+
+ if (me.test.getVisible() == 1) {
+ me.updateTest(notification);
+ }
+
+ if (me.group.getVisible() == 0) {
+ return;
+ }
+
+ foreach(var update_item; me.update_items)
+ {
+ update_item.update(notification);
+ }
+
+ me.updateBottom(notification);
+ },
+ updatePower: func() {
+ if (me.name == ecam.SystemDisplayController.displayedPage.name) {
+ if (du4_lgt.getValue() > 0.01 and systems.ELEC.Bus.ac2.getValue() >= 110) {
+ if (du4_test_time.getValue() + du4_test_amount.getValue() >= pts.Sim.Time.elapsedSec.getValue()) {
+ me.group.setVisible(0);
+ me.test.setVisible(1);
+ } else {
+ me.group.setVisible(1);
+ me.test.setVisible(0);
+ }
+ } else {
+ me.group.setVisible(0);
+ me.test.setVisible(0);
+ }
+ } else {
+ me.group.setVisible(0);
+ # don't hide the test group; just let whichever page is active control it
+ }
+ },
+};
+
+var input = {
+ elecAcEssFeed1: "/systems/electrical/relay/ac-ess-feed-1/contact-pos",
+ elecAcEssFeed2: "/systems/electrical/relay/ac-ess-feed-2/contact-pos",
+ elecBat1Amp: "/systems/electrical/sources/bat-1/amps",
+ elecBat2Amp: "/systems/electrical/sources/bat-2/amps",
+ elecBat1Direction: "/systems/electrical/sources/bat-1/direction",
+ elecBat2Direction: "/systems/electrical/sources/bat-2/direction",
+ elecBat1Fault: "/systems/electrical/light/bat-1-fault",
+ elecBat2Fault: "/systems/electrical/light/bat-2-fault",
+ elecBat1Volt: "/systems/electrical/sources/bat-1/volt",
+ elecBat2Volt: "/systems/electrical/sources/bat-2/volt",
+ elecBat1Switch: "/controls/electrical/switches/bat-1",
+ elecBat2Switch: "/controls/electrical/switches/bat-2",
+ elecTR1Amp: "/systems/electrical/relay/tr-contactor-1/output-amp",
+ elecTR2Amp: "/systems/electrical/relay/tr-contactor-2/output-amp",
+ elecTR1Volt: "/systems/electrical/relay/tr-contactor-1/output",
+ elecTR2Volt: "/systems/electrical/relay/tr-contactor-2/output",
+ elecTR1Contact: "/systems/electrical/relay/tr-contactor-1/contact-pos",
+ elecTR2Contact: "/systems/electrical/relay/tr-contactor-2/contact-pos",
+ elecTREssAmp: "/systems/electrical/relay/dc-ess-feed-tr/output-amp",
+ elecTrEssContact: "/systems/electrical/relay/dc-ess-feed-tr/contact-pos",
+ elecTREssVolt: "/systems/electrical/relay/dc-ess-feed-tr/output",
+ elecIDG1Disc: "/controls/electrical/switches/idg-1-disc",
+ elecIDG2Disc: "/controls/electrical/switches/idg-2-disc",
+ elecGroundCart: "/controls/electrical/ground-cart",
+ elecExtHertz: "/systems/electrical/sources/ext/output-hertz",
+ elecExtVolt: "/systems/electrical/sources/ext/output-volt",
+ elecDCTie1: "/systems/electrical/relay/dc-bus-tie-dc-1/contact-pos",
+ elecDCTie2: "/systems/electrical/relay/dc-bus-tie-dc-2/contact-pos",
+ elecDcEssFeedBat: "/systems/electrical/relay/dc-ess-feed-bat/contact-pos",
+ elecAcEssEmerGenFeed: "/systems/electrical/relay/ac-ess-feed-emer-gen/contact-pos",
+ elecEmerGenVolts: "/systems/electrical/sources/emer-gen/output-volt",
+ elecEmerGenVoltsRelay: "/systems/electrical/relay/emer-glc/output",
+ elecEmerGenHertz: "/systems/electrical/sources/emer-gen/output-hertz",
+ elecGen1Switch: "/controls/electrical/switches/gen-1",
+ elecGen1Hertz: "/systems/electrical/sources/idg-1/output-hertz",
+ elecGen1Volt: "/systems/electrical/sources/idg-1/output-volt",
+ elecGen1Relay: "/systems/electrical/sources/idg-1/gcr-relay",
+ elecGen1GLC: "/systems/electrical/relay/gen-1-glc/contact-pos",
+ elecGen2Switch: "/controls/electrical/switches/gen-2",
+ elecGen2Hertz: "/systems/electrical/sources/idg-2/output-hertz",
+ elecGen2Volt: "/systems/electrical/sources/idg-2/output-volt",
+ elecGen2Relay: "/systems/electrical/sources/idg-2/gcr-relay",
+ elecGen2GLC: "/systems/electrical/relay/gen-2-glc/contact-pos",
+ elecAcTie1: "/systems/electrical/relay/ac-bus-ac-bus-tie-1/contact-pos",
+ elecAcTie2: "/systems/electrical/relay/ac-bus-ac-bus-tie-2/contact-pos",
+ elecExtEPC: "/systems/electrical/relay/ext-epc/contact-pos",
+ ElecGalleyShed: "/systems/electrical/some-electric-thingie/galley-shed",
+};
+
+foreach (var name; keys(input)) {
+ emesary.GlobalTransmitter.NotifyAll(notifications.FrameNotificationAddProperty.new("A320 System Display", name, input[name]));
+}
\ No newline at end of file
diff --git a/Models/Instruments/Lower-ECAM/Lower-ECAM-eng.nas b/Models/Instruments/Lower-ECAM/Lower-ECAM-eng.nas
new file mode 100644
index 00000000..c00d7e5e
--- /dev/null
+++ b/Models/Instruments/Lower-ECAM/Lower-ECAM-eng.nas
@@ -0,0 +1,258 @@
+# A3XX Lower ECAM Canvas
+# Copyright (c) 2021 Josh Davidson (Octal450) and Jonathan Redpath
+
+var fuel_used_lbs1 = props.globals.getNode("/systems/fuel/fuel-used-1", 1);
+var fuel_used_lbs2 = props.globals.getNode("/systems/fuel/fuel-used-2", 1);
+
+var QT2LTR = 0.946353;
+
+var canvas_lowerECAMPageEng =
+{
+ new: func(svg,name) {
+ var obj = {parents: [canvas_lowerECAMPageEng,canvas_lowerECAM_base] };
+ obj.group = obj.canvas.createGroup();
+ obj.name = name;
+
+ canvas.parsesvg(obj.group, svg, {"font-mapper": obj.font_mapper} );
+
+ foreach(var key; obj.getKeys()) {
+ obj[key] = obj.group.getElementById(key);
+ };
+
+ foreach(var key; obj.getKeysBottom()) {
+ obj[key] = obj.group.getElementById(key);
+ };
+
+ obj.units = acconfig_weight_kgs.getValue();
+
+ # init
+ obj["FUEL-clog-1"].hide();
+ obj["FUEL-clog-2"].hide();
+ obj["OIL-clog-1"].hide();
+ obj["OIL-clog-2"].hide();
+
+ obj.quantity = [nil, nil];
+
+ obj.update_items = [
+ props.UpdateManager.FromHashValue("engOilQt1", 0.005, func(val) {
+ if (obj.units) {
+ obj.quantity[0] = sprintf("%2.1f",(0.1 * math.round(val * QT2LTR * 10,5)));
+ obj["OilQT1"].setText(sprintf("%s", left(obj.quantity[0], (size(obj.quantity[0]) == 4 ? 2 : 1))));
+ obj["OilQT1-decimal"].setText(sprintf("%s", right(obj.quantity[0],1)));
+ obj["OilQT1-needle"].setRotation(((val * QT2LTR) + 90) * D2R);
+ } else {
+ obj.quantity[0] = sprintf("%2.1f",(0.1 * math.round(val * 10,5)));
+ obj["OilQT1"].setText(sprintf("%s", left(obj.quantity[0], (size(obj.quantity[0]) == 4 ? 2 : 1))));
+ obj["OilQT1-decimal"].setText(sprintf("%s", right(obj.quantity[0],1)));
+ obj["OilQT1-needle"].setRotation((val + 90) * D2R);
+ }
+ }),
+ props.UpdateManager.FromHashValue("engOilQt2", 0.005, func(val) {
+ if (obj.units) {
+ obj.quantity[1] = sprintf("%2.1f",(0.1 * math.round(val * QT2LTR * 10,5)));
+ obj["OilQT2"].setText(sprintf("%s", left(obj.quantity[1], (size(obj.quantity[1]) == 4 ? 2 : 1))));
+ obj["OilQT2-decimal"].setText(sprintf("%s", right(obj.quantity[1],1)));
+ obj["OilQT2-needle"].setRotation(((val * QT2LTR) + 90) * D2R);
+ } else {
+ obj.quantity[1] = sprintf("%2.1f",(0.1 * math.round(val * 10,5)));
+ obj["OilQT2"].setText(sprintf("%s", left(obj.quantity[1], (size(obj.quantity[1]) == 4 ? 2 : 1))));
+ obj["OilQT2-decimal"].setText(sprintf("%s", right(obj.quantity[1],1)));
+ obj["OilQT2-needle"].setRotation((val + 90) * D2R);
+ }
+ }),
+ props.UpdateManager.FromHashValue("engOilPsi1", 0.25, func(val) {
+ if (val >= 13) {
+ obj["OilPSI1"].setColor(0.0509,0.7529,0.2941);
+ obj["OilPSI1-needle"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["OilPSI1"].setColor(1,0,0);
+ obj["OilPSI1-needle"].setColor(1,0,0);
+ }
+
+ obj["OilPSI1"].setText(sprintf("%s", math.round(val)));
+ obj["OilPSI1-needle"].setRotation((val + 90) * D2R);
+ }),
+ props.UpdateManager.FromHashValue("engOilPsi2", 0.25, func(val) {
+ if (val >= 13) {
+ obj["OilPSI2"].setColor(0.0509,0.7529,0.2941);
+ obj["OilPSI2-needle"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["OilPSI2"].setColor(1,0,0);
+ obj["OilPSI2-needle"].setColor(1,0,0);
+ }
+
+ obj["OilPSI2"].setText(sprintf("%s", math.round(val)));
+ obj["OilPSI2-needle"].setRotation((val + 90) * D2R);
+ }),
+ props.UpdateManager.FromHashValue("acconfigUnits", nil, func(val) {
+ if (val) {
+ obj["Fused-weight-unit"].setText("KG");
+ obj["Fused-oil-unit"].setText("LTR");
+ # immediately update parameters
+ obj.quantity[0] = sprintf("%2.1f",(0.1 * math.round(pts.Engines.Engine.oilQt[0].getValue() * QT2LTR * 10,5)));
+ obj["OilQT1"].setText(sprintf("%s", left(obj.quantity[0], (size(obj.quantity[0]) == 4 ? 2 : 1))));
+ obj["OilQT1-decimal"].setText(sprintf("%s", right(obj.quantity[0],1)));
+ obj["OilQT1-needle"].setRotation(((pts.Engines.Engine.oilQt[0].getValue() * QT2LTR) + 90) * D2R);
+ obj.quantity[1] = sprintf("%2.1f",(0.1 * math.round(pts.Engines.Engine.oilQt[1].getValue() * QT2LTR * 10,5)));
+ obj["OilQT2"].setText(sprintf("%s", left(obj.quantity[1], (size(obj.quantity[1]) == 4 ? 2 : 1))));
+ obj["OilQT2-decimal"].setText(sprintf("%s", right(obj.quantity[1],1)));
+ obj["OilQT2-needle"].setRotation(((pts.Engines.Engine.oilQt[1].getValue() * QT2LTR) + 90) * D2R);
+ obj["FUEL-used-1"].setText(sprintf("%s", math.round(fuel_used_lbs1.getValue() * LBS2KGS, 10)));
+ obj["FUEL-used-2"].setText(sprintf("%s", math.round(fuel_used_lbs2.getValue() * LBS2KGS, 10)));
+ } else {
+ obj["Fused-weight-unit"].setText("LBS");
+ obj["Fused-oil-unit"].setText("QT");
+ obj.quantity[0] = sprintf("%2.1f",(0.1 * math.round(pts.Engines.Engine.oilQt[0].getValue() * 10,5)));
+ obj["OilQT1"].setText(sprintf("%s", left(obj.quantity[0], (size(obj.quantity[0]) == 4 ? 2 : 1))));
+ obj["OilQT1-decimal"].setText(sprintf("%s", right(obj.quantity[0],1)));
+ obj["OilQT1-needle"].setRotation((pts.Engines.Engine.oilQt[0].getValue() + 90) * D2R);
+ obj.quantity[1] = sprintf("%2.1f",(0.1 * math.round(pts.Engines.Engine.oilQt[1].getValue() * 10,5)));
+ obj["OilQT2"].setText(sprintf("%s", left(obj.quantity[1], (size(obj.quantity[1]) == 4 ? 2 : 1))));
+ obj["OilQT2-decimal"].setText(sprintf("%s", right(obj.quantity[1],1)));
+ obj["OilQT2-needle"].setRotation((pts.Engines.Engine.oilQt[1].getValue() + 90) * D2R);
+ obj["FUEL-used-1"].setText(sprintf("%s", math.round(fuel_used_lbs1.getValue(), 10)));
+ obj["FUEL-used-2"].setText(sprintf("%s", math.round(fuel_used_lbs2.getValue(), 10)));
+ }
+ }),
+ props.UpdateManager.FromHashValue("engFuelUsed1", 1, func(val) {
+ if (obj.units) {
+ obj["FUEL-used-1"].setText(sprintf("%s", math.round(val * LBS2KGS, 10)));
+ } else {
+ obj["FUEL-used-1"].setText(sprintf("%s", math.round(val, 10)));
+ }
+ }),
+ props.UpdateManager.FromHashValue("engFuelUsed2", 1, func(val) {
+ if (obj.units) {
+ obj["FUEL-used-2"].setText(sprintf("%s", math.round(val * LBS2KGS, 10)));
+ } else {
+ obj["FUEL-used-2"].setText(sprintf("%s", math.round(val, 10)));
+ }
+ }),
+ ];
+
+ obj.displayedGForce = 0;
+ obj.updateItemsBottom = [
+ props.UpdateManager.FromHashValue("acconfigUnits", nil, func(val) {
+ obj.units = val;
+ if (val) {
+ obj["GW-weight-unit"].setText("KG");
+ } else {
+ obj["GW-weight-unit"].setText("LBS");
+ }
+ }),
+ props.UpdateManager.FromHashValue("hour", nil, func(val) {
+ obj["UTCh"].setText(sprintf("%02d", val));
+ }),
+ props.UpdateManager.FromHashValue("minute", nil, func(val) {
+ obj["UTCm"].setText(sprintf("%02d", val));
+ }),
+ props.UpdateManager.FromHashValue("gForce", 0.05, func(val) {
+ if (obj.displayedGForce) {
+ obj["GLoad"].setText("G.LOAD " ~ sprintf("%3.1f", val));
+ }
+ }),
+ props.UpdateManager.FromHashValue("gForceDisplay", nil, func(val) {
+ if ((val == 1 and !obj.displayedGForce) or (val != 0 and obj.displayedGForce)) {
+ obj.displayedGForce = 1;
+ obj["GLoad"].show();
+ } else {
+ obj.displayedGForce = 0;
+ obj["GLoad"].hide();
+ }
+ }),
+ ];
+ return obj;
+ },
+ getKeysBottom: func() {
+ return ["TAT","SAT","GW","UTCh","UTCm","GLoad","GW-weight-unit"];
+ },
+ getKeys: func() {
+ return["OilQT1-needle","OilQT2-needle","OilQT1","OilQT2","OilQT1-decimal","OilQT2-decimal","OilPSI1-needle","OilPSI2-needle","OilPSI1","OilPSI2",
+ "FUEL-used-1","FUEL-used-2", "Fused-weight-unit","Fused-oil-unit","FUEL-clog-1","FUEL-clog-2","OIL-clog-1","OIL-clog-2","OilTemp1","OilTemp2",
+ "VIB-N1-1","VIB-N1-2","VIB-N2-1","VIB-N2-2"];
+ },
+ updateBottom: func(notification) {
+ foreach(var update_item_bottom; me.updateItemsBottom)
+ {
+ update_item_bottom.update(notification);
+ }
+
+ if (fmgc.FMGCInternal.fuelRequest and fmgc.FMGCInternal.blockConfirmed and !fmgc.FMGCInternal.fuelCalculating and notification.FWCPhase != 1) {
+ if (me.units) {
+ me["GW"].setText(sprintf("%s", math.round(fmgc.FMGCInternal.fuelPredGw * 1000 * LBS2KGS, 100)));
+ } else {
+ me["GW"].setText(sprintf("%s", math.round(fmgc.FMGCInternal.fuelPredGw * 1000, 100)));
+ }
+ me["GW"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ me["GW"].setText(sprintf("%s", "-----"));
+ me["GW"].setColor(0.0901,0.6039,0.7176);
+ }
+
+ if (dmc.DMController.DMCs[1].outputs[4] != nil) {
+ me["SAT"].setText(sprintf("%+2.0f", dmc.DMController.DMCs[1].outputs[4].getValue()));
+ me["SAT"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ me["SAT"].setText(sprintf("%s", "XX"));
+ me["SAT"].setColor(0.7333,0.3803,0);
+ }
+
+ if (dmc.DMController.DMCs[1].outputs[5] != nil) {
+ me["TAT"].setText(sprintf("%+2.0f", dmc.DMController.DMCs[1].outputs[5].getValue()));
+ me["TAT"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ me["TAT"].setText(sprintf("%s", "XX"));
+ me["TAT"].setColor(0.7333,0.3803,0);
+ }
+ },
+ update: func(notification) {
+ me.updatePower();
+
+ if (me.test.getVisible() == 1) {
+ me.updateTest(notification);
+ }
+
+ if (me.group.getVisible() == 0) {
+ return;
+ }
+
+ foreach(var update_item; me.update_items)
+ {
+ update_item.update(notification);
+ }
+
+ me.updateBottom(notification);
+ },
+ updatePower: func() {
+ if (me.name == ecam.SystemDisplayController.displayedPage.name) {
+ if (du4_lgt.getValue() > 0.01 and systems.ELEC.Bus.ac2.getValue() >= 110) {
+ if (du4_test_time.getValue() + du4_test_amount.getValue() >= pts.Sim.Time.elapsedSec.getValue()) {
+ me.group.setVisible(0);
+ me.test.setVisible(1);
+ } else {
+ me.group.setVisible(1);
+ me.test.setVisible(0);
+ }
+ } else {
+ me.group.setVisible(0);
+ me.test.setVisible(0);
+ }
+ } else {
+ me.group.setVisible(0);
+ # don't hide the test group; just let whichever page is active control it
+ }
+ },
+};
+
+var input = {
+ engFuelUsed1: "/systems/fuel/fuel-used-1",
+ engFuelUsed2: "/systems/fuel/fuel-used-2",
+ engOilQt1: "/engines/engine[0]/oil-qt-actual",
+ engOilQt2: "/engines/engine[1]/oil-qt-actual",
+ engOilPsi1: "/engines/engine[0]/oil-psi-actual",
+ engOilPsi2: "/engines/engine[1]/oil-psi-actual",
+};
+
+foreach (var name; keys(input)) {
+ emesary.GlobalTransmitter.NotifyAll(notifications.FrameNotificationAddProperty.new("A320 System Display", name, input[name]));
+}
\ No newline at end of file
diff --git a/Models/Instruments/Lower-ECAM/Lower-ECAM-fctl.nas b/Models/Instruments/Lower-ECAM/Lower-ECAM-fctl.nas
new file mode 100644
index 00000000..931d2a65
--- /dev/null
+++ b/Models/Instruments/Lower-ECAM/Lower-ECAM-fctl.nas
@@ -0,0 +1,611 @@
+# A3XX Lower ECAM Canvas
+# Copyright (c) 2021 Josh Davidson (Octal450) and Jonathan Redpath
+
+var canvas_lowerECAMPageFctl =
+{
+ new: func(svg,name) {
+ var obj = {parents: [canvas_lowerECAMPageFctl,canvas_lowerECAM_base] };
+ obj.group = obj.canvas.createGroup();
+ obj.name = name;
+
+ canvas.parsesvg(obj.group, svg, {"font-mapper": obj.font_mapper} );
+
+ foreach(var key; obj.getKeys()) {
+ obj[key] = obj.group.getElementById(key);
+ };
+
+ foreach(var key; obj.getKeysBottom()) {
+ obj[key] = obj.group.getElementById(key);
+ };
+
+ obj.units = acconfig_weight_kgs.getValue();
+
+ # init
+
+ obj.update_items = [
+ props.UpdateManager.FromHashList(["green","elac1","elac2","sec2"], nil, func(val) {
+ if (val.green >= 1450) {
+ if (val.elac2 or val.sec2) {
+ obj["elevLgreen"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["elevLgreen"].setColor(0.7333,0.3803,0);
+ }
+
+ if (val.elac2) {
+ obj["ailLgreen"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["ailLgreen"].setColor(0.7333,0.3803,0);
+ }
+ if (val.elac1) {
+ obj["ailRgreen"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["ailRgreen"].setColor(0.7333,0.3803,0);
+ }
+ obj["ruddergreen"].setColor(0.0509,0.7529,0.2941);
+ obj["PTgreen"].setColor(0.0509,0.7529,0.2941);
+ obj["spdbrkgreen"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["ailLgreen"].setColor(0.7333,0.3803,0);
+ obj["ailRgreen"].setColor(0.7333,0.3803,0);
+ obj["elevLgreen"].setColor(0.7333,0.3803,0);
+ obj["ruddergreen"].setColor(0.7333,0.3803,0);
+ obj["PTgreen"].setColor(0.7333,0.3803,0);
+ obj["spdbrkgreen"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashList(["yellow","elac2","sec2"], nil, func(val) {
+ if (val.yellow >= 1450) {
+ if (val.elac2 or val.sec2) {
+ obj["elevRyellow"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["elevRyellow"].setColor(0.7333,0.3803,0);
+ }
+ obj["rudderyellow"].setColor(0.0509,0.7529,0.2941);
+ obj["PTyellow"].setColor(0.0509,0.7529,0.2941);
+ obj["spdbrkyellow"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["elevRyellow"].setColor(0.7333,0.3803,0);
+ obj["rudderyellow"].setColor(0.7333,0.3803,0);
+ obj["PTyellow"].setColor(0.7333,0.3803,0);
+ obj["spdbrkyellow"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashList(["blue","elac1","elac2","sec1"], nil, func(val) {
+ if (val.blue >= 1500) {
+ if (val.elac1) {
+ obj["ailLblue"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["ailLblue"].setColor(0.7333,0.3803,0);
+ }
+ if (val.elac1 or val.sec1) {
+ obj["elevLblue"].setColor(0.0509,0.7529,0.2941);
+ obj["elevRblue"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["elevLblue"].setColor(0.7333,0.3803,0);
+ obj["elevRblue"].setColor(0.7333,0.3803,0);
+ }
+ if (val.elac2) {
+ obj["ailRblue"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["ailRblue"].setColor(0.7333,0.3803,0);
+ }
+ obj["rudderblue"].setColor(0.0509,0.7529,0.2941);
+ obj["spdbrkblue"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["ailLblue"].setColor(0.7333,0.3803,0);
+ obj["ailRblue"].setColor(0.7333,0.3803,0);
+ obj["elevLblue"].setColor(0.7333,0.3803,0);
+ obj["elevRblue"].setColor(0.7333,0.3803,0);
+ obj["rudderblue"].setColor(0.7333,0.3803,0);
+ obj["spdbrkblue"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashValue("fctlAilL", 0.001, func(val) {
+ obj["ailL"].setTranslation(0, val * 100);
+ }),
+ props.UpdateManager.FromHashValue("fctlAilR", 0.001, func(val) {
+ obj["ailR"].setTranslation(0, val * -100);
+ }),
+ props.UpdateManager.FromHashList(["blue","green","elac1","elac2"], nil, func(val) {
+ if ((val.blue < 1500 or !val.elac1) and (val.green < 1500 or !val.elac2)) {
+ obj["ailL"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["ailL"].setColor(0.0509,0.7529,0.2941);
+ }
+ if ((val.green < 1500 or !val.elac1) and (val.blue < 1500 or !val.elac2)) {
+ obj["ailR"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["ailR"].setColor(0.0509,0.7529,0.2941);
+ }
+ }),
+ props.UpdateManager.FromHashValue("fctlElevL", 0.001, func(val) {
+ obj["elevL"].setTranslation(0, val * 100);
+ }),
+ props.UpdateManager.FromHashValue("fctlElevR", 0.001, func(val) {
+ obj["elevR"].setTranslation(0, val * 100);
+ }),
+ props.UpdateManager.FromHashList(["blue","green","yellow","elac1","elac2","sec1","sec2"], nil, func(val) {
+ if ((val.blue < 1500 or (!val.elac1 and !val.sec1)) and (val.green < 1500 or (!val.elac2 and !val.sec2))) {
+ obj["elevL"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["elevL"].setColor(0.0509,0.7529,0.2941);
+ }
+
+ if ((val.blue < 1500 or (!val.elac1 and !val.sec1)) and (val.yellow < 1500 or (!val.elac2 and !val.sec2))) {
+ obj["elevR"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["elevR"].setColor(0.0509,0.7529,0.2941);
+ }
+ }),
+ props.UpdateManager.FromHashValue("fctlElevTrim", 0.01, func(val) {
+ obj["PT"].setText(sprintf("%2.1f", val));
+ if (val >= 0.09) {
+ obj["PTupdn"].setText("UP");
+ obj["PTupdn"].show();
+ } elsif (val <= -0.09) {
+ obj["PTupdn"].setText("DN");
+ obj["PTupdn"].show();
+ } else {
+ obj["PTupdn"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashValue("elac1", nil, func(val) {
+ if (val) {
+ obj["elac1"].setColor(0.0509,0.7529,0.2941);
+ obj["path4249"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["elac1"].setColor(0.7333,0.3803,0);
+ obj["path4249"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashValue("elac2", nil, func(val) {
+ if (val) {
+ obj["elac2"].setColor(0.0509,0.7529,0.2941);
+ obj["path4249-3"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["elac2"].setColor(0.7333,0.3803,0);
+ obj["path4249-3"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashValue("sec1", nil, func(val) {
+ if (val) {
+ obj["sec1"].setColor(0.0509,0.7529,0.2941);
+ obj["path4249-3-6-7"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["sec1"].setColor(0.7333,0.3803,0);
+ obj["path4249-3-6-7"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashValue("sec2", nil, func(val) {
+ if (val) {
+ obj["sec2"].setColor(0.0509,0.7529,0.2941);
+ obj["path4249-3-6-7-5"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["sec2"].setColor(0.7333,0.3803,0);
+ obj["path4249-3-6-7-5"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashValue("sec3", nil, func(val) {
+ if (val) {
+ obj["sec3"].setColor(0.0509,0.7529,0.2941);
+ obj["path4249-3-6"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["sec3"].setColor(0.7333,0.3803,0);
+ obj["path4249-3-6"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashList(["blue","yellow","green"], 25, func(val) {
+ if (val.green < 1500 and val.yellow < 1500) {
+ obj["PT"].setColor(0.7333,0.3803,0);
+ obj["PTupdn"].setColor(0.7333,0.3803,0);
+ obj["PTcc"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["PT"].setColor(0.0509,0.7529,0.2941);
+ obj["PTupdn"].setColor(0.0509,0.7529,0.2941);
+ obj["PTcc"].setColor(0.0901,0.6039,0.7176);
+ }
+
+ if (val.blue < 1500 and val.yellow < 1500 and val.green < 1500) {
+ obj["rudder"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["rudder"].setColor(0.0509,0.7529,0.2941);
+ }
+ }),
+ props.UpdateManager.FromHashValue("fctlRudder", 0.001, func(val) {
+ obj["rudder"].setRotation(val * -0.024);
+ }),
+ props.UpdateManager.FromHashValue("fctlRudderTrim", 0.01, func(val) {
+ obj["rudderTrimInd"].setRotation(val * -0.024);
+ }),
+ props.UpdateManager.FromHashValue("fctlTHSJam", nil, func(val) {
+ if (val) {
+ obj["pitchTrimStatus"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["pitchTrimStatus"].setColor(0.8078,0.8039,0.8078);
+ }
+ }),
+ props.UpdateManager.FromHashValue("spoilerL1", 0.5, func(val) {
+ if (val < 1.5) {
+ obj["spoiler1Lex"].hide();
+ obj["spoiler1Lrt"].show();
+ } else {
+ obj["spoiler1Lrt"].hide();
+ obj["spoiler1Lex"].show();
+ }
+ }),
+ props.UpdateManager.FromHashValue("spoilerL2", 0.5, func(val) {
+ if (val < 1.5) {
+ obj["spoiler2Lex"].hide();
+ obj["spoiler2Lrt"].show();
+ } else {
+ obj["spoiler2Lrt"].hide();
+ obj["spoiler2Lex"].show();
+ }
+ }),
+ props.UpdateManager.FromHashValue("spoilerL3", 0.5, func(val) {
+ if (val < 1.5) {
+ obj["spoiler3Lex"].hide();
+ obj["spoiler3Lrt"].show();
+ } else {
+ obj["spoiler3Lrt"].hide();
+ obj["spoiler3Lex"].show();
+ }
+ }),
+ props.UpdateManager.FromHashValue("spoilerL4", 0.5, func(val) {
+ if (val < 1.5) {
+ obj["spoiler4Lex"].hide();
+ obj["spoiler4Lrt"].show();
+ } else {
+ obj["spoiler4Lrt"].hide();
+ obj["spoiler4Lex"].show();
+ }
+ }),
+ props.UpdateManager.FromHashValue("spoilerL5", 0.5, func(val) {
+ if (val < 1.5) {
+ obj["spoiler5Lex"].hide();
+ obj["spoiler5Lrt"].show();
+ } else {
+ obj["spoiler5Lrt"].hide();
+ obj["spoiler5Lex"].show();
+ }
+ }),
+ props.UpdateManager.FromHashValue("spoilerR1", 0.5, func(val) {
+ if (val < 1.5) {
+ obj["spoiler1Rex"].hide();
+ obj["spoiler1Rrt"].show();
+ } else {
+ obj["spoiler1Rrt"].hide();
+ obj["spoiler1Rex"].show();
+ }
+ }),
+ props.UpdateManager.FromHashValue("spoilerR2", 0.5, func(val) {
+ if (val < 1.5) {
+ obj["spoiler2Rex"].hide();
+ obj["spoiler2Rrt"].show();
+ } else {
+ obj["spoiler2Rrt"].hide();
+ obj["spoiler2Rex"].show();
+ }
+ }),
+ props.UpdateManager.FromHashValue("spoilerR3", 0.5, func(val) {
+ if (val < 1.5) {
+ obj["spoiler3Rex"].hide();
+ obj["spoiler3Rrt"].show();
+ } else {
+ obj["spoiler3Rrt"].hide();
+ obj["spoiler3Rex"].show();
+ }
+ }),
+ props.UpdateManager.FromHashValue("spoilerR4", 0.5, func(val) {
+ if (val < 1.5) {
+ obj["spoiler4Rex"].hide();
+ obj["spoiler4Rrt"].show();
+ } else {
+ obj["spoiler4Rrt"].hide();
+ obj["spoiler4Rex"].show();
+ }
+ }),
+ props.UpdateManager.FromHashValue("spoilerR5", 0.5, func(val) {
+ if (val < 1.5) {
+ obj["spoiler5Rex"].hide();
+ obj["spoiler5Rrt"].show();
+ } else {
+ obj["spoiler5Rrt"].hide();
+ obj["spoiler5Rex"].show();
+ }
+ }),
+ props.UpdateManager.FromHashList(["spoilerL1Failure","spoilerL1","green"], nil, func(val) {
+ if (val.spoilerL1Failure or val.green < 1500) {
+ obj["spoiler1Lex"].setColor(0.7333,0.3803,0);
+ obj["spoiler1Lrt"].setColor(0.7333,0.3803,0);
+ if (val.spoilerL1 < 1.5) {
+ obj["spoiler1Lf"].show();
+ } else {
+ obj["spoiler1Lf"].hide();
+ }
+ } else {
+ obj["spoiler1Lex"].setColor(0.0509,0.7529,0.2941);
+ obj["spoiler1Lrt"].setColor(0.0509,0.7529,0.2941);
+ obj["spoiler1Lf"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashList(["spoilerL2Failure","spoilerL2","yellow"], nil, func(val) {
+ if (val.spoilerL2Failure or val.yellow < 1500) {
+ obj["spoiler2Lex"].setColor(0.7333,0.3803,0);
+ obj["spoiler2Lrt"].setColor(0.7333,0.3803,0);
+ if (val.spoilerL2 < 1.5) {
+ obj["spoiler2Lf"].show();
+ } else {
+ obj["spoiler2Lf"].hide();
+ }
+ } else {
+ obj["spoiler2Lex"].setColor(0.0509,0.7529,0.2941);
+ obj["spoiler2Lrt"].setColor(0.0509,0.7529,0.2941);
+ obj["spoiler2Lf"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashList(["spoilerL3Failure","spoilerL3","blue"], nil, func(val) {
+ if (val.spoilerL3Failure or val.blue < 1500) {
+ obj["spoiler3Lex"].setColor(0.7333,0.3803,0);
+ obj["spoiler3Lrt"].setColor(0.7333,0.3803,0);
+ if (val.spoilerL3 < 1.5) {
+ obj["spoiler3Lf"].show();
+ } else {
+ obj["spoiler3Lf"].hide();
+ }
+ } else {
+ obj["spoiler3Lex"].setColor(0.0509,0.7529,0.2941);
+ obj["spoiler3Lrt"].setColor(0.0509,0.7529,0.2941);
+ obj["spoiler3Lf"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashList(["spoilerL4Failure","spoilerL4","yellow"], nil, func(val) {
+ if (val.spoilerL4Failure or val.yellow < 1500) {
+ obj["spoiler4Lex"].setColor(0.7333,0.3803,0);
+ obj["spoiler4Lrt"].setColor(0.7333,0.3803,0);
+ if (val.spoilerL4 < 1.5) {
+ obj["spoiler4Lf"].show();
+ } else {
+ obj["spoiler4Lf"].hide();
+ }
+ } else {
+ obj["spoiler4Lex"].setColor(0.0509,0.7529,0.2941);
+ obj["spoiler4Lrt"].setColor(0.0509,0.7529,0.2941);
+ obj["spoiler4Lf"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashList(["spoilerL5Failure","spoilerL5","green"], nil, func(val) {
+ if (val.spoilerL5Failure or val.green < 1500) {
+ obj["spoiler5Lex"].setColor(0.7333,0.3803,0);
+ obj["spoiler5Lrt"].setColor(0.7333,0.3803,0);
+ if (val.spoilerL5 < 1.5) {
+ obj["spoiler5Lf"].show();
+ } else {
+ obj["spoiler5Lf"].hide();
+ }
+ } else {
+ obj["spoiler5Lex"].setColor(0.0509,0.7529,0.2941);
+ obj["spoiler5Lrt"].setColor(0.0509,0.7529,0.2941);
+ obj["spoiler5Lf"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashList(["spoilerR1Failure","spoilerR1","green"], nil, func(val) {
+ if (val.spoilerR1Failure or val.green < 1500) {
+ obj["spoiler1Rex"].setColor(0.7333,0.3803,0);
+ obj["spoiler1Rrt"].setColor(0.7333,0.3803,0);
+ if (val.spoilerR1 < 1.5) {
+ obj["spoiler1Rf"].show();
+ } else {
+ obj["spoiler1Rf"].hide();
+ }
+ } else {
+ obj["spoiler1Rex"].setColor(0.0509,0.7529,0.2941);
+ obj["spoiler1Rrt"].setColor(0.0509,0.7529,0.2941);
+ obj["spoiler1Rf"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashList(["spoilerR2Failure","spoilerR2","yellow"], nil, func(val) {
+ if (val.spoilerR2Failure or val.yellow < 1500) {
+ obj["spoiler2Rex"].setColor(0.7333,0.3803,0);
+ obj["spoiler2Rrt"].setColor(0.7333,0.3803,0);
+ if (val.spoilerR2 < 1.5) {
+ obj["spoiler2Rf"].show();
+ } else {
+ obj["spoiler2Rf"].hide();
+ }
+ } else {
+ obj["spoiler2Rex"].setColor(0.0509,0.7529,0.2941);
+ obj["spoiler2Rrt"].setColor(0.0509,0.7529,0.2941);
+ obj["spoiler2Rf"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashList(["spoilerR3Failure","spoilerR3","blue"], nil, func(val) {
+ if (val.spoilerR3Failure or val.blue < 1500) {
+ obj["spoiler3Rex"].setColor(0.7333,0.3803,0);
+ obj["spoiler3Rrt"].setColor(0.7333,0.3803,0);
+ if (val.spoilerR3 < 1.5) {
+ obj["spoiler3Rf"].show();
+ } else {
+ obj["spoiler3Rf"].hide();
+ }
+ } else {
+ obj["spoiler3Rex"].setColor(0.0509,0.7529,0.2941);
+ obj["spoiler3Rrt"].setColor(0.0509,0.7529,0.2941);
+ obj["spoiler3Rf"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashList(["spoilerR4Failure","spoilerR4","yellow"], nil, func(val) {
+ if (val.spoilerR4Failure or val.yellow < 1500) {
+ obj["spoiler4Rex"].setColor(0.7333,0.3803,0);
+ obj["spoiler4Rrt"].setColor(0.7333,0.3803,0);
+ if (val.spoilerR4 < 1.5) {
+ obj["spoiler4Rf"].show();
+ } else {
+ obj["spoiler4Rf"].hide();
+ }
+ } else {
+ obj["spoiler4Rex"].setColor(0.0509,0.7529,0.2941);
+ obj["spoiler4Rrt"].setColor(0.0509,0.7529,0.2941);
+ obj["spoiler4Rf"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashList(["spoilerR5Failure","spoilerR5","green"], nil, func(val) {
+ if (val.spoilerR5Failure or val.green < 1500) {
+ obj["spoiler5Rex"].setColor(0.7333,0.3803,0);
+ obj["spoiler5Rrt"].setColor(0.7333,0.3803,0);
+ if (val.spoilerR5 < 1.5) {
+ obj["spoiler5Rf"].show();
+ } else {
+ obj["spoiler5Rf"].hide();
+ }
+ } else {
+ obj["spoiler5Rex"].setColor(0.0509,0.7529,0.2941);
+ obj["spoiler5Rrt"].setColor(0.0509,0.7529,0.2941);
+ obj["spoiler5Rf"].hide();
+ }
+ }),
+ ];
+
+ obj.displayedGForce = 0;
+ obj.updateItemsBottom = [
+ props.UpdateManager.FromHashValue("acconfigUnits", nil, func(val) {
+ obj.units = val;
+ if (val) {
+ obj["GW-weight-unit"].setText("KG");
+ } else {
+ obj["GW-weight-unit"].setText("LBS");
+ }
+ }),
+ props.UpdateManager.FromHashValue("hour", nil, func(val) {
+ obj["UTCh"].setText(sprintf("%02d", val));
+ }),
+ props.UpdateManager.FromHashValue("minute", nil, func(val) {
+ obj["UTCm"].setText(sprintf("%02d", val));
+ }),
+ props.UpdateManager.FromHashValue("gForce", 0.05, func(val) {
+ if (obj.displayedGForce) {
+ obj["GLoad"].setText("G.LOAD " ~ sprintf("%3.1f", val));
+ }
+ }),
+ props.UpdateManager.FromHashValue("gForceDisplay", nil, func(val) {
+ if ((val == 1 and !obj.displayedGForce) or (val != 0 and obj.displayedGForce)) {
+ obj.displayedGForce = 1;
+ obj["GLoad"].show();
+ } else {
+ obj.displayedGForce = 0;
+ obj["GLoad"].hide();
+ }
+ }),
+ ];
+ return obj;
+ },
+ getKeysBottom: func() {
+ return ["TAT","SAT","GW","UTCh","UTCm","GLoad","GW-weight-unit"];
+ },
+ getKeys: func() {
+ return["ailL","ailR","elevL","elevR","PTcc","PT","PTupdn","elac1","elac2","sec1","sec2","sec3","ailLblue","ailRblue","elevLblue","elevRblue","rudderblue","ailLgreen","ailRgreen","elevLgreen","ruddergreen","PTgreen",
+ "elevRyellow","rudderyellow","PTyellow","rudder","spdbrkblue","spdbrkgreen","spdbrkyellow","spoiler1Rex","spoiler1Rrt","spoiler2Rex","spoiler2Rrt","spoiler3Rex","spoiler3Rrt","spoiler4Rex","spoiler4Rrt","spoiler5Rex","spoiler5Rrt","spoiler1Lex",
+ "spoiler1Lrt","spoiler2Lex","spoiler2Lrt","spoiler3Lex","spoiler3Lrt","spoiler4Lex","spoiler4Lrt","spoiler5Lex","spoiler5Lrt","spoiler1Rf","spoiler2Rf","spoiler3Rf","spoiler4Rf","spoiler5Rf","spoiler1Lf","spoiler2Lf","spoiler3Lf","spoiler4Lf",
+ "spoiler5Lf","ailLscale","ailRscale","path4249","path4249-3","path4249-3-6-7","path4249-3-6-7-5","path4249-3-6","pitchTrimStatus","rudderTrimInd"];
+ },
+ updateBottom: func(notification) {
+ foreach(var update_item_bottom; me.updateItemsBottom)
+ {
+ update_item_bottom.update(notification);
+ }
+
+ if (fmgc.FMGCInternal.fuelRequest and fmgc.FMGCInternal.blockConfirmed and !fmgc.FMGCInternal.fuelCalculating and notification.FWCPhase != 1) {
+ if (me.units) {
+ me["GW"].setText(sprintf("%s", math.round(fmgc.FMGCInternal.fuelPredGw * 1000 * LBS2KGS, 100)));
+ } else {
+ me["GW"].setText(sprintf("%s", math.round(fmgc.FMGCInternal.fuelPredGw * 1000, 100)));
+ }
+ me["GW"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ me["GW"].setText(sprintf("%s", "-----"));
+ me["GW"].setColor(0.0901,0.6039,0.7176);
+ }
+
+ if (dmc.DMController.DMCs[1].outputs[4] != nil) {
+ me["SAT"].setText(sprintf("%+2.0f", dmc.DMController.DMCs[1].outputs[4].getValue()));
+ me["SAT"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ me["SAT"].setText(sprintf("%s", "XX"));
+ me["SAT"].setColor(0.7333,0.3803,0);
+ }
+
+ if (dmc.DMController.DMCs[1].outputs[5] != nil) {
+ me["TAT"].setText(sprintf("%+2.0f", dmc.DMController.DMCs[1].outputs[5].getValue()));
+ me["TAT"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ me["TAT"].setText(sprintf("%s", "XX"));
+ me["TAT"].setColor(0.7333,0.3803,0);
+ }
+ },
+ update: func(notification) {
+ me.updatePower();
+
+ if (me.test.getVisible() == 1) {
+ me.updateTest(notification);
+ }
+
+ if (me.group.getVisible() == 0) {
+ return;
+ }
+
+ foreach(var update_item; me.update_items)
+ {
+ update_item.update(notification);
+ }
+
+ me.updateBottom(notification);
+ },
+ updatePower: func() {
+ if (me.name == ecam.SystemDisplayController.displayedPage.name) {
+ if (du4_lgt.getValue() > 0.01 and systems.ELEC.Bus.ac2.getValue() >= 110) {
+ if (du4_test_time.getValue() + du4_test_amount.getValue() >= pts.Sim.Time.elapsedSec.getValue()) {
+ me.group.setVisible(0);
+ me.test.setVisible(1);
+ } else {
+ me.group.setVisible(1);
+ me.test.setVisible(0);
+ }
+ } else {
+ me.group.setVisible(0);
+ me.test.setVisible(0);
+ }
+ } else {
+ me.group.setVisible(0);
+ # don't hide the test group; just let whichever page is active control it
+ }
+ },
+};
+
+var input = {
+ elac1: "/systems/fctl/elac1",
+ elac2: "/systems/fctl/elac2",
+ elac1Fail: "/systems/failures/fctl/elac1",
+ elac2Fail: "/systems/failures/fctl/elac2",
+ sec1: "/systems/fctl/sec1",
+ sec2: "/systems/fctl/sec2",
+ sec3: "/systems/fctl/sec3",
+ sec1Fail: "/systems/failures/fctl/sec1",
+ sec2Fail: "/systems/failures/fctl/sec2",
+ sec3Fail: "/systems/failures/fctl/sec3",
+ fac1: "/systems/fctl/fac1-healthy-signal",
+ fac2: "/systems/fctl/fac2-healthy-signal",
+ fac1Fail: "/systems/failures/fctl/fac1",
+ fac2Fail: "/systems/failures/fctl/fac2",
+ fctlAilL: "/ECAM/Lower/aileron-ind-left",
+ fctlAilR: "/ECAM/Lower/aileron-ind-right",
+ fctlElevL: "/ECAM/Lower/elevator-ind-left",
+ fctlElevR: "/ECAM/Lower/elevator-ind-right",
+ fctlElevTrim: "/ECAM/Lower/elevator-trim-deg",
+ fctlRudder: "/fdm/jsbsim/hydraulics/rudder/final-deg",
+ fctlRudderTrim: "/fdm/jsbsim/hydraulics/rudder/trim-deg",
+ fctlTHSJam: "/systems/failures/fctl/ths-jam",
+};
+
+foreach (var name; keys(input)) {
+ emesary.GlobalTransmitter.NotifyAll(notifications.FrameNotificationAddProperty.new("A320 System Display", name, input[name]));
+}
\ No newline at end of file
diff --git a/Models/Instruments/Lower-ECAM/Lower-ECAM-fuel.nas b/Models/Instruments/Lower-ECAM/Lower-ECAM-fuel.nas
new file mode 100644
index 00000000..4da77543
--- /dev/null
+++ b/Models/Instruments/Lower-ECAM/Lower-ECAM-fuel.nas
@@ -0,0 +1,600 @@
+# A3XX Lower ECAM Canvas
+# Copyright (c) 2021 Josh Davidson (Octal450) and Jonathan Redpath
+
+var fuel_used_lbs1 = props.globals.getNode("/systems/fuel/fuel-used-1", 1);
+var fuel_used_lbs2 = props.globals.getNode("/systems/fuel/fuel-used-2", 1);
+
+var canvas_lowerECAMPageFuel =
+{
+ new: func(svg,name) {
+ var obj = {parents: [canvas_lowerECAMPageFuel,canvas_lowerECAM_base] };
+ obj.group = obj.canvas.createGroup();
+ obj.name = name;
+
+ canvas.parsesvg(obj.group, svg, {"font-mapper": obj.font_mapper} );
+
+ foreach(var key; obj.getKeys()) {
+ obj[key] = obj.group.getElementById(key);
+ };
+
+ foreach(var key; obj.getKeysBottom()) {
+ obj[key] = obj.group.getElementById(key);
+ };
+
+ obj.units = acconfig_weight_kgs.getValue();
+
+ # init
+ obj["FUEL-Left-blocked"].hide();
+ obj["FUEL-Right-blocked"].hide();
+ obj["FUEL-Left-Outer-Inacc"].hide();
+ obj["FUEL-Left-Inner-Inacc"].hide();
+ obj["FUEL-Right-Outer-Inacc"].hide();
+ obj["FUEL-Right-Inner-Inacc"].hide();
+ obj["FUEL-Center-Inacc"].hide();
+
+ obj.update_items = [
+ props.UpdateManager.FromHashValue("acconfigUnits", nil, func(val) {
+ if (val) {
+ obj["FOB-weight-unit"].setText("KG");
+ obj["Fused-weight-unit"].setText("KG");
+ obj["FFlow-weight-unit"].setText("KG/MIN");
+ obj["FUEL-On-Board"].setText(sprintf("%s", math.round(pts.Consumables.Fuel.totalFuelLbs.getValue() * LBS2KGS, 10)));
+ obj["FUEL-Left-Outer-quantity"].setText(sprintf("%s", math.round(systems.FUEL.Quantity.leftOuter.getValue() * LBS2KGS, 10)));
+ obj["FUEL-Left-Inner-quantity"].setText(sprintf("%s", math.round(systems.FUEL.Quantity.leftInner.getValue() * LBS2KGS, 10)));
+ obj["FUEL-Center-quantity"].setText(sprintf("%s", math.round(systems.FUEL.Quantity.center.getValue() * LBS2KGS, 10)));
+ obj["FUEL-Right-Inner-quantity"].setText(sprintf("%s", math.round(systems.FUEL.Quantity.rightInner.getValue() * LBS2KGS, 10)));
+ obj["FUEL-Right-Outer-quantity"].setText(sprintf("%s", math.round(systems.FUEL.Quantity.rightOuter.getValue() * LBS2KGS, 10)));
+ obj["FUEL-Flow-per-min"].setText(sprintf("%s", math.round(((pts.Engines.Engine.fuelFlow[0].getValue() + pts.Engines.Engine.fuelFlow[1].getValue()) * LBS2KGS) / 60, 10)));
+ obj["FUEL-used-1"].setText(sprintf("%s", math.round(fuel_used_lbs1.getValue() * LBS2KGS, 10)));
+ obj["FUEL-used-2"].setText(sprintf("%s", math.round(fuel_used_lbs2.getValue() * LBS2KGS, 10)));
+ obj["FUEL-used-both"].setText(sprintf("%s", (math.round((fuel_used_lbs1.getValue() * LBS2KGS) + (fuel_used_lbs2.getValue() * LBS2KGS), 10))));
+ } else {
+ obj["FUEL-used-1"].setText(sprintf("%s", math.round(fuel_used_lbs1.getValue(), 10)));
+ obj["FUEL-used-2"].setText(sprintf("%s", math.round(fuel_used_lbs2.getValue(), 10)));
+ obj["FUEL-used-both"].setText(sprintf("%s", (math.round(fuel_used_lbs1.getValue() + fuel_used_lbs2.getValue(), 10))));
+ obj["FUEL-Flow-per-min"].setText(sprintf("%s", math.round((pts.Engines.Engine.fuelFlow[0].getValue() + pts.Engines.Engine.fuelFlow[1].getValue()) / 60, 10)));
+ obj["FOB-weight-unit"].setText("LBS");
+ obj["Fused-weight-unit"].setText("LBS");
+ obj["FFlow-weight-unit"].setText("LBS/MIN");
+ obj["FUEL-On-Board"].setText(sprintf("%s", math.round(pts.Consumables.Fuel.totalFuelLbs.getValue(), 10)));
+ obj["FUEL-Left-Outer-quantity"].setText(sprintf("%s", math.round(systems.FUEL.Quantity.leftOuter.getValue(), 10)));
+ obj["FUEL-Left-Inner-quantity"].setText(sprintf("%s", math.round(systems.FUEL.Quantity.leftInner.getValue(), 10)));
+ obj["FUEL-Center-quantity"].setText(sprintf("%s", math.round(systems.FUEL.Quantity.center.getValue(), 10)));
+ obj["FUEL-Right-Inner-quantity"].setText(sprintf("%s", math.round(systems.FUEL.Quantity.rightInner.getValue(), 10)));
+ obj["FUEL-Right-Outer-quantity"].setText(sprintf("%s", math.round(systems.FUEL.Quantity.rightOuter.getValue(), 10)));
+ }
+ }),
+ props.UpdateManager.FromHashValue("engFuelUsed1", 0.5, func(val) {
+ if (obj.units) {
+ obj["FUEL-used-1"].setText(sprintf("%s", math.round(val * LBS2KGS, 10)));
+ } else {
+ obj["FUEL-used-1"].setText(sprintf("%s", math.round(val, 10)));
+ }
+ }),
+ props.UpdateManager.FromHashValue("engFuelUsed2", 0.5, func(val) {
+ if (obj.units) {
+ obj["FUEL-used-2"].setText(sprintf("%s", math.round(val * LBS2KGS, 10)));
+ } else {
+ obj["FUEL-used-2"].setText(sprintf("%s", math.round(val, 10)));
+ }
+ }),
+ props.UpdateManager.FromHashList(["engFuelUsed1","engFuelUsed2"], 0.5, func(val) {
+ if (obj.units) {
+ obj["FUEL-used-both"].setText(sprintf("%s", (math.round((val.engFuelUsed1 * LBS2KGS) + (val.engFuelUsed2 * LBS2KGS), 10))));
+ } else {
+ obj["FUEL-used-both"].setText(sprintf("%s", (math.round(val.engFuelUsed1 + val.engFuelUsed2, 10))));
+ }
+ }),
+ props.UpdateManager.FromHashValue("fuelLeftOuterQty", 0.25, func(val) {
+ if (obj.units) {
+ obj["FUEL-Left-Outer-quantity"].setText(sprintf("%s", math.round(val * LBS2KGS, 10)));
+ } else {
+ obj["FUEL-Left-Outer-quantity"].setText(sprintf("%s", math.round(val, 10)));
+ }
+ }),
+ props.UpdateManager.FromHashValue("fuelRightOuterQty", 0.25, func(val) {
+ if (obj.units) {
+ obj["FUEL-Right-Outer-quantity"].setText(sprintf("%s", math.round(val * LBS2KGS, 10)));
+ } else {
+ obj["FUEL-Right-Outer-quantity"].setText(sprintf("%s", math.round(val, 10)));
+ }
+ }),
+ props.UpdateManager.FromHashValue("fuelLeftInnerQty", 0.25, func(val) {
+ if (obj.units) {
+ obj["FUEL-Left-Inner-quantity"].setText(sprintf("%s", math.round(val * LBS2KGS, 10)));
+ } else {
+ obj["FUEL-Left-Inner-quantity"].setText(sprintf("%s", math.round(val, 10)));
+ }
+ }),
+ props.UpdateManager.FromHashValue("fuelRightInnerQty", 0.25, func(val) {
+ if (obj.units) {
+ obj["FUEL-Right-Inner-quantity"].setText(sprintf("%s", math.round(val * LBS2KGS, 10)));
+ } else {
+ obj["FUEL-Right-Inner-quantity"].setText(sprintf("%s", math.round(val, 10)));
+ }
+ }),
+ props.UpdateManager.FromHashList(["fadecPower1","fadecPower2","fadecPowerStart","fuelflow_1","fuelflow_2"], nil, func(val) {
+ if (val.fadecPower1 or val.fadecPower2 or val.fadecPowerStart) {
+ obj["FUEL-Flow-per-min"].setColor(0.0509,0.7529,0.2941);
+ if (obj.units) {
+ obj["FUEL-Flow-per-min"].setText(sprintf("%s", math.round(((val.fuelflow_1 + val.fuelflow_2) * LBS2KGS) / 60, 10)));
+ } else {
+ obj["FUEL-Flow-per-min"].setText(sprintf("%s", math.round((val.fuelflow_1 + val.fuelflow_2) / 60, 10)));
+ }
+ } else {
+ obj["FUEL-Flow-per-min"].setColor(0.7333,0.3803,0);
+ obj["FUEL-Flow-per-min"].setText("XX");
+ }
+ }),
+ props.UpdateManager.FromHashValue("N1_actual_1", 0.05, func(val) {
+ if (val <= 18.8) {
+ obj["ENG1idFFlow"].setColor(0.7333,0.3803,0);
+ obj["FUEL-ENG-1-label"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["ENG1idFFlow"].setColor(0.8078,0.8039,0.8078);
+ obj["FUEL-ENG-1-label"].setColor(0.8078,0.8039,0.8078);
+ }
+ }),
+ props.UpdateManager.FromHashValue("N1_actual_2", 0.05, func(val) {
+ if (val <= 18.8) {
+ obj["ENG2idFFlow"].setColor(0.7333,0.3803,0);
+ obj["FUEL-ENG-2-label"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["ENG2idFFlow"].setColor(0.8078,0.8039,0.8078);
+ obj["FUEL-ENG-2-label"].setColor(0.8078,0.8039,0.8078);
+ }
+ }),
+ props.UpdateManager.FromHashValue("fuelLeftSwitch1", nil, func(val) {
+ if (val) {
+ obj["FUEL-Pump-Left-1-Open"].show();
+ obj["FUEL-Pump-Left-1-Closed"].hide();
+ obj["FUEL-Pump-Left-1"].setColor(0.0509,0.7529,0.2941);
+ obj["FUEL-Pump-Left-1"].setColorFill(0.0509,0.7529,0.2941);
+ obj["FUEL-Pump-Left-1-Square"].setColorFill(0.0509,0.7529,0.2941);
+ obj["FUEL-Pump-Left-1-Open"].setColorFill(0.0509,0.7529,0.2941);
+ obj["FUEL-Pump-Left-1-Closed"].setColorFill(0.0509,0.7529,0.2941);
+ } else {
+ obj["FUEL-Pump-Left-1-Open"].hide();
+ obj["FUEL-Pump-Left-1-Closed"].show();
+ obj["FUEL-Pump-Left-1"].setColor(0.7333,0.3803,0);
+ obj["FUEL-Pump-Left-1-Square"].setColorFill(0.7333,0.3803,0);
+ obj["FUEL-Pump-Left-1"].setColorFill(0.7333,0.3803,0);
+ obj["FUEL-Pump-Left-1-Open"].setColorFill(0.7333,0.3803,0);
+ obj["FUEL-Pump-Left-1-Closed"].setColorFill(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashValue("fuelLeftSwitch2", nil, func(val) {
+ if (val) {
+ obj["FUEL-Pump-Left-2-Open"].show();
+ obj["FUEL-Pump-Left-2-Closed"].hide();
+ obj["FUEL-Pump-Left-2"].setColor(0.0509,0.7529,0.2941);
+ obj["FUEL-Pump-Left-2"].setColorFill(0.0509,0.7529,0.2941);
+ obj["FUEL-Pump-Left-2-Square"].setColorFill(0.0509,0.7529,0.2941);
+ obj["FUEL-Pump-Left-2-Open"].setColorFill(0.0509,0.7529,0.2941);
+ obj["FUEL-Pump-Left-2-Closed"].setColorFill(0.0509,0.7529,0.2941);
+ } else {
+ obj["FUEL-Pump-Left-2-Open"].hide();
+ obj["FUEL-Pump-Left-2-Closed"].show();
+ obj["FUEL-Pump-Left-2"].setColor(0.7333,0.3803,0);
+ obj["FUEL-Pump-Left-2"].setColorFill(0.7333,0.3803,0);
+ obj["FUEL-Pump-Left-2-Square"].setColorFill(0.7333,0.3803,0);
+ obj["FUEL-Pump-Left-2-Open"].setColorFill(0.7333,0.3803,0);
+ obj["FUEL-Pump-Left-2-Closed"].setColorFill(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashValue("fuelCenterSwitch1", nil, func(val) {
+ if (val) {
+ obj["FUEL-Pump-Center-1-Open"].show();
+ obj["FUEL-Pump-Center-1-Closed"].hide();
+ obj["FUEL-Pump-Center-1"].setColor(0.0509,0.7529,0.2941);
+ obj["FUEL-Pump-Center-1"].setColorFill(0.0509,0.7529,0.2941);
+ obj["FUEL-Pump-Center-1-Square"].setColorFill(0.0509,0.7529,0.2941);
+ obj["FUEL-Pump-Center-1-Open"].setColorFill(0.0509,0.7529,0.2941);
+ obj["FUEL-Pump-Center-1-Closed"].setColorFill(0.0509,0.7529,0.2941);
+ } else {
+ obj["FUEL-Pump-Center-1-Open"].hide();
+ obj["FUEL-Pump-Center-1-Closed"].show();
+ obj["FUEL-Pump-Center-1"].setColor(0.7333,0.3803,0);
+ obj["FUEL-Pump-Center-1"].setColorFill(0.7333,0.3803,0);
+ obj["FUEL-Pump-Center-1-Square"].setColorFill(0.7333,0.3803,0);
+ obj["FUEL-Pump-Center-1-Open"].setColorFill(0.7333,0.3803,0);
+ obj["FUEL-Pump-Center-1-Closed"].setColorFill(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashValue("fuelCenterSwitch2", nil, func(val) {
+ if (val) {
+ obj["FUEL-Pump-Center-2-Open"].show();
+ obj["FUEL-Pump-Center-2-Closed"].hide();
+ obj["FUEL-Pump-Center-2"].setColor(0.0509,0.7529,0.2941);
+ obj["FUEL-Pump-Center-2"].setColorFill(0.0509,0.7529,0.2941);
+ obj["FUEL-Pump-Center-2-Square"].setColorFill(0.0509,0.7529,0.2941);
+ obj["FUEL-Pump-Center-2-Open"].setColorFill(0.0509,0.7529,0.2941);
+ obj["FUEL-Pump-Center-2-Closed"].setColorFill(0.0509,0.7529,0.2941);
+ } else {
+ obj["FUEL-Pump-Center-2-Open"].hide();
+ obj["FUEL-Pump-Center-2-Closed"].show();
+ obj["FUEL-Pump-Center-2"].setColor(0.7333,0.3803,0);
+ obj["FUEL-Pump-Center-2"].setColorFill(0.7333,0.3803,0);
+ obj["FUEL-Pump-Center-2-Square"].setColorFill(0.7333,0.3803,0);
+ obj["FUEL-Pump-Center-2-Open"].setColorFill(0.7333,0.3803,0);
+ obj["FUEL-Pump-Center-2-Closed"].setColorFill(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashValue("fuelRightSwitch1", nil, func(val) {
+ if (val) {
+ obj["FUEL-Pump-Right-1-Open"].show();
+ obj["FUEL-Pump-Right-1-Closed"].hide();
+ obj["FUEL-Pump-Right-1"].setColor(0.0509,0.7529,0.2941);
+ obj["FUEL-Pump-Right-1"].setColorFill(0.0509,0.7529,0.2941);
+ obj["FUEL-Pump-Right-1-Square"].setColorFill(0.0509,0.7529,0.2941);
+ obj["FUEL-Pump-Right-1-Open"].setColorFill(0.0509,0.7529,0.2941);
+ obj["FUEL-Pump-Right-1-Closed"].setColorFill(0.0509,0.7529,0.2941);
+ } else {
+ obj["FUEL-Pump-Right-1-Open"].hide();
+ obj["FUEL-Pump-Right-1-Closed"].show();
+ obj["FUEL-Pump-Right-1"].setColor(0.7333,0.3803,0);
+ obj["FUEL-Pump-Right-1"].setColorFill(0.7333,0.3803,0);
+ obj["FUEL-Pump-Right-1-Square"].setColorFill(0.7333,0.3803,0);
+ obj["FUEL-Pump-Right-1-Open"].setColorFill(0.7333,0.3803,0);
+ obj["FUEL-Pump-Right-1-Closed"].setColorFill(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashValue("fuelRightSwitch2", nil, func(val) {
+ if (val) {
+ obj["FUEL-Pump-Right-2-Open"].show();
+ obj["FUEL-Pump-Right-2-Closed"].hide();
+ obj["FUEL-Pump-Right-2"].setColor(0.0509,0.7529,0.2941);
+ obj["FUEL-Pump-Right-2"].setColorFill(0.0509,0.7529,0.2941);
+ obj["FUEL-Pump-Right-2-Square"].setColor(0.0509,0.7529,0.2941);
+ obj["FUEL-Pump-Right-2-Open"].setColorFill(0.0509,0.7529,0.2941);
+ obj["FUEL-Pump-Right-2-Closed"].setColorFill(0.0509,0.7529,0.2941);
+ } else {
+ obj["FUEL-Pump-Right-2-Open"].hide();
+ obj["FUEL-Pump-Right-2-Closed"].show();
+ obj["FUEL-Pump-Right-2"].setColor(0.7333,0.3803,0);
+ obj["FUEL-Pump-Right-2"].setColorFill(0.7333,0.3803,0);
+ obj["FUEL-Pump-Right-2-Square"].setColor(0.7333,0.3803,0);
+ obj["FUEL-Pump-Right-2-Open"].setColorFill(0.7333,0.3803,0);
+ obj["FUEL-Pump-Right-2-Closed"].setColorFill(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashList(["fuelCenterSwitch1","fuelCenterSwitch2"], nil, func(val) {
+ if (!val.fuelCenterSwitch1 and !val.fuelCenterSwitch2) {
+ obj["FUEL-Center-blocked"].show();
+ } else {
+ obj["FUEL-Center-blocked"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashList(["fuelCrossfeedValve","fuelCrossfeedSwitch"], nil, func(val) {
+ if (val.fuelCrossfeedValve == 1) {
+ obj["FUEL-XFEED"].setRotation(0);
+ obj["FUEL-XFEED-pipes"].show();
+ if (val.fuelCrossfeedSwitch) {
+ obj["FUEL-XFEED"].setColor(0.0509,0.7529,0.2941);
+ obj["FUEL-XFEED"].setColorFill(0.0509,0.7529,0.2941);
+ obj["FUEL-XFEED-Cross"].setColorFill(0.0509,0.7529,0.2941);
+ } else {
+ obj["FUEL-XFEED"].setColor(0.7333,0.3803,0);
+ obj["FUEL-XFEED"].setColorFill(0.7333,0.3803,0);
+ obj["FUEL-XFEED-Cross"].setColorFill(0.7333,0.3803,0);
+ }
+ } elsif (val.fuelCrossfeedValve == 0) {
+ obj["FUEL-XFEED"].setRotation(90 * D2R);
+ obj["FUEL-XFEED-pipes"].hide();
+ if (!val.fuelCrossfeedSwitch) {
+ obj["FUEL-XFEED"].setColor(0.0509,0.7529,0.2941);
+ obj["FUEL-XFEED"].setColorFill(0.0509,0.7529,0.2941);
+ obj["FUEL-XFEED-Cross"].setColorFill(0.0509,0.7529,0.2941);
+ } else {
+ obj["FUEL-XFEED"].setColor(0.7333,0.3803,0);
+ obj["FUEL-XFEED"].setColorFill(0.7333,0.3803,0);
+ obj["FUEL-XFEED-Cross"].setColorFill(0.7333,0.3803,0);
+ }
+ } else {
+ obj["FUEL-XFEED"].setRotation(45 * D2R);
+ obj["FUEL-XFEED-pipes"].hide();
+ obj["FUEL-XFEED"].setColor(0.7333,0.3803,0);
+ obj["FUEL-XFEED"].setColorFill(0.7333,0.3803,0);
+ obj["FUEL-XFEED-Cross"].setColorFill(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashList(["fuelEngine1Valve","engineCutoff1"], nil, func(val) {
+ if (val.fuelEngine1Valve) {
+ if (val.fuelEngine1Valve == 1) {
+ obj["FUEL-ENG-Master-1"].setRotation(0);
+ } else {
+ obj["FUEL-ENG-Master-1"].setRotation(45 * D2R);
+ }
+ if (val.engineCutoff1) {
+ obj["FUEL-ENG-Master-1"].setColor(0.7333,0.3803,0);
+ obj["FUEL-ENG-Master-1"].setColorFill(0.7333,0.3803,0);
+ obj["FUEL-ENG-Master-1-Cross"].setColorFill(0.7333,0.3803,0);
+ obj["FUEL-ENG-1-pipe"].setColorFill(0.7333,0.3803,0);
+ obj["FUEL-ENG-1-pipe"].setColorFill(0.7333,0.3803,0);
+ } else {
+ obj["FUEL-ENG-Master-1"].setColor(0.0509,0.7529,0.2941);
+ obj["FUEL-ENG-Master-1"].setColorFill(0.0509,0.7529,0.2941);
+ obj["FUEL-ENG-Master-1-Cross"].setColorFill(0.0509,0.7529,0.2941);
+ obj["FUEL-ENG-1-pipe"].setColor(0.0509,0.7529,0.2941);
+ obj["FUEL-ENG-1-pipe"].setColorFill(0.0509,0.7529,0.2941);
+ }
+ } else {
+ obj["FUEL-ENG-Master-1"].setRotation(90 * D2R);
+ obj["FUEL-ENG-Master-1"].setColor(0.7333,0.3803,0);
+ obj["FUEL-ENG-Master-1"].setColorFill(0.7333,0.3803,0);
+ obj["FUEL-ENG-Master-1-Cross"].setColorFill(0.7333,0.3803,0);
+ obj["FUEL-ENG-1-pipe"].setColor(0.7333,0.3803,0);
+ obj["FUEL-ENG-1-pipe"].setColorFill(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashList(["fuelEngine2Valve","engineCutoff2"], nil, func(val) {
+ if (val.fuelEngine2Valve) {
+ if (val.fuelEngine2Valve == 1) {
+ obj["FUEL-ENG-Master-2"].setRotation(0);
+ } else {
+ obj["FUEL-ENG-Master-2"].setRotation(45 * D2R);
+ }
+ if (val.engineCutoff1) {
+ obj["FUEL-ENG-Master-2"].setColor(0.7333,0.3803,0);
+ obj["FUEL-ENG-Master-2"].setColorFill(0.7333,0.3803,0);
+ obj["FUEL-ENG-Master-2-Cross"].setColorFill(0.7333,0.3803,0);
+ obj["FUEL-ENG-2-pipe"].setColorFill(0.7333,0.3803,0);
+ obj["FUEL-ENG-2-pipe"].setColorFill(0.7333,0.3803,0);
+ } else {
+ obj["FUEL-ENG-Master-2"].setColor(0.0509,0.7529,0.2941);
+ obj["FUEL-ENG-Master-2"].setColorFill(0.0509,0.7529,0.2941);
+ obj["FUEL-ENG-Master-2-Cross"].setColorFill(0.0509,0.7529,0.2941);
+ obj["FUEL-ENG-2-pipe"].setColor(0.0509,0.7529,0.2941);
+ obj["FUEL-ENG-2-pipe"].setColorFill(0.0509,0.7529,0.2941);
+ }
+ } else {
+ obj["FUEL-ENG-Master-2"].setRotation(90 * D2R);
+ obj["FUEL-ENG-Master-2"].setColor(0.7333,0.3803,0);
+ obj["FUEL-ENG-Master-2"].setColorFill(0.7333,0.3803,0);
+ obj["FUEL-ENG-Master-2-Cross"].setColorFill(0.7333,0.3803,0);
+ obj["FUEL-ENG-2-pipe"].setColor(0.7333,0.3803,0);
+ obj["FUEL-ENG-2-pipe"].setColorFill(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashValue("fuelTransferValve1", nil, func(val) {
+ if (val == 0) {
+ obj["FUEL-Left-Transfer"].hide();
+ } else {
+ if (val == 1) {
+ obj["FUEL-Left-Transfer"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["FUEL-Left-Transfer"].setColor(0.7333,0.3803,0);
+ }
+ obj["FUEL-Left-Transfer"].show();
+ }
+ }),
+ props.UpdateManager.FromHashValue("fuelTransferValve2", nil, func(val) {
+ if (val == 0) {
+ obj["FUEL-Right-Transfer"].hide();
+ } else {
+ if (val == 1) {
+ obj["FUEL-Right-Transfer"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["FUEL-Right-Transfer"].setColor(0.7333,0.3803,0);
+ }
+ obj["FUEL-Right-Transfer"].show();
+ }
+ }),
+ props.UpdateManager.FromHashValue("fuelTotalLbs", 1, func(val) {
+ if (obj.units) {
+ obj["FUEL-On-Board"].setText(sprintf("%s", math.round(val * LBS2KGS, 10)));
+ } else {
+ obj["FUEL-On-Board"].setText(sprintf("%s", math.round(val, 10)));
+ }
+ }),
+ props.UpdateManager.FromHashValue("fuelTempLeftOuter", 0.25, func(val) {
+ obj["FUEL-Left-Outer-temp"].setText(sprintf("%s", math.round(val)));
+ if (val > 55 or val < -40) {
+ obj["FUEL-Left-Outer-temp"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["FUEL-Left-Outer-temp"].setColor(0.0509,0.7529,0.2941);
+ }
+ }),
+ props.UpdateManager.FromHashValue("fuelTempLeftInner", 0.25, func(val) {
+ obj["FUEL-Left-Inner-temp"].setText(sprintf("%s", math.round(val)));
+ if (val > 45 or val < -40) {
+ obj["FUEL-Left-Inner-temp"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["FUEL-Left-Inner-temp"].setColor(0.0509,0.7529,0.2941);
+ }
+ }),
+ props.UpdateManager.FromHashValue("fuelTempRightInner", 0.25, func(val) {
+ obj["FUEL-Right-Inner-temp"].setText(sprintf("%s", math.round(val)));
+ if (val > 45 or val < -40) {
+ obj["FUEL-Right-Inner-temp"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["FUEL-Right-Inner-temp"].setColor(0.0509,0.7529,0.2941);
+ }
+ }),
+ props.UpdateManager.FromHashValue("fuelTempRightOuter", 0.25, func(val) {
+ obj["FUEL-Right-Outer-temp"].setText(sprintf("%s", math.round(val)));
+ if (val > 55 or val < -40) {
+ obj["FUEL-Right-Outer-temp"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["FUEL-Right-Outer-temp"].setColor(0.0509,0.7529,0.2941);
+ }
+ }),
+ props.UpdateManager.FromHashList(["fuelApuValve","apuMaster","apuFireBtn"], nil, func(val) {
+ if (val.fuelApuValve == 0) {
+ if (val.apuMaster or val.apuFireBtn) {
+ obj["FUEL-APU-label"].setColor(0.7333,0.3803,0);
+ obj["FUEL-APU-line"].hide();
+ obj["FUEL-APU-arrow"].hide();
+ } else {
+ obj["FUEL-APU-label"].setColor(0.8078, 0.8039, 0.8078);
+ obj["FUEL-APU-arrow"].setColor(0.8078, 0.8039, 0.8078);
+ obj["FUEL-APU-line"].hide();
+ obj["FUEL-APU-arrow"].show();
+ }
+ } else {
+ if (!val.apuMaster or val.apuFireBtn) {
+ obj["FUEL-APU-label"].setColor(0.7333,0.3803,0);
+ obj["FUEL-APU-line"].setColor(0.7333,0.3803,0);
+ obj["FUEL-APU-line"].setColorFill(0.7333,0.3803,0);
+ obj["FUEL-APU-arrow"].setColor(0.7333,0.3803,0);
+ obj["FUEL-APU-line"].show();
+ obj["FUEL-APU-arrow"].show();
+ } else {
+ obj["FUEL-APU-label"].setColor(0.8078, 0.8039, 0.8078);
+ obj["FUEL-APU-line"].setColor(0.0509,0.7529,0.2941);
+ obj["FUEL-APU-arrow"].setColor(0.0509,0.7529,0.2941);
+ obj["FUEL-APU-line"].show();
+ obj["FUEL-APU-arrow"].show();
+ }
+ }
+ }),
+ ];
+
+ obj.displayedGForce = 0;
+ obj.updateItemsBottom = [
+ props.UpdateManager.FromHashValue("acconfigUnits", nil, func(val) {
+ obj.units = val;
+ if (val) {
+ obj["GW-weight-unit"].setText("KG");
+ } else {
+ obj["GW-weight-unit"].setText("LBS");
+ }
+ }),
+ props.UpdateManager.FromHashValue("hour", nil, func(val) {
+ obj["UTCh"].setText(sprintf("%02d", val));
+ }),
+ props.UpdateManager.FromHashValue("minute", nil, func(val) {
+ obj["UTCm"].setText(sprintf("%02d", val));
+ }),
+ props.UpdateManager.FromHashValue("gForce", 0.05, func(val) {
+ if (obj.displayedGForce) {
+ obj["GLoad"].setText("G.LOAD " ~ sprintf("%3.1f", val));
+ }
+ }),
+ props.UpdateManager.FromHashValue("gForceDisplay", nil, func(val) {
+ if ((val == 1 and !obj.displayedGForce) or (val != 0 and obj.displayedGForce)) {
+ obj.displayedGForce = 1;
+ obj["GLoad"].show();
+ } else {
+ obj.displayedGForce = 0;
+ obj["GLoad"].hide();
+ }
+ }),
+ ];
+ return obj;
+ },
+ getKeysBottom: func() {
+ return ["TAT","SAT","GW","UTCh","UTCm","GLoad","GW-weight-unit"];
+ },
+ getKeys: func() {
+ return["TAT","SAT","GW","UTCh","UTCm","GLoad","GW-weight-unit","FUEL-Pump-Left-1","FUEL-Pump-Left-2","FUEL-Pump-Center-1","FUEL-Pump-Center-2","FUEL-Pump-Right-1","FUEL-Pump-Right-2","FUEL-Left-blocked","FUEL-Right-blocked","FUEL-Center-blocked","FUEL-Left-Transfer",
+ "FUEL-Right-Transfer","FUEL-Left-Outer-Inacc","FUEL-Left-Inner-Inacc","FUEL-Center-Inacc","FUEL-Right-Inner-Inacc","FUEL-Right-Outer-Inacc","FUEL-Left-Outer-quantity","FUEL-Left-Inner-quantity","FUEL-Center-quantity","FUEL-Right-Inner-quantity",
+ "FUEL-Right-Outer-quantity","FUEL-On-Board","FUEL-Flow-per-min","FUEL-APU-arrow","FUEL-APU-line","FUEL-APU-label","FUEL-used-1","FUEL-used-both","FUEL-used-2","FUEL-ENG-Master-1","FUEL-ENG-Master-2","FUEL-XFEED","FUEL-XFEED-Cross","FUEL-XFEED-pipes","FUEL-Left-Outer-temp",
+ "FUEL-Left-Inner-temp","FUEL-Right-Inner-temp","FUEL-Right-Outer-temp","FUEL-Pump-Left-1-Closed","FUEL-Pump-Left-1-Open","FUEL-Pump-Left-2-Closed","FUEL-Pump-Left-2-Open","FUEL-Pump-Center-1-Open","FUEL-Pump-Center-1-Closed","FUEL-Pump-Center-2-Closed",
+ "FUEL-Pump-Center-2-Open","FUEL-Pump-Right-1-Closed","FUEL-Pump-Right-1-Open","FUEL-Pump-Right-2-Closed","FUEL-Pump-Right-2-Open","FUEL-ENG-1-label","FUEL-ENG-2-label","FUEL-ENG-1-pipe","FUEL-ENG-2-pipe","ENG1idFFlow","ENG2idFFlow","FUEL-used-1","FUEL-used-2","FUEL-used-both",
+ "Fused-weight-unit","FFlow-weight-unit","FOB-weight-unit","FUEL-ENG-Master-1-Cross","FUEL-ENG-Master-2-Cross","FUEL-Pump-Left-1-Square","FUEL-Pump-Left-2-Square","FUEL-Pump-Center-1-Square","FUEL-Pump-Center-2-Square","FUEL-Pump-Right-1-Square","FUEL-Pump-Right-2-Square"];
+ },
+ updateBottom: func(notification) {
+ foreach(var update_item_bottom; me.updateItemsBottom)
+ {
+ update_item_bottom.update(notification);
+ }
+
+ if (fmgc.FMGCInternal.fuelRequest and fmgc.FMGCInternal.blockConfirmed and !fmgc.FMGCInternal.fuelCalculating and notification.FWCPhase != 1) {
+ if (me.units) {
+ me["GW"].setText(sprintf("%s", math.round(fmgc.FMGCInternal.fuelPredGw * 1000 * LBS2KGS, 100)));
+ } else {
+ me["GW"].setText(sprintf("%s", math.round(fmgc.FMGCInternal.fuelPredGw * 1000, 100)));
+ }
+ me["GW"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ me["GW"].setText(sprintf("%s", "-----"));
+ me["GW"].setColor(0.0901,0.6039,0.7176);
+ }
+
+ if (dmc.DMController.DMCs[1].outputs[4] != nil) {
+ me["SAT"].setText(sprintf("%+2.0f", dmc.DMController.DMCs[1].outputs[4].getValue()));
+ me["SAT"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ me["SAT"].setText(sprintf("%s", "XX"));
+ me["SAT"].setColor(0.7333,0.3803,0);
+ }
+
+ if (dmc.DMController.DMCs[1].outputs[5] != nil) {
+ me["TAT"].setText(sprintf("%+2.0f", dmc.DMController.DMCs[1].outputs[5].getValue()));
+ me["TAT"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ me["TAT"].setText(sprintf("%s", "XX"));
+ me["TAT"].setColor(0.7333,0.3803,0);
+ }
+ },
+ update: func(notification) {
+ me.updatePower();
+
+ if (me.test.getVisible() == 1) {
+ me.updateTest(notification);
+ }
+
+ if (me.group.getVisible() == 0) {
+ return;
+ }
+
+ foreach(var update_item; me.update_items)
+ {
+ update_item.update(notification);
+ }
+
+ me.updateBottom(notification);
+ },
+ updatePower: func() {
+ if (me.name == ecam.SystemDisplayController.displayedPage.name) {
+ if (du4_lgt.getValue() > 0.01 and systems.ELEC.Bus.ac2.getValue() >= 110) {
+ if (du4_test_time.getValue() + du4_test_amount.getValue() >= pts.Sim.Time.elapsedSec.getValue()) {
+ me.group.setVisible(0);
+ me.test.setVisible(1);
+ } else {
+ me.group.setVisible(1);
+ me.test.setVisible(0);
+ }
+ } else {
+ me.group.setVisible(0);
+ me.test.setVisible(0);
+ }
+ } else {
+ me.group.setVisible(0);
+ # don't hide the test group; just let whichever page is active control it
+ }
+ },
+};
+
+var input = {
+ engineCutoff1: "/controls/engines/engine[0]/cutoff-switch",
+ engineCutoff2: "/controls/engines/engine[1]/cutoff-switch",
+ fuelApuValve: "/systems/fuel/valves/apu-lp-valve",
+ fuelCrossfeedSwitch: "/controls/fuel/switches/crossfeed",
+ fuelCrossfeedValve: "/systems/fuel/valves/crossfeed-valve",
+ fuelEngine1Valve: "/systems/fuel/valves/engine-1-lp-valve",
+ fuelEngine2Valve: "/systems/fuel/valves/engine-2-lp-valve",
+ fuelTransferValve1: "/systems/fuel/valves/outer-inner-transfer-valve-1",
+ fuelTransferValve2: "/systems/fuel/valves/outer-inner-transfer-valve-2",
+ fuelLeftSwitch1: "/controls/fuel/switches/pump-left-1",
+ fuelLeftSwitch2: "/controls/fuel/switches/pump-left-2",
+ fuelCenterSwitch1: "/controls/fuel/switches/pump-center-1",
+ fuelCenterSwitch2: "/controls/fuel/switches/pump-center-2",
+ fuelRightSwitch1: "/controls/fuel/switches/pump-right-1",
+ fuelRightSwitch2: "/controls/fuel/switches/pump-right-2",
+ fuelTempLeftOuter: "/consumables/fuel/tank[0]/temperature_degC",
+ fuelTempLeftInner: "/consumables/fuel/tank[1]/temperature_degC",
+ fuelTempRightOuter: "/consumables/fuel/tank[4]/temperature_degC",
+ fuelTempRightInner: "/consumables/fuel/tank[3]/temperature_degC",
+ fuelLeftOuterQty: "/consumables/fuel/tank[0]/level-lbs",
+ fuelLeftInnerQty: "/consumables/fuel/tank[1]/level-lbs",
+ fuelRightOuterQty: "/consumables/fuel/tank[4]/level-lbs",
+ fuelRightInnerQty: "/consumables/fuel/tank[3]/level-lbs",
+ fuelCenterQty: "/consumables/fuel/tank[2]/level-lbs",
+ fuelTotalLbs: "/consumables/fuel/total-fuel-lbs",
+};
+
+foreach (var name; keys(input)) {
+ emesary.GlobalTransmitter.NotifyAll(notifications.FrameNotificationAddProperty.new("A320 System Display", name, input[name]));
+}
\ No newline at end of file
diff --git a/Models/Instruments/Lower-ECAM/Lower-ECAM-hyd.nas b/Models/Instruments/Lower-ECAM/Lower-ECAM-hyd.nas
new file mode 100644
index 00000000..d87f4901
--- /dev/null
+++ b/Models/Instruments/Lower-ECAM/Lower-ECAM-hyd.nas
@@ -0,0 +1,528 @@
+# A3XX Lower ECAM Canvas
+# Copyright (c) 2021 Josh Davidson (Octal450) and Jonathan Redpath
+
+var elec_pump_y_ovht = props.globals.initNode("/systems/hydraulic/elec-pump-yellow-ovht", 0, "BOOL");
+var elec_pump_b_ovht = props.globals.initNode("/systems/hydraulic/elec-pump-blue-ovht", 0, "BOOL");
+var y_resv_ovht = props.globals.initNode("/systems/hydraulic/yellow-resv-ovht", 0, "BOOL");
+var b_resv_ovht = props.globals.initNode("/systems/hydraulic/blue-resv-ovht", 0, "BOOL");
+var g_resv_ovht = props.globals.initNode("/systems/hydraulic/green-resv-ovht", 0, "BOOL");
+var y_resv_lo_press = props.globals.initNode("/systems/hydraulic/yellow-resv-lo-air-press", 0, "BOOL");
+var b_resv_lo_press = props.globals.initNode("/systems/hydraulic/blue-resv-lo-air-press", 0, "BOOL");
+var g_resv_lo_press = props.globals.initNode("/systems/hydraulic/green-resv-lo-air-press", 0, "BOOL");
+
+var canvas_lowerECAMPageHyd =
+{
+ new: func(svg,name) {
+ var obj = {parents: [canvas_lowerECAMPageHyd,canvas_lowerECAM_base] };
+ obj.group = obj.canvas.createGroup();
+ obj.name = name;
+
+ canvas.parsesvg(obj.group, svg, {"font-mapper": obj.font_mapper} );
+
+ foreach(var key; obj.getKeys()) {
+ obj[key] = obj.group.getElementById(key);
+
+ var clip_el = obj.group.getElementById(key ~ "_clip");
+ if (clip_el != nil) {
+ clip_el.setVisible(0);
+ var tran_rect = clip_el.getTransformedBounds();
+
+ var clip_rect = sprintf("rect(%d,%d, %d,%d)",
+ tran_rect[1],
+ tran_rect[2],
+ tran_rect[3],
+ tran_rect[0]);
+ obj[key].set("clip", clip_rect);
+ obj[key].set("clip-frame", canvas.Element.PARENT);
+ }
+ };
+
+ foreach(var key; obj.getKeysBottom()) {
+ obj[key] = obj.group.getElementById(key);
+ };
+
+ obj.units = acconfig_weight_kgs.getValue();
+
+ # init
+
+ obj.update_items = [
+ props.UpdateManager.FromHashValue("blue", 25, func(val) {
+ if (val >= 100) {
+ obj["Press-Blue"].setText(sprintf("%s", math.round(val, 50)));
+ } else {
+ obj["Press-Blue"].setText(sprintf("%s", 0));
+ }
+
+ if (val > 1450) {
+ obj["Blue-Line"].setColor(0.0509,0.7529,0.2941);
+ obj["Blue-Line"].setColorFill(0.0509,0.7529,0.2941);
+ obj["Blue-Line-Top"].setColorFill(0.0509,0.7529,0.2941);
+ obj["Blue-Line-Bottom"].setColorFill(0.0509,0.7529,0.2941);
+ obj["Blue-Indicator"].setColor(0.0509,0.7529,0.2941);
+ obj["Press-Blue"].setColor(0.0509,0.7529,0.2941);
+ obj["Blue-label"].setColor(0.8078,0.8039,0.8078);
+ } else {
+ obj["Blue-Line"].setColor(0.7333,0.3803,0);
+ obj["Blue-Line"].setColorFill(0.7333,0.3803,0);
+ obj["Blue-Line-Top"].setColorFill(0.7333,0.3803,0);
+ obj["Blue-Line-Bottom"].setColorFill(0.7333,0.3803,0);
+ obj["Blue-Indicator"].setColor(0.7333,0.3803,0);
+ obj["Press-Blue"].setColor(0.7333,0.3803,0);
+ obj["Blue-label"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashValue("yellow", 25, func(val) {
+ if (val >= 100) {
+ obj["Press-Yellow"].setText(sprintf("%s", math.round(val, 50)));
+ } else {
+ obj["Press-Yellow"].setText(sprintf("%s", 0));
+ }
+
+ if (val > 1450) {
+ obj["Yellow-Line"].setColor(0.0509,0.7529,0.2941);
+ obj["Yellow-Line"].setColorFill(0.0509,0.7529,0.2941);
+ obj["Yellow-Line-Top"].setColorFill(0.0509,0.7529,0.2941);
+ obj["Yellow-Line-Middle"].setColorFill(0.0509,0.7529,0.2941);
+ obj["Yellow-Line-Bottom"].setColorFill(0.0509,0.7529,0.2941);
+ obj["Yellow-Indicator"].setColor(0.0509,0.7529,0.2941);
+ obj["Press-Yellow"].setColor(0.0509,0.7529,0.2941);
+ obj["Yellow-label"].setColor(0.8078,0.8039,0.8078);
+ } else {
+ obj["Yellow-Line"].setColor(0.7333,0.3803,0);
+ obj["Yellow-Line"].setColorFill(0.7333,0.3803,0);
+ obj["Yellow-Line-Top"].setColorFill(0.7333,0.3803,0);
+ obj["Yellow-Line-Middle"].setColorFill(0.7333,0.3803,0);
+ obj["Yellow-Line-Bottom"].setColorFill(0.7333,0.3803,0);
+ obj["Yellow-Indicator"].setColor(0.7333,0.3803,0);
+ obj["Press-Yellow"].setColor(0.7333,0.3803,0);
+ obj["Yellow-label"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashValue("green", 25, func(val) {
+ if (val >= 100) {
+ obj["Press-Green"].setText(sprintf("%s", math.round(val, 50)));
+ } else {
+ obj["Press-Green"].setText(sprintf("%s", 0));
+ }
+
+ if (val > 1450) {
+ obj["Green-Line"].setColor(0.0509,0.7529,0.2941);
+ obj["Green-Line"].setColorFill(0.0509,0.7529,0.2941);
+ obj["Green-Line-Top"].setColorFill(0.0509,0.7529,0.2941);
+ obj["Green-Line-Middle"].setColorFill(0.0509,0.7529,0.2941);
+ obj["Green-Line-Bottom"].setColorFill(0.0509,0.7529,0.2941);
+ obj["Green-Indicator"].setColor(0.0509,0.7529,0.2941);
+ obj["Press-Green"].setColor(0.0509,0.7529,0.2941);
+ obj["Green-label"].setColor(0.8078,0.8039,0.8078);
+ } else {
+ obj["Green-Line"].setColor(0.7333,0.3803,0);
+ obj["Green-Line"].setColorFill(0.7333,0.3803,0);
+ obj["Green-Line-Top"].setColorFill(0.7333,0.3803,0);
+ obj["Green-Line-Middle"].setColorFill(0.7333,0.3803,0);
+ obj["Green-Line-Bottom"].setColorFill(0.7333,0.3803,0);
+ obj["Green-Indicator"].setColor(0.7333,0.3803,0);
+ obj["Press-Green"].setColor(0.7333,0.3803,0);
+ obj["Green-label"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashValue("N2_actual_1", 0.5, func(val) {
+ if (val >= 59) {
+ obj["Pump-Green-label"].setColor(0.8078,0.8039,0.8078);
+ } else {
+ obj["Pump-Green-label"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashValue("N2_actual_2", 0.5, func(val) {
+ if (val >= 59) {
+ obj["Pump-Yellow-label"].setColor(0.8078,0.8039,0.8078);
+ } else {
+ obj["Pump-Yellow-label"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashValue("hydBlueResvLoPrs", nil, func(val) {
+ if (val) {
+ obj["LO-AIR-PRESS-Blue"].show();
+ } else {
+ obj["LO-AIR-PRESS-Blue"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashValue("hydGreenResvLoPrs", nil, func(val) {
+ if (val) {
+ obj["LO-AIR-PRESS-Green"].show();
+ } else {
+ obj["LO-AIR-PRESS-Green"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashValue("hydYellowResvLoPrs", nil, func(val) {
+ if (val) {
+ obj["LO-AIR-PRESS-Yellow"].show();
+ } else {
+ obj["LO-AIR-PRESS-Yellow"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashValue("hydYellowElecPumpOvht", nil, func(val) {
+ if (val) {
+ obj["ELEC-OVHT-Yellow"].show();
+ } else {
+ obj["ELEC-OVHT-Yellow"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashValue("hydBlueElecPumpOvht", nil, func(val) {
+ if (val) {
+ obj["ELEC-OVHT-Blue"].show();
+ } else {
+ obj["ELEC-OVHT-Blue"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashValue("hydBlueResvOvht", nil, func(val) {
+ if (val) {
+ obj["OVHT-Blue"].show();
+ } else {
+ obj["OVHT-Blue"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashValue("hydGreenResvOvht", nil, func(val) {
+ if (val) {
+ obj["OVHT-Green"].show();
+ } else {
+ obj["OVHT-Green"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashValue("hydYellowResvOvht", nil, func(val) {
+ if (val) {
+ obj["OVHT-Yellow"].show();
+ } else {
+ obj["OVHT-Yellow"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashValue("hydRATPosition", nil, func(val) {
+ if (val) {
+ obj["RAT-stowed"].hide();
+ obj["RAT-not-stowed"].show();
+ } else {
+ obj["RAT-stowed"].show();
+ obj["RAT-not-stowed"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashValue("hydGreenFireValve", nil, func(val) {
+ if (val != 0) {
+ obj["Fire-Valve-Green"].setColor(0.7333,0.3803,0);
+ obj["Fire-Valve-Green-Cross"].setColorFill(0.7333,0.3803,0);
+ obj["Fire-Valve-Green"].setRotation(90 * D2R);
+ } else {
+ obj["Fire-Valve-Green"].setColor(0.0509,0.7529,0.2941);
+ obj["Fire-Valve-Green-Cross"].setColorFill(0.0509,0.7529,0.2941);
+ obj["Fire-Valve-Green"].setRotation(0);
+ }
+ }),
+ props.UpdateManager.FromHashValue("hydYellowFireValve", nil, func(val) {
+ if (val != 0) {
+ obj["Fire-Valve-Yellow"].setColor(0.7333,0.3803,0);
+ obj["Fire-Valve-Yellow-Cross"].setColorFill(0.7333,0.3803,0);
+ obj["Fire-Valve-Yellow"].setRotation(90 * D2R);
+ } else {
+ obj["Fire-Valve-Yellow"].setColor(0.0509,0.7529,0.2941);
+ obj["Fire-Valve-Yellow-Cross"].setColorFill(0.0509,0.7529,0.2941);
+ obj["Fire-Valve-Yellow"].setRotation(0);
+ }
+ }),
+ props.UpdateManager.FromHashList(["elecAC1","dcEss"], 1, func(val) {
+ if (val.elecAC1 >= 110 and val.dcEss >= 25) {
+ obj["ELEC-Blue-label"].setColor(0.8078,0.8039,0.8078);
+ } else {
+ obj["ELEC-Blue-label"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashList(["elecAC2","dc2"], 1, func(val) {
+ if (val.elecAC2 >= 110 and val.dc2 >= 25) {
+ obj["ELEC-Yellow-label"].setColor(0.8078,0.8039,0.8078);
+ } else {
+ obj["ELEC-Yellow-label"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashList(["yellow","hydYellowElecPumpSwitch"], nil, func(val) {
+ if (!val.hydYellowElecPumpSwitch) {
+ obj["ELEC-Yellow-on"].hide();
+ obj["ELEC-Yellow-off"].show();
+ } else {
+ obj["ELEC-Yellow-on"].show();
+ obj["ELEC-Yellow-off"].hide();
+ if (val.yellow > 1450) {
+ obj["ELEC-Yellow-on"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["ELEC-Yellow-on"].setColor(0.7333,0.3803,0);
+ }
+ }
+ }),
+ props.UpdateManager.FromHashList(["blue","hydBlueElecPumpSwitch"], nil, func(val) {
+ if (val.hydBlueElecPumpSwitch) {
+ obj["Pump-Blue-off"].hide();
+ if (val.blue > 1450) {
+ obj["Pump-Blue-on"].show();
+ obj["Pump-LOPR-Blue"].hide();
+ obj["Pump-Blue"].setColorFill(0.0509,0.7529,0.2941);
+ obj["Pump-Blue"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["Pump-Blue-on"].hide();
+ obj["Pump-LOPR-Blue"].show();
+ obj["Pump-Blue"].setColorFill(0.7333,0.3803,0);
+ obj["Pump-Blue"].setColor(0.7333,0.3803,0);
+ }
+ } else {
+ obj["Pump-Blue-off"].show();
+ obj["Pump-Blue-on"].hide();
+ obj["Pump-LOPR-Blue"].hide();
+ obj["Pump-Blue"].setColorFill(0.7333,0.3803,0);
+ obj["Pump-Blue"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashList(["yellow","hydYellowEDPPumpSwitch"], nil, func(val) {
+ if (val.hydYellowEDPPumpSwitch) {
+ obj["Pump-Yellow-off"].hide();
+ if (val.yellow > 1450) {
+ obj["Pump-Yellow-on"].show();
+ obj["Pump-LOPR-Yellow"].hide();
+ obj["Pump-Yellow"].setColorFill(0.0509,0.7529,0.2941);
+ obj["Pump-Yellow"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["Pump-Yellow-on"].hide();
+ obj["Pump-LOPR-Yellow"].show();
+ obj["Pump-Yellow"].setColorFill(0.7333,0.3803,0);
+ obj["Pump-Yellow"].setColor(0.7333,0.3803,0);
+ }
+ } else {
+ obj["Pump-Yellow-off"].show();
+ obj["Pump-Yellow-on"].hide();
+ obj["Pump-LOPR-Yellow"].hide();
+ obj["Pump-Yellow"].setColorFill(0.7333,0.3803,0);
+ obj["Pump-Yellow"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashList(["green","hydGreenEDPPumpSwitch"], nil, func(val) {
+ if (val.hydGreenEDPPumpSwitch) {
+ obj["Pump-Green-off"].hide();
+ if (val.green > 1450) {
+ obj["Pump-Green-on"].show();
+ obj["Pump-LOPR-Green"].hide();
+ obj["Pump-Green"].setColor(0.0509,0.7529,0.2941);
+ obj["Pump-Green"].setColorFill(0.0509,0.7529,0.2941);
+ } else {
+ obj["Pump-Green-on"].hide();
+ obj["Pump-LOPR-Green"].show();
+ obj["Pump-Green"].setColor(0.7333,0.3803,0);
+ obj["Pump-Green"].setColorFill(0.7333,0.3803,0);
+ }
+ } else {
+ obj["Pump-Green-off"].show();
+ obj["Pump-Green-on"].hide();
+ obj["Pump-LOPR-Green"].hide();
+ obj["Pump-Green"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashList(["hydPTUSwitch","hydPTUDiff","hydPTUActive","hydPTUFault"], nil, func(val) {
+ if (val.hydPTUSwitch and !val.hydPTUFault) {
+ obj["PTU-connection"].setColor(0.0509,0.7529,0.2941);
+
+ if (val.hydPTUActive) {
+ if (val.hydPTUDiff < 0) {
+ obj["PTU-Supply-Line"].show();
+ obj["PTU-supply-yellow"].show();
+ obj["PTU-supply-green"].hide();
+ obj["PTU-Auto-or-off"].hide();
+ } else {
+ obj["PTU-Supply-Line"].show();
+ obj["PTU-supply-yellow"].hide();
+ obj["PTU-supply-green"].show();
+ obj["PTU-Auto-or-off"].hide();
+ }
+ } else {
+ obj["PTU-Auto-or-off"].setColor(0.0509,0.7529,0.2941);
+ obj["PTU-Supply-Line"].hide();
+ obj["PTU-supply-yellow"].hide();
+ obj["PTU-supply-green"].hide();
+ obj["PTU-Auto-or-off"].show();
+ }
+ } else {
+ obj["PTU-connection"].setColor(0.7333,0.3803,0);
+ obj["PTU-Auto-or-off"].setColor(0.7333,0.3803,0);
+ obj["PTU-Supply-Line"].hide();
+ obj["PTU-supply-yellow"].hide();
+ obj["PTU-supply-green"].hide();
+ obj["PTU-Auto-or-off"].show();
+ }
+ }),
+ props.UpdateManager.FromHashValue("hydBlueQTY", 0.05, func(val) {
+ obj["Quantity-Indicator-Blue"].setTranslation(0,((val / 8) * -140) + 140);
+ if (val >= 2.4) {
+ obj["Quantity-Indicator-Blue"].setColor(0.0509,0.7529,0.2941);
+ obj["path5561-4"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["Quantity-Indicator-Blue"].setColor(0.7333,0.3803,0);
+ obj["path5561-4"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashValue("hydGreenQTY", 0.05, func(val) {
+ obj["Quantity-Indicator-Green"].setTranslation(0,((val / 18) * -140) + 140);
+ if (val >= 3.5) {
+ obj["Quantity-Indicator-Green"].setColor(0.0509,0.7529,0.2941);
+ obj["path5561-5"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["Quantity-Indicator-Green"].setColor(0.7333,0.3803,0);
+ obj["path5561-5"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashValue("hydYellowQTY", 0.05, func(val) {
+ obj["Quantity-Indicator-Yellow"].setTranslation(0,((val / 15) * -140) + 140);
+ if (val >= 3.5) {
+ obj["Quantity-Indicator-Yellow"].setColor(0.0509,0.7529,0.2941);
+ obj["path5561"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["Quantity-Indicator-Yellow"].setColor(0.7333,0.3803,0);
+ obj["path5561"].setColor(0.7333,0.3803,0);
+ }
+ }),
+ ];
+
+ obj.displayedGForce = 0;
+ obj.updateItemsBottom = [
+ props.UpdateManager.FromHashValue("acconfigUnits", nil, func(val) {
+ obj.units = val;
+ if (val) {
+ obj["GW-weight-unit"].setText("KG");
+ } else {
+ obj["GW-weight-unit"].setText("LBS");
+ }
+ }),
+ props.UpdateManager.FromHashValue("hour", nil, func(val) {
+ obj["UTCh"].setText(sprintf("%02d", val));
+ }),
+ props.UpdateManager.FromHashValue("minute", nil, func(val) {
+ obj["UTCm"].setText(sprintf("%02d", val));
+ }),
+ props.UpdateManager.FromHashValue("gForce", 0.05, func(val) {
+ if (obj.displayedGForce) {
+ obj["GLoad"].setText("G.LOAD " ~ sprintf("%3.1f", val));
+ }
+ }),
+ props.UpdateManager.FromHashValue("gForceDisplay", nil, func(val) {
+ if ((val == 1 and !obj.displayedGForce) or (val != 0 and obj.displayedGForce)) {
+ obj.displayedGForce = 1;
+ obj["GLoad"].show();
+ } else {
+ obj.displayedGForce = 0;
+ obj["GLoad"].hide();
+ }
+ }),
+ ];
+ return obj;
+ },
+ getKeysBottom: func() {
+ return ["TAT","SAT","GW","UTCh","UTCm","GLoad","GW-weight-unit"];
+ },
+ getKeys: func() {
+ return ["TAT","SAT","GW","UTCh","UTCm","GLoad","GW-weight-unit","Green-Indicator","HYD-Quantity-Group-Blue","HYD-Quantity-Group-Yellow","HYD-Quantity-Group-Green","Blue-Indicator","Yellow-Indicator","Press-Green","Press-Blue","Press-Yellow","Green-Line","Blue-Line","Yellow-Line","Green-Line-Top","Blue-Line-Top","Yellow-Line-Middle","Green-Line-Middle","Yellow-Line-Bottom","Green-Line-Bottom","Blue-Line-Bottom","Yellow-Line-Top","PTU-Supply-Line","PTU-supply-yellow","PTU-supply-green","PTU-connection",
+ "PTU-Auto-or-off","RAT-label","RAT-stowed","RAT-not-stowed","ELEC-Yellow-off","ELEC-Yellow-on","ELEC-Yellow-label","ELEC-OVTH-Yellow","ELEC-Blue-label","ELEC-OVHT-Blue","ELEC-OVHT-Yellow","Pump-Green-label","Pump-Yellow-label","Pump-Green",
+ "Pump-LOPR-Green","Pump-Green-off","Pump-Green-on","Pump-Yellow","Pump-LOPR-Yellow","Pump-Yellow-off","Pump-Yellow-on","Pump-Blue","Pump-LOPR-Blue","Pump-Blue-off","Pump-Blue-on","Fire-Valve-Green","Fire-Valve-Yellow","LO-AIR-PRESS-Green",
+ "LO-AIR-PRESS-Yellow","LO-AIR-PRESS-Blue","OVHT-Green","OVHT-Blue","OVHT-Yellow","Quantity-Indicator-Green","Quantity-Indicator-Blue","Quantity-Indicator-Yellow","Green-label","Blue-label","Yellow-label","Fire-Valve-Yellow-Cross","Fire-Valve-Green-Cross","path5561","path5561-4","path5561-5"];
+ },
+ updateBottom: func(notification) {
+ foreach(var update_item_bottom; me.updateItemsBottom)
+ {
+ update_item_bottom.update(notification);
+ }
+
+ if (fmgc.FMGCInternal.fuelRequest and fmgc.FMGCInternal.blockConfirmed and !fmgc.FMGCInternal.fuelCalculating and notification.FWCPhase != 1) {
+ if (me.units) {
+ me["GW"].setText(sprintf("%s", math.round(fmgc.FMGCInternal.fuelPredGw * 1000 * LBS2KGS, 100)));
+ } else {
+ me["GW"].setText(sprintf("%s", math.round(fmgc.FMGCInternal.fuelPredGw * 1000, 100)));
+ }
+ me["GW"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ me["GW"].setText(sprintf("%s", "-----"));
+ me["GW"].setColor(0.0901,0.6039,0.7176);
+ }
+
+ if (dmc.DMController.DMCs[1].outputs[4] != nil) {
+ me["SAT"].setText(sprintf("%+2.0f", dmc.DMController.DMCs[1].outputs[4].getValue()));
+ me["SAT"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ me["SAT"].setText(sprintf("%s", "XX"));
+ me["SAT"].setColor(0.7333,0.3803,0);
+ }
+
+ if (dmc.DMController.DMCs[1].outputs[5] != nil) {
+ me["TAT"].setText(sprintf("%+2.0f", dmc.DMController.DMCs[1].outputs[5].getValue()));
+ me["TAT"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ me["TAT"].setText(sprintf("%s", "XX"));
+ me["TAT"].setColor(0.7333,0.3803,0);
+ }
+ },
+ update: func(notification) {
+ me.updatePower();
+
+ if (me.test.getVisible() == 1) {
+ me.updateTest(notification);
+ }
+
+ if (me.group.getVisible() == 0) {
+ return;
+ }
+
+ foreach(var update_item; me.update_items)
+ {
+ update_item.update(notification);
+ }
+
+ me.updateBottom(notification);
+ },
+ updatePower: func() {
+ if (me.name == ecam.SystemDisplayController.displayedPage.name) {
+ if (du4_lgt.getValue() > 0.01 and systems.ELEC.Bus.ac2.getValue() >= 110) {
+ if (du4_test_time.getValue() + du4_test_amount.getValue() >= pts.Sim.Time.elapsedSec.getValue()) {
+ me.group.setVisible(0);
+ me.test.setVisible(1);
+ } else {
+ me.group.setVisible(1);
+ me.test.setVisible(0);
+ }
+ } else {
+ me.group.setVisible(0);
+ me.test.setVisible(0);
+ }
+ } else {
+ me.group.setVisible(0);
+ # don't hide the test group; just let whichever page is active control it
+ }
+ },
+};
+
+var input = {
+ hydBlueResvOvht: "/systems/hydraulic/blue-resv-ovht",
+ hydGreenResvOvht: "/systems/hydraulic/green-resv-ovht",
+ hydYellowResvOvht: "/systems/hydraulic/yellow-resv-ovht",
+ hydBlueResvLoPrs: "/systems/hydraulic/blue-resv-lo-air-press",
+ hydGreenResvLoPrs: "/systems/hydraulic/green-resv-lo-air-press",
+ hydYellowResvLoPrs: "/systems/hydraulic/yellow-resv-lo-air-press",
+ hydYellowElecPumpOvht: "/systems/hydraulic/elec-pump-yellow-ovht",
+ hydBlueElecPumpOvht: "/systems/hydraulic/elec-pump-blue-ovht",
+ hydRATPosition: "/systems/hydraulic/sources/rat/position",
+ hydGreenFireValve: "/systems/hydraulic/sources/green-edp/fire-valve",
+ hydYellowFireValve: "/systems/hydraulic/sources/yellow-edp/fire-valve",
+ hydBlueElecPumpSwitch: "/controls/hydraulic/switches/blue-elec",
+ hydGreenEDPPumpSwitch: "/controls/hydraulic/switches/green-edp",
+ hydYellowElecPumpSwitch: "/controls/hydraulic/switches/yellow-elec",
+ hydYellowEDPPumpSwitch: "/controls/hydraulic/switches/yellow-edp",
+ hydPTUSwitch: "/controls/hydraulic/switches/ptu",
+ hydPTUFault: "/systems/failures/hydraulic/ptu",
+ hydPTUActive: "/systems/hydraulic/sources/ptu/ptu-hydraulic-condition",
+ hydPTUDiff: "/systems/hydraulic/yellow-psi-diff",
+ hydBlueQTY: "/systems/hydraulic/blue-qty",
+ hydGreenQTY: "/systems/hydraulic/green-qty",
+ hydYellowQTY: "/systems/hydraulic/yellow-qty",
+};
+
+foreach (var name; keys(input)) {
+ emesary.GlobalTransmitter.NotifyAll(notifications.FrameNotificationAddProperty.new("A320 System Display", name, input[name]));
+}
\ No newline at end of file
diff --git a/Models/Instruments/Lower-ECAM/Lower-ECAM-press.nas b/Models/Instruments/Lower-ECAM/Lower-ECAM-press.nas
new file mode 100644
index 00000000..89d8f3ff
--- /dev/null
+++ b/Models/Instruments/Lower-ECAM/Lower-ECAM-press.nas
@@ -0,0 +1,229 @@
+# A3XX Lower ECAM Canvas
+# Copyright (c) 2021 Josh Davidson (Octal450) and Jonathan Redpath
+
+var canvas_lowerECAMPagePress =
+{
+ new: func(svg,name) {
+ var obj = {parents: [canvas_lowerECAMPagePress,canvas_lowerECAM_base] };
+ obj.group = obj.canvas.createGroup();
+ obj.name = name;
+
+ canvas.parsesvg(obj.group, svg, {"font-mapper": obj.font_mapper} );
+
+ foreach(var key; obj.getKeys()) {
+ obj[key] = obj.group.getElementById(key);
+ };
+
+ foreach(var key; obj.getKeysBottom()) {
+ obj[key] = obj.group.getElementById(key);
+ };
+
+ obj.units = acconfig_weight_kgs.getValue();
+
+ # init
+ obj["PRESS-Sys-2"].hide();
+ obj["PRESS-Outlet-Transit-Failed"].hide();
+ obj["PRESS-Inlet-Transit-Failed"].hide();
+
+ obj.update_items = [
+ props.UpdateManager.FromHashValue("pressDelta", 0.05, func(val) {
+ if (val > 31.9) {
+ obj["PRESS-deltaP"].setText(sprintf("%2.1f", 31.9));
+ } else if (val < -9.9) {
+ obj["PRESS-deltaP"].setText(sprintf("%2.1f", -9.9));
+ } else {
+ obj["PRESS-deltaP"].setText(sprintf("%2.1f", val));
+ }
+
+ if (val < -0.4 or val > 8.5) {
+ obj["PRESS-deltaP"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["PRESS-deltaP"].setColor(0.0509,0.7529,0.2941);
+ }
+ }),
+ props.UpdateManager.FromHashValue("pressVS", 25, func(val) {
+ if (val > 9950) {
+ obj["PRESS-Cab-VS"].setText(sprintf("%4.0f", 9950));
+ } else if (val < -9950) {
+ obj["PRESS-Cab-VS"].setText(sprintf("%4.0f", -9950));
+ } else {
+ obj["PRESS-Cab-VS"].setText(sprintf("%-4.0f", math.round(val,50)));
+ }
+
+ if (abs(val) > 2000) {
+ obj["PRESS-Cab-VS"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["PRESS-Cab-VS"].setColor(0.0509,0.7529,0.2941);
+ }
+ }),
+ props.UpdateManager.FromHashValue("pressAlt", 25, func(val) {
+ if (val > 32750) {
+ obj["PRESS-Cab-Alt"].setText(sprintf("%5.0f", 32750));
+ } else if (val < -9950) {
+ obj["PRESS-Cab-Alt"].setText(sprintf("%5.0f", -9950));
+ } else {
+ obj["PRESS-Cab-Alt"].setText(sprintf("%5.0f", math.round(val,50)));
+ }
+
+ if (val > 9550) {
+ obj["PRESS-Cab-Alt"].setColor(1,0,0);
+ } else {
+ obj["PRESS-Cab-Alt"].setColor(0.0509,0.7529,0.2941);
+ }
+ }),
+ props.UpdateManager.FromHashValue("pressAuto", nil, func(val) {
+ if (val) {
+ obj["PRESS-Man"].hide();
+ obj["PRESS-Sys-1"].show();
+ } else {
+ obj["PRESS-Man"].show();
+ obj["PRESS-Sys-1"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashList(["flowCtlValve1","engine1State"], nil, func(val) {
+ if (val.flowCtlValve1 == 0 and val.engine1State == 3) {
+ obj["PRESS-Pack-1-Triangle"].setColor(0.7333,0.3803,0);
+ obj["PRESS-Pack-1"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["PRESS-Pack-1-Triangle"].setColor(0.0509,0.7529,0.2941);
+ obj["PRESS-Pack-1"].setColor(0.8078,0.8039,0.8078);
+ }
+ }),
+ props.UpdateManager.FromHashList(["flowCtlValve2","engine2State"], nil, func(val) {
+ if (val.flowCtlValve2 == 0 and val.engine2State == 3) {
+ obj["PRESS-Pack-2-Triangle"].setColor(0.7333,0.3803,0);
+ obj["PRESS-Pack-2"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["PRESS-Pack-2-Triangle"].setColor(0.0509,0.7529,0.2941);
+ obj["PRESS-Pack-2"].setColor(0.8078,0.8039,0.8078);
+ }
+ }),
+ ];
+
+ obj.displayedGForce = 0;
+ obj.updateItemsBottom = [
+ props.UpdateManager.FromHashValue("acconfigUnits", nil, func(val) {
+ obj.units = val;
+ if (val) {
+ obj["GW-weight-unit"].setText("KG");
+ } else {
+ obj["GW-weight-unit"].setText("LBS");
+ }
+ }),
+ props.UpdateManager.FromHashValue("hour", nil, func(val) {
+ obj["UTCh"].setText(sprintf("%02d", val));
+ }),
+ props.UpdateManager.FromHashValue("minute", nil, func(val) {
+ obj["UTCm"].setText(sprintf("%02d", val));
+ }),
+ props.UpdateManager.FromHashValue("gForce", 0.05, func(val) {
+ if (obj.displayedGForce) {
+ obj["GLoad"].setText("G.LOAD " ~ sprintf("%3.1f", val));
+ }
+ }),
+ props.UpdateManager.FromHashValue("gForceDisplay", nil, func(val) {
+ if ((val == 1 and !obj.displayedGForce) or (val != 0 and obj.displayedGForce)) {
+ obj.displayedGForce = 1;
+ obj["GLoad"].show();
+ } else {
+ obj.displayedGForce = 0;
+ obj["GLoad"].hide();
+ }
+ }),
+ ];
+ return obj;
+ },
+ getKeysBottom: func() {
+ return ["TAT","SAT","GW","UTCh","UTCm","GLoad","GW-weight-unit"];
+ },
+ getKeys: func() {
+ return["PRESS-Cab-VS", "PRESS-Cab-VS-neg", "PRESS-Cab-Alt", "PRESS-deltaP", "PRESS-LDG-Elev", "PRESS-deltaP-needle", "PRESS-VS-needle", "PRESS-Alt-needle",
+ "PRESS-Man", "PRESS-Sys-1", "PRESS-Sys-2", "PRESS-Outlet-Transit-Failed", "PRESS-Inlet-Transit-Failed", "PRESS-LDG-Elev-mode","PRESS-Pack-1-Triangle","PRESS-Pack-2-Triangle",
+ "PRESS-Pack-1","PRESS-Pack-2"];
+ },
+ updateBottom: func(notification) {
+ foreach(var update_item_bottom; me.updateItemsBottom)
+ {
+ update_item_bottom.update(notification);
+ }
+
+ if (fmgc.FMGCInternal.fuelRequest and fmgc.FMGCInternal.blockConfirmed and !fmgc.FMGCInternal.fuelCalculating and notification.FWCPhase != 1) {
+ if (me.units) {
+ me["GW"].setText(sprintf("%s", math.round(fmgc.FMGCInternal.fuelPredGw * 1000 * LBS2KGS, 100)));
+ } else {
+ me["GW"].setText(sprintf("%s", math.round(fmgc.FMGCInternal.fuelPredGw * 1000, 100)));
+ }
+ me["GW"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ me["GW"].setText(sprintf("%s", "-----"));
+ me["GW"].setColor(0.0901,0.6039,0.7176);
+ }
+
+ if (dmc.DMController.DMCs[1].outputs[4] != nil) {
+ me["SAT"].setText(sprintf("%+2.0f", dmc.DMController.DMCs[1].outputs[4].getValue()));
+ me["SAT"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ me["SAT"].setText(sprintf("%s", "XX"));
+ me["SAT"].setColor(0.7333,0.3803,0);
+ }
+
+ if (dmc.DMController.DMCs[1].outputs[5] != nil) {
+ me["TAT"].setText(sprintf("%+2.0f", dmc.DMController.DMCs[1].outputs[5].getValue()));
+ me["TAT"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ me["TAT"].setText(sprintf("%s", "XX"));
+ me["TAT"].setColor(0.7333,0.3803,0);
+ }
+ },
+ update: func(notification) {
+ me.updatePower();
+
+ if (me.test.getVisible() == 1) {
+ me.updateTest(notification);
+ }
+
+ if (me.group.getVisible() == 0) {
+ return;
+ }
+
+ foreach(var update_item; me.update_items)
+ {
+ update_item.update(notification);
+ }
+
+ me.updateBottom(notification);
+ },
+ updatePower: func() {
+ if (me.name == ecam.SystemDisplayController.displayedPage.name) {
+ if (du4_lgt.getValue() > 0.01 and systems.ELEC.Bus.ac2.getValue() >= 110) {
+ if (du4_test_time.getValue() + du4_test_amount.getValue() >= pts.Sim.Time.elapsedSec.getValue()) {
+ me.group.setVisible(0);
+ me.test.setVisible(1);
+ } else {
+ me.group.setVisible(1);
+ me.test.setVisible(0);
+ }
+ } else {
+ me.group.setVisible(0);
+ me.test.setVisible(0);
+ }
+ } else {
+ me.group.setVisible(0);
+ # don't hide the test group; just let whichever page is active control it
+ }
+ },
+};
+
+var input = {
+ pressAlt: "/systems/pressurization/cabinalt-norm",
+ pressAuto: "/systems/pressurization/auto",
+ pressDelta: "/systems/pressurization/deltap-norm",
+ pressVS: "/systems/pressurization/vs-norm",
+
+ flowCtlValve1: "/systems/air-conditioning/valves/flow-control-valve-1",
+ flowCtlValve2: "/systems/air-conditioning/valves/flow-control-valve-2",
+};
+
+foreach (var name; keys(input)) {
+ emesary.GlobalTransmitter.NotifyAll(notifications.FrameNotificationAddProperty.new("A320 System Display", name, input[name]));
+}
\ No newline at end of file
diff --git a/Models/Instruments/Lower-ECAM/Lower-ECAM-sts.nas b/Models/Instruments/Lower-ECAM/Lower-ECAM-sts.nas
new file mode 100644
index 00000000..009176d4
--- /dev/null
+++ b/Models/Instruments/Lower-ECAM/Lower-ECAM-sts.nas
@@ -0,0 +1,147 @@
+# A3XX Lower ECAM Canvas
+# Copyright (c) 2021 Josh Davidson (Octal450) and Jonathan Redpath
+
+var canvas_lowerECAMPageSts =
+{
+ new: func(svg,name) {
+ var obj = {parents: [canvas_lowerECAMPageSts,canvas_lowerECAM_base] };
+ obj.group = obj.canvas.createGroup();
+ obj.name = name;
+
+ canvas.parsesvg(obj.group, svg, {"font-mapper": obj.font_mapper} );
+
+ foreach(var key; obj.getKeys()) {
+ obj[key] = obj.group.getElementById(key);
+ };
+
+ foreach(var key; obj.getKeysBottom()) {
+ obj[key] = obj.group.getElementById(key);
+ };
+
+ obj.units = acconfig_weight_kgs.getValue();
+
+ # init
+
+ obj.update_items = [
+ ];
+
+ obj.displayedGForce = 0;
+ obj.updateItemsBottom = [
+ props.UpdateManager.FromHashValue("acconfigUnits", nil, func(val) {
+ obj.units = val;
+ if (val) {
+ obj["GW-weight-unit"].setText("KG");
+ } else {
+ obj["GW-weight-unit"].setText("LBS");
+ }
+ }),
+ props.UpdateManager.FromHashValue("hour", nil, func(val) {
+ obj["UTCh"].setText(sprintf("%02d", val));
+ }),
+ props.UpdateManager.FromHashValue("minute", nil, func(val) {
+ obj["UTCm"].setText(sprintf("%02d", val));
+ }),
+ props.UpdateManager.FromHashValue("gForce", 0.05, func(val) {
+ if (obj.displayedGForce) {
+ obj["GLoad"].setText("G.LOAD " ~ sprintf("%3.1f", val));
+ }
+ }),
+ props.UpdateManager.FromHashValue("gForceDisplay", nil, func(val) {
+ if ((val == 1 and !obj.displayedGForce) or (val != 0 and obj.displayedGForce)) {
+ obj.displayedGForce = 1;
+ obj["GLoad"].show();
+ } else {
+ obj.displayedGForce = 0;
+ obj["GLoad"].hide();
+ }
+ }),
+ ];
+ return obj;
+ },
+ getKeysBottom: func() {
+ return ["TAT","SAT","GW","UTCh","UTCm","GLoad","GW-weight-unit"];
+ },
+ getKeys: func() {
+ return["Bulk","BulkLine","BulkLbl","Exit1L","Exit1R","Cabin1Left","Cabin1LeftLbl","Cabin1LeftLine","Cabin1LeftSlide","Cabin1Right","Cabin1RightLbl","Cabin1RightLine","Cabin1RightSlide","Cabin2Left","Cabin2LeftLbl",
+ "Cabin2LeftLine","Cabin2LeftSlide","Cabin2Right","Cabin2RightLbl","Cabin2RightLine","Cabin2RightSlide","Cabin3Left","Cabin3LeftLbl","Cabin3LeftLine","Cabin3LeftSlide","Cabin3Right","Cabin3RightLbl","Cabin3RightLine","Cabin3RightSlide","AvionicsLine1",
+ "AvionicsLbl1","AvionicsLine2","AvionicsLbl2","Cargo1Line","Cargo1Lbl","Cargo1Door","Cargo2Line","Cargo2Lbl","Cargo2Door","ExitLSlide","ExitLLine","ExitLLbl","ExitRSlide","ExitRLine","ExitRLbl","Cabin4Left","Cabin4LeftLbl","Cabin4LeftLine",
+ "Cabin4LeftSlide","Cabin4Right","Cabin4RightLbl","Cabin4RightLine","Cabin4RightSlide","DOOROXY-REGUL-LO-PR"];},
+ updateBottom: func(notification) {
+ foreach(var update_item_bottom; me.updateItemsBottom)
+ {
+ update_item_bottom.update(notification);
+ }
+
+ if (fmgc.FMGCInternal.fuelRequest and fmgc.FMGCInternal.blockConfirmed and !fmgc.FMGCInternal.fuelCalculating and notification.FWCPhase != 1) {
+ if (me.units) {
+ me["GW"].setText(sprintf("%s", math.round(fmgc.FMGCInternal.fuelPredGw * 1000 * LBS2KGS, 100)));
+ } else {
+ me["GW"].setText(sprintf("%s", math.round(fmgc.FMGCInternal.fuelPredGw * 1000, 100)));
+ }
+ me["GW"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ me["GW"].setText(sprintf("%s", "-----"));
+ me["GW"].setColor(0.0901,0.6039,0.7176);
+ }
+
+ if (dmc.DMController.DMCs[1].outputs[4] != nil) {
+ me["SAT"].setText(sprintf("%+2.0f", dmc.DMController.DMCs[1].outputs[4].getValue()));
+ me["SAT"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ me["SAT"].setText(sprintf("%s", "XX"));
+ me["SAT"].setColor(0.7333,0.3803,0);
+ }
+
+ if (dmc.DMController.DMCs[1].outputs[5] != nil) {
+ me["TAT"].setText(sprintf("%+2.0f", dmc.DMController.DMCs[1].outputs[5].getValue()));
+ me["TAT"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ me["TAT"].setText(sprintf("%s", "XX"));
+ me["TAT"].setColor(0.7333,0.3803,0);
+ }
+ },
+ update: func(notification) {
+ me.updatePower();
+
+ if (me.test.getVisible() == 1) {
+ me.updateTest(notification);
+ }
+
+ if (me.group.getVisible() == 0) {
+ return;
+ }
+
+ foreach(var update_item; me.update_items)
+ {
+ update_item.update(notification);
+ }
+
+ me.updateBottom(notification);
+ },
+ updatePower: func() {
+ if (me.name == ecam.SystemDisplayController.displayedPage.name) {
+ if (du4_lgt.getValue() > 0.01 and systems.ELEC.Bus.ac2.getValue() >= 110) {
+ if (du4_test_time.getValue() + du4_test_amount.getValue() >= pts.Sim.Time.elapsedSec.getValue()) {
+ me.group.setVisible(0);
+ me.test.setVisible(1);
+ } else {
+ me.group.setVisible(1);
+ me.test.setVisible(0);
+ }
+ } else {
+ me.group.setVisible(0);
+ me.test.setVisible(0);
+ }
+ } else {
+ me.group.setVisible(0);
+ # don't hide the test group; just let whichever page is active control it
+ }
+ },
+};
+
+var input = {
+};
+
+foreach (var name; keys(input)) {
+ emesary.GlobalTransmitter.NotifyAll(notifications.FrameNotificationAddProperty.new("A320 System Display", name, input[name]));
+}
\ No newline at end of file
diff --git a/Models/Instruments/Lower-ECAM/Lower-ECAM-wheel.nas b/Models/Instruments/Lower-ECAM/Lower-ECAM-wheel.nas
new file mode 100644
index 00000000..3746763d
--- /dev/null
+++ b/Models/Instruments/Lower-ECAM/Lower-ECAM-wheel.nas
@@ -0,0 +1,745 @@
+# A3XX Lower ECAM Canvas
+# Copyright (c) 2021 Josh Davidson (Octal450) and Jonathan Redpath
+
+var canvas_lowerECAMPageWheel =
+{
+ new: func(svg,name) {
+ var obj = {parents: [canvas_lowerECAMPageWheel,canvas_lowerECAM_base] };
+ obj.group = obj.canvas.createGroup();
+ obj.name = name;
+
+ canvas.parsesvg(obj.group, svg, {"font-mapper": obj.font_mapper} );
+
+ foreach(var key; obj.getKeys()) {
+ obj[key] = obj.group.getElementById(key);
+ };
+
+ foreach(var key; obj.getKeysBottom()) {
+ obj[key] = obj.group.getElementById(key);
+ };
+
+ obj.units = acconfig_weight_kgs.getValue();
+
+ # init
+ obj["leftuplock"].hide();
+ obj["noseuplock"].hide();
+ obj["rightuplock"].hide();
+ obj["tirepress1"].hide();
+ obj["tirepress2"].hide();
+ obj["tirepress3"].hide();
+ obj["tirepress4"].hide();
+ obj["tirepress5"].hide();
+ obj["tirepress6"].hide();
+
+
+ obj.update_items = [
+ props.UpdateManager.FromHashList(["gearPosNorm","gearPosNorm1","gearPosNorm2","gearLever"], nil, func(val) {
+ if (val.gearLever and (val.gearPosNorm != 1 or val.gearPosNorm1 != 1 or val.gearPosNorm2 != 1)) {
+ obj["lgctltext"].show();
+ } elsif (!val.gearLever and (val.gearPosNorm != 0 or val.gearPosNorm1 != 0 or val.gearPosNorm2 != 0)) {
+ obj["lgctltext"].show();
+ } else {
+ obj["lgctltext"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashValue("gearPosNorm", nil, func(val) {
+ if (val < 0.2) {
+ obj["Triangle-Nose1"].hide();
+ obj["Triangle-Nose2"].hide();
+ } else {
+ obj["Triangle-Nose1"].show();
+ obj["Triangle-Nose2"].show();
+ }
+
+ if (val == 1) {
+ obj["Triangle-Nose1"].setColor(0.0509,0.7529,0.2941);
+ obj["Triangle-Nose2"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["Triangle-Nose1"].setColor(1,0,0);
+ obj["Triangle-Nose2"].setColor(1,0,0);
+ }
+ }),
+ props.UpdateManager.FromHashValue("gearPosNorm1", nil, func(val) {
+ if (val < 0.2) {
+ obj["Triangle-Left1"].hide();
+ obj["Triangle-Left2"].hide();
+ } else {
+ obj["Triangle-Left1"].show();
+ obj["Triangle-Left2"].show();
+ }
+
+ if (val == 1) {
+ obj["Triangle-Left1"].setColor(0.0509,0.7529,0.2941);
+ obj["Triangle-Left2"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["Triangle-Left1"].setColor(1,0,0);
+ obj["Triangle-Left2"].setColor(1,0,0);
+ }
+ }),
+ props.UpdateManager.FromHashValue("gearPosNorm2", nil, func(val) {
+ if (val < 0.2) {
+ obj["Triangle-Right1"].hide();
+ obj["Triangle-Right2"].hide();
+ } else {
+ obj["Triangle-Right1"].show();
+ obj["Triangle-Right2"].show();
+ }
+
+ if (val == 1) {
+ obj["Triangle-Right1"].setColor(0.0509,0.7529,0.2941);
+ obj["Triangle-Right2"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["Triangle-Right1"].setColor(1,0,0);
+ obj["Triangle-Right2"].setColor(1,0,0);
+ }
+ }),
+ props.UpdateManager.FromHashList(["yellow","green","NWSSwitch","brakesMode","val.accumPressPsiPressPsi","leftBrakeFCS","rightBrakeFCS"], nil, func(val) {
+ if (val.NWSSwitch and val.yellow >= 1500) {
+ obj["NWStext"].hide();
+ obj["NWS"].hide();
+ obj["NWSrect"].hide();
+ } else if (!val.NWSSwitch and val.yellow >= 1500) {
+ obj["NWStext"].show();
+ obj["NWS"].show();
+ obj["NWS"].setColor(0.0509,0.7529,0.2941);
+ obj["NWSrect"].show();
+ } else {
+ obj["NWStext"].show();
+ obj["NWS"].show();
+ obj["NWS"].setColor(0.7333,0.3803,0);
+ obj["NWSrect"].show();
+ }
+
+ if ((val.yellow < 1500 and val.brakesMode == 1) or !val.NWSSwitch) {
+ obj["antiskidtext"].show();
+ obj["antiskidtext"].setColor(0.7333,0.3803,0);
+ obj["BSCUrect1"].show();
+ obj["BSCUrect2"].show();
+ obj["BSCU1"].show();
+ obj["BSCU2"].show();
+ } else {
+ obj["antiskidtext"].hide();
+ obj["BSCUrect1"].hide();
+ obj["BSCUrect2"].hide();
+ obj["BSCU1"].hide();
+ obj["BSCU2"].hide();
+ }
+
+ if (val.green >= 1500) {
+ obj["normbrkhyd"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["normbrkhyd"].setColor(0.7333,0.3803,0);
+ }
+
+ if (val.yellow >= 1500) {
+ obj["altnbrkhyd"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["altnbrkhyd"].setColor(0.7333,0.3803,0);
+ }
+
+ if (!val.NWSSwitch or val.green < 1500) {
+ obj["NORMbrk"].show();
+ obj["normbrk-rect"].show();
+ obj["normbrkhyd"].show();
+ } else {
+ obj["NORMbrk"].hide();
+ obj["normbrk-rect"].hide();
+ obj["normbrkhyd"].hide();
+ }
+
+ if (val.brakesMode != 2 or val.green < 1500 or val.yellow < 1500 or !val.NWSSwitch) {
+ obj["ALTNbrk"].hide();
+ obj["altnbrk-rect"].hide();
+ obj["altnbrkhyd"].hide();
+ } else {
+ obj["ALTNbrk"].show();
+ obj["altnbrk-rect"].show();
+ obj["altnbrkhyd"].show();
+ if (val.yellow < 1500 and val.accumPressPsi < 1500) {
+ obj["ALTNbrk"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["ALTNbrk"].setColor(0.0509,0.7529,0.2941);
+ }
+ }
+
+ if (val.brakesMode == 2 and val.accumPressPsi < 200 and val.yellow < 1500) {
+ obj["accuonlyarrow"].hide();
+ obj["accuonly"].hide();
+ obj["accupress_text"].show();
+ obj["brakearrow"].hide();
+ obj["accupress_text"].setColor(0.7333,0.3803,0);
+ } else if (val.brakesMode == 2 and val.NWSSwitch and val.accumPressPsi > 200 and val.yellow >= 1500){
+ obj["accuonlyarrow"].hide();
+ obj["accuonly"].hide();
+ obj["accupress_text"].show();
+ obj["brakearrow"].show();
+ obj["accupress_text"].setColor(0.0509,0.7529,0.2941);
+ } else if (val.brakesMode == 2 and val.accumPressPsi > 200 and val.yellow < 1500) {
+ obj["accuonlyarrow"].show();
+ obj["accuonly"].show();
+ obj["brakearrow"].hide();
+ obj["accupress_text"].hide();
+ } else {
+ obj["accuonlyarrow"].hide();
+ obj["accuonly"].hide();
+ obj["brakearrow"].hide();
+ obj["accupress_text"].hide();
+ }
+
+ if (val.brakesMode == 1) {
+ obj["releaseL1"].hide();
+ obj["releaseL2"].hide();
+ obj["releaseL3"].hide();
+ obj["releaseL4"].hide();
+ obj["releaseR1"].hide();
+ obj["releaseR2"].hide();
+ obj["releaseR3"].hide();
+ obj["releaseR4"].hide();
+ } else { # Display if the brakes are released and in alternate braking
+ if (val.leftBrakeFCS == 0) {
+ obj["releaseL1"].show();
+ obj["releaseL2"].show();
+ obj["releaseL3"].show();
+ obj["releaseL4"].show();
+ } else {
+ obj["releaseL1"].hide();
+ obj["releaseL2"].hide();
+ obj["releaseL3"].hide();
+ obj["releaseL4"].hide();
+ }
+
+ if (val.rightBrakeFCS == 0) {
+ obj["releaseR1"].show();
+ obj["releaseR2"].show();
+ obj["releaseR3"].show();
+ obj["releaseR4"].show();
+ } else {
+ obj["releaseR1"].hide();
+ obj["releaseR2"].hide();
+ obj["releaseR3"].hide();
+ obj["releaseR4"].hide();
+ }
+ }
+ }),
+ props.UpdateManager.FromHashList(["brakeAutobrkMode","NWSSwitch"], nil, func(val) {
+ if (val.brakeAutobrkMode == 0) {
+ obj["autobrkind"].hide();
+ } elsif (val.brakeAutobrkMode == 1) {
+ obj["autobrkind"].show();
+ obj["autobrkind"].setText(sprintf("%s", "LO"));
+ } elsif (val.brakeAutobrkMode == 2) {
+ obj["autobrkind"].show();
+ obj["autobrkind"].setText(sprintf("%s", "MED"));
+ } elsif (val.brakeAutobrkMode == 3) {
+ obj["autobrkind"].show();
+ obj["autobrkind"].setText(sprintf("%s", "MAX"));
+ }
+
+ if (val.brakeAutobrkMode != 0 or !val.NWSSwitch) {
+ obj["autobrk"].show();
+ } else {
+ obj["autobrk"].hide();
+ }
+
+ if (!val.NWSSwitch) {
+ obj["autobrk"].setColor(0.7333,0.3803,0);
+ } else {
+ obj["autobrk"].setColor(0.0509,0.7529,0.2941);
+ }
+ }),
+ props.UpdateManager.FromHashValue("brakeLeft1", 0.5, func(val) {
+ obj["braketemp1"].setText(sprintf("%s", math.round(val, 5)));
+
+ if (val > 300) {
+ obj["braketemp1"].setColor(0.7333,0.3803,0);
+ obj["toparc1"].setColor(0.7333,0.3803,0);
+ } else {
+ if (val > 100 and val <= 300) {
+ obj["toparc1"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["toparc1"].setColor(0.8078,0.8039,0.8078);
+ }
+ obj["braketemp1"].setColor(0.0509,0.7529,0.2941);
+ }
+ }),
+ props.UpdateManager.FromHashValue("brakeLeft2", 0.5, func(val) {
+ obj["braketemp2"].setText(sprintf("%s", math.round(val, 5)));
+
+ if (val > 300) {
+ obj["braketemp2"].setColor(0.7333,0.3803,0);
+ obj["toparc2"].setColor(0.7333,0.3803,0);
+ } else {
+ if (val > 100 and val <= 300) {
+ obj["toparc2"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["toparc2"].setColor(0.8078,0.8039,0.8078);
+ }
+ obj["braketemp2"].setColor(0.0509,0.7529,0.2941);
+ }
+ }),
+ props.UpdateManager.FromHashValue("brakeRight1", 0.5, func(val) {
+ obj["braketemp3"].setText(sprintf("%s", math.round(val, 5)));
+
+ if (val > 300) {
+ obj["braketemp3"].setColor(0.7333,0.3803,0);
+ obj["toparc3"].setColor(0.7333,0.3803,0);
+ } else {
+ if (val > 100 and val <= 300) {
+ obj["toparc3"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["toparc3"].setColor(0.8078,0.8039,0.8078);
+ }
+ obj["braketemp3"].setColor(0.0509,0.7529,0.2941);
+ }
+ }),
+ props.UpdateManager.FromHashValue("brakeRight2", 0.5, func(val) {
+ obj["braketemp4"].setText(sprintf("%s", math.round(val, 5)));
+
+ if (val > 300) {
+ obj["braketemp4"].setColor(0.7333,0.3803,0);
+ obj["toparc4"].setColor(0.7333,0.3803,0);
+ } else {
+ if (val > 100 and val <= 300) {
+ obj["toparc4"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ obj["toparc4"].setColor(0.8078,0.8039,0.8078);
+ }
+ obj["braketemp4"].setColor(0.0509,0.7529,0.2941);
+ }
+ }),
+ props.UpdateManager.FromHashValue("wheelLeftDoor", 0.5, func(val) {
+ obj["leftdoor"].setRotation(val * D2R);
+ }),
+ props.UpdateManager.FromHashValue("wheelNoseLeftDoor", 0.5, func(val) {
+ obj["nosegeardoorL"].setRotation(val * D2R);
+ }),
+ props.UpdateManager.FromHashValue("wheelNoseRightDoor", 0.5, func(val) {
+ obj["nosegeardoorR"].setRotation(val * D2R);
+ }),
+ props.UpdateManager.FromHashValue("wheelRightDoor", 0.5, func(val) {
+ obj["rightdoor"].setRotation(val * D2R);
+ }),
+ props.UpdateManager.FromHashValue("wheelLeftDoorPos", 0.01, func(val) {
+ if (val == 0) {
+ obj["leftdoor"].setColorFill(0.0509,0.7529,0.2941);
+ } else {
+ obj["leftdoor"].setColorFill(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashValue("wheelNoseDoorPos", 0.01, func(val) {
+ if (val == 0) {
+ obj["nosegeardoorL"].setColorFill(0.0509,0.7529,0.2941);
+ obj["nosegeardoorR"].setColorFill(0.0509,0.7529,0.2941);
+ } else {
+ obj["nosegeardoorL"].setColorFill(0.7333,0.3803,0);
+ obj["nosegeardoorR"].setColorFill(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashValue("wheelRightDoorPos", 0.01, func(val) {
+ if (val == 0) {
+ obj["rightdoor"].setColorFill(0.0509,0.7529,0.2941);
+ } else {
+ obj["rightdoor"].setColorFill(0.7333,0.3803,0);
+ }
+ }),
+ props.UpdateManager.FromHashValue("spoilerL1", 0.5, func(val) {
+ if (val < 1.5) {
+ obj["spoiler1Lex"].hide();
+ obj["spoiler1Lrt"].show();
+ } else {
+ obj["spoiler1Lrt"].hide();
+ obj["spoiler1Lex"].show();
+ }
+ }),
+ props.UpdateManager.FromHashValue("spoilerL2", 0.5, func(val) {
+ if (val < 1.5) {
+ obj["spoiler2Lex"].hide();
+ obj["spoiler2Lrt"].show();
+ } else {
+ obj["spoiler2Lrt"].hide();
+ obj["spoiler2Lex"].show();
+ }
+ }),
+ props.UpdateManager.FromHashValue("spoilerL3", 0.5, func(val) {
+ if (val < 1.5) {
+ obj["spoiler3Lex"].hide();
+ obj["spoiler3Lrt"].show();
+ } else {
+ obj["spoiler3Lrt"].hide();
+ obj["spoiler3Lex"].show();
+ }
+ }),
+ props.UpdateManager.FromHashValue("spoilerL4", 0.5, func(val) {
+ if (val < 1.5) {
+ obj["spoiler4Lex"].hide();
+ obj["spoiler4Lrt"].show();
+ } else {
+ obj["spoiler4Lrt"].hide();
+ obj["spoiler4Lex"].show();
+ }
+ }),
+ props.UpdateManager.FromHashValue("spoilerL5", 0.5, func(val) {
+ if (val < 1.5) {
+ obj["spoiler5Lex"].hide();
+ obj["spoiler5Lrt"].show();
+ } else {
+ obj["spoiler5Lrt"].hide();
+ obj["spoiler5Lex"].show();
+ }
+ }),
+ props.UpdateManager.FromHashValue("spoilerR1", 0.5, func(val) {
+ if (val < 1.5) {
+ obj["spoiler1Rex"].hide();
+ obj["spoiler1Rrt"].show();
+ } else {
+ obj["spoiler1Rrt"].hide();
+ obj["spoiler1Rex"].show();
+ }
+ }),
+ props.UpdateManager.FromHashValue("spoilerR2", 0.5, func(val) {
+ if (val < 1.5) {
+ obj["spoiler2Rex"].hide();
+ obj["spoiler2Rrt"].show();
+ } else {
+ obj["spoiler2Rrt"].hide();
+ obj["spoiler2Rex"].show();
+ }
+ }),
+ props.UpdateManager.FromHashValue("spoilerR3", 0.5, func(val) {
+ if (val < 1.5) {
+ obj["spoiler3Rex"].hide();
+ obj["spoiler3Rrt"].show();
+ } else {
+ obj["spoiler3Rrt"].hide();
+ obj["spoiler3Rex"].show();
+ }
+ }),
+ props.UpdateManager.FromHashValue("spoilerR4", 0.5, func(val) {
+ if (val < 1.5) {
+ obj["spoiler4Rex"].hide();
+ obj["spoiler4Rrt"].show();
+ } else {
+ obj["spoiler4Rrt"].hide();
+ obj["spoiler4Rex"].show();
+ }
+ }),
+ props.UpdateManager.FromHashValue("spoilerR5", 0.5, func(val) {
+ if (val < 1.5) {
+ obj["spoiler5Rex"].hide();
+ obj["spoiler5Rrt"].show();
+ } else {
+ obj["spoiler5Rrt"].hide();
+ obj["spoiler5Rex"].show();
+ }
+ }),
+ props.UpdateManager.FromHashList(["spoilerL1Failure","spoilerL1","green"], nil, func(val) {
+ if (val.spoilerL1Failure or val.green < 1500) {
+ obj["spoiler1Lex"].setColor(0.7333,0.3803,0);
+ obj["spoiler1Lrt"].setColor(0.7333,0.3803,0);
+ if (val.spoilerL1 < 1.5) {
+ obj["spoiler1Lf"].show();
+ } else {
+ obj["spoiler1Lf"].hide();
+ }
+ } else {
+ obj["spoiler1Lex"].setColor(0.0509,0.7529,0.2941);
+ obj["spoiler1Lrt"].setColor(0.0509,0.7529,0.2941);
+ obj["spoiler1Lf"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashList(["spoilerL2Failure","spoilerL2","yellow"], nil, func(val) {
+ if (val.spoilerL2Failure or val.yellow < 1500) {
+ obj["spoiler2Lex"].setColor(0.7333,0.3803,0);
+ obj["spoiler2Lrt"].setColor(0.7333,0.3803,0);
+ if (val.spoilerL2 < 1.5) {
+ obj["spoiler2Lf"].show();
+ } else {
+ obj["spoiler2Lf"].hide();
+ }
+ } else {
+ obj["spoiler2Lex"].setColor(0.0509,0.7529,0.2941);
+ obj["spoiler2Lrt"].setColor(0.0509,0.7529,0.2941);
+ obj["spoiler2Lf"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashList(["spoilerL3Failure","spoilerL3","blue"], nil, func(val) {
+ if (val.spoilerL3Failure or val.blue < 1500) {
+ obj["spoiler3Lex"].setColor(0.7333,0.3803,0);
+ obj["spoiler3Lrt"].setColor(0.7333,0.3803,0);
+ if (val.spoilerL3 < 1.5) {
+ obj["spoiler3Lf"].show();
+ } else {
+ obj["spoiler3Lf"].hide();
+ }
+ } else {
+ obj["spoiler3Lex"].setColor(0.0509,0.7529,0.2941);
+ obj["spoiler3Lrt"].setColor(0.0509,0.7529,0.2941);
+ obj["spoiler3Lf"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashList(["spoilerL4Failure","spoilerL4","yellow"], nil, func(val) {
+ if (val.spoilerL4Failure or val.yellow < 1500) {
+ obj["spoiler4Lex"].setColor(0.7333,0.3803,0);
+ obj["spoiler4Lrt"].setColor(0.7333,0.3803,0);
+ if (val.spoilerL4 < 1.5) {
+ obj["spoiler4Lf"].show();
+ } else {
+ obj["spoiler4Lf"].hide();
+ }
+ } else {
+ obj["spoiler4Lex"].setColor(0.0509,0.7529,0.2941);
+ obj["spoiler4Lrt"].setColor(0.0509,0.7529,0.2941);
+ obj["spoiler4Lf"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashList(["spoilerL5Failure","spoilerL5","green"], nil, func(val) {
+ if (val.spoilerL5Failure or val.green < 1500) {
+ obj["spoiler5Lex"].setColor(0.7333,0.3803,0);
+ obj["spoiler5Lrt"].setColor(0.7333,0.3803,0);
+ if (val.spoilerL5 < 1.5) {
+ obj["spoiler5Lf"].show();
+ } else {
+ obj["spoiler5Lf"].hide();
+ }
+ } else {
+ obj["spoiler5Lex"].setColor(0.0509,0.7529,0.2941);
+ obj["spoiler5Lrt"].setColor(0.0509,0.7529,0.2941);
+ obj["spoiler5Lf"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashList(["spoilerR1Failure","spoilerR1","green"], nil, func(val) {
+ if (val.spoilerR1Failure or val.green < 1500) {
+ obj["spoiler1Rex"].setColor(0.7333,0.3803,0);
+ obj["spoiler1Rrt"].setColor(0.7333,0.3803,0);
+ if (val.spoilerR1 < 1.5) {
+ obj["spoiler1Rf"].show();
+ } else {
+ obj["spoiler1Rf"].hide();
+ }
+ } else {
+ obj["spoiler1Rex"].setColor(0.0509,0.7529,0.2941);
+ obj["spoiler1Rrt"].setColor(0.0509,0.7529,0.2941);
+ obj["spoiler1Rf"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashList(["spoilerR2Failure","spoilerR2","yellow"], nil, func(val) {
+ if (val.spoilerR2Failure or val.yellow < 1500) {
+ obj["spoiler2Rex"].setColor(0.7333,0.3803,0);
+ obj["spoiler2Rrt"].setColor(0.7333,0.3803,0);
+ if (val.spoilerR2 < 1.5) {
+ obj["spoiler2Rf"].show();
+ } else {
+ obj["spoiler2Rf"].hide();
+ }
+ } else {
+ obj["spoiler2Rex"].setColor(0.0509,0.7529,0.2941);
+ obj["spoiler2Rrt"].setColor(0.0509,0.7529,0.2941);
+ obj["spoiler2Rf"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashList(["spoilerR3Failure","spoilerR3","blue"], nil, func(val) {
+ if (val.spoilerR3Failure or val.blue < 1500) {
+ obj["spoiler3Rex"].setColor(0.7333,0.3803,0);
+ obj["spoiler3Rrt"].setColor(0.7333,0.3803,0);
+ if (val.spoilerR3 < 1.5) {
+ obj["spoiler3Rf"].show();
+ } else {
+ obj["spoiler3Rf"].hide();
+ }
+ } else {
+ obj["spoiler3Rex"].setColor(0.0509,0.7529,0.2941);
+ obj["spoiler3Rrt"].setColor(0.0509,0.7529,0.2941);
+ obj["spoiler3Rf"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashList(["spoilerR4Failure","spoilerR4","yellow"], nil, func(val) {
+ if (val.spoilerR4Failure or val.yellow < 1500) {
+ obj["spoiler4Rex"].setColor(0.7333,0.3803,0);
+ obj["spoiler4Rrt"].setColor(0.7333,0.3803,0);
+ if (val.spoilerR4 < 1.5) {
+ obj["spoiler4Rf"].show();
+ } else {
+ obj["spoiler4Rf"].hide();
+ }
+ } else {
+ obj["spoiler4Rex"].setColor(0.0509,0.7529,0.2941);
+ obj["spoiler4Rrt"].setColor(0.0509,0.7529,0.2941);
+ obj["spoiler4Rf"].hide();
+ }
+ }),
+ props.UpdateManager.FromHashList(["spoilerR5Failure","spoilerR5","green"], nil, func(val) {
+ if (val.spoilerR5Failure or val.green < 1500) {
+ obj["spoiler5Rex"].setColor(0.7333,0.3803,0);
+ obj["spoiler5Rrt"].setColor(0.7333,0.3803,0);
+ if (val.spoilerR5 < 1.5) {
+ obj["spoiler5Rf"].show();
+ } else {
+ obj["spoiler5Rf"].hide();
+ }
+ } else {
+ obj["spoiler5Rex"].setColor(0.0509,0.7529,0.2941);
+ obj["spoiler5Rrt"].setColor(0.0509,0.7529,0.2941);
+ obj["spoiler5Rf"].hide();
+ }
+ }),
+ ];
+
+ obj.displayedGForce = 0;
+ obj.updateItemsBottom = [
+ props.UpdateManager.FromHashValue("acconfigUnits", nil, func(val) {
+ obj.units = val;
+ if (val) {
+ obj["GW-weight-unit"].setText("KG");
+ } else {
+ obj["GW-weight-unit"].setText("LBS");
+ }
+ }),
+ props.UpdateManager.FromHashValue("hour", nil, func(val) {
+ obj["UTCh"].setText(sprintf("%02d", val));
+ }),
+ props.UpdateManager.FromHashValue("minute", nil, func(val) {
+ obj["UTCm"].setText(sprintf("%02d", val));
+ }),
+ props.UpdateManager.FromHashValue("gForce", 0.05, func(val) {
+ if (obj.displayedGForce) {
+ obj["GLoad"].setText("G.LOAD " ~ sprintf("%3.1f", val));
+ }
+ }),
+ props.UpdateManager.FromHashValue("gForceDisplay", nil, func(val) {
+ if ((val == 1 and !obj.displayedGForce) or (val != 0 and obj.displayedGForce)) {
+ obj.displayedGForce = 1;
+ obj["GLoad"].show();
+ } else {
+ obj.displayedGForce = 0;
+ obj["GLoad"].hide();
+ }
+ }),
+ ];
+ return obj;
+ },
+ getKeysBottom: func() {
+ return ["TAT","SAT","GW","UTCh","UTCm","GLoad","GW-weight-unit"];
+ },
+ getKeys: func() {
+ return["lgctltext","NORMbrk","NWStext","leftdoor","rightdoor","nosegeardoorL","nosegeardoorR",
+ "autobrk","autobrkind","NWS","NWSrect","normbrk-rect","altnbrk","normbrkhyd","spoiler1Rex","spoiler1Rrt","spoiler2Rex","spoiler2Rrt","spoiler3Rex",
+ "spoiler3Rrt","spoiler4Rex","spoiler4Rrt","spoiler5Rex","spoiler5Rrt","spoiler1Lex","spoiler1Lrt","spoiler2Lex","spoiler2Lrt",
+ "spoiler3Lex","spoiler3Lrt","spoiler4Lex","spoiler4Lrt","spoiler5Lex","spoiler5Lrt","spoiler1Rf","spoiler2Rf","spoiler3Rf","spoiler4Rf","spoiler5Rf",
+ "spoiler1Lf","spoiler2Lf","spoiler3Lf","spoiler4Lf","spoiler5Lf","ALTNbrk","altnbrkhyd","altnbrk-rect","antiskidtext","brakearrow","accupress_text",
+ "accuonlyarrow","accuonly","braketemp1","normbrkhyd","braketemp2","braketemp3","braketemp4","toparc1","toparc2","toparc3","toparc4","leftuplock",
+ "noseuplock","rightuplock","Triangle-Left1","Triangle-Left2","Triangle-Nose1","Triangle-Nose2","Triangle-Right1","Triangle-Right2","BSCUrect1",
+ "BSCUrect2","BSCU1","BSCU2","tirepress1","tirepress2","tirepress3","tirepress4","tirepress5","tirepress6","releaseL1","releaseL2","releaseR1","releaseR2",
+ "releaseL3","releaseL4","releaseR3","releaseR4"];
+ },
+ updateBottom: func(notification) {
+ foreach(var update_item_bottom; me.updateItemsBottom)
+ {
+ update_item_bottom.update(notification);
+ }
+
+ if (fmgc.FMGCInternal.fuelRequest and fmgc.FMGCInternal.blockConfirmed and !fmgc.FMGCInternal.fuelCalculating and notification.FWCPhase != 1) {
+ if (me.units) {
+ me["GW"].setText(sprintf("%s", math.round(fmgc.FMGCInternal.fuelPredGw * 1000 * LBS2KGS, 100)));
+ } else {
+ me["GW"].setText(sprintf("%s", math.round(fmgc.FMGCInternal.fuelPredGw * 1000, 100)));
+ }
+ me["GW"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ me["GW"].setText(sprintf("%s", "-----"));
+ me["GW"].setColor(0.0901,0.6039,0.7176);
+ }
+
+ if (dmc.DMController.DMCs[1].outputs[4] != nil) {
+ me["SAT"].setText(sprintf("%+2.0f", dmc.DMController.DMCs[1].outputs[4].getValue()));
+ me["SAT"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ me["SAT"].setText(sprintf("%s", "XX"));
+ me["SAT"].setColor(0.7333,0.3803,0);
+ }
+
+ if (dmc.DMController.DMCs[1].outputs[5] != nil) {
+ me["TAT"].setText(sprintf("%+2.0f", dmc.DMController.DMCs[1].outputs[5].getValue()));
+ me["TAT"].setColor(0.0509,0.7529,0.2941);
+ } else {
+ me["TAT"].setText(sprintf("%s", "XX"));
+ me["TAT"].setColor(0.7333,0.3803,0);
+ }
+ },
+ update: func(notification) {
+ me.updatePower();
+
+ if (me.test.getVisible() == 1) {
+ me.updateTest(notification);
+ }
+
+ if (me.group.getVisible() == 0) {
+ return;
+ }
+
+ foreach(var update_item; me.update_items)
+ {
+ update_item.update(notification);
+ }
+
+ me.updateBottom(notification);
+ },
+ updatePower: func() {
+ if (me.name == ecam.SystemDisplayController.displayedPage.name) {
+ if (du4_lgt.getValue() > 0.01 and systems.ELEC.Bus.ac2.getValue() >= 110) {
+ if (du4_test_time.getValue() + du4_test_amount.getValue() >= pts.Sim.Time.elapsedSec.getValue()) {
+ me.group.setVisible(0);
+ me.test.setVisible(1);
+ } else {
+ me.group.setVisible(1);
+ me.test.setVisible(0);
+ }
+ } else {
+ me.group.setVisible(0);
+ me.test.setVisible(0);
+ }
+ } else {
+ me.group.setVisible(0);
+ # don't hide the test group; just let whichever page is active control it
+ }
+ },
+};
+
+var input = {
+ brakeAutobrkMode: "/controls/autobrake/mode",
+ brakeLeft1: "/gear/gear[1]/L1brake-temp-degc",
+ brakeLeft2: "/gear/gear[1]/L2brake-temp-degc",
+ brakeRight1: "/gear/gear[2]/R3brake-temp-degc",
+ brakeRight2: "/gear/gear[2]/R4brake-temp-degc",
+ wheelLeftDoor: "/ECAM/Lower/door-left",
+ wheelNoseLeftDoor: "/ECAM/Lower/door-nose-left",
+ wheelNoseRightDoor: "/ECAM/Lower/door-nose-right",
+ wheelRightDoor: "/ECAM/Lower/door-right",
+ wheelLeftDoorPos: "/systems/hydraulic/gear/door-left",
+ wheelNoseDoorPos: "/systems/hydraulic/gear/door-nose",
+ wheelRightDoorPos: "/systems/hydraulic/gear/door-right",
+
+ spoilerL1: "/fdm/jsbsim/hydraulics/spoiler-l1/final-deg",
+ spoilerL2: "/fdm/jsbsim/hydraulics/spoiler-l2/final-deg",
+ spoilerL3: "/fdm/jsbsim/hydraulics/spoiler-l3/final-deg",
+ spoilerL4: "/fdm/jsbsim/hydraulics/spoiler-l4/final-deg",
+ spoilerL5: "/fdm/jsbsim/hydraulics/spoiler-l5/final-deg",
+ spoilerR1: "/fdm/jsbsim/hydraulics/spoiler-r1/final-deg",
+ spoilerR2: "/fdm/jsbsim/hydraulics/spoiler-r2/final-deg",
+ spoilerR3: "/fdm/jsbsim/hydraulics/spoiler-r3/final-deg",
+ spoilerR4: "/fdm/jsbsim/hydraulics/spoiler-r4/final-deg",
+ spoilerR5: "/fdm/jsbsim/hydraulics/spoiler-r5/final-deg",
+ spoilerL1Failure: "/systems/failures/spoilers/spoiler-l1",
+ spoilerL2Failure: "/systems/failures/spoilers/spoiler-l2",
+ spoilerL3Failure: "/systems/failures/spoilers/spoiler-l3",
+ spoilerL4Failure: "/systems/failures/spoilers/spoiler-l4",
+ spoilerL5Failure: "/systems/failures/spoilers/spoiler-l5",
+ spoilerR1Failure: "/systems/failures/spoilers/spoiler-r1",
+ spoilerR2Failure: "/systems/failures/spoilers/spoiler-r2",
+ spoilerR3Failure: "/systems/failures/spoilers/spoiler-r3",
+ spoilerR4Failure: "/systems/failures/spoilers/spoiler-r4",
+ spoilerR5Failure: "/systems/failures/spoilers/spoiler-r5",
+};
+
+foreach (var name; keys(input)) {
+ emesary.GlobalTransmitter.NotifyAll(notifications.FrameNotificationAddProperty.new("A320 System Display", name, input[name]));
+}
\ No newline at end of file
diff --git a/Models/Instruments/Lower-ECAM/Lower-ECAM.nas b/Models/Instruments/Lower-ECAM/Lower-ECAM.nas
index 1c50b4f0..02c0bc3f 100644
--- a/Models/Instruments/Lower-ECAM/Lower-ECAM.nas
+++ b/Models/Instruments/Lower-ECAM/Lower-ECAM.nas
@@ -1,3624 +1,77 @@
# A3XX Lower ECAM Canvas
+# Copyright (c) 2021 Josh Davidson (Octal450) and Jonathan Redpath
-# Copyright (c) 2021 Josh Davidson (Octal450)
-
-var lowerECAM_apu = nil;
-var lowerECAM_bleed = nil;
-var lowerECAM_cond = nil;
-var lowerECAM_crz = nil;
-var lowerECAM_door = nil;
-var lowerECAM_elec = nil;
-var lowerECAM_eng = nil;
-var lowerECAM_fctl = nil;
-var lowerECAM_fuel = nil;
-var lowerECAM_hyd = nil;
-var lowerECAM_press = nil;
-var lowerECAM_status = nil;
-var lowerECAM_wheel = nil;
-var lowerECAM_test = nil;
-var lowerECAM_display = nil;
-var page = "fctl";
-var blue_psi = 0;
-var green_psi = 0;
-var yellow_psi = 0;
-var autobrakemode = 0;
-var nosegear = 0;
-var leftgear = 0;
-var rightgear = 0;
-var leftdoor = 0;
-var rightdoor = 0;
-var nosedoor = 0;
-var gearlvr = 0;
-var elapsedtime = 0;
-var tr1_v = 0;
-var tr1_a = 0;
-var tr2_v = 0;
-var tr2_a = 0;
-var essTramps = 0;
-var essTrvolts = 0;
-var elac1Node = 0;
-var elac2Node = 0;
-var sec1Node = 0;
-var sec2Node = 0;
-var eng_valve_state = 0;
-var bleed_valve_cur = 0;
-var hp_valve_state = 0;
-var xbleedcmdstate = 0;
-var ramAirState = 0;
-
-# Conversion factor pounds to kilogram
-LBS2KGS = 0.4535924;
-
-# Fetch Nodes
-var acconfig_weight_kgs = props.globals.getNode("/systems/acconfig/options/weight-kgs", 1);
-var rate = props.globals.getNode("/systems/acconfig/options/lecam-rate", 1);
-var autoconfig_running = props.globals.getNode("/systems/acconfig/autoconfig-running", 1);
-var lighting_du4 = props.globals.getNode("/controls/lighting/DU/du4", 1);
-var ecam_page = props.globals.getNode("/ECAM/Lower/page", 1);
-var hour = props.globals.getNode("/sim/time/utc/hour", 1);
-var minute = props.globals.getNode("/sim/time/utc/minute", 1);
-var apu_flap = props.globals.getNode("/controls/apu/inlet-flap/position-norm", 1);
-var apu_rpm = props.globals.getNode("/engines/engine[2]/n1", 1);
-var apu_egt = props.globals.getNode("/systems/apu/egt-degC", 1);
-var door_left = props.globals.getNode("/ECAM/Lower/door-left", 1);
-var door_right = props.globals.getNode("/ECAM/Lower/door-right", 1);
-var door_nose_left = props.globals.getNode("/ECAM/Lower/door-nose-left", 1);
-var door_nose_right = props.globals.getNode("/ECAM/Lower/door-nose-right", 1);
-var apu_rpm_rot = props.globals.getNode("/ECAM/Lower/APU-N", 1);
-var apu_egt_rot = props.globals.getNode("/ECAM/Lower/APU-EGT", 1);
-var oil_qt1 = props.globals.getNode("/ECAM/Lower/Oil-QT[0]", 1);
-var oil_qt2 = props.globals.getNode("/ECAM/Lower/Oil-QT[1]", 1);
-var oil_psi1 = props.globals.getNode("/ECAM/Lower/Oil-PSI[0]", 1);
-var oil_psi2 = props.globals.getNode("/ECAM/Lower/Oil-PSI[1]", 1);
-var bleedapu = props.globals.getNode("/systems/pneumatics/source/apu-psi", 1);
-var aileron_ind_left = props.globals.getNode("/ECAM/Lower/aileron-ind-left", 1);
-var aileron_ind_right = props.globals.getNode("/ECAM/Lower/aileron-ind-right", 1);
-var elevator_ind_left = props.globals.getNode("/ECAM/Lower/elevator-ind-left", 1);
-var elevator_ind_right = props.globals.getNode("/ECAM/Lower/elevator-ind-right", 1);
-var elevator_trim_deg = props.globals.getNode("/ECAM/Lower/elevator-trim-deg", 1);
-var final_deg = props.globals.getNode("/fdm/jsbsim/hydraulics/rudder/final-deg", 1);
-var temperature_degc = props.globals.getNode("/environment/temperature-degc", 1);
-var tank3_content_lbs = props.globals.getNode("/fdm/jsbsim/propulsion/tank[2]/contents-lbs", 1);
-var ir2_knob = props.globals.getNode("/controls/adirs/ir[1]/knob", 1);
-var apuBleedNotOn = props.globals.getNode("/systems/pneumatics/warnings/apu-bleed-not-on", 1);
-var apu_valve = props.globals.getNode("/systems/pneumatics/valves/apu-bleed-valve-cmd", 1);
-var apu_valve_state = props.globals.getNode("/systems/pneumatics/valves/apu-bleed-valve", 1);
-var xbleedcmd = props.globals.getNode("/systems/pneumatics/valves/crossbleed-valve-cmd", 1);
-var xbleed = props.globals.getNode("/systems/pneumatics/valves/crossbleed-valve", 1);
-var xbleedstate = nil;
-var hp_valve1_state = props.globals.getNode("/systems/pneumatics/valves/engine-1-hp-valve", 1);
-var hp_valve2_state = props.globals.getNode("/systems/pneumatics/valves/engine-2-hp-valve", 1);
-var hp_valve1 = props.globals.getNode("/systems/pneumatics/valves/engine-1-hp-valve-cmd", 1);
-var hp_valve2 = props.globals.getNode("/systems/pneumatics/valves/engine-2-hp-valve-cmd", 1);
-var eng_valve1 = props.globals.getNode("/systems/pneumatics/valves/engine-1-prv-valve", 1);
-var eng_valve2 = props.globals.getNode("/systems/pneumatics/valves/engine-2-prv-valve", 1);
-var precooler1_psi = props.globals.getNode("/systems/pneumatics/psi/engine-1-psi", 1);
-var precooler2_psi = props.globals.getNode("/systems/pneumatics/psi/engine-2-psi", 1);
-var precooler1_temp = props.globals.getNode("/systems/pneumatics/precooler/temp-1", 1);
-var precooler2_temp = props.globals.getNode("/systems/pneumatics/precooler/temp-2", 1);
-var precooler1_ovht = props.globals.getNode("/systems/pneumatics/precooler/ovht-1", 1);
-var precooler2_ovht = props.globals.getNode("/systems/pneumatics/precooler/ovht-2", 1);
-var bmc1working = props.globals.getNode("/systems/pneumatics/indicating/bmc1-working", 1);
-var bmc2working = props.globals.getNode("/systems/pneumatics/indicating/bmc2-working", 1);
-var bmc1 = 0;
-var bmc2 = 0;
-var gs_kt = props.globals.getNode("/velocities/groundspeed-kt", 1);
-var switch_wing_aice = props.globals.getNode("/controls/ice-protection/wing", 1);
-var pack1_bypass = props.globals.getNode("/systems/pneumatics/pack-1-bypass", 1);
-var pack2_bypass = props.globals.getNode("/systems/pneumatics/pack-2-bypass", 1);
-var oil_qt1_actual = props.globals.getNode("/engines/engine[0]/oil-qt-actual", 1);
-var oil_qt2_actual = props.globals.getNode("/engines/engine[1]/oil-qt-actual", 1);
-var fuel_used_lbs1 = props.globals.getNode("/systems/fuel/fuel-used-1", 1);
-var fuel_used_lbs2 = props.globals.getNode("/systems/fuel/fuel-used-2", 1);
-var doorL1_pos = props.globals.getNode("/sim/model/door-positions/doorl1/position-norm", 1);
-var doorR1_pos = props.globals.getNode("/sim/model/door-positions/doorr1/position-norm", 1);
-var doorL4_pos = props.globals.getNode("/sim/model/door-positions/doorl4/position-norm", 1);
-var doorR4_pos = props.globals.getNode("/sim/model/door-positions/doorr4/position-norm", 1);
-var cargobulk_pos = props.globals.getNode("/sim/model/door-positions/cargobulk/position-norm", 1);
-var cargofwd_pos = props.globals.getNode("/sim/model/door-positions/cargofwd/position-norm", 1);
-var cargoaft_pos = props.globals.getNode("/sim/model/door-positions/cargoaft/position-norm", 1);
-var gLoad = props.globals.getNode("/ECAM/Lower/g-force-display", 1);
-
-# Hydraulic
-var blue_psi = 0;
-var green_psi = 0;
-var yellow_psi = 0;
-var y_resv_lo_air_press = props.globals.getNode("/systems/hydraulic/yellow-resv-lo-air-press", 1);
-var b_resv_lo_air_press = props.globals.getNode("/systems/hydraulic/blue-resv-lo-air-press", 1);
-var g_resv_lo_air_press = props.globals.getNode("/systems/hydraulic/green-resv-lo-air-press", 1);
-var elec_pump_y_ovht = props.globals.getNode("/systems/hydraulic/elec-pump-yellow-ovht", 1);
-var elec_pump_b_ovht = props.globals.getNode("/systems/hydraulic/elec-pump-blue-ovht", 1);
-var rat_deployed = props.globals.getNode("/controls/hydraulic/rat-deployed", 1);
-var y_resv_ovht = props.globals.getNode("/systems/hydraulic/yellow-resv-ovht", 1);
-var b_resv_ovht = props.globals.getNode("/systems/hydraulic/blue-resv-ovht", 1);
-var g_resv_ovht = props.globals.getNode("/systems/hydraulic/green-resv-ovht", 1);
-var askidsw = 0;
-var brakemode = 0;
-var accum = 0;
-var L1BrakeTempc = props.globals.getNode("/gear/gear[1]/L1brake-temp-degc", 1);
-var L2BrakeTempc = props.globals.getNode("/gear/gear[1]/L2brake-temp-degc", 1);
-var R3BrakeTempc = props.globals.getNode("/gear/gear[2]/R3brake-temp-degc", 1);
-var R4BrakeTempc = props.globals.getNode("/gear/gear[2]/R4brake-temp-degc", 1);
-
-var eng1_running = props.globals.getNode("/engines/engine[0]/running", 1);
-var eng2_running = props.globals.getNode("/engines/engine[1]/running", 1);
-var switch_cart = props.globals.getNode("/controls/electrical/ground-cart", 1);
-var spoiler_L1 = props.globals.getNode("/fdm/jsbsim/hydraulics/spoiler-l1/final-deg", 1);
-var spoiler_L2 = props.globals.getNode("/fdm/jsbsim/hydraulics/spoiler-l2/final-deg", 1);
-var spoiler_L3 = props.globals.getNode("/fdm/jsbsim/hydraulics/spoiler-l3/final-deg", 1);
-var spoiler_L4 = props.globals.getNode("/fdm/jsbsim/hydraulics/spoiler-l4/final-deg", 1);
-var spoiler_L5 = props.globals.getNode("/fdm/jsbsim/hydraulics/spoiler-l5/final-deg", 1);
-var spoiler_R1 = props.globals.getNode("/fdm/jsbsim/hydraulics/spoiler-r1/final-deg", 1);
-var spoiler_R2 = props.globals.getNode("/fdm/jsbsim/hydraulics/spoiler-r2/final-deg", 1);
-var spoiler_R3 = props.globals.getNode("/fdm/jsbsim/hydraulics/spoiler-r3/final-deg", 1);
-var spoiler_R4 = props.globals.getNode("/fdm/jsbsim/hydraulics/spoiler-r4/final-deg", 1);
-var spoiler_R5 = props.globals.getNode("/fdm/jsbsim/hydraulics/spoiler-r5/final-deg", 1);
-var total_fuel_lbs = props.globals.getNode("/consumables/fuel/total-fuel-lbs", 1);
-var fuel_flow1 = props.globals.getNode("/engines/engine[0]/ff-actual", 1);
-var fuel_flow2 = props.globals.getNode("/engines/engine[1]/ff-actual", 1);
-var fuel_left_outer_temp = props.globals.getNode("/consumables/fuel/tank[0]/temperature_degC", 1);
-var fuel_left_inner_temp = props.globals.getNode("/consumables/fuel/tank[1]/temperature_degC", 1);
-var fuel_right_outer_temp = props.globals.getNode("/consumables/fuel/tank[4]/temperature_degC", 1);
-var fuel_right_inner_temp = props.globals.getNode("/consumables/fuel/tank[3]/temperature_degC", 1);
-var cutoff_switch1 = props.globals.getNode("/controls/engines/engine[0]/cutoff-switch", 1);
-var cutoff_switch2 = props.globals.getNode("/controls/engines/engine[1]/cutoff-switch", 1);
-var autobreak_mode = props.globals.getNode("/controls/autobrake/mode", 1);
-var gear1_pos = props.globals.getNode("/gear/gear[0]/position-norm", 1);
-var gear2_pos = props.globals.getNode("/gear/gear[1]/position-norm", 1);
-var gear3_pos = props.globals.getNode("/gear/gear[2]/position-norm", 1);
-var gear_door_L = props.globals.getNode("/systems/hydraulic/gear/door-left", 1);
-var gear_door_R = props.globals.getNode("/systems/hydraulic/gear/door-right", 1);
-var gear_door_N = props.globals.getNode("/systems/hydraulic/gear/door-nose", 1);
-var gear_down = props.globals.getNode("/controls/gear/gear-down", 1);
-var press_vs_norm = props.globals.getNode("/systems/pressurization/vs-norm", 1);
-var cabinalt = props.globals.getNode("/systems/pressurization/cabinalt-norm", 1);
-var gear0_wow = props.globals.getNode("/gear/gear[0]/wow", 1);
-
-# Create Nodes:
-var apu_load = props.globals.initNode("/systems/electrical/extra/apu-load", 0, "DOUBLE");
-var gen1_load = props.globals.initNode("/systems/electrical/extra/gen1-load", 0, "DOUBLE");
-var gen2_load = props.globals.initNode("/systems/electrical/extra/gen2-load", 0, "DOUBLE");
-var du4_test = props.globals.initNode("/instrumentation/du/du4-test", 0, "BOOL");
-var du4_test_time = props.globals.initNode("/instrumentation/du/du4-test-time", 0, "DOUBLE");
-var du4_test_amount = props.globals.initNode("/instrumentation/du/du4-test-amount", 0, "DOUBLE");
-var du4_offtime = props.globals.initNode("/instrumentation/du/du4-off-time", 0.0, "DOUBLE");
-
-var canvas_lowerECAM_base = {
- init: func(canvas_group, file) {
- var font_mapper = func(family, weight) {
- return "LiberationFonts/LiberationSans-Regular.ttf";
+var SystemDisplayPageRecipient =
+{
+ new: func(_ident)
+ {
+ var SDRecipient = emesary.Recipient.new(_ident);
+ SDRecipient.MainScreen = canvas_lowerECAM_base;
+ SDRecipient.Page = nil;
+ SDRecipient.Receive = func(notification)
+ {
+ if (notification.NotificationType == "FrameNotification")
+ {
+ if (SDRecipient.Page == nil) {
+ SDRecipient.Page = SystemDisplayPageRecipient.pageList.door;
+ }
+ if (math.mod(notifications.frameNotification.FrameCount,2) == 0) {
+ SystemDisplayPageRecipient.pageList.apu.update(notification);
+ SystemDisplayPageRecipient.pageList.bleed.update(notification);
+ SystemDisplayPageRecipient.pageList.cond.update(notification);
+ SystemDisplayPageRecipient.pageList.cruise.update(notification);
+ SystemDisplayPageRecipient.pageList.door.update(notification);
+ SystemDisplayPageRecipient.pageList.elec.update(notification);
+ SystemDisplayPageRecipient.pageList.eng.update(notification);
+ SystemDisplayPageRecipient.pageList.fctl.update(notification);
+ SystemDisplayPageRecipient.pageList.fuel.update(notification);
+ SystemDisplayPageRecipient.pageList.hyd.update(notification);
+ SystemDisplayPageRecipient.pageList.press.update(notification);
+ SystemDisplayPageRecipient.pageList.sts.update(notification);
+ SystemDisplayPageRecipient.pageList.wheel.update(notification);
+ }
+ return emesary.Transmitter.ReceiptStatus_OK;
+ }
+ return emesary.Transmitter.ReceiptStatus_NotProcessed;
};
-
- canvas.parsesvg(canvas_group, file, {"font-mapper": font_mapper});
-
- var svg_keys = me.getKeys();
- foreach(var key; svg_keys) {
- me[key] = canvas_group.getElementById(key);
- }
-
- me.page = canvas_group;
-
- return me;
+ return SDRecipient;
},
- getKeys: func() {
- return [];
- },
- updateDu4: func() {
- var elapsedtime = pts.Sim.Time.elapsedSec.getValue();
-
- if (systems.ELEC.Bus.ac2.getValue() >= 110) {
- if (du4_offtime.getValue() + 3 < elapsedtime) {
- if (gear0_wow.getValue()) {
- if (autoconfig_running.getValue() != 1 and du4_test.getValue() != 1) {
- du4_test.setValue(1);
- du4_test_amount.setValue(math.round((rand() * 5 ) + 35, 0.1));
- du4_test_time.setValue(elapsedtime);
- } else if (autoconfig_running.getValue() and du4_test.getValue() != 1) {
- du4_test.setValue(1);
- du4_test_amount.setValue(math.round((rand() * 5 ) + 35, 0.1));
- du4_test_time.setValue(elapsedtime - 30);
- }
- } else {
- du4_test.setValue(1);
- du4_test_amount.setValue(0);
- du4_test_time.setValue(-100);
- }
- }
- } else {
- du4_test.setValue(0);
- du4_offtime.setValue(elapsedtime);
- }
- },
- update: func() {
- var elapsedtime = pts.Sim.Time.elapsedSec.getValue();
-
- if (systems.ELEC.Bus.ac2.getValue() >= 110 and lighting_du4.getValue() > 0.01) {
- pts.Instrumentation.Du.du4On.setBoolValue(1);
- if (du4_test_time.getValue() + du4_test_amount.getValue() >= elapsedtime) {
- lowerECAM_apu.page.hide();
- lowerECAM_bleed.page.hide();
- lowerECAM_cond.page.hide();
- lowerECAM_crz.page.hide();
- lowerECAM_door.page.hide();
- lowerECAM_elec.page.hide();
- lowerECAM_eng.page.hide();
- lowerECAM_fctl.page.hide();
- lowerECAM_fuel.page.hide();
- lowerECAM_press.page.hide();
- lowerECAM_status.page.hide();
- lowerECAM_wheel.page.hide();
- lowerECAM_test.page.show();
- lowerECAM_test.update();
- } else {
- lowerECAM_test.page.hide();
- page = ecam_page.getValue();
- if (page == "apu") {
- lowerECAM_apu.page.show();
- lowerECAM_bleed.page.hide();
- lowerECAM_cond.page.hide();
- lowerECAM_crz.page.hide();
- lowerECAM_door.page.hide();
- lowerECAM_elec.page.hide();
- lowerECAM_eng.page.hide();
- lowerECAM_fctl.page.hide();
- lowerECAM_fuel.page.hide();
- lowerECAM_press.page.hide();
- lowerECAM_status.page.hide();
- lowerECAM_hyd.page.hide();
- lowerECAM_wheel.page.hide();
- lowerECAM_apu.update();
- } else if (page == "bleed") {
- lowerECAM_apu.page.hide();
- lowerECAM_bleed.page.show();
- lowerECAM_cond.page.hide();
- lowerECAM_crz.page.hide();
- lowerECAM_door.page.hide();
- lowerECAM_elec.page.hide();
- lowerECAM_eng.page.hide();
- lowerECAM_fctl.page.hide();
- lowerECAM_fuel.page.hide();
- lowerECAM_press.page.hide();
- lowerECAM_status.page.hide();
- lowerECAM_hyd.page.hide();
- lowerECAM_wheel.page.hide();
- lowerECAM_bleed.update();
- } else if (page == "cond") {
- lowerECAM_apu.page.hide();
- lowerECAM_bleed.page.hide();
- lowerECAM_cond.page.show();
- lowerECAM_crz.page.hide();
- lowerECAM_door.page.hide();
- lowerECAM_elec.page.hide();
- lowerECAM_eng.page.hide();
- lowerECAM_fctl.page.hide();
- lowerECAM_fuel.page.hide();
- lowerECAM_press.page.hide();
- lowerECAM_status.page.hide();
- lowerECAM_hyd.page.hide();
- lowerECAM_wheel.page.hide();
- lowerECAM_cond.update();
- } else if (page == "cruise") {
- lowerECAM_apu.page.hide();
- lowerECAM_bleed.page.hide();
- lowerECAM_cond.page.hide();
- lowerECAM_crz.page.show();
- lowerECAM_door.page.hide();
- lowerECAM_elec.page.hide();
- lowerECAM_eng.page.hide();
- lowerECAM_fctl.page.hide();
- lowerECAM_fuel.page.hide();
- lowerECAM_press.page.hide();
- lowerECAM_status.page.hide();
- lowerECAM_hyd.page.hide();
- lowerECAM_wheel.page.hide();
- lowerECAM_crz.update();
- } else if (page == "door") {
- lowerECAM_apu.page.hide();
- lowerECAM_bleed.page.hide();
- lowerECAM_cond.page.hide();
- lowerECAM_crz.page.hide();
- lowerECAM_door.page.show();
- lowerECAM_elec.page.hide();
- lowerECAM_eng.page.hide();
- lowerECAM_fctl.page.hide();
- lowerECAM_fuel.page.hide();
- lowerECAM_press.page.hide();
- lowerECAM_status.page.hide();
- lowerECAM_hyd.page.hide();
- lowerECAM_wheel.page.hide();
- lowerECAM_door.update();
- } else if (page == "elec") {
- lowerECAM_apu.page.hide();
- lowerECAM_bleed.page.hide();
- lowerECAM_cond.page.hide();
- lowerECAM_crz.page.hide();
- lowerECAM_door.page.hide();
- lowerECAM_elec.page.show();
- lowerECAM_eng.page.hide();
- lowerECAM_fctl.page.hide();
- lowerECAM_fuel.page.hide();
- lowerECAM_press.page.hide();
- lowerECAM_status.page.hide();
- lowerECAM_hyd.page.hide();
- lowerECAM_wheel.page.hide();
- lowerECAM_elec.update();
- } else if (page == "eng") {
- lowerECAM_apu.page.hide();
- lowerECAM_bleed.page.hide();
- lowerECAM_cond.page.hide();
- lowerECAM_crz.page.hide();
- lowerECAM_door.page.hide();
- lowerECAM_elec.page.hide();
- lowerECAM_eng.page.show();
- lowerECAM_fctl.page.hide();
- lowerECAM_fuel.page.hide();
- lowerECAM_press.page.hide();
- lowerECAM_status.page.hide();
- lowerECAM_hyd.page.hide();
- lowerECAM_wheel.page.hide();
- lowerECAM_eng.update();
- } else if (page == "fctl") {
- lowerECAM_apu.page.hide();
- lowerECAM_bleed.page.hide();
- lowerECAM_cond.page.hide();
- lowerECAM_crz.page.hide();
- lowerECAM_door.page.hide();
- lowerECAM_elec.page.hide();
- lowerECAM_eng.page.hide();
- lowerECAM_fctl.page.show();
- lowerECAM_fuel.page.hide();
- lowerECAM_press.page.hide();
- lowerECAM_status.page.hide();
- lowerECAM_hyd.page.hide();
- lowerECAM_wheel.page.hide();
- lowerECAM_fctl.update();
- } else if (page == "fuel") {
- lowerECAM_apu.page.hide();
- lowerECAM_bleed.page.hide();
- lowerECAM_cond.page.hide();
- lowerECAM_crz.page.hide();
- lowerECAM_door.page.hide();
- lowerECAM_elec.page.hide();
- lowerECAM_eng.page.hide();
- lowerECAM_fctl.page.hide();
- lowerECAM_fuel.page.show();
- lowerECAM_press.page.hide();
- lowerECAM_status.page.hide();
- lowerECAM_hyd.page.hide();
- lowerECAM_wheel.page.hide();
- lowerECAM_fuel.update();
- } else if (page == "press") {
- lowerECAM_apu.page.hide();
- lowerECAM_bleed.page.hide();
- lowerECAM_cond.page.hide();
- lowerECAM_crz.page.hide();
- lowerECAM_door.page.hide();
- lowerECAM_elec.page.hide();
- lowerECAM_eng.page.hide();
- lowerECAM_fctl.page.hide();
- lowerECAM_fuel.page.hide();
- lowerECAM_press.page.show();
- lowerECAM_status.page.hide();
- lowerECAM_hyd.page.hide();
- lowerECAM_wheel.page.hide();
- lowerECAM_press.update();
- } else if (page == "sts") {
- lowerECAM_apu.page.hide();
- lowerECAM_bleed.page.hide();
- lowerECAM_cond.page.hide();
- lowerECAM_crz.page.hide();
- lowerECAM_door.page.hide();
- lowerECAM_elec.page.hide();
- lowerECAM_eng.page.hide();
- lowerECAM_fctl.page.hide();
- lowerECAM_fuel.page.hide();
- lowerECAM_press.page.hide();
- lowerECAM_status.page.show();
- lowerECAM_hyd.page.hide();
- lowerECAM_wheel.page.hide();
- lowerECAM_status.update();
- } else if (page == "hyd") {
- lowerECAM_apu.page.hide();
- lowerECAM_bleed.page.hide();
- lowerECAM_cond.page.hide();
- lowerECAM_crz.page.hide();
- lowerECAM_door.page.hide();
- lowerECAM_elec.page.hide();
- lowerECAM_eng.page.hide();
- lowerECAM_fctl.page.hide();
- lowerECAM_fuel.page.hide();
- lowerECAM_press.page.hide();
- lowerECAM_status.page.hide();
- lowerECAM_hyd.page.show();
- lowerECAM_wheel.page.hide();
- lowerECAM_hyd.update();
- } else if (page == "wheel") {
- lowerECAM_apu.page.hide();
- lowerECAM_bleed.page.hide();
- lowerECAM_cond.page.hide();
- lowerECAM_crz.page.hide();
- lowerECAM_door.page.hide();
- lowerECAM_elec.page.hide();
- lowerECAM_eng.page.hide();
- lowerECAM_fctl.page.hide();
- lowerECAM_fuel.page.hide();
- lowerECAM_press.page.hide();
- lowerECAM_status.page.hide();
- lowerECAM_hyd.page.hide();
- lowerECAM_wheel.page.show();
- lowerECAM_wheel.update();
- } else {
- lowerECAM_apu.page.hide();
- lowerECAM_bleed.page.hide();
- lowerECAM_cond.page.hide();
- lowerECAM_crz.page.hide();
- lowerECAM_door.page.hide();
- lowerECAM_elec.page.hide();
- lowerECAM_eng.page.hide();
- lowerECAM_fctl.page.hide();
- lowerECAM_fuel.page.hide();
- lowerECAM_press.page.hide();
- lowerECAM_status.page.hide();
- lowerECAM_hyd.page.hide();
- lowerECAM_wheel.page.hide();
- }
- }
- } else {
- lowerECAM_test.page.hide();
- lowerECAM_apu.page.hide();
- lowerECAM_bleed.page.hide();
- lowerECAM_cond.page.hide();
- lowerECAM_crz.page.hide();
- lowerECAM_door.page.hide();
- lowerECAM_elec.page.hide();
- lowerECAM_eng.page.hide();
- lowerECAM_fctl.page.hide();
- lowerECAM_fuel.page.hide();
- lowerECAM_press.page.hide();
- lowerECAM_status.page.hide();
- lowerECAM_hyd.page.hide();
- lowerECAM_wheel.page.hide();
- pts.Instrumentation.Du.du4On.setBoolValue(0);
- }
- },
- displayedGForce: 0,
- updateBottomStatus: func() {
- if (dmc.DMController.DMCs[1].outputs[4] != nil) {
- me["SAT"].setText(sprintf("%2.0f", dmc.DMController.DMCs[1].outputs[4].getValue()));
- me["SAT"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["SAT"].setText(sprintf("%s", "XX"));
- me["SAT"].setColor(0.7333,0.3803,0);
- }
-
- if (dmc.DMController.DMCs[1].outputs[5] != nil) {
- me["TAT"].setText(sprintf("%2.0f", dmc.DMController.DMCs[1].outputs[5].getValue()));
- me["TAT"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["TAT"].setText(sprintf("%s", "XX"));
- me["TAT"].setColor(0.7333,0.3803,0);
- }
-
- me.gloadStore = gLoad.getValue();
- if ((me.gloadStore == 1 and !me.displayedGForce) or (me.gloadStore != 0 and me.displayedGForce)) {
- me.displayedGForce = 1;
- me["GLoad"].setText("G.LOAD " ~ sprintf("%3.1f", pts.Accelerations.pilotGDamped.getValue()));
- me["GLoad"].show();
- } else {
- me.displayedGForce = 0;
- me["GLoad"].hide();
- }
-
- me["UTCh"].setText(sprintf("%02d", hour.getValue()));
- me["UTCm"].setText(sprintf("%02d", minute.getValue()));
-
- if (fmgc.FMGCInternal.fuelRequest and fmgc.FMGCInternal.blockConfirmed and !fmgc.FMGCInternal.fuelCalculating and ecam.phaseNode.getValue() != 1) {
- if (acconfig_weight_kgs.getValue()) {
- me["GW"].setText(sprintf("%s", math.round(fmgc.FMGCInternal.fuelPredGw * 1000 * LBS2KGS, 100)));
- } else {
- me["GW"].setText(sprintf("%s", math.round(fmgc.FMGCInternal.fuelPredGw * 1000, 100)));
- }
- me["GW"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["GW"].setText(sprintf("%s", "-----"));
- me["GW"].setColor(0.0901,0.6039,0.7176);
- }
-
- if (acconfig_weight_kgs.getValue()) {
- me["GW-weight-unit"].setText("KG");
- } else {
- me["GW-weight-unit"].setText("LBS");
- }
+ pageList: {
+ apu: canvas_lowerECAMPageApu.new("Aircraft/A320-family/Models/Instruments/Lower-ECAM/res/apu.svg","apu"),
+ bleed: canvas_lowerECAMPageBleed.new("Aircraft/A320-family/Models/Instruments/Lower-ECAM/res/bleed.svg","bleed"),
+ cond: canvas_lowerECAMPageCond.new("Aircraft/A320-family/Models/Instruments/Lower-ECAM/res/cond.svg","cond"),
+ cruise: canvas_lowerECAMPageCruise.new("Aircraft/A320-family/Models/Instruments/Lower-ECAM/res/crz.svg","cruise"),
+ door: canvas_lowerECAMPageDoor.new("Aircraft/A320-family/Models/Instruments/Lower-ECAM/res/door.svg","door"),
+ elec: canvas_lowerECAMPageElec.new("Aircraft/A320-family/Models/Instruments/Lower-ECAM/res/elec.svg","elec"),
+ eng: canvas_lowerECAMPageEng.new("Aircraft/A320-family/Models/Instruments/Lower-ECAM/res/eng.svg","eng"),
+ fctl: canvas_lowerECAMPageFctl.new("Aircraft/A320-family/Models/Instruments/Lower-ECAM/res/fctl.svg","fctl"),
+ fuel: canvas_lowerECAMPageFuel.new("Aircraft/A320-family/Models/Instruments/Lower-ECAM/res/fuel.svg","fuel"),
+ hyd: canvas_lowerECAMPageHyd.new("Aircraft/A320-family/Models/Instruments/Lower-ECAM/res/hyd.svg","hyd"),
+ press: canvas_lowerECAMPagePress.new("Aircraft/A320-family/Models/Instruments/Lower-ECAM/res/press.svg","press"),
+ sts: canvas_lowerECAMPageSts.new("Aircraft/A320-family/Models/Instruments/Lower-ECAM/res/status.svg","sts"),
+ wheel: canvas_lowerECAMPageWheel.new("Aircraft/A320-family/Models/Instruments/Lower-ECAM/res/wheel.svg","wheel")
},
};
-var canvas_lowerECAM_apu = {
- new: func(canvas_group, file) {
- var m = {parents: [canvas_lowerECAM_apu, canvas_lowerECAM_base]};
- m.init(canvas_group, file);
+var A320SD = SystemDisplayPageRecipient.new("A320 SD");
+emesary.GlobalTransmitter.Register(A320SD);
- return m;
- },
- getKeys: func() {
- return ["TAT","SAT","GW","UTCh","UTCm","GLoad","GW-weight-unit","APUN-needle","APUEGT-needle","APUN","APUEGT","APUAvail","APUFlapOpen","APUBleedValve","APUBleedOnline","APUGenOnline","APUGentext","APUGenLoad","APUGenbox","APUGenVolt","APUGenHz","APUBleedPSI","APUfuelLO","APU-low-oil",
- "text3724","text3728","text3732"];
- },
- update: func() {
- # Avail and Flap Open
- if (apu_flap.getValue()) {
- me["APUFlapOpen"].show();
- } else {
- me["APUFlapOpen"].hide();
- }
-
- if (apu_rpm.getValue() > 94.9) {
- me["APUAvail"].show();
- } else {
- me["APUAvail"].hide();
- }
-
- if (!systems.FUEL.Pumps.apu.getBoolValue() and systems.FUEL.Pumps.allOff.getBoolValue()) {
- me["APUfuelLO"].show();
- } else {
- me["APUfuelLO"].hide();
- }
-
- # APU Gen
- if (systems.ELEC.Source.APU.volts.getValue() >= 110) {
- me["APUGenVolt"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["APUGenVolt"].setColor(0.7333,0.3803,0);
- }
-
- if (systems.ELEC.Source.APU.hertz.getValue() > 380) {
- me["APUGenHz"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["APUGenHz"].setColor(0.7333,0.3803,0);
- }
-
- if (systems.APUNodes.Controls.master.getValue() or apu_rpm.getValue() >= 94.9) {
- me["APUGenbox"].show();
- me["APUGenHz"].show();
- me["APUGenVolt"].show();
- me["APUGenLoad"].show();
- me["text3724"].show();
- me["text3728"].show();
- me["text3732"].show();
- } else {
- me["APUGenbox"].hide();
- me["APUGenHz"].hide();
- me["APUGenVolt"].hide();
- me["APUGenLoad"].hide();
- me["text3724"].hide();
- me["text3728"].hide();
- me["text3732"].hide();
- }
-
- if ((apu_rpm.getValue() > 94.9) and (systems.ELEC.Source.APU.contact.getValue())) {
- me["APUGenOnline"].show();
- } else {
- me["APUGenOnline"].hide();
- }
-
- if ((systems.APUNodes.Controls.master.getValue() == 0) or ((systems.APUNodes.Controls.master.getValue()) and (systems.ELEC.Source.APU.contact.getValue()) and (apu_rpm.getValue() > 94.9))) {
- me["APUGentext"].setColor(0.8078,0.8039,0.8078);
- } else if ((systems.APUNodes.Controls.master.getValue()) and (systems.ELEC.Source.APU.contact.getValue() == 0) and (apu_rpm.getValue() < 94.9)) {
- me["APUGentext"].setColor(0.7333,0.3803,0);
- }
-
- me["APUGenLoad"].setText(sprintf("%s", math.round(apu_load.getValue())));
- me["APUGenVolt"].setText(sprintf("%s", math.round(systems.ELEC.Source.APU.volts.getValue())));
- me["APUGenHz"].setText(sprintf("%s", math.round(systems.ELEC.Source.APU.hertz.getValue())));
-
- # APU Bleed
- if (systems.ADIRS.Operating.adr[0].getValue() and (systems.APUNodes.Controls.bleed.getValue() or bleedapu.getValue() > 0)) {
- me["APUBleedPSI"].setColor(0.0509,0.7529,0.2941);
- me["APUBleedPSI"].setText(sprintf("%s", math.round(bleedapu.getValue())));
- } else {
- me["APUBleedPSI"].setColor(0.7333,0.3803,0);
- me["APUBleedPSI"].setText(sprintf("%s", "XX"));
- }
-
- var apu_valve_state2 = apu_valve_state.getValue();
- if (apu_valve_state2 == 1) {
- me["APUBleedValve"].setRotation(90 * D2R);
- } else {
- me["APUBleedValve"].setRotation(0);
- }
-
- if (apu_valve_state2 == apu_valve_state.getValue()) {
- me["APUBleedValve"].setColor(0.0509,0.7529,0.2941);
- me["APUBleedOnline"].show();
- } else {
- me["APUBleedValve"].setColor(0.7333,0.3803,0);
- me["APUBleedOnline"].hide();
- }
-
-
- # APU N and EGT
- if (systems.APUNodes.Controls.master.getValue()) {
- me["APUN"].setColor(0.0509,0.7529,0.2941);
- me["APUN"].setText(sprintf("%s", math.round(apu_rpm.getValue() or 0)));
- me["APUEGT"].setColor(0.0509,0.7529,0.2941);
- me["APUEGT"].setText(sprintf("%s", math.round(apu_egt.getValue() or 0, 5)));
- } else if (apu_rpm.getValue() >= 1) {
- me["APUN"].setColor(0.0509,0.7529,0.2941);
- me["APUN"].setText(sprintf("%s", math.round(apu_rpm.getValue() or 0)));
- me["APUEGT"].setColor(0.0509,0.7529,0.2941);
- me["APUEGT"].setText(sprintf("%s", math.round(apu_egt.getValue() or 0, 5)));
- } else {
- me["APUN"].setColor(0.7333,0.3803,0);
- me["APUN"].setText(sprintf("%s", "XX"));
- me["APUEGT"].setColor(0.7333,0.3803,0);
- me["APUEGT"].setText(sprintf("%s", "XX"));
- }
- me["APUN-needle"].setRotation((apu_rpm_rot.getValue() + 90) * D2R);
- me["APUEGT-needle"].setRotation((apu_egt_rot.getValue() + 90) * D2R);
-
- if (systems.APUNodes.Oil.level.getValue() < 3.69 and apu_rpm.getValue() < 94.9 and gear0_wow.getValue()) {
- me["APU-low-oil"].show();
- } else {
- me["APU-low-oil"].hide();
- }
-
- me.updateBottomStatus();
- },
+var input = {
+ gForce: "/accelerations/pilot-gdamped",
+ gForceDisplay: "/ECAM/Lower/g-force-display",
+ hour: "/sim/time/utc/hour",
+ minute: "/sim/time/utc/minute",
};
-var canvas_lowerECAM_bleed = {
- new: func(canvas_group, file) {
- var m = {parents: [canvas_lowerECAM_bleed, canvas_lowerECAM_base]};
- m.init(canvas_group, file);
-
- return m;
- },
- getKeys: func() {
- return ["TAT","SAT","GW","UTCh","UTCm","GLoad","GW-weight-unit", "BLEED-XFEED", "BLEED-Ram-Air", "BLEED-APU-CIRCLE", "BLEED-HP-Valve-1",
- "BLEED-APU-LINES","BLEED-ENG-1", "BLEED-HP-Valve-2", "BLEED-ENG-2", "BLEED-Precooler-1-Inlet-Press", "BLEED-Precooler-1-Outlet-Temp",
- "BLEED-Precooler-2-Inlet-Press", "BLEED-Precooler-2-Outlet-Temp", "BLEED-ENG-1-label", "BLEED-ENG-2-label",
- "BLEED-GND", "BLEED-Pack-1-Flow-Valve", "BLEED-Pack-2-Flow-Valve", "BLEED-Pack-1-Out-Temp","BLEED-APU-connectionTop",
- "BLEED-Pack-1-Comp-Out-Temp", "BLEED-Pack-1-Packflow-needle", "BLEED-Pack-1-Bypass-needle", "BLEED-Pack-2-Out-Temp",
- "BLEED-Pack-2-Bypass-needle", "BLEED-Pack-2-Comp-Out-Temp", "BLEED-Pack-2-Packflow-needle", "BLEED-Anti-Ice-Left",
- "BLEED-Anti-Ice-Right", "BLEED-HP-2-connection", "BLEED-HP-1-connection", "BLEED-ANTI-ICE-ARROW-LEFT", "BLEED-ANTI-ICE-ARROW-RIGHT",
- "BLEED-xbleedLeft","BLEED-xbleedCenter","BLEED-xbleedRight","BLEED-cond-1","BLEED-cond-2","BLEED-cond-3","BLEED-Ram-Air-connection"];
- },
- update: func() {
- # X BLEED
- xbleedstate = xbleed.getValue();
- xbleedcmdstate = xbleedcmd.getBoolValue();
- if (xbleedcmdstate != xbleedstate) {
- me["BLEED-XFEED"].setColor(0.7333,0.3803,0);
- } else {
- me["BLEED-XFEED"].setColor(0.0509,0.7529,0.2941);
- }
-
- if (xbleedcmdstate == xbleedstate) {
- if (xbleedcmdstate) {
- me["BLEED-XFEED"].setRotation(0);
- } else {
- me["BLEED-XFEED"].setRotation(90 * D2R);
- }
- } else {
- me["BLEED-XFEED"].setRotation(45 * D2R);
- }
-
- if (xbleedstate == 1) {
- me["BLEED-xbleedCenter"].show();
- me["BLEED-xbleedRight"].show();
- } else {
- me["BLEED-xbleedCenter"].hide();
- me["BLEED-xbleedRight"].hide();
- }
-
- # HP valve 1
- hp_valve_state = hp_valve1_state.getValue();
-
- if (hp_valve_state == 1) {
- me["BLEED-HP-Valve-1"].setRotation(90 * D2R);
- me["BLEED-HP-1-connection"].show();
- } else {
- me["BLEED-HP-Valve-1"].setRotation(0);
- me["BLEED-HP-1-connection"].hide();
- }
-
- if (hp_valve_state == hp_valve1.getValue()) {
- me["BLEED-HP-Valve-1"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["BLEED-HP-Valve-1"].setColor(0.7333,0.3803,0);
- }
-
- # HP valve 2
- hp_valve_state = hp_valve2_state.getValue();
-
- if (hp_valve_state == 1) {
- me["BLEED-HP-Valve-2"].setRotation(90 * D2R);
- me["BLEED-HP-2-connection"].show();
- } else {
- me["BLEED-HP-Valve-2"].setRotation(0);
- me["BLEED-HP-2-connection"].hide();
- }
-
- if (hp_valve_state == hp_valve2.getValue()) {
- me["BLEED-HP-Valve-2"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["BLEED-HP-Valve-2"].setColor(0.7333,0.3803,0);
- }
-
- # ENG BLEED valve 1
- eng_valve_state = systems.PNEU.Switch.bleed1.getValue();
- bleed_valve_cur = eng_valve1.getValue();
-
- if (bleed_valve_cur == 0) {
- me["BLEED-ENG-1"].setRotation(0);
- } else {
- me["BLEED-ENG-1"].setRotation(90 * D2R);
- }
-
- if (eng_valve_state == bleed_valve_cur) {
- me["BLEED-ENG-1"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["BLEED-ENG-1"].setColor(0.7333,0.3803,0);
- }
-
- # APU BLEED valve
- var apu_valve_state2 = apu_valve_state.getValue();
-
- if (systems.APUNodes.Controls.master.getValue()) {
- me["BLEED-APU-LINES"].show();
- if (apu_valve_state2 == 1) {
- me["BLEED-APU-CIRCLE"].setRotation(0);
- me["BLEED-APU-connectionTop"].show();
- me["BLEED-xbleedLeft"].show();
- } else {
- me["BLEED-APU-CIRCLE"].setRotation(90 * D2R);
- me["BLEED-APU-connectionTop"].hide();
- if (xbleed.getValue() != 1) {
- me["BLEED-xbleedLeft"].hide();
- } else {
- me["BLEED-xbleedLeft"].show();
- }
- }
- if (apuBleedNotOn.getValue() != 1) {
- me["BLEED-APU-CIRCLE"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["BLEED-APU-CIRCLE"].setColor(0.7333,0.3803,0);
- }
- } else {
- if (xbleed.getValue() != 1) {
- me["BLEED-xbleedLeft"].hide();
- } else {
- me["BLEED-xbleedLeft"].show();
- }
- me["BLEED-APU-LINES"].hide();
- me["BLEED-APU-connectionTop"].hide();
- }
-
- # ENG BLEED valve 2
- eng_valve_state = systems.PNEU.Switch.bleed2.getValue();
- bleed_valve_cur = eng_valve2.getValue();
-
- if (bleed_valve_cur == 0) {
- me["BLEED-ENG-2"].setRotation(0);
- } else {
- me["BLEED-ENG-2"].setRotation(90 * D2R);
- }
-
- if (eng_valve_state == bleed_valve_cur) {
- me["BLEED-ENG-2"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["BLEED-ENG-2"].setColor(0.7333,0.3803,0);
- }
-
- # Precooler inlet 1
- bmc1 = bmc1working.getValue();
- bmc2 = bmc2working.getValue();
-
- if (bmc1) {
- var precooler_psi = precooler1_psi.getValue();
- me["BLEED-Precooler-1-Inlet-Press"].setText(sprintf("%s", math.round(precooler_psi)));
- if (precooler_psi < 4 or precooler_psi > 57) {
- me["BLEED-Precooler-1-Inlet-Press"].setColor(0.7333,0.3803,0);
- } else {
- me["BLEED-Precooler-1-Inlet-Press"].setColor(0.0509,0.7529,0.2941);
- }
- } else {
- me["BLEED-Precooler-1-Inlet-Press"].setText(sprintf("%s", "XX"));
- me["BLEED-Precooler-1-Inlet-Press"].setColor(0.7333,0.3803,0);
- }
-
- # Precooler inlet 2
- if (bmc2) {
- var precooler_psi = precooler2_psi.getValue();
- me["BLEED-Precooler-2-Inlet-Press"].setText(sprintf("%s", math.round(precooler_psi)));
- if (precooler_psi < 4 or precooler_psi > 57) {
- me["BLEED-Precooler-2-Inlet-Press"].setColor(0.7333,0.3803,0);
- } else {
- me["BLEED-Precooler-2-Inlet-Press"].setColor(0.0509,0.7529,0.2941);
- }
- } else {
- me["BLEED-Precooler-2-Inlet-Press"].setText(sprintf("%s", "XX"));
- me["BLEED-Precooler-2-Inlet-Press"].setColor(0.7333,0.3803,0);
- }
-
- # Precooler outlet 1
- if (bmc1) {
- var precooler_temp = precooler1_temp.getValue();
- me["BLEED-Precooler-1-Outlet-Temp"].setText(sprintf("%s", math.round(precooler_temp, 5)));
- if (systems.PNEU.Switch.bleed1.getValue() and (precooler_temp < 150 or precooler1_ovht.getValue())) {
- me["BLEED-Precooler-1-Outlet-Temp"].setColor(0.7333,0.3803,0);
- } else {
- me["BLEED-Precooler-1-Outlet-Temp"].setColor(0.0509,0.7529,0.2941);
- }
- } else {
- me["BLEED-Precooler-1-Outlet-Temp"].setText(sprintf("%s", "XX"));
- me["BLEED-Precooler-1-Outlet-Temp"].setColor(0.7333,0.3803,0);
- }
-
- # Precooler outlet 2
- if (bmc2) {
- var precooler_temp = precooler2_temp.getValue();
- me["BLEED-Precooler-2-Outlet-Temp"].setText(sprintf("%s", math.round(precooler_temp, 5)));
- if (systems.PNEU.Switch.bleed2.getValue() and (precooler_temp < 150 or precooler2_ovht.getValue())) {
- me["BLEED-Precooler-2-Outlet-Temp"].setColor(0.7333,0.3803,0);
- } else {
- me["BLEED-Precooler-2-Outlet-Temp"].setColor(0.0509,0.7529,0.2941);
- }
- } else {
- me["BLEED-Precooler-2-Outlet-Temp"].setText(sprintf("%s", "XX"));
- me["BLEED-Precooler-2-Outlet-Temp"].setColor(0.7333,0.3803,0);
- }
-
- # GND air
- if (pts.Gear.wow[1].getValue()) {
- me["BLEED-GND"].show();
- } else {
- me["BLEED-GND"].hide();
- }
-
- # WING ANTI ICE
- if (switch_wing_aice.getValue()) {
- me["BLEED-Anti-Ice-Left"].show();
- me["BLEED-Anti-Ice-Right"].show();
- } else {
- me["BLEED-Anti-Ice-Left"].hide();
- me["BLEED-Anti-Ice-Right"].hide();
- }
-
- # ENG 1 label
- if (pts.Engines.Engine.n2Actual[0].getValue() >= 59) {
- me["BLEED-ENG-1-label"].setColor(0.8078,0.8039,0.8078);
- } else {
- me["BLEED-ENG-1-label"].setColor(0.7333,0.3803,0);
- }
-
- # ENG 2 label
- if (pts.Engines.Engine.n2Actual[1].getValue() >= 59) {
- me["BLEED-ENG-2-label"].setColor(0.8078,0.8039,0.8078);
- } else {
- me["BLEED-ENG-2-label"].setColor(0.7333,0.3803,0);
- }
-
- # PACK 1 -----------------------------------------
- packValveState = systems.PNEU.Valves.pack1.getValue();
- me["BLEED-Pack-1-Out-Temp"].setText(sprintf("%s", math.round(systems.PNEU.Packs.pack1OutTemp.getValue(), 5)));
- me["BLEED-Pack-1-Comp-Out-Temp"].setText(sprintf("%s", math.round(systems.PNEU.Packs.pack1OutletTemp.getValue(), 5)));
-
- if (systems.PNEU.Packs.pack1OutTemp.getValue() > 90) {
- me["BLEED-Pack-1-Out-Temp"].setColor(0.7333,0.3803,0);
- } else {
- me["BLEED-Pack-1-Out-Temp"].setColor(0.0509,0.7529,0.2941);
- }
-
- # `-50` cause the middel position from where we move the needle is at 50
- me["BLEED-Pack-1-Bypass-needle"].setRotation((pack1_bypass.getValue() - 50) * D2R);
-
- if (systems.PNEU.Packs.pack1OutletTemp.getValue() > 230) {
- me["BLEED-Pack-1-Comp-Out-Temp"].setColor(0.7333,0.3803,0);
- } else {
- me["BLEED-Pack-1-Comp-Out-Temp"].setColor(0.0509,0.7529,0.2941);
- }
-
- me["BLEED-Pack-1-Packflow-needle"].setRotation(systems.PNEU.Packs.packFlow1.getValue() * D2R);
-
- if (packValveState == 0) {
- me["BLEED-Pack-1-Packflow-needle"].setColorFill(0.7333,0.3803,0);
- me["BLEED-Pack-1-Flow-Valve"].setRotation(90 * D2R);
- } else {
- me["BLEED-Pack-1-Packflow-needle"].setColorFill(0.0509,0.7529,0.2941);
- me["BLEED-Pack-1-Flow-Valve"].setRotation(0);
- }
-
- if (packValveState == systems.PNEU.Switch.pack1.getValue()) {
- me["BLEED-Pack-1-Flow-Valve"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["BLEED-Pack-1-Flow-Valve"].setColor(0.7333,0.3803,0);
- }
-
- # PACK 2 -----------------------------------------
- packValveState = systems.PNEU.Valves.pack2.getValue();
- me["BLEED-Pack-2-Out-Temp"].setText(sprintf("%s", math.round(systems.PNEU.Packs.pack2OutTemp.getValue(), 5)));
- me["BLEED-Pack-2-Comp-Out-Temp"].setText(sprintf("%s", math.round(systems.PNEU.Packs.pack2OutletTemp.getValue(), 5)));
-
- if (systems.PNEU.Packs.pack2OutTemp.getValue() > 90) {
- me["BLEED-Pack-2-Out-Temp"].setColor(0.7333,0.3803,0);
- } else {
- me["BLEED-Pack-2-Out-Temp"].setColor(0.0509,0.7529,0.2941);
- }
-
- me["BLEED-Pack-2-Bypass-needle"].setRotation((pack2_bypass.getValue() - 50) * D2R);
-
- if (systems.PNEU.Packs.pack2OutletTemp.getValue() > 230) {
- me["BLEED-Pack-2-Comp-Out-Temp"].setColor(0.7333,0.3803,0);
- } else {
- me["BLEED-Pack-2-Comp-Out-Temp"].setColor(0.0509,0.7529,0.2941);
- }
-
- me["BLEED-Pack-2-Packflow-needle"].setRotation(systems.PNEU.Packs.packFlow2.getValue() * D2R);
-
- if (packValveState == 0) {
- me["BLEED-Pack-2-Packflow-needle"].setColorFill(0.7333,0.3803,0);
- me["BLEED-Pack-2-Flow-Valve"].setRotation(90 * D2R);
- } else {
- me["BLEED-Pack-2-Packflow-needle"].setColorFill(0.0509,0.7529,0.2941);
- me["BLEED-Pack-2-Flow-Valve"].setRotation(0);
- }
-
- if (packValveState == systems.PNEU.Switch.pack2.getValue()) {
- me["BLEED-Pack-2-Flow-Valve"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["BLEED-Pack-2-Flow-Valve"].setColor(0.7333,0.3803,0);
- }
-
- # Ram Air
- ramAirState = systems.PNEU.Valves.ramAir.getValue();
- if (ramAirState == 0) {
- me["BLEED-Ram-Air"].setRotation(90 * D2R);
- me["BLEED-Ram-Air"].setColor(0.0509,0.7529,0.2941);
- me["BLEED-Ram-Air"].setColorFill(0.0509,0.7529,0.2941);
- me["BLEED-Ram-Air-connection"].hide();
- } elsif (ramAirState) {
- me["BLEED-Ram-Air"].setRotation(0);
- if (pts.Gear.wow[1].getValue()) {
- me["BLEED-Ram-Air"].setColor(0.7333,0.3803,0);
- me["BLEED-Ram-Air"].setColorFill(0.7333,0.3803,0);
- } else {
- me["BLEED-Ram-Air"].setColor(0.0509,0.7529,0.2941);
- me["BLEED-Ram-Air"].setColorFill(0.0509,0.7529,0.2941);
- }
- me["BLEED-Ram-Air-connection"].show();
- } else {
- me["BLEED-Ram-Air"].setRotation(45 * D2R);
- me["BLEED-Ram-Air"].setColor(0.7333,0.3803,0);
- me["BLEED-Ram-Air"].setColorFill(0.7333,0.3803,0);
- me["BLEED-Ram-Air-connection"].show();
- }
-
- # Triangles
- if (systems.PNEU.Valves.pack1.getValue() == 0 and systems.PNEU.Valves.pack2.getValue() == 0) {
- if (pts.Gear.wow[1].getValue() or ramAirState != 1) {
- me["BLEED-cond-1"].setColor(0.7333,0.3803,0);
- me["BLEED-cond-2"].setColor(0.7333,0.3803,0);
- me["BLEED-cond-3"].setColor(0.7333,0.3803,0);
- } else {
- me["BLEED-cond-1"].setColor(0.0509,0.7529,0.2941);
- me["BLEED-cond-2"].setColor(0.0509,0.7529,0.2941);
- me["BLEED-cond-3"].setColor(0.0509,0.7529,0.2941);
- }
- } else {
- me["BLEED-cond-1"].setColor(0.0509,0.7529,0.2941);
- me["BLEED-cond-2"].setColor(0.0509,0.7529,0.2941);
- me["BLEED-cond-3"].setColor(0.0509,0.7529,0.2941);
- }
- me.updateBottomStatus();
- },
-};
-
-var canvas_lowerECAM_cond = {
- new: func(canvas_group, file) {
- var m = {parents: [canvas_lowerECAM_cond, canvas_lowerECAM_base]};
- m.init(canvas_group, file);
-
- return m;
- },
- getKeys: func() {
- return ["TAT","SAT","GW","UTCh","UTCm","GLoad","GW-weight-unit","CargoCond","CONDHotAirValve","CONDFanFwdFault","CONDFanAftFault",
- "CONDTrimValveCKPT","CONDTrimValveAFT","CONDTrimValveFWD","CONDDuctTempCKPT","CONDDuctTempAFT","CONDDuctTempFWD","CONDTempCKPT","CONDTempAFT","CONDTempFWD"];
- },
- update: func() {
- if (systems.PNEU.Valves.hotAir.getValue() == 0) {
- me["CONDHotAirValve"].setRotation(90 * D2R);
- if (systems.PNEU.Switch.hotAir.getBoolValue()) {
- me["CONDHotAirValve"].setColor(0.7333,0.3803,0);
- } else {
- me["CONDHotAirValve"].setColor(0.0509,0.7529,0.2941);
- }
- } else {
- me["CONDHotAirValve"].setRotation(0); # doesn't show rotation in transit
- if (systems.PNEU.Switch.hotAir.getBoolValue()) {
- me["CONDHotAirValve"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["CONDHotAirValve"].setColor(0.7333,0.3803,0);
- }
- }
-
- me["CONDTrimValveCKPT"].setRotation(systems.PNEU.Packs.trimCockpit.getValue() * D2R);
- me["CONDTrimValveAFT"].setRotation(systems.PNEU.Packs.trimAft.getValue() * D2R);
- me["CONDTrimValveFWD"].setRotation(systems.PNEU.Packs.trimFwd.getValue() * D2R);
-
- me["CONDDuctTempCKPT"].setText(sprintf("%2.0f",math.round(systems.PNEU.Packs.cockpitDuctTemp.getValue())));
- me["CONDDuctTempAFT"].setText(sprintf("%2.0f",math.round(systems.PNEU.Packs.cabinAftDuctTemp.getValue())));
- me["CONDDuctTempFWD"].setText(sprintf("%2.0f",math.round(systems.PNEU.Packs.cabinFwdDuctTemp.getValue())));
-
- me["CONDTempCKPT"].setText(sprintf("%2.0f",math.round(systems.PNEU.Packs.cockpitTemp.getValue())));
- me["CONDTempAFT"].setText(sprintf("%2.0f",math.round(systems.PNEU.Packs.cabinAftTemp.getValue())));
- me["CONDTempFWD"].setText(sprintf("%2.0f",math.round(systems.PNEU.Packs.cabinFwdTemp.getValue())));
-
- # fans faults not implemented
- me["CONDFanFwdFault"].hide();
- me["CONDFanAftFault"].hide();
-
- # aft cargo ventilation disabled
- me["CargoCond"].hide();
- me.updateBottomStatus();
- },
-};
-
-var canvas_lowerECAM_crz = {
- new: func(canvas_group, file) {
- var m = {parents: [canvas_lowerECAM_crz, canvas_lowerECAM_base]};
- m.init(canvas_group, file);
-
- return m;
- },
- getKeys: func() {
- return ["TAT","SAT","GW","UTCh","UTCm","GLoad","GW-weight-unit","Oil1","Oil2","FUsed1","FUsed2","FUsed","VIB1N1","VIB1N2","VIB2N1","VIB2N2","deltaPSI","LDGELEV-AUTO","LDGELEV","CABVS","CABALT","VS-Arrow-UP","VS-Arrow-DN","CKPT-TEMP","FWD-TEMP","AFT-TEMP","Fused-weight-unit"];
- },
- update: func() {
-
- me["Oil1"].setText(sprintf("%2.1f", oil_qt1_actual.getValue()));
- me["Oil2"].setText(sprintf("%2.1f", oil_qt2_actual.getValue()));
-
- if (acconfig_weight_kgs.getValue()) {
- me["Fused-weight-unit"].setText("KG");
- me["FUsed1"].setText(sprintf("%s", math.round(fuel_used_lbs1.getValue() * LBS2KGS, 10)));
- me["FUsed2"].setText(sprintf("%s", math.round(fuel_used_lbs2.getValue() * LBS2KGS, 10)));
- me["FUsed"].setText(sprintf("%s", (math.round(fuel_used_lbs1.getValue() * LBS2KGS, 10) + math.round(fuel_used_lbs2.getValue() * LBS2KGS, 10))));
- } else {
- me["Fused-weight-unit"].setText("LBS");
- me["FUsed1"].setText(sprintf("%s", math.round(fuel_used_lbs1.getValue(), 10)));
- me["FUsed2"].setText(sprintf("%s", math.round(fuel_used_lbs2.getValue(), 10)));
- me["FUsed"].setText(sprintf("%s", (math.round(fuel_used_lbs1.getValue(), 10) + math.round(fuel_used_lbs2.getValue(), 10))));
- }
-
- me.updateBottomStatus();
- },
-};
-
-var canvas_lowerECAM_door = {
- new: func(canvas_group, file) {
- var m = {parents: [canvas_lowerECAM_door, canvas_lowerECAM_base]};
- m.init(canvas_group, file);
-
- return m;
- },
- getKeys: func() {
- return["TAT","SAT","GW","UTCh","UTCm","GLoad","GW-weight-unit","Bulk","BulkLine","BulkLbl","Exit1L","Exit1R","Cabin1Left","Cabin1LeftLbl","Cabin1LeftLine","Cabin1LeftSlide","Cabin1Right","Cabin1RightLbl","Cabin1RightLine","Cabin1RightSlide","Cabin2Left","Cabin2LeftLbl",
- "Cabin2LeftLine","Cabin2LeftSlide","Cabin2Right","Cabin2RightLbl","Cabin2RightLine","Cabin2RightSlide","Cabin3Left","Cabin3LeftLbl","Cabin3LeftLine","Cabin3LeftSlide","Cabin3Right","Cabin3RightLbl","Cabin3RightLine","Cabin3RightSlide","AvionicsLine1",
- "AvionicsLbl1","AvionicsLine2","AvionicsLbl2","Cargo1Line","Cargo1Lbl","Cargo1Door","Cargo2Line","Cargo2Lbl","Cargo2Door","ExitLSlide","ExitLLine","ExitLLbl","ExitRSlide","ExitRLine","ExitRLbl","Cabin4Left","Cabin4LeftLbl","Cabin4LeftLine",
- "Cabin4LeftSlide","Cabin4Right","Cabin4RightLbl","Cabin4RightLine","Cabin4RightSlide","DOOROXY-REGUL-LO-PR"];
- },
- update: func() {
- # If you make AirBerlin or Allegiant livery add below
-
- if (doorL1_pos.getValue() > 0) {
- me["Cabin1Left"].show();
- me["Cabin1Left"].setColor(0.7333,0.3803,0);
- me["Cabin1Left"].setColorFill(0.7333,0.3803,0);
- me["Cabin1LeftLbl"].show();
- me["Cabin1LeftLine"].show();
- } else {
- me["Cabin1Left"].setColor(0.0509,0.7529,0.2941);
- me["Cabin1Left"].setColorFill(0,0,0);
- me["Cabin1LeftLbl"].hide();
- me["Cabin1LeftLine"].hide();
- }
-
- if (doorR1_pos.getValue() > 0) {
- me["Cabin1Right"].show();
- me["Cabin1Right"].setColor(0.7333,0.3803,0);
- me["Cabin1Right"].setColorFill(0.7333,0.3803,0);
- me["Cabin1RightLbl"].show();
- me["Cabin1RightLine"].show();
- } else {
- me["Cabin1Right"].setColor(0.0509,0.7529,0.2941);
- me["Cabin1Right"].setColorFill(0,0,0);
- me["Cabin1RightLbl"].hide();
- me["Cabin1RightLine"].hide();
- }
-
- if (doorL4_pos.getValue() > 0) {
- me["Cabin4Left"].show();
- me["Cabin4Left"].setColor(0.7333,0.3803,0);
- me["Cabin4Left"].setColorFill(0.7333,0.3803,0);
- me["Cabin4LeftLbl"].show();
- me["Cabin4LeftLine"].show();
- } else {
- me["Cabin4Left"].setColor(0.0509,0.7529,0.2941);
- me["Cabin4Left"].setColorFill(0,0,0);
- me["Cabin4LeftLbl"].hide();
- me["Cabin4LeftLine"].hide();
- }
-
- if (doorR4_pos.getValue() > 0) {
- me["Cabin4Right"].show();
- me["Cabin4Right"].setColor(0.7333,0.3803,0);
- me["Cabin4Right"].setColorFill(0.7333,0.3803,0);
- me["Cabin4RightLbl"].show();
- me["Cabin4RightLine"].show();
- } else {
- me["Cabin4Right"].setColor(0.0509,0.7529,0.2941);
- me["Cabin4Right"].setColorFill(0,0,0);
- me["Cabin4RightLbl"].hide();
- me["Cabin4RightLine"].hide();
- }
-
- if (cargobulk_pos.getValue() > 0) {
- me["Bulk"].setColor(0.7333,0.3803,0);
- me["Bulk"].setColorFill(0.7333,0.3803,0);
- me["BulkLbl"].show();
- me["BulkLine"].show();
- } else {
- me["Bulk"].setColor(0.0509,0.7529,0.2941);
- me["Bulk"].setColorFill(0,0,0);
- me["BulkLbl"].hide();
- me["BulkLine"].hide();
- }
-
- if (cargofwd_pos.getValue() > 0) {
- me["Cargo1Door"].setColor(0.7333,0.3803,0);
- me["Cargo1Door"].setColorFill(0.7333,0.3803,0);
- me["Cargo1Lbl"].show();
- me["Cargo1Line"].show();
- } else {
- me["Cargo1Door"].setColor(0.0509,0.7529,0.2941);
- me["Cargo1Door"].setColorFill(0,0,0);
- me["Cargo1Lbl"].hide();
- me["Cargo1Line"].hide();
- }
-
- if (cargoaft_pos.getValue() > 0) {
- me["Cargo2Door"].setColor(0.7333,0.3803,0);
- me["Cargo2Door"].setColorFill(0.7333,0.3803,0);
- me["Cargo2Lbl"].show();
- me["Cargo2Line"].show();
- } else {
- me["Cargo2Door"].setColor(0.0509,0.7529,0.2941);
- me["Cargo2Door"].setColorFill(0,0,0);
- me["Cargo2Lbl"].hide();
- me["Cargo2Line"].hide();
- }
-
- me["Cabin1LeftSlide"].hide();
- me["Cabin1RightSlide"].hide();
- me["Cabin2LeftSlide"].hide();
- me["Cabin2RightSlide"].hide();
- me["Cabin3LeftSlide"].hide();
- me["Cabin3RightSlide"].hide();
- me["Cabin4LeftSlide"].hide();
- me["Cabin4RightSlide"].hide();
-
- me["DOOROXY-REGUL-LO-PR"].hide();
- me["AvionicsLine1"].hide();
- me["AvionicsLine2"].hide();
- me["AvionicsLbl1"].hide();
- me["AvionicsLbl2"].hide();
- me["ExitLSlide"].hide();
- me["ExitLLine"].hide();
- me["ExitLLbl"].hide();
- me["ExitRSlide"].hide();
- me["ExitRLine"].hide();
- me["ExitRLbl"].hide();
- me["Cabin1LeftSlide"].hide();
- me["Cabin1RightSlide"].hide();
- me["Cabin4LeftSlide"].hide();
- me["Cabin4RightSlide"].hide();
- me["Cabin2Left"].hide();
- me["Cabin2LeftLine"].hide();
- me["Cabin2LeftLbl"].hide();
- me["Cabin2Right"].hide();
- me["Cabin2RightLine"].hide();
- me["Cabin2RightLbl"].hide();
- me["Cabin3Left"].hide();
- me["Cabin3LeftLine"].hide();
- me["Cabin3LeftLbl"].hide();
- me["Cabin3Right"].hide();
- me["Cabin3RightLine"].hide();
- me["Cabin3RightLbl"].hide();
-
- me.updateBottomStatus();
- },
-};
-
-var canvas_lowerECAM_elec = {
- new: func(canvas_group, file) {
- var m = {parents: [canvas_lowerECAM_elec, canvas_lowerECAM_base]};
- m.init(canvas_group, file);
-
- return m;
- },
- getKeys: func() {
- return ["TAT","SAT","GW","UTCh","UTCm","GLoad","GW-weight-unit","BAT1-label","Bat1Volt","Bat1Ampere","BAT2-label","Bat2Volt","Bat2Ampere","BAT1-charge","BAT1-discharge","BAT2-charge","BAT2-discharge","ELEC-Line-DC1-DCBAT","ELEC-Line-DC1-DCESS","ELEC-Line-DC2-DCBAT",
- "ELEC-Line-DC1-DCESS_DCBAT","ELEC-Line-DC2-DCESS_DCBAT","ELEC-Line-TR1-DC1","ELEC-Line-TR2-DC2","Shed-label","ELEC-Line-ESSTR-DCESS","TR1-label","TR1Volt","TR1Ampere","TR2-label","TR2Volt","TR2Ampere","EMERGEN-group","EmergenVolt","EmergenHz",
- "ELEC-Line-Emergen-ESSTR","EMERGEN-Label-off","Emergen-Label","EMERGEN-out","ELEC-Line-ACESS-TRESS","ELEC-Line-AC1-TR1","ELEC-Line-AC2-TR2","ELEC-Line-AC1-ACESS","ELEC-Line-AC2-ACESS","ACESS-SHED","ACESS","AC1-in","AC2-in","ELEC-Line-GEN1-AC1","ELEC-Line-GEN2-AC2",
- "ELEC-Line-APU-AC1","ELEC-Line-APU-EXT","ELEC-Line-EXT-AC2","APU-out","EXT-out","EXTPWR-group","ExtVolt","ExtHz","APU-content","APU-border","APUGentext","APUGenLoad","APUGenVolt","APUGenHz","APUGEN-off","GEN1-label","Gen1Load","Gen1Volt","Gen1Hz",
- "GEN2-label","Gen2Load","GEN2-off","Gen2Volt","Gen2Hz","ELEC-IDG-1-label","ELEC-IDG-1-num-label","ELEC-IDG-1-Temp","IDG1-LOPR","IDG1-DISC","IDG1-RISE-Value","IDG1-RISE-label","GalleyShed","ELEC-IDG-2-Temp","ELEC-IDG-2-label","ELEC-IDG-2-num-label","IDG2-RISE-label","IDG2-RISE-Value","IDG2-LOPR",
- "IDG2-DISC","ESSTR-group","ESSTR","ESSTR-Volt","ESSTR-Ampere","BAT1-content","BAT2-content","BAT1-OFF","BAT2-OFF","GEN1-content","GEN2-content","GEN-1-num-label","GEN-2-num-label","GEN1-off","GEN2-off","GEN1-num-label","GEN2-num-label","EXTPWR-label",
- "ELEC-ACESS-SHED-label","ELEC-DCBAT-label","ELEC-DCESS-label","ELEC-DC2-label","ELEC-DC1-label","ELEC-AC1-label","ELEC-AC2-label","ELEC-ACESS-label","ELEC-Line-ESSTR-DCESS-off","ELEC-Line-Emergen-ESSTR-off"];
- },
- update: func() {
-
- # BAT1
- if (systems.ELEC.Switch.bat1.getValue() == 0) {
- me["BAT1-OFF"].show();
- me["BAT1-content"].hide();
- me["BAT1-discharge"].hide();
- me["BAT1-charge"].hide();
- } else {
- me["BAT1-OFF"].hide();
- me["BAT1-content"].show();
- me["Bat1Ampere"].setText(sprintf("%s", math.round(systems.ELEC.Source.Bat1.amps.getValue())));
- me["Bat1Volt"].setText(sprintf("%s", math.round(systems.ELEC.Source.Bat1.volt.getValue())));
-
- if (systems.ELEC.Source.Bat1.volt.getValue() >= 24.95 and systems.ELEC.Source.Bat1.volt.getValue() <= 31.05) {
- me["Bat1Volt"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["Bat1Volt"].setColor(0.7333,0.3803,0);
- }
-
- if (systems.ELEC.Source.Bat1.amps.getValue() > 5) {
- me["Bat1Ampere"].setColor(0.7333,0.3803,0);
- } else {
- me["Bat1Ampere"].setColor(0.0509,0.7529,0.2941);
- }
-
- if (systems.ELEC.Source.Bat1.direction.getValue() == 0) {
- me["BAT1-discharge"].hide();
- me["BAT1-charge"].hide();
- } else {
- if (systems.ELEC.Source.Bat1.direction.getValue() == -1) {
- me["BAT1-charge"].show();
- me["BAT1-discharge"].hide();
- } else {
- me["BAT1-discharge"].show();
- me["BAT1-charge"].hide();
- }
- }
- }
-
- if (systems.ELEC.Light.bat1Fault.getValue() or systems.ELEC.Source.Bat1.volt.getValue() < 25 or systems.ELEC.Source.Bat1.volt.getValue() > 31 or systems.ELEC.Source.Bat1.amps.getValue() > 5) {
- me["BAT1-label"].setColor(0.7333,0.3803,0);
- } else {
- me["BAT1-label"].setColor(0.8078,0.8039,0.8078);
- }
-
- # BAT2
- if (systems.ELEC.Switch.bat2.getValue() == 0) {
- me["BAT2-OFF"].show();
- me["BAT2-content"].hide();
- me["BAT2-discharge"].hide();
- me["BAT2-charge"].hide();
- } else {
- me["BAT2-OFF"].hide();
- me["BAT2-content"].show();
- me["Bat2Ampere"].setText(sprintf("%s", math.round(systems.ELEC.Source.Bat2.amps.getValue())));
- me["Bat2Volt"].setText(sprintf("%s", math.round(systems.ELEC.Source.Bat2.volt.getValue())));
-
- if (systems.ELEC.Source.Bat2.volt.getValue() >= 24.95 and systems.ELEC.Source.Bat2.volt.getValue() <= 31.05) {
- me["Bat2Volt"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["Bat2Volt"].setColor(0.7333,0.3803,0);
- }
-
- if (systems.ELEC.Source.Bat2.amps.getValue() > 5) {
- me["Bat2Ampere"].setColor(0.7333,0.3803,0);
- } else {
- me["Bat2Ampere"].setColor(0.0509,0.7529,0.2941);
- }
-
- if (systems.ELEC.Source.Bat2.direction.getValue() == 0) {
- me["BAT2-discharge"].hide();
- me["BAT2-charge"].hide();
- } else {
- if (systems.ELEC.Source.Bat2.direction.getValue() == -1) {
- me["BAT2-charge"].show();
- me["BAT2-discharge"].hide();
- } else {
- me["BAT2-discharge"].show();
- me["BAT2-charge"].hide();
- }
- }
- }
-
- if (systems.ELEC.Light.bat2Fault.getValue() or systems.ELEC.Source.Bat2.volt.getValue() < 25 or systems.ELEC.Source.Bat2.volt.getValue() > 31 or systems.ELEC.Source.Bat2.amps.getValue() > 5) {
- me["BAT2-label"].setColor(0.7333,0.3803,0);
- } else {
- me["BAT2-label"].setColor(0.8078,0.8039,0.8078);
- }
-
- # TR1
- # is only powered when ac1 has power
- tr1_v = systems.ELEC.Source.tr1.outputVolt.getValue();
- tr1_a = systems.ELEC.Source.tr1.outputAmp.getValue();
-
- me["TR1Volt"].setText(sprintf("%s", math.round(tr1_v)));
- me["TR1Ampere"].setText(sprintf("%s", math.round(tr1_a)));
-
- if (tr1_v < 25 or tr1_v > 31 or tr1_a < 5) {
- me["TR1-label"].setColor(0.7333,0.3803,0);
- } else {
- me["TR1-label"].setColor(0.8078,0.8039,0.8078);
- }
-
- if (tr1_v < 25 or tr1_v > 31) {
- me["TR1Volt"].setColor(0.7333,0.3803,0);
- } else {
- me["TR1Volt"].setColor(0.0509,0.7529,0.2941);
- }
-
- if (tr1_a < 5) {
- me["TR1Ampere"].setColor(0.7333,0.3803,0);
- } else {
- me["TR1Ampere"].setColor(0.0509,0.7529,0.2941);
- }
-
- # TR2
- # is only powered when ac2 has power
- tr2_v = systems.ELEC.Source.tr2.outputVolt.getValue();
- tr2_a = systems.ELEC.Source.tr2.outputAmp.getValue();
-
- me["TR2Volt"].setText(sprintf("%s", math.round(tr2_v)));
- me["TR2Ampere"].setText(sprintf("%s", math.round(tr2_a)));
-
- if (tr2_v < 25 or tr2_v > 31 or tr2_a < 5) {
- me["TR2-label"].setColor(0.7333,0.3803,0);
- } else {
- me["TR2-label"].setColor(0.8078,0.8039,0.8078);
- }
-
- if (tr2_v < 25 or tr2_v > 31) {
- me["TR2Volt"].setColor(0.7333,0.3803,0);
- } else {
- me["TR2Volt"].setColor(0.0509,0.7529,0.2941);
- }
-
- if (tr2_a < 5) {
- me["TR2Ampere"].setColor(0.7333,0.3803,0);
- } else {
- me["TR2Ampere"].setColor(0.0509,0.7529,0.2941);
- }
-
- # ESS TR
- essTrvolts = systems.ELEC.Source.trEss.outputVoltRelay.getValue();
- essTramps = systems.ELEC.Source.trEss.outputAmpRelay.getValue();
- if (systems.ELEC.Relay.essTrContactor.getValue()) {
- me["ESSTR-group"].show();
- me["ESSTR-Volt"].setText(sprintf("%s", math.round(essTrvolts)));
- me["ESSTR-Ampere"].setText(sprintf("%s", math.round(essTramps)));
-
- if (essTrvolts < 25 or essTrvolts > 31 or essTramps < 5) {
- me["ESSTR"].setColor(0.7333,0.3803,0);
- } else {
- me["ESSTR"].setColor(0.8078,0.8039,0.8078);
- }
-
- if (essTrvolts < 25 or essTrvolts > 31) {
- me["ESSTR-Volt"].setColor(0.7333,0.3803,0);
- } else {
- me["ESSTR-Volt"].setColor(0.0509,0.7529,0.2941);
- }
-
- if (essTramps < 5) {
- me["ESSTR-Ampere"].setColor(0.7333,0.3803,0);
- } else {
- me["ESSTR-Ampere"].setColor(0.0509,0.7529,0.2941);
- }
- } else {
- me["ESSTR-group"].hide();
- }
-
- # EMER GEN
- if (systems.ELEC.Source.EmerGen.volts.getValue() == 0) {
- me["EMERGEN-group"].hide();
- me["ELEC-Line-Emergen-ESSTR"].hide();
- me["ELEC-Line-Emergen-ESSTR-off"].show();
- me["EMERGEN-Label-off"].show();
- } else {
- me["EMERGEN-group"].show();
- me["ELEC-Line-Emergen-ESSTR"].show();
- me["ELEC-Line-Emergen-ESSTR-off"].hide();
- me["EMERGEN-Label-off"].hide();
-
- me["EmergenVolt"].setText(sprintf("%s", math.round(systems.ELEC.Source.EmerGen.voltsRelay.getValue())));
- me["EmergenHz"].setText(sprintf("%s", math.round(systems.ELEC.Source.EmerGen.hertz.getValue())));
-
- if (systems.ELEC.Source.EmerGen.voltsRelay.getValue() > 120 or systems.ELEC.Source.EmerGen.voltsRelay.getValue() < 110 or systems.ELEC.Source.EmerGen.hertz.getValue() > 410 or systems.ELEC.Source.EmerGen.hertz.getValue() < 390) {
- me["Emergen-Label"].setColor(0.7333,0.3803,0);
- } else {
- me["Emergen-Label"].setColor(0.8078,0.8039,0.8078);
- }
-
- if (systems.ELEC.Source.EmerGen.voltsRelay.getValue() > 120 or systems.ELEC.Source.EmerGen.voltsRelay.getValue() < 110) {
- me["EmergenVolt"].setColor(0.7333,0.3803,0);
- } else {
- me["EmergenVolt"].setColor(0.0509,0.7529,0.2941);
- }
-
- if (systems.ELEC.Source.EmerGen.hertz.getValue() > 410 or systems.ELEC.Source.EmerGen.hertz.getValue() < 390) {
- me["EmergenHz"].setColor(0.7333,0.3803,0);
- } else {
- me["EmergenHz"].setColor(0.0509,0.7529,0.2941);
- }
- }
-
- # IDG 1
- if (!systems.ELEC.Switch.idg1Disc.getBoolValue()) {
- me["IDG1-DISC"].show();
- me["ELEC-IDG-1-label"].setColor(0.7333,0.3803,0);
- } else {
- me["IDG1-DISC"].hide();
- me["ELEC-IDG-1-label"].setColor(0.8078,0.8039,0.8078);
- }
-
- if (eng1_running.getValue() == 0) {
- me["ELEC-IDG-1-num-label"].setColor(0.7333,0.3803,0);
- } else {
- me["ELEC-IDG-1-num-label"].setColor(0.8078,0.8039,0.8078);
- }
-
- if (eng2_running.getValue() == 0) {
- me["ELEC-IDG-2-num-label"].setColor(0.7333,0.3803,0);
- } else {
- me["ELEC-IDG-2-num-label"].setColor(0.8078,0.8039,0.8078);
- }
-
- # IDG 2
- if (!systems.ELEC.Switch.idg2Disc.getBoolValue()) {
- me["IDG2-DISC"].show();
- me["ELEC-IDG-2-label"].setColor(0.7333,0.3803,0);
- } else {
- me["IDG2-DISC"].hide();
- me["ELEC-IDG-2-label"].setColor(0.8078,0.8039,0.8078);
- }
-
- # GEN1
- if (systems.ELEC.Switch.gen1.getValue() == 0) {
- me["GEN1-content"].hide();
- me["GEN1-off"].show();
- if (systems.ELEC.Source.IDG1.gcrRelay.getValue()) {
- me["GEN1-label"].setColor(0.7333,0.3803,0);
- } else {
- me["GEN1-label"].setColor(0.8078,0.8039,0.8078);
- }
-
- if (eng1_running.getValue() == 0) {
- me["GEN1-num-label"].setColor(0.7333,0.3803,0);
- } else {
- me["GEN1-num-label"].setColor(0.8078,0.8039,0.8078);
- }
- } else {
- me["GEN1-content"].show();
- me["GEN1-off"].hide();
- # me["Gen1Load"].setText(sprintf("%s", math.round(gen1_load.getValue())));
- me["Gen1Volt"].setText(sprintf("%s", math.round(systems.ELEC.Source.IDG1.volts.getValue())));
-
- if (systems.ELEC.Source.IDG1.hertz.getValue() == 0) {
- me["Gen1Hz"].setText(sprintf("XX"));
- } else {
- me["Gen1Hz"].setText(sprintf("%s", math.round(systems.ELEC.Source.IDG1.hertz.getValue())));
- }
-
- if (eng1_running.getValue() == 0) {
- me["GEN1-num-label"].setColor(0.7333,0.3803,0);
- } else {
- me["GEN1-num-label"].setColor(0.8078,0.8039,0.8078);
- }
-
- if (systems.ELEC.Source.IDG1.volts.getValue() > 120 or systems.ELEC.Source.IDG1.volts.getValue() < 110 or systems.ELEC.Source.IDG1.hertz.getValue() > 410 or systems.ELEC.Source.IDG1.hertz.getValue() < 390 or gen1_load.getValue() >= 110) {
- me["GEN1-label"].setColor(0.7333,0.3803,0);
- } else {
- me["GEN1-label"].setColor(0.8078,0.8039,0.8078);
- }
-
- if (gen1_load.getValue() >= 110) {
- me["Gen1Load"].setColor(0.7333,0.3803,0);
- } else {
- me["Gen1Load"].setColor(0.0509,0.7529,0.2941);
- }
-
- if (systems.ELEC.Source.IDG1.volts.getValue() > 120 or systems.ELEC.Source.IDG1.volts.getValue() < 110) {
- me["Gen1Volt"].setColor(0.7333,0.3803,0);
- } else {
- me["Gen1Volt"].setColor(0.0509,0.7529,0.2941);
- }
-
- if (systems.ELEC.Source.IDG1.hertz.getValue() > 410 or systems.ELEC.Source.IDG1.hertz.getValue() < 390) {
- me["Gen1Hz"].setColor(0.7333,0.3803,0);
- } else {
- me["Gen1Hz"].setColor(0.0509,0.7529,0.2941);
- }
- }
-
- # GEN2
- if (systems.ELEC.Switch.gen2.getValue() == 0) {
- me["GEN2-content"].hide();
- me["GEN2-off"].show();
- if (systems.ELEC.Source.IDG2.gcrRelay.getValue()) {
- me["GEN2-label"].setColor(0.7333,0.3803,0);
- } else {
- me["GEN2-label"].setColor(0.8078,0.8039,0.8078);
- }
-
- if (eng2_running.getValue() == 0) {
- me["GEN2-num-label"].setColor(0.7333,0.3803,0);
- } else {
- me["GEN2-num-label"].setColor(0.8078,0.8039,0.8078);
- }
- } else {
- me["GEN2-content"].show();
- me["GEN2-off"].hide();
- # me["Gen2Load"].setText(sprintf("%s", math.round(gen2_load.getValue())));
- me["Gen2Volt"].setText(sprintf("%s", math.round(systems.ELEC.Source.IDG2.volts.getValue())));
- if (systems.ELEC.Source.IDG2.hertz.getValue() == 0) {
- me["Gen2Hz"].setText(sprintf("XX"));
- } else {
- me["Gen2Hz"].setText(sprintf("%s", math.round(systems.ELEC.Source.IDG2.hertz.getValue())));
- }
-
- if (eng2_running.getValue() == 0) {
- me["GEN2-num-label"].setColor(0.7333,0.3803,0);
- } else {
- me["GEN2-num-label"].setColor(0.8078,0.8039,0.8078);
- }
-
- if (systems.ELEC.Source.IDG2.volts.getValue() > 120 or systems.ELEC.Source.IDG2.volts.getValue() < 110 or systems.ELEC.Source.IDG2.hertz.getValue() > 410 or systems.ELEC.Source.IDG2.hertz.getValue() < 390 or gen2_load.getValue() >= 110) {
- me["GEN2-label"].setColor(0.7333,0.3803,0);
- } else {
- me["GEN2-label"].setColor(0.8078,0.8039,0.8078);
- }
-
- if (gen2_load.getValue() >= 110) {
- me["Gen2Load"].setColor(0.7333,0.3803,0);
- } else {
- me["Gen2Load"].setColor(0.0509,0.7529,0.2941);
- }
-
-
- if (systems.ELEC.Source.IDG2.volts.getValue() > 120 or systems.ELEC.Source.IDG2.volts.getValue() < 110) {
- me["Gen2Volt"].setColor(0.7333,0.3803,0);
- } else {
- me["Gen2Volt"].setColor(0.0509,0.7529,0.2941);
- }
-
- if (systems.ELEC.Source.IDG2.hertz.getValue() > 410 or systems.ELEC.Source.IDG2.hertz.getValue() < 390) {
- me["Gen2Hz"].setColor(0.7333,0.3803,0);
- } else {
- me["Gen2Hz"].setColor(0.0509,0.7529,0.2941);
- }
- }
-
- # APU
- if (systems.APUNodes.Controls.master.getValue() == 0) {
- me["APU-content"].hide();
- me["APUGEN-off"].hide();
- me["APU-border"].hide();
- me["APUGentext"].setColor(0.8078,0.8039,0.8078);
- } else {
- me["APU-border"].show();
- if (systems.ELEC.Source.APU.contact.getValue() == 0) {
- me["APU-content"].hide();
- me["APUGEN-off"].show();
- me["APUGentext"].setColor(0.7333,0.3803,0);
- } else {
- me["APU-content"].show();
- me["APUGEN-off"].hide();
- # me["APUGenLoad"].setText(sprintf("%s", math.round(apu_load.getValue())));
- me["APUGenVolt"].setText(sprintf("%s", math.round(systems.ELEC.Source.APU.volts.getValue())));
-
- if (systems.ELEC.Source.APU.hertz.getValue() == 0) {
- me["APUGenHz"].setText(sprintf("XX"));
- } else {
- me["APUGenHz"].setText(sprintf("%s", math.round(systems.ELEC.Source.APU.hertz.getValue())));
- }
-
- if (systems.ELEC.Source.APU.volts.getValue() > 120 or systems.ELEC.Source.APU.volts.getValue() < 110 or systems.ELEC.Source.APU.hertz.getValue() > 410 or systems.ELEC.Source.APU.hertz.getValue() < 390 or apu_load.getValue() >= 110) {
- me["APUGentext"].setColor(0.7333,0.3803,0);
- } else {
- me["APUGentext"].setColor(0.8078,0.8039,0.8078);
- }
-
- if(apu_load.getValue() >= 110) {
- me["APUGenLoad"].setColor(0.7333,0.3803,0);
- } else {
- me["APUGenLoad"].setColor(0.0509,0.7529,0.2941);
- }
-
- if (systems.ELEC.Source.APU.volts.getValue() > 120 or systems.ELEC.Source.APU.volts.getValue() < 110) {
- me["APUGenVolt"].setColor(0.7333,0.3803,0);
- } else {
- me["APUGenVolt"].setColor(0.0509,0.7529,0.2941);
- }
-
- if (systems.ELEC.Source.APU.hertz.getValue() > 410 or systems.ELEC.Source.APU.hertz.getValue() < 390) {
- me["APUGenHz"].setColor(0.7333,0.3803,0);
- } else {
- me["APUGenHz"].setColor(0.0509,0.7529,0.2941);
- }
- }
- }
-
- # EXT PWR
-
- if (switch_cart.getValue() == 0) {
- me["EXTPWR-group"].hide();
- } else {
- me["EXTPWR-group"].show();
- me["ExtVolt"].setText(sprintf("%s", math.round(systems.ELEC.Source.Ext.volts.getValue())));
- me["ExtHz"].setText(sprintf("%s", math.round(systems.ELEC.Source.Ext.hertz.getValue())));
-
- if (systems.ELEC.Source.Ext.hertz.getValue() > 410 or systems.ELEC.Source.Ext.hertz.getValue() < 390 or systems.ELEC.Source.Ext.volts.getValue() > 120 or systems.ELEC.Source.Ext.volts.getValue() < 110) {
- me["EXTPWR-label"].setColor(0.7333,0.3803,0);
- } else {
- me["EXTPWR-label"].setColor(0.0509,0.7529,0.2941);
- }
-
- if (systems.ELEC.Source.Ext.hertz.getValue() > 410 or systems.ELEC.Source.Ext.hertz.getValue() < 390) {
- me["ExtHz"].setColor(0.7333,0.3803,0);
- } else {
- me["ExtHz"].setColor(0.0509,0.7529,0.2941);
- }
-
- if (systems.ELEC.Source.Ext.volts.getValue() > 120 or systems.ELEC.Source.Ext.volts.getValue() < 110) {
- me["ExtVolt"].setColor(0.7333,0.3803,0);
- } else {
- me["ExtVolt"].setColor(0.0509,0.7529,0.2941);
- }
- }
-
- if (systems.ELEC.SomeThing.galley.getValue()) {
- me["GalleyShed"].show();
- } else {
- me["GalleyShed"].hide();
- }
-
- # Bus indicators
- if (systems.ELEC.Switch.bat1.getValue() or systems.ELEC.Switch.bat2.getValue()) {
- me["ELEC-DCBAT-label"].setText("DC BAT");
- if (systems.ELEC.Bus.dcBat.getValue() > 25) {
- me["ELEC-DCBAT-label"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["ELEC-DCBAT-label"].setColor(0.7333,0.3803,0);
- }
- } else {
- me["ELEC-DCBAT-label"].setText("XX"); # BCL not powered hence no voltage info supplied from BCL
- me["ELEC-DCBAT-label"].setColor(0.7333,0.3803,0);
- }
-
- if (systems.ELEC.Bus.dc1.getValue() > 25) {
- me["ELEC-DC1-label"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["ELEC-DC1-label"].setColor(0.7333,0.3803,0);
- }
-
- if (systems.ELEC.Bus.dc2.getValue() > 25) {
- me["ELEC-DC2-label"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["ELEC-DC2-label"].setColor(0.7333,0.3803,0);
- }
-
- if (systems.ELEC.Bus.dcEss.getValue() > 25) {
- me["ELEC-DCESS-label"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["ELEC-DCESS-label"].setColor(0.7333,0.3803,0);
- }
-
- if (systems.ELEC.Bus.acEss.getValue() >= 110) {
- me["ELEC-ACESS-label"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["ELEC-ACESS-label"].setColor(0.7333,0.3803,0);
- }
-
- if (systems.ELEC.Bus.acEssShed.getValue() >= 110) {
- me["ACESS-SHED"].hide();
- } else {
- me["ACESS-SHED"].show();
- }
-
- if (systems.ELEC.Bus.ac1.getValue() >= 110) {
- me["ELEC-AC1-label"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["ELEC-AC1-label"].setColor(0.7333,0.3803,0);
- }
-
- if (systems.ELEC.Bus.ac2.getValue() >= 110) {
- me["ELEC-AC2-label"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["ELEC-AC2-label"].setColor(0.7333,0.3803,0);
- }
-
-
- # Managment of the connecting lines between the components
- if (systems.ELEC.Relay.apuGlc.getValue() and (systems.ELEC.Relay.acTie1.getValue() or systems.ELEC.Relay.acTie2.getValue())) {
- me["APU-out"].show();
- } else {
- me["APU-out"].hide();
- }
-
- if (systems.ELEC.Relay.extEpc.getValue() and (systems.ELEC.Relay.acTie1.getValue() or systems.ELEC.Relay.acTie2.getValue())) {
- me["EXT-out"].show();
- } else {
- me["EXT-out"].hide();
- }
-
- if (systems.ELEC.Source.IDG1.volts.getValue() >= 110 and systems.ELEC.Relay.glc1.getValue()) {
- me["ELEC-Line-GEN1-AC1"].show();
- } else {
- me["ELEC-Line-GEN1-AC1"].hide();
- }
-
- if (systems.ELEC.Source.IDG2.volts.getValue() >= 110 and systems.ELEC.Relay.glc2.getValue()) {
- me["ELEC-Line-GEN2-AC2"].show();
- } else {
- me["ELEC-Line-GEN2-AC2"].hide();
- }
-
- if (systems.ELEC.Bus.ac1.getValue() >= 110) {
- me["AC1-in"].show();
- } else {
- me["AC1-in"].hide();
- }
-
- if (systems.ELEC.Bus.ac2.getValue() >= 110) {
- me["AC2-in"].show();
- } else {
- me["AC2-in"].hide();
- }
-
- if (systems.ELEC.Relay.acTie1.getValue() and systems.ELEC.Relay.acTie2.getValue()) {
- me["ELEC-Line-APU-AC1"].show();
- me["ELEC-Line-APU-EXT"].show();
- me["ELEC-Line-EXT-AC2"].show();
- } else {
- if (systems.ELEC.Relay.acTie1.getValue()) {
- me["ELEC-Line-APU-AC1"].show();
- } else {
- me["ELEC-Line-APU-AC1"].hide();
- }
-
- if ((systems.ELEC.Relay.acTie2.getValue() and systems.ELEC.Relay.apuGlc.getValue() and !systems.ELEC.Relay.glc2.getValue()) or (systems.ELEC.Relay.acTie1.getValue() and systems.ELEC.Relay.extEpc.getValue() and !systems.ELEC.Relay.glc1.getValue())) {
- me["ELEC-Line-APU-EXT"].show();
- } else {
- me["ELEC-Line-APU-EXT"].hide();
- }
-
- if (systems.ELEC.Relay.acTie2.getValue()) {
- me["ELEC-Line-EXT-AC2"].show();
- } else {
- me["ELEC-Line-EXT-AC2"].hide();
- }
- }
-
- if (systems.ELEC.Relay.acEssFeed1.getValue()) {
- if (systems.ELEC.Bus.ac1.getValue() >= 110) {
- me["ELEC-Line-AC1-ACESS"].show();
- } else {
- me["ELEC-Line-AC1-ACESS"].hide();
- }
- me["ELEC-Line-AC2-ACESS"].hide();
- } elsif (systems.ELEC.Relay.acEssFeed2.getValue()) {
- me["ELEC-Line-AC1-ACESS"].hide();
- if (systems.ELEC.Bus.ac2.getValue() >= 110) {
- me["ELEC-Line-AC2-ACESS"].show();
- } else {
- me["ELEC-Line-AC2-ACESS"].hide();
- }
- } else {
- me["ELEC-Line-AC1-ACESS"].hide();
- me["ELEC-Line-AC2-ACESS"].hide();
- }
-
- if (systems.ELEC.Relay.tr1Contactor.getValue()) {
- if (systems.ELEC.Bus.ac1.getValue() < 110) {
- me["ELEC-Line-AC1-TR1"].setColorFill(0.7333,0.3803,0);
- } else {
- me["ELEC-Line-AC1-TR1"].setColorFill(0.0509,0.7529,0.2941);
- }
- me["ELEC-Line-AC1-TR1"].show();
- me["ELEC-Line-TR1-DC1"].show();
- } else {
- me["ELEC-Line-AC1-TR1"].hide();
- me["ELEC-Line-TR1-DC1"].hide();
- }
-
- if (systems.ELEC.Relay.tr2Contactor.getValue()) {
- if (systems.ELEC.Bus.ac2.getValue() < 110) {
- me["ELEC-Line-AC2-TR2"].setColorFill(0.7333,0.3803,0);
- } else {
- me["ELEC-Line-AC2-TR2"].setColorFill(0.0509,0.7529,0.2941);
- }
- me["ELEC-Line-AC2-TR2"].show();
- me["ELEC-Line-TR2-DC2"].show();
- } else {
- me["ELEC-Line-AC2-TR2"].hide();
- me["ELEC-Line-TR2-DC2"].hide();
- }
-
- if (systems.ELEC.Relay.dcTie1.getValue()) {
- me["ELEC-Line-DC1-DCESS_DCBAT"].show();
- } else {
- me["ELEC-Line-DC1-DCESS_DCBAT"].hide();
- }
-
- if (systems.ELEC.Relay.dcEssFeedBat.getValue()) {
- me["ELEC-Line-DC1-DCESS"].show();
- } else {
- me["ELEC-Line-DC1-DCESS"].hide();
- }
-
- if (systems.ELEC.Relay.dcEssFeedBat.getValue() or systems.ELEC.Relay.dcTie1.getValue()) {
- me["ELEC-Line-DC1-DCBAT"].show();
- } else {
- me["ELEC-Line-DC1-DCBAT"].hide();
- }
-
- if (systems.ELEC.Relay.dcTie2.getValue()) {
- me["ELEC-Line-DC2-DCBAT"].show();
- me["ELEC-Line-DC2-DCESS_DCBAT"].show();
- } else {
- me["ELEC-Line-DC2-DCBAT"].hide();
- me["ELEC-Line-DC2-DCESS_DCBAT"].hide();
- }
-
- if (systems.ELEC.Relay.acEssEmerGenFeed.getValue()) {
- me["EMERGEN-out"].show();
- me["ELEC-Line-Emergen-ESSTR"].show();
- } else {
- me["EMERGEN-out"].hide();
- me["ELEC-Line-Emergen-ESSTR"].hide();
- }
-
- if (systems.ELEC.Bus.acEss.getValue() >= 110 and !systems.ELEC.Relay.acEssEmerGenFeed.getValue() and (!systems.ELEC.Relay.tr1Contactor.getValue() or !systems.ELEC.Relay.tr2Contactor.getValue())) {
- me["ELEC-Line-ACESS-TRESS"].show();
- } else {
- me["ELEC-Line-ACESS-TRESS"].hide();
- }
-
- if (systems.ELEC.Relay.essTrContactor.getValue()) {
- me["ELEC-Line-ESSTR-DCESS"].show();
- } else {
- me["ELEC-Line-ESSTR-DCESS"].hide();
- }
-
- # hide not yet implemented items
- me["IDG1-LOPR"].hide();
- me["IDG2-LOPR"].hide();
- me["Shed-label"].hide();
- me["IDG2-RISE-label"].hide();
- me["IDG2-RISE-Value"].hide();
- me["IDG1-RISE-label"].hide();
- me["IDG1-RISE-Value"].hide();
-
- me.updateBottomStatus();
- },
-};
-
-var canvas_lowerECAM_eng = {
- new: func(canvas_group, file) {
- var m = {parents: [canvas_lowerECAM_eng, canvas_lowerECAM_base]};
- m.init(canvas_group, file);
-
- return m;
- },
- getKeys: func() {
- return ["TAT","SAT","GW","UTCh","UTCm","GLoad","GW-weight-unit","OilQT1-needle","OilQT2-needle","OilQT1","OilQT2","OilQT1-decimal","OilQT2-decimal","OilPSI1-needle","OilPSI2-needle","OilPSI1","OilPSI2","FUEL-used-1","FUEL-used-2", "Fused-weight-unit"];
- },
- update: func() {
- # Oil Quantity
- me["OilQT1"].setText(sprintf("%s", int(oil_qt1_actual.getValue())));
- me["OilQT2"].setText(sprintf("%s", int(oil_qt2_actual.getValue())));
- me["OilQT1-decimal"].setText(sprintf("%s", int(10*math.mod(oil_qt1_actual.getValue(),1))));
- me["OilQT2-decimal"].setText(sprintf("%s", int(10*math.mod(oil_qt2_actual.getValue(),1))));
-
- me["OilQT1-needle"].setRotation((oil_qt1.getValue() + 90) * D2R);
- me["OilQT2-needle"].setRotation((oil_qt2.getValue() + 90) * D2R);
-
- # Oil Pressure
- if (pts.Engines.Engine.oilPsi[0].getValue() >= 20) {
- me["OilPSI1"].setColor(0.0509,0.7529,0.2941);
- me["OilPSI1-needle"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["OilPSI1"].setColor(1,0,0);
- me["OilPSI1-needle"].setColor(1,0,0);
- }
-
- if (pts.Engines.Engine.oilPsi[1].getValue() >= 20) {
- me["OilPSI2"].setColor(0.0509,0.7529,0.2941);
- me["OilPSI2-needle"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["OilPSI2"].setColor(1,0,0);
- me["OilPSI2-needle"].setColor(1,0,0);
- }
-
- me["OilPSI1"].setText(sprintf("%s", math.round(pts.Engines.Engine.oilPsi[0].getValue())));
- me["OilPSI2"].setText(sprintf("%s", math.round(pts.Engines.Engine.oilPsi[1].getValue())));
-
- me["OilPSI1-needle"].setRotation((oil_psi1.getValue() + 90) * D2R);
- me["OilPSI2-needle"].setRotation((oil_psi2.getValue() + 90) * D2R);
-
- # Fuel Used
- if (acconfig_weight_kgs.getValue()) {
- me["FUEL-used-1"].setText(sprintf("%s", math.round(fuel_used_lbs1.getValue() * LBS2KGS, 10)));
- me["FUEL-used-2"].setText(sprintf("%s", math.round(fuel_used_lbs2.getValue() * LBS2KGS, 10)));
- me["Fused-weight-unit"].setText("KG");
- } else {
- me["FUEL-used-1"].setText(sprintf("%s", math.round(fuel_used_lbs1.getValue(), 10)));
- me["FUEL-used-2"].setText(sprintf("%s", math.round(fuel_used_lbs2.getValue(), 10)));
- me["Fused-weight-unit"].setText("LBS");
- }
-
- me.updateBottomStatus();
- },
-};
-
-var canvas_lowerECAM_fctl = {
- new: func(canvas_group, file) {
- var m = {parents: [canvas_lowerECAM_fctl, canvas_lowerECAM_base]};
- m.init(canvas_group, file);
-
- return m;
- },
- getKeys: func() {
- return["TAT","SAT","GW","UTCh","UTCm","GLoad","GW-weight-unit","ailL","ailR","elevL","elevR","PTcc","PT","PTupdn","elac1","elac2","sec1","sec2","sec3","ailLblue","ailRblue","elevLblue","elevRblue","rudderblue","ailLgreen","ailRgreen","elevLgreen","ruddergreen","PTgreen",
- "elevRyellow","rudderyellow","PTyellow","rudder","spdbrkblue","spdbrkgreen","spdbrkyellow","spoiler1Rex","spoiler1Rrt","spoiler2Rex","spoiler2Rrt","spoiler3Rex","spoiler3Rrt","spoiler4Rex","spoiler4Rrt","spoiler5Rex","spoiler5Rrt","spoiler1Lex",
- "spoiler1Lrt","spoiler2Lex","spoiler2Lrt","spoiler3Lex","spoiler3Lrt","spoiler4Lex","spoiler4Lrt","spoiler5Lex","spoiler5Lrt","spoiler1Rf","spoiler2Rf","spoiler3Rf","spoiler4Rf","spoiler5Rf","spoiler1Lf","spoiler2Lf","spoiler3Lf","spoiler4Lf",
- "spoiler5Lf","ailLscale","ailRscale","path4249","path4249-3","path4249-3-6-7","path4249-3-6-7-5","path4249-3-6","text4343"];
- },
- update: func() {
- blue_psi = systems.HYD.Psi.blue.getValue();
- green_psi = systems.HYD.Psi.green.getValue();
- yellow_psi = systems.HYD.Psi.yellow.getValue();
- elac1Node = fbw.FBW.Computers.elac1.getValue();
- elac2Node = fbw.FBW.Computers.elac2.getValue();
- sec1Node = fbw.FBW.Computers.sec1.getValue();
- sec2Node = fbw.FBW.Computers.sec2.getValue();
-
- # Pitch Trim
- me["PT"].setText(sprintf("%2.1f", math.round(elevator_trim_deg.getValue(), 0.1)));
-
- if (math.round(elevator_trim_deg.getValue(), 0.1) >= 0) {
- me["PTupdn"].setText(sprintf("UP"));
- } else if (math.round(elevator_trim_deg.getValue(), 0.1) < 0) {
- me["PTupdn"].setText(sprintf("DN"));
- }
-
- if (green_psi < 1500 and yellow_psi < 1500) {
- me["PT"].setColor(0.7333,0.3803,0);
- me["PTupdn"].setColor(0.7333,0.3803,0);
- me["PTcc"].setColor(0.7333,0.3803,0);
- } else {
- me["PT"].setColor(0.0509,0.7529,0.2941);
- me["PTupdn"].setColor(0.0509,0.7529,0.2941);
- me["PTcc"].setColor(0.0509,0.7529,0.2941);
- }
-
- if (fbw.FBW.Failures.ths.getBoolValue()) {
- me["text4343"].setColor(0.7333,0.3803,0);
- } else {
- me["text4343"].setColor(0.8078,0.8039,0.8078);
- }
-
- # Ailerons
- me["ailL"].setTranslation(0, aileron_ind_left.getValue() * 100);
- me["ailR"].setTranslation(0, aileron_ind_right.getValue() * (-100));
-
- if ((blue_psi < 1500 or !elac1Node) and (green_psi < 1500 or !elac2Node)) {
- me["ailL"].setColor(0.7333,0.3803,0);
- } else {
- me["ailL"].setColor(0.0509,0.7529,0.2941);
- }
-
- if ((green_psi < 1500 or !elac1Node) and (blue_psi < 1500 or !elac2Node)) {
- me["ailR"].setColor(0.7333,0.3803,0);
- } else {
- me["ailR"].setColor(0.0509,0.7529,0.2941);
- }
-
- # Elevators
- me["elevL"].setTranslation(0, elevator_ind_left.getValue() * 100);
- me["elevR"].setTranslation(0, elevator_ind_right.getValue() * 100);
-
- if ((blue_psi < 1500 or (!elac1Node and !sec1Node)) and (green_psi < 1500 or (!elac2Node and !sec2Node))) {
- me["elevL"].setColor(0.7333,0.3803,0);
- } else {
- me["elevL"].setColor(0.0509,0.7529,0.2941);
- }
-
- if ((blue_psi < 1500 or (!elac1Node and !sec1Node)) and (yellow_psi < 1500 or (!elac2Node and !sec2Node))) {
- me["elevR"].setColor(0.7333,0.3803,0);
- } else {
- me["elevR"].setColor(0.0509,0.7529,0.2941);
- }
-
- # Rudder
- me["rudder"].setRotation(final_deg.getValue() * -0.024);
-
- if (blue_psi < 1500 and yellow_psi < 1500 and green_psi < 1500) {
- me["rudder"].setColor(0.7333,0.3803,0);
- } else {
- me["rudder"].setColor(0.0509,0.7529,0.2941);
- }
-
- # Spoilers
- if (spoiler_L1.getValue() < 1.5) {
- me["spoiler1Lex"].hide();
- me["spoiler1Lrt"].show();
- } else {
- me["spoiler1Lrt"].hide();
- me["spoiler1Lex"].show();
- }
-
- if (spoiler_L2.getValue() < 1.5) {
- me["spoiler2Lex"].hide();
- me["spoiler2Lrt"].show();
- } else {
- me["spoiler2Lrt"].hide();
- me["spoiler2Lex"].show();
- }
-
- if (spoiler_L3.getValue() < 1.5) {
- me["spoiler3Lex"].hide();
- me["spoiler3Lrt"].show();
- } else {
- me["spoiler3Lrt"].hide();
- me["spoiler3Lex"].show();
- }
-
- if (spoiler_L4.getValue() < 1.5) {
- me["spoiler4Lex"].hide();
- me["spoiler4Lrt"].show();
- } else {
- me["spoiler4Lrt"].hide();
- me["spoiler4Lex"].show();
- }
-
- if (spoiler_L5.getValue() < 1.5) {
- me["spoiler5Lex"].hide();
- me["spoiler5Lrt"].show();
- } else {
- me["spoiler5Lrt"].hide();
- me["spoiler5Lex"].show();
- }
-
- if (spoiler_R1.getValue() < 1.5) {
- me["spoiler1Rex"].hide();
- me["spoiler1Rrt"].show();
- } else {
- me["spoiler1Rrt"].hide();
- me["spoiler1Rex"].show();
- }
-
- if (spoiler_R2.getValue() < 1.5) {
- me["spoiler2Rex"].hide();
- me["spoiler2Rrt"].show();
- } else {
- me["spoiler2Rrt"].hide();
- me["spoiler2Rex"].show();
- }
-
- if (spoiler_R3.getValue() < 1.5) {
- me["spoiler3Rex"].hide();
- me["spoiler3Rrt"].show();
- } else {
- me["spoiler3Rrt"].hide();
- me["spoiler3Rex"].show();
- }
-
- if (spoiler_R4.getValue() < 1.5) {
- me["spoiler4Rex"].hide();
- me["spoiler4Rrt"].show();
- } else {
- me["spoiler4Rrt"].hide();
- me["spoiler4Rex"].show();
- }
-
- if (spoiler_R5.getValue() < 1.5) {
- me["spoiler5Rex"].hide();
- me["spoiler5Rrt"].show();
- } else {
- me["spoiler5Rrt"].hide();
- me["spoiler5Rex"].show();
- }
-
- # Spoiler Fail
- if (fbw.FBW.Failures.spoilerl1.getValue() or green_psi < 1500) {
- me["spoiler1Lex"].setColor(0.7333,0.3803,0);
- me["spoiler1Lrt"].setColor(0.7333,0.3803,0);
- if (spoiler_L1.getValue() < 1.5) {
- me["spoiler1Lf"].show();
- } else {
- me["spoiler1Lf"].hide();
- }
- } else {
- me["spoiler1Lex"].setColor(0.0509,0.7529,0.2941);
- me["spoiler1Lrt"].setColor(0.0509,0.7529,0.2941);
- me["spoiler1Lf"].hide();
- }
-
- if (fbw.FBW.Failures.spoilerl2.getValue() or yellow_psi < 1500) {
- me["spoiler2Lex"].setColor(0.7333,0.3803,0);
- me["spoiler2Lrt"].setColor(0.7333,0.3803,0);
- if (spoiler_L2.getValue() < 1.5) {
- me["spoiler2Lf"].show();
- } else {
- me["spoiler2Lf"].hide();
- }
- } else {
- me["spoiler2Lex"].setColor(0.0509,0.7529,0.2941);
- me["spoiler2Lrt"].setColor(0.0509,0.7529,0.2941);
- me["spoiler2Lf"].hide();
- }
-
- if (fbw.FBW.Failures.spoilerl3.getValue() or blue_psi < 1500) {
- me["spoiler3Lex"].setColor(0.7333,0.3803,0);
- me["spoiler3Lrt"].setColor(0.7333,0.3803,0);
- if (spoiler_L3.getValue() < 1.5) {
- me["spoiler3Lf"].show();
- } else {
- me["spoiler3Lf"].hide();
- }
- } else {
- me["spoiler3Lex"].setColor(0.0509,0.7529,0.2941);
- me["spoiler3Lrt"].setColor(0.0509,0.7529,0.2941);
- me["spoiler3Lf"].hide();
- }
-
- if (fbw.FBW.Failures.spoilerl4.getValue() or yellow_psi < 1500) {
- me["spoiler4Lex"].setColor(0.7333,0.3803,0);
- me["spoiler4Lrt"].setColor(0.7333,0.3803,0);
- if (spoiler_L4.getValue() < 1.5) {
- me["spoiler4Lf"].show();
- } else {
- me["spoiler4Lf"].hide();
- }
- } else {
- me["spoiler4Lex"].setColor(0.0509,0.7529,0.2941);
- me["spoiler4Lrt"].setColor(0.0509,0.7529,0.2941);
- me["spoiler4Lf"].hide();
- }
-
- if (fbw.FBW.Failures.spoilerl5.getValue() or green_psi < 1500) {
- me["spoiler5Lex"].setColor(0.7333,0.3803,0);
- me["spoiler5Lrt"].setColor(0.7333,0.3803,0);
- if (spoiler_L5.getValue() < 1.5) {
- me["spoiler5Lf"].show();
- } else {
- me["spoiler5Lf"].hide();
- }
- } else {
- me["spoiler5Lex"].setColor(0.0509,0.7529,0.2941);
- me["spoiler5Lrt"].setColor(0.0509,0.7529,0.2941);
- me["spoiler5Lf"].hide();
- }
-
- if (fbw.FBW.Failures.spoilerr1.getValue() or green_psi < 1500) {
- me["spoiler1Rex"].setColor(0.7333,0.3803,0);
- me["spoiler1Rrt"].setColor(0.7333,0.3803,0);
- if (spoiler_R1.getValue() < 1.5) {
- me["spoiler1Rf"].show();
- } else {
- me["spoiler1Rf"].hide();
- }
- } else {
- me["spoiler1Rex"].setColor(0.0509,0.7529,0.2941);
- me["spoiler1Rrt"].setColor(0.0509,0.7529,0.2941);
- me["spoiler1Rf"].hide();
- }
-
- if (fbw.FBW.Failures.spoilerr2.getValue() or yellow_psi < 1500) {
- me["spoiler2Rex"].setColor(0.7333,0.3803,0);
- me["spoiler2Rrt"].setColor(0.7333,0.3803,0);
- if (spoiler_R2.getValue() < 1.5) {
- me["spoiler2Rf"].show();
- } else {
- me["spoiler2Rf"].hide();
- }
- } else {
- me["spoiler2Rex"].setColor(0.0509,0.7529,0.2941);
- me["spoiler2Rrt"].setColor(0.0509,0.7529,0.2941);
- me["spoiler2Rf"].hide();
- }
-
- if (fbw.FBW.Failures.spoilerr3.getValue() or blue_psi < 1500) {
- me["spoiler3Rex"].setColor(0.7333,0.3803,0);
- me["spoiler3Rrt"].setColor(0.7333,0.3803,0);
- if (spoiler_R3.getValue() < 1.5) {
- me["spoiler3Rf"].show();
- } else {
- me["spoiler3Rf"].hide();
- }
- } else {
- me["spoiler3Rex"].setColor(0.0509,0.7529,0.2941);
- me["spoiler3Rrt"].setColor(0.0509,0.7529,0.2941);
- me["spoiler3Rf"].hide();
- }
-
- if (fbw.FBW.Failures.spoilerr4.getValue() or yellow_psi < 1500) {
- me["spoiler4Rex"].setColor(0.7333,0.3803,0);
- me["spoiler4Rrt"].setColor(0.7333,0.3803,0);
- if (spoiler_R4.getValue() < 1.5) {
- me["spoiler4Rf"].show();
- } else {
- me["spoiler4Rf"].hide();
- }
- } else {
- me["spoiler4Rex"].setColor(0.0509,0.7529,0.2941);
- me["spoiler4Rrt"].setColor(0.0509,0.7529,0.2941);
- me["spoiler4Rf"].hide();
- }
-
- if (fbw.FBW.Failures.spoilerr5.getValue() or green_psi < 1500) {
- me["spoiler5Rex"].setColor(0.7333,0.3803,0);
- me["spoiler5Rrt"].setColor(0.7333,0.3803,0);
- if (spoiler_R5.getValue() < 1.5) {
- me["spoiler5Rf"].show();
- } else {
- me["spoiler5Rf"].hide();
- }
- } else {
- me["spoiler5Rex"].setColor(0.0509,0.7529,0.2941);
- me["spoiler5Rrt"].setColor(0.0509,0.7529,0.2941);
- me["spoiler5Rf"].hide();
- }
-
- # Flight Computers
- if (elac1Node) {
- me["elac1"].setColor(0.0509,0.7529,0.2941);
- me["path4249"].setColor(0.0509,0.7529,0.2941);
- } else if (!elac1Node or fbw.FBW.Failures.elac1.getValue()) {
- me["elac1"].setColor(0.7333,0.3803,0);
- me["path4249"].setColor(0.7333,0.3803,0);
- }
-
- if (elac2Node) {
- me["elac2"].setColor(0.0509,0.7529,0.2941);
- me["path4249-3"].setColor(0.0509,0.7529,0.2941);
- } else if (!elac2Node or fbw.FBW.Failures.elac2.getValue()) {
- me["elac2"].setColor(0.7333,0.3803,0);
- me["path4249-3"].setColor(0.7333,0.3803,0);
- }
-
- if (sec1Node) {
- me["sec1"].setColor(0.0509,0.7529,0.2941);
- me["path4249-3-6-7"].setColor(0.0509,0.7529,0.2941);
- } else if (!sec1Node or fbw.FBW.Failures.sec1.getValue()) {
- me["sec1"].setColor(0.7333,0.3803,0);
- me["path4249-3-6-7"].setColor(0.7333,0.3803,0);
- }
-
- if (sec2Node) {
- me["sec2"].setColor(0.0509,0.7529,0.2941);
- me["path4249-3-6-7-5"].setColor(0.0509,0.7529,0.2941);
- } else if (!sec2Node or fbw.FBW.Failures.sec2.getValue()) {
- me["sec2"].setColor(0.7333,0.3803,0);
- me["path4249-3-6-7-5"].setColor(0.7333,0.3803,0);
- }
-
- if (fbw.FBW.Computers.sec3.getValue()) {
- me["sec3"].setColor(0.0509,0.7529,0.2941);
- me["path4249-3-6"].setColor(0.0509,0.7529,0.2941);
- } else if (!fbw.FBW.Computers.sec3.getValue() or fbw.FBW.Failures.sec3.getValue()) {
- me["sec3"].setColor(0.7333,0.3803,0);
- me["path4249-3-6"].setColor(0.7333,0.3803,0);
- }
-
- # Hydraulic Indicators
- if (blue_psi >= 1500) {
- if (elac1Node) {
- me["ailLblue"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["ailLblue"].setColor(0.7333,0.3803,0);
- }
- if (elac1Node or sec1Node) {
- me["elevLblue"].setColor(0.0509,0.7529,0.2941);
- me["elevRblue"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["elevLblue"].setColor(0.7333,0.3803,0);
- me["elevRblue"].setColor(0.7333,0.3803,0);
- }
- if (elac2Node) {
- me["ailRblue"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["ailRblue"].setColor(0.7333,0.3803,0);
- }
- me["rudderblue"].setColor(0.0509,0.7529,0.2941);
- me["spdbrkblue"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["ailLblue"].setColor(0.7333,0.3803,0);
- me["ailRblue"].setColor(0.7333,0.3803,0);
- me["elevLblue"].setColor(0.7333,0.3803,0);
- me["elevRblue"].setColor(0.7333,0.3803,0);
- me["rudderblue"].setColor(0.7333,0.3803,0);
- me["spdbrkblue"].setColor(0.7333,0.3803,0);
- }
-
- if (green_psi >= 1500) {
- if (elac2Node or sec2Node) {
- me["elevLgreen"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["elevLgreen"].setColor(0.7333,0.3803,0);
- }
-
- if (elac2Node) {
- me["ailLgreen"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["ailLgreen"].setColor(0.7333,0.3803,0);
- }
- if (elac1Node) {
- me["ailRgreen"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["ailRgreen"].setColor(0.7333,0.3803,0);
- }
- me["ruddergreen"].setColor(0.0509,0.7529,0.2941);
- me["PTgreen"].setColor(0.0509,0.7529,0.2941);
- me["spdbrkgreen"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["ailLgreen"].setColor(0.7333,0.3803,0);
- me["ailRgreen"].setColor(0.7333,0.3803,0);
- me["elevLgreen"].setColor(0.7333,0.3803,0);
- me["ruddergreen"].setColor(0.7333,0.3803,0);
- me["PTgreen"].setColor(0.7333,0.3803,0);
- me["spdbrkgreen"].setColor(0.7333,0.3803,0);
- }
-
- if (yellow_psi >= 1500) {
- if (elac2Node or sec2Node) {
- me["elevRyellow"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["elevRyellow"].setColor(0.7333,0.3803,0);
- }
- me["rudderyellow"].setColor(0.0509,0.7529,0.2941);
- me["PTyellow"].setColor(0.0509,0.7529,0.2941);
- me["spdbrkyellow"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["elevRyellow"].setColor(0.7333,0.3803,0);
- me["rudderyellow"].setColor(0.7333,0.3803,0);
- me["PTyellow"].setColor(0.7333,0.3803,0);
- me["spdbrkyellow"].setColor(0.7333,0.3803,0);
- }
-
- me.updateBottomStatus();
- },
-};
-
-var canvas_lowerECAM_fuel = {
- new: func(canvas_group, file) {
- var m = {parents: [canvas_lowerECAM_fuel, canvas_lowerECAM_base]};
- m.init(canvas_group, file);
-
- return m;
- },
- getKeys: func() {
- return["TAT","SAT","GW","UTCh","UTCm","GLoad","GW-weight-unit","FUEL-Pump-Left-1","FUEL-Pump-Left-2","FUEL-Pump-Center-1","FUEL-Pump-Center-2","FUEL-Pump-Right-1","FUEL-Pump-Right-2","FUEL-Left-blocked","FUEL-Right-blocked","FUEL-Center-blocked","FUEL-Left-Transfer",
- "FUEL-Right-Transfer","FUEL-Left-Outer-Inacc","FUEL-Left-Inner-Inacc","FUEL-Center-Inacc","FUEL-Right-Inner-Inacc","FUEL-Right-Outer-Inacc","FUEL-Left-Outer-quantity","FUEL-Left-Inner-quantity","FUEL-Center-quantity","FUEL-Right-Inner-quantity",
- "FUEL-Right-Outer-quantity","FUEL-On-Board","FUEL-Flow-per-min","FUEL-APU-arrow","FUEL-APU-line","FUEL-APU-label","FUEL-used-1","FUEL-used-both","FUEL-used-2","FUEL-ENG-Master-1","FUEL-ENG-Master-2","FUEL-XFEED","FUEL-XFEED-pipes","FUEL-Left-Outer-temp",
- "FUEL-Left-Inner-temp","FUEL-Right-Inner-temp","FUEL-Right-Outer-temp","FUEL-Pump-Left-1-Closed","FUEL-Pump-Left-1-Open","FUEL-Pump-Left-2-Closed","FUEL-Pump-Left-2-Open","FUEL-Pump-Center-1-Open","FUEL-Pump-Center-1-Closed","FUEL-Pump-Center-2-Closed",
- "FUEL-Pump-Center-2-Open","FUEL-Pump-Right-1-Closed","FUEL-Pump-Right-1-Open","FUEL-Pump-Right-2-Closed","FUEL-Pump-Right-2-Open","FUEL-ENG-1-label","FUEL-ENG-2-label","FUEL-ENG-1-pipe","FUEL-ENG-2-pipe","ENG1idFFlow","ENG2idFFlow","FUEL-used-1","FUEL-used-2","FUEL-used-both",
- "Fused-weight-unit","FFlow-weight-unit","FOB-weight-unit"];
- },
- update: func() {
- _weight_kgs = acconfig_weight_kgs.getValue();
-
- if (pts.Engines.Engine.n1Actual[0].getValue() <= 18.8) {
- me["ENG1idFFlow"].setColor(0.7333,0.3803,0);
- me["FUEL-ENG-1-label"].setColor(0.7333,0.3803,0);
- } else {
- me["ENG1idFFlow"].setColor(0.8078,0.8039,0.8078);
- me["FUEL-ENG-1-label"].setColor(0.8078,0.8039,0.8078);
- }
-
- if (pts.Engines.Engine.n1Actual[1].getValue() <= 18.5) {
- me["ENG2idFFlow"].setColor(0.7333,0.3803,0);
- me["FUEL-ENG-2-label"].setColor(0.7333,0.3803,0);
- } else {
- me["ENG2idFFlow"].setColor(0.8078,0.8039,0.8078);
- me["FUEL-ENG-2-label"].setColor(0.8078,0.8039,0.8078);
- }
-
- # TODO add FOB half-boxed amber if some fuel is blocked
- if (_weight_kgs == 1)
- {
- me["FUEL-On-Board"].setText(sprintf("%s", math.round(total_fuel_lbs.getValue() * LBS2KGS, 10)));
- me["FOB-weight-unit"].setText("KG");
- } else {
- me["FUEL-On-Board"].setText(sprintf("%s", math.round(total_fuel_lbs.getValue(), 10)));
- me["FOB-weight-unit"].setText("LBS");
- }
-
- if (_weight_kgs == 1) {
- me["FFlow-weight-unit"].setText("KG/MIN");
- } else {
- me["FFlow-weight-unit"].setText("LBS/MIN");
- }
-
- if (systems.FADEC_S.Power.powered1.getValue() and systems.FADEC_S.Power.powered2.getValue() or systems.FADEC_S.Power.powerup.getValue()) {
- me["FUEL-Flow-per-min"].setColor(0.0509,0.7529,0.2941);
- if (_weight_kgs == 1) {
- me["FUEL-Flow-per-min"].setText(sprintf("%s", math.round(((fuel_flow1.getValue() + fuel_flow2.getValue()) * LBS2KGS) / 60, 10)));
- } else {
- me["FUEL-Flow-per-min"].setText(sprintf("%s", math.round((fuel_flow1.getValue() + fuel_flow2.getValue()) / 60, 10)));
- }
- } else {
- me["FUEL-Flow-per-min"].setColor(0.7333,0.3803,0);
- me["FUEL-Flow-per-min"].setText("XX");
- }
-
- # TODO use the valve prop and add amber if difference between eng master and valve
- # TODO add transition state
- if (systems.FUEL.Valves.lpValve1.getValue()) {
- me["FUEL-ENG-Master-1"].setRotation(0);
- me["FUEL-ENG-Master-1"].setColor(0.0509,0.7529,0.2941);
- me["FUEL-ENG-Master-1"].setColorFill(0.0509,0.7529,0.2941);
- me["FUEL-ENG-1-pipe"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["FUEL-ENG-Master-1"].setRotation(90 * D2R);
- me["FUEL-ENG-Master-1"].setColor(0.7333,0.3803,0);
- me["FUEL-ENG-Master-1"].setColorFill(0.7333,0.3803,0);
- me["FUEL-ENG-1-pipe"].setColor(0.7333,0.3803,0);
- }
-
- # TODO use the valve prop and add amber if difference between eng master and valve
- # TODO add transition state
- if (systems.FUEL.Valves.lpValve2.getValue()) {
- me["FUEL-ENG-Master-2"].setRotation(0);
- me["FUEL-ENG-Master-2"].setColor(0.0509,0.7529,0.2941);
- me["FUEL-ENG-Master-2"].setColorFill(0.0509,0.7529,0.2941);
- me["FUEL-ENG-2-pipe"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["FUEL-ENG-Master-2"].setRotation(90 * D2R);
- me["FUEL-ENG-Master-2"].setColor(0.7333,0.3803,0);
- me["FUEL-ENG-Master-2"].setColorFill(0.7333,0.3803,0);
- me["FUEL-ENG-2-pipe"].setColor(0.7333,0.3803,0);
- }
-
- # this is now bound to the XFEED switch
- # TODO use the valve prop
- # TODO add amber when disagree between switch and btn
- # TODO add transition state
- if (systems.FUEL.Valves.crossfeed.getBoolValue()) {
- me["FUEL-XFEED"].setRotation(0);
- me["FUEL-XFEED-pipes"].show();
- } else {
- me["FUEL-XFEED"].setRotation(90 * D2R);
- me["FUEL-XFEED-pipes"].hide();
- }
-
- # TODO add LO indication
- if (systems.FUEL.Switches.pumpLeft1.getBoolValue()) {
- me["FUEL-Pump-Left-1-Open"].show();
- me["FUEL-Pump-Left-1-Closed"].hide();
- me["FUEL-Pump-Left-1"].setColor(0.0509,0.7529,0.2941);
- me["FUEL-Pump-Left-1"].setColorFill(0.0509,0.7529,0.2941);
- } else {
- me["FUEL-Pump-Left-1-Open"].hide();
- me["FUEL-Pump-Left-1-Closed"].show();
- me["FUEL-Pump-Left-1"].setColor(0.7333,0.3803,0);
- me["FUEL-Pump-Left-1"].setColorFill(0.7333,0.3803,0);
- }
-
- # TODO add LO indication
- if (systems.FUEL.Switches.pumpLeft2.getBoolValue()) {
- me["FUEL-Pump-Left-2-Open"].show();
- me["FUEL-Pump-Left-2-Closed"].hide();
- me["FUEL-Pump-Left-2"].setColor(0.0509,0.7529,0.2941);
- me["FUEL-Pump-Left-2"].setColorFill(0.0509,0.7529,0.2941);
- } else {
- me["FUEL-Pump-Left-2-Open"].hide();
- me["FUEL-Pump-Left-2-Closed"].show();
- me["FUEL-Pump-Left-2"].setColor(0.7333,0.3803,0);
- me["FUEL-Pump-Left-2"].setColorFill(0.7333,0.3803,0);
- }
-
- # TODO add functionality to match FCOM 1.28.20 "Amber: Transfer valve is open, whereas commanded closed in automatic or manual mode"
- if (systems.FUEL.Switches.pumpCenter1.getBoolValue()) {
- me["FUEL-Pump-Center-1-Open"].show();
- me["FUEL-Pump-Center-1-Closed"].hide();
- me["FUEL-Pump-Center-1"].setColor(0.0509,0.7529,0.2941);
- me["FUEL-Pump-Center-1"].setColorFill(0.0509,0.7529,0.2941);
- } else {
- me["FUEL-Pump-Center-1-Open"].hide();
- me["FUEL-Pump-Center-1-Closed"].show();
- me["FUEL-Pump-Center-1"].setColor(0.7333,0.3803,0);
- me["FUEL-Pump-Center-1"].setColorFill(0.7333,0.3803,0);
- }
-
- # TODO add LO indication
- if (systems.FUEL.Switches.pumpCenter2.getBoolValue()) {
- me["FUEL-Pump-Center-2-Open"].show();
- me["FUEL-Pump-Center-2-Closed"].hide();
- me["FUEL-Pump-Center-2"].setColor(0.0509,0.7529,0.2941);
- me["FUEL-Pump-Center-2"].setColorFill(0.0509,0.7529,0.2941);
- } else {
- me["FUEL-Pump-Center-2-Open"].hide();
- me["FUEL-Pump-Center-2-Closed"].show();
- me["FUEL-Pump-Center-2"].setColor(0.7333,0.3803,0);
- me["FUEL-Pump-Center-2"].setColorFill(0.7333,0.3803,0);
- }
-
- # TODO add LO indication
- if (systems.FUEL.Switches.pumpRight1.getBoolValue()) {
- me["FUEL-Pump-Right-1-Open"].show();
- me["FUEL-Pump-Right-1-Closed"].hide();
- me["FUEL-Pump-Right-1"].setColor(0.0509,0.7529,0.2941);
- me["FUEL-Pump-Right-1"].setColorFill(0.0509,0.7529,0.2941);
- } else {
- me["FUEL-Pump-Right-1-Open"].hide();
- me["FUEL-Pump-Right-1-Closed"].show();
- me["FUEL-Pump-Right-1"].setColor(0.7333,0.3803,0);
- me["FUEL-Pump-Right-1"].setColorFill(0.7333,0.3803,0);
- }
-
- # TODO add LO indication
- if (systems.FUEL.Switches.pumpRight2.getBoolValue()) {
- me["FUEL-Pump-Right-2-Open"].show();
- me["FUEL-Pump-Right-2-Closed"].hide();
- me["FUEL-Pump-Right-2"].setColor(0.0509,0.7529,0.2941);
- me["FUEL-Pump-Right-2"].setColorFill(0.0509,0.7529,0.2941);
- } else {
- me["FUEL-Pump-Right-2-Open"].hide();
- me["FUEL-Pump-Right-2-Closed"].show();
- me["FUEL-Pump-Right-2"].setColor(0.7333,0.3803,0);
- me["FUEL-Pump-Right-2"].setColorFill(0.7333,0.3803,0);
- }
-
- # Fuel Used
- if (_weight_kgs == 1) {
- me["FUEL-used-1"].setText(sprintf("%s", math.round(fuel_used_lbs1.getValue() * LBS2KGS, 10)));
- me["FUEL-used-2"].setText(sprintf("%s", math.round(fuel_used_lbs2.getValue() * LBS2KGS, 10)));
- me["FUEL-used-both"].setText(sprintf("%s", (math.round(fuel_used_lbs1.getValue() * LBS2KGS, 10) + math.round(fuel_used_lbs2.getValue() * LBS2KGS, 10))));
- me["Fused-weight-unit"].setText("KG");
- } else {
- me["FUEL-used-1"].setText(sprintf("%s", math.round(fuel_used_lbs1.getValue(), 10)));
- me["FUEL-used-2"].setText(sprintf("%s", math.round(fuel_used_lbs2.getValue(), 10)));
- me["FUEL-used-both"].setText(sprintf("%s", (math.round(fuel_used_lbs1.getValue(), 10) + math.round(fuel_used_lbs2.getValue(), 10))));
- me["Fused-weight-unit"].setText("LBS");
- }
-
- # Fuel Temp
- me["FUEL-Left-Outer-temp"].setText(sprintf("%s", math.round(fuel_left_outer_temp.getValue())));
- me["FUEL-Left-Inner-temp"].setText(sprintf("%s", math.round(fuel_left_inner_temp.getValue())));
- me["FUEL-Right-Outer-temp"].setText(sprintf("%s", math.round(fuel_right_outer_temp.getValue())));
- me["FUEL-Right-Inner-temp"].setText(sprintf("%s", math.round(fuel_right_inner_temp.getValue())));
-
- # Fuel Quantity
- # TODO add LO indication
- if (_weight_kgs == 1) {
- me["FUEL-Left-Outer-quantity"].setText(sprintf("%s", math.round(systems.FUEL.Quantity.leftOuter.getValue() * LBS2KGS, 10)));
- me["FUEL-Left-Inner-quantity"].setText(sprintf("%s", math.round(systems.FUEL.Quantity.leftInner.getValue() * LBS2KGS, 10)));
- me["FUEL-Center-quantity"].setText(sprintf("%s", math.round(systems.FUEL.Quantity.center.getValue() * LBS2KGS, 10)));
- me["FUEL-Right-Inner-quantity"].setText(sprintf("%s", math.round(systems.FUEL.Quantity.rightInner.getValue() * LBS2KGS, 10)));
- me["FUEL-Right-Outer-quantity"].setText(sprintf("%s", math.round(systems.FUEL.Quantity.rightOuter.getValue() * LBS2KGS, 10)));
- } else {
- me["FUEL-Left-Outer-quantity"].setText(sprintf("%s", math.round(systems.FUEL.Quantity.leftOuter.getValue(), 10)));
- me["FUEL-Left-Inner-quantity"].setText(sprintf("%s", math.round(systems.FUEL.Quantity.leftInner.getValue(), 10)));
- me["FUEL-Center-quantity"].setText(sprintf("%s", math.round(systems.FUEL.Quantity.center.getValue(), 10)));
- me["FUEL-Right-Inner-quantity"].setText(sprintf("%s", math.round(systems.FUEL.Quantity.rightInner.getValue(), 10)));
- me["FUEL-Right-Outer-quantity"].setText(sprintf("%s", math.round(systems.FUEL.Quantity.rightOuter.getValue(), 10)));
- }
-
- if (systems.FUEL.Valves.transfer1.getValue() == 0) {
- me["FUEL-Left-Transfer"].hide();
- } else {
- if (systems.FUEL.Valves.transfer1.getValue()) {
- me["FUEL-Left-Transfer"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["FUEL-Left-Transfer"].setColor(0.7333,0.3803,0);
- }
- me["FUEL-Left-Transfer"].show();
- }
-
- if (systems.FUEL.Valves.transfer2.getValue() == 0) {
- me["FUEL-Right-Transfer"].hide();
- } else {
- if (systems.FUEL.Valves.transfer2.getValue()) {
- me["FUEL-Right-Transfer"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["FUEL-Right-Transfer"].setColor(0.7333,0.3803,0);
- }
- me["FUEL-Right-Transfer"].show();
- }
-
- if (!systems.FUEL.Switches.pumpCenter1.getValue() and !systems.FUEL.Switches.pumpCenter2.getValue()) {
- me["FUEL-Center-blocked"].show();
- } else {
- me["FUEL-Center-blocked"].hide();
- }
-
- # APU
- if (systems.FUEL.Valves.apu.getValue() and systems.APUNodes.Controls.master.getValue() and !systems.APUNodes.Controls.fire.getValue()) {
- me["FUEL-APU-label"].setColor(0.8078, 0.8039, 0.8078);
- me["FUEL-APU-line"].setColor(0.0509,0.7529,0.2941);
- me["FUEL-APU-arrow"].setColor(0.0509,0.7529,0.2941);
- me["FUEL-APU-line"].show();
- me["FUEL-APU-arrow"].show();
- } elsif (systems.FUEL.Valves.apu.getValue() and (!systems.APUNodes.Controls.master.getValue() or systems.APUNodes.Controls.fire.getValue())) {
- me["FUEL-APU-label"].setColor(0.7333,0.3803,0);
- me["FUEL-APU-line"].setColor(0.7333,0.3803,0);
- me["FUEL-APU-arrow"].setColor(0.7333,0.3803,0);
- me["FUEL-APU-line"].show();
- me["FUEL-APU-arrow"].show();
- } elsif (systems.FUEL.Valves.apu.getValue() != 1 and (systems.APUNodes.Controls.master.getValue() or systems.APUNodes.Controls.fire.getValue())) {
- me["FUEL-APU-label"].setColor(0.7333,0.3803,0);
- me["FUEL-APU-line"].hide();
- me["FUEL-APU-arrow"].hide();
- } else {
- me["FUEL-APU-label"].setColor(0.8078, 0.8039, 0.8078);
- me["FUEL-APU-arrow"].setColor(0.8078, 0.8039, 0.8078);
- me["FUEL-APU-line"].hide();
- me["FUEL-APU-arrow"].show();
- }
-
- # Hide not yet implemented features
- # TODO add them
- me["FUEL-Left-blocked"].hide();
- me["FUEL-Right-blocked"].hide();
- me["FUEL-Left-Outer-Inacc"].hide();
- me["FUEL-Left-Inner-Inacc"].hide();
- me["FUEL-Right-Outer-Inacc"].hide();
- me["FUEL-Right-Inner-Inacc"].hide();
- me["FUEL-Center-Inacc"].hide();
- me.updateBottomStatus();
- },
-};
-
-var canvas_lowerECAM_press = {
- new: func(canvas_group, file) {
- var m = {parents: [canvas_lowerECAM_press, canvas_lowerECAM_base]};
- m.init(canvas_group, file);
-
- return m;
- },
- getKeys: func() {
- return ["TAT","SAT","GW","UTCh","UTCm","GLoad","GW-weight-unit", "PRESS-Cab-VS", "PRESS-Cab-VS-neg", "PRESS-Cab-Alt"];
- },
- update: func() {
- me["PRESS-Cab-VS"].setText(sprintf("%4.0f", press_vs_norm.getValue()));
- me["PRESS-Cab-Alt"].setText(sprintf("%4.0f", cabinalt.getValue()));
-
-
- me.updateBottomStatus();
- },
-};
-
-var canvas_lowerECAM_status = {
- new: func(canvas_group, file) {
- var m = {parents: [canvas_lowerECAM_status, canvas_lowerECAM_base]};
- m.init(canvas_group, file);
-
- return m;
- },
- getKeys: func() {
- return ["TAT","SAT","GW","UTCh","UTCm","GLoad","GW-weight-unit"];
- },
- update: func() {
-
- me.updateBottomStatus();
- },
-};
-
-var canvas_lowerECAM_hyd = {
- new: func(canvas_group, file) {
- var m = {parents: [canvas_lowerECAM_hyd, canvas_lowerECAM_base]};
- m.init(canvas_group, file);
-
- return m;
- },
- getKeys: func() {
- return ["TAT","SAT","GW","UTCh","UTCm","GLoad","GW-weight-unit","Green-Indicator","Blue-Indicator","Yellow-Indicator","Press-Green","Press-Blue","Press-Yellow","Green-Line","Blue-Line","Yellow-Line","PTU-Supply-Line","PTU-supply-yellow","PTU-supply-green","PTU-connection",
- "PTU-Auto-or-off","RAT-label","RAT-stowed","RAT-not-stowed","ELEC-Yellow-off","ELEC-Yellow-on","ELEC-Yellow-label","ELEC-OVTH-Yellow","ELEC-Blue-label","ELEC-OVHT-Blue","ELEC-OVHT-Yellow","Pump-Green-label","Pump-Yellow-label","Pump-Green",
- "Pump-LOPR-Green","Pump-Green-off","Pump-Green-on","Pump-Yellow","Pump-LOPR-Yellow","Pump-Yellow-off","Pump-Yellow-on","Pump-Blue", "Pump-Blue-off","Pump-Blue-on","Fire-Valve-Green","Fire-Valve-Yellow","LO-AIR-PRESS-Green",
- "LO-AIR-PRESS-Yellow","LO-AIR-PRESS-Blue","OVHT-Green","OVHT-Blue","OVHT-Yellow","Quantity-Indicator-Green","Quantity-Indicator-Blue","Quantity-Indicator-Yellow","Green-label","Blue-label","Yellow-label"];
- },
- update: func() {
- blue_psi = systems.HYD.Psi.blue.getValue();
- green_psi = systems.HYD.Psi.green.getValue();
- yellow_psi = systems.HYD.Psi.yellow.getValue();
-
- me["Press-Green"].setText(sprintf("%s", math.round(green_psi, 50)));
- me["Press-Blue"].setText(sprintf("%s", math.round(blue_psi, 50)));
- me["Press-Yellow"].setText(sprintf("%s", math.round(yellow_psi, 50)));
-
- if (blue_psi >= 1500) {
- me["Blue-Line"].setColor(0.0509,0.7529,0.2941);
- me["Blue-Line"].setColorFill(0.0509,0.7529,0.2941);
- me["Blue-Indicator"].setColor(0.0509,0.7529,0.2941);
- me["Press-Blue"].setColor(0.0509,0.7529,0.2941);
- me["Blue-label"].setColor(0.8078,0.8039,0.8078);
- } else {
- me["Blue-Line"].setColor(0.7333,0.3803,0);
- me["Blue-Line"].setColorFill(0.7333,0.3803,0);
- me["Blue-Indicator"].setColor(0.7333,0.3803,0);
- me["Press-Blue"].setColor(0.7333,0.3803,0);
- me["Blue-label"].setColor(0.7333,0.3803,0);
- }
-
- if (yellow_psi >= 1500) {
- me["Yellow-Line"].setColor(0.0509,0.7529,0.2941);
- me["Yellow-Line"].setColorFill(0.0509,0.7529,0.2941);
- me["Yellow-Indicator"].setColor(0.0509,0.7529,0.2941);
- me["Press-Yellow"].setColor(0.0509,0.7529,0.2941);
- me["Yellow-label"].setColor(0.8078,0.8039,0.8078);
- } else {
- me["Yellow-Line"].setColor(0.7333,0.3803,0);
- me["Yellow-Line"].setColorFill(0.7333,0.3803,0);
- me["Yellow-Indicator"].setColor(0.7333,0.3803,0);
- me["Press-Yellow"].setColor(0.7333,0.3803,0);
- me["Yellow-label"].setColor(0.7333,0.3803,0);
- }
-
- if (green_psi >= 1500) {
- me["Green-Line"].setColor(0.0509,0.7529,0.2941);
- me["Green-Line"].setColorFill(0.0509,0.7529,0.2941);
- me["Green-Indicator"].setColor(0.0509,0.7529,0.2941);
- me["Press-Green"].setColor(0.0509,0.7529,0.2941);
- me["Green-label"].setColor(0.8078,0.8039,0.8078);
- } else {
- me["Green-Line"].setColor(0.7333,0.3803,0);
- me["Green-Line"].setColorFill(0.7333,0.3803,0);
- me["Green-Indicator"].setColor(0.7333,0.3803,0);
- me["Press-Green"].setColor(0.7333,0.3803,0);
- me["Green-label"].setColor(0.7333,0.3803,0);
- }
-
- if (systems.HYD.Switch.ptu.getValue() and !systems.HYD.Fail.ptuFault.getValue()) {
- me["PTU-connection"].setColor(0.0509,0.7529,0.2941);
-
- if (systems.HYD.Ptu.active.getValue()) {
- if (systems.HYD.Ptu.diff.getValue() < 0) {
- me["PTU-Supply-Line"].show();
- me["PTU-supply-yellow"].show();
- me["PTU-supply-green"].hide();
- me["PTU-Auto-or-off"].hide();
- } else {
- me["PTU-Supply-Line"].show();
- me["PTU-supply-yellow"].hide();
- me["PTU-supply-green"].show();
- me["PTU-Auto-or-off"].hide();
- }
- } else {
- me["PTU-Auto-or-off"].setColor(0.0509,0.7529,0.2941);
- me["PTU-Supply-Line"].hide();
- me["PTU-supply-yellow"].hide();
- me["PTU-supply-green"].hide();
- me["PTU-Auto-or-off"].show();
- }
- } else {
- me["PTU-connection"].setColor(0.7333,0.3803,0);
- me["PTU-Auto-or-off"].setColor(0.7333,0.3803,0);
- me["PTU-Supply-Line"].hide();
- me["PTU-supply-yellow"].hide();
- me["PTU-supply-green"].hide();
- me["PTU-Auto-or-off"].show();
- }
-
- if (pts.Engines.Engine.n2Actual[0].getValue() >= 59) {
- me["Pump-Green-label"].setColor(0.8078,0.8039,0.8078);
- } else {
- me["Pump-Green-label"].setColor(0.7333,0.3803,0);
- }
-
- if (pts.Engines.Engine.n2Actual[1].getValue() >= 59) {
- me["Pump-Yellow-label"].setColor(0.8078,0.8039,0.8078);
- } else {
- me["Pump-Yellow-label"].setColor(0.7333,0.3803,0);
- }
-
- if (systems.HYD.Switch.greenEDP.getValue()) {
- me["Pump-Green-off"].hide();
- if (green_psi >= 1500) {
- me["Pump-Green-on"].show();
- me["Pump-LOPR-Green"].hide();
- me["Pump-Green"].setColor(0.0509,0.7529,0.2941);
- me["Pump-Green"].setColorFill(0.0509,0.7529,0.2941);
- } else {
- me["Pump-Green-on"].hide();
- me["Pump-LOPR-Green"].show();
- me["Pump-Green"].setColor(0.7333,0.3803,0);
- me["Pump-Green"].setColorFill(0.7333,0.3803,0);
- }
- } else {
- me["Pump-Green-off"].show();
- me["Pump-Green-on"].hide();
- me["Pump-LOPR-Green"].hide();
- me["Pump-Green"].setColor(0.7333,0.3803,0);
- }
-
- if (systems.HYD.Switch.yellowEDP.getValue()) {
- me["Pump-Yellow-off"].hide();
- if (yellow_psi >= 1500) {
- me["Pump-Yellow-on"].show();
- me["Pump-LOPR-Yellow"].hide();
- me["Pump-Yellow"].setColorFill(0.0509,0.7529,0.2941);
- me["Pump-Yellow"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["Pump-Yellow-on"].hide();
- me["Pump-LOPR-Yellow"].show();
- me["Pump-Yellow"].setColorFill(0.7333,0.3803,0);
- me["Pump-Yellow"].setColor(0.7333,0.3803,0);
- }
- } else {
- me["Pump-Yellow-off"].show();
- me["Pump-Yellow-on"].hide();
- me["Pump-LOPR-Yellow"].hide();
- me["Pump-Yellow"].setColorFill(0.7333,0.3803,0);
- me["Pump-Yellow"].setColor(0.7333,0.3803,0);
- }
-
- if (systems.HYD.Switch.blueElec.getValue()) {
- me["Pump-Blue-off"].hide();
- if (blue_psi >= 1500) {
- me["Pump-Blue-on"].show();
- me["Pump-Blue-off"].hide();
- me["Pump-Blue"].setColorFill(0.0509,0.7529,0.2941);
- me["Pump-Blue"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["Pump-Blue-off"].show();
- me["Pump-Blue-on"].hide();
- me["Pump-Blue"].setColorFill(0.7333,0.3803,0);
- me["Pump-Blue"].setColor(0.7333,0.3803,0);
- }
- } else {
- me["Pump-Blue-off"].show();
- me["Pump-Blue-on"].hide();
- me["Pump-Blue"].setColorFill(0.7333,0.3803,0);
- me["Pump-Blue"].setColor(0.7333,0.3803,0);
- }
-
- if (!systems.HYD.Switch.yellowElec.getValue()) {
- me["ELEC-Yellow-on"].hide();
- me["ELEC-Yellow-off"].show();
- } else {
- me["ELEC-Yellow-on"].show();
- me["ELEC-Yellow-off"].hide();
- if (yellow_psi >= 1500) {
- me["ELEC-Yellow-on"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["ELEC-Yellow-on"].setColor(0.7333,0.3803,0);
- }
- }
-
- if (y_resv_lo_air_press.getValue()) {
- me["LO-AIR-PRESS-Yellow"].show();
- } else {
- me["LO-AIR-PRESS-Yellow"].hide();
- }
-
- if (b_resv_lo_air_press.getValue()) {
- me["LO-AIR-PRESS-Blue"].show();
- } else {
- me["LO-AIR-PRESS-Blue"].hide();
- }
-
- if (g_resv_lo_air_press.getValue()) {
- me["LO-AIR-PRESS-Green"].show();
- } else {
- me["LO-AIR-PRESS-Green"].hide();
- }
-
- if (elec_pump_y_ovht.getValue()) {
- me["ELEC-OVHT-Yellow"].show();
- } else {
- me["ELEC-OVHT-Yellow"].hide();
- }
-
- if (elec_pump_b_ovht.getValue()) {
- me["ELEC-OVHT-Blue"].show();
- } else {
- me["ELEC-OVHT-Blue"].hide();
- }
-
- if (systems.HYD.Rat.position.getValue()) {
- me["RAT-stowed"].hide();
- me["RAT-not-stowed"].show();
- } else {
- me["RAT-stowed"].show();
- me["RAT-not-stowed"].hide();
- }
-
- if (y_resv_ovht.getValue()) {
- me["OVHT-Yellow"].show();
- } else {
- me["OVHT-Yellow"].hide();
- }
-
- if (b_resv_ovht.getValue()) {
- me["OVHT-Green"].show();
- } else {
- me["OVHT-Green"].hide();
- }
-
- if (g_resv_ovht.getValue()) {
- me["OVHT-Blue"].show();
- } else {
- me["OVHT-Blue"].hide();
- }
-
- if (systems.ELEC.Bus.ac1.getValue() >= 110) {
- me["ELEC-Blue-label"].setColor(0.8078,0.8039,0.8078);
- } else {
- me["ELEC-Blue-label"].setColor(0.7333,0.3803,0);
- }
-
- if (systems.ELEC.Bus.ac2.getValue() >= 110) {
- me["ELEC-Yellow-label"].setColor(0.8078,0.8039,0.8078);
- } else {
- me["ELEC-Yellow-label"].setColor(0.7333,0.3803,0);
- }
-
- if (systems.HYD.Valve.yellowFire.getValue() != 0) {
- me["Fire-Valve-Yellow"].setColor(0.7333,0.3803,0);
- me["Fire-Valve-Yellow"].setRotation(90 * D2R);
- } else {
- me["Fire-Valve-Yellow"].setColor(0.0509,0.7529,0.2941);
- me["Fire-Valve-Yellow"].setRotation(0);
- }
-
- if (systems.HYD.Valve.greenFire.getValue() != 0) {
- me["Fire-Valve-Green"].setColor(0.7333,0.3803,0);
- me["Fire-Valve-Green"].setRotation(90 * D2R);
- } else {
- me["Fire-Valve-Green"].setColor(0.0509,0.7529,0.2941);
- me["Fire-Valve-Green"].setRotation(0);
- }
-
- me.updateBottomStatus();
- },
-};
-
-var canvas_lowerECAM_wheel = {
- new: func(canvas_group, file) {
- var m = {parents: [canvas_lowerECAM_wheel, canvas_lowerECAM_base]};
- m.init(canvas_group, file);
-
- return m;
- },
- getKeys: func() {
- return ["TAT","SAT","GW","UTCh","UTCm","GLoad","GW-weight-unit","lgctltext","NORMbrk","NWStext","leftdoor","rightdoor","nosegeardoorL","nosegeardoorR",
- "autobrk","autobrkind","NWS","NWSrect","normbrk-rect","altnbrk","normbrkhyd","spoiler1Rex","spoiler1Rrt","spoiler2Rex","spoiler2Rrt","spoiler3Rex",
- "spoiler3Rrt","spoiler4Rex","spoiler4Rrt","spoiler5Rex","spoiler5Rrt","spoiler1Lex","spoiler1Lrt","spoiler2Lex","spoiler2Lrt",
- "spoiler3Lex","spoiler3Lrt","spoiler4Lex","spoiler4Lrt","spoiler5Lex","spoiler5Lrt","spoiler1Rf","spoiler2Rf","spoiler3Rf","spoiler4Rf","spoiler5Rf",
- "spoiler1Lf","spoiler2Lf","spoiler3Lf","spoiler4Lf","spoiler5Lf","ALTNbrk","altnbrkhyd","altnbrk-rect","antiskidtext","brakearrow","accupress_text",
- "accuonlyarrow","accuonly","braketemp1","normbrkhyd","braketemp2","braketemp3","braketemp4","toparc1","toparc2","toparc3","toparc4","leftuplock",
- "noseuplock","rightuplock","Triangle-Left1","Triangle-Left2","Triangle-Nose1","Triangle-Nose2","Triangle-Right1","Triangle-Right2","BSCUrect1",
- "BSCUrect2","BSCU1","BSCU2","tirepress1","tirepress2","tirepress3","tirepress4","tirepress5","tirepress6"];
- },
- update: func() {
- blue_psi = systems.HYD.Psi.blue.getValue();
- green_psi = systems.HYD.Psi.green.getValue();
- yellow_psi = systems.HYD.Psi.yellow.getValue();
- autobrakemode = autobreak_mode.getValue();
- nosegear = gear1_pos.getValue();
- leftgear = gear2_pos.getValue();
- rightgear = gear3_pos.getValue();
- leftdoor = gear_door_L.getValue();
- rightdoor = gear_door_R.getValue();
- nosedoor = gear_door_N.getValue();
- gearlvr = gear_down.getValue();
- askidsw = systems.HYD.Switch.nwsSwitch.getBoolValue();
- brakemode = systems.HYD.Brakes.mode.getBoolValue();
- accum = systems.HYD.Brakes.accumPressPsi.getBoolValue();
-
- # L/G CTL
- if ((leftgear == 0 or nosegear == 0 or rightgear == 0 and gearlvr == 0) or (leftgear == 1 or nosegear == 1 or rightgear == 1 and gearlvr == 1)) {
- me["lgctltext"].hide();
- } else {
- me["lgctltext"].show();
- }
-
- # NWS / Antiskid / Brakes
- if (askidsw and yellow_psi >= 1500) {
- me["NWStext"].hide();
- me["NWS"].hide();
- me["NWSrect"].hide();
- me["antiskidtext"].hide();
- me["BSCUrect1"].hide();
- me["BSCUrect2"].hide();
- me["BSCU1"].hide();
- me["BSCU2"].hide();
- } else if (!askidsw and yellow_psi >= 1500) {
- me["NWStext"].show();
- me["NWS"].show();
- me["NWS"].setColor(0.0509,0.7529,0.2941);
- me["NWSrect"].show();
- me["antiskidtext"].show();
- me["antiskidtext"].setColor(0.7333,0.3803,0);
- me["BSCUrect1"].show();
- me["BSCUrect2"].show();
- me["BSCU1"].show();
- me["BSCU2"].show();
- } else {
- me["NWStext"].show();
- me["NWS"].show();
- me["NWS"].setColor(0.7333,0.3803,0);
- me["NWSrect"].show();
- me["antiskidtext"].show();
- me["antiskidtext"].setColor(0.7333,0.3803,0);
- me["BSCUrect1"].show();
- me["BSCUrect2"].show();
- me["BSCU1"].show();
- me["BSCU2"].show();
- }
-
- if (green_psi >= 1500 and brakemode == 1) {
- me["NORMbrk"].hide();
- me["normbrk-rect"].hide();
- me["normbrkhyd"].hide();
- } else if (green_psi >= 1500 and askidsw) {
- me["NORMbrk"].show();
- me["normbrk-rect"].show();
- me["NORMbrk"].setColor(0.7333,0.3803,0);
- me["normbrkhyd"].setColor(0.0509,0.7529,0.2941);
- } else if (green_psi < 1500 or !askidsw) {
- me["NORMbrk"].show();
- me["normbrk-rect"].show();
- me["NORMbrk"].setColor(0.7333,0.3803,0);
- me["normbrkhyd"].setColor(0.7333,0.3803,0);
- }
-
- if (brakemode != 2) {
- me["ALTNbrk"].hide();
- me["altnbrk-rect"].hide();
- me["altnbrkhyd"].hide();
- } else if (yellow_psi >= 1500) {
- me["ALTNbrk"].show();
- me["altnbrk-rect"].show();
- me["altnbrkhyd"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["ALTNbrk"].show();
- me["altnbrk-rect"].show();
- me["altnbrkhyd"].setColor(0.7333,0.3803,0);
- }
-
- if (brakemode == 2 and accum < 200 and yellow_psi < 1500) {
- me["accupress_text"].show();
- me["brakearrow"].hide();
- me["accupress_text"].setColor(0.7333,0.3803,0);
- } else if (brakemode == 2 and accum > 200 and yellow_psi >= 1500){
- me["accupress_text"].show();
- me["brakearrow"].show();
- me["accupress_text"].setColor(0.0509,0.7529,0.2941);
- } else if (brakemode == 2 and accum > 200 and yellow_psi < 1500) {
- me["accuonlyarrow"].show();
- me["accuonly"].show();
- me["brakearrow"].hide();
- me["accupress_text"].hide();
- } else {
- me["accuonlyarrow"].hide();
- me["accuonly"].hide();
- me["brakearrow"].hide();
- me["accupress_text"].hide();
- }
-
- # Gear Doors
- me["leftdoor"].setRotation(door_left.getValue() * D2R);
- me["rightdoor"].setRotation(door_right.getValue() * D2R);
- me["nosegeardoorL"].setRotation(door_nose_left.getValue() * D2R);
- me["nosegeardoorR"].setRotation(door_nose_right.getValue() * D2R);
-
- if (nosedoor == 0) {
- me["nosegeardoorL"].setColorFill(0.0509,0.7529,0.2941);
- me["nosegeardoorR"].setColorFill(0.0509,0.7529,0.2941);
- } else {
- me["nosegeardoorL"].setColorFill(0.7333,0.3803,0);
- me["nosegeardoorR"].setColorFill(0.7333,0.3803,0);
- }
-
- if (leftdoor == 0) {
- me["leftdoor"].setColorFill(0.0509,0.7529,0.2941);
- } else {
- me["leftdoor"].setColorFill(0.7333,0.3803,0);
- }
-
- if (rightdoor == 0) {
- me["rightdoor"].setColorFill(0.0509,0.7529,0.2941);
- } else {
- me["rightdoor"].setColorFill(0.7333,0.3803,0);
- }
-
- # Triangles
- if (leftgear < 0.2 or leftgear > 0.8) {
- me["Triangle-Left1"].hide();
- me["Triangle-Left2"].hide();
- } else {
- me["Triangle-Left1"].show();
- me["Triangle-Left2"].show();
- }
-
- if (leftgear == 1) {
- me["Triangle-Left1"].setColor(0.0509,0.7529,0.2941);
- me["Triangle-Left2"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["Triangle-Left1"].setColor(1,0,0);
- me["Triangle-Left2"].setColor(1,0,0);
- }
-
- if (nosegear < 0.2 or nosegear > 0.8) {
- me["Triangle-Nose1"].hide();
- me["Triangle-Nose2"].hide();
- } else {
- me["Triangle-Nose1"].show();
- me["Triangle-Nose2"].show();
- }
-
- if (nosegear == 1) {
- me["Triangle-Nose1"].setColor(0.0509,0.7529,0.2941);
- me["Triangle-Nose2"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["Triangle-Nose1"].setColor(1,0,0);
- me["Triangle-Nose2"].setColor(1,0,0);
- }
-
- if (rightgear < 0.2 or rightgear > 0.8) {
- me["Triangle-Right1"].hide();
- me["Triangle-Right2"].hide();
- } else {
- me["Triangle-Right1"].show();
- me["Triangle-Right2"].show();
- }
-
- if (rightgear == 1) {
- me["Triangle-Right1"].setColor(0.0509,0.7529,0.2941);
- me["Triangle-Right2"].setColor(0.0509,0.7529,0.2941);
- } else {
- me["Triangle-Right1"].setColor(1,0,0);
- me["Triangle-Right2"].setColor(1,0,0);
- }
-
- # Autobrake
- if (autobrakemode == 0) {
- me["autobrkind"].hide();
- } elsif (autobrakemode == 1) {
- me["autobrkind"].show();
- me["autobrkind"].setText(sprintf("%s", "LO"));
- } elsif (autobrakemode == 2) {
- me["autobrkind"].show();
- me["autobrkind"].setText(sprintf("%s", "MED"));
- } elsif (autobrakemode == 3) {
- me["autobrkind"].show();
- me["autobrkind"].setText(sprintf("%s", "MAX"));
- }
-
- if (autobrakemode != 0) {
- me["autobrk"].show();
- } elsif (autobrakemode == 0) {
- me["autobrk"].hide();
- }
-
- # Spoilers
- if (spoiler_L1.getValue() < 1.5) {
- me["spoiler1Lex"].hide();
- me["spoiler1Lrt"].show();
- } else {
- me["spoiler1Lrt"].hide();
- me["spoiler1Lex"].show();
- }
-
- if (spoiler_L2.getValue() < 1.5) {
- me["spoiler2Lex"].hide();
- me["spoiler2Lrt"].show();
- } else {
- me["spoiler2Lrt"].hide();
- me["spoiler2Lex"].show();
- }
-
- if (spoiler_L3.getValue() < 1.5) {
- me["spoiler3Lex"].hide();
- me["spoiler3Lrt"].show();
- } else {
- me["spoiler3Lrt"].hide();
- me["spoiler3Lex"].show();
- }
-
- if (spoiler_L4.getValue() < 1.5) {
- me["spoiler4Lex"].hide();
- me["spoiler4Lrt"].show();
- } else {
- me["spoiler4Lrt"].hide();
- me["spoiler4Lex"].show();
- }
-
- if (spoiler_L5.getValue() < 1.5) {
- me["spoiler5Lex"].hide();
- me["spoiler5Lrt"].show();
- } else {
- me["spoiler5Lrt"].hide();
- me["spoiler5Lex"].show();
- }
-
- if (spoiler_R1.getValue() < 1.5) {
- me["spoiler1Rex"].hide();
- me["spoiler1Rrt"].show();
- } else {
- me["spoiler1Rrt"].hide();
- me["spoiler1Rex"].show();
- }
-
- if (spoiler_R2.getValue() < 1.5) {
- me["spoiler2Rex"].hide();
- me["spoiler2Rrt"].show();
- } else {
- me["spoiler2Rrt"].hide();
- me["spoiler2Rex"].show();
- }
-
- if (spoiler_R3.getValue() < 1.5) {
- me["spoiler3Rex"].hide();
- me["spoiler3Rrt"].show();
- } else {
- me["spoiler3Rrt"].hide();
- me["spoiler3Rex"].show();
- }
-
- if (spoiler_R4.getValue() < 1.5) {
- me["spoiler4Rex"].hide();
- me["spoiler4Rrt"].show();
- } else {
- me["spoiler4Rrt"].hide();
- me["spoiler4Rex"].show();
- }
-
- if (spoiler_R5.getValue() < 1.5) {
- me["spoiler5Rex"].hide();
- me["spoiler5Rrt"].show();
- } else {
- me["spoiler5Rrt"].hide();
- me["spoiler5Rex"].show();
- }
-
- # Spoiler Fail
- if (fbw.FBW.Failures.spoilerl1.getValue() or green_psi < 1500) {
- me["spoiler1Lex"].setColor(0.7333,0.3803,0);
- me["spoiler1Lrt"].setColor(0.7333,0.3803,0);
- if (spoiler_L1.getValue() < 1.5) {
- me["spoiler1Lf"].show();
- } else {
- me["spoiler1Lf"].hide();
- }
- } else {
- me["spoiler1Lex"].setColor(0.0509,0.7529,0.2941);
- me["spoiler1Lrt"].setColor(0.0509,0.7529,0.2941);
- me["spoiler1Lf"].hide();
- }
-
- if (fbw.FBW.Failures.spoilerl2.getValue() or yellow_psi < 1500) {
- me["spoiler2Lex"].setColor(0.7333,0.3803,0);
- me["spoiler2Lrt"].setColor(0.7333,0.3803,0);
- if (spoiler_L2.getValue() < 1.5) {
- me["spoiler2Lf"].show();
- } else {
- me["spoiler2Lf"].hide();
- }
- } else {
- me["spoiler2Lex"].setColor(0.0509,0.7529,0.2941);
- me["spoiler2Lrt"].setColor(0.0509,0.7529,0.2941);
- me["spoiler2Lf"].hide();
- }
-
- if (fbw.FBW.Failures.spoilerl3.getValue() or blue_psi < 1500) {
- me["spoiler3Lex"].setColor(0.7333,0.3803,0);
- me["spoiler3Lrt"].setColor(0.7333,0.3803,0);
- if (spoiler_L3.getValue() < 1.5) {
- me["spoiler3Lf"].show();
- } else {
- me["spoiler3Lf"].hide();
- }
- } else {
- me["spoiler3Lex"].setColor(0.0509,0.7529,0.2941);
- me["spoiler3Lrt"].setColor(0.0509,0.7529,0.2941);
- me["spoiler3Lf"].hide();
- }
-
- if (fbw.FBW.Failures.spoilerl4.getValue() or yellow_psi < 1500) {
- me["spoiler4Lex"].setColor(0.7333,0.3803,0);
- me["spoiler4Lrt"].setColor(0.7333,0.3803,0);
- if (spoiler_L4.getValue() < 1.5) {
- me["spoiler4Lf"].show();
- } else {
- me["spoiler4Lf"].hide();
- }
- } else {
- me["spoiler4Lex"].setColor(0.0509,0.7529,0.2941);
- me["spoiler4Lrt"].setColor(0.0509,0.7529,0.2941);
- me["spoiler4Lf"].hide();
- }
-
- if (fbw.FBW.Failures.spoilerl5.getValue() or green_psi < 1500) {
- me["spoiler5Lex"].setColor(0.7333,0.3803,0);
- me["spoiler5Lrt"].setColor(0.7333,0.3803,0);
- if (spoiler_L5.getValue() < 1.5) {
- me["spoiler5Lf"].show();
- } else {
- me["spoiler5Lf"].hide();
- }
- } else {
- me["spoiler5Lex"].setColor(0.0509,0.7529,0.2941);
- me["spoiler5Lrt"].setColor(0.0509,0.7529,0.2941);
- me["spoiler5Lf"].hide();
- }
-
- if (fbw.FBW.Failures.spoilerr1.getValue() or green_psi < 1500) {
- me["spoiler1Rex"].setColor(0.7333,0.3803,0);
- me["spoiler1Rrt"].setColor(0.7333,0.3803,0);
- if (spoiler_R1.getValue() < 1.5) {
- me["spoiler1Rf"].show();
- } else {
- me["spoiler1Rf"].hide();
- }
- } else {
- me["spoiler1Rex"].setColor(0.0509,0.7529,0.2941);
- me["spoiler1Rrt"].setColor(0.0509,0.7529,0.2941);
- me["spoiler1Rf"].hide();
- }
-
- if (fbw.FBW.Failures.spoilerr2.getValue() or yellow_psi < 1500) {
- me["spoiler2Rex"].setColor(0.7333,0.3803,0);
- me["spoiler2Rrt"].setColor(0.7333,0.3803,0);
- if (spoiler_R2.getValue() < 1.5) {
- me["spoiler2Rf"].show();
- } else {
- me["spoiler2Rf"].hide();
- }
- } else {
- me["spoiler2Rex"].setColor(0.0509,0.7529,0.2941);
- me["spoiler2Rrt"].setColor(0.0509,0.7529,0.2941);
- me["spoiler2Rf"].hide();
- }
-
- if (fbw.FBW.Failures.spoilerr3.getValue() or blue_psi < 1500) {
- me["spoiler3Rex"].setColor(0.7333,0.3803,0);
- me["spoiler3Rrt"].setColor(0.7333,0.3803,0);
- if (spoiler_R3.getValue() < 1.5) {
- me["spoiler3Rf"].show();
- } else {
- me["spoiler3Rf"].hide();
- }
- } else {
- me["spoiler3Rex"].setColor(0.0509,0.7529,0.2941);
- me["spoiler3Rrt"].setColor(0.0509,0.7529,0.2941);
- me["spoiler3Rf"].hide();
- }
-
- if (fbw.FBW.Failures.spoilerr4.getValue() or yellow_psi < 1500) {
- me["spoiler4Rex"].setColor(0.7333,0.3803,0);
- me["spoiler4Rrt"].setColor(0.7333,0.3803,0);
- if (spoiler_R4.getValue() < 1.5) {
- me["spoiler4Rf"].show();
- } else {
- me["spoiler4Rf"].hide();
- }
- } else {
- me["spoiler4Rex"].setColor(0.0509,0.7529,0.2941);
- me["spoiler4Rrt"].setColor(0.0509,0.7529,0.2941);
- me["spoiler4Rf"].hide();
- }
-
- if (fbw.FBW.Failures.spoilerr5.getValue() or green_psi < 1500) {
- me["spoiler5Rex"].setColor(0.7333,0.3803,0);
- me["spoiler5Rrt"].setColor(0.7333,0.3803,0);
- if (spoiler_R5.getValue() < 1.5) {
- me["spoiler5Rf"].show();
- } else {
- me["spoiler5Rf"].hide();
- }
- } else {
- me["spoiler5Rex"].setColor(0.0509,0.7529,0.2941);
- me["spoiler5Rrt"].setColor(0.0509,0.7529,0.2941);
- me["spoiler5Rf"].hide();
- }
-
- # Show Brakes temperature
- if (L1BrakeTempc.getValue() > 300) {
- me["braketemp1"].setColor(0.7333,0.3803,0);
- } else {
- me["braketemp1"].setColor(0.0509,0.7529,0.2941);
- }
-
- if (L2BrakeTempc.getValue() > 300) {
- me["braketemp2"].setColor(0.7333,0.3803,0);
- } else {
- me["braketemp2"].setColor(0.0509,0.7529,0.2941);
- }
- if (R3BrakeTempc.getValue() > 300) {
- me["braketemp3"].setColor(0.7333,0.3803,0);
- } else {
- me["braketemp3"].setColor(0.0509,0.7529,0.2941);
- }
- if (R4BrakeTempc.getValue() > 300) {
- me["braketemp4"].setColor(0.7333,0.3803,0);
- } else {
- me["braketemp4"].setColor(0.0509,0.7529,0.2941);
- }
-
- # Brake arcs
- if (L1BrakeTempc.getValue() > 300) {
- me["toparc1"].setColor(0.7333,0.3803,0);
- } else
- {
- if (L1BrakeTempc.getValue() > 100 and L1BrakeTempc.getValue() < 300)
- {
- me["toparc1"].setColor(0.0509,0.7529,0.2941);
- }
- else {
- me["toparc1"].setColor(0.8078,0.8039,0.8078);
- }
- }
- if (L2BrakeTempc.getValue() > 300) {
- me["toparc2"].setColor(0.7333,0.3803,0);
- } else
- {
- if (L2BrakeTempc.getValue() > 100 and L2BrakeTempc.getValue() < 300)
- {
- me["toparc2"].setColor(0.0509,0.7529,0.2941);
- }
- else {
- me["toparc2"].setColor(0.8078,0.8039,0.8078);
- }
- }
- if (R3BrakeTempc.getValue() > 300) {
- me["toparc3"].setColor(0.7333,0.3803,0);
- } else
- {
- if (R3BrakeTempc.getValue() > 100 and R3BrakeTempc.getValue() < 300)
- {
- me["toparc3"].setColor(0.0509,0.7529,0.2941);
- }
- else {
- me["toparc3"].setColor(0.8078,0.8039,0.8078);
- }
- }
- if (R4BrakeTempc.getValue() > 300) {
- me["toparc4"].setColor(0.7333,0.3803,0);
- } else
- {
- if (R4BrakeTempc.getValue() > 100 and R4BrakeTempc.getValue() < 300)
- {
- me["toparc4"].setColor(0.0509,0.7529,0.2941);
- }
- else {
- me["toparc4"].setColor(0.8078,0.8039,0.8078);
- }
- }
- me["braketemp1"].setText(sprintf("%s", math.round(L1BrakeTempc.getValue(), 1)));
- me["braketemp2"].setText(sprintf("%s", math.round(L2BrakeTempc.getValue(), 1)));
- me["braketemp3"].setText(sprintf("%s", math.round(R3BrakeTempc.getValue(), 1)));
- me["braketemp4"].setText(sprintf("%s", math.round(R4BrakeTempc.getValue(), 1)));
- me["braketemp1"].show();
- me["braketemp2"].show();
- me["braketemp3"].show();
- me["braketemp4"].show();
- me["toparc1"].show();
- me["toparc2"].show();
- me["toparc3"].show();
- me["toparc4"].show();
-
- # Hide not yet implemented stuff
- me["leftuplock"].hide();
- me["noseuplock"].hide();
- me["rightuplock"].hide();
- me["tirepress1"].hide();
- me["tirepress2"].hide();
- me["tirepress3"].hide();
- me["tirepress4"].hide();
- me["tirepress5"].hide();
- me["tirepress6"].hide();
-
- me.updateBottomStatus();
- },
-};
-
-var canvas_lowerECAM_test = {
- init: func(canvas_group, file) {
- var font_mapper = func(family, weight) {
- return "LiberationFonts/LiberationSans-Regular.ttf";
- };
-
- canvas.parsesvg(canvas_group, file, {"font-mapper": font_mapper});
-
- var svg_keys = me.getKeys();
- foreach(var key; svg_keys) {
- me[key] = canvas_group.getElementById(key);
- }
-
- me.page = canvas_group;
-
- return me;
- },
- new: func(canvas_group, file) {
- var m = {parents: [canvas_lowerECAM_test]};
- m.init(canvas_group, file);
-
- return m;
- },
- getKeys: func() {
- return ["Test_white","Test_text"];
- },
- update: func() {
- var elapsedtime = pts.Sim.Time.elapsedSec.getValue();
- if (du4_test_time.getValue() + 1 >= elapsedtime) {
- me["Test_white"].show();
- me["Test_text"].hide();
- } else {
- me["Test_white"].hide();
- me["Test_text"].show();
- }
- },
-};
-
-setlistener("/sim/signals/fdm-initialized", func {
- lowerECAM_display = canvas.new({
- "name": "lowerECAM",
- "size": [1024, 1024],
- "view": [1024, 1024],
- "mipmapping": 1
- });
- lowerECAM_display.addPlacement({"node": "lecam.screen"});
- var groupApu = lowerECAM_display.createGroup();
- var groupBleed = lowerECAM_display.createGroup();
- var groupCond = lowerECAM_display.createGroup();
- var groupCrz = lowerECAM_display.createGroup();
- var groupDoor = lowerECAM_display.createGroup();
- var groupElec = lowerECAM_display.createGroup();
- var groupEng = lowerECAM_display.createGroup();
- var groupFctl = lowerECAM_display.createGroup();
- var groupFuel = lowerECAM_display.createGroup();
- var groupPress = lowerECAM_display.createGroup();
- var groupStatus = lowerECAM_display.createGroup();
- var groupHyd = lowerECAM_display.createGroup();
- var groupWheel = lowerECAM_display.createGroup();
- var group_test = lowerECAM_display.createGroup();
-
- lowerECAM_apu = canvas_lowerECAM_apu.new(groupApu, "Aircraft/A320-family/Models/Instruments/Lower-ECAM/res/apu.svg");
- lowerECAM_bleed = canvas_lowerECAM_bleed.new(groupBleed, "Aircraft/A320-family/Models/Instruments/Lower-ECAM/res/bleed.svg");
- lowerECAM_cond = canvas_lowerECAM_cond.new(groupCond, "Aircraft/A320-family/Models/Instruments/Lower-ECAM/res/cond.svg");
- lowerECAM_crz = canvas_lowerECAM_crz.new(groupCrz, "Aircraft/A320-family/Models/Instruments/Lower-ECAM/res/crz.svg");
- lowerECAM_door = canvas_lowerECAM_door.new(groupDoor, "Aircraft/A320-family/Models/Instruments/Lower-ECAM/res/door.svg");
- lowerECAM_elec = canvas_lowerECAM_elec.new(groupElec, "Aircraft/A320-family/Models/Instruments/Lower-ECAM/res/elec.svg");
- lowerECAM_eng = canvas_lowerECAM_eng.new(groupEng, "Aircraft/A320-family/Models/Instruments/Lower-ECAM/res/eng.svg");
- lowerECAM_fctl = canvas_lowerECAM_fctl.new(groupFctl, "Aircraft/A320-family/Models/Instruments/Lower-ECAM/res/fctl.svg");
- lowerECAM_fuel = canvas_lowerECAM_fuel.new(groupFuel, "Aircraft/A320-family/Models/Instruments/Lower-ECAM/res/fuel.svg");
- lowerECAM_press = canvas_lowerECAM_press.new(groupPress, "Aircraft/A320-family/Models/Instruments/Lower-ECAM/res/press.svg");
- lowerECAM_status = canvas_lowerECAM_status.new(groupStatus, "Aircraft/A320-family/Models/Instruments/Lower-ECAM/res/status.svg");
- lowerECAM_hyd = canvas_lowerECAM_hyd.new(groupHyd, "Aircraft/A320-family/Models/Instruments/Lower-ECAM/res/hyd.svg");
- lowerECAM_wheel = canvas_lowerECAM_wheel.new(groupWheel, "Aircraft/A320-family/Models/Instruments/Lower-ECAM/res/wheel.svg");
- lowerECAM_test = canvas_lowerECAM_test.new(group_test, "Aircraft/A320-family/Models/Instruments/Common/res/du-test.svg");
-
- lowerECAM_update.start();
- if (rate.getValue() > 1) {
- l_rateApply();
- }
-});
-
-var l_rateApply = func {
- lowerECAM_update.restart(0.05 * rate.getValue());
+foreach (var name; keys(input)) {
+ emesary.GlobalTransmitter.NotifyAll(notifications.FrameNotificationAddProperty.new("A320 System Display", name, input[name]));
}
-var lowerECAM_update = maketimer(0.05, func {
- canvas_lowerECAM_base.update();
-});
-
var showLowerECAM = func {
var dlg = canvas.Window.new([512, 512], "dialog").set("resize", 1);
- dlg.setCanvas(lowerECAM_display);
+ dlg.setCanvas(canvas_lowerECAM_base.canvas);
}
setlistener("/systems/electrical/bus/ac-2", func() {
- canvas_lowerECAM_base.updateDu4();
-}, 0, 0);
+ A320SD.MainScreen.powerTransient();
+}, 0, 0);
\ No newline at end of file
diff --git a/Models/Instruments/Lower-ECAM/res/apu.svg b/Models/Instruments/Lower-ECAM/res/apu.svg
index 3f443c84..5c375974 100644
--- a/Models/Instruments/Lower-ECAM/res/apu.svg
+++ b/Models/Instruments/Lower-ECAM/res/apu.svg
@@ -42,8 +42,8 @@
id="namedview371"
showgrid="true"
inkscape:zoom="0.76543687"
- inkscape:cx="663.42185"
- inkscape:cy="457.30228"
+ inkscape:cx="1295.1967"
+ inkscape:cy="1096.0742"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
@@ -201,7 +201,7 @@
x="465.99081"
id="tspan4176"
sodipodi:role="line">00
-
+ id="APUBleedValveCrossBar"
+ style="fill:#0dc04b;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="#rect5105-2" />
LEVEL
+ OFF
diff --git a/Models/Instruments/Lower-ECAM/res/bleed.svg b/Models/Instruments/Lower-ECAM/res/bleed.svg
index 2bc0a2b7..d08a757a 100644
--- a/Models/Instruments/Lower-ECAM/res/bleed.svg
+++ b/Models/Instruments/Lower-ECAM/res/bleed.svg
@@ -42,8 +42,8 @@
id="namedview371"
showgrid="true"
inkscape:zoom="0.73868665"
- inkscape:cx="272.22904"
- inkscape:cy="280.96379"
+ inkscape:cx="201.82373"
+ inkscape:cy="930.76571"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
@@ -67,8 +67,9 @@
x="817.61298"
height="5.1203089"
width="53.195583"
- id="rect5105-2"
- style="fill:#0dc04b;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ id="BLEED-XFEED-Cross"
+ style="fill:#0dc04b;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="#rect5105-2" />
+ id="BLEED-ENG-1-Cross"
+ style="fill:#0dc04b;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="#rect5105-2-5-7" />
+ id="BLEED-Ram-Air-Cross"
+ style="fill:#0dc04b;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="#rect5105-2-5-3" />
+ id="BLEED-Pack-1-Flow-Valve-Cross"
+ style="fill:#0dc04b;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="#rect5105-2-5-3-6-9" />
+ id="BLEED-Pack-2-Flow-Valve-Cross"
+ style="fill:#0dc04b;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="#rect5105-2-5-3-6-9-2" />
+ id="BLEED-ENG-2-Cross"
+ style="fill:#0dc04b;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="#rect5105-2-5-7-7" />
+ id="CONDHotAirValveCross"
+ style="fill:#0dc04b;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="#rect5105-2" />
00
-
@@ -37,16 +37,16 @@
guidetolerance="10"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
- inkscape:window-width="1920"
- inkscape:window-height="1047"
+ inkscape:window-width="1366"
+ inkscape:window-height="705"
id="namedview371"
showgrid="true"
- inkscape:zoom="0.5"
- inkscape:cx="703.8872"
- inkscape:cy="827.31856"
- inkscape:window-x="3840"
- inkscape:window-y="33"
- inkscape:window-maximized="0"
+ inkscape:zoom="1"
+ inkscape:cx="470.5927"
+ inkscape:cy="1012.5262"
+ inkscape:window-x="-8"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1"
inkscape:current-layer="svg2"
inkscape:snap-nodes="false"
inkscape:snap-global="false"
@@ -298,13 +298,13 @@
400
P
+ transform="matrix(-0.55570012,0,0,0.85384443,799.83103,551.6097)" />
N1
0.0
+ sodipodi:role="line">0.2
0.0
+ sodipodi:role="line">0.3
0.0
+ sodipodi:role="line">0.1
0.0
+ sodipodi:role="line">0.2
0
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:36px;line-height:1.25;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans';text-align:start;text-anchor:start;fill:#0dc04b;stroke-width:1px">500
@@ -37,14 +37,14 @@
guidetolerance="10"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
- inkscape:window-width="1920"
- inkscape:window-height="1030"
+ inkscape:window-width="1366"
+ inkscape:window-height="705"
id="namedview371"
showgrid="true"
- inkscape:zoom="0.7521195"
- inkscape:cx="944.15154"
- inkscape:cy="187.23728"
- inkscape:window-x="1592"
+ inkscape:zoom="0.35355339"
+ inkscape:cx="354.52267"
+ inkscape:cy="1842.4796"
+ inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg2">
@@ -81,8 +81,7 @@
style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Liberation Sans';letter-spacing:0px;word-spacing:0px;fill:#179ab7;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="500.75214"
y="977.31793"
- id="text6232"
- sodipodi:linespacing="0%">120000
°C
G.LOAD 0.6
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:32px;line-height:1.25;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans';text-align:center;text-anchor:middle;fill:#bb6100;fill-opacity:1">G.LOAD 0.6
SLIDE
+ style="font-size:32px;line-height:1.25;fill:#cecdce;fill-opacity:1;">SLIDE
SLIDE
+ style="font-size:32.86256409px;line-height:1.25;fill:#cecdce;fill-opacity:1;">SLIDE
SLIDE
+ y="522.78827"
+ style="font-size:32.86256409px;line-height:1.25;fill:#cecdce;fill-opacity:1;">SLIDE
SLIDE
+ style="font-size:32.86256409px;line-height:1.25;fill:#cecdce;fill-opacity:1;">SLIDE
+ inkscape:label="#path4438"
+ inkscape:connector-curvature="0" />
EMEREXIT
EMEREXIT
+ inkscape:label="#path4464"
+ inkscape:connector-curvature="0" />
SLIDE
+ style="font-size:32px;line-height:1.25;fill:#cecdce;fill-opacity:1;">SLIDE
SLIDE
+ style="font-size:32.86256409px;line-height:1.25;fill:#cecdce;fill-opacity:1;">SLIDE
OXY
+ x="852.17371"
+ y="64.937149"
+ style="font-size:30.04751396px;line-height:0;fill:#cecdce;fill-opacity:1;stroke-width:2.50395942px;">CKPT OXY
REGUL LO PR
+ x="799.85938"
+ y="133.49768"
+ style="font-size:30.04800034px;line-height:0">REGUL LO PR
1300
PSI
+ x="953.60229"
+ y="100.29736"
+ style="font-size:30px;line-height:0">PSI
+ transform="translate(12.944435,6.250187)">
V/S
1650
FT/MIN
-
-
-
+ id="DOOR-VS-Arrow-DN" />
-
-
-
+ id="DOOR-VS-Arrow-UP" />
diff --git a/Models/Instruments/Lower-ECAM/res/eng.svg b/Models/Instruments/Lower-ECAM/res/eng.svg
index 212bd01f..4056f45c 100644
--- a/Models/Instruments/Lower-ECAM/res/eng.svg
+++ b/Models/Instruments/Lower-ECAM/res/eng.svg
@@ -12,8 +12,8 @@
viewBox="0 0 1024 1024"
version="1.1"
id="svg2"
- inkscape:version="0.91 r13725"
- sodipodi:docname="eng-eis2.svg">
+ inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
+ sodipodi:docname="eng.svg">
@@ -37,14 +37,14 @@
guidetolerance="10"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
- inkscape:window-width="1920"
- inkscape:window-height="1030"
+ inkscape:window-width="1366"
+ inkscape:window-height="705"
id="namedview371"
showgrid="true"
- inkscape:zoom="0.5"
- inkscape:cx="988.67552"
- inkscape:cy="398.82462"
- inkscape:window-x="1592"
+ inkscape:zoom="1"
+ inkscape:cx="593.89152"
+ inkscape:cy="650.40507"
+ inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg2">
@@ -81,8 +81,7 @@
style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Liberation Sans';letter-spacing:0px;word-spacing:0px;fill:#179ab7;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="500.75214"
y="977.31793"
- id="text6232"
- sodipodi:linespacing="0%">120000
°C
G.LOAD 0.6
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:32px;line-height:1.25;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans';text-align:center;text-anchor:middle;fill:#bb6100;fill-opacity:1">G.LOAD 0.6
Â
0000
+ x="264.69104"
+ y="181.87344"
+ style="font-size:30.0000782px;line-height:1.25;fill:#0dc04b;fill-opacity:1;stroke-width:0.75000191">0000
0000
+ CLOG
+ CLOG
+ CLOG
+ CLOG
+ 22
+ 0.6
+ 0.1
+ 0.6
+ 0.1
+ 22
diff --git a/Models/Instruments/Lower-ECAM/res/fctl.svg b/Models/Instruments/Lower-ECAM/res/fctl.svg
index c691e798..3d86bd51 100644
--- a/Models/Instruments/Lower-ECAM/res/fctl.svg
+++ b/Models/Instruments/Lower-ECAM/res/fctl.svg
@@ -12,7 +12,7 @@
viewBox="0 0 1024 1024"
version="1.1"
id="svg2"
- inkscape:version="0.91 r13725"
+ inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="fctl.svg">
@@ -37,14 +37,14 @@
guidetolerance="10"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
- inkscape:window-width="1920"
- inkscape:window-height="1030"
+ inkscape:window-width="1366"
+ inkscape:window-height="705"
id="namedview371"
- showgrid="true"
- inkscape:zoom="1"
- inkscape:cx="683.58709"
- inkscape:cy="286.7536"
- inkscape:window-x="1592"
+ showgrid="false"
+ inkscape:zoom="1.28"
+ inkscape:cx="608.14718"
+ inkscape:cy="323.45523"
+ inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg2">
@@ -81,8 +81,7 @@
style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Liberation Sans';letter-spacing:0px;word-spacing:0px;fill:#179ab7;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="500.75214"
y="977.31793"
- id="text6232"
- sodipodi:linespacing="0%">120000
°C
G.LOAD 0.6
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:32px;line-height:1.25;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans';text-align:center;text-anchor:middle;fill:#bb6100;fill-opacity:1">G.LOAD 0.6
Â
-
DN
°
+ style="font-size:32px;line-height:1.25;fill:#179ab7;fill-opacity:1;">°
 AIL
L
 AIL
R
+ y="408.59415" />
G
- B
+ y="408.1442" />
B
+ y="408.1442" />
G
L
R
+ y="408.69415" />
B
+ y="664.86768" />
B
+ y="664.86139" />
G
+ y="663.84418" />
B
+ y="663.84418" />
Y
ELEV
ELEV
5
+
diff --git a/Models/Instruments/Lower-ECAM/res/fuel.svg b/Models/Instruments/Lower-ECAM/res/fuel.svg
index a2d0ce43..d91dff25 100644
--- a/Models/Instruments/Lower-ECAM/res/fuel.svg
+++ b/Models/Instruments/Lower-ECAM/res/fuel.svg
@@ -50,8 +50,8 @@
id="namedview371"
showgrid="false"
inkscape:zoom="0.68"
- inkscape:cx="817.73616"
- inkscape:cy="1022.6281"
+ inkscape:cx="434.43172"
+ inkscape:cy="1022.8371"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
@@ -148,8 +148,9 @@
x="817.61298"
height="5.1203089"
width="53.195583"
- id="rect5105-2-5-3"
- style="fill:#0dc04b;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ id="FUEL-XFEED-Cross"
+ style="fill:#0dc04b;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="#rect5105-2-5-3" />
0000
+ style="font-size:30.1989994px;line-height:0;text-align:end;text-anchor:end;">0000
0000
000
+ style="font-size:30.1989994px;line-height:0;text-anchor:middle;text-align:center;">000
000
+ style="font-size:30.1989994px;line-height:0;text-align:end;text-anchor:end;">000
+ id="FUEL-ENG-Master-1-Cross"
+ style="fill:#0dc04b;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="#rect5105-2-5-3-4" />
+ id="FUEL-ENG-Master-2-Cross"
+ style="fill:#0dc04b;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="#rect5105-2-5-3-4-3" />
-
-
-
-
+
+
+
+
+
+
-
-
-
-
+
+
+
+
+
+
-
-
-
-
+
+
+
+
+
+
-
-
+
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
-
+
+
+
+
+
+
+ ry="0"
+ transform="matrix(0,1,-1,0,0,0)"
+ y="-261.75253"
+ x="232.60442"
+ height="18.894773"
+ width="5.3955846"
+ id="FUEL-APU-line"
+ style="fill:#0dc04b;fill-opacity:1;stroke:none;stroke-width:1.09431255;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ sodipodi:nodetypes="cccccsc"
+ inkscape:connector-curvature="0"
+ id="FUEL-APU-arrow"
+ d="m 209.24999,234.99999 15.75,-7.5 16.5,-8.25 v 17.25 l 0,15.30854 c 0,0 -1.69343,-0.68362 -19.69533,-10.2091 -11.05467,-5.84944 -12.55467,-6.59944 -12.55467,-6.59944 z"
+ style="fill:none;stroke:#0dc04b;stroke-width:2.77499986;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.80000019;stroke-dasharray:none;stroke-opacity:1" />
0000
+ style="font-size:30px;line-height:1.25;text-align:end;text-anchor:end;fill:#0dc04b;fill-opacity:1;stroke-width:0.75;">0000
0000
+ style="font-size:30.00000191px;line-height:1.25;text-align:end;text-anchor:end;fill:#0dc04b;fill-opacity:1;stroke-width:0.75;">0000
0000
+ style="font-size:30.00000191px;line-height:1.25;text-align:end;text-anchor:end;fill:#0dc04b;fill-opacity:1;stroke-width:0.75;">0000
@@ -55,10 +55,10 @@
inkscape:window-width="1366"
inkscape:window-height="705"
id="namedview371"
- showgrid="true"
- inkscape:zoom="4.0298682"
- inkscape:cx="632.99286"
- inkscape:cy="609.55322"
+ showgrid="false"
+ inkscape:zoom="5.6568542"
+ inkscape:cx="1081.6807"
+ inkscape:cy="259.15874"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
@@ -84,8 +84,9 @@
x="817.61298"
height="5.1203089"
width="53.195583"
- id="rect5105-2-5-3"
- style="fill:#0dc04b;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ id="Fire-Valve-Green-Cross"
+ style="fill:#0dc04b;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="#rect5105-2-5-3" />
+ style="fill:#0dc04b;fill-opacity:1;stroke:none;stroke-width:0.99974996;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">
+ style="fill:#0dc04b;fill-opacity:1;stroke:none;stroke-width:0.99974996;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ style="fill:#0dc04b;fill-opacity:1;stroke:none;stroke-width:0.99974996;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ style="fill:#0dc04b;fill-opacity:1;stroke:none;stroke-width:0.99974996;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ style="fill:#0dc04b;fill-opacity:1;stroke:none;stroke-width:0.99974996;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ id="Fire-Valve-Yellow-Cross"
+ style="fill:#0dc04b;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="#rect5105-2-5-3-8" />
-
+ id="Green-Line-Middle"
+ style="fill:#0dc04b;fill-opacity:1;stroke:none;stroke-width:1.31405532;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="#rect5105-6-0-7-8-6-8-8-7-3-8-6" />
+
+ id="Green-Line-Top"
+ style="fill:#0dc04b;fill-opacity:1;stroke:none;stroke-width:3.44869995;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="#rect5105-6-0-7-8-6-8-8-7-3-8-6-8" />
-
+ id="Yellow-Line-Middle"
+ style="fill:#0dc04b;fill-opacity:1;stroke:none;stroke-width:1.24083376;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="#rect5105-6-0-7-8-6-8-8-7-3-8-6-4" />
+
+ id="Yellow-Line-Top"
+ style="fill:#0dc04b;fill-opacity:1;stroke:none;stroke-width:3.50812292;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="#rect5105-6-0-7-8-6-8-8-7-3-8-6-8-3" />
+ id="Blue-Line-Top"
+ style="fill:#0dc04b;fill-opacity:1;stroke:none;stroke-width:3.83536959;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="#rect5105-6-0-7-8-6-8-8-7-3-8-6-8-9" />
+ id="Blue-Line-Bottom"
+ style="fill:#0dc04b;fill-opacity:1;stroke:none;stroke-width:2.05138826;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:label="#rect5105-6-0-7-8-6-8-8-7-3-8-6-8-9-6" />
+
@@ -882,7 +902,7 @@
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path5561"
- d="m 812.24998,856.74997 h -17.25"
+ d="m 812.24998,856.74997 h -17.0677"
style="fill:none;stroke:#0dc04b;stroke-width:2.625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ style="fill:#cecdce;fill-opacity:1;stroke:none;stroke-width:2.57043672;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ d="m 813.15523,823.32891 h 11.71524 v 33.68651 h -11.71524 z"
+ style="fill:none;stroke:#bb6100;stroke-width:2.10803151;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+
+ style="fill:#cecdce;fill-opacity:1;stroke:none;stroke-width:2.49036217;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ d="m 813.26886,814.62253 h 11.48798 v 42.27926 h -11.48798 z"
+ style="fill:none;stroke:#bb6100;stroke-width:2.33861709;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+
+ style="fill:#cecdce;fill-opacity:1;stroke:none;stroke-width:2.63435125;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ d="m 812.88109,830.65833 h 12.26352 v 26.63123 h -12.26352 z"
+ style="fill:none;stroke:#bb6100;stroke-width:1.91768491;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
00
- 00
+ LO
diff --git a/Models/Instruments/Lower-ECAM/res/press.svg b/Models/Instruments/Lower-ECAM/res/press.svg
index e2329db1..92a6e964 100644
--- a/Models/Instruments/Lower-ECAM/res/press.svg
+++ b/Models/Instruments/Lower-ECAM/res/press.svg
@@ -12,7 +12,7 @@
viewBox="0 0 1024 1024"
version="1.1"
id="svg2"
- inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
+ inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="press.svg">
@@ -41,9 +41,9 @@
inkscape:window-height="705"
id="namedview371"
showgrid="true"
- inkscape:zoom="0.88"
- inkscape:cx="397.64824"
- inkscape:cy="880.3857"
+ inkscape:zoom="0.64"
+ inkscape:cx="770.48025"
+ inkscape:cy="620.45739"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
@@ -467,7 +467,7 @@
style="font-size:32.18700027px;line-height:0">SYS2
MAN
+ style="font-size:32.18700027px;line-height:0;fill:#0dc04b;fill-opacity:1;">MAN
PACK 1
+ style="font-size:34.92427444px;line-height:1.25;fill:#cecdce;fill-opacity:1;stroke-width:0.87310684;">PACK 1
PACK 2
+ style="font-size:34.92399979px;line-height:1.25;fill:#cecdce;fill-opacity:1;">PACK 2
+ id="PRESS-Pack-1-Triangle"
+ inkscape:connector-curvature="0"
+ inkscape:label="#path5062" />
+ id="PRESS-Pack-2-Triangle"
+ inkscape:connector-curvature="0"
+ inkscape:label="#path5062-3" />
- -
0
- .
- 1
00
- NORM BRK
+ style="font-size:32px;line-height:1.25;fill:#bb6100;fill-opacity:1;">NORM BRK
999
|||
+ style="font-size:21.63888741px;line-height:1.25;fill:#bb6100;fill-opacity:1;">|||
|||
+ style="font-size:21.63888741px;line-height:1.25;fill:#bb6100;fill-opacity:1;">|||
|||
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:21.63888741px;line-height:1.25;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans';fill:#bb6100;fill-opacity:1;">|||
REL
|||
+ style="font-size:23.3301487px;line-height:1.25;fill:#bb6100;fill-opacity:1;">|||
|||
+ style="font-size:23.3301487px;line-height:1.25;fill:#bb6100;fill-opacity:1;">|||
|||
+ style="font-size:23.3301487px;line-height:1.25;fill:#bb6100;fill-opacity:1;">|||
|||
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:23.3301487px;line-height:1.25;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans';fill:#bb6100;fill-opacity:1;">|||
2
+ style="font-size:32px;line-height:1.25;fill:#0dc04b;fill-opacity:1;">2
1
+ style="font-size:32px;line-height:1.25;fill:#0dc04b;fill-opacity:1;">1
|||
+ style="font-size:21.63888741px;line-height:1.25;stroke-width:1px;fill:#bb6100;fill-opacity:1;">|||
ACCU ONLY
+ x="441.43594"
+ y="707.69073">ACCU ONLY
1.75 or getprop("/fdm/jsbsim/hydraulics/stabilizer/final-deg") < -3.65 or getprop("/fdm/jsbsim/hydraulics/rudder/trim-cmd-deg") < -3.55 or getprop("/fdm/jsbsim/hydraulics/rudder/trim-cmd-deg") > 3.55) {
setprop("/ECAM/to-config-normal", 0);
} else {
@@ -3296,7 +3295,7 @@ var messages_config_memo = func {
}
var messages_memo = func {
- phaseVarMemo2 = phaseNode.getValue();
+ phaseVarMemo2 = pts.ECAM.fwcWarningPhase.getValue();
if (getprop("/services/fuel-truck/enable") == 1 and toMemoLine1.active != 1 and ldgMemoLine1.active != 1) {
refuelg.active = 1;
} else {
@@ -3399,7 +3398,7 @@ var messages_memo = func {
}
var messages_right_memo = func {
- phaseVarMemo3 = phaseNode.getValue();
+ phaseVarMemo3 = pts.ECAM.fwcWarningPhase.getValue();
if (FWC.Timer.toInhibitOutput.getValue() == 1) {
to_inhibit.active = 1;
} else {
diff --git a/Nasal/ECAM/SystemDisplay.nas b/Nasal/ECAM/SystemDisplay.nas
index 7fa71d20..d5724414 100644
--- a/Nasal/ECAM/SystemDisplay.nas
+++ b/Nasal/ECAM/SystemDisplay.nas
@@ -28,7 +28,7 @@ var SystemDisplayController = {
displayedPage: nil,
lastDisplayedPage: nil,
lastMode: nil,
- mode: 0, # 0 = man, 1 = warning, 2 = advisory (not used yet), 3 = auto
+ mode: 3, # 0 = man, 1 = warning, 2 = advisory (not used yet), 3 = auto
tempFWCPhase: nil,
tempElapsedTime: nil,
tempEngineModeSel: nil,
@@ -37,6 +37,7 @@ var SystemDisplayController = {
ECAMTimer.start();
},
autoCallLoop: func() {
+ if (me.mode != 3) { return; }
me.tempFWCPhase = pts.ECAM.fwcWarningPhase.getValue();
if (me.Display.APU) {
diff --git a/Nasal/FBW/it-fbw.nas b/Nasal/FBW/it-fbw.nas
index 3772bfed..7a9daa22 100644
--- a/Nasal/FBW/it-fbw.nas
+++ b/Nasal/FBW/it-fbw.nas
@@ -67,8 +67,8 @@ var FBW = {
rtlu1: props.globals.getNode("/systems/failures/fctl/rtlu-1"),
rtlu2: props.globals.getNode("/systems/failures/fctl/rtlu-2"),
rtlu2: props.globals.getNode("/systems/failures/fctl/rtlu-2"),
- ths: props.globals.getNode("/systems/failures/fctl/ths-jam"),
- spoilerl1: props.globals.getNode("/systems/failures/spoilers/spoiler-l1"),
+ ths: props.globals.getNode(""),
+ spoilerl1: props.globals.getNode(""),
spoilerl2: props.globals.getNode("/systems/failures/spoilers/spoiler-l2"),
spoilerl3: props.globals.getNode("/systems/failures/spoilers/spoiler-l3"),
spoilerl4: props.globals.getNode("/systems/failures/spoilers/spoiler-l4"),
diff --git a/Nasal/Libraries/libraries.nas b/Nasal/Libraries/libraries.nas
index 01ceae0f..183d09c4 100644
--- a/Nasal/Libraries/libraries.nas
+++ b/Nasal/Libraries/libraries.nas
@@ -391,6 +391,10 @@ var input = {
"seatbelt": "/controls/switches/seatbelt-sign",
"noSmoking": "/controls/switches/no-smoking-sign",
"gearPosNorm": "/gear/gear[0]/position-norm",
+ "gearPosNorm1": "/gear/gear[1]/position-norm",
+ "gearPosNorm2": "/gear/gear[2]/position-norm",
+ "engine1Running": "/engines/engine[0]/running",
+ "engine2Running": "/engines/engine[1]/running",
};
foreach (var name; keys(input)) {
diff --git a/Nasal/Libraries/property-tree-setup.nas b/Nasal/Libraries/property-tree-setup.nas
index d9ab95fa..99c33950 100644
--- a/Nasal/Libraries/property-tree-setup.nas
+++ b/Nasal/Libraries/property-tree-setup.nas
@@ -83,6 +83,7 @@ var Engines = {
n1Actual: [props.globals.getNode("/engines/engine[0]/n1-actual"), props.globals.getNode("/engines/engine[1]/n1-actual")],
n2Actual: [props.globals.getNode("/engines/engine[0]/n2-actual"), props.globals.getNode("/engines/engine[1]/n2-actual")],
oilPsi: [props.globals.getNode("/engines/engine[0]/oil-psi-actual"), props.globals.getNode("/engines/engine[1]/oil-psi-actual")],
+ oilQt: [props.globals.getNode("/engines/engine[0]/oil-qt-actual"), props.globals.getNode("/engines/engine[1]/oil-qt-actual")],
thrust: [props.globals.getNode("/engines/engine[0]/thrust-lb"), props.globals.getNode("/engines/engine[1]/thrust-lb")],
reverser: [props.globals.getNode("/engines/engine[0]/reverser-pos-norm"), props.globals.getNode("/engines/engine[1]/reverser-pos-norm")],
state: [props.globals.getNode("/engines/engine[0]/state"), props.globals.getNode("/engines/engine[1]/state")],
diff --git a/Nasal/Systems/hydraulics.nas b/Nasal/Systems/hydraulics.nas
index 04bef4bc..7e75f138 100644
--- a/Nasal/Systems/hydraulics.nas
+++ b/Nasal/Systems/hydraulics.nas
@@ -64,9 +64,9 @@ var HYD = {
},
init: func() {
me.resetFail();
- me.Qty.blueInput.setValue(math.round((rand() * 4) + 8 , 0.1)); # Random between 8 and 12
- me.Qty.greenInput.setValue(math.round((rand() * 4) + 8 , 0.1)); # Random between 8 and 12
- me.Qty.yellowInput.setValue(math.round((rand() * 4) + 8 , 0.1)); # Random between 8 and 12
+ me.Qty.blueInput.setValue(math.round((rand() * 2) + 6 , 0.1)); # Random between 6 and 8
+ me.Qty.greenInput.setValue(math.round((rand() * 4) + 14 , 0.1)); # Random between 14 and 18
+ me.Qty.yellowInput.setValue(math.round((rand() * 4) + 10 , 0.1)); # Random between 10 and 14
me.Switch.blueElec.setValue(1);
me.Switch.blueElecOvrd.setValue(0);
me.Switch.greenEDP.setValue(1);
diff --git a/Nasal/emesary/exec.nas b/Nasal/emesary/exec.nas
index eda3c5e9..c00a8579 100644
--- a/Nasal/emesary/exec.nas
+++ b/Nasal/emesary/exec.nas
@@ -42,6 +42,7 @@ input = {
frame_rate: "/sim/frame-rate",
elapsedTime: "/sim/time/elapsed-sec",
FWCPhase: "/ECAM/warning-phase",
+ acconfigUnits: "/systems/acconfig/options/weight-kgs",
# Just about everything uses these properties at some stage, lets add them here!
gear0Wow: "/gear/gear[0]/wow",
diff --git a/Systems/a320-hydraulic.xml b/Systems/a320-hydraulic.xml
index 4be8b6b0..3f8a0c19 100644
--- a/Systems/a320-hydraulic.xml
+++ b/Systems/a320-hydraulic.xml
@@ -29,13 +29,25 @@
-
+
/systems/failures/hydraulic/green-leak eq 1
+
+
+
+ /systems/hydraulic/green-qty-cmd-cmd
+
+ 2.1
+ /gear/gear[0]/position-norm
+
+
+
+
+