1
0
Fork 0

Merge branch 'dev' into 3D

This commit is contained in:
legoboyvdlp R 2021-06-28 13:04:37 +01:00
commit e028870b51
17 changed files with 1063 additions and 884 deletions

View file

@ -4698,6 +4698,8 @@
<file>Aircraft/A320-family/Nasal/Systems/tyresmoke.nas</file>
</systems>
<ecam>
<file>Aircraft/A320-family/Nasal/ECAM/SystemDisplay.nas</file>
<file>Aircraft/A320-family/Nasal/ECAM/ECAM-nodes.nas</file>
<file>Aircraft/A320-family/Nasal/ECAM/ECAM-main.nas</file>
<file>Aircraft/A320-family/Nasal/ECAM/ECAM-controller.nas</file>
<file>Aircraft/A320-family/Nasal/ECAM/ECAM-logic.nas</file>

View file

@ -2167,7 +2167,7 @@
</greater-than-equals>
</condition>
<command>nasal</command>
<script>ecam.ECAMControlPanel.sysPageBtn("sts");</script>
<script>ecam.ECAMControlPanel.stsBtn();</script>
</binding>
</action>
</animation>
@ -2186,7 +2186,7 @@
</greater-than-equals>
</condition>
<command>nasal</command>
<script>ecam.ECAMControlPanel.sysPageBtn("apu");</script>
<script>ecam.ECAMControlPanel.sysPageBtn("apuPage");</script>
</binding>
</action>
</animation>
@ -2205,7 +2205,7 @@
</greater-than-equals>
</condition>
<command>nasal</command>
<script>ecam.ECAMControlPanel.sysPageBtn("bleed");</script>
<script>ecam.ECAMControlPanel.sysPageBtn("bleedPage");</script>
</binding>
</action>
</animation>
@ -2224,7 +2224,7 @@
</greater-than-equals>
</condition>
<command>nasal</command>
<script>ecam.ECAMControlPanel.sysPageBtn("press");</script>
<script>ecam.ECAMControlPanel.sysPageBtn("cabPressPage");</script>
</binding>
</action>
</animation>
@ -2243,7 +2243,7 @@
</greater-than-equals>
</condition>
<command>nasal</command>
<script>ecam.ECAMControlPanel.sysPageBtn("elec");</script>
<script>ecam.ECAMControlPanel.sysPageBtn("elecPage");</script>
</binding>
</action>
</animation>
@ -2262,7 +2262,7 @@
</greater-than-equals>
</condition>
<command>nasal</command>
<script>ecam.ECAMControlPanel.sysPageBtn("hyd");</script>
<script>ecam.ECAMControlPanel.sysPageBtn("hydraulicPage");</script>
</binding>
</action>
</animation>
@ -2281,7 +2281,7 @@
</greater-than-equals>
</condition>
<command>nasal</command>
<script>ecam.ECAMControlPanel.sysPageBtn("fuel");</script>
<script>ecam.ECAMControlPanel.sysPageBtn("fuelPage");</script>
</binding>
</action>
</animation>
@ -2300,7 +2300,7 @@
</greater-than-equals>
</condition>
<command>nasal</command>
<script>ecam.ECAMControlPanel.sysPageBtn("eng");</script>
<script>ecam.ECAMControlPanel.sysPageBtn("enginePage");</script>
</binding>
</action>
</animation>
@ -2319,7 +2319,7 @@
</greater-than-equals>
</condition>
<command>nasal</command>
<script>ecam.ECAMControlPanel.sysPageBtn("cond");</script>
<script>ecam.ECAMControlPanel.sysPageBtn("condPage");</script>
</binding>
</action>
</animation>
@ -2338,7 +2338,7 @@
</greater-than-equals>
</condition>
<command>nasal</command>
<script>ecam.ECAMControlPanel.sysPageBtn("door");</script>
<script>ecam.ECAMControlPanel.sysPageBtn("doorPage");</script>
</binding>
</action>
</animation>
@ -2357,7 +2357,7 @@
</greater-than-equals>
</condition>
<command>nasal</command>
<script>ecam.ECAMControlPanel.sysPageBtn("wheel");</script>
<script>ecam.ECAMControlPanel.sysPageBtn("wheelPage");</script>
</binding>
</action>
</animation>
@ -2376,7 +2376,7 @@
</greater-than-equals>
</condition>
<command>nasal</command>
<script>ecam.ECAMControlPanel.sysPageBtn("fctl");</script>
<script>ecam.ECAMControlPanel.sysPageBtn("fctlPage");</script>
</binding>
</action>
</animation>

View file

