diff --git a/A320-main.xml b/A320-main.xml
index 02cc8599..8daf31d3 100644
--- a/A320-main.xml
+++ b/A320-main.xml
@@ -4734,6 +4734,8 @@
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.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..cb4e9fe5
--- /dev/null
+++ b/Models/Instruments/Lower-ECAM/Lower-ECAM-APU.nas
@@ -0,0 +1,309 @@
+# 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) {
+ var obj = {parents: [canvas_lowerECAMPageApu,canvas_lowerECAM_base] };
+ obj.group = obj.canvas.createGroup();
+
+ 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) {
+ 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 (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);
+ }
+ },
+};
+
+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",
+ 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.nas b/Models/Instruments/Lower-ECAM/Lower-ECAM.nas
index f64db03a..12f2954a 100644
--- a/Models/Instruments/Lower-ECAM/Lower-ECAM.nas
+++ b/Models/Instruments/Lower-ECAM/Lower-ECAM.nas
@@ -1,356 +1,6 @@
# 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 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() {
- 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();
-
-var canvas_lowerECAMPage =
-{
- new: func(svg) {
- var obj = {parents: [canvas_lowerECAMPage,canvas_lowerECAM_base] };
- obj.group = obj.canvas.createGroup();
-
- 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) {
- 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"];
- },
- updateTemperatures: 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);
- }
- },
- 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);
- }
-
- 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);
- }
-
- me.updateTemperatures();
- },
- updatePower: func() {
- 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);
- }
- },
-};
-
var SystemDisplayPageRecipient =
{
new: func(_ident)
@@ -375,36 +25,14 @@ var SystemDisplayPageRecipient =
return SDRecipient;
},
pageList: {
- apu: canvas_lowerECAMPage.new("Aircraft/A320-family/Models/Instruments/Lower-ECAM/res/apu.svg"),
+ apu: canvas_lowerECAMPageApu.new("Aircraft/A320-family/Models/Instruments/Lower-ECAM/res/apu.svg"),
},
};
var A320SD = SystemDisplayPageRecipient.new("A320 SD");
emesary.GlobalTransmitter.Register(A320SD);
-
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",
- 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",
-
gForce: "/accelerations/pilot-gdamped",
gForceDisplay: "/ECAM/Lower/g-force-display",
hour: "/sim/time/utc/hour",