diff --git a/Nasal/ECAM/ECAM-controller.nas b/Nasal/ECAM/ECAM-controller.nas index ebd6df96..e69b5d16 100644 --- a/Nasal/ECAM/ECAM-controller.nas +++ b/Nasal/ECAM/ECAM-controller.nas @@ -15,9 +15,15 @@ setprop("/ECAM/show-right-msg", 1); setprop("/ECAM/warnings/master-warning-light", 0); setprop("/ECAM/warnings/master-warning-flash", 0); setprop("/ECAM/warnings/master-caution-light", 0); -setprop("/ECAM/warnings/overflow", 0); -setprop("/ECAM/warnings/overflow-left", 0); -setprop("/ECAM/warnings/overflow-right", 0); + +var lines = [props.globals.getNode("/ECAM/msg/line1", 1), props.globals.getNode("/ECAM/msg/line2", 1), props.globals.getNode("/ECAM/msg/line3", 1), props.globals.getNode("/ECAM/msg/line4", 1), props.globals.getNode("/ECAM/msg/line5", 1), props.globals.getNode("/ECAM/msg/line6", 1), props.globals.getNode("/ECAM/msg/line7", 1), props.globals.getNode("/ECAM/msg/line8", 1)]; +var linesCol = [props.globals.getNode("/ECAM/msg/linec1", 1), props.globals.getNode("/ECAM/msg/linec2", 1), props.globals.getNode("/ECAM/msg/linec3", 1), props.globals.getNode("/ECAM/msg/linec4", 1), props.globals.getNode("/ECAM/msg/linec5", 1), props.globals.getNode("/ECAM/msg/linec6", 1), props.globals.getNode("/ECAM/msg/linec7", 1), props.globals.getNode("/ECAM/msg/linec8", 1)]; +var leftOverflow = props.globals.initNode("/ECAM/warnings/overflow-left", "BOOL", 0); +var rightOverflow = props.globals.initNode("/ECAM/warnings/overflow-right", "BOOL", 0); +var overflow = props.globals.initNode("/ECAM/warnings/overflow", "BOOL", 0); + +var lights = [props.globals.initNode("/ECAM/warnings/master-warning-light", "BOOL", 0), props.globals.initNode("/ECAM/warnings/master-caution-light", "BOOL", 0)]; +var aural = [props.globals.initNode("/sim/sound/warnings/crc", "BOOL", 0), props.globals.initNode("/sim/sound/warnings/chime", "BOOL", 0)]; var warning = { msg: "", @@ -26,7 +32,8 @@ var warning = { aural: "", light: "", noRepeat: 0, - new: func(msg,active,colour,aural,light,noRepeat) { + clearFlag: 0, + new: func(msg,active,colour,aural,light,noRepeat,clearFlag) { var t = {parents:[warning]}; t.msg = msg; @@ -35,40 +42,42 @@ var warning = { t.aural = aural; t.light = light; t.noRepeat = noRepeat; + t.clearFlag = clearFlag; return t }, write: func() { + if (me.active == 0) {return;} line = 1; - while (getprop("/ECAM/msg/line" ~ line) != "" and line <= 8) { + while (lines[line].getValue()) != "" and line <= 8) { line = line + 1; # go to next line until empty line } if (line > 8) { - setprop("/ECAM/warnings/overflow-left", 1); - } elsif (getprop("/ECAM/warnings/overflow-left") == 1) { - setprop("/ECAM/warnings/overflow-left", 0); + leftOverflow.setBoolValue(1); + } elsif (leftOverflow.getBoolValue() == 1) { + leftOverflow.setBoolValue(0); } - if (getprop("/ECAM/msg/line" ~ line) == "" and me.active == 1 and me.msg != "" and line <= 8) { # 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); + if (lines[line].getValue() == "" and me.msg != "" and line <= 8) { # at empty line. Also checks if message is not blank to allow for some warnings with no displayed msg, eg stall + lines[line].setValue(me.msg); + linesCol[line].setValue(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); + if (me.active == 0 or me.light >= 1) {return;} + + if (me.noRepeat == 0 and lights[me.light].getBoolValue() == 0) { # only toggle light once per message, allows canceling + lights[me.light].setBoolValue(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); - } + if (me.active == 0 or me.aural >= 1) {return;} + if (aural[me.aural].getBoolValue() != 1) { + aural[me.aural].setBoolValue(1); } + # have to cancel it anyway, I think it does not go out even if failure is removed }, }; @@ -86,20 +95,22 @@ var memo = { 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-right", 1); - } elsif (getprop("/ECAM/warnings/overflow-right") == 1) { - setprop("/ECAM/warnings/overflow-right", 0); - } - - if (getprop("/ECAM/rightmsg/line" ~ right_line) == "" and me.active == 1 and right_line <= 8) { # at empty line - setprop("/ECAM/rightmsg/line" ~ right_line, me.msg); - setprop("/ECAM/rightmsg/linec" ~ right_line, me.colour); + if (me.active == 1) { + 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-right", 1); + } elsif (getprop("/ECAM/warnings/overflow-right") == 1) { + setprop("/ECAM/warnings/overflow-right", 0); + } + + if (getprop("/ECAM/rightmsg/line" ~ right_line) == "" and right_line <= 8) { # at empty line + setprop("/ECAM/rightmsg/line" ~ right_line, me.msg); + setprop("/ECAM/rightmsg/linec" ~ right_line, me.colour); + } } }, }; @@ -118,14 +129,16 @@ var status = { return t }, write: func() { - status_line = 1; - while (getprop("/ECAM/status/line" ~ status_line) != "" and status_line <= 8) { - status_line = status_line + 1; # go to next line until empty line - } - - if (getprop("/ECAM/status/line" ~ status_line) == "" and me.active == 1 and status_line <= 8) { # at empty line - setprop("/ECAM/status/line" ~ status_line, me.msg); - setprop("/ECAM/status/linec" ~ status_line, me.colour); + if (me.active == 1) { + status_line = 1; + while (getprop("/ECAM/status/line" ~ status_line) != "" and status_line <= 8) { + status_line = status_line + 1; # go to next line until empty line + } + + if (getprop("/ECAM/status/line" ~ status_line) == "" and status_line <= 8) { # at empty line + setprop("/ECAM/status/line" ~ status_line, me.msg); + setprop("/ECAM/status/linec" ~ status_line, me.colour); + } } }, }; @@ -137,7 +150,6 @@ var ECAM_controller = { }, loop: func() { # check active messages - # config_warnings(); messages_priority_3(); messages_priority_2(); messages_priority_1(); @@ -224,6 +236,17 @@ var ECAM_controller = { if (w.active == 1) { w.active = 0; # todo: need to hit CLR to clear condition, not automatic w.noRepeat = 0; # should warning only clear if condition is not true? + w.clearFlag = 1; + break; + } + } + }, + recall: func() { + foreach (var w; warnings.vector) { + if (w.clearFlag == 1) { + w.active = 1; + w.noRepeat = 1; + w.clearFlag = 0; break; } } diff --git a/Nasal/ECAM/ECAM-messages.nas b/Nasal/ECAM/ECAM-messages.nas index 351e2483..a24d5a98 100644 --- a/Nasal/ECAM/ECAM-messages.nas +++ b/Nasal/ECAM/ECAM-messages.nas @@ -4,55 +4,58 @@ # messages stored in vectors +# Lights: 0 = red, 1 = yellow, 9 = none +# Sounds: 0 = master warn, 1 = chime, 9 = other + # Left E/WD var warningsOld = 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 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 lg_not_dn = warning.new(msg: "L/G GEAR NOT DOWN", active: 0, colour: "r", aural: 0, light: 0, noRepeat: 0, clearFlag: 0), + var pack1_fault = warning.new(msg: "AIR PACK 1 FAULT ", active: 0, colour: "a", aural: 1, light: 1, noRepeat: 0, clearFlag: 0), + var pack1_fault_subwarn_1 = warning.new(msg: "-PACK 1.............OFF ", active: 0, colour: "b", aural: 9, light: 9, noRepeat: 0, clearFlag: 0), + var pack2_fault = warning.new(msg: "AIR PACK 2 FAULT ", active: 0, colour: "a", aural: 1, light: 1, noRepeat: 0, clearFlag: 0), + var pack2_fault_subwarn_1 = warning.new(msg: "-PACK 2.............OFF ", active: 0, colour: "b", aural: 9, light: 9, noRepeat: 0, clearFlag: 0), + var park_brk_on = warning.new(msg: "PARK BRK ON", active: 0, colour: "a", aural: 1, light: 1, noRepeat: 0, clearFlag: 0) ]); var warnings = std.Vector.new([ - var flap_not_zero = warning.new(msg: "F/CTL FLAP LVR NOT ZERO", active: 0, colour: "r", aural: "crc", light: "warning", noRepeat: 0), + var flap_not_zero = warning.new(msg: "F/CTL FLAP LVR NOT ZERO", active: 0, colour: "r", aural: 0, light: 0, noRepeat: 0, clearFlag: 0), # Config - var slats_config = warning.new(msg: "CONFIG", active: 0, colour: "r", aural: "crc", light: "warning", noRepeat: 0), - var slats_config_1 = warning.new(msg: "SLATS NOT IN T.O. CONFIG", active: 0, colour: "r", aural: "crc", light: "warning", noRepeat: 0), - var flaps_config = warning.new(msg: "CONFIG", active: 0, colour: "r", aural: "crc", light: "warning", noRepeat: 0), - var flaps_config_1 = warning.new(msg: "FLAPS NOT IN T.O. CONFIG", active: 0, colour: "r", aural: "crc", light: "warning", noRepeat: 0), - var spd_brk_config = warning.new(msg: "CONFIG", active: 0, colour: "r", aural: "crc", light: "warning", noRepeat: 0), - var spd_brk_config_1 = warning.new(msg: "SPD BRK NOT RETRACTED", active: 0, colour: "r", aural: "crc", light: "warning", noRepeat: 0), - var pitch_trim_config = warning.new(msg: "CONFIG PITCH TRIM", active: 0, colour: "r", aural: "crc", light: "warning", noRepeat: 0), - var pitch_trim_config_1 = warning.new(msg: " NOT IN T.O. RANGE", active: 0, colour: "r", aural: "crc", light: "warning", noRepeat: 0), - var rud_trim_config = warning.new(msg: "CONFIG RUD TRIM", active: 0, colour: "r", aural: "crc", light: "warning", noRepeat: 0), - var rud_trim_config_1 = warning.new(msg: " NOT IN T.O. RANGE", active: 0, colour: "r", aural: "crc", light: "warning", noRepeat: 0), - var park_brk_config = warning.new(msg: "CONFIG PARK BRK ON", active: 0, colour: "r", aural: "crc", light: "warning", noRepeat: 0), + var slats_config = warning.new(msg: "CONFIG", active: 0, colour: "r", aural: 0, light: 0, noRepeat: 0, clearFlag: 0), + var slats_config_1 = warning.new(msg: "SLATS NOT IN T.O. CONFIG", active: 0, colour: "r", aural: 0, light: 0, noRepeat: 0, clearFlag: 0), + var flaps_config = warning.new(msg: "CONFIG", active: 0, colour: "r", aural: 0, light: 0, noRepeat: 0, clearFlag: 0), + var flaps_config_1 = warning.new(msg: "FLAPS NOT IN T.O. CONFIG", active: 0, colour: "r", aural: 0, light: 0, noRepeat: 0, clearFlag: 0), + var spd_brk_config = warning.new(msg: "CONFIG", active: 0, colour: "r", aural: 0, light: 0, noRepeat: 0, clearFlag: 0), + var spd_brk_config_1 = warning.new(msg: "SPD BRK NOT RETRACTED", active: 0, colour: "r", aural: 0, light: 0, noRepeat: 0, clearFlag: 0), + var pitch_trim_config = warning.new(msg: "CONFIG PITCH TRIM", active: 0, colour: "r", aural: 0, light: 0, noRepeat: 0, clearFlag: 0), + var pitch_trim_config_1 = warning.new(msg: " NOT IN T.O. RANGE", active: 0, colour: "r", aural: 0, light: 0, noRepeat: 0, clearFlag: 0), + var rud_trim_config = warning.new(msg: "CONFIG RUD TRIM", active: 0, colour: "r", aural: 0, light: 0, noRepeat: 0, clearFlag: 0), + var rud_trim_config_1 = warning.new(msg: " NOT IN T.O. RANGE", active: 0, colour: "r", aural: 0, light: 0, noRepeat: 0, clearFlag: 0), + var park_brk_config = warning.new(msg: "CONFIG PARK BRK ON", active: 0, colour: "r", aural: 0, light: 0, noRepeat: 0, clearFlag: 0), # Autopilot - var ap_offw = warning.new(msg: "AUTO FLT AP OFF", active: 0, colour: "r", aural: "calv", light: "warning", noRepeat: 0), - var athr_offw = warning.new(msg: "AUTO FLT A/THR OFF", active: 0, colour: "a", aural: "chime", light: "caution", noRepeat: 0), - var athr_offw_1 = warning.new(msg: "-THR LEVERS........MOVE", active: 0, colour: "b", aural: "none", light: "none", noRepeat: 0), - var athr_lock = warning.new(msg: "ENG THRUST LOCKED", active: 0, colour: "a", aural: "chime", light: "caution", noRepeat: 0), - var athr_lock_1 = warning.new(msg: "-THR LEVERS........MOVE", active: 0, colour: "b", aural: "none", light: "none", noRepeat: 0), - var athr_lim = warning.new(msg: "AUTO FLT A/THR LIMITED", active: 0, colour: "a", aural: "chime", light: "caution", noRepeat: 0), - var athr_lim_1 = warning.new(msg: "-THR LEVERS........MOVE", active: 0, colour: "b", aural: "none", light: "none", noRepeat: 0) + var ap_offw = warning.new(msg: "AUTO FLT AP OFF", active: 0, colour: "r", aural: 9, light: 0, noRepeat: 0, clearFlag: 0), + var athr_offw = warning.new(msg: "AUTO FLT A/THR OFF", active: 0, colour: "a", aural: 1, light: 1, noRepeat: 0, clearFlag: 0), + var athr_offw_1 = warning.new(msg: "-THR LEVERS........MOVE", active: 0, colour: "b", aural: 9, light: 9, noRepeat: 0, clearFlag: 0), + var athr_lock = warning.new(msg: "ENG THRUST LOCKED", active: 0, colour: "a", aural: 1, light: 1, noRepeat: 0, clearFlag: 0), + var athr_lock_1 = warning.new(msg: "-THR LEVERS........MOVE", active: 0, colour: "b", aural: 9, light: 9, noRepeat: 0, clearFlag: 0), + var athr_lim = warning.new(msg: "AUTO FLT A/THR LIMITED", active: 0, colour: "a", aural: 1, light: 1, noRepeat: 0, clearFlag: 0), + var athr_lim_1 = warning.new(msg: "-THR LEVERS........MOVE", active: 0, colour: "b", aural: 9, light: 9, noRepeat: 0, clearFlag: 0) ]); var leftmemos = std.Vector.new([ - var company_alert = warning.new(msg: "COMPANY ALERT", active: 0, colour: "g", aural: "buzz", 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), - var irs_in_align = warning.new(msg: "IRS IN ALIGN", active: 0, colour: "g", aural: "none", light: "none", noRepeat: 0), # Not yet implemented - var gnd_splrs = warning.new(msg: "GND SPLRS ARMED", active: 0, colour: "g", aural: "none", light: "none", noRepeat: 0), - var seatbelts = warning.new(msg: "SEAT BELTS", active: 0, colour: "g", aural: "none", light: "none", noRepeat: 0), - var nosmoke = warning.new(msg: "NO SMOKING", active: 0, colour: "g", aural: "none", light: "none", noRepeat: 0), - var strobe_lt_off = warning.new(msg: "STROBE LT OFF", active: 0, colour: "g", aural: "none", light: "none", noRepeat: 0), - var outr_tk_fuel_xfrd = warning.new(msg: "OUTR TK FUEL XFRD", active: 0, colour: "g", aural: "none", light: "none", noRepeat: 0), # Not yet implemented - var fob_3T = warning.new(msg: "FOB BELOW 3T", active: 0, colour: "g", aural: "none", light: "none", noRepeat: 0), - var gpws_flap_mode_off = warning.new(msg: "GPWS FLAP MODE OFF", active: 0, colour: "g", aural: "none", light: "none", noRepeat: 0), - var atc_datalink_stby = warning.new(msg: "ATC DATALINK STBY", active: 0, colour: "g", aural: "none", light: "none", noRepeat: 0), # Not yet implemented - var company_datalink_stby = warning.new(msg: "COMPANY DATALINK STBY", active: 0, colour: "g", aural: "none", light: "none", noRepeat: 0) # Not yet implemented + var company_alert = warning.new(msg: "COMPANY ALERT", active: 0, colour: "g", aural: 9, light: 9, noRepeat: 0, clearFlag: 0), # Not yet implemented, buzzer sound + var refuelg = warning.new(msg: "REFUELG", active: 0, colour: "g", aural: 9, light: 9, noRepeat: 0, clearFlag: 0), + var irs_in_align = warning.new(msg: "IRS IN ALIGN", active: 0, colour: "g", aural: 9, light: 9, noRepeat: 0, clearFlag: 0), # Not yet implemented + var gnd_splrs = warning.new(msg: "GND SPLRS ARMED", active: 0, colour: "g", aural: 9, light: 9, noRepeat: 0, clearFlag: 0), + var seatbelts = warning.new(msg: "SEAT BELTS", active: 0, colour: "g", aural: 9, light: 9, noRepeat: 0, clearFlag: 0), + var nosmoke = warning.new(msg: "NO SMOKING", active: 0, colour: "g", aural: 9, light: 9, noRepeat: 0, clearFlag: 0), + var strobe_lt_off = warning.new(msg: "STROBE LT OFF", active: 0, colour: "g", aural: 9, light: 9, noRepeat: 0, clearFlag: 0), + var outr_tk_fuel_xfrd = warning.new(msg: "OUTR TK FUEL XFRD", active: 0, colour: "g", aural: 9, light: 9, noRepeat: 0, clearFlag: 0), # Not yet implemented + var fob_3T = warning.new(msg: "FOB BELOW 3T", active: 0, colour: "g", aural: 9, light: 9, noRepeat: 0, clearFlag: 0), + var gpws_flap_mode_off = warning.new(msg: "GPWS FLAP MODE OFF", active: 0, colour: "g", aural: 9, light: 9, noRepeat: 0, clearFlag: 0), + var atc_datalink_stby = warning.new(msg: "ATC DATALINK STBY", active: 0, colour: "g", aural: 9, light: 9, noRepeat: 0, clearFlag: 0), # Not yet implemented + var company_datalink_stby = warning.new(msg: "COMPANY DATALINK STBY", active: 0, colour: "g", aural: 9, light: 9, noRepeat: 0, clearFlag: 0) # Not yet implemented ]); # Right E/WD