diff --git a/A320-main.xml b/A320-main.xml index cb73e3d6..6f361922 100644 --- a/A320-main.xml +++ b/A320-main.xml @@ -1541,8 +1541,9 @@ <file>Aircraft/IDG-A32X/Models/Instruments/MCDU/MCDU.nas</file> </canvas_mcdu> <ecam> - <file>Aircraft/IDG-A32X/Nasal/ECAM-controller.nas</file> - <file>Aircraft/IDG-A32X/Nasal/ECAM-logic.nas</file> + <file>Aircraft/IDG-A32X/Nasal/ECAM/ECAM-controller.nas</file> + <file>Aircraft/IDG-A32X/Nasal/ECAM/ECAM-logic.nas</file> + <file>Aircraft/IDG-A32X/Nasal/ECAM/ECAM-messages.nas</file> </ecam> <icing> <file>Aircraft/IDG-A32X/Nasal/icing.nas</file> diff --git a/Nasal/ECAM/ECAM-controller.nas b/Nasal/ECAM/ECAM-controller.nas new file mode 100644 index 00000000..687d86d6 --- /dev/null +++ b/Nasal/ECAM/ECAM-controller.nas @@ -0,0 +1,154 @@ +# A3XX Electronic Centralised Aircraft Monitoring System +# Jonathan Redpath (legoboyvdlp) + +############################################## +# Copyright (c) Joshua Davidson (it0uchpods) # +############################################## + +var num_lines = 6; +var msg = nil; +var spacer = nil; +var line = nil; +var right_line = nil; +var wow = getprop("/gear/gear[1]/wow"); +setprop("/ECAM/show-left-msg", 1); +setprop("/ECAM/show-right-msg", 1); +setprop("/ECAM/warnings/master-warning-light", 0); +setprop("/ECAM/warnings/master-caution-light", 0); +setprop("/ECAM/warnings/overflow", 0); + +var warning = { + msg: "", + active: 0, + 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 + }, + write: func() { + line = 1; + while (getprop("/ECAM/msg/line" ~ line) != "" and line <= 8) { + line = line + 1; # go to next line until empty line + } + + if (line > 8) { + setprop("/ECAM/warnings/overflow", 1); + } + + if (getprop("/ECAM/msg/line" ~ line) == "" and me.active == 1 and me.msg != "") { # at empty line. Also checks if message is not blank to allow for some warnings with no displayed msg, eg stall + setprop("/ECAM/msg/line" ~ line, me.msg); + setprop("/ECAM/msg/linec" ~ line, me.colour); + } + }, + warnlight: func() { + if ((me.light != "none" or me.light != "") 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; + } + }, + sound: func() { + if (me.active and (me.aural != "none" or me.aural != "") 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 = { + msg: "", + active: 0, + colour: "", + new: func(msg,active,colour) { + var t = {parents:[memo]}; + + t.msg = msg; + t.active = active; + t.colour = colour; + + return t + }, + write: func() { + right_line = 1; + while (getprop("/ECAM/rightmsg/line" ~ right_line) != "" and right_line <= 8) { + right_line = right_line + 1; # go to next line until empty line + } + + if (right_line > 8) { + setprop("/ECAM/warnings/overflow", 1); + } + + 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/linec" ~ right_line, me.colour); + } + }, +}; + +var ECAM_controller = { + init: func() { + ECAMloopTimer.start(); + }, + loop: func() { + # check active messages + # config_warnings(); + # messages_priority_3(); + # messages_priority_2(); + # messages_priority_1(); + # messages_priority_0(); + messages_memo(); + messages_right_memo(); + + # clear display momentarily + + + for(var n = 1; n < 8; n += 1) { + setprop("/ECAM/msg/line" ~ n, ""); + } + + for(var n = 1; n < 8; n += 1) { + setprop("/ECAM/rightmsg/line" ~ n, ""); + } + + # write to ECAM + + # foreach (var w; warnings.vector) { + # w.write(); + # w.warnlight(); + # w.sound(); + # } + + foreach (var l; leftmemos.vector) { + l.write(); + } + + foreach (var sL; specialLines.vector) { + sL.write(); + } + + foreach (var sF; secondaryFailures.vector) { + sF.write(); + } + + foreach (var m; memos.vector) { + m.write(); + } + }, +}; + +var ECAMloopTimer = maketimer(0.2, func { + ECAM_controller.loop(); +}); diff --git a/Nasal/ECAM-logic.nas b/Nasal/ECAM/ECAM-logic.nas similarity index 100% rename from Nasal/ECAM-logic.nas rename to Nasal/ECAM/ECAM-logic.nas diff --git a/Nasal/ECAM-controller.nas b/Nasal/ECAM/ECAM-messages.nas similarity index 60% rename from Nasal/ECAM-controller.nas rename to Nasal/ECAM/ECAM-messages.nas index 16117b1d..0f6633b1 100644 --- a/Nasal/ECAM-controller.nas +++ b/Nasal/ECAM/ECAM-messages.nas @@ -5,103 +5,17 @@ # Copyright (c) Joshua Davidson (it0uchpods) # ############################################## -var num_lines = 6; -var msg = nil; -var spacer = nil; -var line = nil; -var right_line = nil; -var wow = getprop("/gear/gear[1]/wow"); -setprop("/ECAM/show-left-msg", 1); -setprop("/ECAM/show-right-msg", 1); -setprop("/ECAM/warnings/master-warning-light", 0); -setprop("/ECAM/warnings/master-caution-light", 0); - -var warning = { - msg: "", - active: 0, - 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 - }, - 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 and me.msg != "") { # at empty line. Also checks if message is not blank to allow for some warnings with no displayed msg, eg stall - setprop("/ECAM/msg/line" ~ line, me.msg); - setprop("/ECAM/msg/linec" ~ line, me.colour); - } - }, - warnlight: func() { - if ((me.light != "none" or me.light != "") 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; - } - }, - sound: func() { - if (me.active and (me.aural != "none" or me.aural != "") 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 = { - msg: "", - active: 0, - colour: "", - new: func(msg,active,colour) { - var t = {parents:[memo]}; - - t.msg = msg; - t.active = active; - t.colour = colour; - - 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); - setprop("/ECAM/rightmsg/linec" ~ right_line, me.colour); - } - }, -}; - -# messages logic and added to arrays +# messages stored in vectors 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 pack1_fault = warning.new(msg: "AIR PACK 1 FAULT ", active: 0, colour: "a", aural: "chime", light: "caution", noRepeat: 0), var pack1_fault_subwarn_1 = warning.new(msg: "-PACK 1.............OFF ", active: 0, colour: "b", aural: "none", light: "none", noRepeat: 0), var pack2_fault = warning.new(msg: "AIR PACK 2 FAULT ", active: 0, colour: "a", aural: "chime", light: "caution", noRepeat: 0), var pack2_fault_subwarn_1 = warning.new(msg: "-PACK 2.............OFF ", active: 0, colour: "b", aural: "none", light: "none", noRepeat: 0), - var park_brk_on = warning.new(msg: "PARK BRK ON", active: 0, colour: "a", aural: "chime", light: "caution", noRepeat: 0) + var park_brk_on = warning.new(msg: "PARK BRK ON", active: 0, colour: "a", aural: "chime", light: "caution", noRepeat: 0) ]); -var activeWarnings = std.Vector.new(); - var leftmemos = std.Vector.new([ var company_alert = warning.new(msg: "COMPANY ALERT", active: 0, colour: "g", aural: "buzzer", light: "none", noRepeat: 0), # Not yet implemented, buzzer sound var refuelg = warning.new(msg: "REFUELG", active: 0, colour: "g", aural: "none", light: "none", noRepeat: 0), @@ -117,13 +31,29 @@ var leftmemos = std.Vector.new([ var company_datalink_stby = warning.new(msg: "COMPANY DATALINK STBY", active: 0, colour: "g", aural: "none", light: "none", noRepeat: 0) # Not yet implemented ]); +var specialLines = std.Vector.new([ + var to_inhibit = memo.new(msg: "T.O. INHIBIT", active: 0, colour: "m"), + var ldg_inhibit = memo.new(msg: "LDG INHIBIT", active: 0, colour: "m"), + var land_asap_r = memo.new(msg: "LAND ASAP", active: 0, colour: "r"), + var land_asap_a = memo.new(msg: "LAND ASAP", active: 0, colour: "a"), + var ap_off = memo.new(msg: "AP OFF", active: 0, colour: "r"), + var athr_off = memo.new(msg: "A/THR OFF", active: 0, colour: "a"), +]); + +var secondaryFailures = std.Vector.new([ + var secondary_bleed = memo.new(msg: "•AIR BLEED", active: 0, colour: "a"), + var secondary_press = memo.new(msg: "•CAB PRESS", active: 0, colour: "a"), + var secondary_vent = memo.new(msg: "•AVNCS VENT", active: 0, colour: "a"), + var secondary_elec = memo.new(msg: "•ELEC", active: 0, colour: "a"), + var secondary_hyd = memo.new(msg: "•HYD", active: 0, colour: "a"), + var secondary_fuel = memo.new(msg: "•FUEL", active: 0, colour: "a"), + var secondary_cond = memo.new(msg: "•AIR COND", active: 0, colour: "a"), + var secondary_brake = memo.new(msg: "•BRAKES", active: 0, colour: "a"), + var secondary_wheel = memo.new(msg: "•WHEEL", active: 0, colour: "a"), + var secondary_fctl = memo.new(msg: "•F/CTL", active: 0, colour: "a"), +]); + var memos = std.Vector.new([ - var to_inhibit = memo.new(msg: "T.O. INHIBIT", active: 0, colour: "m"), - var ldg_inhibit = memo.new(msg: "LDG INHIBIT", active: 0, colour: "m"), - var land_asap_r = memo.new(msg: "LAND ASAP", active: 0, colour: "r"), - var land_asap_a = memo.new(msg: "LAND ASAP", active: 0, colour: "a"), - var ap_off = memo.new(msg: "AP OFF", active: 0, colour: "r"), - var athr_off = memo.new(msg: "A/THR OFF", active: 0, colour: "a"), var spd_brk = memo.new(msg: "SPEED BRK", active: 0, colour: "g"), var park_brk = memo.new(msg: "PARK BRK", active: 0, colour: "g"), var ptu = memo.new(msg: "HYD PTU", active: 0, colour: "g"), @@ -146,7 +76,7 @@ var memos = std.Vector.new([ var ice_not_det = memo.new(msg: "ICE NOT DET", active: 0, colour: "g"), # Not yet implemented var hi_alt = memo.new(msg: "HI ALT", active: 0, colour: "g"), # Not yet implemented var apu_avail = memo.new(msg: "APU AVAIL", active: 0, colour: "g"), - var apu_bleed = memo.new(msg: "APU BLEED", active: 0, colour: "g"), # Not yet implemented + var apu_bleed = memo.new(msg: "APU BLEED", active: 0, colour: "g"), var ldg_lt = memo.new(msg: "LDG LT", active: 0, colour: "g"), var brk_fan = memo.new(msg: "BRK FAN", active: 0, colour: "g"), # Not yet implemented var audio3_xfrd = memo.new(msg: "AUDIO 3 XFRD", active: 0, colour: "g"), # Not yet implemented @@ -167,42 +97,10 @@ var memos = std.Vector.new([ var clearWarnings = std.Vector.new(); -var ECAM_controller = { - loop: func() { - # check active messages - # config_warnings(); - # messages_priority_3(); - # messages_priority_2(); - # messages_priority_1(); - # messages_priority_0(); - messages_memo(); - messages_right_memo(); - - # clear display momentarily - - - for(var n = 1; n < 8; n += 1) { - setprop("/ECAM/msg/line" ~ n, ""); - } - - for(var n = 1; n < 8; n += 1) { - setprop("/ECAM/rightmsg/line" ~ n, ""); - } - - # write to ECAM - - # foreach (var w; warnings.vector) { - # w.write(); - # w.warnlight(); - # w.sound(); - # } - - foreach (var l; leftmemos.vector) { - l.write(); - } - - foreach (var m; memos.vector) { - m.write(); - } - }, -}; +var statusLim = std.Vector.new(); +var statusApprProc = std.Vector.new(); +var statusProc = std.Vector.new(); +var statusInfo = std.Vector.new(); +var statusCancelled = std.Vector.new(); +var statusInop = std.Vector.new(); +var statusMaintenance = std.Vector.new(); \ No newline at end of file diff --git a/Nasal/libraries.nas b/Nasal/libraries.nas index 0025085f..b5d08970 100644 --- a/Nasal/libraries.nas +++ b/Nasal/libraries.nas @@ -194,6 +194,7 @@ var systemsInit = func { libraries.variousReset(); rmp.init(); acp.init(); + ecam.ECAM_controller.init(); } setlistener("/sim/signals/fdm-initialized", func { @@ -209,7 +210,6 @@ var systemsLoop = maketimer(0.1, func { libraries.ECAM.loop(); libraries.BUTTONS.update(); fadec.FADEC.loop(); - ecam.ECAM_controller.loop(); rmp.rmpUpdate(); if ((getprop("/controls/pneumatic/switches/groundair") or getprop("/controls/switches/cart")) and ((getprop("/velocities/groundspeed-kt") > 2) or getprop("/controls/gear/brake-parking") == 0)) {