@ -297,7 +297,7 @@ var canvas_lowerECAM_base = {
lowerECAM_hyd.page.hide();
lowerECAM_wheel.page.hide();
lowerECAM_cond.update();
} else if (page == "crz") {
} else if (page == "cruise") {
lowerECAM_apu.page.hide();
lowerECAM_bleed.page.hide();
lowerECAM_cond.page.hide();

View file

@ -1,19 +1,19 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
sodipodi:docname="airbusND.svg"
inkscape:version="1.0.2 (e86c870879, 2021-01-15, custom)"
inkscape:version="1.1 (c68e22c387, 2021-05-23)"
xml:space="preserve"
id="svg5180"
height="1024"
width="1024"
version="1.1"><sodipodi:namedview
version="1.1"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"><sodipodi:namedview
pagecolor="#000000"
bordercolor="#666666"
borderopacity="1"
@ -26,13 +26,13 @@
inkscape:window-height="1017"
id="namedview102"
showgrid="false"
inkscape:zoom="3.1081105"
inkscape:cx="904.96427"
inkscape:cy="819.41055"
inkscape:zoom="0.5494415"
inkscape:cx="505.96833"
inkscape:cy="727.10197"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="terrGroup"
inkscape:current-layer="layer7"
inkscape:object-nodes="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-object-midpoints="true"
@ -41,7 +41,8 @@
showguides="true"
inkscape:guide-bbox="true"
inkscape:document-rotation="0"
inkscape:snap-text-baseline="true"><sodipodi:guide
inkscape:snap-text-baseline="true"
inkscape:pagecheckerboard="0"><sodipodi:guide
id="guide3167"
orientation="1,0"
position="512,811.5" /><sodipodi:guide
@ -1466,7 +1467,26 @@
sodipodi:role="line"
id="tspan1346"
x="935.7326"
y="993.85461">.9</tspan></text></g></g><g
y="993.85461">.9</tspan></text></g><g
id="rangeRingMap"
style="display:inline"
inkscape:label="g5254-3"
transform="matrix(0.86976028,0,0,0.86976028,66.2654,369.90654)"><path
id="path4614-5"
style="display:inline;opacity:1;mix-blend-mode:screen;fill:none;stroke:#ffffff;stroke-width:3.8;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 512.33846,407.68674 -1e-5,21.86538" /><path
id="path5199-2"
style="display:inline;opacity:1;mix-blend-mode:screen;fill:none;stroke:#ffffff;stroke-width:4.36902;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 414.34242,464.79018 17.39829,10.04491" /><path
id="path5203-8"
style="display:inline;opacity:1;mix-blend-mode:screen;fill:none;stroke:#ffffff;stroke-width:4.36902;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 569.56382,422.53255 -10.9327,18.93597" /><path
id="path5207-2"
style="display:inline;opacity:1;mix-blend-mode:screen;fill:none;stroke:#ffffff;stroke-width:4.36902;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 455.91753,422.9266 10.04491,17.3983" /><path
id="path5211-5"
style="display:inline;opacity:1;mix-blend-mode:screen;fill:none;stroke:#ffffff;stroke-width:4.36902;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 611.47202,463.94112 592.53604,474.8738" /></g></g><g
inkscape:groupmode="layer"
id="layer1"
inkscape:label="CTR"
@ -2164,7 +2184,46 @@
transform="matrix(1.02827,0,0,1.02827,9.2744,-29.1838)"
inkscape:label="#g3956"
id="g3230"
style="display:inline" /></g><g
style="display:inline" /><g
id="rangeRingPlan"
style="display:inline"
inkscape:label="#g48782"><path
id="path3028"
style="display:inline;opacity:1;mix-blend-mode:screen;fill:none;stroke:#ffffff;stroke-width:3.8;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 605.60382,521.89362 h 21.85153" /><path
id="path4632"
style="display:inline;opacity:1;mix-blend-mode:screen;fill:none;stroke:#ffffff;stroke-width:3.8;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 399.0416,521.89362 h 20.08981" /><path
id="path4618"
style="display:inline;opacity:1;mix-blend-mode:screen;fill:none;stroke:#ffffff;stroke-width:3.8;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 512.33845,616.03005 V 636.1005" /><path
id="path4614"
style="display:inline;opacity:1;mix-blend-mode:screen;fill:none;stroke:#ffffff;stroke-width:3.8;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 512.33846,407.68674 -1e-5,21.86538" /><path
id="path5197"
style="display:inline;opacity:1;mix-blend-mode:screen;fill:none;stroke:#ffffff;stroke-width:3.8;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 593.23055,568.07129 18.92398,10.92577" /><path
id="path5199"
style="display:inline;opacity:1;mix-blend-mode:screen;fill:none;stroke:#ffffff;stroke-width:3.8;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 414.34242,464.79018 17.39829,10.04491" /><path
id="path5201"
style="display:inline;opacity:1;mix-blend-mode:screen;fill:none;stroke:#ffffff;stroke-width:3.8;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 465.39216,602.96315 -10.03523,17.38152" /><path
id="path5203"
style="display:inline;opacity:1;mix-blend-mode:screen;fill:none;stroke:#ffffff;stroke-width:3.8;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 569.56382,422.53255 -10.9327,18.93597" /><path
id="path5205"
style="display:inline;opacity:1;mix-blend-mode:screen;fill:none;stroke:#ffffff;stroke-width:3.8;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 559.19864,601.81473 10.92577,18.92399" /><path
id="path5207"
style="display:inline;opacity:1;mix-blend-mode:screen;fill:none;stroke:#ffffff;stroke-width:3.8;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 455.91753,422.9266 10.04491,17.3983" /><path
id="path5209"
style="display:inline;opacity:1;mix-blend-mode:screen;fill:none;stroke:#ffffff;stroke-width:3.8;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 431.04142,568.11278 413.6599,578.148" /><path
id="path5211"
style="display:inline;opacity:1;mix-blend-mode:screen;fill:none;stroke:#ffffff;stroke-width:3.8;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 611.47202,463.94112 592.53604,474.8738" /></g></g><g
inkscape:groupmode="layer"
id="layer9"
inkscape:label="ND_BOTTOM_MEMO"
@ -2271,15 +2330,19 @@
id="tspan2199"
x="510.7153"
y="399.58936"
style="font-size:53.3333px;line-height:1.25;fill:#ff0000">MAP NOT AVAIL</tspan></text></g><text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:53.3333px;line-height:0%;font-family:'Liberation Sans';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;display:inline;fill:#0dc04b;fill-opacity:1;stroke:none"
x="510.7153"
y="537.58936"
id="nd_msg_change"
inkscape:label="#text3401"><tspan
sodipodi:role="line"
id="tspan3544"
style="font-size:53.3333px;line-height:1.25;fill:#ff0000">MAP NOT AVAIL</tspan></text></g><g
inkscape:groupmode="layer"
id="layer7"
inkscape:label="ND_MAIN_MSG"
style="display:inline"><text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:53.3333px;line-height:0%;font-family:'Liberation Sans';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;display:inline;fill:#0dc04b;fill-opacity:1;stroke:none"
x="510.7153"
y="537.58936"
style="font-size:53.3333px;line-height:1.25;fill:#0dc04b">RANGE CHANGE</tspan></text></svg>
id="nd_msg_change"
inkscape:label="#text3401"><tspan
sodipodi:role="line"
id="tspan3544"
x="510.7153"
y="537.58936"
style="font-size:53.3333px;line-height:1.25;fill:#0dc04b">RANGE CHANGE</tspan></text></g></svg>

Before

Width:  |  Height:  |  Size: 144 KiB

After

Width:  |  Height:  |  Size: 149 KiB

View file

@ -1094,6 +1094,16 @@ canvas.NDStyles["Airbus"] = {
is_false: func(nd) nd.symbols.planArcs.hide(),
}, # of planArcs.impl
}, # of planArcs
{
id:"rangeRingPlan",
impl: {
init: func(nd,symbol),
predicate: func(nd) (((nd.in_mode("toggle_display_mode", ["PLAN"])) or ((nd.get_switch("toggle_display_mode") == "MAP") and (nd.get_switch("toggle_centered"))))
and (pts.Instrumentation.TCAS.Inputs.mode.getValue() >= 2) and (nd.rangeNm() <= 20) and (nd.adirs_property.getValue() == 1 or (adirs_3.getValue() == 1 and att_switch.getValue() == nd.attitude_heading_setting))),
is_true: func(nd) nd.symbols.rangeRingPlan.show(),
is_false: func(nd) nd.symbols.rangeRingPlan.hide(),
}, # of rangeRingPlan.impl
}, # of rangeRingPlan
{
id:"rangeArcs",
impl: {
@ -1104,6 +1114,16 @@ canvas.NDStyles["Airbus"] = {
is_false: func(nd) nd.symbols.rangeArcs.hide(),
}, # of rangeArcs.impl
}, # of rangeArcs
{
id:"rangeRingMap",
impl: {
init: func(nd,symbol),
predicate: func(nd) ((nd.get_switch("toggle_display_mode") == "MAP") and (!nd.get_switch("toggle_centered"))
and (pts.Instrumentation.TCAS.Inputs.mode.getValue() >= 2) and (nd.rangeNm() <= 20) and (nd.adirs_property.getValue() == 1 or (adirs_3.getValue() == 1 and att_switch.getValue() == nd.attitude_heading_setting))),
is_true: func(nd) nd.symbols.rangeRingMap.show(),
is_false: func(nd) nd.symbols.rangeRingMap.hide(),
}, # of rangeRingMap.impl
}, # of rangeRingMap
{
id:"rangePln1",
impl: {

View file

@ -1,5 +1,5 @@
# A3XX Electronic Centralised Aircraft Monitoring System
# Copyright (c) 2019 Jonathan Redpath (legoboyvdlp)
# Copyright (c) 2021 Jonathan Redpath (legoboyvdlp)
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)];
@ -29,145 +29,6 @@ var counterClear = 0;
var noMainMsg = 0;
var storeFirstWarning = nil;
var warningNodes = {
Logic: {
altitudeAlert: props.globals.initNode("/ECAM/warnings/altitude-alert/c-chord"),
altitudeAlertSteady: props.globals.initNode("/ECAM/warnings/altitude-alert/altitude-alert-steady"),
altitudeAlertFlash: props.globals.initNode("/ECAM/warnings/altitude-alert/altitude-alert-flash"),
crossbleedFault: props.globals.initNode("/ECAM/warnings/logic/crossbleed-fault"),
crossbleedWai: props.globals.initNode("/ECAM/warnings/logic/crossbleed-wai"),
bleed1LoTempUnsuc: props.globals.initNode("/ECAM/warnings/logic/bleed-1-lo-temp-unsucc"),
bleed1LoTempXbleed: props.globals.initNode("/ECAM/warnings/logic/bleed-1-lo-temp-xbleed"),
bleed1LoTempBleed: props.globals.initNode("/ECAM/warnings/logic/bleed-1-lo-temp-bleed"),
bleed1LoTempPack: props.globals.initNode("/ECAM/warnings/logic/bleed-1-lo-temp-pack"),
bleed1WaiAvail: props.globals.initNode("/ECAM/warnings/logic/bleed-1-wai-avail"),
bleed2LoTempUnsuc: props.globals.initNode("/ECAM/warnings/logic/bleed-2-lo-temp-unsucc"),
bleed2LoTempXbleed: props.globals.initNode("/ECAM/warnings/logic/bleed-2-lo-temp-xbleed"),
bleed2LoTempBleed: props.globals.initNode("/ECAM/warnings/logic/bleed-2-lo-temp-bleed"),
bleed2LoTempPack: props.globals.initNode("/ECAM/warnings/logic/bleed-2-lo-temp-pack"),
bleed2WaiAvail: props.globals.initNode("/ECAM/warnings/logic/bleed-2-wai-avail"),
waiSysfault: props.globals.initNode("/ECAM/warnings/logic/wing-anti-ice-sys-fault"),
waiLclosed: props.globals.initNode("/ECAM/warnings/flipflop/wing-anti-ice-left-closed"),
waiRclosed: props.globals.initNode("/ECAM/warnings/flipflop/wing-anti-ice-right-closed"),
procWaiShutdown: props.globals.initNode("/ECAM/warnings/logic/proc-wai-shutdown-output"),
waiGndFlight: props.globals.initNode("/ECAM/warnings/logic/wing-anti-ice-gnd-fault"),
pack12Fault: props.globals.initNode("/ECAM/warnings/logic/pack-1-2-fault"),
pack1ResetPb: props.globals.initNode("/ECAM/warnings/logic/reset-pack-1-switch-cmd"),
pack2ResetPb: props.globals.initNode("/ECAM/warnings/logic/reset-pack-2-switch-cmd"),
cabinFans: props.globals.initNode("/ECAM/warnings/logic/cabin-fans-fault"),
rtlu1Fault: props.globals.initNode("/ECAM/warnings/logic/rud-trav-lim-sys-1-fault"),
rtlu2Fault: props.globals.initNode("/ECAM/warnings/logic/rud-trav-lim-sys-2-fault"),
rtlu12Fault: props.globals.initNode("/ECAM/warnings/logic/rud-trav-lim-sys-fault"),
fac12Fault: props.globals.initNode("/ECAM/warnings/logic/fac-12-fault"),
fac1Fault: props.globals.initNode("/ECAM/warnings/logic/fac-1-fault"),
fac2Fault: props.globals.initNode("/ECAM/warnings/logic/fac-2-fault"),
stallWarn: props.globals.initNode("/ECAM/warnings/logic/stall/stall-warn-on"),
yawDamper12Fault: props.globals.initNode("/ECAM/warnings/logic/yaw-damper-12-fault"),
gearNotDown1: props.globals.initNode("/ECAM/warnings/fctl/gear-not-down-not-cancellable"),
gearNotDown2: props.globals.initNode("/ECAM/warnings/fctl/gear-not-down-cancellable"),
gearNotDownLocked: props.globals.initNode("/ECAM/warnings/fctl/gear-not-down-locked"),
gearNotDownLockedFlipflop: props.globals.initNode("/ECAM/warnings/fctl/gear-not-downlocked-output"),
blueGreen: props.globals.initNode("/ECAM/warnings/hyd/blue-green-failure"),
blueGreenFuel: props.globals.initNode("/ECAM/warnings/hyd/blue-green-fuel-consumpt"),
blueYellow: props.globals.initNode("/ECAM/warnings/hyd/blue-yellow-failure"),
blueYellowFuel: props.globals.initNode("/ECAM/warnings/hyd/blue-yellow-fuel-consumpt"),
greenYellow: props.globals.initNode("/ECAM/warnings/hyd/green-yellow-failure"),
greenYellowFuel: props.globals.initNode("/ECAM/warnings/hyd/green-yellow-fuel-consumpt"),
leftElevFail: props.globals.initNode("/ECAM/warnings/fctl/leftElevFault"),
rightElevFail: props.globals.initNode("/ECAM/warnings/fctl/rightElevFault"),
flapNotZero: props.globals.initNode("/ECAM/warnings/fctl/flaps-not-zero"),
slatsConfig: props.globals.initNode("/ECAM/warnings/fctl/slats-config-output"),
flapsConfig: props.globals.initNode("/ECAM/warnings/fctl/flaps-config-output"),
spdBrkConfig: props.globals.initNode("/ECAM/warnings/fctl/spd-brk-config-output"),
pitchTrimConfig: props.globals.initNode("/ECAM/warnings/fctl/pitch-trim-config-output"),
rudTrimConfig: props.globals.initNode("/ECAM/warnings/fctl/rudder-trim-config-output"),
parkBrkConfig: props.globals.initNode("/ECAM/warnings/fctl/park-brk-config-output"),
slatsConfig2: props.globals.initNode("/ECAM/warnings/fctl/slats-config-range"),
flapsConfig2: props.globals.initNode("/ECAM/warnings/fctl/flaps-config-range"),
spdBrkConfig2: props.globals.initNode("/ECAM/warnings/fctl/spd-brk-config-range"),
pitchTrimConfig2: props.globals.initNode("/ECAM/warnings/fctl/pitch-trim-config-range"),
rudTrimConfig2: props.globals.initNode("/ECAM/warnings/fctl/rudder-trim-config-range"),
dcEssFuelConsumptionIncreased: props.globals.initNode("/ECAM/warnings/logic/dc-ess-fuel-consumption-increased"),
dcEssFMSPredictions: props.globals.initNode("/ECAM/warnings/logic/dc-ess-fms-predictions-unreliable"),
dc2FuelConsumptionIncreased: props.globals.initNode("/ECAM/warnings/logic/dc-2-fuel-consumption-increased"),
dc2FMSPredictions: props.globals.initNode("/ECAM/warnings/logic/dc-2-fms-predictions-unreliable"),
thrLeversNotSet: props.globals.initNode("/ECAM/warnings/logic/eng/thr-lever-not-set"),
revSet: props.globals.initNode("/ECAM/warnings/logic/eng/reverse-set"),
eng1Fail: props.globals.initNode("/ECAM/warnings/logic/eng/eng-1-fail"),
eng2Fail: props.globals.initNode("/ECAM/warnings/logic/eng/eng-2-fail"),
phase5Trans: props.globals.initNode("/ECAM/warnings/logic/eng/phase-5-output"),
eng1Shutdown: props.globals.initNode("/ECAM/warnings/logic/eng/eng-1-shutdown"),
eng2Shutdown: props.globals.initNode("/ECAM/warnings/logic/eng/eng-2-shutdown"),
acEssBusAltn: props.globals.initNode("/ECAM/warnings/logic/ac-ess-bus-altn-feed"),
gen1Off: props.globals.initNode("/ECAM/warnings/logic/elec/gen-1-off"),
gen2Off: props.globals.initNode("/ECAM/warnings/logic/elec/gen-2-off"),
spdBrkOut: props.globals.initNode("/ECAM/warnings/fctl/spd-brk-still-out"),
},
Timers: {
apuFaultOutput: props.globals.initNode("/ECAM/warnings/timer/apu-fault-output"),
bleed1Fault: props.globals.initNode("/ECAM/warnings/timer/bleed-1-fault"),
bleed1FaultOutput: props.globals.initNode("/ECAM/warnings/timer/bleed-1-fault-output"),
bleed2Fault: props.globals.initNode("/ECAM/warnings/timer/bleed-2-fault"),
bleed2FaultOutput: props.globals.initNode("/ECAM/warnings/timer/bleed-2-fault-output"),
bleed1NotShutOutput: props.globals.initNode("/ECAM/warnings/timer/prv-1-not-shut-output"),
bleed2NotShutOutput: props.globals.initNode("/ECAM/warnings/timer/prv-2-not-shut-output"),
bleed1And2LoTemp: props.globals.initNode("/ECAM/warnings/timer/bleed-1-and-2-low-temp"),
bleed1And2LoTempOutput: props.globals.initNode("/ECAM/warnings/timer/bleed-1-and-2-low-temp-output"),
bleed1Off60Output: props.globals.initNode("/ECAM/warnings/logic/bleed-1-off-60-output"),
bleed1Off5Output: props.globals.initNode("/ECAM/warnings/logic/bleed-1-off-5-output"),
bleed2Off60Output: props.globals.initNode("/ECAM/warnings/logic/bleed-2-off-60-output"),
bleed2Off5Output: props.globals.initNode("/ECAM/warnings/logic/bleed-2-off-5-output"),
eng1AiceNotClsd: props.globals.initNode("/ECAM/warnings/timer/eng-aice-1-open-output"),
eng2AiceNotClsd: props.globals.initNode("/ECAM/warnings/timer/eng-aice-2-open-output"),
eng1AiceNotOpen: props.globals.initNode("/ECAM/warnings/timer/eng-aice-1-closed-output"),
eng2AiceNotOpen: props.globals.initNode("/ECAM/warnings/timer/eng-aice-2-closed-output"),
LRElevFault: props.globals.initNode("/ECAM/warnings/fctl/lrElevFault-output"),
altnLaw: props.globals.initNode("/ECAM/warnings/fctl/altn-law-output"),
directLaw: props.globals.initNode("/ECAM/warnings/fctl/direct-law-output"),
waiLhiPr: props.globals.initNode("/ECAM/warnings/timer/wing-hi-pr-left"),
waiRhiPr: props.globals.initNode("/ECAM/warnings/timer/wing-hi-pr-right"),
pack1Fault: props.globals.initNode("/ECAM/warnings/timer/pack-1-fault-2"),
pack2Fault: props.globals.initNode("/ECAM/warnings/timer/pack-2-fault-2"),
pack1Off: props.globals.initNode("/ECAM/warnings/timer/pack-1-off"),
pack2Off: props.globals.initNode("/ECAM/warnings/timer/pack-2-off"),
trimAirFault: props.globals.initNode("/ECAM/warnings/timer/trim-air-fault"),
yawDamper1Fault: props.globals.initNode("/ECAM/warnings/timer/yaw-damper-1-fault"),
yawDamper2Fault: props.globals.initNode("/ECAM/warnings/timer/yaw-damper-2-fault"),
navTerrFault: props.globals.initNode("/ECAM/warnings/timer/nav-gpws-terr-fault"),
leftElevFail: props.globals.initNode("/ECAM/warnings/fctl/leftElevFault-output"),
rightElevFail: props.globals.initNode("/ECAM/warnings/fctl/rightElevFault-output"),
staticInverter: props.globals.initNode("/systems/electrical/some-electric-thingie/static-inverter-timer"),
dcEmerConfig: props.globals.initNode("/ECAM/warnings/logic/dc-emer-config-output"),
dc12Fault: props.globals.initNode("/ECAM/warnings/logic/dc-1-2-output"),
dcEssFault: props.globals.initNode("/ECAM/warnings/logic/dc-ess-output"),
dc1Fault: props.globals.initNode("/ECAM/warnings/logic/dc-1-output"),
dc2Fault: props.globals.initNode("/ECAM/warnings/logic/dc-2-output"),
dcBatFault: props.globals.initNode("/ECAM/warnings/logic/dc-bat-output"),
ac1Fault: props.globals.initNode("/ECAM/warnings/logic/ac-1-output"),
ac2Fault: props.globals.initNode("/ECAM/warnings/logic/ac-2-output"),
acEssFault: props.globals.initNode("/ECAM/warnings/logic/ac-ess-output"),
dcEssShed: props.globals.initNode("/ECAM/warnings/logic/dc-ess-shed-output"),
acEssShed: props.globals.initNode("/ECAM/warnings/logic/ac-ess-shed-output"),
centerPumpsOff: props.globals.initNode("/ECAM/warnings/fuel/center-pumps-off-output"),
lowLevelBoth: props.globals.initNode("/ECAM/warnings/fuel/lo-level-l-r-output"),
},
Flipflops: {
apuGenFault: props.globals.initNode("/ECAM/warnings/flipflop/apu-gen-fault"),
apuGenFaultOnOff: props.globals.initNode("/ECAM/warnings/flipflop/apu-gen-fault-on-off"),
bleed1LowTemp: props.globals.initNode("/ECAM/warnings/logic/bleed-1-low-temp-flipflop-output"),
bleed2LowTemp: props.globals.initNode("/ECAM/warnings/logic/bleed-2-low-temp-flipflop-output"),
gen1Fault: props.globals.initNode("/ECAM/warnings/flipflop/gen-1-fault"),
gen2Fault: props.globals.initNode("/ECAM/warnings/flipflop/gen-2-fault"),
gen1FaultOnOff: props.globals.initNode("/ECAM/warnings/flipflop/gen-1-fault-on-off"),
gen2FaultOnOff: props.globals.initNode("/ECAM/warnings/flipflop/gen-2-fault-on-off"),
pack1Ovht: props.globals.initNode("/ECAM/warnings/flipflop/pack-1-ovht"),
pack2Ovht: props.globals.initNode("/ECAM/warnings/flipflop/pack-2-ovht"),
parkBrk: props.globals.initNode("/ECAM/warnings/config/park-brk/park-brk-output"),
eng1ThrLvrAbvIdle: props.globals.initNode("/ECAM/warnings/logic/eng/eng-1-thr-lvr-abv-idle"),
eng2ThrLvrAbvIdle: props.globals.initNode("/ECAM/warnings/logic/eng/eng-2-thr-lvr-abv-idle"),
},
};
var warning = {
new: func(msg,colour = "g",aural = 9,light = 9,isMainMsg = 0,lastSubmsg = 0, sdPage = "nil", isMemo = 0) {
var t = {parents:[warning]};
@ -243,7 +104,7 @@ var warning = {
},
callPage: func() {
if (me.sdPage == "nil" or me.hasCalled == 1) { return; }
ecam.SystemDisplay.failCall(me.sdPage);
ecam.SystemDisplayController.failureCall(me.sdPage);
me.hasCalled = 1;
}
};
@ -352,6 +213,7 @@ var ECAM_controller = {
if (counter < 9) {
w.write();
counter += 1;
w.callPage();
}
w.warnlight();
w.sound();
@ -477,9 +339,14 @@ var ECAM_controller = {
}
}
if (statusFlag == 1 and lines[0].getValue() == "") {
ecam.SystemDisplay.manCall("sts");
if (!hasCleared and statusFlag) {
statusFlag = 0;
ecam.SystemDisplayController.manCall("statusPage");
return;
}
if (!hasCleared and !statusFlag) {
SystemDisplayController.manCall("CLR");
}
},
recall: func() {

View file

@ -1,6 +1,5 @@
# A3XX Electronic Centralised Aircraft Monitoring System
# Copyright (c) 2019 Jonathan Redpath (legoboyvdlp)
# Copyright (c) 2021 Jonathan Redpath (legoboyvdlp)
# props.nas:
@ -211,19 +210,19 @@ var messages_priority_3 = func {
}
# ENG FIRE
if ((eng1FireFlAgent2.clearFlag == 0 and systems.eng1FireWarn.getValue() == 1 and phaseVar3 >= 5 and phaseVar3 <= 7) or (eng1FireGnEvac.clearFlag == 0 and systems.eng1FireWarn.getValue() == 1 and (phaseVar3 < 5 or phaseVar3 > 7))) {
if ((eng1Fire.clearFlag == 0 and systems.eng1FireWarn.getValue() == 1 and phaseVar3 >= 5 and phaseVar3 <= 7) or (eng1FireGnEvac.clearFlag == 0 and systems.eng1FireWarn.getValue() == 1 and (phaseVar3 < 5 or phaseVar3 > 7))) {
eng1Fire.active = 1;
} else {
ECAM_controller.warningReset(eng1Fire);
}
if ((eng2FireFlAgent2.clearFlag == 0 and systems.eng2FireWarn.getValue() == 1 and phaseVar3 >= 5 and phaseVar3 <= 7) or (eng2FireGnEvac.clearFlag == 0 and systems.eng2FireWarn.getValue() == 1 and (phaseVar3 < 5 or phaseVar3 > 7))) {
if ((eng2Fire.clearFlag == 0 and systems.eng2FireWarn.getValue() == 1 and phaseVar3 >= 5 and phaseVar3 <= 7) or (eng2FireGnEvac.clearFlag == 0 and systems.eng2FireWarn.getValue() == 1 and (phaseVar3 < 5 or phaseVar3 > 7))) {
eng2Fire.active = 1;
} else {
ECAM_controller.warningReset(eng2Fire);
}
if (apuFireMaster.clearFlag == 0 and systems.apuFireWarn.getValue() == 1) {
if (apuFire.clearFlag == 0 and systems.apuFireWarn.getValue() == 1) {
apuFire.active = 1;
} else {
ECAM_controller.warningReset(apuFire);
@ -551,13 +550,13 @@ var messages_priority_3 = func {
apuFireAgentTimer.msg = " -AGENT AFT " ~ systems.apuAgentTimer.getValue() ~ " S...DISCH";
}
if (apuFireAgent.clearFlag == 0 and systems.APUNodes.Controls.fire.getValue() and !systems.extinguisherBottles.vector[5].lightProp.getValue() and systems.apuAgentTimer.getValue() != 0) {
if (apuFireAgent.clearFlag == 0 and systems.APUNodes.Controls.fire.getValue() and !systems.extinguisherBottles.vector[4].lightProp.getValue() and systems.apuAgentTimer.getValue() != 0) {
apuFireAgentTimer.active = 1;
} else {
ECAM_controller.warningReset(apuFireAgentTimer);
}
if (apuFireAgent.clearFlag == 0 and systems.APUNodes.Controls.fire.getValue() and !systems.extinguisherBottles.vector[5].lightProp.getValue() and systems.apuAgentTimer.getValue() == 0) {
if (apuFireAgent.clearFlag == 0 and systems.APUNodes.Controls.fire.getValue() and !systems.extinguisherBottles.vector[4].lightProp.getValue() and systems.apuAgentTimer.getValue() == 0) {
apuFireAgent.active = 1;
} else {
ECAM_controller.warningReset(apuFireAgent);

View file

@ -5,9 +5,6 @@
var ap_active = 0;
var athr_active = 0;
var engModeSel = 0;
var APUMaster = 0;
var APURPM = 0;
var apOffTime = props.globals.initNode("/ECAM/warnings/ap-off-time", 0, "INT");
var athrOffTime = props.globals.initNode("/ECAM/warnings/athr-off-time", 0, "INT");
var engStrtTimeSw = props.globals.initNode("/ECAM/engine-start-time-switch", 0, "BOOL");
@ -28,6 +25,7 @@ var ECAM = {
engStrtTime.setValue(0);
apWarnNode.setValue(0);
athrWarnNode.setValue(0);
SystemDisplayController.init();
me.reset();
},
update_items: [
@ -71,13 +69,12 @@ var ECAM = {
},
reset: func() {
for (var i = 0; i <= 8; i = i + 1) {
setprop("ECAM/msg/line" ~ i, "");
setprop("ECAM/rightmsg/line" ~ i, "");
setprop("ECAM/msg/linec" ~ i, "w");
setprop("ECAM/rightmsg/linec" ~ i, "w");
setprop("/ECAM/msg/line" ~ i, "");
setprop("/ECAM/rightmsg/line" ~ i, "");
setprop("/ECAM/msg/linec" ~ i, "w");
setprop("/ECAM/rightmsg/linec" ~ i, "w");
}
page.setValue("door");
me.lights.apu.setValue(0);
me.lights.bleed.setValue(0);
me.lights.cond.setValue(0);
@ -124,143 +121,19 @@ var ECAM = {
update_item.update(notification);
}
SystemDisplay.update(notification);
if (me._cachePage != SystemDisplay.page) {
me.updateSDPage(SystemDisplay.page);
if (me._cachePage != SystemDisplayController.displayedPage.name) {
me.updateSDPage(SystemDisplayController.displayedPage.name);
}
},
updateSDPage: func(newPage) {
me._cachePage = newPage;
page.setValue(newPage);
},
clrLight: func() {
me.lights.clr.setValue(1);
},
};
var SystemDisplay = {
page: "",
manShownPage: 0,
failShownPage: 0,
APU10sec: 9,
eng10sec: 9,
fctl20sc: 9,
_apuTime: 0,
_engTime: 0,
_fctlTime: 0,
failCall: func(page) {
if (me.manShownPage) {
me.manShownPage = 0;
ECAMControlPanel.lightOff(me.page);
}
ECAMControlPanel.lightOn(page);
me.page = page;
me.failShownPage = 1;
},
manCall: func(page) {
ECAMControlPanel.lightOff(me.page);
ECAMControlPanel.lightOn(page);
me.page = page;
me.manShownPage = 1;
},
autoCall: func(page) {
if (me.manShownPage or me.failShownPage) { return; }
if (me.page != page) {
me.page = page;
}
},
update: func(notification) {
APUMaster = systems.APUNodes.Controls.master.getValue();
APURPM = pts.APU.rpm.getValue();
engModeSel = pts.Controls.Engines.startSw.getValue();
if (APUMaster == 1 and me.APU10sec != 1) {
me.autoCall("apu");
me.fctl20sec = 0;
if (me.APU10sec == 9 and APURPM >= 95.0) {
me.APU10sec = 0;
me._apuTime = notification.elapsedTime;
}
if (me.APU10sec != 9 and notification.elapsedTime > me._apuTime + 10) {
me.APU10sec = 1;
}
} elsif (engModeSel == 0 or engModeSel == 2 or (engModeSel == 1 and me.eng10sec == 0)) {
me.autoCall("eng");
me.fctl20sec = 0;
if (me.eng10sec == 9 and engModeSel == 1) {
me.eng10sec = 0;
me._engTime = notification.elapsedTime;
}
if (me.eng10sec != 9 and notification.elapsedTime > me._engTime + 10) {
me.eng10sec = 1;
}
} else {
# Reset variables
if (APUMaster == 0) {
me.APU10sec = 9;
}
me.eng10sec = 9;
# Phase logic
if (notification.FWCPhase == 1) {
me.autoCall("door");
me.fctl20sec = 9;
} elsif (notification.FWCPhase == 2) {
if (notification.aileronFBW >= 0.15 or notification.elevatorFBW >= 0.15 and me.fctl20sec == 9) {
me.autoCall("fctl");
if (me.fctl20sec == 9) {
me.fctl20sec = 0;
me._fctlTime = notification.elapsedTime;
}
if (me.fctl20sec != 9 and notification.elapsedTime > me._fctlTime + 20) {
me.fctl20sec = 1;
}
} elsif (me.fctl20sec == 0) {
if (me.fctl20sec != 9 and notification.elapsedTime > me._fctlTime + 20) {
me.fctl20sec = 1;
}
} else {
me.autoCall("wheel");
me.fctl20sec = 9;
}
} elsif (notification.FWCPhase >= 3 and notification.FWCPhase <= 5) {
me.autoCall("eng");
me.fctl20sec = 9;
} elsif (notification.FWCPhase == 6) {
if (notification.gearLever and notification.agl <= 16000) {
me.autoCall("wheel");
} else {
me.autoCall("crz");
}
me.fctl20sec = 9;
} elsif (notification.FWCPhase >= 7 and notification.FWCPhase <= 9) {
me.autoCall("wheel");
me.fctl20sec = 9;
} elsif (notification.FWCPhase == 10) {
me.autoCall("door");
me.fctl20sec = 9;
}
}
},
};
var ECAMControlPanel = {
sysPageBtn: func(page) {
if (SystemDisplay.page != page) {
SystemDisplay.manCall(page);
} else {
me.lightOff(SystemDisplay.page);
SystemDisplay.manShownPage = 0;
}
SystemDisplayController.manCall(page);
},
rclBtn: func() {
ecam.ECAM_controller.recall();
@ -278,22 +151,12 @@ var ECAMControlPanel = {
return;
}
if (SystemDisplay.manShownPage) {
me.lightOff(SystemDisplay.page);
SystemDisplay.manShownPage = 0;
return;
}
if (SystemDisplay.failShownPage) {
me.lightOff(SystemDisplay.page);
SystemDisplay.failShownPage = 0;
return;
}
ecam.ECAM_controller.clear();
},
stsBtn: func() {
SystemDisplay.manCall("sts");
if (SystemDisplayController.displayedPage.name != "statusPage") {
SystemDisplayController.manCall("statusPage");
}
},
allBtn: func() {
# todo
@ -305,11 +168,11 @@ var ECAMControlPanel = {
# todo
},
lightOff: func(pageLightOff) {
if (pageLightOff == "crz") { return; }
if (pageLightOff == "cruise") { return; }
ECAM.lights[pageLightOff].setBoolValue(0);
},
lightOn: func(pageLightOn) {
if (pageLightOn == "crz") { return; }
if (pageLightOn == "cruise") { return; }
ECAM.lights[pageLightOn].setBoolValue(1);
},
};

View file

@ -1,6 +1,5 @@
# A3XX Electronic Centralised Aircraft Monitoring System
# Copyright (c) 2019 Jonathan Redpath (legoboyvdlp)
# Copyright (c) 2021 Jonathan Redpath (legoboyvdlp)
# messages stored in vectors
@ -101,7 +100,7 @@ var warnings = std.Vector.new([
var ADR123FaultPROC = warning.new(msg: " -ALL ADR OFF PROC.APPLY", colour: "c"),
# APU FIRE
var apuFire = warning.new(msg: "APU FIRE ", colour: "r", aural: 0, light: 0, isMainMsg: 1, sdPage: "apu"),
var apuFire = warning.new(msg: "APU FIRE ", colour: "r", aural: 0, light: 0, isMainMsg: 1, sdPage: "apuPage"),
var apuFirePB = warning.new(msg: " -APU FIRE P/B......PUSH", colour: "c"),
var apuFireAgentTimer = warning.new(msg: " -AGENT AFT 10 S...DISCH", colour: "c"),
var apuFireAgent = warning.new(msg: " -AGENT............DISCH", colour: "c"),

212
Nasal/ECAM/ECAM-nodes.nas Normal file
View file

@ -0,0 +1,212 @@
# A3XX Electronic Centralised Aircraft Monitoring System
# Copyright (c) 2021 Jonathan Redpath (legoboyvdlp)
var FWC = {
Btn: {
clr: props.globals.initNode("/ECAM/buttons/clear-btn", 0, "BOOL"),
recall: props.globals.initNode("/ECAM/buttons/recall-btn", 0, "BOOL"),
recallStsNormal: props.globals.initNode("/ECAM/buttons/recall-status-normal", 0, "BOOL"),
recallStsNormalOutput: props.globals.initNode("/ECAM/buttons/recall-status-normal-output", 0, "BOOL"),
},
Monostable: {
phase1: props.globals.initNode("/ECAM/phases/monostable/phase-1-300", 0, "BOOL"),
phase5: props.globals.initNode("/ECAM/phases/monostable/phase-5", 0, "BOOL"),
phase5Temp: 0,
phase7: props.globals.initNode("/ECAM/phases/monostable/phase-7", 0, "BOOL"),
phase7Temp: 0,
phase9: props.globals.initNode("/ECAM/phases/monostable/phase-9", 0, "BOOL"),
phase1Output: props.globals.initNode("/ECAM/phases/monostable/phase-1-300-output"),
phase1OutputTemp: 0,
phase5Output: props.globals.initNode("/ECAM/phases/monostable/phase-5-output"),
phase5OutputTemp: 0,
phase7Output: props.globals.initNode("/ECAM/phases/monostable/phase-7-output"),
phase7OutputTemp: 0,
phase9Output: props.globals.initNode("/ECAM/phases/monostable/phase-9-output"),
toPowerOutput: props.globals.getNode("/ECAM/phases/monostable/to-power-set-output"),
m80kt: props.globals.getNode("/ECAM/phases/monostable-80kt"),
altAlert1: props.globals.initNode("/ECAM/altitude-alert-monostable-set", 0, "BOOL"),
altAlert1Output: props.globals.initNode("/ECAM/altitude-alert-monostable-output"),
altAlert2: props.globals.initNode("/ECAM/flipflop/altitude-alert-rs-set", 0, "BOOL"),
},
Flipflop: {
phase2Set: props.globals.initNode("/ECAM/phases/flipflop/phase-2-set", 0, "BOOL"),
phase2Reset: props.globals.initNode("/ECAM/phases/flipflop/phase-2-reset", 0, "BOOL"),
phase2Output: props.globals.initNode("/ECAM/phases/flipflop/phase-2-output", 0, "BOOL"),
phase2OutputTemp: 0,
phase10Set: props.globals.initNode("/ECAM/phases/flipflop/phase-10-set", 0, "BOOL"),
phase10Reset: props.globals.initNode("/ECAM/phases/flipflop/phase-10-reset", 0, "BOOL"),
phase10Output: props.globals.initNode("/ECAM/phases/flipflop/phase-10-output", 0, "BOOL"),
recallSet: props.globals.initNode("/ECAM/flipflop/recall-set", 0, "BOOL"),
recallReset: props.globals.initNode("/ECAM/flipflop/recall-reset", 0, "BOOL"),
recallOutput: props.globals.initNode("/ECAM/flipflop/recall-output", 0, "BOOL"),
recallOutputTemp: 0,
},
Logic: {
gnd: props.globals.getNode("/ECAM/logic/ground-calc-immediate"),
IRSinAlign: props.globals.initNode("/ECAM/irs-in-align", 0, "BOOL"),
feet1500: props.globals.getNode("/ECAM/phases/phase-calculation/altitude-ge-1500"),
feet800: props.globals.getNode("/ECAM/phases/phase-calculation/altitude-ge-800"),
},
Timer: {
eng1idle: props.globals.getNode("/ECAM/phases/timer/eng1idle"),
eng2idle: props.globals.getNode("/ECAM/phases/timer/eng2idle"),
eng1or2: props.globals.getNode("/ECAM/phases/phase-calculation/one-engine-running"),
toInhibit: props.globals.initNode("/ECAM/phases/timer/to-inhibit", 0, "INT"),
ldgInhibit: props.globals.initNode("/ECAM/phases/timer/ldg-inhibit", 0, "INT"),
eng1idleOutput: props.globals.getNode("/ECAM/phases/timer/eng1idle-output"),
eng2idleOutput: props.globals.getNode("/ECAM/phases/timer/eng2idle-output"),
eng1and2Off: props.globals.getNode("/ECAM/phases/phase-calculation/engines-1-2-not-running"),
eng1and2OffTemp: 0,
eng1or2Output: props.globals.getNode("/ECAM/phases/phase-calculation/engine-1-or-2-running"),
eng1or2OutputTemp: 0,
toInhibitOutput: props.globals.getNode("/ECAM/phases/timer/to-inhibit-output"),
ldgInhibitOutput: props.globals.getNode("/ECAM/phases/timer/ldg-inhibit-output"),
gnd: props.globals.getNode("/ECAM/timer/ground-calc"), # ZGND
gnd2Sec: props.globals.getNode("/ECAM/phases/monostable/gnd-output"),
gnd2SecHalf: props.globals.getNode("/ECAM/phases/monostable/gnd-output-2"), # hack to prevent getting confused between phase 5 / 6
},
speed80: props.globals.initNode("/ECAM/phases/speed-gt-80", 0, "BOOL"),
speed80Temp: 0,
toPower: props.globals.getNode("/ECAM/phases/phase-calculation/takeoff-power"),
toPowerTemp: 0,
altChg: props.globals.getNode("/it-autoflight/input/alt-is-changing", 1),
};
var warningNodes = {
Logic: {
altitudeAlert: props.globals.initNode("/ECAM/warnings/altitude-alert/c-chord"),
altitudeAlertSteady: props.globals.initNode("/ECAM/warnings/altitude-alert/altitude-alert-steady"),
altitudeAlertFlash: props.globals.initNode("/ECAM/warnings/altitude-alert/altitude-alert-flash"),
crossbleedFault: props.globals.initNode("/ECAM/warnings/logic/crossbleed-fault"),
crossbleedWai: props.globals.initNode("/ECAM/warnings/logic/crossbleed-wai"),
bleed1LoTempUnsuc: props.globals.initNode("/ECAM/warnings/logic/bleed-1-lo-temp-unsucc"),
bleed1LoTempXbleed: props.globals.initNode("/ECAM/warnings/logic/bleed-1-lo-temp-xbleed"),
bleed1LoTempBleed: props.globals.initNode("/ECAM/warnings/logic/bleed-1-lo-temp-bleed"),
bleed1LoTempPack: props.globals.initNode("/ECAM/warnings/logic/bleed-1-lo-temp-pack"),
bleed1WaiAvail: props.globals.initNode("/ECAM/warnings/logic/bleed-1-wai-avail"),
bleed2LoTempUnsuc: props.globals.initNode("/ECAM/warnings/logic/bleed-2-lo-temp-unsucc"),
bleed2LoTempXbleed: props.globals.initNode("/ECAM/warnings/logic/bleed-2-lo-temp-xbleed"),
bleed2LoTempBleed: props.globals.initNode("/ECAM/warnings/logic/bleed-2-lo-temp-bleed"),
bleed2LoTempPack: props.globals.initNode("/ECAM/warnings/logic/bleed-2-lo-temp-pack"),
bleed2WaiAvail: props.globals.initNode("/ECAM/warnings/logic/bleed-2-wai-avail"),
waiSysfault: props.globals.initNode("/ECAM/warnings/logic/wing-anti-ice-sys-fault"),
waiLclosed: props.globals.initNode("/ECAM/warnings/flipflop/wing-anti-ice-left-closed"),
waiRclosed: props.globals.initNode("/ECAM/warnings/flipflop/wing-anti-ice-right-closed"),
procWaiShutdown: props.globals.initNode("/ECAM/warnings/logic/proc-wai-shutdown-output"),
waiGndFlight: props.globals.initNode("/ECAM/warnings/logic/wing-anti-ice-gnd-fault"),
pack12Fault: props.globals.initNode("/ECAM/warnings/logic/pack-1-2-fault"),
pack1ResetPb: props.globals.initNode("/ECAM/warnings/logic/reset-pack-1-switch-cmd"),
pack2ResetPb: props.globals.initNode("/ECAM/warnings/logic/reset-pack-2-switch-cmd"),
cabinFans: props.globals.initNode("/ECAM/warnings/logic/cabin-fans-fault"),
rtlu1Fault: props.globals.initNode("/ECAM/warnings/logic/rud-trav-lim-sys-1-fault"),
rtlu2Fault: props.globals.initNode("/ECAM/warnings/logic/rud-trav-lim-sys-2-fault"),
rtlu12Fault: props.globals.initNode("/ECAM/warnings/logic/rud-trav-lim-sys-fault"),
fac12Fault: props.globals.initNode("/ECAM/warnings/logic/fac-12-fault"),
fac1Fault: props.globals.initNode("/ECAM/warnings/logic/fac-1-fault"),
fac2Fault: props.globals.initNode("/ECAM/warnings/logic/fac-2-fault"),
stallWarn: props.globals.initNode("/ECAM/warnings/logic/stall/stall-warn-on"),
yawDamper12Fault: props.globals.initNode("/ECAM/warnings/logic/yaw-damper-12-fault"),
gearNotDown1: props.globals.initNode("/ECAM/warnings/fctl/gear-not-down-not-cancellable"),
gearNotDown2: props.globals.initNode("/ECAM/warnings/fctl/gear-not-down-cancellable"),
gearNotDownLocked: props.globals.initNode("/ECAM/warnings/fctl/gear-not-down-locked"),
gearNotDownLockedFlipflop: props.globals.initNode("/ECAM/warnings/fctl/gear-not-downlocked-output"),
blueGreen: props.globals.initNode("/ECAM/warnings/hyd/blue-green-failure"),
blueGreenFuel: props.globals.initNode("/ECAM/warnings/hyd/blue-green-fuel-consumpt"),
blueYellow: props.globals.initNode("/ECAM/warnings/hyd/blue-yellow-failure"),
blueYellowFuel: props.globals.initNode("/ECAM/warnings/hyd/blue-yellow-fuel-consumpt"),
greenYellow: props.globals.initNode("/ECAM/warnings/hyd/green-yellow-failure"),
greenYellowFuel: props.globals.initNode("/ECAM/warnings/hyd/green-yellow-fuel-consumpt"),
leftElevFail: props.globals.initNode("/ECAM/warnings/fctl/leftElevFault"),
rightElevFail: props.globals.initNode("/ECAM/warnings/fctl/rightElevFault"),
flapNotZero: props.globals.initNode("/ECAM/warnings/fctl/flaps-not-zero"),
slatsConfig: props.globals.initNode("/ECAM/warnings/fctl/slats-config-output"),
flapsConfig: props.globals.initNode("/ECAM/warnings/fctl/flaps-config-output"),
spdBrkConfig: props.globals.initNode("/ECAM/warnings/fctl/spd-brk-config-output"),
pitchTrimConfig: props.globals.initNode("/ECAM/warnings/fctl/pitch-trim-config-output"),
rudTrimConfig: props.globals.initNode("/ECAM/warnings/fctl/rudder-trim-config-output"),
parkBrkConfig: props.globals.initNode("/ECAM/warnings/fctl/park-brk-config-output"),
slatsConfig2: props.globals.initNode("/ECAM/warnings/fctl/slats-config-range"),
flapsConfig2: props.globals.initNode("/ECAM/warnings/fctl/flaps-config-range"),
spdBrkConfig2: props.globals.initNode("/ECAM/warnings/fctl/spd-brk-config-range"),
pitchTrimConfig2: props.globals.initNode("/ECAM/warnings/fctl/pitch-trim-config-range"),
rudTrimConfig2: props.globals.initNode("/ECAM/warnings/fctl/rudder-trim-config-range"),
dcEssFuelConsumptionIncreased: props.globals.initNode("/ECAM/warnings/logic/dc-ess-fuel-consumption-increased"),
dcEssFMSPredictions: props.globals.initNode("/ECAM/warnings/logic/dc-ess-fms-predictions-unreliable"),
dc2FuelConsumptionIncreased: props.globals.initNode("/ECAM/warnings/logic/dc-2-fuel-consumption-increased"),
dc2FMSPredictions: props.globals.initNode("/ECAM/warnings/logic/dc-2-fms-predictions-unreliable"),
thrLeversNotSet: props.globals.initNode("/ECAM/warnings/logic/eng/thr-lever-not-set"),
revSet: props.globals.initNode("/ECAM/warnings/logic/eng/reverse-set"),
eng1Fail: props.globals.initNode("/ECAM/warnings/logic/eng/eng-1-fail"),
eng2Fail: props.globals.initNode("/ECAM/warnings/logic/eng/eng-2-fail"),
phase5Trans: props.globals.initNode("/ECAM/warnings/logic/eng/phase-5-output"),
eng1Shutdown: props.globals.initNode("/ECAM/warnings/logic/eng/eng-1-shutdown"),
eng2Shutdown: props.globals.initNode("/ECAM/warnings/logic/eng/eng-2-shutdown"),
acEssBusAltn: props.globals.initNode("/ECAM/warnings/logic/ac-ess-bus-altn-feed"),
gen1Off: props.globals.initNode("/ECAM/warnings/logic/elec/gen-1-off"),
gen2Off: props.globals.initNode("/ECAM/warnings/logic/elec/gen-2-off"),
spdBrkOut: props.globals.initNode("/ECAM/warnings/fctl/spd-brk-still-out"),
},
Timers: {
apuFaultOutput: props.globals.initNode("/ECAM/warnings/timer/apu-fault-output"),
bleed1Fault: props.globals.initNode("/ECAM/warnings/timer/bleed-1-fault"),
bleed1FaultOutput: props.globals.initNode("/ECAM/warnings/timer/bleed-1-fault-output"),
bleed2Fault: props.globals.initNode("/ECAM/warnings/timer/bleed-2-fault"),
bleed2FaultOutput: props.globals.initNode("/ECAM/warnings/timer/bleed-2-fault-output"),
bleed1NotShutOutput: props.globals.initNode("/ECAM/warnings/timer/prv-1-not-shut-output"),
bleed2NotShutOutput: props.globals.initNode("/ECAM/warnings/timer/prv-2-not-shut-output"),
bleed1And2LoTemp: props.globals.initNode("/ECAM/warnings/timer/bleed-1-and-2-low-temp"),
bleed1And2LoTempOutput: props.globals.initNode("/ECAM/warnings/timer/bleed-1-and-2-low-temp-output"),
bleed1Off60Output: props.globals.initNode("/ECAM/warnings/logic/bleed-1-off-60-output"),
bleed1Off5Output: props.globals.initNode("/ECAM/warnings/logic/bleed-1-off-5-output"),
bleed2Off60Output: props.globals.initNode("/ECAM/warnings/logic/bleed-2-off-60-output"),
bleed2Off5Output: props.globals.initNode("/ECAM/warnings/logic/bleed-2-off-5-output"),
eng1AiceNotClsd: props.globals.initNode("/ECAM/warnings/timer/eng-aice-1-open-output"),
eng2AiceNotClsd: props.globals.initNode("/ECAM/warnings/timer/eng-aice-2-open-output"),
eng1AiceNotOpen: props.globals.initNode("/ECAM/warnings/timer/eng-aice-1-closed-output"),
eng2AiceNotOpen: props.globals.initNode("/ECAM/warnings/timer/eng-aice-2-closed-output"),
LRElevFault: props.globals.initNode("/ECAM/warnings/fctl/lrElevFault-output"),
altnLaw: props.globals.initNode("/ECAM/warnings/fctl/altn-law-output"),
directLaw: props.globals.initNode("/ECAM/warnings/fctl/direct-law-output"),
waiLhiPr: props.globals.initNode("/ECAM/warnings/timer/wing-hi-pr-left"),
waiRhiPr: props.globals.initNode("/ECAM/warnings/timer/wing-hi-pr-right"),
pack1Fault: props.globals.initNode("/ECAM/warnings/timer/pack-1-fault-2"),
pack2Fault: props.globals.initNode("/ECAM/warnings/timer/pack-2-fault-2"),
pack1Off: props.globals.initNode("/ECAM/warnings/timer/pack-1-off"),
pack2Off: props.globals.initNode("/ECAM/warnings/timer/pack-2-off"),
trimAirFault: props.globals.initNode("/ECAM/warnings/timer/trim-air-fault"),
yawDamper1Fault: props.globals.initNode("/ECAM/warnings/timer/yaw-damper-1-fault"),
yawDamper2Fault: props.globals.initNode("/ECAM/warnings/timer/yaw-damper-2-fault"),
navTerrFault: props.globals.initNode("/ECAM/warnings/timer/nav-gpws-terr-fault"),
leftElevFail: props.globals.initNode("/ECAM/warnings/fctl/leftElevFault-output"),
rightElevFail: props.globals.initNode("/ECAM/warnings/fctl/rightElevFault-output"),
staticInverter: props.globals.initNode("/systems/electrical/some-electric-thingie/static-inverter-timer"),
dcEmerConfig: props.globals.initNode("/ECAM/warnings/logic/dc-emer-config-output"),
dc12Fault: props.globals.initNode("/ECAM/warnings/logic/dc-1-2-output"),
dcEssFault: props.globals.initNode("/ECAM/warnings/logic/dc-ess-output"),
dc1Fault: props.globals.initNode("/ECAM/warnings/logic/dc-1-output"),
dc2Fault: props.globals.initNode("/ECAM/warnings/logic/dc-2-output"),
dcBatFault: props.globals.initNode("/ECAM/warnings/logic/dc-bat-output"),
ac1Fault: props.globals.initNode("/ECAM/warnings/logic/ac-1-output"),
ac2Fault: props.globals.initNode("/ECAM/warnings/logic/ac-2-output"),
acEssFault: props.globals.initNode("/ECAM/warnings/logic/ac-ess-output"),
dcEssShed: props.globals.initNode("/ECAM/warnings/logic/dc-ess-shed-output"),
acEssShed: props.globals.initNode("/ECAM/warnings/logic/ac-ess-shed-output"),
centerPumpsOff: props.globals.initNode("/ECAM/warnings/fuel/center-pumps-off-output"),
lowLevelBoth: props.globals.initNode("/ECAM/warnings/fuel/lo-level-l-r-output"),
},
Flipflops: {
apuGenFault: props.globals.initNode("/ECAM/warnings/flipflop/apu-gen-fault"),
apuGenFaultOnOff: props.globals.initNode("/ECAM/warnings/flipflop/apu-gen-fault-on-off"),
bleed1LowTemp: props.globals.initNode("/ECAM/warnings/logic/bleed-1-low-temp-flipflop-output"),
bleed2LowTemp: props.globals.initNode("/ECAM/warnings/logic/bleed-2-low-temp-flipflop-output"),
gen1Fault: props.globals.initNode("/ECAM/warnings/flipflop/gen-1-fault"),
gen2Fault: props.globals.initNode("/ECAM/warnings/flipflop/gen-2-fault"),
gen1FaultOnOff: props.globals.initNode("/ECAM/warnings/flipflop/gen-1-fault-on-off"),
gen2FaultOnOff: props.globals.initNode("/ECAM/warnings/flipflop/gen-2-fault-on-off"),
pack1Ovht: props.globals.initNode("/ECAM/warnings/flipflop/pack-1-ovht"),
pack2Ovht: props.globals.initNode("/ECAM/warnings/flipflop/pack-2-ovht"),
parkBrk: props.globals.initNode("/ECAM/warnings/config/park-brk/park-brk-output"),
eng1ThrLvrAbvIdle: props.globals.initNode("/ECAM/warnings/logic/eng/eng-1-thr-lvr-abv-idle"),
eng2ThrLvrAbvIdle: props.globals.initNode("/ECAM/warnings/logic/eng/eng-2-thr-lvr-abv-idle"),
},
};

View file

@ -1,76 +1,7 @@
# A3XX FWC Phases
# Copyright (c) 2021 Jonathan Redpath (legoboyvdlp)
# Copyright (c) 2019 Jonathan Redpath (legoboyvdlp)
var myPhase = nil;
var eng = nil;
var eng1epr = nil;
var eng2epr = nil;
var eng1n1 = nil;
var eng2n1 = nil;
var master1 = nil;
var master2 = nil;
var gear_agl_cur = nil;
var FWC = {
Btn: {
clr: props.globals.initNode("/ECAM/buttons/clear-btn", 0, "BOOL"),
recall: props.globals.initNode("/ECAM/buttons/recall-btn", 0, "BOOL"),
recallStsNormal: props.globals.initNode("/ECAM/buttons/recall-status-normal", 0, "BOOL"),
recallStsNormalOutput: props.globals.initNode("/ECAM/buttons/recall-status-normal-output", 0, "BOOL"),
},
Monostable: {
phase1: props.globals.initNode("/ECAM/phases/monostable/phase-1-300", 0, "BOOL"),
phase5: props.globals.initNode("/ECAM/phases/monostable/phase-5", 0, "BOOL"),
phase7: props.globals.initNode("/ECAM/phases/monostable/phase-7", 0, "BOOL"),
phase9: props.globals.initNode("/ECAM/phases/monostable/phase-9", 0, "BOOL"),
phase1Output: props.globals.initNode("/ECAM/phases/monostable/phase-1-300-output"),
phase5Output: props.globals.initNode("/ECAM/phases/monostable/phase-5-output"),
phase7Output: props.globals.initNode("/ECAM/phases/monostable/phase-7-output"),
phase9Output: props.globals.initNode("/ECAM/phases/monostable/phase-9-output"),
toPowerOutput: props.globals.getNode("/ECAM/phases/monostable/to-power-set-output"),
m80kt: props.globals.getNode("/ECAM/phases/monostable-80kt"),
altAlert1: props.globals.initNode("/ECAM/altitude-alert-monostable-set", 0, "BOOL"),
altAlert1Output: props.globals.initNode("/ECAM/altitude-alert-monostable-output"),
altAlert2: props.globals.initNode("/ECAM/flipflop/altitude-alert-rs-set", 0, "BOOL"),
},
Flipflop: {
phase2Set: props.globals.initNode("/ECAM/phases/flipflop/phase-2-set", 0, "BOOL"),
phase2Reset: props.globals.initNode("/ECAM/phases/flipflop/phase-2-reset", 0, "BOOL"),
phase2Output: props.globals.initNode("/ECAM/phases/flipflop/phase-2-output", 0, "BOOL"),
phase10Set: props.globals.initNode("/ECAM/phases/flipflop/phase-10-set", 0, "BOOL"),
phase10Reset: props.globals.initNode("/ECAM/phases/flipflop/phase-10-reset", 0, "BOOL"),
phase10Output: props.globals.initNode("/ECAM/phases/flipflop/phase-10-output", 0, "BOOL"),
recallSet: props.globals.initNode("/ECAM/flipflop/recall-set", 0, "BOOL"),
recallReset: props.globals.initNode("/ECAM/flipflop/recall-reset", 0, "BOOL"),
recallOutput: props.globals.initNode("/ECAM/flipflop/recall-output", 0, "BOOL"),
},
Logic: {
gnd: props.globals.getNode("/ECAM/logic/ground-calc-immediate"),
IRSinAlign: props.globals.initNode("/ECAM/irs-in-align", 0, "BOOL"),
feet1500: props.globals.getNode("/ECAM/phases/phase-calculation/altitude-ge-1500"),
feet800: props.globals.getNode("/ECAM/phases/phase-calculation/altitude-ge-800"),
},
Timer: {
eng1idle: props.globals.getNode("/ECAM/phases/timer/eng1idle"),
eng2idle: props.globals.getNode("/ECAM/phases/timer/eng2idle"),
eng1or2: props.globals.getNode("/ECAM/phases/phase-calculation/one-engine-running"),
toInhibit: props.globals.initNode("/ECAM/phases/timer/to-inhibit", 0, "INT"),
ldgInhibit: props.globals.initNode("/ECAM/phases/timer/ldg-inhibit", 0, "INT"),
eng1idleOutput: props.globals.getNode("/ECAM/phases/timer/eng1idle-output"),
eng2idleOutput: props.globals.getNode("/ECAM/phases/timer/eng2idle-output"),
eng1and2Off: props.globals.getNode("/ECAM/phases/phase-calculation/engines-1-2-not-running"),
eng1or2Output: props.globals.getNode("/ECAM/phases/phase-calculation/engine-1-or-2-running"),
toInhibitOutput: props.globals.getNode("/ECAM/phases/timer/to-inhibit-output"),
ldgInhibitOutput: props.globals.getNode("/ECAM/phases/timer/ldg-inhibit-output"),
gnd: props.globals.getNode("/ECAM/timer/ground-calc"), # ZGND
gnd2Sec: props.globals.getNode("/ECAM/phases/monostable/gnd-output"),
gnd2SecHalf: props.globals.getNode("/ECAM/phases/monostable/gnd-output-2"), # hack to prevent getting confused between phase 5 / 6
},
speed80: props.globals.initNode("/ECAM/phases/speed-gt-80", 0, "BOOL"),
toPower: props.globals.getNode("/ECAM/phases/phase-calculation/takeoff-power"),
altChg: props.globals.getNode("/it-autoflight/input/alt-is-changing", 1),
};
var currentPhase = nil;
var gnd = nil;
var gndTimer = nil;
@ -79,124 +10,77 @@ var phaseLoop = func() {
if ((systems.ELEC.Bus.acEss.getValue() < 110 and systems.ELEC.Bus.ac2.getValue() < 110) or pts.Acconfig.running.getBoolValue()) { return; }
if (pts.Sim.Replay.replayActive.getBoolValue()) { return; }
myPhase = pts.ECAM.fwcWarningPhase.getValue();
eng = pts.Options.eng.getValue();
eng1epr = pts.Engines.Engine.eprActual[0].getValue();
eng2epr = pts.Engines.Engine.eprActual[1].getValue();
eng1n1 = pts.Engines.Engine.n1Actual[0].getValue();
eng2n1 = pts.Engines.Engine.n1Actual[1].getValue();
master1 = pts.Controls.Engines.Engine.cutoffSw[0].getBoolValue();
master2 = pts.Controls.Engines.Engine.cutoffSw[1].getBoolValue();
currentPhase = pts.ECAM.fwcWarningPhase.getValue();
gnd = FWC.Logic.gnd.getBoolValue();
gndTimer = FWC.Timer.gnd.getValue();
FWC.Flipflop.recallReset.setValue(0);
if (FWC.Flipflop.recallReset.getValue() != 0) {
FWC.Flipflop.recallReset.setValue(0);
}
# Various things
FWC.toPowerTemp = FWC.toPower.getBoolValue();
FWC.Timer.eng1and2OffTemp = FWC.Timer.eng1and2Off.getValue();
FWC.Timer.eng1or2OutputTemp = FWC.Timer.eng1or2Output.getBoolValue();
FWC.speed80Temp = FWC.speed80.getBoolValue();
if (myPhase == 9) {
FWC.Monostable.phase9.setBoolValue(1);
} else {
FWC.Monostable.phase9.setBoolValue(0);
}
FWC.Monostable.phase1OutputTemp = FWC.Monostable.phase1Output.getBoolValue();
FWC.Flipflop.phase2OutputTemp = FWC.Flipflop.phase2Output.getBoolValue();
FWC.Monostable.phase5Temp = FWC.Monostable.phase5.getBoolValue();
FWC.Monostable.phase5OutputTemp = FWC.Monostable.phase5Output.getBoolValue();
FWC.Monostable.phase7Temp = FWC.Monostable.phase7.getBoolValue();
FWC.Monostable.phase7OutputTemp = FWC.Monostable.phase7Output.getBoolValue();
# Phase 1 / 10 flipflop
if (myPhase == 9) {
FWC.Flipflop.phase10Set.setBoolValue(1);
} else {
FWC.Flipflop.phase10Set.setBoolValue(0);
}
if (gndTimer == 1 and pts.Controls.Engines.Engine.firePb[0].getBoolValue()) {
FWC.Flipflop.phase10Reset.setBoolValue(1);
} else {
FWC.Flipflop.phase10Reset.setBoolValue(0);
}
if ((gnd and FWC.Timer.eng1and2Off.getValue() and myPhase == 9) and FWC.Flipflop.phase10Output.getBoolValue()) {
FWC.Monostable.phase1.setBoolValue(1); # true for 300 sec then false
} else {
FWC.Monostable.phase1.setBoolValue(0);
}
# Phase 2 flipflop
if (myPhase == 3 or myPhase == 8) {
FWC.Flipflop.phase2Set.setBoolValue(1);
} else {
FWC.Flipflop.phase2Set.setBoolValue(0);
}
if (!FWC.Monostable.m80kt.getBoolValue() and myPhase != 9 and ((!FWC.Monostable.phase9Output.getBoolValue() and gndTimer == 1) or (!FWC.Monostable.toPowerOutput.getBoolValue() and gndTimer == 1))) {
FWC.Flipflop.phase2Reset.setBoolValue(1);
} else {
FWC.Flipflop.phase2Reset.setBoolValue(0);
}
gear_agl_cur = pts.Position.gearAglFt.getValue();
# Phase 5 monostable
if (FWC.toPower.getBoolValue() and (!FWC.Logic.feet1500.getBoolValue() and !gnd and FWC.Timer.gnd2Sec.getValue() != 1)) {
FWC.Monostable.phase5.setBoolValue(1);
} else {
FWC.Monostable.phase5.setBoolValue(0);
}
# Phase 7 monostable
if (!FWC.toPower.getBoolValue() and !FWC.Logic.feet1500.getBoolValue() and !FWC.Logic.feet800.getBoolValue() and !gnd and FWC.Timer.gnd2Sec.getValue() != 1) {
FWC.Monostable.phase7.setBoolValue(1);
} else {
FWC.Monostable.phase7.setBoolValue(0);
}
# Actual Phases
if ((gnd and FWC.Timer.eng1and2Off.getValue() and myPhase != 9) and !FWC.Monostable.phase1Output.getBoolValue()) {
# Set Phases
if ((gnd and FWC.Timer.eng1and2OffTemp and currentPhase != 9) and !FWC.Monostable.phase1OutputTemp) {
setPhase(1);
}
if (FWC.Timer.eng1or2Output.getBoolValue() and (gnd and !FWC.toPower.getBoolValue() and !FWC.speed80.getBoolValue()) and !FWC.Flipflop.phase2Output.getBoolValue()) {
if (FWC.Timer.eng1or2OutputTemp and (gnd and !FWC.toPowerTemp and !FWC.speed80Temp) and !FWC.Flipflop.phase2OutputTemp) {
setPhase(2);
}
if (FWC.Timer.eng1or2Output.getBoolValue() and (gndTimer == 1 and FWC.toPower.getBoolValue()) and !FWC.speed80.getBoolValue()) {
if (FWC.Timer.eng1or2OutputTemp and (gndTimer == 1 and FWC.toPowerTemp) and !FWC.speed80Temp) {
setPhase(3);
}
if ((gndTimer == 1 and FWC.toPower.getBoolValue()) and FWC.speed80.getBoolValue()) {
if ((gndTimer == 1 and FWC.toPowerTemp) and FWC.speed80Temp) {
setPhase(4);
}
if (FWC.Monostable.phase5.getBoolValue() and FWC.Monostable.phase5Output.getBoolValue()) {
if (FWC.Monostable.phase5Temp and FWC.Monostable.phase5OutputTemp) {
setPhase(5);
}
if (!gnd and FWC.Timer.gnd2SecHalf.getValue() != 1 and (!FWC.Monostable.phase5.getBoolValue() or !FWC.Monostable.phase5Output.getBoolValue()) and (!FWC.Monostable.phase7.getBoolValue() or !FWC.Monostable.phase7Output.getBoolValue())) {
if (!gnd and FWC.Timer.gnd2SecHalf.getValue() != 1 and (!FWC.Monostable.phase5Temp or !FWC.Monostable.phase5OutputTemp) and (!FWC.Monostable.phase7Temp or !FWC.Monostable.phase7OutputTemp)) {
setPhase(6);
}
if ((FWC.Monostable.phase7.getBoolValue() and FWC.Monostable.phase7Output.getBoolValue()) and myPhase != 8) {
if ((FWC.Monostable.phase7Temp and FWC.Monostable.phase7OutputTemp) and currentPhase != 8) {
setPhase(7);
}
if (!FWC.toPower.getBoolValue() and FWC.speed80.getBoolValue() and (gnd or FWC.Timer.gnd2Sec.getValue == 1)) {
if (!FWC.toPowerTemp and FWC.speed80Temp and (gnd or FWC.Timer.gnd2Sec.getValue() == 1)) {
setPhase(8);
}
if (FWC.Flipflop.phase2Output.getBoolValue() and (gnd and !FWC.toPower.getBoolValue() and !FWC.speed80.getBoolValue()) and FWC.Timer.eng1or2.getBoolValue()) {
if (FWC.Flipflop.phase2OutputTemp and (gnd and !FWC.toPowerTemp and !FWC.speed80Temp) and FWC.Timer.eng1or2.getBoolValue()) {
setPhase(9);
}
if ((gnd and FWC.Timer.eng1and2Off.getValue() and myPhase == 9) and FWC.Monostable.phase1Output.getBoolValue()) {
if ((gnd and FWC.Timer.eng1and2OffTemp and currentPhase == 9) and FWC.Monostable.phase1OutputTemp) {
setPhase(10);
}
# FWC Inhibiting
myPhase = pts.ECAM.fwcWarningPhase.getValue();
if (myPhase >= 3 and myPhase <= 5 and !FWC.Flipflop.recallOutput.getValue()) {
currentPhase = pts.ECAM.fwcWarningPhase.getValue();
FWC.Flipflop.recallOutputTemp = FWC.Flipflop.recallOutput.getValue();
if (currentPhase >= 3 and currentPhase <= 5 and !FWC.Flipflop.recallOutputTemp) {
FWC.Timer.toInhibit.setValue(1);
} else {
FWC.Timer.toInhibit.setValue(0);
}
if (myPhase == 7 or myPhase == 8 and !FWC.Flipflop.recallOutput.getValue()) {
if (currentPhase == 7 or currentPhase == 8 and !FWC.Flipflop.recallOutputTemp) {
FWC.Timer.ldgInhibit.setValue(1);
} else {
FWC.Timer.ldgInhibit.setValue(0);
@ -215,7 +99,3 @@ var setPhase = func(newPhase) {
setlistener("/ECAM/buttons/recall-btn", func() {
FWC.Flipflop.recallSet.setValue(FWC.Btn.recall.getBoolValue());
}, 0, 0);
var clrBtn = func(btn) {
FWC.Btn.clr.setValue(btn);
}

View file

@ -0,0 +1,335 @@
# A3XX System Display Controller
# Copyright (c) 2021 Jonathan Redpath (legoboyvdlp)
var Page = {
new: func(name) {
var page = {parents:[Page]};
page.name = name;
return page;
},
};
var SystemDisplayController = {
PageList: {
apuPage: Page.new("apu"),
bleedPage: Page.new("bleed"),
cabPressPage: Page.new("press"),
condPage: Page.new("cond"),
cruisePage: Page.new("cruise"),
doorPage: Page.new("door"),
enginePage: Page.new("eng"),
elecPage: Page.new("elec"),
fctlPage: Page.new("fctl"),
fuelPage: Page.new("fuel"),
hydraulicPage: Page.new("hyd"),
statusPage: Page.new("sts"),
wheelPage: Page.new("wheel"),
},
displayedPage: nil,
lastDisplayedPage: nil,
lastMode: nil,
mode: 0, # 0 = man, 1 = warning, 2 = advisory (not used yet), 3 = auto
tempFWCPhase: nil,
tempElapsedTime: nil,
tempEngineModeSel: nil,
init: func() {
me.displayedPage = me.PageList.doorPage;
ECAMTimer.start();
},
autoCallLoop: func() {
me.tempFWCPhase = pts.ECAM.fwcWarningPhase.getValue();
if (me.Display.APU) {
me.displayedPage = me.PageList.apuPage;
} else if (me.Display.Engine) {
me.displayedPage = me.PageList.enginePage;
} else if (me.tempFWCPhase == 1) {
if (me.Display.Elec) {
me.displayedPage = me.PageList.elecPage;
} else {
me.displayedPage = me.PageList.doorPage;
}
} else if (me.tempFWCPhase == 2) {
if (me.Display.Elec) {
me.displayedPage = me.PageList.elecPage;
} else if (me.Display.FCTL) {
me.displayedPage = me.PageList.fctlPage;
} else {
me.displayedPage = me.PageList.wheelPage;
}
} else if (me.tempFWCPhase == 3 or me.tempFWCPhase == 4 or me.tempFWCPhase == 5) {
me.displayedPage = me.PageList.enginePage;
} else if (me.tempFWCPhase == 6) {
if (pts.Controls.Gear.gearDown.getValue() and me.altitudeBelow16000) {
me.displayedPage = me.PageList.wheelPage;
} else if (me.Display.Cruise) {
me.displayedPage = me.PageList.cruisePage;
} else {
me.displayedPage = me.PageList.enginePage;
}
} else if (me.tempFWCPhase == 7) {
me.displayedPage = me.PageList.wheelPage;
} else if (me.tempFWCPhase == 8 or me.tempFWCPhase == 9) {
if (me.Display.Elec) {
me.displayedPage = me.PageList.elecPage;
} else {
me.displayedPage = me.PageList.wheelPage;
}
} else if (me.tempFWCPhase == 10) {
if (me.Display.Elec) {
me.displayedPage = me.PageList.elecPage;
} else {
me.displayedPage = me.PageList.doorPage;
}
}
},
Timers: {
APUTimeOn: 0,
APUTime: 0,
CruiseTime: 0,
CruiseTimeOn: 0,
EngineTime: 0,
EngineTimeStart: 0,
EngineTimeOn: 0,
FCTLTimeStart: 0,
FCTLTimeOn: 0,
FCTLTime: 0,
},
Display: {
APU: 0,
Cruise: 0,
Elec: 0,
Engine: 0,
FCTL: 0,
},
altitudeBelow16000: 0,
update: func() {
me.tempElapsedTime = pts.Sim.Time.elapsedSec.getValue();
me.altitude = pts.Position.altitudeFt.getValue();
if (me.altitude < 16000) {
if (!me.altitudeBelow16000) {
me.altitudeBelow16000 = 1;
me.autoCallLoop();
}
} else {
if (me.altitudeBelow16000) {
me.altitudeBelow16000 = 0;
me.autoCallLoop();
}
}
if (systems.ELEC.Switch.emerGenTest.getValue()) {
if (!me.Display.Elec) {
me.Display.Elec = 1;
me.autoCallLoop();
}
} else {
if (me.Display.Elec) {
me.Display.Elec = 0;
me.autoCallLoop();
}
}
if (systems.APUNodes.Controls.master.getValue()) {
if (pts.APU.rpm.getValue() > 95 and !me.Timers.APUTimeOn) {
me.Timers.APUTimeOn = 1;
me.Timers.APUTime = me.tempElapsedTime;
}
if ((me.Timers.APUTimeOn and (me.tempElapsedTime - me.Timers.APUTime) < 10) or !me.Timers.APUTimeOn) {
if (!me.Display.APU) {
me.Display.APU = 1;
me.autoCallLoop();
}
} else {
if (me.Display.APU) {
me.Display.APU = 0;
me.autoCallLoop();
}
}
} else {
me.Timers.APUTimeOn = 0;
me.Timers.APUTime = 0;
if (me.Display.APU) {
me.Display.APU = 0;
me.autoCallLoop();
}
}
if (abs(pts.Controls.Flight.aileron.getValue()) > 0.05 or abs(pts.Controls.Flight.elevator.getValue()) > 0.05 or abs(pts.Controls.Flight.rudder.getValue()) > 0.50) {
me.Timers.FCTLTimeStart = 1;
if (!me.Display.FCTL) {
me.Display.FCTL = 1;
me.autoCallLoop();
}
me.autoCallLoop();
} else {
if (!me.Timers.FCTLTimeOn and me.Timers.FCTLTimeStart) {
me.Timers.FCTLTimeOn = 1;
me.Timers.FCTLTimeStart = 0;
me.Timers.FCTLTime = me.tempElapsedTime;
} else if (me.Timers.FCTLTimeOn) {
if ((me.tempElapsedTime - me.Timers.FCTLTime) < 20) {
if (!me.Display.FCTL) {
me.Display.FCTL = 1;
me.autoCallLoop();
}
} else {
me.Timers.FCTLTimeOn = 0;
me.Timers.FCTLTime = 0;
}
} else {
if (me.Display.FCTL) {
me.Display.FCTL = 0;
me.autoCallLoop();
}
me.Timers.FCTLTime = 0;
}
}
me.tempFWCPhase = pts.ECAM.fwcWarningPhase.getValue();
if (me.tempFWCPhase == 6) {
if (!ecam.FWC.toPower.getValue() and pts.Controls.Flight.flapsPos.getValue() == 0) {
if (!me.Display.Cruise) {
me.Display.Cruise = 1;
me.autoCallLoop();
}
} else if (!me.Display.Cruise) {
if (!me.Timers.CruiseTimeOn) {
me.Timers.CruiseTimeOn = 1;
me.Timers.CruiseTime = me.tempElapsedTime;
} else {
if ((me.tempElapsedTime - me.Timers.CruiseTime) > 60) {
if (!me.Display.Cruise) {
me.Display.Cruise = 1;
me.autoCallLoop();
}
}
}
}
} else {
me.Timers.CruiseTime = 0;
me.Timers.CruiseTimeOn = 0;
if (me.Display.Cruise) {
me.Display.Cruise = 0;
me.autoCallLoop();
}
}
me.tempEngineModeSel = pts.Controls.Engines.startSw.getValue();
if (me.tempEngineModeSel == 0 or me.tempEngineModeSel == 2) {
if (!me.Display.Engine) {
me.Display.Engine = 1;
me.autoCallLoop();
}
if (me.tempEngineModeSel == 2) {
me.Timers.EngineTimeStart = 1;
}
} else {
if (me.Timers.EngineTimeStart and !me.Timers.EngineTimeOn) {
me.Timers.EngineTimeOn = 1;
me.Timers.EngineTime = me.tempElapsedTime;
}
if (me.Timers.EngineTimeOn) {
if ((me.tempElapsedTime - me.Timers.EngineTime) < 10) {
if (!me.Display.Engine) {
me.Display.Engine = 1;
me.autoCallLoop();
}
} else {
me.Timers.EngineTimeStart = 0;
me.Timers.EngineTimeOn = 0;
me.Timers.EngineTime = 0;
if (me.Display.Engine) {
me.Display.Engine = 0;
me.autoCallLoop();
}
}
} else {
if (me.Display.Engine) {
me.Display.Engine = 0;
me.autoCallLoop();
}
}
}
},
autoCall: func() {
me.mode = 3;
me.autoCallLoop();
},
failureCall: func(newPage) {
if (contains(me.PageList, newPage)) {
ECAMControlPanel.lightOff(me.displayedPage.name);
me.lastDisplayedPage = me.displayedPage;
me.displayedPage = me.PageList[newPage];
me.lastMode = me.mode;
me.mode = 1;
ECAMControlPanel.lightOn(me.displayedPage.name);
} else {
debug.dump("Attempted to set page to unknown page", newPage);
}
},
manCall: func(newPage) {
if (contains(me.PageList, newPage)) {
if (me.displayedPage == me.PageList[newPage] and me.mode != 3) {
ECAMControlPanel.lightOff(me.displayedPage.name);
me.displayedPage = me.autoCall();
} else {
ECAMControlPanel.lightOff(me.displayedPage.name);
if (me.mode == 1) {
me.lastDisplayedPage = me.displayedPage;
me.lastMode = me.mode;
}
me.displayedPage = me.PageList[newPage];
me.mode = 0;
ECAMControlPanel.lightOn(me.displayedPage.name);
}
} elsif (newPage == "CLR") {
if (me.mode == 1) {
if (me.lastMode == 0) {
ECAMControlPanel.lightOff(me.displayedPage.name);
me.displayedPage = me.lastDisplayedPage;
ECAMControlPanel.lightOn(me.displayedPage.name);
me.lastDisplayedPage = nil;
me.mode = 0;
} else {
ECAMControlPanel.lightOff(me.displayedPage.name);
me.displayedPage = me.autoCall();
}
} elsif (me.mode == 0) {
if (me.lastMode == 1) {
ECAMControlPanel.lightOff(me.displayedPage.name);
me.displayedPage = me.lastDisplayedPage;
ECAMControlPanel.lightOn(me.displayedPage.name);
me.lastDisplayedPage = nil;
me.mode = 1;
} else {
ECAMControlPanel.lightOff(me.displayedPage.name);
me.displayedPage = me.autoCall();
}
}
} else {
debug.dump("Attempted to set page to unknown page", newPage);
}
},
};
setlistener("/ECAM/warning-phase", func() {
if (SystemDisplayController.mode == 3) {
SystemDisplayController.autoCall();
}
}, 0, 0);
setlistener("/controls/gear/gear-down", func() {
if (SystemDisplayController.mode == 3) {
SystemDisplayController.autoCall();
}
}, 0, 0);
var ECAMTimer = maketimer(1, func() {
SystemDisplayController.update();
});

View file

@ -2,407 +2,254 @@
# in east/north/up coordinates the renderer uses
# Thanks to BAWV12 / Thorsten
var als_on = props.globals.getNode("/sim/rendering/shaders/skydome");
var als_on = props.globals.getNode("");
var alt_agl = props.globals.getNode("position/gear-agl-ft");
var cur_alt = 0;
var light_manager = {
var Light = {
new: func(n) {
var light = {parents: [Light]};
light.isOn = 0;
light.Pos = {
x: 0,
y: 0,
z: 0,
};
light.Color = {
r: 0,
g: 0,
b: 0,
};
light.colorr = props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/lightspot-r[" ~ n ~ "]", 1);
light.colorg = props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/lightspot-g[" ~ n ~ "]", 1);
light.colorb = props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/lightspot-b[" ~ n ~ "]", 1);
light.dir = props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/dir[" ~ n ~ "]", 1);
light.size = props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/size[" ~ n ~ "]", 1);
light.posx = props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-x-m[" ~ n ~ "]", 1);
light.posy = props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-y-m[" ~ n ~ "]", 1);
light.posz = props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-z-m[" ~ n ~ "]", 1);
if (n <= 1) {
light.stretch = props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/stretch[" ~ n ~ "]", 1);
}
return light;
},
setColor: func(r,g,b) {
me.Color.r = r;
me.Color.g = g;
me.Color.b = b;
},
setDir: func(dir) {
me.dir.setValue(dir);
},
setSize: func(size) {
me.size.setValue(size);
},
setStretch: func(stretch) {
me.stretch.setValue(stretch);
},
setPos: func(x,y,z) {
me.Pos.x = x;
me.Pos.y = y;
me.Pos.z = z;
},
on: func() {
if (me.isOn) { return; }
me.colorr.setValue(me.Color.r);
me.colorg.setValue(me.Color.g);
me.colorb.setValue(me.Color.b);
me.isOn = 1;
},
off: func() {
if (!me.isOn) { return; }
me.colorr.setValue(0);
me.colorg.setValue(0);
me.colorb.setValue(0);
me.isOn = 0;
},
};
run: 0,
var lightManager = {
lat_to_m: 110952.0,
lon_to_m: 0.0,
light1_xpos: 0.0,
light1_ypos: 0.0,
light1_zpos: 0.0,
light1_r: 0.0,
light1_g: 0.0,
light1_b: 0.0,
light1_size: 0.0,
light1_stretch: 0.0,
light1_is_on: 0,
light2_xpos: 0.0,
light2_ypos: 0.0,
light2_zpos: 0.0,
light2_r: 0.0,
light2_g: 0.0,
light2_b: 0.0,
light2_size: 0.0,
light2_stretch: 0.0,
light2_is_on: 0,
light3_xpos: 0.0,
light3_ypos: 0.0,
light3_zpos: 0.0,
light3_r: 0.0,
light3_g: 0.0,
light3_b: 0.0,
light3_size: 0.0,
light3_stretch: 0.0,
light3_is_on: 0,
light4_xpos: 0.0,
light4_ypos: 0.0,
light4_zpos: 0.0,
light4_r: 0.0,
light4_g: 0.0,
light4_b: 0.0,
light4_size: 0.0,
light4_stretch: 0.0,
light4_is_on: 0,
light5_xpos: 0.0,
light5_ypos: 0.0,
light5_zpos: 0.0,
light5_r: 0.0,
light5_g: 0.0,
light5_b: 0.0,
light5_size: 0.0,
light5_stretch: 0.0,
light5_is_on: 0,
flcpt: 0,
prev_view : 1,
nd_ref_light1_x: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-x-m", 1),
nd_ref_light1_y: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-y-m", 1),
nd_ref_light1_z: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-z-m", 1),
nd_ref_light1_dir: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/dir", 1),
nd_ref_light2_x: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-x-m[1]", 1),
nd_ref_light2_y: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-y-m[1]", 1),
nd_ref_light2_z: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-z-m[1]", 1),
nd_ref_light2_dir: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/dir[1]", 1),
nd_ref_light3_x: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-x-m[2]", 1),
nd_ref_light3_y: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-y-m[2]", 1),
nd_ref_light3_z: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-z-m[2]", 1),
nd_ref_light3_dir: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/dir[2]", 1),
nd_ref_light4_x: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-x-m[3]", 1),
nd_ref_light4_y: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-y-m[3]", 1),
nd_ref_light4_z: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-z-m[3]", 1),
nd_ref_light4_dir: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/dir[3]", 1),
nd_ref_light5_x: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-x-m[4]", 1),
nd_ref_light5_y: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-y-m[4]", 1),
nd_ref_light5_z: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/eyerel-z-m[4]", 1),
nd_ref_light5_dir: props.globals.getNode("/sim/rendering/als-secondary-lights/lightspot/dir[4]", 1),
init: func {
# define your lights here
# lights ########
# offsets to aircraft center
me.light1_xpos = 100.0;
me.light1_ypos = 0.0;
me.light1_zpos = 2.0;
me.light2_xpos = 60.0;
me.light2_ypos = 0.0;
me.light2_zpos = 2.0;
me.light3_xpos = 1.86;
me.light3_ypos = 16.66;
me.light3_zpos = 2.0;
me.light4_xpos = 1.86;
me.light4_ypos = -16.66;
me.light3_zpos = 2.0;
me.light5_xpos = -19.8;
me.light5_ypos = 0.0;
me.light3_zpos = 2.0;
# color values
me.light1_r = 0.7;
me.light1_g = 0.7;
me.light1_b = 0.7;
me.light2_r = 0.6;
me.light2_g = 0.6;
me.light2_b = 0.6;
me.light3_r = 0.6;
me.light3_g = 0.0;
me.light3_b = 0.0;
me.light4_r = 0.0;
me.light4_g = 0.6;
me.light4_b = 0.0;
me.light5_r = 0.6;
me.light5_g = 0.6;
me.light5_b = 0.6;
# spot size
me.light1_size = 12;
me.light1_stretch = 6;
me.light2_size = 6;
me.light2_stretch = 6;
me.light3_size = 6;
me.light4_size = 6;
me.light5_size = 6;
setprop("/sim/rendering/als-secondary-lights/flash-radius", 13);
#me.start();
Lights: {
light1: Light.new(0),
light2: Light.new(1),
light3: Light.new(2),
light4: Light.new(3),
light5: Light.new(4),
},
start: func {
init: func() {
setprop("/sim/rendering/als-secondary-lights/flash-radius", 13);
setprop("/sim/rendering/als-secondary-lights/num-lightspots", 5);
setprop("/sim/rendering/als-secondary-lights/lightspot/size", me.light1_size);
setprop("/sim/rendering/als-secondary-lights/lightspot/size[1]", me.light2_size);
setprop("/sim/rendering/als-secondary-lights/lightspot/size[2]", me.light3_size);
setprop("/sim/rendering/als-secondary-lights/lightspot/size[3]", me.light4_size);
setprop("/sim/rendering/als-secondary-lights/lightspot/size[4]", me.light5_size);
setprop("/sim/rendering/als-secondary-lights/lightspot/stretch", me.light1_stretch);
setprop("/sim/rendering/als-secondary-lights/lightspot/stretch[1]", me.light2_stretch);
me.run = 1;
me.Lights.light1.setPos(100,0,2);
me.Lights.light2.setPos(60,0,2);
me.Lights.light3.setPos(-2,18,2);
me.Lights.light4.setPos(-2,-18,2);
me.Lights.light5.setPos(-25,0,2);
me.Lights.light1.setColor(0.7,0.7,0.7);
me.Lights.light2.setColor(0.7,0.7,0.7);
me.Lights.light3.setColor(0.4,0.0,0.0);
me.Lights.light4.setColor(0.0,0.4,0.0);
me.Lights.light5.setColor(0.4,0.4,0.4);
me.Lights.light1.setSize(12);
me.Lights.light2.setSize(6);
me.Lights.light3.setSize(4);
me.Lights.light4.setSize(4);
me.Lights.light5.setSize(5);
me.Lights.light1.setStretch(6);
me.Lights.light2.setStretch(6);
>>>>>>> dev
me.update();
},
stop: func {
me.run = 0;
apos: 0,
curAlt: 0,
ELEC: [0, 0],
ll1: 0,
ll2: 0,
ll3: 0,
nav: 0,
run: 0,
vpos: 0,
Pos: {
alt: 0,
heading: 0,
headingSine: 0,
headingCosine: 0,
lat: 0,
lon: 0,
},
update: func {
if (me.run == 0) {
update: func() {
if (!me.run) {
settimer ( func me.update(), 0.00);
return;
}
cur_alt = alt_agl.getValue();
if (als_on.getValue() == 1 and alt_agl.getValue() < 100.0) {
ll1 = getprop("/controls/lighting/landing-lights[1]");
ll2 = getprop("/controls/lighting/landing-lights[2]");
ll3 = getprop("/sim/model/lights/nose-lights");
nav = getprop("/sim/model/lights/nav-lights");
var apos = geo.aircraft_position();
var vpos = geo.viewer_position();
me.lon_to_m = math.cos(apos.lat()*math.pi/180.0) * me.lat_to_m;
var heading = getprop("orientation/heading-deg") * math.pi/180.0;
var lat = apos.lat();
var lon = apos.lon();
var alt = apos.alt();
var sh = math.sin(heading);
var ch = math.cos(heading);
if ((ll1 == 1 and systems.ELEC.Bus.ac1.getValue() != 0) and (ll2 == 1 and systems.ELEC.Bus.ac2.getValue() != 0)) {
me.light1_ypos = 0.0;
me.light1_setSize(16);
me.light1_on();
} else if (ll1 == 1 and systems.ELEC.Bus.ac1.getValue() != 0) {
me.light1_ypos = 3.0;
me.light1_setSize(12);
me.light1_on();
} else if (ll2 == 1 and systems.ELEC.Bus.ac2.getValue() != 0) {
me.light1_ypos = -3.0;
me.light1_setSize(12);
me.light1_on();
} else {
me.light1_off();
}
if (ll3 != 0) {
me.light2_on();
} else {
me.light2_off();
}
if (ll3 == 1) {
me.light2_setSize(8);
me.light2_xpos = 65.0;
} else {
me.light2_setSize(6);
me.light2_xpos = 60.0;
}
if (nav == 1) {
me.light3_on();
me.light4_on();
me.light5_on();
} else {
me.light3_off();
me.light4_off();
me.light5_off();
}
# light 1 position
var proj_x = cur_alt;
var proj_z = cur_alt/10.0;
apos.set_lat(lat + ((me.light1_xpos + proj_x) * ch + me.light1_ypos * sh) / me.lat_to_m);
apos.set_lon(lon + ((me.light1_xpos + proj_x)* sh - me.light1_ypos * ch) / me.lon_to_m);
delta_x = (apos.lat() - vpos.lat()) * me.lat_to_m;
delta_y = -(apos.lon() - vpos.lon()) * me.lon_to_m;
var delta_z = apos.alt()- proj_z - vpos.alt();
me.nd_ref_light1_x.setValue(delta_x);
me.nd_ref_light1_y.setValue(delta_y);
me.nd_ref_light1_z.setValue(delta_z);
me.nd_ref_light1_dir.setValue(heading);
# light 2 position
apos.set_lat(lat + (me.light2_xpos * ch + me.light2_ypos * sh) / me.lat_to_m);
apos.set_lon(lon + (me.light2_xpos * sh - me.light2_ypos * ch) / me.lon_to_m);
delta_x = (apos.lat() - vpos.lat()) * me.lat_to_m;
delta_y = -(apos.lon() - vpos.lon()) * me.lon_to_m;
delta_z = apos.alt() - vpos.alt();
me.nd_ref_light2_x.setValue(delta_x);
me.nd_ref_light2_y.setValue(delta_y);
me.nd_ref_light2_z.setValue(delta_z);
me.nd_ref_light2_dir.setValue(heading);
# light 3 position
apos.set_lat(lat + (me.light3_xpos * ch + me.light3_ypos * sh) / me.lat_to_m);
apos.set_lon(lon + (me.light3_xpos * sh - me.light3_ypos * ch) / me.lon_to_m);
delta_x = (apos.lat() - vpos.lat()) * me.lat_to_m;
delta_y = -(apos.lon() - vpos.lon()) * me.lon_to_m;
delta_z = apos.alt() - vpos.alt();
me.nd_ref_light3_x.setValue(delta_x);
me.nd_ref_light3_y.setValue(delta_y);
me.nd_ref_light3_z.setValue(delta_z);
me.nd_ref_light3_dir.setValue(heading);
# light 4 position
apos.set_lat(lat + (me.light4_xpos * ch + me.light4_ypos * sh) / me.lat_to_m);
apos.set_lon(lon + (me.light4_xpos * sh - me.light4_ypos * ch) / me.lon_to_m);
delta_x = (apos.lat() - vpos.lat()) * me.lat_to_m;
delta_y = -(apos.lon() - vpos.lon()) * me.lon_to_m;
delta_z = apos.alt() - vpos.alt();
me.nd_ref_light4_x.setValue(delta_x);
me.nd_ref_light4_y.setValue(delta_y);
me.nd_ref_light4_z.setValue(delta_z);
me.nd_ref_light4_dir.setValue(heading);
# light 5 position
apos.set_lat(lat + (me.light5_xpos * ch + me.light5_ypos * sh) / me.lat_to_m);
apos.set_lon(lon + (me.light5_xpos * sh - me.light5_ypos * ch) / me.lon_to_m);
delta_x = (apos.lat() - vpos.lat()) * me.lat_to_m;
delta_y = -(apos.lon() - vpos.lon()) * me.lon_to_m;
delta_z = apos.alt() - vpos.alt();
me.nd_ref_light5_x.setValue(delta_x);
me.nd_ref_light5_y.setValue(delta_y);
me.nd_ref_light5_z.setValue(delta_z);
me.nd_ref_light5_dir.setValue(heading);
me.curAlt = pts.Position.gearAglFt.getValue();
if (me.curAlt > 100) {
settimer ( func me.update(), 1);
return;
}
me.ll1 = pts.Controls.Lighting.landingLights[1].getValue();
me.ll2 = pts.Controls.Lighting.landingLights[2].getValue();
me.ll3 = pts.Sim.Model.Lights.noseLights.getValue();
me.nav = pts.Sim.Model.Lights.navLights.getValue();
me.apos = geo.aircraft_position();
me.vpos = geo.viewer_position();
me.Pos.lat = me.apos.lat();
me.Pos.lon = me.apos.lon();
me.Pos.alt = me.apos.alt();
me.Pos.heading = pts.Orientation.heading.getValue() * D2R;
me.Pos.headingSine = math.sin(me.Pos.heading);
me.Pos.headingCosine = math.cos(me.Pos.heading);
me.lon_to_m = math.cos(me.Pos.lat*D2R) * me.lat_to_m;
me.ELEC[0] = systems.ELEC.Bus.ac1.getValue();
me.ELEC[1] = systems.ELEC.Bus.ac2.getValue();
if ((me.ll1 == 1 and me.ELEC[0] >= 110) and (me.ll2 == 1 and me.ELEC[1] >= 110)) {
me.Lights.light1.setPos(100,0,2);
me.Lights.light1.setSize(16);
me.Lights.light1.on();
} else if (me.ll1 == 1 and me.ELEC[0] >= 110) {
me.Lights.light1.setPos(100,3,2);
me.Lights.light1.setSize(12);
me.Lights.light1.on();
} else if (me.ll2 == 1 and me.ELEC[1] >= 110) {
me.Lights.light1.setPos(100,-3,2);
me.Lights.light1.setSize(12);
me.Lights.light1.on();
} else {
me.Lights.light1.off();
}
if (me.ll3 != 0) {
me.Lights.light2.on();
} else {
me.Lights.light2.off();
}
if (me.ll3 == 1) {
me.Lights.light2.setSize(8);
me.Lights.light2.setPos(65,0,2);
} else {
me.Lights.light2.setSize(6);
me.Lights.light2.setPos(60,0,2);
}
if (me.nav == 1) {
me.Lights.light3.on();
me.Lights.light4.on();
me.Lights.light5.on();
} else {
me.Lights.light3.off();
me.Lights.light4.off();
me.Lights.light5.off();
}
# light 1 position
me.apos.set_lat(me.Pos.lat + ((me.Lights.light1.Pos.x + me.curAlt) * me.Pos.headingCosine + me.Lights.light1.Pos.y * me.Pos.headingSine) / me.lat_to_m);
me.apos.set_lon(me.Pos.lon + ((me.Lights.light1.Pos.x + me.curAlt) * me.Pos.headingSine - me.Lights.light1.Pos.y * me.Pos.headingCosine) / me.lon_to_m);
me.Lights.light1.posx.setValue((me.apos.lat() - me.vpos.lat()) * me.lat_to_m);
me.Lights.light1.posy.setValue(-(me.apos.lon() - me.vpos.lon()) * me.lon_to_m);
me.Lights.light1.posz.setValue(me.apos.alt()- (me.curAlt / 10) - me.vpos.alt());
me.Lights.light1.dir.setValue(me.Pos.heading);
# light 2 position
me.apos.set_lat(me.Pos.lat + ((me.Lights.light2.Pos.x + me.curAlt) * me.Pos.headingCosine + me.Lights.light2.Pos.y * me.Pos.headingSine) / me.lat_to_m);
me.apos.set_lon(me.Pos.lon + ((me.Lights.light2.Pos.x + me.curAlt) * me.Pos.headingSine - me.Lights.light2.Pos.y * me.Pos.headingCosine) / me.lon_to_m);
me.Lights.light2.posx.setValue((me.apos.lat() - me.vpos.lat()) * me.lat_to_m);
me.Lights.light2.posy.setValue(-(me.apos.lon() - me.vpos.lon()) * me.lon_to_m);
me.Lights.light2.posz.setValue(me.apos.alt()- (me.curAlt / 10) - me.vpos.alt());
me.Lights.light2.dir.setValue(me.Pos.heading);
# light 3 position
me.apos.set_lat(me.Pos.lat + ((me.Lights.light3.Pos.x + me.curAlt) * me.Pos.headingCosine + me.Lights.light3.Pos.y * me.Pos.headingSine) / me.lat_to_m);
me.apos.set_lon(me.Pos.lon + ((me.Lights.light3.Pos.x + me.curAlt) * me.Pos.headingSine - me.Lights.light3.Pos.y * me.Pos.headingCosine) / me.lon_to_m);
me.Lights.light3.posx.setValue((me.apos.lat() - me.vpos.lat()) * me.lat_to_m);
me.Lights.light3.posy.setValue(-(me.apos.lon() - me.vpos.lon()) * me.lon_to_m);
me.Lights.light3.posz.setValue(me.apos.alt()- (me.curAlt / 10) - me.vpos.alt());
me.Lights.light3.dir.setValue(me.Pos.heading);
# light 4 position
me.apos.set_lat(me.Pos.lat + ((me.Lights.light4.Pos.x + me.curAlt) * me.Pos.headingCosine + me.Lights.light4.Pos.y * me.Pos.headingSine) / me.lat_to_m);
me.apos.set_lon(me.Pos.lon + ((me.Lights.light4.Pos.x + me.curAlt) * me.Pos.headingSine - me.Lights.light4.Pos.y * me.Pos.headingCosine) / me.lon_to_m);
me.Lights.light4.posx.setValue((me.apos.lat() - me.vpos.lat()) * me.lat_to_m);
me.Lights.light4.posy.setValue(-(me.apos.lon() - me.vpos.lon()) * me.lon_to_m);
me.Lights.light4.posz.setValue(me.apos.alt()- (me.curAlt / 10) - me.vpos.alt());
me.Lights.light4.dir.setValue(me.Pos.heading);
# light 5 position
me.apos.set_lat(me.Pos.lat + ((me.Lights.light5.Pos.x + me.curAlt) * me.Pos.headingCosine + me.Lights.light5.Pos.y * me.Pos.headingSine) / me.lat_to_m);
me.apos.set_lon(me.Pos.lon + ((me.Lights.light5.Pos.x + me.curAlt) * me.Pos.headingSine - me.Lights.light5.Pos.y * me.Pos.headingCosine) / me.lon_to_m);
me.Lights.light5.posx.setValue((me.apos.lat() - me.vpos.lat()) * me.lat_to_m);
me.Lights.light5.posy.setValue(-(me.apos.lon() - me.vpos.lon()) * me.lon_to_m);
me.Lights.light5.posz.setValue(me.apos.alt()- (me.curAlt / 10) - me.vpos.alt());
me.Lights.light5.dir.setValue(me.Pos.heading);
settimer ( func me.update(), 0.00);
},
};
light1_on : func {
if (me.light1_is_on == 1) {return;}
setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-r", me.light1_r);
setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-g", me.light1_g);
setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-b", me.light1_b);
me.light1_is_on = 1;
},
light1_off : func {
if (me.light1_is_on == 0) {return;}
setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-r", 0.0);
setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-g", 0.0);
setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-b", 0.0);
me.light1_is_on = 0;
},
light1_setSize : func(size) {
setprop("/sim/rendering/als-secondary-lights/lightspot/size[0]", size);
},
light2_on : func {
if (me.light2_is_on == 1) {return;}
setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-r[1]", me.light2_r);
setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-g[1]", me.light2_g);
setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-b[1]", me.light2_b);
me.light2_is_on = 1;
},
light2_off : func {
if (me.light2_is_on == 0) {return;}
setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-r[1]", 0.0);
setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-g[1]", 0.0);
setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-b[1]", 0.0);
me.light2_is_on = 0;
},
light2_setSize : func(size) {
setprop("/sim/rendering/als-secondary-lights/lightspot/size[1]", size);
},
light3_on : func {
if (me.light3_is_on == 1) {return;}
setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-r[2]", me.light3_r);
setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-g[2]", me.light3_g);
setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-b[2]", me.light3_b);
me.light3_is_on = 1;
},
light3_off : func {
if (me.light3_is_on == 0) {return;}
setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-r[2]", 0.0);
setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-g[2]", 0.0);
setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-b[2]", 0.0);
me.light3_is_on = 0;
},
light4_on : func {
if (me.light4_is_on == 1) {return;}
setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-r[3]", me.light4_r);
setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-g[3]", me.light4_g);
setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-b[3]", me.light4_b);
me.light4_is_on = 1;
},
light4_off : func {
if (me.light4_is_on == 0) {return;}
setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-r[3]", 0.0);
setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-g[3]", 0.0);
setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-b[3]", 0.0);
me.light4_is_on = 0;
},
light5_on : func {
if (me.light5_is_on == 1) {return;}
setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-r[4]", me.light5_r);
setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-g[4]", me.light5_g);
setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-b[4]", me.light5_b);
me.light5_is_on = 1;
},
light5_off : func {
if (me.light5_is_on == 0) {return;}
setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-r[4]", 0.0);
setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-g[4]", 0.0);
setprop("/sim/rendering/als-secondary-lights/lightspot/lightspot-b[4]", 0.0);
me.light5_is_on = 0;
},
};
setlistener(pts.Sim.Rendering.Shaders.skydome, func(v) {
lightManager.run = v.getValue() ? 1 : 0;
}, 1, 0);

View file

@ -84,7 +84,7 @@ var A320Libraries = nil;
var systemsInit = func() {
systemsInitialized = 0;
fbw.FBW.init();
effects.light_manager.init();
effects.lightManager.init();
systems.ELEC.init();
systems.PNEU.init();
systems.HYD.init();

View file

@ -46,6 +46,7 @@ var Controls = {
aileron: props.globals.getNode("/controls/flight/aileron"),
aileronDrivesTiller: props.globals.getNode("/controls/flight/aileron-drives-tiller"),
autoCoordination: props.globals.getNode("/controls/flight/auto-coordination"),
elevator: props.globals.getNode("/controls/flight/elevator"),
elevatorTrim: props.globals.getNode("/controls/flight/elevator-trim"),
flaps: props.globals.getNode("/controls/flight/flaps"),
flapsTemp: 0,
@ -53,6 +54,7 @@ var Controls = {
flapsPos: props.globals.getNode("/controls/flight/flaps-pos"),
speedbrake: props.globals.getNode("/controls/flight/speedbrake"),
speedbrakeArm: props.globals.getNode("/controls/flight/speedbrake-arm"),
rudder: props.globals.getNode("/controls/flight/rudder"),
rudderTrim: props.globals.getNode("/controls/flight/rudder-trim"),
},
Gear: {
@ -61,6 +63,9 @@ var Controls = {
parkingBrake: props.globals.getNode("/controls/gear/brake-parking"),
chocks: props.globals.getNode("/services/chocks/enable"),
},
Lighting: {
landingLights: [props.globals.getNode("/controls/lighting/landing-lights[0]"),props.globals.getNode("/controls/lighting/landing-lights[1]"),props.globals.getNode("/controls/lighting/landing-lights[2]")],
},
Switches: {
annunTest: props.globals.getNode("/controls/switches/annun-test"),
},
@ -228,12 +233,14 @@ var Options = {
};
var Orientation = {
heading: props.globals.getNode("/orientation/heading-deg"),
pitch: props.globals.getNode("/orientation/pitch-deg"),
roll: props.globals.getNode("/orientation/roll-deg"),
yaw: props.globals.getNode("/orientation/yaw-deg"),
};
var Position = {
altitudeFt: props.globals.getNode("/position/altitude-ft"),
gearAglFt: props.globals.getNode("/position/gear-agl-ft"),
latitude: props.globals.getNode("/position/latitude-deg"),
longitude: props.globals.getNode("/position/longitude-deg"),
@ -264,6 +271,12 @@ var Sim = {
engine: [props.globals.getNode("/sim/input/selected/engine[0]", 1),props.globals.getNode("/sim/input/selected/engine[1]", 1)],
}
},
Model: {
Lights: {
navLights: props.globals.getNode("/sim/model/lights/nav-lights"),
noseLights: props.globals.getNode("/sim/model/lights/nose-lights"),
},
},
Multiplay: {
online: props.globals.getNode("/sim/multiplay/online"),
},
@ -272,6 +285,9 @@ var Sim = {
Headshake: {
enabled: props.globals.getNode("/sim/rendering/headshake/enabled"),
},
Shaders: {
skydome: props.globals.getNode("/sim/rendering/shaders/skydome"),
},
},
replayState: props.globals.getNode("/sim/freeze/replay-state"),
Replay: {

View file

@ -183,6 +183,7 @@
</function>
<output>/systems/apu/oil/level-l</output>
</fcs_function>
</channel>
</system>

View file

@ -19,10 +19,10 @@
<rate_limit sense="incr">0.03333333333</rate_limit>
</actuator>
<actuator name="/ECAM/phases/monostable/phase-1-300-output">
<actuator name="/ECAM/phases/monostable/phase-1-300-timer">
<input>/ECAM/phases/monostable/phase-1-300</input>
<rate_limit sense="incr">0.00333333333</rate_limit>
<rate_limit sense="decr">120</rate_limit>
<rate_limit sense="decr">0.00333333333</rate_limit>
<rate_limit sense="incr">120</rate_limit>
</actuator>
</channel>
@ -95,8 +95,8 @@
<switch name="/ECAM/phases/monostable/phase-1-300-output">
<default value="0"/>
<test logic="AND" value="1">
/ECAM/phases/monostable/phase-1-300-output ne 1
<test logic="OR" value="1">
/ECAM/phases/monostable/phase-1-300-timer ne 0
/ECAM/phases/monostable/phase-1-300 eq 1
</test>
</switch>
@ -229,6 +229,27 @@
</test>
</test>
</switch>
<switch name="/ECAM/phases/monostable/phase-5">
<default value="0"/>
<test logic="AND" value="1">
/ECAM/phases/phase-calculation/takeoff-power eq 1
/ECAM/phases/phase-calculation/altitude-ge-1500 eq 0
/ECAM/logic/ground-calc-immediate eq 0
/ECAM/phases/monostable/gnd-output ne 1
</test>
</switch>
<switch name="/ECAM/phases/monostable/phase-7">
<default value="0"/>
<test logic="AND" value="1">
/ECAM/phases/phase-calculation/takeoff-power eq 0
/ECAM/phases/phase-calculation/altitude-ge-1500 eq 0
/ECAM/phases/phase-calculation/altitude-ge-800 eq 0
/ECAM/logic/ground-calc-immediate eq 0
/ECAM/phases/monostable/gnd-output ne 1
</test>
</switch>
<switch name="/ECAM/phases/monostable/phase-8">
<default value="0"/>
@ -237,6 +258,60 @@
</test>
</switch>
<switch name="/ECAM/phases/monostable/phase-9">
<default value="0"/>
<test logic="AND" value="1">
/ECAM/warning-phase eq 9
</test>
</switch>
<switch name="/ECAM/phases/flipflop/phase-10-set">
<default value="0"/>
<test logic="AND" value="1">
/ECAM/warning-phase eq 9
</test>
</switch>
<switch name="/ECAM/phases/flipflop/phase-10-reset">
<default value="0"/>
<test logic="AND" value="1">
/ECAM/timer/ground-calc eq 1
/controls/engines/engine[0]/fire-btn eq 1
</test>
</switch>
<switch name="/ECAM/phases/monostable/phase-1-300">
<default value="0"/>
<test logic="AND" value="1">
/ECAM/phases/phase-calculation/engines-1-2-not-running eq 1
/ECAM/logic/ground-calc-immediate eq 1
/ECAM/warning-phase eq 9
/ECAM/phases/flipflop/phase-10-output eq 1
</test>
</switch>
<switch name="/ECAM/phases/flipflop/phase-2-set">
<default value="0"/>
<test logic="OR" value="1">
/ECAM/warning-phase eq 3
/ECAM/warning-phase eq 8
</test>
</switch>
<switch name="/ECAM/phases/flipflop/phase-2-reset">
<default value="0"/>
<test logic="AND" value="1">
/ECAM/phases/monostable-80kt eq 0
/ECAM/warning-phase ne 9
/ECAM/timer/ground-calc eq 1
<test logic="OR">
/ECAM/phases/monostable/phase-9-output eq 0
/ECAM/phases/monostable/to-power-set-output eq 0
</test>
</test>
</switch>
</channel>
</system>