diff --git a/A320-main.xml b/A320-main.xml index 0ffda41d..a93ccf80 100644 --- a/A320-main.xml +++ b/A320-main.xml @@ -1548,6 +1548,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/Models/FlightDeck/a320.flightdeck.xml b/Models/FlightDeck/a320.flightdeck.xml index 56c27ea0..24bd362c 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 + + + diff --git a/Models/Instruments/Upper-ECAM/Upper-ECAM.nas b/Models/Instruments/Upper-ECAM/Upper-ECAM.nas index 5dbf1893..7fadeffa 100644 --- a/Models/Instruments/Upper-ECAM/Upper-ECAM.nas +++ b/Models/Instruments/Upper-ECAM/Upper-ECAM.nas @@ -147,100 +147,116 @@ 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); + } else if (getprop("/ECAM/msg/linec1") == "m") { + me["ECAML1"].setColor(0.6901,0.3333,0.7450); } - 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); + } else if (getprop("/ECAM/msg/linec2") == "m") { + me["ECAML2"].setColor(0.6901,0.3333,0.7450); } - 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); + } else if (getprop("/ECAM/msg/linec3") == "m") { + me["ECAML3"].setColor(0.6901,0.3333,0.7450); } - 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); + } else if (getprop("/ECAM/msg/linec4") == "m") { + me["ECAML4"].setColor(0.6901,0.3333,0.7450); } - 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); + } else if (getprop("/ECAM/msg/linec5") == "m") { + me["ECAML5"].setColor(0.6901,0.3333,0.7450); } - 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); + } else if (getprop("/ECAM/msg/linec6") == "m") { + me["ECAML6"].setColor(0.6901,0.3333,0.7450); } - 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); + } else if (getprop("/ECAM/msg/linec7") == "m") { + me["ECAML7"].setColor(0.6901,0.3333,0.7450); } - 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); + } else if (getprop("/ECAM/msg/linec8") == "m") { + me["ECAML8"].setColor(0.6901,0.3333,0.7450); } me["TO_Memo"].hide(); @@ -342,6 +358,136 @@ 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/linec1") == "w") { + me["ECAMR1"].setColor(0.8078,0.8039,0.8078); + } else if (getprop("/ECAM/rightmsg/linec1") == "b") { + me["ECAMR1"].setColor(0.0901,0.6039,0.7176); + } else if (getprop("/ECAM/rightmsg/linec1") == "g") { + me["ECAMR1"].setColor(0.0509,0.7529,0.2941); + } else if (getprop("/ECAM/rightmsg/linec1") == "a") { + 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") { + me["ECAMR2"].setColor(0.8078,0.8039,0.8078); + } else if (getprop("/ECAM/rightmsg/linec2") == "b") { + me["ECAMR2"].setColor(0.0901,0.6039,0.7176); + } else if (getprop("/ECAM/rightmsg/linec2") == "g") { + me["ECAMR2"].setColor(0.0509,0.7529,0.2941); + } else if (getprop("/ECAM/rightmsg/linec2") == "a") { + 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") { + me["ECAMR3"].setColor(0.8078,0.8039,0.8078); + } else if (getprop("/ECAM/rightmsg/linec3") == "b") { + me["ECAMR3"].setColor(0.0901,0.6039,0.7176); + } else if (getprop("/ECAM/rightmsg/linec3") == "g") { + me["ECAMR3"].setColor(0.0509,0.7529,0.2941); + } else if (getprop("/ECAM/rightmsg/linec3") == "a") { + 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") { + me["ECAMR4"].setColor(0.8078,0.8039,0.8078); + } else if (getprop("/ECAM/rightmsg/linec4") == "b") { + me["ECAMR4"].setColor(0.0901,0.6039,0.7176); + } else if (getprop("/ECAM/rightmsg/linec4") == "g") { + me["ECAMR4"].setColor(0.0509,0.7529,0.2941); + } else if (getprop("/ECAM/rightmsg/linec4") == "a") { + 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") { + me["ECAMR5"].setColor(0.8078,0.8039,0.8078); + } else if (getprop("/ECAM/rightmsg/linec5") == "b") { + me["ECAMR5"].setColor(0.0901,0.6039,0.7176); + } else if (getprop("/ECAM/rightmsg/linec5") == "g") { + me["ECAMR5"].setColor(0.0509,0.7529,0.2941); + } else if (getprop("/ECAM/rightmsg/linec5") == "a") { + 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") { + me["ECAMR6"].setColor(0.8078,0.8039,0.8078); + } else if (getprop("/ECAM/rightmsg/linec6") == "b") { + me["ECAMR6"].setColor(0.0901,0.6039,0.7176); + } else if (getprop("/ECAM/rightmsg/linec6") == "g") { + me["ECAMR6"].setColor(0.0509,0.7529,0.2941); + } else if (getprop("/ECAM/rightmsg/linec6") == "a") { + 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") { + me["ECAMR7"].setColor(0.8078,0.8039,0.8078); + } else if (getprop("/ECAM/rightmsg/linec7") == "b") { + me["ECAMR7"].setColor(0.0901,0.6039,0.7176); + } else if (getprop("/ECAM/rightmsg/linec7") == "g") { + me["ECAMR7"].setColor(0.0509,0.7529,0.2941); + } else if (getprop("/ECAM/rightmsg/linec7") == "a") { + 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") { + me["ECAMR8"].setColor(0.8078,0.8039,0.8078); + } else if (getprop("/ECAM/rightmsg/linec8") == "b") { + me["ECAMR8"].setColor(0.0901,0.6039,0.7176); + } else if (getprop("/ECAM/rightmsg/linec8") == "g") { + me["ECAMR8"].setColor(0.0509,0.7529,0.2941); + } else if (getprop("/ECAM/rightmsg/linec8") == "a") { + 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["ECAM_Right"].show(); + } else { + me["ECAM_Right"].hide(); + me["TO_Memo"].hide(); + me["LDG_Memo"].hide(); + } }, }; @@ -356,7 +502,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 +729,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..cfb5c7fe 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="659.36853" 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..09376700 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="568.82143" + 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 new file mode 100644 index 00000000..0b96dcfc --- /dev/null +++ b/Nasal/ECAM-controller.nas @@ -0,0 +1,342 @@ +# 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 + +# 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; +var wow = getprop("/gear/gear[1]/wow"); +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) != me.msg) + 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" 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" 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 + +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 park_brk_on = warning.new(msg: "PARK BRK ON", active: 0, colour: "a", aural: "chime", light: "caution", noRepeat: 0) +]); + +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 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 rat = memo.new(msg: "RAT OUT", 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 refuelg = memo.new(msg: "REFUELG", active: 0, colour: "g"), +var ram_air = memo.new(msg: "RAM AIR ON", active: 0, colour: "g"), +var ptu = memo.new(msg: "HYD PTU", active: 0, colour: "g"), +var eng_aice = memo.new(msg: "ENG A.ICE", active: 0, colour: "g"), +var wing_aice = memo.new(msg: "WING A.ICE", active: 0, colour: "g"), +var fuelx = memo.new(msg: "FUEL X FEED", 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) { + # 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 { + # 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 {} +var messages_right_memo = func { + if (getprop("/FMGC/status/phase") >= 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 { + 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"; + } + + 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; + } + + 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 + +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 + + + if (warnings.size() > 0) { + for(var n=1; n<8; n+=1) { + setprop("/ECAM/msg/line" ~ n, ""); + } + } + + if (memos.size() > 0) { + for(var n=1; n<8; n+=1) { + setprop("/ECAM/rightmsg/line" ~ n, ""); + } + } + + # write to ECAM + + foreach (var i; warnings.vector) { + i.write(); + i.warnlight(); + i.sound(); + } + + foreach (var m; memos.vector) { + m.write(); + } + }, +}; diff --git a/Nasal/ECAM.nas b/Nasal/ECAM.nas index 2accbd0e..5129a218 100644 --- a/Nasal/ECAM.nas +++ b/Nasal/ECAM.nas @@ -37,14 +37,30 @@ var ECAM = { setprop("/ECAM/msg/line6", ""); setprop("/ECAM/msg/line7", ""); setprop("/ECAM/msg/line8", ""); - setprop("/ECAM/msg/line1c", "w"); - setprop("/ECAM/msg/line2c", "w"); - setprop("/ECAM/msg/line3c", "w"); - setprop("/ECAM/msg/line4c", "w"); - setprop("/ECAM/msg/line5c", "w"); - setprop("/ECAM/msg/line6c", "w"); - setprop("/ECAM/msg/line7c", "w"); - setprop("/ECAM/msg/line8c", "w"); + setprop("/ECAM/msg/linec1", "w"); + setprop("/ECAM/msg/linec2", "w"); + setprop("/ECAM/msg/linec3", "w"); + setprop("/ECAM/msg/linec4", "w"); + setprop("/ECAM/msg/linec5", "w"); + setprop("/ECAM/msg/linec6", "w"); + setprop("/ECAM/msg/linec7", "w"); + setprop("/ECAM/msg/linec8", "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/linec1", "w"); + setprop("/ECAM/rightmsg/linec2", "w"); + setprop("/ECAM/rightmsg/linec3", "w"); + setprop("/ECAM/rightmsg/linec4", "w"); + setprop("/ECAM/rightmsg/linec5", "w"); + setprop("/ECAM/rightmsg/linec6", "w"); + setprop("/ECAM/rightmsg/linec7", "w"); + setprop("/ECAM/rightmsg/linec8", "w"); }, loop: func() { stateL = getprop("/engines/engine[0]/state"); @@ -80,7 +96,9 @@ var ECAM = { setprop("/ECAM/ldg-memo-enable", 0); } - 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) { + 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"); } else if (getprop("/ECAM/ldg-memo-enable") == 1) { setprop("/ECAM/left-msg", "LDG-MEMO"); @@ -88,6 +106,12 @@ var ECAM = { setprop("/ECAM/left-msg", "NONE"); } + if (ecam.memos.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 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 c04dcb0f..7fce8a01 100644 --- a/Nasal/libraries.nas +++ b/Nasal/libraries.nas @@ -206,6 +206,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)) { @@ -583,4 +584,4 @@ if (getprop("/controls/flight/auto-coordination") == 1) { setprop("/controls/flight/aileron-drives-tiller", 0); } -setprop("/systems/acconfig/libraries-loaded", 1); +setprop("/systems/acconfig/libraries-loaded", 1); \ No newline at end of file diff --git a/Sounds/A320-common-sound.xml b/Sounds/A320-common-sound.xml index 33ef403a..64aca775 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 + + /ECAM/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 00000000..4a575fce Binary files /dev/null and b/Sounds/Cockpit/chime.wav differ diff --git a/Sounds/Cockpit/crc.wav b/Sounds/Cockpit/crc.wav new file mode 100644 index 00000000..72888c8e Binary files /dev/null and b/Sounds/Cockpit/crc.wav differ diff --git a/Sounds/Cockpit/stall_voice.wav b/Sounds/Cockpit/stall_voice.wav new file mode 100644 index 00000000..ff066513 Binary files /dev/null and b/Sounds/Cockpit/stall_voice.wav differ