From 709d32ed8eff5c5e80b28951236473609dad61a6 Mon Sep 17 00:00:00 2001 From: Jonathan Redpath Date: Fri, 6 Apr 2018 15:45:09 +0100 Subject: [PATCH 01/15] bugfix --- Nasal/electrical.nas | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Nasal/electrical.nas b/Nasal/electrical.nas index 4ab88759..0c2fbf16 100644 --- a/Nasal/electrical.nas +++ b/Nasal/electrical.nas @@ -758,7 +758,7 @@ var ELEC = { foreach(var lighta; lights) { power_consumption = lighta.power_consumption(); - if (getprop(screena.elec_prop) != 0 and getprop(lighta.control_prop) != 0) { + if (getprop(lighta.elec_prop) != 0 and getprop(lighta.control_prop) != 0) { setprop("/systems/electrical/light/" ~ lighta.name ~ "/watts", power_consumption); } else { setprop("/systems/electrical/light/" ~ lighta.name ~ "/watts", 0); From 9aa8012ce481e3c0893d9570a46df5cb5c41706d Mon Sep 17 00:00:00 2001 From: Jonathan Redpath Date: Mon, 9 Apr 2018 16:07:31 +0100 Subject: [PATCH 02/15] Basic ECAM (WIP, potentially broken) --- A320-main.xml | 3 + Nasal/ECAM-controller.nas | 115 ++++++++++++++++++++++++++++++++++++++ Nasal/libraries.nas | 2 + 3 files changed, 120 insertions(+) create mode 100644 Nasal/ECAM-controller.nas diff --git a/A320-main.xml b/A320-main.xml index 8b3c955c..d6db5130 100644 --- a/A320-main.xml +++ b/A320-main.xml @@ -1452,6 +1452,9 @@ Aircraft/IDG-A32X/Models/Instruments/MCDU/MCDU.nas + + Aircraft/IDG-A32X/Nasal/ECAM-controller.nas + Aircraft/IDG-A32X/Nasal/icing.nas diff --git a/Nasal/ECAM-controller.nas b/Nasal/ECAM-controller.nas new file mode 100644 index 00000000..2b0141a4 --- /dev/null +++ b/Nasal/ECAM-controller.nas @@ -0,0 +1,115 @@ +# A3XX Electronic Centralised Aircraft Monitoring System +# Jonathan Redpath (legoboyvdlp) + +############################################## +# Copyright (c) Joshua Davidson (it0uchpods) # +############################################## + +# Colors: +# 1 - Red, 2 - Amber, 3 - Cyan 4 - Green 5 - White + +# Priority: 1 - LEVEL 3 2 - LEVEL 2 3 - LEVEL 1 4 - LEVEL 0 5 - MEMO +# LEVEL 3 has priority over all other warnings +# LEVEL 2 has priority over 1 and 0 +# LEVEL 1 has priority over 0 + +# LEVEL 3 Messages Priority: +# Red visual warning, repetitive chime or sound +# 1 Stall +# 2 Over speed +# 3 Engine dual failure +# 4 Engine fire +# 5 APU fire +# 6 Takeoff configuration +# 7 Sidestick fault +# 8 Excessive cabin altitude +# 9 Engine oil lo pressure +# 10 L + R Elevator fault +# 11 Landing gear +# 12 Autopilot disconnection +# 13 Auto land +# 14 Smoke +# 15 Emergency configuration +# 16 Dual hydraulic failure + +# LEVEL 2 Messages: +# Amber warning, single chime + +# LEVEL 1 Messages: +# Amber warning, no chime + +# LEVEL 0 Messages: +# No visual warning or chime: ECAM blue, green, or white message + +# TYPES: Independent, Primary and Secondary, Status, and MEMO + +# Operation: FWC receives electrical boolean or numeric signals, from the systems, and outputs a message, audible warning, or visual alert + +# Electrical Connection: FWC1 is controlled by AC ESS, FWC2 by AC BUS 2 + +# Sounds: reduce volume by 6DB is engines are off + +# ARINC 429: 100kb/s (high speed) + +# PHASE: /FMGC/status/phase + +# DISPLAY: 1 - EWD 2 - MEMO 3 - STATUS + +var message = { + name: "", + text: "", + priority: 0, + logic_prop: "", + color: "", + display: "", + new: func(name,text,priority,logic_prop,color,display) { + var l = {parents:[message]}; + + l.name = name; + l.text = text; + l.priority = priority; + l.logic_prop = logic_prop; + l.color = color; + l.display = display; + + return l; + } +}; + +var messages = nil; + + +var ECAM_system = { + init: func() { + messages = [message.new(name: "RAM AIR P/B ON", text: "RAM AIR ON", priority: 5, logic_prop: "/controls/pneumatic/switches/ram-air", color: 4, display: 2), + message.new(name: "EMERGENCY GENERATOR", text: "EMER GEN", priority: 5, logic_prop: "/controls/electrical/switches/emer-gen", color: 4, display: 2), + message.new(name: "GROUND SPOILERS ARMED", text: "GND SPLRS ARMED", priority: 5, logic_prop: "/controls/flight/speedbrake-arm", color: 4, display: 1)]; + active_messages = []; + + loop: func() { + foreach(var message_controller; messages) { + if (getprop(message_controller.logic_prop) == 1){ + setprop("/ECAM/msg/line1", message_controller.text); + if (getprop("/ECAM/left-msg") == "NONE") { + setprop("/ECAM/left-msg","MSG") + } + if (message_controller.color == 1) { + setprop("/ECAM/msg/line1c", "r"); + } else if (message_controller.color == 2) { + setprop("/ECAM/msg/line1c", "a"); + } else if (message_controller.color == 3) { + setprop("/ECAM/msg/line1c", "b"); + } else if (message_controller.color == 4) { + setprop("/ECAM/msg/line1c", "g"); + } else if (message_controller.color == 5) { + setprop("/ECAM/msg/line1c", "w"); + } else { + setprop("/ECAM/msg/line1c", "w"); + } + } else { + setprop("/ECAM/msg/line1", ""); + + } + } + }, +}; diff --git a/Nasal/libraries.nas b/Nasal/libraries.nas index a7540f01..471f5fa0 100644 --- a/Nasal/libraries.nas +++ b/Nasal/libraries.nas @@ -186,6 +186,7 @@ var systemsInit = func { libraries.CVR.start(); icing.icingInit(); lightsLoop.start(); + ecam.ECAM_system.init(); var autopilot = gui.Dialog.new("sim/gui/dialogs/autopilot/dialog", "Aircraft/IDG-A32X/Systems/autopilot-dlg.xml"); setprop("/it-autoflight/input/fd1", 1); setprop("/it-autoflight/input/fd2", 1); @@ -204,6 +205,7 @@ var systemsLoop = maketimer(0.1, func { systems.FUEL.loop(); systems.ADIRS.loop(); libraries.ECAM.loop(); + ecam.ECAM_system.loop(); fadec.fadecLoop(); if ((getprop("/controls/pneumatic/switches/groundair") or getprop("/controls/switches/cart")) and ((getprop("/velocities/groundspeed-kt") > 2) or getprop("/controls/gear/brake-parking") == 0)) { From 92e541bec672f22a991af0f912adbf77d4ba19a1 Mon Sep 17 00:00:00 2001 From: Jonathan Redpath Date: Tue, 5 Jun 2018 21:12:28 +0100 Subject: [PATCH 03/15] Update ECAM logic based off code originally by Gijs de Rooy --- Nasal/ECAM-controller.nas | 152 ++++++++++++++++++++++++++------------ Nasal/ECAM.nas | 4 +- Nasal/libraries.nas | 3 +- 3 files changed, 107 insertions(+), 52 deletions(-) diff --git a/Nasal/ECAM-controller.nas b/Nasal/ECAM-controller.nas index 2b0141a4..fed32959 100644 --- a/Nasal/ECAM-controller.nas +++ b/Nasal/ECAM-controller.nas @@ -54,62 +54,116 @@ # PHASE: /FMGC/status/phase # DISPLAY: 1 - EWD 2 - MEMO 3 - STATUS +var ewd = props.globals.initNode("/instrumentation/ewd"); +var ewd_msg_three = ewd.initNode("msg/priority_3"," ","STRING"); +var ewd_msg_two = ewd.initNode("msg/priority_2"," ","STRING"); +var ewd_msg_one = ewd.initNode("msg/priority_1"," ","STRING"); +var ewd_msg_zero = ewd.initNode("msg/priority_0"," ","STRING"); +var ewd_msg_memo = ewd.initNode("msg/memo"," ","STRING"); +var msgs_priority_3 = []; +var msgs_priority_2 = []; +var msgs_priority_1 = []; +var msgs_priority_0 = []; +var msgs_memo = []; +var active_messages = []; +var num_lines = 6; +var msg = nil; +var spacer = nil; +var line = nil; -var message = { - name: "", - text: "", - priority: 0, - logic_prop: "", - color: "", - display: "", - new: func(name,text,priority,logic_prop,color,display) { - var l = {parents:[message]}; - - l.name = name; - l.text = text; - l.priority = priority; - l.logic_prop = logic_prop; - l.color = color; - l.display = display; - - return l; +# messages logic and added to arrays + +var messages_priority_3 = func { + if (getprop("/controls/flight/flap-pos") > 2 and getprop("/position/gear-agl-ft") < 750 and getprop("/gear/gear[1]/position-norm") != 1 and getprop("/FMGC/status/phase") == 5) { + append(msgs_priority_3,"L/G GEAR NOT DOWN"); + append(active_messages,"L/G GEAR NOT DOWN"); } -}; +} +var messages_priority_2 = func {} +var messages_priority_1 = func {} +var messages_priority_0 = func {} +var messages_memo = func { + if (getprop("controls/flight/speedbrake-arm") == 1) { + append(msgs_memo,"GND SPLRS ARMED"); + append(active_messages,"GND SPLRS ARMED"); + } +} -var messages = nil; +# messages sent to property tree +var update_ewd = func(msgs_priority_3,msgs_priority_2,msgs_priority_1,msgs_priority_0,msgs_memo) { + msg = ""; + spacer = ""; + line = 0; + for(var i=0; i 0) { + setprop("/ECAM/left-msg", "MSG"); + } else if (getprop("/FMGC/status/phase") == 0 and stateL == 3 and stateR == 3 and getprop("/ECAM/engine-start-time") + 120 < getprop("/sim/time/elapsed-sec") and getprop("/ECAM/to-memo-enable") == 1 and wow == 1) { setprop("/ECAM/left-msg", "TO-MEMO"); } else if (getprop("/ECAM/ldg-memo-enable") == 1) { setprop("/ECAM/left-msg", "LDG-MEMO"); diff --git a/Nasal/libraries.nas b/Nasal/libraries.nas index 471f5fa0..b0f08cae 100644 --- a/Nasal/libraries.nas +++ b/Nasal/libraries.nas @@ -186,7 +186,6 @@ var systemsInit = func { libraries.CVR.start(); icing.icingInit(); lightsLoop.start(); - ecam.ECAM_system.init(); var autopilot = gui.Dialog.new("sim/gui/dialogs/autopilot/dialog", "Aircraft/IDG-A32X/Systems/autopilot-dlg.xml"); setprop("/it-autoflight/input/fd1", 1); setprop("/it-autoflight/input/fd2", 1); @@ -205,7 +204,7 @@ var systemsLoop = maketimer(0.1, func { systems.FUEL.loop(); systems.ADIRS.loop(); libraries.ECAM.loop(); - ecam.ECAM_system.loop(); + ecam.ECAM_controller.loop(); fadec.fadecLoop(); if ((getprop("/controls/pneumatic/switches/groundair") or getprop("/controls/switches/cart")) and ((getprop("/velocities/groundspeed-kt") > 2) or getprop("/controls/gear/brake-parking") == 0)) { From 7c55522ac6167e08f80d3c7bad904d104c605026 Mon Sep 17 00:00:00 2001 From: Jonathan Redpath Date: Wed, 6 Jun 2018 21:46:41 +0100 Subject: [PATCH 04/15] Convert to std.vector, add debug functions, extend system, note that it is not displaying on the ECAM yet --- Nasal/ECAM-controller.nas | 104 +++++++++++++------------------------- Nasal/libraries.nas | 6 ++- 2 files changed, 39 insertions(+), 71 deletions(-) diff --git a/Nasal/ECAM-controller.nas b/Nasal/ECAM-controller.nas index fed32959..3d8d022d 100644 --- a/Nasal/ECAM-controller.nas +++ b/Nasal/ECAM-controller.nas @@ -60,12 +60,12 @@ var ewd_msg_two = ewd.initNode("msg/priority_2"," ","STRING"); var ewd_msg_one = ewd.initNode("msg/priority_1"," ","STRING"); var ewd_msg_zero = ewd.initNode("msg/priority_0"," ","STRING"); var ewd_msg_memo = ewd.initNode("msg/memo"," ","STRING"); -var msgs_priority_3 = []; -var msgs_priority_2 = []; -var msgs_priority_1 = []; -var msgs_priority_0 = []; -var msgs_memo = []; -var active_messages = []; +var msgs_priority_3 = std.Vector.new(); +var msgs_priority_2 = std.Vector.new(); +var msgs_priority_1 = std.Vector.new(); +var msgs_priority_0 = std.Vector.new(); +var msgs_memo = std.Vector.new(); +var active_messages = std.Vector.new(); var num_lines = 6; var msg = nil; var spacer = nil; @@ -75,8 +75,8 @@ var line = nil; var messages_priority_3 = func { if (getprop("/controls/flight/flap-pos") > 2 and getprop("/position/gear-agl-ft") < 750 and getprop("/gear/gear[1]/position-norm") != 1 and getprop("/FMGC/status/phase") == 5) { - append(msgs_priority_3,"L/G GEAR NOT DOWN"); - append(active_messages,"L/G GEAR NOT DOWN"); + msgs_priority_3.append("L/G GEAR NOT DOWN"); + active_messages.append("L/G GEAR NOT DOWN"); } } var messages_priority_2 = func {} @@ -84,71 +84,23 @@ var messages_priority_1 = func {} var messages_priority_0 = func {} var messages_memo = func { if (getprop("controls/flight/speedbrake-arm") == 1) { - append(msgs_memo,"GND SPLRS ARMED"); - append(active_messages,"GND SPLRS ARMED"); - } + msgs_memo.append("GND SPLRS ARMED"); + active_messages.append("GND SPLRS ARMED"); + } } -# messages sent to property tree - -var update_ewd = func(msgs_priority_3,msgs_priority_2,msgs_priority_1,msgs_priority_0,msgs_memo) { - msg = ""; - spacer = ""; - line = 0; - for(var i=0; i 2) or getprop("/controls/gear/brake-parking") == 0)) { From e69ae365c2a2ea7cc8f6069103ce91eb439617b3 Mon Sep 17 00:00:00 2001 From: Jonathan Redpath Date: Fri, 8 Jun 2018 17:08:17 +0100 Subject: [PATCH 05/15] messages show on ECAM now, but wrong --- Nasal/ECAM-controller.nas | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Nasal/ECAM-controller.nas b/Nasal/ECAM-controller.nas index 3d8d022d..016147f1 100644 --- a/Nasal/ECAM-controller.nas +++ b/Nasal/ECAM-controller.nas @@ -113,12 +113,13 @@ var ECAM_controller = { # write to ECAM foreach(var ewd_messages; active_messages.vector) { var i = 1; - var x = getprop("/ECAM/msg/line[" ~ i ~ "]"); + var x = getprop("/ECAM/msg/line" ~ i); print("Variable i is:" ~ i); if (x == "") { - setprop("/ECAM/msg/line[" ~ i ~ "]", ewd_messages); + setprop("/ECAM/msg/line" ~ i, ewd_messages); } else { i = i + 1; + setprop("/ECAM/msg/line" ~ i, ewd_messages); print("Variable i is:" ~ i); } } From 6669becaff9c6462b09eb48c416a66754e82e6ba Mon Sep 17 00:00:00 2001 From: Jonathan Redpath Date: Sat, 9 Jun 2018 21:15:00 +0100 Subject: [PATCH 06/15] Switch to forindex() (thanks pinto) and messages cleared when vector is empty --- Nasal/ECAM-controller.nas | 27 +++++++++++++-------------- Nasal/ECAM.nas | 2 +- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/Nasal/ECAM-controller.nas b/Nasal/ECAM-controller.nas index 016147f1..62854e16 100644 --- a/Nasal/ECAM-controller.nas +++ b/Nasal/ECAM-controller.nas @@ -77,6 +77,8 @@ var messages_priority_3 = func { if (getprop("/controls/flight/flap-pos") > 2 and getprop("/position/gear-agl-ft") < 750 and getprop("/gear/gear[1]/position-norm") != 1 and getprop("/FMGC/status/phase") == 5) { msgs_priority_3.append("L/G GEAR NOT DOWN"); active_messages.append("L/G GEAR NOT DOWN"); + } else if (active_messages.contains("L/G GEAR NOT DOWN")) { + active_messages.remove("L/G GEAR NOT DOWN"); } } var messages_priority_2 = func {} @@ -86,6 +88,8 @@ var messages_memo = func { if (getprop("controls/flight/speedbrake-arm") == 1) { msgs_memo.append("GND SPLRS ARMED"); active_messages.append("GND SPLRS ARMED"); + } else if (active_messages.contains("GND SPLRS ARMED")) { + active_messages.remove("GND SPLRS ARMED"); } } @@ -111,24 +115,19 @@ var ECAM_controller = { messages_memo(); # write to ECAM - foreach(var ewd_messages; active_messages.vector) { - var i = 1; - var x = getprop("/ECAM/msg/line" ~ i); - print("Variable i is:" ~ i); - if (x == "") { - setprop("/ECAM/msg/line" ~ i, ewd_messages); + + forindex ( var i; active_messages.vector ) { + var line = 1; + if (getprop("/ECAM/msg/line" ~ line) == "") { + setprop("/ECAM/msg/line" ~ line, active_messages.vector[i]); } else { - i = i + 1; - setprop("/ECAM/msg/line" ~ i, ewd_messages); - print("Variable i is:" ~ i); + setprop("/ECAM/msg/line" ~ (line + 1), active_messages.vector[i]); } } - # debug - - foreach(var debug; active_messages.vector) { - print(debug); + if (active_messages.size() == 0) { + setprop("/ECAM/msg/line1", ""); + setprop("/ECAM/msg/line2", ""); } - }, }; diff --git a/Nasal/ECAM.nas b/Nasal/ECAM.nas index bbc7d84e..6a03b542 100644 --- a/Nasal/ECAM.nas +++ b/Nasal/ECAM.nas @@ -80,7 +80,7 @@ var ECAM = { setprop("/ECAM/ldg-memo-enable", 0); } - if (size(ecam.active_messages) > 0) { + if (ecam.active_messages.size() > 0) { setprop("/ECAM/left-msg", "MSG"); } else if (getprop("/FMGC/status/phase") == 0 and stateL == 3 and stateR == 3 and getprop("/ECAM/engine-start-time") + 120 < getprop("/sim/time/elapsed-sec") and getprop("/ECAM/to-memo-enable") == 1 and wow == 1) { setprop("/ECAM/left-msg", "TO-MEMO"); From 99bdae5ed023517dbcf9ed0f86854446ff66b5a1 Mon Sep 17 00:00:00 2001 From: Jonathan Redpath Date: Mon, 11 Jun 2018 20:59:49 +0100 Subject: [PATCH 07/15] work of the day --- Nasal/ECAM-controller.nas | 19 ++++++++++++------- Nasal/ECAM.nas | 2 +- Nasal/libraries.nas | 6 +----- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/Nasal/ECAM-controller.nas b/Nasal/ECAM-controller.nas index 62854e16..1da63d50 100644 --- a/Nasal/ECAM-controller.nas +++ b/Nasal/ECAM-controller.nas @@ -66,6 +66,7 @@ var msgs_priority_1 = std.Vector.new(); var msgs_priority_0 = std.Vector.new(); var msgs_memo = std.Vector.new(); var active_messages = std.Vector.new(); +var display_messages = std.Vector.new(); var num_lines = 6; var msg = nil; var spacer = nil; @@ -77,8 +78,8 @@ var messages_priority_3 = func { if (getprop("/controls/flight/flap-pos") > 2 and getprop("/position/gear-agl-ft") < 750 and getprop("/gear/gear[1]/position-norm") != 1 and getprop("/FMGC/status/phase") == 5) { msgs_priority_3.append("L/G GEAR NOT DOWN"); active_messages.append("L/G GEAR NOT DOWN"); - } else if (active_messages.contains("L/G GEAR NOT DOWN")) { - active_messages.remove("L/G GEAR NOT DOWN"); + } else if (display_messages.contains("L/G GEAR NOT DOWN")) { + display_messages.remove("L/G GEAR NOT DOWN"); } } var messages_priority_2 = func {} @@ -88,8 +89,8 @@ var messages_memo = func { if (getprop("controls/flight/speedbrake-arm") == 1) { msgs_memo.append("GND SPLRS ARMED"); active_messages.append("GND SPLRS ARMED"); - } else if (active_messages.contains("GND SPLRS ARMED")) { - active_messages.remove("GND SPLRS ARMED"); + } else if (display_messages.contains("GND SPLRS ARMED")) { + display_messages.remove("GND SPLRS ARMED"); } } @@ -119,13 +120,17 @@ var ECAM_controller = { forindex ( var i; active_messages.vector ) { var line = 1; if (getprop("/ECAM/msg/line" ~ line) == "") { - setprop("/ECAM/msg/line" ~ line, active_messages.vector[i]); + display_messages.append(active_messages.vector[i]); + active_messages.remove(active_messages.vector[i]); + setprop("/ECAM/msg/line" ~ line, display_messages.vector[i]); } else { - setprop("/ECAM/msg/line" ~ (line + 1), active_messages.vector[i]); + display_messages.append(active_messages.vector[i]); + active_messages.remove(active_messages.vector[i]); + setprop("/ECAM/msg/line" ~ (line + 1), display_messages.vector[i]); } } - if (active_messages.size() == 0) { + if (display_messages.size() == 0) { setprop("/ECAM/msg/line1", ""); setprop("/ECAM/msg/line2", ""); } diff --git a/Nasal/ECAM.nas b/Nasal/ECAM.nas index 6a03b542..a82551ff 100644 --- a/Nasal/ECAM.nas +++ b/Nasal/ECAM.nas @@ -80,7 +80,7 @@ var ECAM = { setprop("/ECAM/ldg-memo-enable", 0); } - if (ecam.active_messages.size() > 0) { + if (ecam.display_messages.size() > 0) { setprop("/ECAM/left-msg", "MSG"); } else if (getprop("/FMGC/status/phase") == 0 and stateL == 3 and stateR == 3 and getprop("/ECAM/engine-start-time") + 120 < getprop("/sim/time/elapsed-sec") and getprop("/ECAM/to-memo-enable") == 1 and wow == 1) { setprop("/ECAM/left-msg", "TO-MEMO"); diff --git a/Nasal/libraries.nas b/Nasal/libraries.nas index 02fd373e..b0f08cae 100644 --- a/Nasal/libraries.nas +++ b/Nasal/libraries.nas @@ -186,7 +186,6 @@ var systemsInit = func { libraries.CVR.start(); icing.icingInit(); lightsLoop.start(); - ecamLoop.start(); var autopilot = gui.Dialog.new("sim/gui/dialogs/autopilot/dialog", "Aircraft/IDG-A32X/Systems/autopilot-dlg.xml"); setprop("/it-autoflight/input/fd1", 1); setprop("/it-autoflight/input/fd2", 1); @@ -198,10 +197,6 @@ setlistener("/sim/signals/fdm-initialized", func { systemsInit(); }); -var ecamLoop = maketimer(0.5, func { - ecam.ECAM_controller.loop(); -}); - var systemsLoop = maketimer(0.1, func { systems.ELEC.loop(); systems.PNEU.loop(); @@ -209,6 +204,7 @@ var systemsLoop = maketimer(0.1, func { systems.FUEL.loop(); systems.ADIRS.loop(); libraries.ECAM.loop(); + ecam.ECAM_controller.loop(); fadec.fadecLoop(); if ((getprop("/controls/pneumatic/switches/groundair") or getprop("/controls/switches/cart")) and ((getprop("/velocities/groundspeed-kt") > 2) or getprop("/controls/gear/brake-parking") == 0)) { From d45e92a87b33a78147f33cab7ff8515a68b7c486 Mon Sep 17 00:00:00 2001 From: Jonathan Redpath Date: Mon, 30 Jul 2018 12:53:33 +0100 Subject: [PATCH 08/15] Right memo --- Models/Instruments/Upper-ECAM/Upper-ECAM.nas | 120 ++++- .../Instruments/Upper-ECAM/res/cfm-eis2.svg | 385 +++++++-------- .../Instruments/Upper-ECAM/res/iae-eis2.svg | 437 +++++++++--------- Nasal/ECAM-controller.nas | 76 ++- Nasal/ECAM.nas | 22 + 5 files changed, 624 insertions(+), 416 deletions(-) diff --git a/Models/Instruments/Upper-ECAM/Upper-ECAM.nas b/Models/Instruments/Upper-ECAM/Upper-ECAM.nas index 5dbf1893..12210a32 100644 --- a/Models/Instruments/Upper-ECAM/Upper-ECAM.nas +++ b/Models/Instruments/Upper-ECAM/Upper-ECAM.nas @@ -342,6 +342,122 @@ var canvas_upperECAM_base = { me["TO_Memo"].hide(); me["LDG_Memo"].hide(); } + + # Right ECAM Messages + if (getprop("/ECAM/right-msg") == "MSG") { + me["ECAMR1"].setText(sprintf("%s", getprop("/ECAM/rightmsg/line1"))); + me["ECAMR2"].setText(sprintf("%s", getprop("/ECAM/rightmsg/line2"))); + me["ECAMR3"].setText(sprintf("%s", getprop("/ECAM/rightmsg/line3"))); + me["ECAMR4"].setText(sprintf("%s", getprop("/ECAM/rightmsg/line4"))); + me["ECAMR5"].setText(sprintf("%s", getprop("/ECAM/rightmsg/line5"))); + me["ECAMR6"].setText(sprintf("%s", getprop("/ECAM/rightmsg/line6"))); + me["ECAMR7"].setText(sprintf("%s", getprop("/ECAM/rightmsg/line7"))); + me["ECAMR8"].setText(sprintf("%s", getprop("/ECAM/rightmsg/line8"))); + + if (getprop("/ECAM/rightmsg/line1c") == "w") { + me["ECAMR1"].setColor(0.8078,0.8039,0.8078); + } else if (getprop("/ECAM/rightmsg/line1c") == "b") { + me["ECAMR1"].setColor(0.0901,0.6039,0.7176); + } else if (getprop("/ECAM/rightmsg/line1c") == "g") { + me["ECAMR1"].setColor(0.0509,0.7529,0.2941); + } else if (getprop("/ECAM/rightmsg/line1c") == "a") { + me["ECAMR1"].setColor(0.7333,0.3803,0); + } else if (getprop("/ECAM/rightmsg/line1c") == "r") { + me["ECAMR1"].setColor(1,0,0); + } + + if (getprop("/ECAM/rightmsg/line2c") == "w") { + me["ECAMR2"].setColor(0.8078,0.8039,0.8078); + } else if (getprop("/ECAM/rightmsg/line2c") == "b") { + me["ECAMR2"].setColor(0.0901,0.6039,0.7176); + } else if (getprop("/ECAM/rightmsg/line2c") == "g") { + me["ECAMR2"].setColor(0.0509,0.7529,0.2941); + } else if (getprop("/ECAM/rightmsg/line2c") == "a") { + me["ECAMR2"].setColor(0.7333,0.3803,0); + } else if (getprop("/ECAM/rightmsg/line2c") == "r") { + me["ECAMR2"].setColor(1,0,0); + } + + if (getprop("/ECAM/rightmsg/line3c") == "w") { + me["ECAMR3"].setColor(0.8078,0.8039,0.8078); + } else if (getprop("/ECAM/rightmsg/line3c") == "b") { + me["ECAMR3"].setColor(0.0901,0.6039,0.7176); + } else if (getprop("/ECAM/rightmsg/line3c") == "g") { + me["ECAMR3"].setColor(0.0509,0.7529,0.2941); + } else if (getprop("/ECAM/rightmsg/line3c") == "a") { + me["ECAMR3"].setColor(0.7333,0.3803,0); + } else if (getprop("/ECAM/rightmsg/line3c") == "r") { + me["ECAMR3"].setColor(1,0,0); + } + + if (getprop("/ECAM/rightmsg/line4c") == "w") { + me["ECAMR4"].setColor(0.8078,0.8039,0.8078); + } else if (getprop("/ECAM/rightmsg/line4c") == "b") { + me["ECAMR4"].setColor(0.0901,0.6039,0.7176); + } else if (getprop("/ECAM/rightmsg/line4c") == "g") { + me["ECAMR4"].setColor(0.0509,0.7529,0.2941); + } else if (getprop("/ECAM/rightmsg/line4c") == "a") { + me["ECAMR4"].setColor(0.7333,0.3803,0); + } else if (getprop("/ECAM/rightmsg/line4c") == "r") { + me["ECAMR4"].setColor(1,0,0); + } + + if (getprop("/ECAM/rightmsg/line5c") == "w") { + me["ECAMR5"].setColor(0.8078,0.8039,0.8078); + } else if (getprop("/ECAM/rightmsg/line5c") == "b") { + me["ECAMR5"].setColor(0.0901,0.6039,0.7176); + } else if (getprop("/ECAM/rightmsg/line5c") == "g") { + me["ECAMR5"].setColor(0.0509,0.7529,0.2941); + } else if (getprop("/ECAM/rightmsg/line5c") == "a") { + me["ECAMR5"].setColor(0.7333,0.3803,0); + } else if (getprop("/ECAM/rightmsg/line5c") == "r") { + me["ECAMR5"].setColor(1,0,0); + } + + if (getprop("/ECAM/rightmsg/line6c") == "w") { + me["ECAMR6"].setColor(0.8078,0.8039,0.8078); + } else if (getprop("/ECAM/rightmsg/line6c") == "b") { + me["ECAMR6"].setColor(0.0901,0.6039,0.7176); + } else if (getprop("/ECAM/rightmsg/line6c") == "g") { + me["ECAMR6"].setColor(0.0509,0.7529,0.2941); + } else if (getprop("/ECAM/rightmsg/line6c") == "a") { + me["ECAMR6"].setColor(0.7333,0.3803,0); + } else if (getprop("/ECAM/rightmsg/line6c") == "r") { + me["ECAMR6"].setColor(1,0,0); + } + + if (getprop("/ECAM/rightmsg/line7c") == "w") { + me["ECAMR7"].setColor(0.8078,0.8039,0.8078); + } else if (getprop("/ECAM/rightmsg/line7c") == "b") { + me["ECAMR7"].setColor(0.0901,0.6039,0.7176); + } else if (getprop("/ECAM/rightmsg/line7c") == "g") { + me["ECAMR7"].setColor(0.0509,0.7529,0.2941); + } else if (getprop("/ECAM/rightmsg/line7c") == "a") { + me["ECAMR7"].setColor(0.7333,0.3803,0); + } else if (getprop("/ECAM/rightmsg/line7c") == "r") { + me["ECAMR7"].setColor(1,0,0); + } + + if (getprop("/ECAM/rightmsg/line8c") == "w") { + me["ECAMR8"].setColor(0.8078,0.8039,0.8078); + } else if (getprop("/ECAM/rightmsg/line8c") == "b") { + me["ECAMR8"].setColor(0.0901,0.6039,0.7176); + } else if (getprop("/ECAM/rightmsg/line8c") == "g") { + me["ECAMR8"].setColor(0.0509,0.7529,0.2941); + } else if (getprop("/ECAM/rightmsg/line8c") == "a") { + me["ECAMR8"].setColor(0.7333,0.3803,0); + } else if (getprop("/ECAM/rightmsg/line8c") == "r") { + me["ECAMR8"].setColor(1,0,0); + } + + me["TO_Memo"].hide(); + me["LDG_Memo"].hide(); + me["ECAM_Right"].show(); + } else { + me["ECAM_Right"].hide(); + me["TO_Memo"].hide(); + me["LDG_Memo"].hide(); + } }, }; @@ -356,7 +472,7 @@ var canvas_upperECAM_cfm_eis2 = { return ["N11-needle","N11-thr","N11-ylim","N11","N11-decpnt","N11-decimal","N11-box","N11-scale","N11-scale2","N11-scaletick","N11-scalenum","N11-XX","N11-XX2","N11-XX-box","EGT1-needle","EGT1","EGT1-scale","EGT1-box","EGT1-scale2","EGT1-scaletick", "EGT1-XX","N21","N21-decpnt","N21-decimal","N21-XX","FF1","FF1-XX","N12-needle","N12-thr","N12-ylim","N12","N12-decpnt","N12-decimal","N12-box","N12-scale","N12-scale2","N12-scaletick","N12-scalenum","N12-XX","N12-XX2","N12-XX-box","EGT2-needle","EGT2", "EGT2-scale","EGT2-box","EGT2-scale2","EGT2-scaletick","EGT2-XX","N22","N22-decpnt","N22-decimal","N22-XX","FF2","FF2-XX","FOB-LBS","FlapTxt","FlapDots","N1Lim-mode","N1Lim","N1Lim-decpnt","N1Lim-decimal","N1Lim-percent","N1Lim-XX","N1Lim-XX2","REV1", - "REV1-box","REV2","REV2-box","ECAM_Left","ECAML1","ECAML2","ECAML3","ECAML4","ECAML5","ECAML6","ECAML7","ECAML8","TO_Memo","TO_Autobrake","TO_Signs","TO_Spoilers","TO_Flaps","TO_Config","TO_Autobrake_B","TO_Signs_B","TO_Spoilers_B","TO_Flaps_B", + "REV1-box","REV2","REV2-box","ECAM_Left","ECAML1","ECAML2","ECAML3","ECAML4","ECAML5","ECAML6","ECAML7","ECAML8","ECAMR1", "ECAMR2", "ECAMR3", "ECAMR4", "ECAMR5", "ECAMR6", "ECAMR7", "ECAMR8", "ECAM_Right", "TO_Memo","TO_Autobrake","TO_Signs","TO_Spoilers","TO_Flaps","TO_Config","TO_Autobrake_B","TO_Signs_B","TO_Spoilers_B","TO_Flaps_B", "TO_Config_B","LDG_Memo","LDG_Gear","LDG_Signs","LDG_Spoilers","LDG_Flaps","LDG_Gear_B","LDG_Signs_B","LDG_Spoilers_B","LDG_Flaps_B","LDG_Flaps_B3"]; }, update: func() { @@ -583,7 +699,7 @@ var canvas_upperECAM_iae_eis2 = { "N11-needle","N11-thr","N11-ylim","N11","N11-decpnt","N11-decimal","N11-scale","N11-scale2","N11-scaletick","N11-scalenum","N11-XX","N21","N21-decpnt","N21-decimal","N21-XX","FF1","FF1-XX","EPR2-needle","EPR2-thr","EPR2-ylim","EPR2","EPR2-decpnt", "EPR2-decimal","EPR2-box","EPR2-scale","EPR2-scaletick","EPR2-scalenum","EPR2-XX","EPR2-XX2","EGT2-needle","EGT2","EGT2-scale","EGT2-scale2","EGT2-box","EGT2-scaletick","EGT2-XX","N12-needle","N12-thr","N12-ylim","N12","N12-decpnt","N12-decimal", "N12-scale","N12-scale2","N12-scaletick","N12-scalenum","N12-XX","N22","N22-decpnt","N22-decimal","N22-XX","FF2","FF2-XX","FOB-LBS","FlapTxt","FlapDots","EPRLim-mode","EPRLim","EPRLim-decpnt","EPRLim-decimal","EPRLim-XX","EPRLim-XX2","REV1","REV1-box", - "REV2","REV2-box","ECAM_Left","ECAML1","ECAML2","ECAML3","ECAML4","ECAML5","ECAML6","ECAML7","ECAML8","TO_Memo","TO_Autobrake","TO_Signs","TO_Spoilers","TO_Flaps","TO_Config","TO_Autobrake_B","TO_Signs_B","TO_Spoilers_B","TO_Flaps_B","TO_Config_B", + "REV2","REV2-box","ECAM_Left","ECAML1","ECAML2","ECAML3","ECAML4","ECAML5","ECAML6","ECAML7","ECAML8", "ECAMR1", "ECAMR2", "ECAMR3", "ECAMR4", "ECAMR5", "ECAMR6", "ECAMR7", "ECAMR8", "ECAM_Right", "TO_Memo","TO_Autobrake","TO_Signs","TO_Spoilers","TO_Flaps","TO_Config","TO_Autobrake_B","TO_Signs_B","TO_Spoilers_B","TO_Flaps_B","TO_Config_B", "LDG_Memo","LDG_Gear","LDG_Signs","LDG_Spoilers","LDG_Flaps","LDG_Gear_B","LDG_Signs_B","LDG_Spoilers_B","LDG_Flaps_B","LDG_Flaps_B3"]; }, update: func() { diff --git a/Models/Instruments/Upper-ECAM/res/cfm-eis2.svg b/Models/Instruments/Upper-ECAM/res/cfm-eis2.svg index 847d0434..e0f1da29 100644 --- a/Models/Instruments/Upper-ECAM/res/cfm-eis2.svg +++ b/Models/Instruments/Upper-ECAM/res/cfm-eis2.svg @@ -12,7 +12,7 @@ viewBox="0 0 1024 1024" version="1.1" id="svg2" - inkscape:version="0.91 r13725" + inkscape:version="0.92.2 (5c3e80d, 2017-08-06)" sodipodi:docname="cfm-eis2.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="false" inkscape:zoom="0.50000001" - inkscape:cx="531.17625" + inkscape:cx="206.17626" inkscape:cy="512.09207" - inkscape:window-x="1592" + inkscape:window-x="-8" inkscape:window-y="-8" inkscape:window-maximized="1" inkscape:current-layer="svg2" @@ -86,9 +86,8 @@ id="FlapTxt" y="655.34741" x="729.04968" - style="font-style:normal;font-weight:normal;font-size:11.69594479px;line-height:0%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" xml:space="preserve" - sodipodi:linespacing="0%" transform="scale(0.97466201,1.0259967)">LBS FOB : 000000 FF EGT N1 0000 XX 0000 00 0 00 0 XX % 00 0 XX XX 10 LINE 1 LINE 2 LINE 3 LINE 4 LINE 5 LINE 6 LINE 7 AUTO BRK SIGNS SPLRS FLAPS MAX ON ARM T.O TEST LDG @@ -1596,16 +1523,15 @@ sodipodi:nodetypes="cc" inkscape:connector-curvature="0" id="path4424" - d="m 13.8216,741.99564 77.932201,0" + d="M 13.8216,741.99564 H 91.753801" style="fill:none;stroke:#0dc04b;stroke-width:2.4000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> LDG GEAR SIGNS CABIN READY SPLRS DN ARM FULL 3 . . . . . . . . . . . . + + LINE 1 + LINE 2 + LINE 3 + LINE 4 + LINE 5 + LINE 6 + LINE 7 + LINE 8 + diff --git a/Models/Instruments/Upper-ECAM/res/iae-eis2.svg b/Models/Instruments/Upper-ECAM/res/iae-eis2.svg index d4fccf2a..59b8620a 100644 --- a/Models/Instruments/Upper-ECAM/res/iae-eis2.svg +++ b/Models/Instruments/Upper-ECAM/res/iae-eis2.svg @@ -12,7 +12,7 @@ viewBox="0 0 1024 1024" version="1.1" id="svg2" - inkscape:version="0.91 r13725" + inkscape:version="0.92.2 (5c3e80d, 2017-08-06)" sodipodi:docname="iae-eis2.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="false" - inkscape:zoom="2.1653108" - inkscape:cx="335.98162" - inkscape:cy="267.27567" - inkscape:window-x="1592" + inkscape:zoom="0.43942712" + inkscape:cx="171.27247" + inkscape:cy="433.53356" + inkscape:window-x="-8" inkscape:window-y="-8" inkscape:window-maximized="1" inkscape:current-layer="svg2" @@ -64,12 +64,11 @@ inkscape:label="#rect4233" /> LBS FOB : 000000 FF EGT N1 % 0000 XX 0000 00 0 00 0 XX TOGA XX 000 XX 1.2 N2 LBS/H FF 4 00 0 REV 1 1.4 00 0 XX LINE 1 LINE 2 LINE 3 LINE 4 LINE 5 LINE 6 LINE 7 AUTO BRK SIGNS SPLRS FLAPS MAX ON ARM T.O TEST LDG GEAR SIGNS CABIN READY SPLRS DN ARM FULL 3 . . . . . . . . . . . . + + LINE 1 + LINE 2 + LINE 3 + LINE 4 + LINE 5 + LINE 6 + LINE 7 + LINE 8 + diff --git a/Nasal/ECAM-controller.nas b/Nasal/ECAM-controller.nas index 1da63d50..90aff4b5 100644 --- a/Nasal/ECAM-controller.nas +++ b/Nasal/ECAM-controller.nas @@ -65,8 +65,10 @@ var msgs_priority_2 = std.Vector.new(); var msgs_priority_1 = std.Vector.new(); var msgs_priority_0 = std.Vector.new(); var msgs_memo = std.Vector.new(); +var right_memo = std.Vector.new(); var active_messages = std.Vector.new(); var display_messages = std.Vector.new(); +var right_display_messages = std.Vector.new(); var num_lines = 6; var msg = nil; var spacer = nil; @@ -85,16 +87,24 @@ var messages_priority_3 = func { var messages_priority_2 = func {} var messages_priority_1 = func {} var messages_priority_0 = func {} -var messages_memo = func { +var messages_memo = func {} +var messages_right_memo = func { if (getprop("controls/flight/speedbrake-arm") == 1) { - msgs_memo.append("GND SPLRS ARMED"); - active_messages.append("GND SPLRS ARMED"); - } else if (display_messages.contains("GND SPLRS ARMED")) { - display_messages.remove("GND SPLRS ARMED"); + right_memo.append("GND SPLRS ARMED"); + } else { + while (right_display_messages.contains("GND SPLRS ARMED")) { + right_display_messages.remove("GND SPLRS ARMED"); + } + } + if (getprop("/controls/gear/brake-parking") == 1) { + right_memo.append("PARK BRK"); + } else { + while (right_display_messages.contains("PARK BRK")) { + right_display_messages.remove("PARK BRK"); + } } } - # Finally the controller var ECAM_controller = { @@ -106,6 +116,7 @@ var ECAM_controller = { msgs_priority_0.clear(); msgs_memo.clear(); active_messages.clear(); + right_memo.clear(); # check active messages # config_warnings(); @@ -114,19 +125,49 @@ var ECAM_controller = { messages_priority_1(); messages_priority_0(); messages_memo(); + messages_right_memo(); # write to ECAM forindex ( var i; active_messages.vector ) { - var line = 1; - if (getprop("/ECAM/msg/line" ~ line) == "") { - display_messages.append(active_messages.vector[i]); - active_messages.remove(active_messages.vector[i]); - setprop("/ECAM/msg/line" ~ line, display_messages.vector[i]); - } else { - display_messages.append(active_messages.vector[i]); - active_messages.remove(active_messages.vector[i]); - setprop("/ECAM/msg/line" ~ (line + 1), display_messages.vector[i]); + line = 1; + while (getprop("/ECAM/msg/line" ~ line) != "") { + line = line + 1; # go to next line until empty line + } + if (getprop("/ECAM/msg/line" ~ line) == ""){ # at empty line + if (display_messages.size() > 0) { # is the display empty or is this first message? + msg = active_messages.vector[i]; # get the message that we will be setting + if (!display_messages.contains(msg)) { # check: does it exist yet on the display? + display_messages.append(active_messages.vector[i]); # if not, send it to display + active_messages.remove(active_messages.vector[i]); + setprop("/ECAM/msg/line" ~ (line), display_messages.vector[i]); # and write it + } + } else { + display_messages.append(active_messages.vector[i]); + active_messages.remove(active_messages.vector[i]); + setprop("/ECAM/msg/line" ~ (line), display_messages.vector[i]); + } + } + } + + forindex ( var x; right_memo.vector ) { + line = 1; + while (getprop("/ECAM/rightmsg/line" ~ line) != "") { + line = line + 1; # go to next line until empty line + } + if (getprop("/ECAM/rightmsg/line" ~ line) == ""){ # at empty line + if (right_display_messages.size() > 0) { # is the display empty or is this first message? + msg = right_memo.vector[x]; # get the message that we will be setting + if (!right_display_messages.contains(msg)) { # check: does it exist yet on the display? + right_display_messages.append(right_memo.vector[x]); # if not, send it to display + right_memo.remove(right_memo.vector[x]); + setprop("/ECAM/rightmsg/line" ~ (line), right_display_messages.vector[x]); # and write it + } + } else { + right_display_messages.append(right_memo.vector[x]); + right_memo.remove(right_memo.vector[x]); + setprop("/ECAM/rightmsg/line" ~ (line), right_display_messages.vector[x]); + } } } @@ -134,5 +175,10 @@ var ECAM_controller = { setprop("/ECAM/msg/line1", ""); setprop("/ECAM/msg/line2", ""); } + + if (right_display_messages.size() == 0) { + setprop("/ECAM/rightmsg/line1", ""); + setprop("/ECAM/rightmsg/line2", ""); + } }, }; diff --git a/Nasal/ECAM.nas b/Nasal/ECAM.nas index a82551ff..54bc1ed6 100644 --- a/Nasal/ECAM.nas +++ b/Nasal/ECAM.nas @@ -45,6 +45,22 @@ var ECAM = { setprop("/ECAM/msg/line6c", "w"); setprop("/ECAM/msg/line7c", "w"); setprop("/ECAM/msg/line8c", "w"); + setprop("/ECAM/rightmsg/line1", ""); + setprop("/ECAM/rightmsg/line2", ""); + setprop("/ECAM/rightmsg/line3", ""); + setprop("/ECAM/rightmsg/line4", ""); + setprop("/ECAM/rightmsg/line5", ""); + setprop("/ECAM/rightmsg/line6", ""); + setprop("/ECAM/rightmsg/line7", ""); + setprop("/ECAM/rightmsg/line8", ""); + setprop("/ECAM/rightmsg/line1c", "w"); + setprop("/ECAM/rightmsg/line2c", "w"); + setprop("/ECAM/rightmsg/line3c", "w"); + setprop("/ECAM/rightmsg/line4c", "w"); + setprop("/ECAM/rightmsg/line5c", "w"); + setprop("/ECAM/rightmsg/line6c", "w"); + setprop("/ECAM/rightmsg/line7c", "w"); + setprop("/ECAM/rightmsg/line8c", "w"); }, loop: func() { stateL = getprop("/engines/engine[0]/state"); @@ -90,6 +106,12 @@ var ECAM = { setprop("/ECAM/left-msg", "NONE"); } + if (ecam.right_display_messages.size() > 0) { + setprop("/ECAM/right-msg", "MSG"); + } else { + setprop("/ECAM/right-msg", "NONE"); + } + if (getprop("/controls/autobrake/mode") == 3 and getprop("/controls/switches/no-smoking-sign") == 1 and getprop("/controls/switches/seatbelt-sign") == 1 and getprop("/controls/flight/speedbrake-arm") == 1 and getprop("/controls/flight/flap-pos") > 0 and getprop("/controls/flight/flap-pos") < 5) { # Do nothing From 5f1aa81106ea7d238ea0b82dd6e4c9d18c282054 Mon Sep 17 00:00:00 2001 From: Jonathan Redpath Date: Mon, 30 Jul 2018 19:49:35 +0100 Subject: [PATCH 09/15] transfer to hashes --- Nasal/ECAM-controller.nas | 157 +++++++++++++++++++------------------- Nasal/ECAM.nas | 4 +- 2 files changed, 80 insertions(+), 81 deletions(-) diff --git a/Nasal/ECAM-controller.nas b/Nasal/ECAM-controller.nas index 90aff4b5..cd6f1c41 100644 --- a/Nasal/ECAM-controller.nas +++ b/Nasal/ECAM-controller.nas @@ -54,34 +54,73 @@ # PHASE: /FMGC/status/phase # DISPLAY: 1 - EWD 2 - MEMO 3 - STATUS -var ewd = props.globals.initNode("/instrumentation/ewd"); -var ewd_msg_three = ewd.initNode("msg/priority_3"," ","STRING"); -var ewd_msg_two = ewd.initNode("msg/priority_2"," ","STRING"); -var ewd_msg_one = ewd.initNode("msg/priority_1"," ","STRING"); -var ewd_msg_zero = ewd.initNode("msg/priority_0"," ","STRING"); -var ewd_msg_memo = ewd.initNode("msg/memo"," ","STRING"); -var msgs_priority_3 = std.Vector.new(); -var msgs_priority_2 = std.Vector.new(); -var msgs_priority_1 = std.Vector.new(); -var msgs_priority_0 = std.Vector.new(); -var msgs_memo = std.Vector.new(); -var right_memo = std.Vector.new(); -var active_messages = std.Vector.new(); -var display_messages = std.Vector.new(); -var right_display_messages = std.Vector.new(); var num_lines = 6; var msg = nil; var spacer = nil; var line = nil; +var right_line = nil; +var warning = { + msg: "", + active: 0, + new: func(msg,active) { + + var t = {parents:[warning]}; + + t.msg = msg; + t.active = active; + + return t + + }, + write: func() { + var line = 1; + while (getprop("/ECAM/msg/line" ~ line) != "") { + line = line + 1; # go to next line until empty line + } + if (getprop("/ECAM/msg/line" ~ line) == "" and me.active == 1) { # at empty line + setprop("/ECAM/msg/line" ~ (line), me.msg); + } + }, +}; + +var memo = { + msg: "", + active: 0, + new: func(msg,active) { + + var t = {parents:[memo]}; + + t.msg = msg; + t.active = active; + + return t + + }, + write: func() { + var right_line = 1; + while (getprop("/ECAM/rightmsg/line" ~ right_line) != "") { + right_line = right_line + 1; # go to next line until empty line + } + if (getprop("/ECAM/rightmsg/line" ~ right_line) == "" and me.active == 1) { # at empty line + setprop("/ECAM/rightmsg/line" ~ (right_line), me.msg); + } + }, +}; # messages logic and added to arrays +var warnings = std.Vector.new([var lg_not_dn = warning.new(msg: "L/G GEAR NOT DOWN", active: 0)]); +var memos = std.Vector.new([ +var gnd_splrs = memo.new(msg: "GND SPLRS ARMED", active: 0), +var park_brk = memo.new(msg: "PARK BRK", active: 0) +]); + + var messages_priority_3 = func { if (getprop("/controls/flight/flap-pos") > 2 and getprop("/position/gear-agl-ft") < 750 and getprop("/gear/gear[1]/position-norm") != 1 and getprop("/FMGC/status/phase") == 5) { - msgs_priority_3.append("L/G GEAR NOT DOWN"); - active_messages.append("L/G GEAR NOT DOWN"); - } else if (display_messages.contains("L/G GEAR NOT DOWN")) { - display_messages.remove("L/G GEAR NOT DOWN"); + lg_not_dn.active = 1; + } else { + lg_not_dn.active = 0; } } var messages_priority_2 = func {} @@ -90,18 +129,14 @@ var messages_priority_0 = func {} var messages_memo = func {} var messages_right_memo = func { if (getprop("controls/flight/speedbrake-arm") == 1) { - right_memo.append("GND SPLRS ARMED"); + gnd_splrs.active = 1; } else { - while (right_display_messages.contains("GND SPLRS ARMED")) { - right_display_messages.remove("GND SPLRS ARMED"); - } + gnd_splrs.active = 0; } if (getprop("/controls/gear/brake-parking") == 1) { - right_memo.append("PARK BRK"); + park_brk.active = 1; } else { - while (right_display_messages.contains("PARK BRK")) { - right_display_messages.remove("PARK BRK"); - } + park_brk.active = 0; } } @@ -109,14 +144,6 @@ var messages_right_memo = func { var ECAM_controller = { loop: func() { - # cleans up arrays - msgs_priority_3.clear(); - msgs_priority_2.clear(); - msgs_priority_1.clear(); - msgs_priority_0.clear(); - msgs_memo.clear(); - active_messages.clear(); - right_memo.clear(); # check active messages # config_warnings(); @@ -129,56 +156,28 @@ var ECAM_controller = { # write to ECAM - forindex ( var i; active_messages.vector ) { - line = 1; - while (getprop("/ECAM/msg/line" ~ line) != "") { - line = line + 1; # go to next line until empty line - } - if (getprop("/ECAM/msg/line" ~ line) == ""){ # at empty line - if (display_messages.size() > 0) { # is the display empty or is this first message? - msg = active_messages.vector[i]; # get the message that we will be setting - if (!display_messages.contains(msg)) { # check: does it exist yet on the display? - display_messages.append(active_messages.vector[i]); # if not, send it to display - active_messages.remove(active_messages.vector[i]); - setprop("/ECAM/msg/line" ~ (line), display_messages.vector[i]); # and write it - } - } else { - display_messages.append(active_messages.vector[i]); - active_messages.remove(active_messages.vector[i]); - setprop("/ECAM/msg/line" ~ (line), display_messages.vector[i]); + foreach (var i; warnings.vector) { + i.write(); + } + + foreach (var m; memos.vector) { + m.write(); + } + + if (warnings.size() > 0) { + for(var n=1; n 0) { # is the display empty or is this first message? - msg = right_memo.vector[x]; # get the message that we will be setting - if (!right_display_messages.contains(msg)) { # check: does it exist yet on the display? - right_display_messages.append(right_memo.vector[x]); # if not, send it to display - right_memo.remove(right_memo.vector[x]); - setprop("/ECAM/rightmsg/line" ~ (line), right_display_messages.vector[x]); # and write it - } - } else { - right_display_messages.append(right_memo.vector[x]); - right_memo.remove(right_memo.vector[x]); - setprop("/ECAM/rightmsg/line" ~ (line), right_display_messages.vector[x]); + if (memos.size() > 0) { + for(var n=1; n 0) { + if (ecam.warnings.size() > 0) { setprop("/ECAM/left-msg", "MSG"); } else if (getprop("/FMGC/status/phase") == 0 and stateL == 3 and stateR == 3 and getprop("/ECAM/engine-start-time") + 120 < getprop("/sim/time/elapsed-sec") and getprop("/ECAM/to-memo-enable") == 1 and wow == 1) { setprop("/ECAM/left-msg", "TO-MEMO"); @@ -106,7 +106,7 @@ var ECAM = { setprop("/ECAM/left-msg", "NONE"); } - if (ecam.right_display_messages.size() > 0) { + if (ecam.memos.size() > 0) { setprop("/ECAM/right-msg", "MSG"); } else { setprop("/ECAM/right-msg", "NONE"); From 9f790be2c4db1fcba5eebf2ae7493c765cc775b5 Mon Sep 17 00:00:00 2001 From: Jonathan Redpath Date: Tue, 31 Jul 2018 15:11:12 +0100 Subject: [PATCH 10/15] Add colour support, system working --- Models/Instruments/Upper-ECAM/Upper-ECAM.nas | 160 +++++++++---------- Nasal/ECAM-controller.nas | 67 +++++--- Nasal/ECAM.nas | 32 ++-- 3 files changed, 139 insertions(+), 120 deletions(-) diff --git a/Models/Instruments/Upper-ECAM/Upper-ECAM.nas b/Models/Instruments/Upper-ECAM/Upper-ECAM.nas index 12210a32..8b7c4151 100644 --- a/Models/Instruments/Upper-ECAM/Upper-ECAM.nas +++ b/Models/Instruments/Upper-ECAM/Upper-ECAM.nas @@ -147,99 +147,99 @@ var canvas_upperECAM_base = { me["ECAML7"].setText(sprintf("%s", getprop("/ECAM/msg/line7"))); me["ECAML8"].setText(sprintf("%s", getprop("/ECAM/msg/line8"))); - if (getprop("/ECAM/msg/line1c") == "w") { + if (getprop("/ECAM/msg/linec1") == "w") { me["ECAML1"].setColor(0.8078,0.8039,0.8078); - } else if (getprop("/ECAM/msg/line1c") == "b") { + } else if (getprop("/ECAM/msg/linec1") == "b") { me["ECAML1"].setColor(0.0901,0.6039,0.7176); - } else if (getprop("/ECAM/msg/line1c") == "g") { + } else if (getprop("/ECAM/msg/linec1") == "g") { me["ECAML1"].setColor(0.0509,0.7529,0.2941); - } else if (getprop("/ECAM/msg/line1c") == "a") { + } else if (getprop("/ECAM/msg/linec1") == "a") { me["ECAML1"].setColor(0.7333,0.3803,0); - } else if (getprop("/ECAM/msg/line1c") == "r") { + } else if (getprop("/ECAM/msg/linec1") == "r") { me["ECAML1"].setColor(1,0,0); } - if (getprop("/ECAM/msg/line2c") == "w") { + if (getprop("/ECAM/msg/linec2") == "w") { me["ECAML2"].setColor(0.8078,0.8039,0.8078); - } else if (getprop("/ECAM/msg/line2c") == "b") { + } else if (getprop("/ECAM/msg/linec2") == "b") { me["ECAML2"].setColor(0.0901,0.6039,0.7176); - } else if (getprop("/ECAM/msg/line2c") == "g") { + } else if (getprop("/ECAM/msg/linec2") == "g") { me["ECAML2"].setColor(0.0509,0.7529,0.2941); - } else if (getprop("/ECAM/msg/line2c") == "a") { + } else if (getprop("/ECAM/msg/linec2") == "a") { me["ECAML2"].setColor(0.7333,0.3803,0); - } else if (getprop("/ECAM/msg/line2c") == "r") { + } else if (getprop("/ECAM/msg/linec2") == "r") { me["ECAML2"].setColor(1,0,0); } - if (getprop("/ECAM/msg/line3c") == "w") { + if (getprop("/ECAM/msg/linec3") == "w") { me["ECAML3"].setColor(0.8078,0.8039,0.8078); - } else if (getprop("/ECAM/msg/line3c") == "b") { + } else if (getprop("/ECAM/msg/linec3") == "b") { me["ECAML3"].setColor(0.0901,0.6039,0.7176); - } else if (getprop("/ECAM/msg/line3c") == "g") { + } else if (getprop("/ECAM/msg/linec3") == "g") { me["ECAML3"].setColor(0.0509,0.7529,0.2941); - } else if (getprop("/ECAM/msg/line3c") == "a") { + } else if (getprop("/ECAM/msg/linec3") == "a") { me["ECAML3"].setColor(0.7333,0.3803,0); - } else if (getprop("/ECAM/msg/line3c") == "r") { + } else if (getprop("/ECAM/msg/linec3") == "r") { me["ECAML3"].setColor(1,0,0); } - if (getprop("/ECAM/msg/line4c") == "w") { + if (getprop("/ECAM/msg/linec4") == "w") { me["ECAML4"].setColor(0.8078,0.8039,0.8078); - } else if (getprop("/ECAM/msg/line4c") == "b") { + } else if (getprop("/ECAM/msg/linec4") == "b") { me["ECAML4"].setColor(0.0901,0.6039,0.7176); - } else if (getprop("/ECAM/msg/line4c") == "g") { + } else if (getprop("/ECAM/msg/linec4") == "g") { me["ECAML4"].setColor(0.0509,0.7529,0.2941); - } else if (getprop("/ECAM/msg/line4c") == "a") { + } else if (getprop("/ECAM/msg/linec4") == "a") { me["ECAML4"].setColor(0.7333,0.3803,0); - } else if (getprop("/ECAM/msg/line4c") == "r") { + } else if (getprop("/ECAM/msg/linec4") == "r") { me["ECAML4"].setColor(1,0,0); } - if (getprop("/ECAM/msg/line5c") == "w") { + if (getprop("/ECAM/msg/linec5") == "w") { me["ECAML5"].setColor(0.8078,0.8039,0.8078); - } else if (getprop("/ECAM/msg/line5c") == "b") { + } else if (getprop("/ECAM/msg/linec5") == "b") { me["ECAML5"].setColor(0.0901,0.6039,0.7176); - } else if (getprop("/ECAM/msg/line5c") == "g") { + } else if (getprop("/ECAM/msg/linec5") == "g") { me["ECAML5"].setColor(0.0509,0.7529,0.2941); - } else if (getprop("/ECAM/msg/line5c") == "a") { + } else if (getprop("/ECAM/msg/linec5") == "a") { me["ECAML5"].setColor(0.7333,0.3803,0); - } else if (getprop("/ECAM/msg/line5c") == "r") { + } else if (getprop("/ECAM/msg/linec5") == "r") { me["ECAML5"].setColor(1,0,0); } - if (getprop("/ECAM/msg/line6c") == "w") { + if (getprop("/ECAM/msg/linec6") == "w") { me["ECAML6"].setColor(0.8078,0.8039,0.8078); - } else if (getprop("/ECAM/msg/line6c") == "b") { + } else if (getprop("/ECAM/msg/linec6") == "b") { me["ECAML6"].setColor(0.0901,0.6039,0.7176); - } else if (getprop("/ECAM/msg/line6c") == "g") { + } else if (getprop("/ECAM/msg/linec6") == "g") { me["ECAML6"].setColor(0.0509,0.7529,0.2941); - } else if (getprop("/ECAM/msg/line6c") == "a") { + } else if (getprop("/ECAM/msg/linec6") == "a") { me["ECAML6"].setColor(0.7333,0.3803,0); - } else if (getprop("/ECAM/msg/line6c") == "r") { + } else if (getprop("/ECAM/msg/linec6") == "r") { me["ECAML6"].setColor(1,0,0); } - if (getprop("/ECAM/msg/line7c") == "w") { + if (getprop("/ECAM/msg/linec7") == "w") { me["ECAML7"].setColor(0.8078,0.8039,0.8078); - } else if (getprop("/ECAM/msg/line7c") == "b") { + } else if (getprop("/ECAM/msg/linec7") == "b") { me["ECAML7"].setColor(0.0901,0.6039,0.7176); - } else if (getprop("/ECAM/msg/line7c") == "g") { + } else if (getprop("/ECAM/msg/linec7") == "g") { me["ECAML7"].setColor(0.0509,0.7529,0.2941); - } else if (getprop("/ECAM/msg/line7c") == "a") { + } else if (getprop("/ECAM/msg/linec7") == "a") { me["ECAML7"].setColor(0.7333,0.3803,0); - } else if (getprop("/ECAM/msg/line7c") == "r") { + } else if (getprop("/ECAM/msg/linec7") == "r") { me["ECAML7"].setColor(1,0,0); } - if (getprop("/ECAM/msg/line8c") == "w") { + if (getprop("/ECAM/msg/linec8") == "w") { me["ECAML8"].setColor(0.8078,0.8039,0.8078); - } else if (getprop("/ECAM/msg/line8c") == "b") { + } else if (getprop("/ECAM/msg/linec8") == "b") { me["ECAML8"].setColor(0.0901,0.6039,0.7176); - } else if (getprop("/ECAM/msg/line8c") == "g") { + } else if (getprop("/ECAM/msg/linec8") == "g") { me["ECAML8"].setColor(0.0509,0.7529,0.2941); - } else if (getprop("/ECAM/msg/line8c") == "a") { + } else if (getprop("/ECAM/msg/linec8") == "a") { me["ECAML8"].setColor(0.7333,0.3803,0); - } else if (getprop("/ECAM/msg/line8c") == "r") { + } else if (getprop("/ECAM/msg/linec8") == "r") { me["ECAML8"].setColor(1,0,0); } @@ -354,99 +354,99 @@ var canvas_upperECAM_base = { me["ECAMR7"].setText(sprintf("%s", getprop("/ECAM/rightmsg/line7"))); me["ECAMR8"].setText(sprintf("%s", getprop("/ECAM/rightmsg/line8"))); - if (getprop("/ECAM/rightmsg/line1c") == "w") { + if (getprop("/ECAM/rightmsg/linec1") == "w") { me["ECAMR1"].setColor(0.8078,0.8039,0.8078); - } else if (getprop("/ECAM/rightmsg/line1c") == "b") { + } else if (getprop("/ECAM/rightmsg/linec1") == "b") { me["ECAMR1"].setColor(0.0901,0.6039,0.7176); - } else if (getprop("/ECAM/rightmsg/line1c") == "g") { + } else if (getprop("/ECAM/rightmsg/linec1") == "g") { me["ECAMR1"].setColor(0.0509,0.7529,0.2941); - } else if (getprop("/ECAM/rightmsg/line1c") == "a") { + } else if (getprop("/ECAM/rightmsg/linec1") == "a") { me["ECAMR1"].setColor(0.7333,0.3803,0); - } else if (getprop("/ECAM/rightmsg/line1c") == "r") { + } else if (getprop("/ECAM/rightmsg/linec1") == "r") { me["ECAMR1"].setColor(1,0,0); } - if (getprop("/ECAM/rightmsg/line2c") == "w") { + if (getprop("/ECAM/rightmsg/linec2") == "w") { me["ECAMR2"].setColor(0.8078,0.8039,0.8078); - } else if (getprop("/ECAM/rightmsg/line2c") == "b") { + } else if (getprop("/ECAM/rightmsg/linec2") == "b") { me["ECAMR2"].setColor(0.0901,0.6039,0.7176); - } else if (getprop("/ECAM/rightmsg/line2c") == "g") { + } else if (getprop("/ECAM/rightmsg/linec2") == "g") { me["ECAMR2"].setColor(0.0509,0.7529,0.2941); - } else if (getprop("/ECAM/rightmsg/line2c") == "a") { + } else if (getprop("/ECAM/rightmsg/linec2") == "a") { me["ECAMR2"].setColor(0.7333,0.3803,0); - } else if (getprop("/ECAM/rightmsg/line2c") == "r") { + } else if (getprop("/ECAM/rightmsg/linec2") == "r") { me["ECAMR2"].setColor(1,0,0); } - if (getprop("/ECAM/rightmsg/line3c") == "w") { + if (getprop("/ECAM/rightmsg/linec3") == "w") { me["ECAMR3"].setColor(0.8078,0.8039,0.8078); - } else if (getprop("/ECAM/rightmsg/line3c") == "b") { + } else if (getprop("/ECAM/rightmsg/linec3") == "b") { me["ECAMR3"].setColor(0.0901,0.6039,0.7176); - } else if (getprop("/ECAM/rightmsg/line3c") == "g") { + } else if (getprop("/ECAM/rightmsg/linec3") == "g") { me["ECAMR3"].setColor(0.0509,0.7529,0.2941); - } else if (getprop("/ECAM/rightmsg/line3c") == "a") { + } else if (getprop("/ECAM/rightmsg/linec3") == "a") { me["ECAMR3"].setColor(0.7333,0.3803,0); - } else if (getprop("/ECAM/rightmsg/line3c") == "r") { + } else if (getprop("/ECAM/rightmsg/linec3") == "r") { me["ECAMR3"].setColor(1,0,0); } - if (getprop("/ECAM/rightmsg/line4c") == "w") { + if (getprop("/ECAM/rightmsg/linec4") == "w") { me["ECAMR4"].setColor(0.8078,0.8039,0.8078); - } else if (getprop("/ECAM/rightmsg/line4c") == "b") { + } else if (getprop("/ECAM/rightmsg/linec4") == "b") { me["ECAMR4"].setColor(0.0901,0.6039,0.7176); - } else if (getprop("/ECAM/rightmsg/line4c") == "g") { + } else if (getprop("/ECAM/rightmsg/linec4") == "g") { me["ECAMR4"].setColor(0.0509,0.7529,0.2941); - } else if (getprop("/ECAM/rightmsg/line4c") == "a") { + } else if (getprop("/ECAM/rightmsg/linec4") == "a") { me["ECAMR4"].setColor(0.7333,0.3803,0); - } else if (getprop("/ECAM/rightmsg/line4c") == "r") { + } else if (getprop("/ECAM/rightmsg/linec4") == "r") { me["ECAMR4"].setColor(1,0,0); } - if (getprop("/ECAM/rightmsg/line5c") == "w") { + if (getprop("/ECAM/rightmsg/linec5") == "w") { me["ECAMR5"].setColor(0.8078,0.8039,0.8078); - } else if (getprop("/ECAM/rightmsg/line5c") == "b") { + } else if (getprop("/ECAM/rightmsg/linec5") == "b") { me["ECAMR5"].setColor(0.0901,0.6039,0.7176); - } else if (getprop("/ECAM/rightmsg/line5c") == "g") { + } else if (getprop("/ECAM/rightmsg/linec5") == "g") { me["ECAMR5"].setColor(0.0509,0.7529,0.2941); - } else if (getprop("/ECAM/rightmsg/line5c") == "a") { + } else if (getprop("/ECAM/rightmsg/linec5") == "a") { me["ECAMR5"].setColor(0.7333,0.3803,0); - } else if (getprop("/ECAM/rightmsg/line5c") == "r") { + } else if (getprop("/ECAM/rightmsg/linec5") == "r") { me["ECAMR5"].setColor(1,0,0); } - if (getprop("/ECAM/rightmsg/line6c") == "w") { + if (getprop("/ECAM/rightmsg/linec6") == "w") { me["ECAMR6"].setColor(0.8078,0.8039,0.8078); - } else if (getprop("/ECAM/rightmsg/line6c") == "b") { + } else if (getprop("/ECAM/rightmsg/linec6") == "b") { me["ECAMR6"].setColor(0.0901,0.6039,0.7176); - } else if (getprop("/ECAM/rightmsg/line6c") == "g") { + } else if (getprop("/ECAM/rightmsg/linec6") == "g") { me["ECAMR6"].setColor(0.0509,0.7529,0.2941); - } else if (getprop("/ECAM/rightmsg/line6c") == "a") { + } else if (getprop("/ECAM/rightmsg/linec6") == "a") { me["ECAMR6"].setColor(0.7333,0.3803,0); - } else if (getprop("/ECAM/rightmsg/line6c") == "r") { + } else if (getprop("/ECAM/rightmsg/linec6") == "r") { me["ECAMR6"].setColor(1,0,0); } - if (getprop("/ECAM/rightmsg/line7c") == "w") { + if (getprop("/ECAM/rightmsg/linec7") == "w") { me["ECAMR7"].setColor(0.8078,0.8039,0.8078); - } else if (getprop("/ECAM/rightmsg/line7c") == "b") { + } else if (getprop("/ECAM/rightmsg/linec7") == "b") { me["ECAMR7"].setColor(0.0901,0.6039,0.7176); - } else if (getprop("/ECAM/rightmsg/line7c") == "g") { + } else if (getprop("/ECAM/rightmsg/linec7") == "g") { me["ECAMR7"].setColor(0.0509,0.7529,0.2941); - } else if (getprop("/ECAM/rightmsg/line7c") == "a") { + } else if (getprop("/ECAM/rightmsg/linec7") == "a") { me["ECAMR7"].setColor(0.7333,0.3803,0); - } else if (getprop("/ECAM/rightmsg/line7c") == "r") { + } else if (getprop("/ECAM/rightmsg/linec7") == "r") { me["ECAMR7"].setColor(1,0,0); } - if (getprop("/ECAM/rightmsg/line8c") == "w") { + if (getprop("/ECAM/rightmsg/linec8") == "w") { me["ECAMR8"].setColor(0.8078,0.8039,0.8078); - } else if (getprop("/ECAM/rightmsg/line8c") == "b") { + } else if (getprop("/ECAM/rightmsg/linec8") == "b") { me["ECAMR8"].setColor(0.0901,0.6039,0.7176); - } else if (getprop("/ECAM/rightmsg/line8c") == "g") { + } else if (getprop("/ECAM/rightmsg/linec8") == "g") { me["ECAMR8"].setColor(0.0509,0.7529,0.2941); - } else if (getprop("/ECAM/rightmsg/line8c") == "a") { + } else if (getprop("/ECAM/rightmsg/linec8") == "a") { me["ECAMR8"].setColor(0.7333,0.3803,0); - } else if (getprop("/ECAM/rightmsg/line8c") == "r") { + } else if (getprop("/ECAM/rightmsg/linec8") == "r") { me["ECAMR8"].setColor(1,0,0); } diff --git a/Nasal/ECAM-controller.nas b/Nasal/ECAM-controller.nas index cd6f1c41..9a582c4f 100644 --- a/Nasal/ECAM-controller.nas +++ b/Nasal/ECAM-controller.nas @@ -63,12 +63,16 @@ var right_line = nil; var warning = { msg: "", active: 0, - new: func(msg,active) { + colour: "", + aural: "", + light: "", + new: func(msg,active,colour,aural,light) { var t = {parents:[warning]}; t.msg = msg; t.active = active; + t.colour = colour; return t @@ -77,9 +81,12 @@ var warning = { var line = 1; while (getprop("/ECAM/msg/line" ~ line) != "") { line = line + 1; # go to next line until empty line - } + } + + # if (getprop("/ECAM/msg/line" ~ line) != me.msg) if (getprop("/ECAM/msg/line" ~ line) == "" and me.active == 1) { # at empty line - setprop("/ECAM/msg/line" ~ (line), me.msg); + setprop("/ECAM/msg/line" ~ line, me.msg); + setprop("/ECAM/msg/linec" ~ line, me.colour); } }, }; @@ -87,12 +94,16 @@ var warning = { var memo = { msg: "", active: 0, - new: func(msg,active) { + colour: "", + aural: "", + light: "", + new: func(msg,active,colour,aural,light) { var t = {parents:[memo]}; t.msg = msg; t.active = active; + t.colour = colour; return t @@ -102,17 +113,22 @@ var memo = { while (getprop("/ECAM/rightmsg/line" ~ right_line) != "") { right_line = right_line + 1; # go to next line until empty line } + if (getprop("/ECAM/rightmsg/line" ~ right_line) == "" and me.active == 1) { # at empty line - setprop("/ECAM/rightmsg/line" ~ (right_line), me.msg); + setprop("/ECAM/rightmsg/line" ~ right_line, me.msg); + setprop("/ECAM/rightmsg/linec" ~ right_line, me.colour); } }, }; # messages logic and added to arrays -var warnings = std.Vector.new([var lg_not_dn = warning.new(msg: "L/G GEAR NOT DOWN", active: 0)]); +var warnings = std.Vector.new([ +var lg_not_dn = warning.new(msg: "L/G GEAR NOT DOWN", active: 0, colour: "r") +]); + var memos = std.Vector.new([ -var gnd_splrs = memo.new(msg: "GND SPLRS ARMED", active: 0), -var park_brk = memo.new(msg: "PARK BRK", active: 0) +var gnd_splrs = memo.new(msg: "GND SPLRS ARMED", active: 0, colour: "g"), +var park_brk = memo.new(msg: "PARK BRK", active: 0, colour: "g") ]); @@ -154,6 +170,25 @@ var ECAM_controller = { messages_memo(); messages_right_memo(); + # clear display momentarily + + + if (warnings.size() > 0) { + for(var n=1; n<8; n+=1) { + # if (!warnings.contains(getprop("/ECAM/msg/line" ~ (n)))) { + setprop("/ECAM/msg/line" ~ n, ""); + #} + } + } + + if (memos.size() > 0) { + for(var n=1; n<8; n+=1) { + # if (!memos.contains(getprop("/ECAM/rightmsg/line" ~ (n)))) { + setprop("/ECAM/rightmsg/line" ~ n, ""); + # } + } + } + # write to ECAM foreach (var i; warnings.vector) { @@ -163,21 +198,5 @@ var ECAM_controller = { foreach (var m; memos.vector) { m.write(); } - - if (warnings.size() > 0) { - for(var n=1; n 0) { - for(var n=1; n Date: Thu, 2 Aug 2018 20:42:14 +0100 Subject: [PATCH 11/15] Add logic for lights, etc, add sounds from a320neo --- Nasal/ECAM-controller.nas | 42 +++++++++++++++++++-------- Sounds/A320-common-sound.xml | 51 +++++++++++++++++++++++++++++++++ Sounds/Cockpit/chime.wav | Bin 0 -> 24800 bytes Sounds/Cockpit/crc.wav | Bin 0 -> 11138 bytes Sounds/Cockpit/stall_voice.wav | Bin 0 -> 76044 bytes 5 files changed, 81 insertions(+), 12 deletions(-) create mode 100644 Sounds/Cockpit/chime.wav create mode 100644 Sounds/Cockpit/crc.wav create mode 100644 Sounds/Cockpit/stall_voice.wav diff --git a/Nasal/ECAM-controller.nas b/Nasal/ECAM-controller.nas index 9a582c4f..6c17d41e 100644 --- a/Nasal/ECAM-controller.nas +++ b/Nasal/ECAM-controller.nas @@ -54,11 +54,15 @@ # PHASE: /FMGC/status/phase # DISPLAY: 1 - EWD 2 - MEMO 3 - STATUS + +# commented lines of logic are waiting for proper FMGC warning phases var num_lines = 6; var msg = nil; var spacer = nil; var line = nil; var right_line = nil; +setprop("/ECAM/warnings/master-warning-light", 0); +setprop("/ECAM/warnings/master-caution-light", 0); var warning = { msg: "", @@ -66,13 +70,17 @@ var warning = { colour: "", aural: "", light: "", - new: func(msg,active,colour,aural,light) { + noRepeat: 0, + new: func(msg,active,colour,aural,light,noRepeat) { var t = {parents:[warning]}; t.msg = msg; t.active = active; t.colour = colour; + t.aural = aural; + t.light = light; + t.noRepeat = noRepeat; return t @@ -89,15 +97,19 @@ var warning = { setprop("/ECAM/msg/linec" ~ line, me.colour); } }, + warnlight: func() { + if (me.light != "none" and me.noRepeat == 0 and me.active == 1) { # only toggle light once per message, allows canceling + setprop("/ECAM/warnings/master-"~me.light~"-light", 1); + me.noRepeat = 1; + } + }, }; var memo = { msg: "", active: 0, colour: "", - aural: "", - light: "", - new: func(msg,active,colour,aural,light) { + new: func(msg,active,colour) { var t = {parents:[memo]}; @@ -123,7 +135,7 @@ var memo = { # messages logic and added to arrays var warnings = std.Vector.new([ -var lg_not_dn = warning.new(msg: "L/G GEAR NOT DOWN", active: 0, colour: "r") +var lg_not_dn = warning.new(msg: "L/G GEAR NOT DOWN", active: 0, colour: "r", aural: "crc", light: "warning", noRepeat: 0) ]); var memos = std.Vector.new([ @@ -134,9 +146,11 @@ var park_brk = memo.new(msg: "PARK BRK", active: 0, colour: "g") var messages_priority_3 = func { if (getprop("/controls/flight/flap-pos") > 2 and getprop("/position/gear-agl-ft") < 750 and getprop("/gear/gear[1]/position-norm") != 1 and getprop("/FMGC/status/phase") == 5) { - lg_not_dn.active = 1; + # if ((getprop("/controls/flight/flap-pos") > 2 and getprop("/position/gear-agl-ft") < 750 and getprop("/gear/gear[1]/position-norm") != 1 and (getprop("/FMGC/status/phase") != 3 and getprop("/FMGC/status/phase") != 4 and getprop("/FMGC/status/phase") != 5)) or ((getprop("/engines/engine[0]/n1-actual") < 75.0 and getprop("/engines/engine[1]/n1-actual") < 75.0) and getprop("/position/gear-agl-ft") < 750 and getprop("/gear/gear[1]/position-norm") != 1 and (getprop("/FMGC/status/phase") != 3 and getprop("/FMGC/status/phase") != 4 and getprop("/FMGC/status/phase") != 5 and getprop("/FMGC/status/phase") != 6)) or (((getprop("/engines/engine[0]/n1-actual") < 77.0 and getprop("/controls/engines/engine[1]/cutoff-switch") == 0) or (getprop("/engines/engine[1]/n1-actual") < 77.0 and getprop("/controls/engines/engine[0]/cutoff-switch") == 0) and getprop("/position/gear-agl-ft") < 750 and getprop("/gear/gear[1]/position-norm") != 1 and (getprop("/FMGC/status/phase") != 3 and getprop("/FMGC/status/phase") != 4 and getprop("/FMGC/status/phase") != 5 and getprop("/FMGC/status/phase") != 6))) { + lg_not_dn.active = 1; } else { lg_not_dn.active = 0; + lg_not_dn.noRepeat = 0; } } var messages_priority_2 = func {} @@ -149,11 +163,18 @@ var messages_right_memo = func { } else { gnd_splrs.active = 0; } + + #if (getprop("/controls/gear/brake-parking") == 1 and getprop("/FMGC/status/phase") != 3) { if (getprop("/controls/gear/brake-parking") == 1) { park_brk.active = 1; } else { park_brk.active = 0; } + if (getprop("/FMGC/status/phase") >= 4 and getprop("/FMGC/status/phase") <= 8) { + park_brk.colour = "a"; + } else { + park_brk.colour = "g"; + } } # Finally the controller @@ -175,17 +196,13 @@ var ECAM_controller = { if (warnings.size() > 0) { for(var n=1; n<8; n+=1) { - # if (!warnings.contains(getprop("/ECAM/msg/line" ~ (n)))) { - setprop("/ECAM/msg/line" ~ n, ""); - #} + setprop("/ECAM/msg/line" ~ n, ""); } } if (memos.size() > 0) { for(var n=1; n<8; n+=1) { - # if (!memos.contains(getprop("/ECAM/rightmsg/line" ~ (n)))) { - setprop("/ECAM/rightmsg/line" ~ n, ""); - # } + setprop("/ECAM/rightmsg/line" ~ n, ""); } } @@ -193,6 +210,7 @@ var ECAM_controller = { foreach (var i; warnings.vector) { i.write(); + i.warnlight(); } foreach (var m; memos.vector) { diff --git a/Sounds/A320-common-sound.xml b/Sounds/A320-common-sound.xml index 33ef403a..7eb33a15 100644 --- a/Sounds/A320-common-sound.xml +++ b/Sounds/A320-common-sound.xml @@ -1468,6 +1468,57 @@ 0.60 + + + Chime + Aircraft/IDG-A32X/Sounds/Cockpit/chime.wav + once + avionics + + /sim/sound/warnings/chime + + + sim/sound/effects/volume + + 10 + 100 + + + + CRC + Aircraft/IDG-A32X/Sounds/Cockpit/crc.wav + looped + avionics + + /warnings/master-warning-light + /sim/sound/warnings/crc + + + sim/sound/effects/volume + + 10 + 100 + + + + stall-voice + looped + /Aircraft/IDG-A32X/Sounds/Cockpit/stall_voice.wav + avionics + + warnings/stall/active + + + sim/sound/effects/volume + 3 + + 1 + 6 + + + 10 + 100.0 + \ No newline at end of file diff --git a/Sounds/Cockpit/chime.wav b/Sounds/Cockpit/chime.wav new file mode 100644 index 0000000000000000000000000000000000000000..4a575fce7017b133edc7aa7a660c1f9e08cec53c GIT binary patch literal 24800 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 a_YybLEAb-&uwXps3a>+)LasvY-+ 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 aEZ|#EIwT320i6ad27d;aVml+V!~YLZTe8pq literal 0 HcmV?d00001 diff --git a/Sounds/Cockpit/stall_voice.wav b/Sounds/Cockpit/stall_voice.wav new file mode 100644 index 0000000000000000000000000000000000000000..ff066513d69a269d8f033ae19b478149fa39cefa GIT binary patch literal 76044 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 Q21qSw%X^jta=qUF1H7i8&j0`b literal 0 HcmV?d00001 From 6783b52a22c3a72e5fd90a15076ef1502cc3ad5f Mon Sep 17 00:00:00 2001 From: Joshua Davidson Date: Thu, 2 Aug 2018 15:58:30 -0400 Subject: [PATCH 12/15] 3D: Add animations for master warning and caution lights --- Models/FlightDeck/a320.flightdeck.xml | 77 ++++++++++++++++++++++++++- 1 file changed, 75 insertions(+), 2 deletions(-) diff --git a/Models/FlightDeck/a320.flightdeck.xml b/Models/FlightDeck/a320.flightdeck.xml index d3856c3b..0fcc1928 100644 --- a/Models/FlightDeck/a320.flightdeck.xml +++ b/Models/FlightDeck/a320.flightdeck.xml @@ -391,8 +391,6 @@ ecam_wheel_led exped_led hdg-text-test - master_caution_on - master_warning_on qnh-test rudder-trim-test spd-text-test @@ -4724,6 +4722,81 @@ controls/lighting/fcu-panel-norm + + + + select + master_warning_on + + + + controls/switches/annun-test + 1 + + + ECAM/warnings/master-warning-light + 1 + + + + + + + select + master_caution_on + + + + controls/switches/annun-test + 1 + + + ECAM/warnings/master-caution-light + 1 + + + + + + + pick + master_warning + master_warning_on + + + + + + systems/electrical/bus/dc-ess + 25 + + + property-assign + ECAM/warnings/master-warning-light + 0 + + + + + + pick + master_caution + master_caution_on + + + + + + systems/electrical/bus/dc-ess + 25 + + + property-assign + ECAM/warnings/master-caution-light + 0 + + + From e486a8219cb28c90867491cba002df8872c64504 Mon Sep 17 00:00:00 2001 From: Jonathan Redpath Date: Fri, 3 Aug 2018 10:36:02 +0100 Subject: [PATCH 13/15] Sounds and lights work! --- Nasal/ECAM-controller.nas | 23 +++++++++++++++++++++-- Nasal/libraries.nas | 9 +++++++++ Sounds/A320-common-sound.xml | 2 +- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/Nasal/ECAM-controller.nas b/Nasal/ECAM-controller.nas index 6c17d41e..7391ccb8 100644 --- a/Nasal/ECAM-controller.nas +++ b/Nasal/ECAM-controller.nas @@ -103,6 +103,15 @@ var warning = { me.noRepeat = 1; } }, + sound: func() { + if (me.active and me.aural != "none" and getprop("/sim/sound/warnings/"~me.aural) != 1) { + setprop("/sim/sound/warnings/"~me.aural, 1); + } else if (!me.active or me.aural == "none") { + if (getprop("/sim/sound/warnings/"~me.aural) == 1) { + setprop("/sim/sound/warnings/"~me.aural, 0); + } + } + }, }; var memo = { @@ -135,7 +144,8 @@ var memo = { # messages logic and added to arrays var warnings = std.Vector.new([ -var lg_not_dn = warning.new(msg: "L/G GEAR NOT DOWN", active: 0, colour: "r", aural: "crc", light: "warning", noRepeat: 0) +var lg_not_dn = warning.new(msg: "L/G GEAR NOT DOWN", active: 0, colour: "r", aural: "crc", light: "warning", noRepeat: 0), +var park_brk_on = warning.new(msg: "PARK BRK ON", active: 0, colour: "a", aural: "chime", light: "caution", noRepeat: 0) ]); var memos = std.Vector.new([ @@ -153,7 +163,15 @@ var messages_priority_3 = func { lg_not_dn.noRepeat = 0; } } -var messages_priority_2 = func {} +var messages_priority_2 = func { + # if (getprop("/controls/gear/brake-parking") and (getprop("/FMGC/status/phase") >= 6 and getprop("/FMGC/status/phase") <= 7)) { + if (getprop("/controls/gear/brake-parking") and (getprop("/FMGC/status/phase") >= 2 and getprop("/FMGC/status/phase") <= 5)) { + park_brk_on.active = 1; + } else { + park_brk_on.active = 0; + park_brk_on.noRepeat = 0; + } +} var messages_priority_1 = func {} var messages_priority_0 = func {} var messages_memo = func {} @@ -211,6 +229,7 @@ var ECAM_controller = { foreach (var i; warnings.vector) { i.write(); i.warnlight(); + i.sound(); } foreach (var m; memos.vector) { diff --git a/Nasal/libraries.nas b/Nasal/libraries.nas index 3e7c49dd..e34dc10c 100644 --- a/Nasal/libraries.nas +++ b/Nasal/libraries.nas @@ -125,6 +125,15 @@ setlistener("/controls/switches/no-smoking-sign", func { }, 1); }); +setlistener("/sim/sounde/btn1", func { + if (!getprop("/sim/sounde/btn1")) { + return; + } + settimer(func { + props.globals.getNode("/sim/sound/warnings/").setBoolValue(1); + }, 0.05); +}); + ######### # Doors # ######### diff --git a/Sounds/A320-common-sound.xml b/Sounds/A320-common-sound.xml index 7eb33a15..64aca775 100644 --- a/Sounds/A320-common-sound.xml +++ b/Sounds/A320-common-sound.xml @@ -1490,7 +1490,7 @@ looped avionics - /warnings/master-warning-light + /ECAM/warnings/master-warning-light /sim/sound/warnings/crc From 78dad8e558a37066dd81b57edb8414cd24db1035 Mon Sep 17 00:00:00 2001 From: Jonathan Redpath Date: Fri, 3 Aug 2018 15:48:34 +0100 Subject: [PATCH 14/15] Add messages --- Nasal/ECAM-controller.nas | 45 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/Nasal/ECAM-controller.nas b/Nasal/ECAM-controller.nas index 7391ccb8..91e75105 100644 --- a/Nasal/ECAM-controller.nas +++ b/Nasal/ECAM-controller.nas @@ -61,6 +61,7 @@ var msg = nil; var spacer = nil; var line = nil; var right_line = nil; +var wow = getprop("/gear/gear[1]/wow"); setprop("/ECAM/warnings/master-warning-light", 0); setprop("/ECAM/warnings/master-caution-light", 0); @@ -149,8 +150,13 @@ var park_brk_on = warning.new(msg: "PARK BRK ON", active: 0, colour: "a", aural: ]); var memos = std.Vector.new([ +var spd_brk = memo.new(msg: "SPEED BRK", active: 0, colour: "g"), +var fob_3T = memo.new(msg: "FOB BELOW 3T", active: 0, colour: "g"), +var emer_gen = memo.new(msg: "EMER GEN", active: 0, colour: "g"), var gnd_splrs = memo.new(msg: "GND SPLRS ARMED", active: 0, colour: "g"), -var park_brk = memo.new(msg: "PARK BRK", active: 0, colour: "g") +var park_brk = memo.new(msg: "PARK BRK", active: 0, colour: "g"), +var refuelg = memo.new(msg: "REFUELG", active: 0, colour: "g"), +var ram_air = memo.new(msg: "RAM AIR ON", active: 0, colour: "g") ]); @@ -193,6 +199,43 @@ var messages_right_memo = func { } else { park_brk.colour = "g"; } + + if (getprop("/controls/pneumatic/switches/ram-air") == 1) { + ram_air.active = 1; + } else { + ram_air.active = 0; + } + + if (getprop("/controls/electrical/switches/emer-gen") == 1 and getprop("/controls/hydraulic/rat-deployed") == 1 and !wow) { + emer_gen.active = 1; + } else { + emer_gen.active = 0; + } + + if ((getprop("/FMGC/status/phase") >= 2 and getprop("/FMGC/status/phase") <= 7) and getprop("controls/flight/speedbrake") != 0) { + spd_brk.active = 1; + } else { + spd_brk.active = 0; + } + + if (getprop("/systems/thrust/state1") == "IDLE" and getprop("/systems/thrust/state2") == "IDLE" and getprop("/FMGC/status/phase") >= 6 and getprop("/FMGC/status/phase") <= 7) { + spd_brk.colour = "g"; + } else if ((getprop("/FMGC/status/phase") >= 2 and getprop("/FMGC/status/phase") <= 5) or ((getprop("/systems/thrust/state1") != "IDLE" or getprop("/systems/thrust/state2") != "IDLE") and (getprop("/FMGC/status/phase") >= 6 and getprop("/FMGC/status/phase") <= 7))) { + spd_brk.colour = "a"; + } + + if (getprop("services/fuel-truck/enable") == 1 and getprop("/ECAM/left-msg") != "TO-MEMO" and getprop("/ECAM/left-msg") != "LDG-MEMO") { + refuelg.active = 1; + } else { + refuelg.active = 0; + } + + + if (getprop("/consumables/fuel/total-fuel-lbs") < 6000 and getprop("/ECAM/left-msg") != "TO-MEMO" and getprop("/ECAM/left-msg") != "LDG-MEMO") { # assuming US short ton 2000lb + fob_3T.active = 1; + } else { + fob_3T.active = 0; + } } # Finally the controller From 0c62d99becf9a1392a3e11045f5afc6181efcca1 Mon Sep 17 00:00:00 2001 From: Jonathan Redpath Date: Tue, 7 Aug 2018 10:30:07 +0100 Subject: [PATCH 15/15] ECAM --- Models/Instruments/Upper-ECAM/Upper-ECAM.nas | 34 +++++++++- .../Instruments/Upper-ECAM/res/cfm-eis2.svg | 4 +- .../Instruments/Upper-ECAM/res/iae-eis2.svg | 4 +- Nasal/ECAM-controller.nas | 66 ++++++++++++++++++- Nasal/icing.nas | 9 +++ Nasal/libraries.nas | 4 +- 6 files changed, 110 insertions(+), 11 deletions(-) diff --git a/Models/Instruments/Upper-ECAM/Upper-ECAM.nas b/Models/Instruments/Upper-ECAM/Upper-ECAM.nas index 8b7c4151..7fadeffa 100644 --- a/Models/Instruments/Upper-ECAM/Upper-ECAM.nas +++ b/Models/Instruments/Upper-ECAM/Upper-ECAM.nas @@ -157,6 +157,8 @@ var canvas_upperECAM_base = { me["ECAML1"].setColor(0.7333,0.3803,0); } else if (getprop("/ECAM/msg/linec1") == "r") { me["ECAML1"].setColor(1,0,0); + } else if (getprop("/ECAM/msg/linec1") == "m") { + me["ECAML1"].setColor(0.6901,0.3333,0.7450); } if (getprop("/ECAM/msg/linec2") == "w") { @@ -169,6 +171,8 @@ var canvas_upperECAM_base = { me["ECAML2"].setColor(0.7333,0.3803,0); } else if (getprop("/ECAM/msg/linec2") == "r") { me["ECAML2"].setColor(1,0,0); + } else if (getprop("/ECAM/msg/linec2") == "m") { + me["ECAML2"].setColor(0.6901,0.3333,0.7450); } if (getprop("/ECAM/msg/linec3") == "w") { @@ -181,6 +185,8 @@ var canvas_upperECAM_base = { me["ECAML3"].setColor(0.7333,0.3803,0); } else if (getprop("/ECAM/msg/linec3") == "r") { me["ECAML3"].setColor(1,0,0); + } else if (getprop("/ECAM/msg/linec3") == "m") { + me["ECAML3"].setColor(0.6901,0.3333,0.7450); } if (getprop("/ECAM/msg/linec4") == "w") { @@ -193,6 +199,8 @@ var canvas_upperECAM_base = { me["ECAML4"].setColor(0.7333,0.3803,0); } else if (getprop("/ECAM/msg/linec4") == "r") { me["ECAML4"].setColor(1,0,0); + } else if (getprop("/ECAM/msg/linec4") == "m") { + me["ECAML4"].setColor(0.6901,0.3333,0.7450); } if (getprop("/ECAM/msg/linec5") == "w") { @@ -205,6 +213,8 @@ var canvas_upperECAM_base = { me["ECAML5"].setColor(0.7333,0.3803,0); } else if (getprop("/ECAM/msg/linec5") == "r") { me["ECAML5"].setColor(1,0,0); + } else if (getprop("/ECAM/msg/linec5") == "m") { + me["ECAML5"].setColor(0.6901,0.3333,0.7450); } if (getprop("/ECAM/msg/linec6") == "w") { @@ -217,6 +227,8 @@ var canvas_upperECAM_base = { me["ECAML6"].setColor(0.7333,0.3803,0); } else if (getprop("/ECAM/msg/linec6") == "r") { me["ECAML6"].setColor(1,0,0); + } else if (getprop("/ECAM/msg/linec6") == "m") { + me["ECAML6"].setColor(0.6901,0.3333,0.7450); } if (getprop("/ECAM/msg/linec7") == "w") { @@ -229,6 +241,8 @@ var canvas_upperECAM_base = { me["ECAML7"].setColor(0.7333,0.3803,0); } else if (getprop("/ECAM/msg/linec7") == "r") { me["ECAML7"].setColor(1,0,0); + } else if (getprop("/ECAM/msg/linec7") == "m") { + me["ECAML7"].setColor(0.6901,0.3333,0.7450); } if (getprop("/ECAM/msg/linec8") == "w") { @@ -241,6 +255,8 @@ var canvas_upperECAM_base = { me["ECAML8"].setColor(0.7333,0.3803,0); } else if (getprop("/ECAM/msg/linec8") == "r") { me["ECAML8"].setColor(1,0,0); + } else if (getprop("/ECAM/msg/linec8") == "m") { + me["ECAML8"].setColor(0.6901,0.3333,0.7450); } me["TO_Memo"].hide(); @@ -364,6 +380,8 @@ var canvas_upperECAM_base = { me["ECAMR1"].setColor(0.7333,0.3803,0); } else if (getprop("/ECAM/rightmsg/linec1") == "r") { me["ECAMR1"].setColor(1,0,0); + } else if (getprop("/ECAM/rightmsg/linec1") == "m") { + me["ECAMR1"].setColor(0.6901,0.3333,0.7450); } if (getprop("/ECAM/rightmsg/linec2") == "w") { @@ -376,6 +394,8 @@ var canvas_upperECAM_base = { me["ECAMR2"].setColor(0.7333,0.3803,0); } else if (getprop("/ECAM/rightmsg/linec2") == "r") { me["ECAMR2"].setColor(1,0,0); + } else if (getprop("/ECAM/rightmsg/linec2") == "m") { + me["ECAMR2"].setColor(0.6901,0.3333,0.7450); } if (getprop("/ECAM/rightmsg/linec3") == "w") { @@ -388,6 +408,8 @@ var canvas_upperECAM_base = { me["ECAMR3"].setColor(0.7333,0.3803,0); } else if (getprop("/ECAM/rightmsg/linec3") == "r") { me["ECAMR3"].setColor(1,0,0); + } else if (getprop("/ECAM/rightmsg/linec3") == "m") { + me["ECAMR3"].setColor(0.6901,0.3333,0.7450); } if (getprop("/ECAM/rightmsg/linec4") == "w") { @@ -400,6 +422,8 @@ var canvas_upperECAM_base = { me["ECAMR4"].setColor(0.7333,0.3803,0); } else if (getprop("/ECAM/rightmsg/linec4") == "r") { me["ECAMR4"].setColor(1,0,0); + } else if (getprop("/ECAM/rightmsg/linec4") == "m") { + me["ECAMR4"].setColor(0.6901,0.3333,0.7450); } if (getprop("/ECAM/rightmsg/linec5") == "w") { @@ -412,6 +436,8 @@ var canvas_upperECAM_base = { me["ECAMR5"].setColor(0.7333,0.3803,0); } else if (getprop("/ECAM/rightmsg/linec5") == "r") { me["ECAMR5"].setColor(1,0,0); + } else if (getprop("/ECAM/rightmsg/linec5") == "m") { + me["ECAMR5"].setColor(0.6901,0.3333,0.7450); } if (getprop("/ECAM/rightmsg/linec6") == "w") { @@ -424,6 +450,8 @@ var canvas_upperECAM_base = { me["ECAMR6"].setColor(0.7333,0.3803,0); } else if (getprop("/ECAM/rightmsg/linec6") == "r") { me["ECAMR6"].setColor(1,0,0); + } else if (getprop("/ECAM/rightmsg/linec6") == "m") { + me["ECAMR6"].setColor(0.6901,0.3333,0.7450); } if (getprop("/ECAM/rightmsg/linec7") == "w") { @@ -436,6 +464,8 @@ var canvas_upperECAM_base = { me["ECAMR7"].setColor(0.7333,0.3803,0); } else if (getprop("/ECAM/rightmsg/linec7") == "r") { me["ECAMR7"].setColor(1,0,0); + } else if (getprop("/ECAM/rightmsg/linec7") == "m") { + me["ECAMR7"].setColor(0.6901,0.3333,0.7450); } if (getprop("/ECAM/rightmsg/linec8") == "w") { @@ -448,10 +478,10 @@ var canvas_upperECAM_base = { me["ECAMR8"].setColor(0.7333,0.3803,0); } else if (getprop("/ECAM/rightmsg/linec8") == "r") { me["ECAMR8"].setColor(1,0,0); + } else if (getprop("/ECAM/rightmsg/linec8") == "m") { + me["ECAMR8"].setColor(0.6901,0.3333,0.7450); } - me["TO_Memo"].hide(); - me["LDG_Memo"].hide(); me["ECAM_Right"].show(); } else { me["ECAM_Right"].hide(); diff --git a/Models/Instruments/Upper-ECAM/res/cfm-eis2.svg b/Models/Instruments/Upper-ECAM/res/cfm-eis2.svg index e0f1da29..cfb5c7fe 100644 --- a/Models/Instruments/Upper-ECAM/res/cfm-eis2.svg +++ b/Models/Instruments/Upper-ECAM/res/cfm-eis2.svg @@ -42,7 +42,7 @@ id="namedview371" showgrid="false" inkscape:zoom="0.50000001" - inkscape:cx="206.17626" + inkscape:cx="659.36853" inkscape:cy="512.09207" inkscape:window-x="-8" inkscape:window-y="-8" @@ -1746,7 +1746,7 @@ + transform="translate(665.99997)"> + transform="translate(665.63937)"> = 3 and getprop("/FMGC/status/phase") <= 5) { + to_inhibit.active = 1; + } else { + to_inhibit.active = 0; + } + + if (getprop("/FMGC/status/phase") >= 7 and getprop("/FMGC/status/phase") <= 7) { + ldg_inhibit.active = 1; + } else { + ldg_inhibit.active = 0; + } + if (getprop("controls/flight/speedbrake-arm") == 1) { gnd_splrs.active = 1; } else { @@ -229,13 +248,54 @@ var messages_right_memo = func { } else { refuelg.active = 0; } - if (getprop("/consumables/fuel/total-fuel-lbs") < 6000 and getprop("/ECAM/left-msg") != "TO-MEMO" and getprop("/ECAM/left-msg") != "LDG-MEMO") { # assuming US short ton 2000lb fob_3T.active = 1; } else { fob_3T.active = 0; } + + if (getprop("/systems/fuel/x-feed") == 1 and getprop("controls/fuel/x-feed") == 1) { + fuelx.active = 1; + } else { + fuelx.active = 0; + } + + if (getprop("/FMGC/status/phase") >= 3 and getprop("/FMGC/status/phase") <= 5) { + fuelx.colour = "a"; + } else { + fuelx.colour = "g"; + } + + if (getprop("/controls/hydraulic/ptu") == 1 and ((getprop("/systems/hydraulic/yellow-psi") < 1450 and getprop("/systems/hydraulic/green-psi") > 1450 and getprop("/controls/hydraulic/elec-pump-yellow") == 0) or (getprop("/systems/hydraulic/yellow-psi") > 1450 and getprop("/systems/hydraulic/green-psi") < 1450))) { + ptu.active = 1; + } else { + ptu.active = 0; + } + + if (getprop("/controls/hydraulic/rat-deployed") == 1) { + rat.active = 1; + } else { + rat.active = 0; + } + + if (getprop("/FMGC/status/phase") >= 1 and getprop("/FMGC/status/phase") <= 2) { + rat.colour = "a"; + } else { + rat.colour = "g"; + } + + if (getprop("/controls/switches/leng") == 1 or getprop("/controls/switches/reng") == 1 or getprop("/systems/electrical/bus/dc1") == 0 or getprop("/systems/electrical/bus/dc2") == 0) { + eng_aice.active = 1; + } else { + eng_aice.active = 0; + } + + if (getprop("/controls/switches/wing") == 1) { + eng_aice.active = 1; + } else { + eng_aice.active = 0; + } } # Finally the controller diff --git a/Nasal/icing.nas b/Nasal/icing.nas index 8243708d..17af577d 100644 --- a/Nasal/icing.nas +++ b/Nasal/icing.nas @@ -236,6 +236,15 @@ var icingModel = func { setprop("/systems/pitot/failed", 0); } } + + if (getprop("/systems/electrical/bus/dc1") == 0 or getprop("/systems/electrical/bus/dc2") == 0) { + setprop("/controls/switches/leng", 1); + setprop("/controls/switches/reng", 1); + } + + if (getprop("/systems/electrical/bus/dc-ess-shed") == 0) { + setprop("/controls/switches/wing", 0); + } } ################# diff --git a/Nasal/libraries.nas b/Nasal/libraries.nas index e34dc10c..00c94f02 100644 --- a/Nasal/libraries.nas +++ b/Nasal/libraries.nas @@ -531,13 +531,13 @@ var lightsLoop = maketimer(0.2, func { landl = getprop("/controls/lighting/landing-lights[1]"); landr = getprop("/controls/lighting/landing-lights[2]"); - if (landl == 1) { + if (landl == 1 and getprop("/sim/current-view/internal") == 1) { setprop("/sim/rendering/als-secondary-lights/use-landing-light", 1); } else { setprop("/sim/rendering/als-secondary-lights/use-landing-light", 0); } - if (landr == 1) { + if (landr == 1 and getprop("/sim/current-view/internal") == 1) { setprop("/sim/rendering/als-secondary-lights/use-alt-landing-light", 1); } else { setprop("/sim/rendering/als-secondary-lights/use-alt-landing-light", 0);